simple_ams 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 187d317a579cf83a439386c26889aa8d83d8b4fd
4
- data.tar.gz: 3b9c96d21261064d84b17469e6c641d6ffdd6de9
2
+ SHA256:
3
+ metadata.gz: 9b09157cf3099fe306077aeac488a0f2d4a9674f554d98b7ad1e73772b2beffb
4
+ data.tar.gz: 5134001b312f8602fb2bee3712f81ba9e859e247cacef59d1e4abeb8e15d66de
5
5
  SHA512:
6
- metadata.gz: 256cddefd11ab9bddfca80542ab66df3273c6b769e3e1214c1bd8c7de08bf57b75c3bdc8ced67423b1904d64c3f5355dccbec1733a693585e2ac27c99b84d467
7
- data.tar.gz: 0bb37d2b577647e1dc2b83bc9fe24b370204f8a7cd58a30078e2c13d951f985d1233559d56bd34c0b2f4dfc954c3324684255d79dc74eab16ce88a275785f2ac
6
+ metadata.gz: 993d7b6f1ad749b2b992885e4f13d606f237895df3858261431c1b3369f281782e6d26e4cc690dd4af032dd54a9f903e006a7c10f12b3d04496fdfd5beefce97
7
+ data.tar.gz: 8abc4dab396f0d31955c9a19290525cf50b46c583feefc812833fd2d1f946461c99f7b41ef47fe907e7d2ea11d44dd78e057040628a7a7ca2d97d59b09d02b45
data/README.md CHANGED
@@ -44,7 +44,7 @@ class UserSerializer
44
44
  has_one :profile, serializer: ProfileSerializer
45
45
  #belongs_to is just an alias to has_one
46
46
  belongs_to :organization, serializer: OrganizationSerializer
47
- has_many :videos, serializer: VideosSerializer
47
+ has_many :videos, serializer: VideosSerializer do
48
48
  #rarely used: if you need more options, you can pas a block
49
49
  #which adheres to the same DSL as described here
50
50
  #it goes to an option called `embedded`
@@ -2,7 +2,8 @@ require "simple_ams"
2
2
 
3
3
  class SimpleAMS::Adapters::JSONAPI
4
4
  DEFAULT_OPTIONS = {
5
- skip_id_in_attributes: true
5
+ skip_id_in_attributes: false,
6
+ key_transform: nil
6
7
  }
7
8
 
8
9
  attr_reader :document, :options
@@ -45,7 +46,16 @@ class SimpleAMS::Adapters::JSONAPI
45
46
  end
46
47
 
47
48
  def transform_key(key)
48
- key.to_s.gsub('_', '-')
49
+ case options[:key_transform]
50
+ #when :camel
51
+ #when :camel_lower
52
+ when :dash
53
+ key.to_s.gsub('_','-')
54
+ when :underscore
55
+ key.to_s.gsub('-', '_')
56
+ else
57
+ key
58
+ end
49
59
  end
50
60
 
51
61
  def relationships
@@ -53,6 +63,7 @@ class SimpleAMS::Adapters::JSONAPI
53
63
 
