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 +0 -0
- data/Gemfile +0 -0
- data/LICENSE +0 -0
- data/README.md +0 -0
- data/Rakefile +0 -0
- data/lib/model_subsets/version.rb +3 -3
- data/lib/model_subsets.rb +265 -260
- data/model_subsets.gemspec +0 -0
- metadata +3 -3
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.
|
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
|
100
|
-
# @param [ Array ] *args
|
101
|
-
#
|
102
|
-
#
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
#
|
114
|
-
#
|
115
|
-
#
|
116
|
-
#
|
117
|
-
#
|
118
|
-
#
|
119
|
-
#
|
120
|
-
# @
|
121
|
-
# @
|
122
|
-
#
|
123
|
-
# @option options [
|
124
|
-
# @option options [ Symbol
|
125
|
-
# @option options [ Symbol, Array ] :
|
126
|
-
#
|
127
|
-
# @
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
#
|
193
|
-
#
|
194
|
-
# @
|
195
|
-
#
|
196
|
-
#
|
197
|
-
#
|
198
|
-
# @
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
#
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
#
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
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
|
data/model_subsets.gemspec
CHANGED
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.
|
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-
|
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.
|
66
|
+
rubygems_version: 1.8.24
|
67
67
|
signing_key:
|
68
68
|
specification_version: 3
|
69
69
|
summary: Subsets management for Rails models
|