class Expressionist::Context

Public Class Methods

new(data = {}) click to toggle source
# File lib/expressionist/context.rb, line 7
def initialize(data = {})
  @data = data
end

Public Instance Methods

[](key) click to toggle source
# File lib/expressionist/context.rb, line 33
def [](key)
  find(key.split('.'), @data)
end
[]=(key, value) click to toggle source
# File lib/expressionist/context.rb, line 11
def []=(key, value)
  segments = key.split('.')
  len = segments.length
  data = @data
  (0...len).each do |i|
    key = segments[i]
    data = (data[key] ||= {})
  end
  data['.'] = value
end
cast(value) click to toggle source
# File lib/expressionist/context.rb, line 66
def cast(value)
  case value
  when 'true'
    true
  when 'false'
    false
  when /[0-9]+[.,][0-9]+/
    Float(value)
  when /[0-9]+/
    Integer(value)
  else
    value
  end
end
delete(key) click to toggle source
# File lib/expressionist/context.rb, line 22
def delete(key)
  segments = key.split('.')
  len = segments.length
  data = @data
  (0...len).each do |i|
    break unless data
    data = data[segments[i]]
  end
  data.delete('.') if data
end
export() click to toggle source
# File lib/expressionist/context.rb, line 62
def export
  @data
end
find(segments = [], data = nil) click to toggle source
# File lib/expressionist/context.rb, line 37
def find(segments = [], data = nil)
  data ||= @data
  segment = segments[0]
  subsegments = segments[1..-1]

  case
  when data == nil
    [nil]
  when segments.length == 0
    [cast(data['.'])]
  when segment == '?'
    (data.keys - ['.']).map do |k|
      find(subsegments, data[k])
    end
  when segment == '*' && subsegments.length > 0 && data[subsegments[0]]
    find(subsegments[1..-1], data[subsegments[0]])
  when segment == '*'
    (subsegments.length == 0 ? [data['.']] : []) + (data.keys - ['.']).map do |k|
      find(segments, data[k])
    end
  else
    find(subsegments, data[segment])
  end.flatten.compact
end