@@ -21,20 +21,24 @@ module Utils |
||
| 21 | 21 |
end |
| 22 | 22 |
end |
| 23 | 23 |
|
| 24 |
- def self.interpolate_jsonpaths(value, data) |
|
| 25 |
- value.gsub(/<[^>]+>/).each { |jsonpath|
|
|
| 26 |
- Utils.values_at(data, jsonpath[1..-2]).first.to_s |
|
| 27 |
- } |
|
| 24 |
+ def self.interpolate_jsonpaths(value, data, options = {})
|
|
| 25 |
+ if options[:leading_dollarsign_is_jsonpath] && value[0] == '$' |
|
| 26 |
+ Utils.values_at(data, value).first.to_s |
|
| 27 |
+ else |
|
| 28 |
+ value.gsub(/<[^>]+>/).each { |jsonpath|
|
|
| 29 |
+ Utils.values_at(data, jsonpath[1..-2]).first.to_s |
|
| 30 |
+ } |
|
| 31 |
+ end |
|
| 28 | 32 |
end |
| 29 | 33 |
|
| 30 |
- def self.recursively_interpolate_jsonpaths(struct, data) |
|
| 34 |
+ def self.recursively_interpolate_jsonpaths(struct, data, options = {})
|
|
| 31 | 35 |
case struct |
| 32 | 36 |
when Hash |
| 33 |
- struct.inject({}) {|memo, (key, value)| memo[key] = recursively_interpolate_jsonpaths(value, data); memo }
|
|
| 37 |
+ struct.inject({}) {|memo, (key, value)| memo[key] = recursively_interpolate_jsonpaths(value, data, options); memo }
|
|
| 34 | 38 |
when Array |
| 35 |
- struct.map {|elem| recursively_interpolate_jsonpaths(elem, data) }
|
|
| 39 |
+ struct.map {|elem| recursively_interpolate_jsonpaths(elem, data, options) }
|
|
| 36 | 40 |
when String |
| 37 |
- interpolate_jsonpaths(struct, data) |
|
| 41 |
+ interpolate_jsonpaths(struct, data, options) |
|
| 38 | 42 |
else |
| 39 | 43 |
struct |
| 40 | 44 |
end |
@@ -28,8 +28,15 @@ describe Utils do |
||
| 28 | 28 |
end |
| 29 | 29 |
|
| 30 | 30 |
describe "#interpolate_jsonpaths" do |
| 31 |
+ let(:payload) { { :there => { :world => "WORLD" }, :works => "should work" } }
|
|
| 32 |
+ |
|
| 31 | 33 |
it "interpolates jsonpath expressions between matching <>'s" do |
| 32 |
- Utils.interpolate_jsonpaths("hello <$.there.world> this <escape works>", { :there => { :world => "WORLD" }, :works => "should work" }).should == "hello WORLD this should+work"
|
|
| 34 |
+ Utils.interpolate_jsonpaths("hello <$.there.world> this <escape works>", payload).should == "hello WORLD this should+work"
|
|
| 35 |
+ end |
|
| 36 |
+ |
|
| 37 |
+ it "optionally supports treating values that start with '$' as raw JSONPath" do |
|
| 38 |
+ Utils.interpolate_jsonpaths("$.there.world", payload).should == "$.there.world"
|
|
| 39 |
+ Utils.interpolate_jsonpaths("$.there.world", payload, :leading_dollarsign_is_jsonpath => true).should == "WORLD"
|
|
| 33 | 40 |
end |
| 34 | 41 |
end |
| 35 | 42 |
|