Sha256: c96d7a3bdd3616ad79c4e199bebebf221a91c81116476e8c31cd6e6c70ac8b71
Contents?: true
Size: 1.82 KB
Versions: 1
Compression:
Stored size: 1.82 KB
Contents
require 'strscan' class JsonPath # Parser parses and evaluates an expression passed to @_current_node. class Parser def initialize(node) @_current_node = node end def parse(exp) exps = exp.split(/(&&)|(\|\|)/) ret = parse_exp(exps.shift) exps.each_with_index do |item, index| case item when '&&' ret &&= parse_exp(exps[index + 1]) when '||' ret ||= parse_exp(exps[index + 1]) end end ret end def parse_exp(exp) exp = exp.gsub(/@/, '').gsub(/[\(\)]/, '').gsub(/"/, '\'').strip scanner = StringScanner.new(exp) elements = [] until scanner.eos? if scanner.scan(/\./) sym = scanner.scan(/\w+/) op = scanner.scan(/./) num = scanner.scan(/\d+/) return @_current_node.send(sym.to_sym).send(op.to_sym, num.to_i) end if t = scanner.scan(/\['\w+'\]+/) elements << t.gsub(/\[|\]|'|\s+/, '') elsif t = scanner.scan(/(\s+)?[<>=][<>=]?(\s+)?/) operator = t elsif t = scanner.scan(/(\s+)?'?.*'?(\s+)?/) operand = t.delete("'").strip elsif t = scanner.scan(/.*/) raise "Could not process symbol: #{t}" end end el = dig(elements, @_current_node) return false unless el return true if operator.nil? && el operand = operand.to_f if operand.to_i.to_s == operand || operand.to_f.to_s == operand el.send(operator.strip, operand) end private # @TODO: Remove this once JsonPath no longer supports ruby versions below 2.3 def dig(keys, hash) return hash unless hash.is_a? Hash return nil unless hash.key?(keys.first) return hash.fetch(keys.first) if keys.size == 1 prev = keys.shift dig(keys, hash.fetch(prev)) end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
jsonpath-0.8.4 | lib/jsonpath/parser.rb |