Class: Expressionist::Context
- Inherits:
-
Object
- Object
- Expressionist::Context
- Defined in:
- lib/expressionist/context.rb
Instance Method Summary collapse
- #[](key) ⇒ Object
- #[]=(key, value) ⇒ Object
- #cast(value) ⇒ Object
- #delete(key) ⇒ Object
- #export ⇒ Object
- #find(segments = [], data = nil) ⇒ Object
-
#initialize(data = {}) ⇒ Context
constructor
A new instance of Context.
Constructor Details
#initialize(data = {}) ⇒ Context
Returns a new instance of Context.
7 8 9 |
# File 'lib/expressionist/context.rb', line 7 def initialize(data = {}) @data = data end |
Instance Method Details
#[](key) ⇒ Object
33 34 35 |
# File 'lib/expressionist/context.rb', line 33 def [](key) find(key.split('.'), @data) end |
#[]=(key, value) ⇒ Object
11 12 13 14 15 16 17 18 19 20 |
# 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) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# 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) ⇒ Object
22 23 24 25 26 27 28 29 30 31 |
# 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 ⇒ Object
62 63 64 |
# File 'lib/expressionist/context.rb', line 62 def export @data end |
#find(segments = [], data = nil) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# 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 |