54
64
  @relationships ||= document.relations.inject({}){ |hash, relation|
55
65
  _hash = {}
66
+
56
67
  embedded_relation_data = embedded_relation_data_for(relation)
57
68
  unless embedded_relation_data.empty?
58
69
  _hash.merge!(data: embedded_relation_data_for(relation))
@@ -124,9 +135,9 @@ class SimpleAMS::Adapters::JSONAPI
124
135
 
125
136
  @included ||= document.relations.available.inject([]){ |array, relation|
126
137
  if relation.folder?
127
- array << relation.map{|doc| self.class.new(doc).as_json[:data]}
138
+ array << relation.map{|doc| self.class.new(doc, options).as_json[:data]}
128
139
  else
129
- array << self.class.new(relation).as_json[:data]
140
+ array << self.class.new(relation, options).as_json[:data]
130
141
  end
131
142
 
132
143
  array
@@ -148,16 +159,24 @@ class SimpleAMS::Adapters::JSONAPI
148
159
  }
149
160
  hash.merge!(meta: metas) unless metas.empty?
150
161
  hash.merge!(links: links) unless links.empty?
162
+ hash.merge!(included: included) unless included.empty?
151
163
 
152
164
  return hash
153
165
  end
154
166
 
155
167
  def documents
168
+ @included = []
156
169
  return folder.map{|document|
157
- adapter.new(document).as_json[:data]
170
+ _doc = adapter.new(document, options).as_json
171
+ @included << _doc[:included]
172
+ _doc[:data]
158
173
  } || []
159
174
  end
160
175
 
176
+ def included
177
+ (@included || []).flatten
178
+ end
179
+
161
180
  def metas
162
181
  @metas ||= folder.metas.inject({}){ |hash, meta|
163
182
  hash[transform_key(meta.name)] = meta.value
@@ -1,13 +1,13 @@
1
1
  require "simple_ams"
2
2
 
3
3
  module SimpleAMS
4
- class Document::Forms < Document::Links
4
+ class Document::Forms < Document::Generics
5
5
  def initialize(options)
6
6
  @options = options
7
7
  @members = options.forms
8
8
  end
9
9
 
10
- class Form < Document::Links::Link
10
+ class Form < Document::Generics::Generic
11
11
  end
12
12
  end
13
13
  end
@@ -1,14 +1,51 @@
1
1
  require "simple_ams"
2
2
 
3
3
  module SimpleAMS
4
- class Document::Generics < Document::Links
4
+ class Document::Generics
5
+ include Enumerable
6
+
7
+ Generic = Struct.new(:name, :value, :options)
8
+
5
9
  def initialize(options)
6
10
  @options = options
7
11
  @members = options.generics
8
12
  end
9
13
 
10
- class Option < Document::Links::Link
14
+ def [](key)
15
+ found = members.find{|generic| generic.name == key}
16
+ return nil unless found
17
+
18
+ return with_decorator(found)
19
+ end
20
+
21
+ def each(&block)
22
+ return enum_for(:each) unless block_given?
23
+
24
+ members.each{ |member|
25
+ yield with_decorator(member)
26
+ }
27
+
28
+ self
11
29
  end
30
+
31
+ def any?
32
+ members.any?
33
+ end
34
+
35
+ def empty?
36
+ members.empty?
37
+ end
38
+
39
+ private
40
+ attr_reader :members, :options
41
+
42
+ def with_decorator(generic)
43
+ Generic.new(
44
+ generic.name,
45
+ generic.respond_to?(:call) ? generic.value.call : generic.value,
46
+ generic.options
47
+ )
48
+ end
12
49
  end
13
50
  end
14
51
 
@@ -1,51 +1,13 @@
1
1
  require "simple_ams"
2
2
 
3
3
  module SimpleAMS
4
- class Document::Links
5
- include Enumerable
6
-
7
- Link = Struct.new(:name, :value, :options)
8
-
4
+ class Document::Links < Document::Generics
9
5
  def initialize(options)
10
6
  @options = options
11
7
  @members = options.links
12
8
  end
13
9
 
14
- def [](key)
15
- found = members.find{|link| link.name == key}
16
- return nil unless found
17
-
18
- return with_decorator(found)
19
- end
20
-
21
- def each(&block)
22
- return enum_for(:each) unless block_given?
23
-
24
- members.each{ |member|
25
- yield with_decorator(member)
26
- }
27
-
28
- self
29
- end
30
-
31
- def any?
32
- members.any?
33
- end
34
-
35
- def empty?
36
- members.empty?
10
+ class Generic < Document::Generics::Generic
37
11
  end
38
-
39
- private
40
- attr_reader :members, :options
41
-
42
- def with_decorator(link)
43
- Link.new(
44
- link.name,
45
- link.respond_to?(:call) ? link.value.call : link.value,
46
- link.options
47
- )
48
- end
49
12
  end
50
13
  end
51
-
@@ -1,13 +1,13 @@
1
1
  require "simple_ams"
2
2
 
3
3
  module SimpleAMS
4
- class Document::Metas < Document::Links
4
+ class Document::Metas < Document::Generics
5
5
  def initialize(options)
6
6
  @options = options
7
7
  @members = options.metas
8
8
  end
9
9
 
10
- class Meta < Document::Links::Link
10
+ class Meta < Document::Generics::Generic
11
11
  end
12
12
  end
13
13
  end
@@ -30,7 +30,7 @@ module SimpleAMS
30
30
  end
31
31
 
32
32
  def empty?
33
- count == 0
33
+ relations.length == 0
34
34
  end
35
35
 
36
36
  def available
@@ -83,7 +83,7 @@ module SimpleAMS
83
83
  )
84
84
  ).merge(
85
85
  _internal: {
86
- module: serializer.class.to_s.rpartition('::').first
86
+ module: serializer.class.to_s.rpartition('::')[0]
87
87
  }
88
88
  )
