Module: Depth::Actions
- Included in:
- ComplexHash
- Defined in:
- lib/depth/actions.rb
Instance Method Summary collapse
- #alter(route, key: nil, value: nil) ⇒ Object
-
#base ⇒ Object
:nocov:.
- #creation_proc ⇒ Object
- #delete(route) ⇒ Object
- #find(route, create: false, default: nil) ⇒ Object
- #key_transformer ⇒ Object
- #next_proc ⇒ Object
-
#set(route, value) ⇒ Object
:nocov:.
Instance Method Details
#alter(route, key: nil, value: nil) ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/depth/actions.rb', line 62 def alter(route, key: nil, value: nil) return set(route, value) if key.nil? route = RouteElement.convert_route(route) value = find(route) if value.nil? new_route = (route[0 ... -1] << RouteElement.convert(key)) # ensure it exists set(new_route, value) old_key = route.last.key return unless old_key != key delete(route) end |
#base ⇒ Object
:nocov:
4 5 6 |
# File 'lib/depth/actions.rb', line 4 def base raise NoMethodError.new('should be overridden') end |
#creation_proc ⇒ Object
12 13 14 |
# File 'lib/depth/actions.rb', line 12 def creation_proc raise NoMethodError.new('should be overridden') end |
#delete(route) ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/depth/actions.rb', line 74 def delete(route) route = RouteElement.convert_route(route) base_traverser = Traverser.new( base, next_proc: next_proc, creation_proc: creation_proc, key_transformer: key_transformer ) traverser = route[0...-1].reduce(base_traverser) do |t, route_el| t.next(route_el.key) end last_key = key_transformer.call(traverser.object, route.last.key) if traverser.array? traverser.object.delete_at(last_key) elsif traverser.hash? traverser.object.delete(last_key) end end |
#find(route, create: false, default: nil) ⇒ Object
36 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/depth/actions.rb', line 36 def find(route, create: false, default: nil) return self if route.empty? route = RouteElement.convert_route(route) base_traverser = Traverser.new( base, next_proc: next_proc, creation_proc: creation_proc, key_transformer: key_transformer ) parent = route[0 ... -1].reduce(base_traverser) { |t, route_el| if create t.next_or_create(route_el.key) { route_el.create } else t.next(route_el.key) end }.object return default if parent.nil? original_key = route.last.key transformed_key = key_transformer.call(parent, route.last.key) object = next_proc.call(parent, transformed_key, original_key) return object unless object.nil? return creation_proc.call(parent, transformed_key, default, original_key) if create && default default end |
#key_transformer ⇒ Object
16 17 18 |
# File 'lib/depth/actions.rb', line 16 def key_transformer raise NoMethodError.new('should be overridden') end |
#next_proc ⇒ Object
8 9 10 |
# File 'lib/depth/actions.rb', line 8 def next_proc raise NoMethodError.new('should be overridden') end |
#set(route, value) ⇒ Object
:nocov:
21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/depth/actions.rb', line 21 def set(route, value) route = RouteElement.convert_route(route) base_traverser = Traverser.new( base, next_proc: next_proc, creation_proc: creation_proc, key_transformer: key_transformer ) object = route[0 ... -1].reduce(base_traverser) { |t, route_el| t.next_or_create(route_el.key) { route_el.create } }.object original_key = route.last.key transformed_key = key_transformer.call(object, route.last.key) creation_proc.call(object, transformed_key, value, original_key) end |