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