89
89
  }
@@ -28,15 +28,15 @@ class SimpleAMS::Document
28
28
  end
29
29
 
30
30
  def name
31
- options.name
31
+ @name ||= options.name
32
32
  end
33
33
 
34
34
  def type
35
- options.type
35
+ @type ||= options.type
36
36
  end
37
37
 
38
38
  def adapter
39
- options.adapter
39
+ @adapter ||= options.adapter
40
40
  end
41
41
 
42
42
  def links
@@ -64,7 +64,7 @@ class SimpleAMS::Document
64
64
  end
65
65
 
66
66
  def folder?
67
- self.is_a?(self.class::Folder)
67
+ @is_folder ||= self.is_a?(self.class::Folder)
68
68
  end
69
69
 
70
70
  def document?
@@ -80,6 +80,7 @@ class SimpleAMS::Document
80
80
  class Folder < self
81
81
  include Enumerable
82
82
  attr_reader :members
83
+ alias collection resource
83
84
 
84
85
  def initialize(options, embedded_options = nil)
85
86
  @_options = options
@@ -87,6 +88,7 @@ class SimpleAMS::Document
87
88
  @options = @_options.collection_options
88
89
 
89
90
  @members = options.collection
91
+ @resource = options.resource
90
92
  end
91
93
 
92
94
  def each(&block)
@@ -102,6 +104,7 @@ class SimpleAMS::Document
102
104
  #do we really need this method ?
103
105
  def documents
104
106
  @members.map do |resource|
107
+ #need optimization here!
105
108
  SimpleAMS::Document.new(options_for(resource))
106
109
  end
107
110
  end
@@ -122,8 +125,8 @@ class SimpleAMS::Document
122
125
  allowed_options: serializer_for(resource).options
123
126
  })
124
127
  else
125
- # resource_options.with_resource(resource)
126
- # end
128
+ resource_options.with_resource(resource)
129
+ =begin
127
130
  # we need to optimize that using tracked properties
128
131
  SimpleAMS::Options.new(resource, {
129
132
  injected_options: resource_options.injected_options.merge({
@@ -131,6 +134,7 @@ class SimpleAMS::Document
131
134
  }),
132
135
  allowed_options: serializer_for(resource).options
133
136
  })
137
+ =end
134
138
  end
135
139
  end
136
140
 
@@ -33,7 +33,7 @@ module SimpleAMS::DSL
33
33
  options.merge(
34
34
  #TODO: maybe add another group of elements under dsl?
35
35
  #this could be DSL::Type.new(type).explicit?
36
- type.last[:_explicit] ? {} : {type: nil}
36
+ type[-1][:_explicit] ? {} : {type: nil}
37
37
  )
38
38
  )
39
39
 
@@ -59,7 +59,7 @@ module SimpleAMS::DSL
59
59
  self::Collection_.options.merge(
60
60
  #TODO: maybe add another group of elements under dsl?
61
61
  #this could be DSL::Type.new(type).explicit?
62
- type.last[:_explicit] ? {} : {type: nil}
62
+ type[-1][:_explicit] ? {} : {type: nil}
63
63
  )
64
64
  )
65
65
  subclass.const_set('Collection_', _klass)
@@ -80,11 +80,11 @@ module SimpleAMS::DSL
80
80
  'Serializer',''
81
81
  ).gsub(
82
82
  '::Collection_', ''
83
- ).downcase.split('::').last
83
+ ).downcase.split('::')[-1]
84
84
 
85
85
  return "#{_name}_collection".to_sym
86
86
  else
87
- return self.to_s.gsub('Serializer','').downcase.split('::').last.to_sym
87
+ return self.to_s.gsub('Serializer','').downcase.split('::')[-1].to_sym
88
88
  end
89
89
  end
90
90
  def with_options(options = {})
@@ -101,14 +101,15 @@ module SimpleAMS::DSL
101
101
  collection{}.with_options(value)
102
102
  end
103
103
  elsif meths.include?(key)
