Class: Appfuel::Domain::Entity

Inherits:
Object
  • Object
show all
Extended by:
Dsl
Includes:
Application::AppContainer
Defined in:
lib/appfuel/domain/entity.rb

Direct Known Subclasses

ValueObject

Instance Attribute Summary

Attributes included from Dsl

#defaults, #equalizer, #schema

Instance Method Summary collapse

Methods included from Dsl

attribute, attribute_conflict?, attribute_exists?, attribute_names, build_type, container_class_type, create, default?, disable_value_object, empty_hash, enable_value_object, enum, extended, inherited, strict_enum, try, type, valid?

Methods included from Application::AppContainer

#app_container, #feature_name, included, #qualify_container_key

Constructor Details

#initialize(inputs = {}) ⇒ Entity

Returns a new instance of Entity.



16
17
18
19
20
21
22
23
24
25
26
# File 'lib/appfuel/domain/entity.rb', line 16

def initialize(inputs = {})
  setup_attributes(inputs)
  hide_undefined
  @is_global = domain_name.count('.') == 0

rescue Dry::Types::ConstraintError => e
  msg = "#{self.class.name} could not initialize: #{e.message}"
  error = RuntimeError.new(msg)
  error.set_backtrace(e.backtrace)
  raise error
end

Instance Method Details

#attr_typed!(name, value) ⇒ Object



67
68
69
# File 'lib/appfuel/domain/entity.rb', line 67

def attr_typed!(name, value)
  self.class.schema[name.to_sym][value]
end

#collection?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/appfuel/domain/entity.rb', line 32

def collection?
  false
end

#data_type(type_name) ⇒ Object



75
76
77
# File 'lib/appfuel/domain/entity.rb', line 75

def data_type(type_name)
  self.class.type(type_name)
end

#data_typed!(type_name, value) ⇒ Object



71
72
73
# File 'lib/appfuel/domain/entity.rb', line 71

def data_typed!(type_name, value)
  data_type(type_name)[value]
end

#domain_basenameObject



88
89
90
# File 'lib/appfuel/domain/entity.rb', line 88

def domain_basename
  self.class.domain_basename
end

#domain_nameObject



84
85
86
# File 'lib/appfuel/domain/entity.rb', line 84

def domain_name
  self.class.domain_name
end

#enable_undefinedObject



48
49
50
51
52
53
54
# File 'lib/appfuel/domain/entity.rb', line 48

def enable_undefined
  show_undefined
  @undefined_as_nil = false
  each_entity do |entity|
    entity.enable_undefined
  end
end

#global?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/appfuel/domain/entity.rb', line 28

def global?
  @is_global
end

#has?(key) ⇒ Boolean

Returns:

  • (Boolean)


128
129
130
131
# File 'lib/appfuel/domain/entity.rb', line 128

def has?(key)
  value = send(key)
  !value.nil? && value != Types::Undefined
end

#hide_undefinedObject



40
41
42
# File 'lib/appfuel/domain/entity.rb', line 40

def hide_undefined
  @hide_undefined = true
end

#hide_undefined?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/appfuel/domain/entity.rb', line 36

def hide_undefined?
  @hide_undefined
end

#show_undefinedObject



44
45
46
# File 'lib/appfuel/domain/entity.rb', line 44

def show_undefined
  @hide_undefined = false
end

#to_hObject



124
125
126
# File 'lib/appfuel/domain/entity.rb', line 124

def to_h
  to_hash
end

#to_hashObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/appfuel/domain/entity.rb', line 92

def to_hash
  data = {}
  self.class.schema.each do |key, type|
    fail "no getter defined for #{key}" unless respond_to?(key)
    value = send(key)
    case
    when value.is_a?(Array)
      list = []
      value.each do |item|
        list << (item.is_a?(Entity) ? item.to_hash : item)
      end
      value = list
    when value.is_a?(Hash)
      dict = {}
      value.each do |value_key, item|
        dict[value_key] = item.is_a?(Entity) ? item.to_hash : item
      end
      value = dict
    when value.respond_to?(:to_hash)
      value = value.to_hash
    when value == Types::Undefined
      if type.respond_to?(:domain_name)
        value = type.empty_hash(undefined_as_nil? ? true : false)
      end
      next if hide_undefined?

    end
    data[key] = value
  end
  data.deep_symbolize_keys
end

#undefined_as_nilObject



56
57
58
59
60
61
# File 'lib/appfuel/domain/entity.rb', line 56

def undefined_as_nil
  @undefined_as_nil = true
  each_entity do |entity|
    entity.undefined_as_nil
  end
end

#undefined_as_nil?Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/appfuel/domain/entity.rb', line 63

def undefined_as_nil?
  @undefined_as_nil
end

#validate_type!(value, type_str, **options) ⇒ Object



79
80
81
82
# File 'lib/appfuel/domain/entity.rb', line 79

def validate_type!(value, type_str, **options)
  type = self.class.build_type(type_str, **options)
  type[value]
end