tint 0.0.4 → 0.0.5.pre1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b243827913ffe5dd0696d1a4c43c4279f2cbe35
4
- data.tar.gz: c112cffa3c4b79cbb6f540c7c41e4e5d998f70d2
3
+ metadata.gz: cd0ed750b6e6c9ad99e7bccd4bd2581bed714ff4
4
+ data.tar.gz: f5f07e5ddb68ce731449dcba1b1d608768912cb8
5
5
  SHA512:
6
- metadata.gz: 13aa4b8db03c71954930d71dfe6ce16401c6cce0f4b41df22728a2c2f231ff8e955982ab3e8b62e0e9affc09dec07a606d11d843ea625b0afe2d7216c235f63a
7
- data.tar.gz: 920ae9f4d9cbd7bee7afe69e2d83772a2de9174fc7b693ccbe47a51777402f8fbbe855ed7e9d03e9eccdc40e51594748934516018f71b8a889968e5963b61b2c
6
+ metadata.gz: 030e7bb630e095ad2432da014b3d74e66f11b3e648cb2df9145016cd479c9612476cf65030c9b95bd4c0eb67ce021b8af6ecb500b15e4d912a4b25a8c98b52ea
7
+ data.tar.gz: 98908fd1d9909ffcd72e618cb91770ec4f8969dd94d02cb1263b3d975c2bbdf54d40b92b5a2e6507d292b5aeecd9b2462307e0708ae0609bc2f673904c1b1aab
@@ -0,0 +1,16 @@
1
+ module Tint
2
+ class DecoratedAssociation < Draper::DecoratedAssociation
3
+ def decorate
4
+ association_chain = @association
5
+ association_chain = Array.wrap(association_chain) unless association_chain.kind_of?(Array)
6
+
7
+ associated = association_chain.inject(owner.object) do |memo, method_name|
8
+ memo.send(method_name)
9
+ end
10
+
11
+ associated = associated.sent(scope) if scope
12
+
13
+ @decorated = factory.decorate(associated, context_args: owner.context)
14
+ end
15
+ end
16
+ end
@@ -2,6 +2,8 @@ require 'draper'
2
2
  require 'deep_merge/rails_compat'
3
3
  require_relative 'json_conversion.rb'
4
4
 
5
+ require 'tint/decorated_association'
6
+
5
7
  module Tint
6
8
  class Decorator < Draper::Decorator
7
9
  include JsonConversion
@@ -20,23 +22,6 @@ module Tint
20
22
  object.persisted?
21
23
  end
22
24
 
23
- def decorate_as_association(association_name, association, options = {})
24
- options.assert_valid_keys(:with)
25
-
26
- association_decorator = options[:with]
27
-
28
- association_context = options.except(:with).merge(context: context.
29
- merge(parent_decorator: self, parent_association: association_name.to_sym))
30
-
31
- self.class.eager_load(association_name => {})
32
-
33
- if association.respond_to?(:each)
34
- association_decorator.decorate_collection(association, association_context)
35
- else
36
- association_decorator.decorate(association, association_context)
37
- end
38
- end
39
-
40
25
  class << self
41
26
  attr_accessor :_attributes, :parent_decorator, :parent_association
42
27
 
@@ -69,51 +54,24 @@ module Tint
69
54
  end
70
55
 
71
56
  def eager_load(*schema)
72
- new_eager_loads =
73
- schema.inject({}) do |memo, schema_item|
74
- if schema_item.kind_of?(Hash)
75
- memo = memo.merge(schema_item)
76
- else
77
- memo[schema_item] = {}
78
- end
79
-
80
- memo
81
- end
82
-
83
- self.eager_loads = self.eager_loads.deeper_merge(new_eager_loads)
57
+ self.eager_loads = self.eager_loads.deeper_merge(expand_schema(schema))
84
58
  end
85
59
 
86
- def decorates_association(association_name, options = {})
87
- options[:with] ||= (association_name.to_s.camelize.singularize + 'Decorator').constantize
60
+ def decorates_association(*args)
61
+ options = args.extract_options!
62
+ association_chain = args
88
63
 
89
- association_alias = options.delete(:as) || association_name
64
+ association_tail = association_chain.last
90
65
 
91
- options.assert_valid_keys(:with, :scope, :context)
66
+ options[:with] ||= (association_tail.to_s.camelize.singularize + 'Decorator').constantize
92
67
 
93
- define_method(association_alias) do
94
- context_with_association = context.merge({
95
- parent_decorator: self,
96
- parent_association: association_name
97
- })
68
+ association_alias = options.delete(:as) || association_tail
98
69
 
