lib/jsonpath.rb in jsonpath-0.5.6 vs lib/jsonpath.rb in jsonpath-0.5.7

- old
+ new

@@ -6,17 +6,16 @@ class JsonPath PATH_ALL = '$..*' - attr_reader :path + attr_accessor :path def initialize(path, opts = nil) @opts = opts scanner = StringScanner.new(path) @path = [] - bracket_count = 0 while not scanner.eos? if token = scanner.scan(/\$/) @path << token elsif token = scanner.scan(/@/) @path << token @@ -31,15 +30,19 @@ token << t count += 1 elsif t = scanner.scan(/\]/) token << t count -= 1 - elsif t = scanner.scan(/[^\[\]]*/) + elsif t = scanner.scan(/[^\[\]]+/) token << t + elsif scanner.eos? + raise ArgumentError, 'unclosed bracket' end end @path << token + elsif token = scanner.scan(/\]/) + raise ArgumentError, 'unmatched closing bracket' elsif token = scanner.scan(/\.\./) @path << token elsif scanner.scan(/\./) nil elsif token = scanner.scan(/\*/) @@ -50,10 +53,16 @@ @path.last << token end end end + def join(join_path) + res = deep_clone + res.path += JsonPath.new(join_path).path + res + end + def on(obj_or_str) enum_on(obj_or_str).to_a end def first(obj_or_str, *args) @@ -74,7 +83,11 @@ end private def self.process_object(obj_or_str) obj_or_str.is_a?(String) ? MultiJson.decode(obj_or_str) : obj_or_str + end + + def deep_clone + Marshal.load Marshal.dump(self) end end