hydra_attribute 0.4.0.rc1 → 0.4.0.rc2

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.
@@ -1,7 +1,9 @@
1
1
  module HydraAttribute
2
+
3
+ # @see HydraAttribute::HydraMethods::ClassMethods ClassMethods for additional documentation
2
4
  module HydraMethods
3
5
  extend ActiveSupport::Concern
4
- extend Memoize
6
+ extend Memoizable
5
7
 
6
8
  include HydraSetMethods
7
9
  include HydraAttributeMethods
@@ -12,31 +14,234 @@ module HydraAttribute
12
14
  end
13
15
 
14
16
  module ClassMethods
15
- extend Memoize
17
+ extend Memoizable
16
18
 
17
- def hydra_set_attributes(hydra_set_id)
18
- hydra_set = hydra_set(hydra_set_id)
19
+ # Finds attribute for attribute sets. Returns all attributes if attribute set is undefined.
20
+ #
21
+ # @example attribute set exists
22
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
23
+ #
24
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
25
+ # hydra_set.hydra_attributes.create(name: 'title', backend_type: 'string')
26
+ # hydra_set.hydra_attributes.create(name: 'color', backend_type: 'string')
27
+ #
28
+ # Product.hydra_set_attributes('Default')
29
+ # # [<HydraAttribute::HydraAttribute name: "title">, <HydraAttribute::HydraAttribute name: "color">]
30
+ #
31
+ # @example attribute set doesn't exist
32
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
33
+ #
34
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
35
+ # hydra_set.hydra_attributes.create(name: 'title', backend_type: 'string')
36
+ #
37
+ # Product.hydra_set_attributes('FAKE')
38
+ # # [<HydraAttribute::HydraAttribute name: "name">, <HydraAttribute::HydraAttribute name: "title">]
39
+ #
40
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
41
+ # @return [ActiveRecord::Relation] contains preloaded attribute models
42
+ def hydra_set_attributes(hydra_set_identifier)
43
+ hydra_set = hydra_set(hydra_set_identifier)
19
44
  hydra_set.nil? ? hydra_attributes : hydra_set.hydra_attributes
20
45
  end
21
46
 
22
- %w(id name backend_type).each do |prefix|
47
+ # Returns backend types for attributes which are assigned to passed attribute set.
48
+ # If attribute set doesn't exist, return all attribute backend types.
49
+ #
50
+ # @note This method is cacheable
51
+ #
52
+ # @example attribute set exists
53
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
54
+ #
55
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
56
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float')
57
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean')
58
+ #
59
+ # Product.hydra_set_attribute_backend_types('Default')
60
+ # # ["float", "boolean"]
61
+ #
62
+ # @example attribute set doesn't exist
63
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
64
+ #
65
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
66
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float')
67
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean')
68
+ #
69
+ # Product.hydra_set_attribute_backend_types('FAKE')
70
+ # # ["string", float", "boolean"]
71
+ #
72
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
73
+ # @return [Array<String>] contains unique list of attribute backend types
74
+ def hydra_set_attribute_backend_types(hydra_set_identifier)
75
+ hydra_set_attributes(hydra_set_identifier).map(&:backend_type).uniq
76
+ end
77
+ hydra_memoize :hydra_set_attribute_backend_types
78
+
79
+ # @!method hydra_set_attribute_ids(hydra_set_identifier)
80
+ # Returns ids for attributes which are assigned to passed attribute set.
81
+ # If attribute set doesn't exist, return all attribute ids.
82
+ #
83
+ # @note This method is cacheable
84
+ #
85
+ # @example attribute set exists
86
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string') # 1
87
+ #
88
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
89
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float') # 2
90
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean') # 3
91
+ #
92
+ # Product.hydra_set_attribute_ids('Default')
93
+ # # [2, 3]
94
+ #
95
+ # @example attribute set doesn't exist
96
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string') # 1
97
+ #
98
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
99
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float') # 2
100
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean') # 3
101
+ #
102
+ # Product.hydra_set_attribute_ids('FAKE')
103
+ # # [1, 2, 3]
104
+ #
105
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
106
+ # @return [Array<Fixnum>] contains unique list of attribute ids
107
+
108
+ # @!method hydra_set_attribute_names(hydra_set_identifier)
109
+ # Returns names for attributes which are assigned to passed attribute set.
110
+ # If attribute set doesn't exist, return all attribute names.
111
+ #
112
+ # @note This method is cacheable
113
+ #
114
+ # @example attribute set exists
115
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
116
+ #
117
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
118
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float')
119
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean')
120
+ #
121
+ # Product.hydra_set_attribute_names('Default')
122
+ # # ["price", "active"]
123
+ #
124
+ # @example attribute set doesn't exist
125
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
126
+ #
127
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
128
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float')
129
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean')
130
+ #
131
+ # Product.hydra_set_attribute_names('FAKE')
132
+ # # ["name", "price", "active"]
133
+ #
134
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
135
+ # @return [Array<String>] contains unique list of attribute names
136
+ %w(id name).each do |prefix|
23
137
  module_eval <<-EOS, __FILE__, __LINE__ + 1
