Class: Lab42::DataClass::Proxy

Inherits:
Object
  • Object
show all
Includes:
Constraints, Derived, Memos, Validations
Defined in:
lib/lab42/data_class/proxy.rb,
lib/lab42/data_class/proxy/memos.rb,
lib/lab42/data_class/proxy/mixin.rb,
lib/lab42/data_class/proxy/derived.rb,
lib/lab42/data_class/proxy/constraints.rb,
lib/lab42/data_class/proxy/validations.rb,
lib/lab42/data_class/proxy/constraints/maker.rb

Defined Under Namespace

Modules: Constraints, Derived, Memos, Mixin, Validations

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Constraints

#check_constraints_against_defaults, #define_constraints

Methods included from Memos

#all_attributes, #constraints, #defaults, #derived_attributes, #members, #members!, #positionals, #setter_attributes, #validations

Methods included from Validations

#validate!

Instance Attribute Details

#actual_paramsObject (readonly)

Returns the value of attribute actual_params.



14
15
16
# File 'lib/lab42/data_class/proxy.rb', line 14

def actual_params
  @actual_params
end

#blockObject (readonly)

Returns the value of attribute block.



14
15
16
# File 'lib/lab42/data_class/proxy.rb', line 14

def block
  @block
end

#klassObject (readonly)

Returns the value of attribute klass.



14
15
16
# File 'lib/lab42/data_class/proxy.rb', line 14

def klass
  @klass
end

#klass_definedObject (readonly)

Returns the value of attribute klass_defined.



14
15
16
# File 'lib/lab42/data_class/proxy.rb', line 14

def klass_defined
  @klass_defined
end

Class Method Details

.from_parent(parent, klass) ⇒ Object



16
17
18
19
20
21
22
23
# File 'lib/lab42/data_class/proxy.rb', line 16

def self.from_parent(parent, klass)
  new(klass).tap do |proxy|
    proxy.positionals.push(*parent.positionals)
    proxy.defaults.update(parent.defaults)
    proxy.constraints.update(parent.constraints)
    proxy.validations.push(*parent.validations)
  end
end

Instance Method Details

#access(data_class_instance, key) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/lab42/data_class/proxy.rb', line 25

def access(data_class_instance, key)
  if all_attributes.member?(key)
    data_class_instance.send(key)
  else
    raise KeyError, "#{key} is not an attribute of #{data_class_instance}"
  end
end

#check!(params, merge_with = defaults) ⇒ Object

Raises:

  • (ArgumentError)


33
34
35
36
37
38
# File 'lib/lab42/data_class/proxy.rb', line 33

def check!(params, merge_with = defaults)
  raise ArgumentError, "missing initializers for #{_missing_initializers}" unless _missing_initializers.empty?
  raise ArgumentError, "illegal initializers #{_illegal_initializers}" unless _illegal_initializers.empty?

  _check_constraints!(merge_with.merge(params))
end

#define_class!Object



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/lab42/data_class/proxy.rb', line 40

def define_class!
  return if @klass_defined

  @klass_defined = true
  klass.module_eval(&_define_attr_reader)
  klass.module_eval(&_define_initializer) if Class === klass
  _define_methods
  klass.include(Mixin)
  klass.module_eval(&block) if block
  klass
end

#define_derived_attribute(name, &blk) ⇒ Object



52
53
54
55
56
57
58
59
# File 'lib/lab42/data_class/proxy.rb', line 52

def define_derived_attribute(name, &blk)
  positionals.delete(name)
  defaults.delete(name)
  derived_attributes.update(name => true) do |_key, _old,|
    raise DuplicateDefinitionError, "Redefinition of derived attribute #{name.inspect}"
  end
  klass.module_eval(&_define_derived_attribute(name, &blk))
end

#init(data_class, **params) ⇒ Object



61
62
63
# File 'lib/lab42/data_class/proxy.rb', line 61

def init(data_class, **params)
  _init(data_class, defaults.merge(params))
end

#set_actual_params(params) ⇒ Object



65
66
67
# File 'lib/lab42/data_class/proxy.rb', line 65

def set_actual_params(params)
  @actual_params = params
end

#to_hash(data_class_instance) ⇒ Object



69
70
71
72
# File 'lib/lab42/data_class/proxy.rb', line 69

def to_hash(data_class_instance)
  all_attributes
    .inject({}) { |result, (k, _)| result.merge(k => data_class_instance[k]) }
end

#update!(with_positionals, with_keywords) ⇒ Object



74
75
76
77
# File 'lib/lab42/data_class/proxy.rb', line 74

def update!(with_positionals, with_keywords)
  positionals.push(*with_positionals)
  defaults.update(with_keywords)
end