Issue #5: Support disabling expansion
diff --git a/README.md b/README.md
index d05d86b..ae63343 100644
--- a/README.md
+++ b/README.md
@@ -53,6 +53,10 @@
History
-------
+v1.5.4, 23 Jun 2015
+-------------------
+ * [Issue #5](https://github.com/magiconair/properties/issues/5): Allow disabling of property expansion [DisableExpansion](http://godoc.org/github.com/magiconair/properties#Properties.DisableExpansion). When property expansion is disabled Properties become a simple key/value store and don't check for circular references.
+
v1.5.3, 02 Jun 2015
-------------------
* [Issue #4](https://github.com/magiconair/properties/issues/4): Maintain key order in [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) and [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp)
diff --git a/properties.go b/properties.go
index edcaccc..6201f8b 100644
--- a/properties.go
+++ b/properties.go
@@ -47,6 +47,12 @@
Prefix string
Postfix string
+ // DisableExpansion controls the expansion of properties on Get()
+ // and the check for circular references on Set(). When set to
+ // true Properties behaves like a simple key/value store and does
+ // not check for circular references on Get() or on Set().
+ DisableExpansion bool
+
// Stores the key/value pairs
m map[string]string
@@ -73,6 +79,9 @@
// Otherwise, ok is false.
func (p *Properties) Get(key string) (value string, ok bool) {
v, ok := p.m[key]
+ if p.DisableExpansion {
+ return v, ok
+ }
if !ok {
return "", false
}
@@ -470,6 +479,13 @@
return "", false, nil
}
+ // if expansion is disabled we allow circular references
+ if p.DisableExpansion {
+ prev, ok = p.Get(key)
+ p.m[key] = value
+ return prev, ok, nil
+ }
+
// to check for a circular reference we temporarily need
// to set the new value. If there is an error then revert
// to the previous state. Only if all tests are successful
diff --git a/properties_test.go b/properties_test.go
index 36ff293..6ae0b42 100644
--- a/properties_test.go
+++ b/properties_test.go
@@ -442,6 +442,21 @@
}
}
+func (s *TestSuite) TestDisableExpansion(c *C) {
+ input := "key=value\nkey2=${key}"
+ p, err := parse(input)
+ p.DisableExpansion = true
+ c.Assert(err, IsNil)
+ c.Assert(p.MustGet("key"), Equals, "value")
+ c.Assert(p.MustGet("key2"), Equals, "${key}")
+
+ // with expansion disabled we can introduce circular references
+ p.Set("keyA", "${keyB}")
+ p.Set("keyB", "${keyA}")
+ c.Assert(p.MustGet("keyA"), Equals, "${keyB}")
+ c.Assert(p.MustGet("keyB"), Equals, "${keyA}")
+}
+
func (s *TestSuite) TestMustGet(c *C) {
input := "key = value\nkey2 = ghi"
p, err := parse(input)