lib/jsonpath.rb in jsonpath-1.1.3 vs lib/jsonpath.rb in jsonpath-1.1.4

- old
+ new

@@ -10,29 +10,31 @@ # JsonPath: initializes the class with a given JsonPath and parses that path # into a token array. class JsonPath PATH_ALL = '$..*' + MAX_NESTING_ALLOWED = 100 DEFAULT_OPTIONS = { :default_path_leaf_to_null => false, :symbolize_keys => false, :use_symbols => false, :allow_send => true, - :max_nesting => 100 + :max_nesting => MAX_NESTING_ALLOWED } attr_accessor :path def initialize(path, opts = {}) @opts = DEFAULT_OPTIONS.merge(opts) + set_max_nesting scanner = StringScanner.new(path.strip) @path = [] until scanner.eos? if (token = scanner.scan(/\$\B|@\B|\*|\.\./)) @path << token - elsif (token = scanner.scan(/[$@a-zA-Z0-9:{}_-]+/)) + elsif (token = scanner.scan(/[$@\p{Alnum}:{}_ -]+/)) @path << "['#{token}']" elsif (token = scanner.scan(/'(.*?)'/)) @path << "[#{token}]" elsif (token = scanner.scan(/\[/)) @path << find_matching_brackets(token, scanner) @@ -83,11 +85,11 @@ e.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v; } end end a end - + def self.fetch_all_path(obj) all_paths = ['$'] find_path(obj, '$', all_paths, obj.class == Array) return all_paths end @@ -143,7 +145,12 @@ obj_or_str.is_a?(String) ? MultiJson.decode(obj_or_str, max_nesting: opts[:max_nesting]) : obj_or_str end def deep_clone Marshal.load Marshal.dump(self) + end + + def set_max_nesting + return unless @opts[:max_nesting].is_a?(Integer) && @opts[:max_nesting] > MAX_NESTING_ALLOWED + @opts[:max_nesting] = false end end