Class: Peacekeeper::Model

Inherits:
Object
  • Object
show all
Extended by:
ModelDelegation
Includes:
ModelDelegation
Defined in:
lib/peacekeeper/model.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ModelDelegation

def_data_method, def_singleton_data_method, define_wrapped_singleton_method, method_missing, respond_to_missing?, wrap

Constructor Details

#initialize(*args) ⇒ Model

Returns a new instance of Model.



99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/peacekeeper/model.rb', line 99

def initialize(*args)
  if !args.nil? && args.length == 1 && args.first.kind_of?(data_class)
    @data = args.first
  else
    @data = data_class.new(*args)
  end

  unless self.class.instance_methods(false).include?(:to_json)
    class<<self
      undef_method :to_json if respond_to?(:to_json)
      undef_method :as_json if respond_to?(:as_json)
    end
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Peacekeeper::ModelDelegation

Instance Attribute Details

#dataObject (readonly) Also known as: delegate

Returns the value of attribute data.



96
97
98
# File 'lib/peacekeeper/model.rb', line 96

def data
  @data
end

Class Method Details

.configObject



21
# File 'lib/peacekeeper/model.rb', line 21

def config; (@config ||= {}); end

.config=(new_config) ⇒ Object



23
24
25
26
27
28
29
30
# File 'lib/peacekeeper/model.rb', line 23

def config=(new_config)
  @config = new_config

  subclasses.each do |sub|
    sub.config = @config
  end
  @config
end

.data_classObject



50
51
52
53
# File 'lib/peacekeeper/model.rb', line 50

def data_class
  return nil if self == Model
  @data_class ||= (data_source.nil? ? nil : DataLoader.data_class(data_name: data_name, data_lib_name: data_lib_name, source: data_source))
end

.data_lib_nameObject



82
83
84
85
86
87
88
89
90
# File 'lib/peacekeeper/model.rb', line 82

def data_lib_name
  name = data_name
  name.gsub!(/::/, '/')
  name.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
  name.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
  name.tr!("-", "_")
  name.downcase!
  name
end

.data_nameObject



78
79
80
# File 'lib/peacekeeper/model.rb', line 78

def data_name
  self.name.sub(/Model$/, '')
end

.data_sourceObject



32
# File 'lib/peacekeeper/model.rb', line 32

def data_source; (@data_source ||= nil); end

.data_source=(source) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/peacekeeper/model.rb', line 34

def data_source=(source)
  @data_source = source
  @loader = Loader.new(config.merge(source: source))
  @loader.load_source

  if source == :mock
    data_class # Trigger mock data_class creation
  end

  subclasses.each do |sub|
    sub.data_source = @data_source
  end

  @data_source
end

.delegateObject



54
55
56
57
# File 'lib/peacekeeper/model.rb', line 54

def data_class
  return nil if self == Model
  @data_class ||= (data_source.nil? ? nil : DataLoader.data_class(data_name: data_name, data_lib_name: data_lib_name, source: data_source))
end

.has_wrapper_for?(val) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/peacekeeper/model.rb', line 63

def has_wrapper_for?(val)
  !!wrapper_for(val)
end

.inherited(sub) ⇒ Object



56
57
58
59
60
61
# File 'lib/peacekeeper/model.rb', line 56

def inherited(sub)
  unless sub.name.nil?
    subclasses << sub
    sub.setup(self)
  end
end

.newObject

Raises:

  • (RuntimeError)


14
15
16
17
# File 'lib/peacekeeper/model.rb', line 14

def new(*)
  raise RuntimeError, "ModelObject cannot be instantiated directly. Please subclass first!" if self == Model
  super
end

.setup(parent) ⇒ Object



73
74
75
76
# File 'lib/peacekeeper/model.rb', line 73

def setup(parent)
  self.config = parent.config
  self.data_source = parent.data_source
end

.subclassesObject



19
# File 'lib/peacekeeper/model.rb', line 19

def subclasses; (@subclasses ||= []); end

.wrapper_for(val) ⇒ Object



67
68
69
70
71
# File 'lib/peacekeeper/model.rb', line 67

def wrapper_for(val)
  subclasses.find do |subclass|
    val == subclass.delegate
  end
end

Instance Method Details

#==(obj) ⇒ Object



114
115
116
# File 'lib/peacekeeper/model.rb', line 114

def ==(obj)
  obj.equal?(self) || @data == obj.data
end

#data_classObject



118
119
120
# File 'lib/peacekeeper/model.rb', line 118

def data_class
  self.class.data_class
end