Module: Depth::Actions

Included in:
ComplexHash
Defined in:
lib/depth/actions.rb

Instance Method Summary collapse

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

#baseObject

:nocov:

Raises:

  • (NoMethodError)


4
5
6
# File 'lib/depth/actions.rb', line 4

def base
  raise NoMethodError.new('should be overridden')
end

#creation_procObject

Raises:

  • (NoMethodError)


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_transformerObject

Raises:

  • (NoMethodError)


16
17
18
# File 'lib/depth/actions.rb', line 16

def key_transformer
  raise NoMethodError.new('should be overridden')
end

#next_procObject

Raises:

  • (NoMethodError)


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