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