model_subsets 0.0.5 → 0.0.6

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.
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