lib/active_null/null_model_builder.rb
require 'naught'
module ActiveNull
class NullModelBuilder
attr_reader :model, :overrides
def initialize(model, overrides)
@model = model
@overrides = overrides
end
def build
model = self.model
null = Naught.build do |config|
config.impersonate model
model.reflect_on_all_associations.each do |relation|
klass = begin
if relation.options[:polymorphic]
model.polymorphic_null_defaults[relation.name].constantize
else
relation.klass
end
rescue
nil
end
next unless klass
if relation.collection?
define_method(relation.name) { klass.none }
else
define_method(relation.name) do
return unless klass.respond_to? :null
klass.null
end
end
end
model.column_defaults.each do |field, default|
define_method(field.to_sym) { default }
end
def nil?
true
end
def present?
false
end
def blank?
true
end
def to_json
'{}'
end
if Object.const_defined? 'Draper'
def decorate(options = {})
decorator_class.decorate(self, options)
end
def decorator_class
self.class.decorator_class
end
def decorator_class?
self.class.decorator_class?
end
def applied_decorators
[]
end
def decorated_with?(decorator_class)
false
end
def decorated?
false
end
end
end
null.send(:include, Draper::Decoratable) if Object.const_defined? 'Draper'
null.send(:include, overrides) if overrides
set_null_model null
end
def name
base_name = model.name.split('::').last
"Null#{base_name}"
end
def full_name
return name if module_parent == Object
"#{module_parent_name}::#{name}"
end
def set_null_model(null)
module_parent.const_set name, null
end
private
def module_parent
@module_parent ||= model.try(:module_parent) || model.parent
end
def module_parent_name
@module_parent_name ||= model.try(:module_parent_name) || model.parent.name
end
end
end