module Depth::Actions

Public Instance Methods

alter(route, key: nil, value: nil) click to toggle source
# 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() click to toggle source

:nocov:

# File lib/depth/actions.rb, line 4
def base
  raise NoMethodError.new('should be overridden')
end
creation_proc() click to toggle source
# File lib/depth/actions.rb, line 12
def creation_proc
  raise NoMethodError.new('should be overridden')
end
delete(route) click to toggle source
# 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) click to toggle source
# 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() click to toggle source
# File lib/depth/actions.rb, line 16
def key_transformer
  raise NoMethodError.new('should be overridden')
end
next_proc() click to toggle source
# File lib/depth/actions.rb, line 8
def next_proc
  raise NoMethodError.new('should be overridden')
end
set(route, value) click to toggle source

:nocov:

# 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