lib/jsonpath.rb in jsonpath-0.0.3 vs lib/jsonpath.rb in jsonpath-0.1.0
- old
+ new
@@ -1,25 +1,34 @@
-$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
-require File.join('jsonpath', 'expression')
-require File.join('jsonpath', 'wrapper')
+require 'strscan'
+require 'load_path_find'
+$LOAD_PATH.add_current
+
+require File.join('jsonpath', 'enumerable')
+
class JsonPath
-
- def self.path(expression)
- @expression = Expression.new(expression)
- if block_given?
- yield @expression
- else
- @expression
+
+ attr_reader :path
+
+ def initialize(path)
+ scanner = StringScanner.new(path)
+ @path = []
+ bracket_count = 0
+ while not scanner.eos?
+ token = scanner.scan_until(/($|\$|@|[a-zA-Z]+|\[.*?\]|\.\.|\.(?!\.))/)
+ case token
+ when '.'
+ # do nothing
+ when /^[a-zA-Z]+$/
+ @path << "['#{token}']"
+ else
+ bracket_count == 0 && @path << token or @path[-1] += token
+ bracket_count += token.count('[') - token.count(']')
+ end
end
end
-
- def self.wrap(object)
- @wrapper = Wrapper.new(object)
- if block_given?
- yield @wrapper
- else
- @wrapper
- end
+
+ def on(object)
+ JsonPath::Enumerable.new(self, object)
end
-
+
end