Class: SimpleAMS::Options

Inherits:
Object
  • Object
show all
Defined in:
lib/simple_ams/options.rb,
lib/simple_ams/options/type.rb,
lib/simple_ams/options/forms.rb,
lib/simple_ams/options/links.rb,
lib/simple_ams/options/metas.rb,
lib/simple_ams/options/fields.rb,
lib/simple_ams/options/adapter.rb,
lib/simple_ams/options/generics.rb,
lib/simple_ams/options/includes.rb,
lib/simple_ams/options/relations.rb,
lib/simple_ams/options/primary_id.rb,
lib/simple_ams/options/concerns/filterable.rb,
lib/simple_ams/options/concerns/value_hash.rb,
lib/simple_ams/options/concerns/name_value_hash.rb

Direct Known Subclasses

Collection

Defined Under Namespace

Modules: Concerns Classes: Adapter, Collection, EmptySerializer, Fields, Forms, Generics, Includes, Links, Metas, PrimaryId, Relations, Type

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource = nil, injected_options: {}, allowed_options: nil) ⇒ Options

injected_options is always a Hash object



10
11
12
13
14
15
# File 'lib/simple_ams/options.rb', line 10

def initialize(resource = nil, injected_options: {}, allowed_options: nil)
  @resource = resource
  @injected_options = injected_options || {}
  @_internal = @injected_options[:_internal] || {}
  @allowed_options = allowed_options || fetch_allowed_options
end

Instance Attribute Details

#allowed_optionsObject (readonly)

Returns the value of attribute allowed_options.



7
8
9
# File 'lib/simple_ams/options.rb', line 7

def allowed_options
  @allowed_options
end

#injected_optionsObject (readonly)

Returns the value of attribute injected_options.



7
8
9
# File 'lib/simple_ams/options.rb', line 7

def injected_options
  @injected_options
end

#resourceObject (readonly) Also known as: collection

Returns the value of attribute resource.



7
8
9
# File 'lib/simple_ams/options.rb', line 7

def resource
  @resource
end

Instance Method Details

#adapter(_serializer: nil) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/simple_ams/options.rb', line 103

def adapter(_serializer: nil)
  return @adapter if defined?(@adapter) && _serializer.nil?
  serializer = _serializer || serializer

  @adapter = Adapter.new(*injected_options.fetch(:adapter, [nil]), {
    resource: resource, serializer: serializer
  })
  if @adapter.value.nil?
    @adapter = Adapter.new(*allowed_options.fetch(:adapter, [nil]), {
      resource: resource, serializer: serializer
    })
  end
  if @adapter.value.nil?
    @adapter = Adapter.new(SimpleAMS::Adapters::AMS, {
      resource: resource, serializer: serializer
    })
  end

  return @adapter
end

#as_hashObject



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/simple_ams/options.rb', line 129

def as_hash
  {
    adapter: adapter.raw,
    primary_id: primary_id.raw,
    type: type.raw,
    name: name,
    fields: fields.raw,
    serializer: serializer_class,
    #relations: relations.raw, #TODO: why have I commented that out ?
    includes: includes.raw,
    links: links.raw,
    metas: metas.raw,
    expose: expose,
    _internal: _internal
  }
end

#collection_optionsObject



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/simple_ams/options.rb', line 146

def collection_options
  return @collection_options if defined?(@collection_options)

  #TODO: Do we need that merge ?
  _injected_options = @injected_options.fetch(:collection, {}).merge({
    serializer: collection_serializer_class,
    adapter: adapter(_serializer: collection_serializer_class).raw
  })
  _allowed_options = @allowed_options.fetch(:collection).options

  return @collection_options = self.class::Collection.new(
    resource,
    injected_options: _injected_options,
    allowed_options: _allowed_options
  )
end

#collection_serializer_classObject

TODO: maybe have that inside :collection? (isomorphism)



174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/simple_ams/options.rb', line 174

