model_subsets 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
File without changes
data/Gemfile CHANGED
File without changes
data/LICENSE CHANGED
File without changes
data/README.md CHANGED
File without changes
data/Rakefile CHANGED
File without changes
@@ -1,3 +1,3 @@
1
- module ModelSubsets
2
- VERSION = "0.0.5"
3
- end
1
+ module ModelSubsets
2
+ VERSION = "0.0.6"
3
+ end
data/lib/model_subsets.rb CHANGED
@@ -1,260 +1,265 @@
1
- require "model_subsets/version"
2
-
3
- module ModelSubsets
4
-
5
- extend ActiveSupport::Concern
6
-
7
- # Return current subset fieldsets list
8
- #
9
- # @return [ Array ]
10
- #
11
- # @since 0.0.2
12
- def fieldsets
13
- subset_content[:fieldsets] if valid_subset?
14
- end
15
-
16
- # Whether subset includes a fieldset
17
- #
18
- # @example Check if a user has fieldset :common
19
- # user.has_fieldset? :common
20
- #
21
- # @param [ Symbol ] name The fieldset name
22
- #
23
- # @return [ Boolean ]
24
- #
25
- # @since 0.0.2
26
- def has_fieldset? name
27
- fieldsets.include?(name) if valid_subset?
28
- end
29
-
30
- # Whether subset is included in a subsets scope
31
- #
32
- # @example Check if current subset is in :users subsets scope
33
- # person.in_subset_scope? :users
34
- #
35
- # @param [ Symbol ] name The subsets scope name
36
- #
37
- # @return [ Boolean ]
38
- #
39
- # @since 0.0.4
40
- def in_subsets_scope? name
41
- self.class.subsets_scope(name).include? subset.to_sym
42
- end
43
-
44
- # Returns current subset content
45
- # An empty Hash is returned if subset is not defined
46
- #
47
- # @return [ Hash ]
48
- #
49
- # @since 0.0.2
50
- def subset_content
51
- self.class.subsets[subset.to_sym] if valid_subset?
52
- end
53
-
54
- # Whether a subset fieldset includes a field
55
- # It only checks if the field is included in current subset fieldsets, not if the field is a column in the model
56
- #
57
- # @example Check if a user uses field :name
58
- # user.has_field? :name
59
- #
60
- # @param [ Symbol ] name The field name
61
- #
62
- # @return [ Boolean ]
63
- #
64
- # @since 0.0.2
65
- def subset_field? name
66
- subset_fields.include?(name) if subset_fields
67
- end
68
-
69
- # Return current subset fields list
70
- #
71
- # @return [ Array ]
72
- #
73
- # @since 0.0.2
74
- def subset_fields
75
- self.class.subset_fields(subset.to_sym) if valid_subset?
76
- end
77
-
78
- # Whether current subset id is defined
79
- #
80
- # @example Use valid_subset? as a model validation
81
- # validate :valid_subset?
82
- #
83
- # @return [ Boolean ]
84
- #
85
- # @since 0.0.2
86
- def valid_subset?
87
- return true if self.class.subsets.keys.include?(subset.to_s.to_sym)
88
- errors.add(:subset, :invalid) if respond_to?(:errors)
89
- false
90
- end
91
-
92
- module ClassMethods
93
-
94
- # Defines a fieldset
95
- #
96
- # @example Define fieldset :login including fields :username and :password
97
- # fieldset :login, :username, :password
98
- #
99
- # @param [ Symbol ] name The fieldset name
100
- # @param [ Array ] *args Fields names
101
- #
102
- # @since 0.0.2
103
- def fieldset name, *args
104
- @fieldsets ||= {}
105
- @fieldsets[name] = args
106
- end
107
-
108
- # Defines a subset
109
- # If no fieldset is included, all defined fieldsets will be included by default
110
- # If fieldsets are defined on an extended subset, parents fieldsets will be ignored
111
- #
112
- # @example Define subset :user, which is a person able to login
113
- # subset :user, extends: :person, with: :login, scopes: :users
114
- #
115
- # @param [ Symbol ] name The subset name
116
- # @param [ Hash ] options The options to pass to the subset
117
- #
118
- # @option options [ Boolean ] :template Whether subset is a template (only used as an extend)
119
- # @option options [ Symbol ] :group Subset group name
120
- # @option options [ Symbol, Array ] :fieldsets Explicit fieldsets list. Overrides default list (all or herited)
121
- # @option options [ Symbol, Array ] :scopes The scopes in which subset will be included
122
- # @option options [ Symbol, Array ] :extends Parent subsets
123
- # @option options [ Symbol, Array ] :with Fieldsets to be added to herited fieldsets
124
- # @option options [ Symbol, Array ] :only Filters fieldsets to remove fielsets not being in this list
125
- # @option options [ Symbol, Array ] :except Filters fieldsets to remove fieldsets being in this list
126
- #
127
- # @since 0.0.2
128
- def subset name, options = {}
129
- @subsets ||= {}
130
- @subsets_scopes ||= {}
131
-
132
- options[:fieldsets] = [options[:fieldsets]] unless options[:fieldsets].blank? || options[:fieldsets].is_a?(Array)
133
-
134
- # Subset is an extension
135
- if options[:extends]
136
-
137
- # Force extends option to Array
138
- options[:extends] = [options[:extends]] unless options[:extends].is_a?(Array)
139
- options[:extends].each do |source_subset|
140
- next unless @subsets.has_key? source_subset
141
- source_options = @subsets[source_subset].clone
142
- source_options.delete :template
143
- options = source_options.merge options
144
- end
145
-
146
- # Handle additional fieldsets list
147
- if options[:with]
148
- options[:with] = [options[:with]] unless options[:with].is_a?(Array)
149
- options[:fieldsets] |= options[:with]
150
- end
151
-
152
- # Include all fieldsets by default
153
- elsif options[:fieldsets].blank?
154
- options[:fieldsets] = @fieldsets.keys
155
- end
156
-
157
- # Handle inclusion list
158
- if options[:only]
159
- options[:only] = [options[:only]] unless options[:only].is_a?(Array)
160
- options[:fieldsets] &= options[:only]
161
- end
162
-
163
- # Handle exclusion list
164
- if options[:except]
165
- options[:except] = [options[:except]] unless options[:except].is_a?(Array)
166
- options[:fieldsets] -= options[:except]
167
- end
168
-
169
- # Handle scopes
170
- options[:scopes] ||= []
171
- options[:scopes] = [options[:scopes]] unless options[:scopes].is_a?(Array)
172
- options[:scopes].each do |subset_scope|
173
- @subsets_scopes[subset_scope] ||= []
174
- @subsets_scopes[subset_scope] << name unless options[:template]
175
- scope subset_scope, where(:subset.in => @subsets_scopes[subset_scope])
176
- end
177
-
178
- # Cleanup
179
- options[:fieldsets] = options[:fieldsets].uniq & @fieldsets.keys
180
- remove_options = [:extends, :with, :only, :except]
181
- options = options.clone
182
- options.delete_if{ |key, value| remove_options.include?(key) }
183
-
184
- # Register subset
185
- @subsets[name] = options
186
- end
187
-
188
- # Return subset fields list
189
- #
190
- # @example Get fields included in subset :user of model Person
191
- # Person.subset_fields :user
192
- # => [ :name, :givenname, :username, :password ]
193
- #
194
- # @params [ Symbol ] name The subset name
195
- #
196
- # @returns [ Array ]
197
- #
198
- # @since 0.0.1
199
- def subset_fields name
200
- return unless subsets.has_key?(name) && subsets[name].has_key?(:fieldsets)
201
- subset_fields = []
202
- subsets[name][:fieldsets].each do |fieldset|
203
- fieldset = @fieldsets[fieldset].is_a?(Array) ? @fieldsets[fieldset] : [@fieldsets[fieldset]]
204
- subset_fields |= fieldset
205
- end
206
- subset_fields.uniq
207
- end
208
-
209
- # Return builded subsets
210
- #
211
- # @return [ Hash ]
212
- #
213
- # @since 0.0.1
214
- def subsets
215
- @subsets.reject{ |name, options| options[:template] }
216
- end
217
-
218
- # Provides grouped subsets list, formatted for use with grouped collection select
219
- #
220
- # @return [ Array ]
221
- #
222
- # @since 0.0.1
223
- def subsets_groups
224
- groups = {}
225
- i18n_group = {}
226
-
227
- subsets.each do |subset, options|
228
- options[:group] = :default unless options[:group]
229
- i18n_subset = self.human_attribute_name("subsets.#{subset}")
230
- i18n_group[options[:group]] ||= self.human_attribute_name("subsets.#{options[:group]}")
231
- groups[i18n_group[options[:group]]] ||= [options[:group], {}]
232
- groups[i18n_group[options[:group]]].last[i18n_subset] = subset
233
- end
234
-
235
- # Rearrange groups
236
- groups = groups.sort
237
- groups.map do |group|
238
- [group.last.first, group.first, group.last.last.sort]
239
- end
240
- end
241
-
242
- # Return subsets included of a subsets scope
243
- #
244
- # @return [ Array ]
245
- #
246
- # @since 0.0.2
247
- def subsets_scope name
248
- subsets_scopes[name] || []
249
- end
250
-
251
- # Return subsets scopes list
252
- #
253
- # @return [ Array ]
254
- #
255
- # @since 0.0.2
256
- def subsets_scopes
257
- @subsets_scopes
258
- end
259
- end
260
- end
1
+ require "model_subsets/version"
2
+
3
+ module ModelSubsets
4
+
5
+ extend ActiveSupport::Concern
6
+
7
+ # Return current subset fieldsets list
8
+ #
9
+ # @return [ Array ]
10
+ #
11
+ # @since 0.0.2
12
+ def fieldsets
13
+ subset_content[:fieldsets] if valid_subset?
14
+ end
15
+
16
+ # Whether subset includes a fieldset
17
+ #
18
+ # @example Check if a user has fieldset :common
19
+ # user.has_fieldset? :common
20
+ #
21
+ # @param [ Symbol ] name The fieldset name
22
+ #
23
+ # @return [ Boolean ]
24
+ #
25
+ # @since 0.0.2
26
+ def has_fieldset? name
27
+ fieldsets.include?(name) if valid_subset?
28
+ end
29
+
30
+ # Whether subset is included in a subsets scope
31
+ #
32
+ # @example Check if current subset is in :users subsets scope
33
+ # person.in_subset_scope? :users
34
+ #
35
+ # @param [ Symbol ] name The subsets scope name
36
+ #
37
+ # @return [ Boolean ]
38
+ #
39
+ # @since 0.0.4
40
+ def in_subsets_scope? name
41
+ self.class.subsets_scope(name).include? subset.to_sym
42
+ end
43
+
44
+ # Returns current subset content
45
+ # An empty Hash is returned if subset is not defined
46
+ #
47
+ # @return [ Hash ]
48
+ #
49
+ # @since 0.0.2
50
+ def subset_content
51
+ self.class.subsets[subset.to_sym] if valid_subset?
52
+ end
53
+
54
+ # Whether a subset fieldset includes a field
55
+ # It only checks if the field is included in current subset fieldsets, not if the field is a column in the model
56
+ #
57
+ # @example Check if a user uses field :name
58
+ # user.has_field? :name
59
+ #
60
+ # @param [ Symbol ] name The field name
61
+ #
62
+ # @return [ Boolean ]
63
+ #
64
+ # @since 0.0.2
65
+ def subset_field? name
66
+ subset_fields.include?(name) if subset_fields
67
+ end
68
+
69
+ # Return current subset fields list
70
+ #
71
+ # @return [ Array ]
72
+ #
73
+ # @since 0.0.2
74
+ def subset_fields
75
+ self.class.subset_fields(subset.to_sym) if valid_subset?
76
+ end
77
+
78
+ # Whether current subset id is defined
79
+ #
80
+ # @example Use valid_subset? as a model validation
81
+ # validate :valid_subset?
82
+ #
83
+ # @return [ Boolean ]
84
+ #
85
+ # @since 0.0.2
86
+ def valid_subset?
87
+ return true if self.class.subsets.keys.include?(subset.to_s.to_sym)
88
+ errors.add(:subset, :invalid) if respond_to?(:errors)
89
+ false
90
+ end
91
+
92
+ module ClassMethods
93
+
94
+ # Defines a fieldset
95
+ #
96
+ # @example Define fieldset :login including fields :username and :password
97
+ # fieldset :login, :username, :password
98
+ #
99
+ # @param [ Symbol ] name The fieldset name
100
+ # @param [ Array ] *args Fields names
101
+ # @param [ Hash ] options The fieldset options
102
+ #
103
+ # @option options [ Boolean ] :opt_in Whether fieldset is NOT included by default in subsets (Default: false = opt-out)
104
+ #
105
+ # @since 0.0.2
106
+ def fieldset name, *args
107
+ options = args.last.is_a?(Hash) ? args.pop : {}
108
+
109
+ @fieldsets ||= {}
110
+ @fieldsets[name] = { options: options, fields: args }
111
+ end
112
+
113
+ # Defines a subset
114
+ # If no fieldset is included, all defined fieldsets will be included by default
115
+ # If fieldsets are defined on an extended subset, parents fieldsets will be ignored
116
+ #
117
+ # @example Define subset :user, which is a person able to login
118
+ # subset :user, extends: :person, with: :login, scopes: :users
119
+ #
120
+ # @param [ Symbol ] name The subset name
121
+ # @param [ Hash ] options The options to pass to the subset
122
+ #
123
+ # @option options [ Boolean ] :template Whether subset is a template (only used as an extend)
124
+ # @option options [ Symbol ] :group Subset group name
125
+ # @option options [ Symbol, Array ] :fieldsets Explicit fieldsets list. Overrides default list (all or herited)
126
+ # @option options [ Symbol, Array ] :scopes The scopes in which subset will be included
127
+ # @option options [ Symbol, Array ] :extends Parent subsets
128
+ # @option options [ Symbol, Array ] :add Fieldsets to be added to default of herited fieldsets
129
+ # @option options [ Symbol, Array ] :only Filters fieldsets to remove fielsets not being in this list
130
+ # @option options [ Symbol, Array ] :except Filters fieldsets to remove fieldsets being in this list
131
+ #
132
+ # @since 0.0.2
133
+ def subset name, options = {}
134
+ @subsets ||= {}
135
+ @subsets_scopes ||= {}
136
+
137
+ options[:fieldsets] = [options[:fieldsets]] unless options[:fieldsets].blank? || options[:fieldsets].is_a?(Array)
138
+
139
+ # Subset is an extension
140
+ if options[:extends]
141
+ # Force extends option to Array
142
+ options[:extends] = [options[:extends]] unless options[:extends].is_a?(Array)
143
+ options[:extends].each do |source_subset|
144
+ next unless @subsets.has_key? source_subset
145
+ source_options = @subsets[source_subset].clone
146
+ source_options.delete :template
147
+ options = source_options.merge options
148
+ end
149
+
150
+ # Include all opt-out fieldsets by default
151
+ elsif options[:fieldsets].blank?
152
+ options[:fieldsets] = @fieldsets.reject{ |k,v| v[:options][:opt_in] }.keys
153
+ end
154
+
155
+ # Handle additional fieldsets list
156
+ if options[:add]
157
+ options[:add] = [options[:add]] unless options[:add].is_a?(Array)
158
+ options[:fieldsets] |= options[:add]
159
+ end
160
+
161
+ # Handle fieldsets restriction list
162
+ if options[:only]
163
+ options[:only] = [options[:only]] unless options[:only].is_a?(Array)
164
+ options[:fieldsets] &= options[:only]
165
+ end
166
+
167
+ # Handle fieldsets exclusion list
168
+ if options[:except]
169
+ options[:except] = [options[:except]] unless options[:except].is_a?(Array)
170
+ options[:fieldsets] -= options[:except]
171
+ end
172
+
173
+ # Handle scopes
174
+ options[:scopes] ||= []
175
+ options[:scopes] = [options[:scopes]] unless options[:scopes].is_a?(Array)
176
+ options[:scopes].each do |subset_scope|
177
+ @subsets_scopes[subset_scope] ||= []
178
+ @subsets_scopes[subset_scope] << name unless options[:template]
179
+ scope subset_scope, where(:subset.in => @subsets_scopes[subset_scope])
180
+ end
181
+
182
+ # Cleanup
183
+ options[:fieldsets] = options[:fieldsets].uniq & @fieldsets.keys
184
+ remove_options = [:extends, :add, :only, :except]
185
+ options = options.clone
186
+ options.delete_if{ |key, value| remove_options.include?(key) }
187
+
188
+ # Register subset
189
+ @subsets[name] = options
190
+ end
191
+
192
+ # Return subset fields list
193
+ #
194
+ # @example Get fields included in subset :user of model Person
195
+ # Person.subset_fields :user
196
+ # => [ :name, :givenname, :username, :password ]
197
+ #
198
+ # @params [ Symbol ] name The subset name
199
+ #
200
+ # @returns [ Array ]
201
+ #
202
+ # @since 0.0.1
203
+ def subset_fields name
204
+ return unless subsets.has_key?(name) && subsets[name].has_key?(:fieldsets)
205
+ subset_fields = []
206
+ subsets[name][:fieldsets].each do |fieldset|
207
+ fields = @fieldsets[fieldset][:fields]
208
+ fieldset = fields.is_a?(Array) ? fields : [fields]
209
+ subset_fields |= fieldset
210
+ end
211
+ subset_fields.uniq
212
+ end
213
+
214
+ # Return builded subsets
215
+ #
216
+ # @return [ Hash ]
217
+ #
218
+ # @since 0.0.1
219
+ def subsets
220
+ @subsets.reject{ |name, options| options[:template] }
221
+ end
222
+
223
+ # Provides grouped subsets list, formatted for use with grouped collection select
224
+ #
225
+ # @return [ Array ]
226
+ #
227
+ # @since 0.0.1
228
+ def subsets_groups
229
+ groups = {}
230
+ i18n_group = {}
231
+
232
+ subsets.each do |subset, options|
233
+ options[:group] = :default unless options[:group]
234
+ i18n_subset = self.human_attribute_name("subsets.#{subset}")
235
+ i18n_group[options[:group]] ||= self.human_attribute_name("subsets.#{options[:group]}")
236
+ groups[i18n_group[options[:group]]] ||= [options[:group], {}]
237
+ groups[i18n_group[options[:group]]].last[i18n_subset] = subset
238
+ end
239
+
240
+ # Rearrange groups
241
+ groups = groups.sort
242
+ groups.map do |group|
243
+ [group.last.first, group.first, group.last.last.sort]
244
+ end
245
+ end
246
+
247
+ # Return subsets included of a subsets scope
248
+ #
249
+ # @return [ Array ]
250
+ #
251
+ # @since 0.0.2
252
+ def subsets_scope name
253
+ subsets_scopes[name] || []
254
+ end
255
+
256
+ # Return subsets scopes list
257
+ #
258
+ # @return [ Array ]
259
+ #
260
+ # @since 0.0.2
261
+ def subsets_scopes
262
+ @subsets_scopes
263
+ end
264
+ end
265
+ end
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: model_subsets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-27 00:00:00.000000000 Z
12
+ date: 2012-09-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -63,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  version: '0'
64
64
  requirements: []
65
65
  rubyforge_project:
66
- rubygems_version: 1.8.23
66
+ rubygems_version: 1.8.24
67
67
  signing_key:
68
68
  specification_version: 3
69
69
  summary: Subsets management for Rails models