class DataWorks::Works

Public Class Methods

new() click to toggle source
# File lib/data_works/works.rb, line 6
def initialize
  # we keep a registry of all models that we create
  @data = {}
  # keep a registry of the 'current default' model of a given type
  @current_default = {}
  # keep a registry of the 'limiting scope' for parentage
  @bounding_models = {}
end

Public Instance Methods

clear_current_default_for(model) click to toggle source
# File lib/data_works/works.rb, line 39
def clear_current_default_for(model)
  @current_default.delete(model)
end
clear_restriction_for(model) click to toggle source
# File lib/data_works/works.rb, line 55
def clear_restriction_for(model)
  @bounding_models.delete(model)
end
find_or_add(model_name) click to toggle source
# File lib/data_works/works.rb, line 24
def find_or_add(model_name)
  record = find(model_name, 1)
  record ? record : send("add_#{model_name}")
end
method_missing(method_name, *args, &block) click to toggle source
# File lib/data_works/works.rb, line 15
def method_missing(method_name, *args, &block)
  method_name = method_name.to_s
  if method_name.starts_with? 'add_'
    add_model(method_name, *args)
  else
    get_model(method_name, *args)
  end
end
set_current_default(for_model:, to:) click to toggle source
# File lib/data_works/works.rb, line 35
def set_current_default(for_model:, to:)
  @current_default[for_model] = to
end
set_restriction(for_model:, to:, &block) click to toggle source
# File lib/data_works/works.rb, line 43
def set_restriction(for_model:, to:, &block)
  if block_given?
    @bounding_models[for_model] = to
    block_return = block.call
    clear_restriction_for(for_model)
    block_return
  elsif
    @bounding_models[for_model] = to
    to
  end
end
was_added(model_name, model) click to toggle source
# File lib/data_works/works.rb, line 29
def was_added(model_name, model)
  model_name = model_name.to_sym
  @data[model_name] ||= []
  @data[model_name] << model
end

Private Instance Methods

add_model(method_name, *args) click to toggle source
# File lib/data_works/works.rb, line 61
def add_model(method_name, *args)
  if method_name =~ /\Aadd_(\w+)\Z/
    model_name = $1
    many = args[0].kind_of? Integer
  end
  if model_name
    grafter = Grafter.new(self, (many ? model_name.singularize : model_name))
    if many
      grafter.add_many(*args)
    else
      grafter.add_one(*args)
    end
  end
end
find(model_name, index) click to toggle source
# File lib/data_works/works.rb, line 87
def find(model_name, index)
  model_name = model_name.to_sym
  if index == 1 && get_default_for(model_name)
    get_default_for(model_name)
  elsif index == 1
    @data[model_name] ||= []
    @data[model_name].reject{|e| has_invalid_parent?(e)}.first
  else
    @data[model_name] ||= []
    @data[model_name][index.to_i-1]
  end
end
get_default_for(model) click to toggle source
# File lib/data_works/works.rb, line 100
def get_default_for(model)
  @bounding_models[model] || @current_default[model] || nil
end
get_model(method_name, *args) click to toggle source
# File lib/data_works/works.rb, line 76
def get_model(method_name, *args)
  if method_name =~ /\A(\w+?)(\d+)\Z/
    model_name = $1
    index = $2
  elsif method_name =~ /\Athe_(\w+)\Z/
    model_name = $1
    index = 1
  end
  find(model_name, index)
end
has_invalid_parent?(model) click to toggle source
# File lib/data_works/works.rb, line 104
def has_invalid_parent?(model)
  @bounding_models.each do |k,v|
    return true if (model.respond_to?(k) && model.send(k) != v)
  end
  false
end