104
- if (value.is_a?(Array) && value.first.is_a?(Array)) || value.is_a?(Hash)
104
+ if (value.is_a?(Array) && value[0].is_a?(Array)) || value.is_a?(Hash)
105
105
  self.send(key, value)
106
106
  else
107
107
  self.send(key, *value)
108
108
  end
109
109
  else
110
- #TODO: Add a proper logger
111
- puts "SimpeAMS: #{key} is not recognized, ignoring (from #{self.to_s})"
110
+ SimpleAMS.configuration.logger.info(
111
+ "SimpeAMS: #{key} is not recognized, ignoring (from #{self.to_s})"
112
+ )
112
113
  end
113
114
  end
114
115
 
@@ -4,6 +4,6 @@ class SimpleAMS::Options
4
4
  class Adapter
5
5
  include SimpleAMS::Options::Concerns::ValueHash
6
6
 
7
- alias_method :klass, :value
7
+ alias :klass :value
8
8
  end
9
9
  end
@@ -7,7 +7,7 @@ class SimpleAMS::Options
7
7
  #for optimizing performance, ask only the first element
8
8
  #other idea is to create another module just for (Name)ValueHash objects
9
9
  def &(other_filterables)
10
- other_is_object = other_filterables.first.respond_to?(:name)
10
+ other_is_object = other_filterables[0].respond_to?(:name)
11
11
 
