hydra_attribute 0.4.0.rc1 → 0.4.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +65 -35
- data/features/entity/create.feature +17 -0
- data/features/relation/query_methods/where.feature +46 -1
- data/features/step_definitions/model_steps.rb +13 -0
- data/gemfiles/3.1.gemfile.lock +13 -13
- data/gemfiles/3.2.gemfile.lock +13 -13
- data/lib/hydra_attribute/active_record/attribute_methods.rb +4 -5
- data/lib/hydra_attribute/active_record/relation/query_methods.rb +7 -1
- data/lib/hydra_attribute/builder.rb +3 -3
- data/lib/hydra_attribute/hydra_attribute.rb +4 -4
- data/lib/hydra_attribute/hydra_attribute_methods.rb +146 -5
- data/lib/hydra_attribute/hydra_methods.rb +420 -15
- data/lib/hydra_attribute/hydra_set_methods.rb +57 -1
- data/lib/hydra_attribute/hydra_value_methods.rb +7 -0
- data/lib/hydra_attribute/{memoize.rb → memoizable.rb} +1 -1
- data/lib/hydra_attribute/version.rb +1 -1
- data/lib/hydra_attribute.rb +1 -1
- data/spec/hydra_attribute/active_record/attribute_methods_spec.rb +17 -0
- data/spec/{hydra_attribute_methods_spec.rb → hydra_attribute/hydra_attribute_methods_spec.rb} +0 -0
- data/spec/{hydra_attribute_spec.rb → hydra_attribute/hydra_attribute_spec.rb} +0 -0
- data/spec/{hydra_methods_spec.rb → hydra_attribute/hydra_methods_spec.rb} +22 -23
- data/spec/{hydra_set_methods_spec.rb → hydra_attribute/hydra_set_methods_spec.rb} +0 -0
- data/spec/{hydra_set_spec.rb → hydra_attribute/hydra_set_spec.rb} +0 -0
- data/spec/{memoize_spec.rb → hydra_attribute/memoizable_spec.rb} +2 -2
- metadata +67 -30
@@ -1,15 +1,41 @@
|
|
1
1
|
module HydraAttribute
|
2
|
+
|
3
|
+
# @see HydraAttribute::HydraAttributeMethods::ClassMethods ClassMethods for documentation.
|
2
4
|
module HydraAttributeMethods
|
3
5
|
extend ActiveSupport::Concern
|
4
6
|
|
5
7
|
module ClassMethods
|
6
|
-
extend
|
8
|
+
extend Memoizable
|
7
9
|
|
10
|
+
# Returns prepared +ActiveRecord::Relation+ object with preloaded attributes for current entity.
|
11
|
+
#
|
12
|
+
# @note This method is cacheable, so just one request per entity will be sent to the database.
|
13
|
+
# @example
|
14
|
+
# Product.hydra_attributes # ActiveRecord::Relation
|
15
|
+
# Product.hydra_attributes.map(&:name) # ["title", "color", ...]
|
16
|
+
# Product.hydra_attributes.create(name: 'title', backend_type: 'string') # Create and return new attribute
|
17
|
+
# Product.hydra_attributes.each(&:destroy) # Remove all attributes
|
18
|
+
# @return [ActiveRecord::Relation] contains attributes for current entity
|
8
19
|
def hydra_attributes
|
9
20
|
HydraAttribute.where(entity_type: base_class.model_name)
|
10
21
|
end
|
11
22
|
hydra_memoize :hydra_attributes
|
12
23
|
|
24
|
+
# Finds <tt>HydraAttribute::HydraAttribute</tt> model by +id+ or +name+. Returns +nil+ for unknown attribute.
|
25
|
+
#
|
26
|
+
# @note This method is cacheable per +identifier+. It's better to use it instead of manually searching from <tt>hydra_attributes</tt> collection.
|
27
|
+
# @example
|
28
|
+
# Product.hydra_attribute('name') # HydraAttribute::HydraAttribute
|
29
|
+
# Product.hydra_attribute('name') # Returns HydraAttribute::HydraAttribute from cache
|
30
|
+
# Product.hydra_attribute(10) # HydraAttribute::HydraAttribute
|
31
|
+
# Product.hydra_attribute('FAKE') # nil
|
32
|
+
#
|
33
|
+
# # It's better to use this method
|
34
|
+
# Product.hydra_attribute('name')
|
35
|
+
# # instead of manually searching
|
36
|
+
# Product.hydra_attributes.detect { |attr| attr.name == 'name' || attr.id == 'id' }
|
37
|
+
# @param identifier [String, Integer] accepts attribute name or id
|
38
|
+
# @return [HydraAttribute::HydraAttribute, NilClass] attribute model or nil if wasn't found
|
13
39
|
def hydra_attribute(identifier)
|
14
40
|
hydra_attributes.find do |hydra_attribute|
|
15
41
|
hydra_attribute.id == identifier || hydra_attribute.name == identifier
|
@@ -17,11 +43,45 @@ module HydraAttribute
|
|
17
43
|
end
|
18
44
|
hydra_memoize :hydra_attribute
|
19
45
|
|
46
|
+
# Returns unique array of attribute backend types.
|
47
|
+
#
|
48
|
+
# @note This method is cacheable therefore, the definition of values is carried out only once.
|
49
|
+
# @example
|
50
|
+
# Product.hydra_attributes.create(name: 'one', backend_type: 'string')
|
51
|
+
# Product.hydra_attributes.create(name: 'two', backend_type: 'string')
|
52
|
+
# Product.hydra_attributes.create(name: 'three', backend_type: 'integer')
|
53
|
+
#
|
54
|
+
# Product.hydra_attribute_backend_types # ["string", "integer"]
|
55
|
+
# @return [Array<String>}] contains backend types
|
20
56
|
def hydra_attribute_backend_types
|
21
57
|
hydra_attributes.map(&:backend_type).uniq
|
22
58
|
end
|
23
59
|
hydra_memoize :hydra_attribute_backend_types
|
24
60
|
|
61
|
+
# @!method hydra_attribute_ids
|
62
|
+
# Returns array of attribute ids.
|
63
|
+
#
|
64
|
+
# @note This method is cacheable therefore, the definition of values is carried out only once.
|
65
|
+
# @example
|
66
|
+
# Product.hydra_attributes.create(name: 'one', backend_type: 'string') # 1
|
67
|
+
# Product.hydra_attributes.create(name: 'two', backend_type: 'string') # 2
|
68
|
+
# Product.hydra_attributes.create(name: 'three', backend_type: 'integer') # 3
|
69
|
+
#
|
70
|
+
# Product.hydra_attribute_ids # [1, 2, 3]
|
71
|
+
# @return [Array<Fixnum>] contains attribute ids
|
72
|
+
|
73
|
+
##
|
74
|
+
# @!method hydra_attribute_names
|
75
|
+
# Returns array of attribute names.
|
76
|
+
#
|
77
|
+
# @note This method is cacheable therefore, the definition of values is carried out only once.
|
78
|
+
# @example
|
79
|
+
# Product.hydra_attributes.create(name: 'one', backend_type: 'string')
|
80
|
+
# Product.hydra_attributes.create(name: 'two', backend_type: 'string')
|
81
|
+
# Product.hydra_attributes.create(name: 'three', backend_type: 'integer')
|
82
|
+
#
|
83
|
+
# Product.hydra_attribute_names # ["one", "two", "three"]
|
84
|
+
# @return [Array<String>] contains attribute names
|
25
85
|
%w(id name).each do |prefix|
|
26
86
|
module_eval <<-EOS, __FILE__, __LINE__ + 1
|
27
87
|
def hydra_attribute_#{prefix}s
|
@@ -31,11 +91,43 @@ module HydraAttribute
|
|
31
91
|
EOS
|
32
92
|
end
|
33
93
|
|
94
|
+
# Groups current attributes by backend type.
|
95
|
+
#
|
96
|
+
# @note This method is cacheable therefore, the group operation is carried out only once.
|
97
|
+
# @example
|
98
|
+
# Product.hydra_attributes_by_backend_type
|
99
|
+
# # {"string" => [...], "integer" => [...]}
|
100
|
+
# @return [Hash{String => Array<HydraAttribute::HydraAttribute>}] contains grouped attribute models by backend type
|
34
101
|
def hydra_attributes_by_backend_type
|
35
102
|
hydra_attributes.group_by(&:backend_type)
|
36
103
|
end
|
37
104
|
hydra_memoize :hydra_attributes_by_backend_type
|
38
105
|
|
106
|
+
# @!method hydra_attribute_ids_by_backend_type
|
107
|
+
# Group attribute ids by backend type.
|
108
|
+
#
|
109
|
+
# @note This method is cacheable therefore, the group operation is carried out only once.
|
110
|
+
# @example
|
111
|
+
# Product.hydra_attributes.create(name: 'one', backend_type: 'string') # 1
|
112
|
+
# Product.hydra_attributes.create(name: 'two', backend_type: 'string') # 2
|
113
|
+
# Product.hydra_attributes.create(name: 'three', backend_type: 'integer') # 3
|
114
|
+
#
|
115
|
+
# Product.hydra_attribute_ids_by_backend_type
|
116
|
+
# # {"string" => [1, 2], "integer" => [3]}
|
117
|
+
# @return [Hash{String => Array<Fixnum>}] contains grouped attribute ids by backend type
|
118
|
+
|
119
|
+
# @!method hydra_attribute_names_by_backend_type
|
120
|
+
# Group attribute names by backend type.
|
121
|
+
#
|
122
|
+
# @note This method is cacheable therefore, the group operation is carried out only once.
|
123
|
+
# @example
|
124
|
+
# Product.hydra_attributes.create(name: 'one', backend_type: 'string')
|
125
|
+
# Product.hydra_attributes.create(name: 'two', backend_type: 'string')
|
126
|
+
# Product.hydra_attributes.create(name: 'three', backend_type: 'integer')
|
127
|
+
#
|
128
|
+
# Product.hydra_attribute_names_by_backend_type
|
129
|
+
# # {"string" => ["one", "two"], "integer" => ["three"]}
|
130
|
+
# @return [Hash{String => Array<String>}] contains grouped attribute names by backend type
|
39
131
|
%w(id name).each do |prefix|
|
40
132
|
module_eval <<-EOS, __FILE__, __LINE__ + 1
|
41
133
|
def hydra_attribute_#{prefix}s_by_backend_type
|
@@ -48,11 +140,52 @@ module HydraAttribute
|
|
48
140
|
EOS
|
49
141
|
end
|
50
142
|
|
143
|
+
# Returns array of attributes for passed backend type.
|
144
|
+
#
|
145
|
+
# @note If no attributes, returns blank array.
|
146
|
+
# @example
|
147
|
+
# Product.hydra_attributes.create(name: 'one', backend_type: 'string')
|
148
|
+
# Product.hydra_attributes.create(name: 'two', backend_type: 'string')
|
149
|
+
# Product.hydra_attributes.create(name: 'three', backend_type: 'integer')
|
150
|
+
#
|
151
|
+
# Product.hydra_attributes_for_backend_type('string')
|
152
|
+
# # [<HydraAttribute::HydraAttribute id: 1, name: "one", ...>, <HydraAttribute::HydraAttribute id: 2, name: "two", ...>]
|
153
|
+
#
|
154
|
+
# Product.hydra_attributes_for_backend_type('float') # []
|
155
|
+
# @param backend_type [String] backend type of attributes
|
156
|
+
# @return [Array<HydraAttribute::HydraAttribute>] contains attribute models for passed backend type
|
51
157
|
def hydra_attributes_for_backend_type(backend_type)
|
52
158
|
hydra_attributes = hydra_attributes_by_backend_type[backend_type]
|
53
159
|
hydra_attributes.nil? ? [] : hydra_attributes
|
54
160
|
end
|
55
161
|
|
162
|
+
# @!method hydra_attribute_ids_for_backend_type(backend_type)
|
163
|
+
# Returns array of attribute ids for passed backend type.
|
164
|
+
#
|
165
|
+
# @note If no attributes, returns blank array.
|
166
|
+
# @example
|
167
|
+
# Product.hydra_attributes.create(name: 'one', backend_type: 'string') # 1
|
168
|
+
# Product.hydra_attributes.create(name: 'two', backend_type: 'string') # 2
|
169
|
+
# Product.hydra_attributes.create(name: 'three', backend_type: 'integer') # 3
|
170
|
+
#
|
171
|
+
# Product.hydra_attributes_for_backend_type('string') # [1, 2]
|
172
|
+
# Product.hydra_attributes_for_backend_type('float') # []
|
173
|
+
# @param backend_type [String] backend type of attributes
|
174
|
+
# @return [Array<Fixnum>] contains attribute ids for passed backend type
|
175
|
+
|
176
|
+
# @!method hydra_attribute_names_for_backend_type(backend_type)
|
177
|
+
# Returns array of attribute names for passed backend type.
|
178
|
+
#
|
179
|
+
# @note If no attributes, returns blank array.
|
180
|
+
# @example
|
181
|
+
# Product.hydra_attributes.create(name: 'one', backend_type: 'string')
|
182
|
+
# Product.hydra_attributes.create(name: 'two', backend_type: 'string')
|
183
|
+
# Product.hydra_attributes.create(name: 'three', backend_type: 'integer')
|
184
|
+
#
|
185
|
+
# Product.hydra_attributes_for_backend_type('string') # ["one", "two"]
|
186
|
+
# Product.hydra_attributes_for_backend_type('float') # []
|
187
|
+
# @param backend_type [String] backend type of attributes
|
188
|
+
# @return [Array<HydraAttribute::HydraAttribute>] contains attribute models for passed backend type
|
56
189
|
%w(id name).each do |prefix|
|
57
190
|
module_eval <<-EOS, __FILE__, __LINE__ + 1
|
58
191
|
def hydra_attribute_#{prefix}s_for_backend_type(backend_type)
|
@@ -62,6 +195,18 @@ module HydraAttribute
|
|
62
195
|
EOS
|
63
196
|
end
|
64
197
|
|
198
|
+
# Clear cache for the following methods:
|
199
|
+
# * hydra_attributes
|
200
|
+
# * hydra_attribute(identifier)
|
201
|
+
# * hydra_attribute_ids
|
202
|
+
# * hydra_attribute_names
|
203
|
+
# * hydra_attribute_backend_types
|
204
|
+
# * hydra_attributes_by_backend_type
|
205
|
+
# * hydra_attribute_ids_by_backend_type
|
206
|
+
# * hydra_attribute_names_by_backend_type
|
207
|
+
#
|
208
|
+
# @note This method should not be called manually. It used for hydra_attribute gem engine.
|
209
|
+
# @return [NilClass]
|
65
210
|
def clear_hydra_attribute_cache!
|
66
211
|
[
|
67
212
|
:@hydra_attributes,
|
@@ -77,9 +222,5 @@ module HydraAttribute
|
|
77
222
|
end
|
78
223
|
end
|
79
224
|
end
|
80
|
-
|
81
|
-
def hydra_attribute?(name)
|
82
|
-
self.class.hydra_attribute_names.include?(name.to_s)
|
83
|
-
end
|
84
225
|
end
|
85
226
|
end
|