24
- def hydra_set_attribute_#{prefix}s(hydra_set_id)
25
- hydra_set_attributes(hydra_set_id).map(&:#{prefix})
138
+ def hydra_set_attribute_#{prefix}s(hydra_set_identifier)
139
+ hydra_set_attributes(hydra_set_identifier).map(&:#{prefix})
26
140
  end
27
141
  hydra_memoize :hydra_set_attribute_#{prefix}s
28
142
  EOS
29
143
  end
30
144
 
31
- def hydra_set_attributes_by_backend_type(hydra_set_id)
32
- hydra_set_attributes(hydra_set_id).group_by(&:backend_type)
145
+ # Groups attributes for attribute set by backend type.
146
+ # If attribute set doesn't exist, group all attributes.
147
+ #
148
+ # @note This method is cacheable
149
+ #
150
+ # @example attribute set exists
151
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
152
+ #
153
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
154
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float')
155
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean')
156
+ #
157
+ # Product.hydra_set_attributes_by_backend_type('Default')
158
+ # # {
159
+ # # "float"=>[<HydraAttribute::HydraAttribute name: 'price'>],
160
+ # # "boolean"=>[<HydraAttribute::HydraAttribute name: 'active'>]
161
+ # # }
162
+ #
163
+ # @example attribute set doesn't exist
164
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
165
+ #
166
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
167
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float')
168
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean')
169
+ #
170
+ # Product.hydra_set_attributes_by_backend_type('FAKE')
171
+ # # {
172
+ # # "string"=>[<HydraAttribute::HydraAttribute name: 'name'>],
173
+ # # "float"=>[<HydraAttribute::HydraAttribute name: 'price'>],
174
+ # # "boolean"=>[<HydraAttribute::HydraAttribute name: 'active'>]
175
+ # # }
176
+ #
177
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
178
+ # @return [Hash{String => Array<HydraAttribute::HydraAttribute>}] contains grouped attributes by their backend types
179
+ def hydra_set_attributes_by_backend_type(hydra_set_identifier)
180
+ hydra_set_attributes(hydra_set_identifier).group_by(&:backend_type)
33
181
  end
34
182
  hydra_memoize :hydra_set_attributes_by_backend_type
35
183
 
184
+ # @!method hydra_set_attribute_ids_by_backend_type(hydra_set_identifier)
185
+ # Groups attribute ids for attribute set by backend type.
186
+ # If attribute set doesn't exist, group all attribute ids.
187
+ #
188
+ # @note This method is cacheable
189
+ #
190
+ # @example attribute set exists
191
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string') # 1
192
+ #
193
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
194
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float') # 2
195
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean') # 3
196
+ #
197
+ # Product.hydra_set_attribute_ids_by_backend_type('Default')
198
+ # # {"float"=>[2], "boolean"=>[3]}
199
+ #
200
+ # @example attribute set doesn't exist
201
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string') # 1
202
+ #
203
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
204
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float') # 2
205
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean') # 3
206
+ #
207
+ # Product.hydra_set_attribute_ids_by_backend_type('FAKE')
208
+ # # {"string"=>[1], "float"=>[2], "boolean"=>[3]}
209
+ #
210
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
211
+ # @return [Hash{String => Array<Fixnum>}] contains grouped attribute ids by their backend types
212
+
213
+ # @!method hydra_set_attribute_names_by_backend_type(hydra_set_identifier)
214
+ # Groups attribute names for attribute set by backend type.
215
+ # If attribute set doesn't exist, group all attribute names.
216
+ #
217
+ # @note This method is cacheable
218
+ #
219
+ # @example attribute set exists
220
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
221
+ #
222
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
223
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float')
224
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean')
225
+ #
226
+ # Product.hydra_set_attribute_names_by_backend_type('Default')
227
+ # # {"float"=>["price"], "boolean"=>["active"]}
228
+ #
229
+ # @example attribute set doesn't exist
230
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
231
+ #
232
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
233
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float')
234
+ # hydra_set.hydra_attributes.create(name: 'active', backend_type: 'boolean')
235
+ #
236
+ # Product.hydra_set_attribute_names_by_backend_type('FAKE')
237
+ # # {"string"=>["name"], "float"=>["price"], "boolean"=>["active"]}
238
+ #
239
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
240
+ # @return [Hash{String => Array<String>}] contains grouped attribute names by their backend types
36
241
  %w(id name).each do |prefix|
37
242
  module_eval <<-EOS, __FILE__, __LINE__ + 1
38
- def hydra_set_attribute_#{prefix}s_by_backend_type(hydra_set_id)
39
- hydra_set_attributes(hydra_set_id).each_with_object({}) do |hydra_attribute, object|
243
+ def hydra_set_attribute_#{prefix}s_by_backend_type(hydra_set_identifier)
244
+ hydra_set_attributes(hydra_set_identifier).each_with_object({}) do |hydra_attribute, object|
40
245
  object[hydra_attribute.backend_type] ||= []
41
246
  object[hydra_attribute.backend_type] << hydra_attribute.#{prefix}
42
247
  end
@@ -45,20 +250,141 @@ module HydraAttribute
45
250
  EOS
46
251
  end
47
252
 
48
- def hydra_set_attributes_for_backend_type(hydra_set_id, backend_type)
49
- hydra_attributes = hydra_set_attributes_by_backend_type(hydra_set_id)[backend_type]
253
+ # Returns attributes for attribute set and backend type.
254
+ # If attribute set doesn't exist, returns all attributes for backend type.
255
+ #
256
+ # @example attribute set exists
257
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
258
+ #
259
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
260
+ # hydra_sets.hydra_attributes.create(name: 'title', backend_type: 'string')
261
+ # hydra_sets.hydra_attributes.create(name: 'price', backend_type: 'float')
262
+ #
263
+ # Product.hydra_set_attributes_for_backend_type('Default', 'float')
264
+ # # [<HydraAttribute::HydraAttribute name: "price">]
265
+ #
266
+ # @example attribute set doesn't exists
267
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
268
+ #
269
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
270
+ # hydra_sets.hydra_attributes.create(name: 'title', backend_type: 'string')
271
+ # hydra_sets.hydra_attributes.create(name: 'price', backend_type: 'float')
272
+ #
273
+ # Product.hydra_set_attributes_for_backend_type('FAKE', 'string')
274
+ # # [<HydraAttribute::HydraAttribute name: "name">, <HydraAttribute::HydraAttribute name: "title">]
275
+ #
276
+ # @example attributes doesn't exist for backend type
277
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
278
+ #
279
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
280
+ # hydra_sets.hydra_attributes.create(name: 'title', backend_type: 'string')
281
+ # hydra_sets.hydra_attributes.create(name: 'price', backend_type: 'float')
282
+ #
283
+ # Product.hydra_set_attributes_for_backend_type('Default', 'boolean')
284
+ # # []
285
+ #
286
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
287
+ # @param backend_type [String] see HydraAttribute::SUPPORTED_BACKEND_TYPES
288
+ # @return [Array] contains attribute models
289
+ def hydra_set_attributes_for_backend_type(hydra_set_identifier, backend_type)
290
+ hydra_attributes = hydra_set_attributes_by_backend_type(hydra_set_identifier)[backend_type]
50
291
  hydra_attributes.nil? ? [] : hydra_attributes
51
292
  end
52
293
 
294
+ # @!method hydra_set_attribute_ids_for_backend_type(hydra_set_identifier, backend_type)
295
+ # Returns attribute ids for attribute set and backend type.
296
+ # If attribute set doesn't exist, returns all attribute ids for backend type.
297
+ #
298
+ # @example attribute set exists
299
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string') # 1
300
+ #
301
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
302
+ # hydra_sets.hydra_attributes.create(name: 'title', backend_type: 'string') # 2
303
+ # hydra_sets.hydra_attributes.create(name: 'price', backend_type: 'float') # 3
304
+ #
305
+ # Product.hydra_set_attribute_ids_for_backend_type('Default', 'float') # [2]
306
+ #
307
+ # @example attribute set doesn't exists
308
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string') # 1
309
+ #
310
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
311
+ # hydra_sets.hydra_attributes.create(name: 'title', backend_type: 'string') # 2
312
+ # hydra_sets.hydra_attributes.create(name: 'price', backend_type: 'float') # 3
313
+ #
314
+ # Product.hydra_set_attribute_ids_for_backend_type('FAKE', 'string') # [1, 2]
315
+ #
316
+ # @example attributes doesn't exist for backend type
317
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string') # 1
318
+ #
319
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
320
+ # hydra_sets.hydra_attributes.create(name: 'title', backend_type: 'string') # 2
321
+ # hydra_sets.hydra_attributes.create(name: 'price', backend_type: 'float') # 3
322
+ #
323
+ # Product.hydra_set_attribute_ids_for_backend_type('Default', 'boolean') # []
324
+ #
325
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
326
+ # @param backend_type [String] see HydraAttribute::SUPPORTED_BACKEND_TYPES
327
+ # @return [Array<Fixnum>] contains attribute ids
328
+
329
+ # @!method hydra_set_attribute_names_for_backend_type(hydra_set_identifier, backend_type)
330
+ # Returns attribute names for attribute set and backend type.
331
+ # If attribute set doesn't exist, returns all attribute names for backend type.
332
+ #
333
+ # @example attribute set exists
334
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
335
+ #
336
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
337
+ # hydra_sets.hydra_attributes.create(name: 'title', backend_type: 'string')
338
+ # hydra_sets.hydra_attributes.create(name: 'price', backend_type: 'float')
339
+ #
340
+ # Product.hydra_set_attribute_names_for_backend_type('Default', 'float') # ["price"]
341
+ #
342
+ # @example attribute set doesn't exists
343
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
344
+ #
345
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
346
+ # hydra_sets.hydra_attributes.create(name: 'title', backend_type: 'string')
347
+ # hydra_sets.hydra_attributes.create(name: 'price', backend_type: 'float')
348
+ #
349
+ # Product.hydra_set_attribute_names_for_backend_type('FAKE', 'string') # ["name", "title"]
350
+ #
351
+ # @example attributes doesn't exist for backend type
352
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
353
+ #
354
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
355
+ # hydra_sets.hydra_attributes.create(name: 'title', backend_type: 'string')
356
+ # hydra_sets.hydra_attributes.create(name: 'price', backend_type: 'float')
357
+ #
358
+ # Product.hydra_set_attribute_names_for_backend_type('Default', 'boolean') # []
359
+ #
360
+ # @param hydra_set_identifier [Fixnum, String] id or name of attribute set
361
+ # @param backend_type [String] see HydraAttribute::SUPPORTED_BACKEND_TYPES
362
+ # @return [Array<String>] contains attribute names
53
363
  %w(id name).each do |prefix|
54
364
  module_eval <<-EOS, __FILE__, __LINE__ + 1
55
- def hydra_set_attribute_#{prefix}s_for_backend_type(hydra_set_id, backend_type)
56
- values = hydra_set_attribute_#{prefix}s_by_backend_type(hydra_set_id)[backend_type]
365
+ def hydra_set_attribute_#{prefix}s_for_backend_type(hydra_set_identifier, backend_type)
366
+ values = hydra_set_attribute_#{prefix}s_by_backend_type(hydra_set_identifier)[backend_type]
57
367
  values.nil? ? [] : values
58
368
  end
59
369
  EOS
60
370
  end
61
371
 
372
+ # Clear cache for the following methods:
373
+ # * hydra_set_attributes(hydra_set_identifier)
374
+ # * hydra_set_attribute_ids(hydra_set_identifier)
375
+ # * hydra_set_attribute_names(hydra_set_identifier)
376
+ # * hydra_set_attribute_backend_types(hydra_set_identifier)
377
+ # * hydra_set_attributes_by_backend_type(hydra_set_identifier)
378
+ # * hydra_set_attribute_ids_by_backend_type(hydra_set_identifier)
379
+ # * hydra_set_attribute_names_by_backend_type(hydra_set_identifier)
380
+ #
381
+ # Also calls the following methods:
382
+ # * clear_hydra_set_cache!
383
+ # * clear_hydra_attribute_cache!
384
+ # * clear_hydra_value_cache!
385
+ #
386
+ # @note This method should not be called manually. It used for hydra_attribute gem engine.
387
+ # @return [NilClass]
62
388
  def clear_hydra_method_cache!
63
389
  clear_hydra_set_cache!
64
390
  clear_hydra_attribute_cache!
@@ -78,6 +404,22 @@ module HydraAttribute
78
404
  end
79
405
  end
80
406
 
407
+ # Returns hash with attribute names and values based on attribute set.
408
+ #
409
+ # @example
410
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
411
+ #
412
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
413
+ # hydra_set.hydra_attributes.create(name: 'title', backend_type: 'string')
414
+ # hydra_set.hydra_attributes.create(name: 'color', backend_type: 'string')
415
+ #
416
+ # product = Product.new
417
+ # product.hydra_attributes # {"name"=>nil, "title"=>nil, "color"=>nil}
418
+ #
419
+ # product.hydra_set_id = hydra_set.id
420
+ # product.hydra_attributes # {"title"=>nil, "color"=>nil}
421
+ #
422
+ # @return [Hash] contains attribute names and values
81
423
  def hydra_attributes
82
424
  hydra_value_models.inject({}) do |hydra_attributes, model|
83
425
  hydra_attributes[model.hydra_attribute_name] = model.value
@@ -85,6 +427,59 @@ module HydraAttribute
85
427
  end
86
428
  end
87
429
 
430
+ # @!method hydra_attribute_ids
431
+ # Returns attribute ids
432
+ #
433
+ # @example
434
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string') # 1
435
+ #
436
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
437
+ # hydra_set.hydra_attributes.create(name: 'title', backend_type: 'string') # 2
438
+ # hydra_set.hydra_attributes.create(name: 'color', backend_type: 'string') # 3
439
+ #
440
+ # product = Product.new
441
+ # product.hydra_attribute_ids # [1, 2, 3]
442
+ #
443
+ # product.hydra_set_id = hydra_set.id
444
+ # product.hydra_attribute_ids # [2, 3]
445
+ #
446
+ # @return [Array] contains attribute ids
447
+
448
+ # @!method hydra_attribute_names
449
+ # Returns attribute names
450
+ #
451
+ # @example
452
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
453
+ #
454
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
455
+ # hydra_set.hydra_attributes.create(name: 'title', backend_type: 'string')
456
+ # hydra_set.hydra_attributes.create(name: 'color', backend_type: 'string')
457
+ #
458
+ # product = Product.new
459
+ # product.hydra_attribute_names # ["name", "title", "color"]
460
+ #
461
+ # product.hydra_set_id = hydra_set.id
462
+ # product.hydra_attribute_names # ["title", "color"]
463
+ #
464
+ # @return [Array] contains attribute names
465
+
466
+ # @!method hydra_attribute_backend_types
467
+ # Returns attribute backend types
468
+ #
469
+ # @example
470
+ # Product.hydra_attributes.create(name: 'name', backend_type: 'string')
471
+ #
472
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
473
+ # hydra_set.hydra_attributes.create(name: 'price', backend_type: 'float')
474
+ # hydra_set.hydra_attributes.create(name: 'total', backend_type: 'integer')
475
+ #
476
+ # product = Product.new
477
+ # product.hydra_attribute_backend_types # ["string", "float", "integer"]
478
+ #
479
+ # product.hydra_set_id = hydra_set.id
480
+ # product.hydra_attribute_backend_types # ["float", "integer"]
481
+ #
482
+ # @return [Array] contains attribute backend types
88
483
  %w(ids names backend_types).each do |prefix|
89
484
  module_eval <<-EOS, __FILE__, __LINE__ + 1
90
485
  def hydra_attribute_#{prefix}
@@ -93,6 +488,11 @@ module HydraAttribute
93
488
  EOS
94
489
  end
95
490
 
491
+ # Finds attribute representation as a model by identifier
492
+ #
493
+ # @note This method is cacheable
494
+ # @param identifier [Fixnum, String] id or name of attribute
495
+ # @return [ActiveRecord::Base]
96
496
  def hydra_value_model(identifier)
97
497
  hydra_attribute = self.class.hydra_attribute(identifier)
98
498
  if hydra_attribute
@@ -102,6 +502,10 @@ module HydraAttribute
102
502
  end
103
503
  hydra_memoize :hydra_value_model
104
504
 
505
+ # Returns all attributes as models
506
+ #
507
+ # @note This method is cacheable
508
+ # @return [Array] contains values models
105
509
  def hydra_value_models
106
510
  self.class.hydra_set_attribute_backend_types(hydra_set_id).inject([]) do |models, backend_type|
107
511
  models + hydra_value_association(backend_type).all_models
@@ -110,6 +514,7 @@ module HydraAttribute
110
514
  hydra_memoize :hydra_value_models
111
515
 
112
516
  private
517
+ # Resets locked attributes after setting new hydra_set_id
113
518
  def write_attribute_with_hydra_set_id(attr_name, value)
114
519
  if attr_name.to_s == 'hydra_set_id'
115
520
  self.class.hydra_attribute_backend_types.each do |backend_type|
@@ -1,18 +1,47 @@
1
1
  module HydraAttribute
2
+ # This error is raised when called method for attribute which doesn't exist in current hydra set
3
+ #
4
+ # @example
5
+ # Product.hydra_attributes.create(name: 'price', backend_type: 'float')
6
+ # Product.hydra_attributes.create(name: 'title', backend_type: 'string')
7
+ #
8
+ # hydra_set = Product.hydra_sets.create(name: 'Default')
9
+ # hydra_set.hydra_attributes = [Product.hydra_attribute('title')]
10
+ #
11
+ # product = Product.new(hydra_set_id: hydra_set.id)
12
+ # product.title = 'Toy' # ok
13
+ # product.price = 2.50 # raise HydraAttribute::MissingAttributeInHydraSetError
2
14
  class MissingAttributeInHydraSetError < NoMethodError
3
15
  end
4
16
 
17
+ # @see HydraAttribute::HydraSetMethods::ClassMethods ClassMethods for documentation
5
18
  module HydraSetMethods
6
19
  extend ActiveSupport::Concern
7
20
 
8
21
  module ClassMethods
9
- extend Memoize
22
+ extend Memoizable
10
23
 
24
+ # Returns attribute sets for current entity.
25
+ #
26
+ # @note This method is cacheable, therefore just one request to database is used
27
+ # @example
28
+ # Product.hydra_sets # [<HydraAttribute::HydraSet>, ...]
29
+ # Product.hydra_sets.create(name: 'Default') # create attribute set
30
+ # Product.hydra_sets.each(&:destroy) # remove all attribute sets
31
+ # @return [ActiveRecord::Relation] contains preloaded attribute sets
11
32
  def hydra_sets
12
33
  HydraSet.where(entity_type: base_class.model_name)
13
34
  end
14
35
  hydra_memoize :hydra_sets
15
36
 
37
+ # Finds attribute set by name or id
38
+ #
39
+ # @note This method is cacheable, therefore it's better to use it instead of manually searching.
40
+ # @example
41
+ # Product.hydra_set(10) # or
42
+ # Product.hydra_set('Default')
43
+ # @param identifier [Fixnum, String] id or name of attribute set
44
+ # @return [HydraAttribute::HydraSet, NilClass] attribute set model or +nil+
16
45
  def hydra_set(identifier)
17
46
  hydra_sets.find do |hydra_set|
18
47
  hydra_set.id == identifier || hydra_set.name == identifier
@@ -20,6 +49,25 @@ module HydraAttribute
20
49
  end
21
50
  hydra_memoize :hydra_set
22
51
 
52
+ # @!method hydra_set_ids
53
+ # Returns all attribute set ids
54
+ #
55
+ # @note This method is cacheable.
56
+ # @example
57
+ # Product.hydra_sets.create(name: 'First') # 1
58
+ # Product.hydra_sets.create(name: 'Second') # 2
59
+ # Product.hydra_set_ids # [1, 2]
60
+ # @return [Array<Fixnum>] contains attribute set ids
61
+
62
+ # @!method hydra_set_names
63
+ # Returns all attribute set names
64
+ #
65
+ # @note This method is cacheable.
66
+ # @example
67
+ # Product.hydra_sets.create(name: 'First') # 1
68
+ # Product.hydra_sets.create(name: 'Second') # 2
69
+ # Product.hydra_set_names # ["First", "Second"]
70
+ # @return [Array<Fixnum>] contains attribute set names
23
71
  %w(id name).each do |prefix|
24
72
  module_eval <<-EOS, __FILE__, __LINE__ + 1
25
73
  def hydra_set_#{prefix}s
@@ -29,6 +77,14 @@ module HydraAttribute
29
77
  EOS
30
78
  end
31
79
 
80
+ # Clear cache for the following methods:
81
+ # * hydra_sets
82
+ # * hydra_set(identifier)
83
+ # * hydra_set_ids
84
+ # * hydra_set_names
85
+ #
86
+ # @note This method should not be called manually. It used for hydra_attribute gem engine.
87
+ # @return [NilClass]
32
88
  def clear_hydra_set_cache!
33
89
  [:@hydra_sets, :@hydra_set, :@hydra_set_ids, :@hydra_set_names].each do |variable|
34
90
  remove_instance_variable(variable) if instance_variable_defined?(variable)
@@ -3,10 +3,17 @@ module HydraAttribute
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  module ClassMethods
6
+ # Clear cache
7
+ #
8
+ # @return [NilClass]
6
9
  def clear_hydra_value_cache!
7
10
  end
8
11
  end
9
12
 
13
+ # Returns the association instance for the given backend type attribute name
14
+ #
15
+ # @param backend_type [String] one of the HydraAttribute::SUPPORTED_BACKEND_TYPES values
16
+ # @return [ActiveRecord::Associations::Association]
10
17
  def hydra_value_association(backend_type)
11
18
  association(::HydraAttribute::AssociationBuilder.association_name(backend_type))
12
19
  end
@@ -1,5 +1,5 @@
1
1
  module HydraAttribute
2
- module Memoize
2
+ module Memoizable
3
3
  def hydra_memoize(*methods)
4
4
  methods.each do |method_name|
5
5
  bound_method = instance_method(method_name)
@@ -1,3 +1,3 @@
1
1
  module HydraAttribute
2
- VERSION = '0.4.0.rc1'
2
+ VERSION = '0.4.0.rc2'
3
3
  end
@@ -18,7 +18,7 @@ require 'hydra_attribute/configuration'
18
18
  require 'hydra_attribute/association_builder'
19
19
  require 'hydra_attribute/builder'
20
20
  require 'hydra_attribute/migrator'
21
- require 'hydra_attribute/memoize'
21
+ require 'hydra_attribute/memoizable'
22
22
  require 'hydra_attribute/hydra_attribute'
23
23
  require 'hydra_attribute/hydra_set'
24
24
  require 'hydra_attribute/entity_callbacks'
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe HydraAttribute::ActiveRecord::AttributeMethods do
4
+ describe '::ClassMethods' do
5
+ describe '#define_hydra_attribute_method' do
6
+ it 'should throw MissingAttributeInHydraSetError if we call generated hydra attribute method which does not exist in hydra set' do
7
+ Product.hydra_attributes.create(name: 'color', backend_type: 'string')
8
+ hydra_set = Product.hydra_sets.create(name: 'Default')
9
+ product = Product.new(hydra_set_id: hydra_set.id)
10
+
11
+ lambda do
12
+ product.color
13
+ end.should raise_error(HydraAttribute::MissingAttributeInHydraSetError, %(Hydra attribute "color" does not exist in hydra set "Default"))
14
+ end
15
+ end
16
+ end
17
+ end