diff --git a/lib/jsonpath.rb b/lib/jsonpath.rb index 2465800..b72c09f 100644 --- a/lib/jsonpath.rb +++ b/lib/jsonpath.rb @@ -14,7 +14,6 @@ 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 @@ -33,11 +32,15 @@ def initialize(path, opts = nil) 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(/\./) diff --git a/test/test_jsonpath.rb b/test/test_jsonpath.rb index 40667b7..1e7a7c0 100644 --- a/test/test_jsonpath.rb +++ b/test/test_jsonpath.rb @@ -5,6 +5,15 @@ def setup @object2 = example_object end + def test_bracket_matching + assert_raises(ArgumentError) { + JsonPath.new('$.store.book[0') + } + assert_raises(ArgumentError) { + JsonPath.new('$.store.book[0]]') + } + end + def test_lookup_direct_path assert_equal 4, JsonPath.new('$.store.*').on(@object).first['book'].size end