def collection_serializer_class
  return @collection_serializer_class if defined?(@collection_serializer_class)

  if serializer_class.is_a?(Proc)
    @collection_serializer_class = injected_options[:collection_serializer]
    if @collection_serializer_class.nil?
      raise "In case of a proc serializer, you need to specify a collection_serializer"
    end
  else
    @collection_serializer_class = serializer_class
  end

  return @collection_serializer_class
end

#exposeObject

the following should be the same for all (nested) serializers of the same document



125
126
127
# File 'lib/simple_ams/options.rb', line 125

def expose
  @expose ||= injected_options.fetch(:expose, {})
end

#fieldsObject

TODO: optimize for nested fields?



46
47
48
49
50
# File 'lib/simple_ams/options.rb', line 46

def fields
  return @fields if defined?(@fields)

  return @fields = array_of_items_for(Fields, :fields)
end

#formsObject



80
81
82
83
84
# File 'lib/simple_ams/options.rb', line 80

def forms
  return @forms if defined?(@forms)

  return @forms = array_of_name_value_hash_for(Forms, Forms::Form, :forms)
end

#genericsObject



86
87
88
89
90
91
92
# File 'lib/simple_ams/options.rb', line 86

def generics
  return @generics if defined?(@generics)

  return @generics = array_of_name_value_hash_for(
    Generics, Generics::Option, :generics
  )
end

#includesObject



52
53
54
55
56
# File 'lib/simple_ams/options.rb', line 52

def includes
  return @includes if defined?(@includes)

  return @includes = array_of_items_for(Includes, :includes)
end


68
69
70
71
72
# File 'lib/simple_ams/options.rb', line 68

def links
  return @links if defined?(@links)

  return @links = array_of_name_value_hash_for(Links, Links::Link, :links)
end

#metasObject



74
75
76
77
78
# File 'lib/simple_ams/options.rb', line 74

def metas
  return @metas if defined?(@metas)

  return @metas = array_of_name_value_hash_for(Metas, Metas::Meta, :metas)
end

#nameObject



41
42
43
# File 'lib/simple_ams/options.rb', line 41

def name
  @name ||= injected_options[:name] || allowed_options[:name] || type.name
end

#primary_idObject



29
30
31
32
33
# File 'lib/simple_ams/options.rb', line 29

def primary_id
  return @primary_id if defined?(@primary_id)

  return @primary_id = array_of_value_hash_for(PrimaryId, :primary_id)
end

#relation_options_for(relation_name) ⇒ Object



25
26
27
# File 'lib/simple_ams/options.rb', line 25

def relation_options_for(relation_name)
  return _relation_options[relation_name] || {}
end

#relationsObject

TODO: correctly loop over injected relations, although should be a rarely used feature



59
60
61
62
63
64
65
66
# File 'lib/simple_ams/options.rb', line 59

def relations
  return @relations if defined?(@relations)

  relations = injected_options.fetch(:relations, nil)
  relations = allowed_options.fetch(:relations, []) if relations.nil?

  return @relations = Relations.new(relations, includes)
end

#serializerObject

TODO: handle case of proc



95
96
97
98
99
100
101
# File 'lib/simple_ams/options.rb', line 95

def serializer
  return @serializer if defined?(@serializer)

  _serializer = injected_options.fetch(:serializer, serializer_class)

  return @serializer = instantiated_serializer_for(_serializer)
end

#serializer_classObject



163
164
165
166
167
168
169
170
171
# File 'lib/simple_ams/options.rb', line 163

def serializer_class
  return @serializer_class if defined?(@serializer_class)

  @serializer_class = injected_options.fetch(:serializer, nil)

  return @serializer_class if @serializer_class 

  return @serializer_class = infer_serializer
end

#typeObject



35
36
37
38
39
# File 'lib/simple_ams/options.rb', line 35

def type
  return @type if defined?(@type)

  return @type = array_of_value_hash_for(Type, :type)
end

#with_resource(resource) ⇒ Object

performance enchancement method for non-polymorphic collections



19
20
21
22
23
# File 'lib/simple_ams/options.rb', line 19

def with_resource(resource)
  @resource = resource

  return self
end