12
12
  return self.class.new(
13
13
  self.select{|m|
@@ -23,18 +23,18 @@ class SimpleAMS::Options
23
23
  #for optimizing performance, ask only the first element of self and save it as state
24
24
  def include?(member)
25
25
  unless defined?(@self_is_object)
26
- @self_is_object = self.first.respond_to?(:name)
26
+ @self_is_object = self[0].respond_to?(:name)
27
27
  end
28
28
 
29
29
  if @self_is_object
30
- self.map(&:name).include?(member)
30
+ self.any?{|s| s.name == member}
31
31
  else
32
32
  super
33
33
  end
34
34
  end
35
35
 
36
36
  def raw
37
- if self.first.respond_to?(:raw)
37
+ if self[0].respond_to?(:raw)
38
38
  self.map(&:raw)
39
39
  else
40
40
  self.map{|i| i}
@@ -7,11 +7,12 @@ class SimpleAMS::Options
7
7
 
8
8
  def initialize(name, value, options = {}, resource:, serializer:)
9
9
  @name = name.is_a?(String) ? name.to_sym : name
10
- if value.is_a?(Proc) #TODO: maybe we should do duck typing instead?
10
+ if value.respond_to?(:call)
11
+ @volatile = true
11
12
  _value = value.call(resource, serializer)
12
13
  if _value.is_a?(Array) && _value.length > 1
13
- @value = _value.first
14
- @options = (_value.last || {}).merge(options || {})
14
+ @value = _value[0]
15
+ @options = (_value[-1] || {}).merge(options || {})
15
16
  else
16
17
  @value = _value
17
18
  @options = options || {}
@@ -26,6 +27,10 @@ class SimpleAMS::Options
26
27
  [name, value, options]
27
28
  end
28
29
 
30
+ def volatile?
31
+ return @volatile || false
32
+ end
33
+
29
34
  private
30
35
  attr_writer :name, :value, :options
31
36
  end
@@ -0,0 +1,25 @@
1
+ class SimpleAMS::Options
2
+ module Concerns
3
+ module TrackedProperties
4
+ Tracked = Struct.new(:value) do
5
+ def volatile?
6
+ return @volatile if defined?(@volatile)
7
+ return @volatile ||= self.value.volatile?
8
+ end
9
+ end
10
+
11
+ def initialize_tracking!
12
+ @tracked_properties = {}
13
+ end
14
+
15
+ def clean_volatile_properties!
16
+ @tracked_properties = @tracked_properties.select{|k, v| !v.volatile?}
17
+ end
18
+
19
+ def tracked(meth)
20
+ @tracked_properties[meth] ||= Tracked.new
21
+ end
22
+ end
23
+ end
24
+ end
25
+
@@ -4,13 +4,15 @@ class SimpleAMS::Options
4
4
  module Concerns
5
5
  module ValueHash
6
6
  attr_reader :value, :options
7
+ alias :name :value
7
8
 
8
9
  def initialize(value, options = {}, resource:, serializer:)
9
- if value.is_a?(Proc) #TODO: maybe we should do duck typing instead?
10
+ if value.respond_to?(:call)
11
+ @volatile = true
10
12
  _value = value.call(resource, serializer)
11
13
  if _value.is_a?(Array) && _value.length > 1
12
- @value = _value.first
13
- @options = (_value.last || {}).merge(options || {})
14
+ @value = _value[0]
15
+ @options = (_value[-1] || {}).merge(options || {})
14
16
  else
15
17
  @value = _value
16
18
  @options = options || {}
@@ -21,12 +23,14 @@ class SimpleAMS::Options
21
23
  end
22
24
  end
23
25
 
24
- alias_method :name, :value
25
-
26
26
  def raw
27
27
  [value, options]
28
28
  end
29
29
 
30
+ def volatile?
31
+ return @volatile || false
32
+ end
33
+
30
34
  private
31
35
  attr_writer :value, :options
32
36
  end
@@ -1,10 +1,10 @@
1
1
  require "simple_ams"
2
2
 
3
3
  class SimpleAMS::Options
4
- class Forms < Array
4
+ class Forms < Generics
5
5
  include SimpleAMS::Options::Concerns::Filterable
6
6
 
7
- class Form
7
+ class Form < Generics::Option
8
8
  include SimpleAMS::Options::Concerns::NameValueHash
9
9
  end
10
10
  end
@@ -4,6 +4,10 @@ class SimpleAMS::Options
4
4
  class Generics < Array
5
5
  include SimpleAMS::Options::Concerns::Filterable
6
6
 
7
+ def volatile?
8
+ self.any?(&:volatile?)
9
+ end
10
+
7
11
  class Option
8
12
  include SimpleAMS::Options::Concerns::NameValueHash
9
13
  end
@@ -1,10 +1,10 @@
1
1
  require "simple_ams"
2
2
 
3
3
  class SimpleAMS::Options
4
- class Links < Array
4
+ class Links < Generics
5
5
  include SimpleAMS::Options::Concerns::Filterable
6
6
 
7
- class Link
7
+ class Link < Generics::Option
8
8
  include SimpleAMS::Options::Concerns::NameValueHash
9
9
  end
10
10
  end
@@ -1,10 +1,10 @@
1
1
  require "simple_ams"
2
2
 
3
3
  class SimpleAMS::Options
4
- class Metas < Array
4
+ class Metas < Generics
5
5
  include SimpleAMS::Options::Concerns::Filterable
6
6
 
7
- class Meta
7
+ class Meta < Generics::Option
8
8
  include SimpleAMS::Options::Concerns::NameValueHash
9
9
  end
10
10
  end
@@ -2,12 +2,15 @@ require "simple_ams"
2
2
 
3
3
  module SimpleAMS
4
4
  class Options
5
+ include Concerns::TrackedProperties
6
+
5
7
  class Collection < self; end
6
8
 
7
9
  attr_reader :resource, :allowed_options, :injected_options
8
10
 
9
11
  #injected_options is always a Hash object
10
12
  def initialize(resource = nil, injected_options: {}, allowed_options: nil)
13
+ initialize_tracking!
11
14
  @resource = resource
12
15
  @injected_options = injected_options || {}
13
16
  @_internal = @injected_options[:_internal] || {}
@@ -19,6 +22,8 @@ module SimpleAMS
19
22
  def with_resource(resource)
20
23
  @resource = resource
21
24
 
25
+ clean_volatile_properties!
26
+
22
27
  return self
23
28
  end
24
29
 
@@ -27,15 +32,15 @@ module SimpleAMS
27
32
  end
28
33
 
29
34
  def primary_id
30
- return @primary_id if defined?(@primary_id)
35
+ return tracked(__method__).value if tracked(__method__).value
31
36
 
32
- return @primary_id = array_of_value_hash_for(PrimaryId, :primary_id)
37
+ return tracked(__method__).value = array_of_value_hash_for(PrimaryId, :primary_id)
33
38
  end
34
39
 
35
40
  def type
36
- return @type if defined?(@type)
41
+ return tracked(__method__).value if tracked(__method__).value
37
42
 
38
- return @type = array_of_value_hash_for(Type, :type)
43
+ return tracked(__method__).value = array_of_value_hash_for(Type, :type)
39
44
  end
40
45
 
41
46
  def name
@@ -66,27 +71,27 @@ module SimpleAMS
66
71
  end
67
72
 
68
73
  def links
69
- return @links if defined?(@links)
74
+ return tracked(__method__).value if tracked(__method__).value
70
75
 
71
- return @links = array_of_name_value_hash_for(Links, Links::Link, :links)
76
+ return tracked(__method__).value = array_of_name_value_hash_for(Links, Links::Link, :links)
72
77
  end
73
78
 
74
79
  def metas
75
- return @metas if defined?(@metas)
80
+ return tracked(__method__).value if tracked(__method__).value
76
81
 
77
- return @metas = array_of_name_value_hash_for(Metas, Metas::Meta, :metas)
82
+ return tracked(__method__).value = array_of_name_value_hash_for(Metas, Metas::Meta, :metas)
78
83
  end
79
84
 
80
85
  def forms
81
- return @forms if defined?(@forms)
86
+ return tracked(__method__).value if tracked(__method__).value
82
87
 
83
- return @forms = array_of_name_value_hash_for(Forms, Forms::Form, :forms)
88
+ return tracked(__method__).value = array_of_name_value_hash_for(Forms, Forms::Form, :forms)
84
89
  end
85
90
 
86
91
  def generics
87
- return @generics if defined?(@generics)
92
+ return tracked(__method__).value if tracked(__method__).value
88
93
 
89
- return @generics = array_of_name_value_hash_for(
94
+ return tracked(__method__).value = array_of_name_value_hash_for(
90
95
  Generics, Generics::Option, :generics
91
96
  )
92
97
  end
@@ -112,11 +117,13 @@ module SimpleAMS
112
117
  resource: resource, serializer: serializer
113
118
  })
114
119
  end
120
+ =begin
115
121
  if @adapter.value.nil?
116
122
  @adapter = Adapter.new(SimpleAMS::Adapters::AMS, {
117
123
  resource: resource, serializer: serializer
118
124
  })
119
125
  end
126
+ =end
120
127
 
121
128
  return @adapter
122
129
  end
@@ -175,7 +182,7 @@ module SimpleAMS
175
182
  def collection_serializer_class
176
183
  return @collection_serializer_class if defined?(@collection_serializer_class)
177
184
 
178
- if serializer_class.is_a?(Proc)
185
+ if serializer_class.is_a?(Proc) #TODO: maybe we should do duck typing instead?
179
186
  @collection_serializer_class = injected_options[:collection_serializer]
180
187
  if @collection_serializer_class.nil?
181
188
  raise "In case of a proc serializer, you need to specify a collection_serializer"
@@ -239,7 +246,7 @@ module SimpleAMS
239
246
  def priority_options_for(allowed:, injected:)
240
247
  if not injected.nil?
241
248
  allowed = injected.class.new(
242
- injected.map{|s| s.is_a?(Hash) ? s.keys.first : s}
249
+ injected.map{|s| s.is_a?(Hash) ? (s.first && s.first[0]) : s}
243
250
  ) & allowed
244
251
  end
245
252
 
@@ -256,10 +263,9 @@ module SimpleAMS
256
263
  return @_relation_options if defined?(@_relation_options)
257
264
 
258
265
  @_relation_options = relations.inject({}){|memo, relation|
259
- includes_value = (injected_options[:includes] || {}).select{|incl|
260
- incl.is_a?(Hash)
261
- }.find{|incl_hash|
262
- incl_hash.keys.first.to_s == relation.name.to_s
266
+ includes_value = (injected_options[:includes] || {}).find{|incl_hash|
267
+ incl_hash.is_a?(Hash) &&
268
+ (incl_hash.first && incl_hash.first[0]).to_s == relation.name.to_s
263
269
  }
264
270
  if includes_value
265
271
  includes_value = includes_value[relation.name]
@@ -268,10 +274,9 @@ module SimpleAMS
268
274
  includes_value = []
269
275
  end
270
276
 
271
- fields_value = (injected_options[:fields] || {}).select{|field|
272
- field.is_a?(Hash)
273
- }.find{|field_hash|
274
- field_hash.keys.first.to_s == relation.name.to_s
277
+ fields_value = (injected_options[:fields] || {}).find{|field_hash|
278
+ field_hash.is_a?(Hash) &&
279
+ (field_hash.first && field_hash.first[0]).to_s == relation.name.to_s
275
280
  }
276
281
 
277
282
  #.. while here just nil will work (pick default fields from serializer)
@@ -288,7 +293,7 @@ module SimpleAMS
288
293
  #TODO: raise exception if both are nil!
289
294
  def fetch_allowed_options
290
295
  _serializer_class = self.serializer_class
291
- if _serializer_class.is_a?(Proc)
296
+ if _serializer_class.is_a?(Proc) #TODO: maybe we should do duck typing instead?
292
297
  _serializer_class = self.collection_serializer_class
293
298
  end
294
299
 
@@ -311,7 +316,7 @@ module SimpleAMS
311
316
 
312
317
  def infer_serializer
313
318
  namespace = _internal[:module] ? "#{_internal[:module]}::" : ""
314
- resource_klass = resource.kind_of?(Array) ? resource.first.class : resource.class
319
+ resource_klass = resource.kind_of?(Array) ? resource[0].class : resource.class
315
320
  if resource_klass == NilClass
316
321
  return EmptySerializer
317
322
  else
@@ -1,3 +1,3 @@
1
1
  module SimpleAMS
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/simple_ams.rb CHANGED
@@ -8,17 +8,18 @@ require "simple_ams/adapters/ams"
8
8
  require "simple_ams/adapters/jsonapi"
9
9
  require "simple_ams/renderer"
10
10
 
11
- require "simple_ams/options"
12
11
  require "simple_ams/options/concerns/filterable"
13
12
  require "simple_ams/options/concerns/name_value_hash"
14
13
  require "simple_ams/options/concerns/value_hash"
14
+ require "simple_ams/options/concerns/tracked_properties"
15
+ require "simple_ams/options"
15
16
  require "simple_ams/options/adapter"
16
17
  require "simple_ams/options/fields"
17
18
  require "simple_ams/options/includes"
19
+ require "simple_ams/options/generics"
18
20
  require "simple_ams/options/links"
19
21
  require "simple_ams/options/metas"
20
22
  require "simple_ams/options/forms"
21
- require "simple_ams/options/generics"
22
23
  require "simple_ams/options/primary_id"
23
24
  require "simple_ams/options/type"
24
25
  require "simple_ams/options/relations"
@@ -26,10 +27,30 @@ require "simple_ams/options/relations"
26
27
  require "simple_ams/document/primary_id"
27
28
  require "simple_ams/document/fields"
28
29
  require "simple_ams/document/relations"
30
+ require "simple_ams/document/generics"
29
31
  require "simple_ams/document/links"
30
32
  require "simple_ams/document/metas"
31
33
  require "simple_ams/document/forms"
32
- require "simple_ams/document/generics"
34
+ require "logger"
33
35
 
34
36
  module SimpleAMS
37
+ class << self
38
+ def configuration
39
+ @configuration ||= Configuration.new
40
+ end
41
+ attr_writer :configuration
42
+ end
43
+
44
+ def self.configure
45
+ self.configuration ||= Configuration.new
46
+ yield(self.configuration)
47
+ end
48
+
49
+ class Configuration
50
+ attr_accessor :logger
51
+
52
+ def initialize
53
+ @logger = ::Logger.new(STDOUT)
54
+ end
55
+ end
35
56
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_ams
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Filippos Vasilakis
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-04 00:00:00.000000000 Z
11
+ date: 2019-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -127,6 +127,7 @@ files:
127
127
  - lib/simple_ams/options/adapter.rb
128
128
  - lib/simple_ams/options/concerns/filterable.rb
129
129
  - lib/simple_ams/options/concerns/name_value_hash.rb
130
+ - lib/simple_ams/options/concerns/tracked_properties.rb
130
131
  - lib/simple_ams/options/concerns/value_hash.rb
131
132
  - lib/simple_ams/options/fields.rb
132
133
  - lib/simple_ams/options/forms.rb
@@ -158,8 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
159
  - !ruby/object:Gem::Version
159
160
  version: '0'
160
161
  requirements: []
161
- rubyforge_project:
162
- rubygems_version: 2.6.12
162
+ rubygems_version: 3.0.2
163
163
  signing_key:
164
164
  specification_version: 4
165
165
  summary: ActiveModel Serializers, simplified.