99
- decorated_associations[association_alias] ||= Draper::DecoratedAssociation.new(
100
- self,
101
- association_name,
102
- options.merge(context: context_with_association)
103
- )
104
-
105
- decorated_associations[association_alias].call
106
- end
107
-
108
- attributes(association_alias)
70
+ options.assert_valid_keys(:with, :scope, :context)
109
71
 
110
- association_eager_loads = options[:with].eager_loads
72
+ define_association_method(association_alias, association_chain, options)
111
73
 
112
- if association_eager_loads.present?
113
- eager_load({ association_name => association_eager_loads})
114
- else
115
- eager_load(association_name)
116
- end
74
+ eager_load_association(association_chain, options)
117
75
  end
118
76
 
119
77
  def decorates_associations(*arguments)
@@ -147,7 +105,7 @@ module Tint
147
105
  unless already_eager_loaded_associations?(object)
148
106
  object =
149
107
  if responds_to_methods?(object_class, :includes, :find) && eager_loads.present?
150
- object_class.includes(*eager_loads).find(object.id)
108
+ object_class.includes(eager_loads).find(object.id)
151
109
  else
152
110
  object
153
111
  end
@@ -157,7 +115,15 @@ module Tint
157
115
  end
158
116
 
159
117
  def parent_eager_loads_include_own?(context = {})
160
- !!(context && context[:parent_decorator] && context[:parent_decorator].class.eager_loads[context[:parent_association]])
118
+ if context && context[:parent_decorator]
119
+ if (parent_eager_loads = context[:parent_decorator].class.eager_loads)
120
+ context[:parent_association].inject(parent_eager_loads) do |memo, chain_link|
121
+ memo[chain_link] if memo
122
+ end
123
+ end
124
+ else
125
+ false
126
+ end
161
127
  end
162
128
 
163
129
  def already_eager_loaded_associations?(object)
@@ -201,6 +167,60 @@ module Tint
201
167
  end
202
168
  end
203
169
  end
170
+
171
+ private
172
+
173
+ def expand_schema(schema)
174
+ if schema.kind_of?(Hash)
175
+ schema.inject({}) do |memo, (schema_key, schema_value)|
176
+ memo[schema_key] = expand_schema(schema_value)
177
+ memo
178
+ end
179
+ elsif schema.kind_of?(Array)
180
+ schema.inject({}) do |memo, schema_item|
181
+ memo.merge(expand_schema(schema_item))
182
+ end
183
+ else
184
+ { schema => {} }
185
+ end
186
+ end
187
+
188
+ def define_association_method(association_alias, association_chain, options)
189
+ define_method(association_alias) do
190
+ context_with_association = context.merge({
191
+ parent_decorator: self,
192
+ parent_association: association_chain
193
+ })
194
+
195
+ decorated_associations[association_alias] ||= Tint::DecoratedAssociation.new(
196
+ self,
197
+ association_chain,
198
+ options.merge(context: context_with_association)
199
+ )
200
+
201
+ decorated_associations[association_alias].call
202
+ end
203
+
204
+ attributes(association_alias)
205
+ end
206
+
207
+ def eager_load_association(association_chain, options)
208
+ association_eager_loads = options[:with].eager_loads
209
+ schema = association_schema(association_chain, association_eager_loads)
210
+
211
+ eager_load(schema)
212
+ end
213
+
214
+ def association_schema(association_chain, eager_loads = {})
215
+ association_chain.reverse.reduce({}) do |memo, chain_link|
216
+
217
+ if chain_link == association_chain.last
218
+ { chain_link => eager_loads }
219
+ else
220
+ { chain_link => memo }
221
+ end
222
+ end
223
+ end
204
224
  end
205
225
 
206
226
  end
@@ -1,3 +1,3 @@
1
1
  module Tint
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5.pre1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleck Greenham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-13 00:00:00.000000000 Z
11
+ date: 2016-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: draper
@@ -95,6 +95,7 @@ files:
95
95
  - README.md
96
96
  - Rakefile
97
97
  - lib/tint.rb
98
+ - lib/tint/decorated_association.rb
98
99
  - lib/tint/decorator.rb
99
100
  - lib/tint/json_conversion.rb
100
101
  - lib/tint/version.rb
@@ -117,9 +118,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
117
118
  version: '0'
118
119
  required_rubygems_version: !ruby/object:Gem::Requirement
119
120
  requirements:
120
- - - ">="
121
+ - - ">"
121
122
  - !ruby/object:Gem::Version
122
- version: '0'
123
+ version: 1.3.1
123
124
  requirements: []
124
125
  rubyforge_project:
125
126
  rubygems_version: 2.2.2