attribute-filters 1.4.0 → 2.0.0
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.tar.gz.sig +0 -0
- data/.yardopts +1 -0
- data/ChangeLog +501 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +7 -7
- data/Manifest.txt +7 -0
- data/README.md +59 -30
- data/Rakefile +1 -0
- data/attribute-filters.gemspec +4 -4
- data/docs/COMMON-FILTERS.md +1067 -0
- data/docs/HISTORY +42 -0
- data/docs/TODO +29 -12
- data/docs/USAGE.md +718 -818
- data/lib/attribute-filters.rb +4 -2
- data/lib/attribute-filters/attribute_set.rb +144 -73
- data/lib/attribute-filters/attribute_set_annotations.rb +110 -77
- data/lib/attribute-filters/attribute_set_attrquery.rb +51 -8
- data/lib/attribute-filters/attribute_set_enum.rb +44 -38
- data/lib/attribute-filters/attribute_set_query.rb +62 -12
- data/lib/attribute-filters/backports.rb +36 -4
- data/lib/attribute-filters/common_filters.rb +83 -37
- data/lib/attribute-filters/common_filters/bare.rb +29 -0
- data/lib/attribute-filters/common_filters/case.rb +34 -19
- data/lib/attribute-filters/common_filters/convert.rb +259 -0
- data/lib/attribute-filters/common_filters/join.rb +37 -30
- data/lib/attribute-filters/common_filters/order.rb +105 -0
- data/lib/attribute-filters/common_filters/pick.rb +90 -0
- data/lib/attribute-filters/common_filters/presence.rb +70 -0
- data/lib/attribute-filters/common_filters/split.rb +37 -21
- data/lib/attribute-filters/common_filters/squeeze.rb +28 -9
- data/lib/attribute-filters/common_filters/strip.rb +7 -3
- data/lib/attribute-filters/dsl_attr_virtual.rb +2 -1
- data/lib/attribute-filters/dsl_filters.rb +14 -61
- data/lib/attribute-filters/dsl_sets.rb +238 -88
- data/lib/attribute-filters/helpers.rb +7 -1
- data/lib/attribute-filters/meta_set.rb +38 -0
- data/lib/attribute-filters/version.rb +1 -1
- data/spec/attribute-filters_spec.rb +178 -16
- data/spec/spec_helper.rb +9 -4
- metadata +129 -69
- metadata.gz.sig +0 -0
|
@@ -40,7 +40,7 @@ module ActiveModel
|
|
|
40
40
|
if value.is_a?(Array)
|
|
41
41
|
value.map { |v| each_element(v, must_be, &block) }
|
|
42
42
|
elsif value.is_a?(Hash)
|
|
43
|
-
value.
|
|
43
|
+
value.each_with_object(value.class.new) { |(k,v),n| n[k] = each_element(v, must_be, &block) }
|
|
44
44
|
elsif must_be.nil? || value.is_a?(must_be)
|
|
45
45
|
yield(value)
|
|
46
46
|
else
|
|
@@ -49,6 +49,12 @@ module ActiveModel
|
|
|
49
49
|
end
|
|
50
50
|
module_function :each_element
|
|
51
51
|
|
|
52
|
+
# @private
|
|
53
|
+
def safe_dup(src)
|
|
54
|
+
src.respond_to?(:deep_dup) ? src.deep_dup : (src.is_a?(Enumerable) ? src.dup : src)
|
|
55
|
+
end
|
|
56
|
+
module_function :safe_dup
|
|
57
|
+
|
|
52
58
|
end # module AttributeFiltersHelpers
|
|
53
59
|
end # module AttributeFilters
|
|
54
60
|
end # module ActiveModel
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Author:: Paweł Wilk (mailto:pw@gnu.org)
|
|
4
|
+
# Copyright:: (c) 2012 by Paweł Wilk
|
|
5
|
+
# License:: This program is licensed under the terms of {file:LGPL-LICENSE GNU Lesser General Public License} or {file:COPYING Ruby License}.
|
|
6
|
+
#
|
|
7
|
+
# This file contains ActiveModel::MetaSet class
|
|
8
|
+
# used to store and compare sets of attribute sets.
|
|
9
|
+
|
|
10
|
+
# @abstract This namespace is shared with ActveModel.
|
|
11
|
+
module ActiveModel
|
|
12
|
+
# This is a kind of AttributeSet class
|
|
13
|
+
# but its purpose it so store other information
|
|
14
|
+
# than attribute names.
|
|
15
|
+
class MetaSet < AttributeSet
|
|
16
|
+
|
|
17
|
+
# @private
|
|
18
|
+
def initialize(*args)
|
|
19
|
+
Hash.instance_method(:initialize).bind(self).call(*args)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @private
|
|
23
|
+
def inspect(*args)
|
|
24
|
+
Hash.instance_method(:inspect).bind(self).call(*args)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
# Internal method for merging sets.
|
|
30
|
+
def merge_set(my_v, ov, my_class = self.class)
|
|
31
|
+
if my_v.is_a?(my_class) && ov.is_a?(my_class)
|
|
32
|
+
my_v.deep_merge(ov)
|
|
33
|
+
else
|
|
34
|
+
my_v
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end # module ActiveModel
|
|
@@ -20,7 +20,7 @@ describe ActiveModel::AttributeFilters do
|
|
|
20
20
|
@tm.username = " UPCASEĄĘŚĆ "
|
|
21
21
|
@tm.email = " Some@EXAMPLE.com "
|
|
22
22
|
@tm.real_name = " sir rails "
|
|
23
|
-
|
|
23
|
+
@tm.save
|
|
24
24
|
@tm.username.should == "upcaseąęść"
|
|
25
25
|
@tm.email.should == "Some@EXAMPLE.com"
|
|
26
26
|
@tm.real_name.should == "Sir Rails"
|
|
@@ -69,8 +69,8 @@ describe ActiveModel::AttributeFilters do
|
|
|
69
69
|
s.annotate(:email, :operation, :e_value)
|
|
70
70
|
c.annotate(:real_name, :operation, :some_value)
|
|
71
71
|
c.annotate(:real_name, :operation, :other_value)
|
|
72
|
-
s.
|
|
73
|
-
c.
|
|
72
|
+
s.should be_eql( { 'real_name' => { :operation => :first_value }, 'email' => { :operation => :e_value }, 'username' => true } )
|
|
73
|
+
c.should be_eql( { 'real_name' => { :operation => :other_value } } )
|
|
74
74
|
-> {TestModel.class_eval do
|
|
75
75
|
attributes_that should_be_sth: [ :abc, :atr_one => {:ak => "av"}, :atr_two => {:sk => "sv"} ]
|
|
76
76
|
attributes_that should_be_sth: [:atr_three, :atr_two, :yy]
|
|
@@ -103,7 +103,7 @@ describe ActiveModel::AttributeFilters do
|
|
|
103
103
|
@tm.attributes_that(:should_be_sth).annotation(:atr_three, :hh).should == nil
|
|
104
104
|
dupx = TestModel.attributes_that(:should_be_sth)
|
|
105
105
|
dupy = @tm.attributes_that(:should_be_sth)
|
|
106
|
-
dupx.send(:annotations).should
|
|
106
|
+
dupx.send(:annotations).should be_eql( dupy.send(:annotations) )
|
|
107
107
|
dupx.object_id.should_not == dupy.object_id
|
|
108
108
|
-> {TestModel.class_eval do
|
|
109
109
|
annotate_attributes_that :should_be_sth => { :atr_three => { :cc => "ee" } }
|
|
@@ -133,45 +133,45 @@ describe ActiveModel::AttributeFilters do
|
|
|
133
133
|
it "should be able to relatively complement sets" do
|
|
134
134
|
r = @s - @c
|
|
135
135
|
r.to_a.sort.should == [ "email", "username" ]
|
|
136
|
-
r.
|
|
136
|
+
r.should be_eql( { 'email' => { :operation => :e_value }, 'username' => true } )
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
it "should be able to join sets (union)" do
|
|
140
140
|
r = @s + @c
|
|
141
141
|
r.to_a.sort.should == [ "email", "real_name", "username" ]
|
|
142
|
-
r.
|
|
142
|
+
r.should be_eql( { 'email' => { :operation => :e_value }, 'real_name' => { :operation => :first_value }, 'username' => true } )
|
|
143
143
|
end
|
|
144
144
|
|
|
145
145
|
it "should be able to intersect sets" do
|
|
146
146
|
r = @s & @c
|
|
147
147
|
r.to_a.sort.should == [ "real_name" ]
|
|
148
|
-
r.
|
|
148
|
+
r.should be_eql( { 'real_name' => { :operation => :first_value } } )
|
|
149
149
|
end
|
|
150
150
|
|
|
151
151
|
it "should be able to exclusively disjunct sets" do
|
|
152
152
|
r = @s ^ @c
|
|
153
153
|
r.to_a.sort.should == [ "email", "username" ]
|
|
154
|
-
r.
|
|
154
|
+
r.should be_eql( { "email" => {:operation=>:e_value}, "username" => true } )
|
|
155
155
|
sp = @s.dup
|
|
156
156
|
sp.annotate(:username, 'k', 'v')
|
|
157
157
|
r = sp ^ @c
|
|
158
158
|
r.to_a.sort.should == [ "email", "username" ]
|
|
159
|
-
r.
|
|
159
|
+
r.should be_eql( { 'email' => { :operation => :e_value }, 'username' => { :k => "v" } } )
|
|
160
160
|
end
|
|
161
161
|
|
|
162
162
|
it "should be able to delete elements from a set" do
|
|
163
163
|
@s.annotate(:username, :some_key, 'string_val')
|
|
164
|
-
@s.
|
|
165
|
-
'username' => { :some_key => 'string_val' } }
|
|
164
|
+
@s.should be_eql( { 'email' => { :operation => :e_value }, 'real_name' => { :operation => :first_value },
|
|
165
|
+
'username' => { :some_key => 'string_val' } })
|
|
166
166
|
@s.delete_if { |o| o == 'username' }
|
|
167
167
|
@s.include?('username').should == false
|
|
168
|
-
@s.
|
|
168
|
+
@s.should be_eql( { 'email' => { :operation => :e_value }, 'real_name' => { :operation => :first_value } })
|
|
169
169
|
end
|
|
170
170
|
|
|
171
171
|
it "should be able to keep elements in a set using keep_if" do
|
|
172
172
|
@s.keep_if { |o| o == 'email' }
|
|
173
173
|
@s.include?('email').should == true
|
|
174
|
-
@s.
|
|
174
|
+
@s.should be_eql( { 'email' => { :operation => :e_value } } )
|
|
175
175
|
end
|
|
176
176
|
end
|
|
177
177
|
|
|
@@ -193,6 +193,164 @@ describe ActiveModel::AttributeFilters do
|
|
|
193
193
|
@tm.attributes_that(:should_be_joined).annotation(:real_name).should == nil
|
|
194
194
|
end
|
|
195
195
|
|
|
196
|
+
it "should squeeze attributes" do
|
|
197
|
+
TestModel.class_eval{before_save :squeeze_attributes}
|
|
198
|
+
TestModel.class_eval do
|
|
199
|
+
attributes_that :should_be_squeezed, :sq_one
|
|
200
|
+
attributes_that :should_be_squeezed, :sq_six => { :squeeze_other_str => 'l' }
|
|
201
|
+
squeeze_attributes :sq_two => 'o'
|
|
202
|
+
squeeze_attributes :sq_three => { :with_character => 'o' }, :sq_four => 'o', :sq_five => nil
|
|
203
|
+
squeeze_attributes :sq_eight, :sq_seven
|
|
204
|
+
end
|
|
205
|
+
@tm.sq_one = @tm.sq_two = @tm.sq_three = @tm.sq_four = @tm.sq_five = @tm.sq_six = @tm.sq_seven = @tm.sq_eight = 'yellow moon'
|
|
206
|
+
-> { @tm.save }.should_not raise_error
|
|
207
|
+
@tm.sq_one.should == 'yelow mon'
|
|
208
|
+
@tm.sq_two.should == 'yellow mon'
|
|
209
|
+
@tm.sq_three.should == 'yellow mon'
|
|
210
|
+
@tm.sq_four.should == 'yellow mon'
|
|
211
|
+
@tm.sq_five.should == 'yelow mon'
|
|
212
|
+
@tm.sq_six.should == 'yelow moon'
|
|
213
|
+
@tm.sq_seven.should == 'yelow mon'
|
|
214
|
+
@tm.sq_eight.should == 'yelow mon'
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "should pick attributes" do
|
|
218
|
+
TestModel.class_eval do
|
|
219
|
+
attributes_that :should_be_picked, :p_a
|
|
220
|
+
attributes_that :should_be_picked, :p_b => { :pick_separator => " " }
|
|
221
|
+
pick_attributes :p_c, :p_d
|
|
222
|
+
pick_attributes :p_e => / /
|
|
223
|
+
pick_attributes :p_f => { :separator => " ", :from => 1 }
|
|
224
|
+
pick_attributes :p_g => { :from => 2, :to => 3 }
|
|
225
|
+
pick_attributes :p_h => { :range => 2..3 }
|
|
226
|
+
pick_attributes :p_i => { :step => 2, :from => 2, :separator => " " }
|
|
227
|
+
pick_attributes :p_j => { :step => 2, :tail => 2, :separator => " " }
|
|
228
|
+
pick_attributes :p_k => { :joiner => "x", :separator => " ", :head => 1 }
|
|
229
|
+
pick_attributes :p_l => { :head => 2, :step => 2 }
|
|
230
|
+
pick_attributes :p_m => { :enum => true, :head => 2, :step => 2 }
|
|
231
|
+
pick_attributes :p_n => { :enum => true, :head => 2, :step => 2 }
|
|
232
|
+
pick_attributes :p_o => { :head => 2, :step => 2 }
|
|
233
|
+
end
|
|
234
|
+
@tm.p_a = @tm.p_b = @tm.p_c = @tm.p_d = @tm.p_e = @tm.p_f = @tm.p_g = @tm.p_h =
|
|
235
|
+
@tm.p_i = @tm.p_j = @tm.p_k = "one two three four five"
|
|
236
|
+
@tm.p_l = @tm.p_m = @tm.p_a.split(" ")
|
|
237
|
+
@tm.p_n = @tm.p_o = { :a => 'one', :b => 'two', :c => 'three', :d => 'four', :e => 'five' }
|
|
238
|
+
-> { @tm.save }.should_not raise_error
|
|
239
|
+
@tm.p_a.should == "one two three four five"
|
|
240
|
+
@tm.p_b.should == "one two three four five"
|
|
241
|
+
@tm.p_c.should == "one two three four five"
|
|
242
|
+
@tm.p_d.should == "one two three four five"
|
|
243
|
+
@tm.p_e.should == "onetwothreefourfive"
|
|
244
|
+
@tm.p_f.should == "two three four five"
|
|
245
|
+
@tm.p_g.should == "e "
|
|
246
|
+
@tm.p_h.should == "e "
|
|
247
|
+
@tm.p_i.should == "three five"
|
|
248
|
+
@tm.p_j.should == "one three"
|
|
249
|
+
@tm.p_k.should == "twoxthreexfourxfive"
|
|
250
|
+
@tm.p_l.should == ["e", "o", "re", "u", "v"]
|
|
251
|
+
@tm.p_m.should == ["three", "five"]
|
|
252
|
+
@tm.p_n.should == { 'c' => 'three', 'e' => 'five' }
|
|
253
|
+
@tm.p_o.should == { 'a' => 'e', 'b' => 'o', 'c' => 're', 'd' => 'u', 'e' => 'v' }
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
it "should fill attributes with values" do
|
|
257
|
+
TestModel.class_eval{before_save :fill_attributes}
|
|
258
|
+
TestModel.class_eval do
|
|
259
|
+
attributes_that :should_be_filled, :fill_one
|
|
260
|
+
attributes_that :should_be_filled, :fill_two => { :fill_value => 'dupa' }
|
|
261
|
+
attributes_that :should_be_filled, :fill_three => { :fill_value => 'dupa', :fill_any => true }
|
|
262
|
+
fill_attributes :fill_four => 'dupa'
|
|
263
|
+
fill_attributes :fill_five => { :with => 'dupa', :fill_present => true }
|
|
264
|
+
fill_attributes :fill_six => { :with => 'dupa' }
|
|
265
|
+
fill_attributes :fill_seven => { :with => 'dupa', :always => true }
|
|
266
|
+
fill_attributes :fill_eight => { :with => 'dupa', :enums => true }
|
|
267
|
+
fill_attributes :fill_nine => { :with => 'dupa', :always => true, :enums => true }
|
|
268
|
+
fill_attributes :fill_ten => { :with => 'dupa' }
|
|
269
|
+
end
|
|
270
|
+
@tm.fill_one = ''
|
|
271
|
+
@tm.fill_five = @tm.fill_three = 'something'
|
|
272
|
+
@tm.fill_two = @tm.fill_four = @tm.fill_six = nil
|
|
273
|
+
@tm.fill_seven = @tm.fill_eight = @tm.fill_nine = @tm.fill_ten = ['1',2,:x,nil,'']
|
|
274
|
+
-> { @tm.save }.should_not raise_error
|
|
275
|
+
@tm.fill_one.should == nil
|
|
276
|
+
@tm.fill_two.should == 'dupa'
|
|
277
|
+
@tm.fill_three.should == 'dupa'
|
|
278
|
+
@tm.fill_four.should == 'dupa'
|
|
279
|
+
@tm.fill_five.should == 'dupa'
|
|
280
|
+
@tm.fill_six.should == 'dupa'
|
|
281
|
+
@tm.fill_seven.should == ['dupa','dupa','dupa','dupa','dupa']
|
|
282
|
+
@tm.fill_eight.should == ['1',2,:x,nil,'']
|
|
283
|
+
@tm.fill_nine.should == 'dupa'
|
|
284
|
+
@tm.fill_ten.should == ['1',2,:x,'dupa','dupa']
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
it "should reverse attribute values" do
|
|
288
|
+
TestModel.class_eval do
|
|
289
|
+
attributes_that :should_be_reversed, :reverse_one
|
|
290
|
+
attributes_that :should_be_reversed, :reverse_two => { :reverse_enumerable => true }
|
|
291
|
+
reverse_attributes :reverse_three => { :enums => true }
|
|
292
|
+
reverse_attributes :reverse_four
|
|
293
|
+
end
|
|
294
|
+
@tm.reverse_one = @tm.reverse_two = 'dupa'
|
|
295
|
+
@tm.reverse_three = @tm.reverse_four = ['1',2,:x,'dupa']
|
|
296
|
+
-> { @tm.save }.should_not raise_error
|
|
297
|
+
@tm.reverse_one.should == 'apud'
|
|
298
|
+
@tm.reverse_two.should == 'apud'
|
|
299
|
+
@tm.reverse_three.should == ['dupa',:x,2,'1']
|
|
300
|
+
@tm.reverse_four.should == ['1',2,:x,'apud']
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
it "should randomize order of attribute values" do
|
|
304
|
+
TestModel.class_eval{before_save :shuffle_attributes}
|
|
305
|
+
TestModel.class_eval do
|
|
306
|
+
attributes_that :should_be_shuffled, :shuffle_one, :shuffle_two
|
|
307
|
+
shuffle_attributes :shuffle_three => { :enums => true }
|
|
308
|
+
shuffle_attributes :shuffle_four
|
|
309
|
+
end
|
|
310
|
+
@tm.shuffle_one = @tm.shuffle_two = 'dupa'
|
|
311
|
+
@tm.shuffle_three = @tm.shuffle_four = ['1',2,:x,2,'dupadupa']
|
|
312
|
+
-> { @tm.save }.should_not raise_error
|
|
313
|
+
@tm.shuffle_one.split("").sort.should == @tm.shuffle_two.split("").sort
|
|
314
|
+
@tm.shuffle_three.sort{ |a,b| a.to_s <=> b.to_s}.should == ['1',2,:x,2,'dupadupa'].sort{ |a,b| a.to_s <=> b.to_s}
|
|
315
|
+
@tm.shuffle_four.take(3).should == ['1',2,:x]
|
|
316
|
+
@tm.shuffle_four.last.should_not == 'dupadupa'
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
it "should convert attributes" do
|
|
320
|
+
TestModel.class_eval do
|
|
321
|
+
attributes_that :should_be_strings, :to_strings => { :base => 10 }
|
|
322
|
+
attributes_that :should_be_integers, :to_integers
|
|
323
|
+
convert_to_float :to_floats
|
|
324
|
+
convert_to_string :to_strings_two
|
|
325
|
+
convert_to_string :to_strings_three => 2
|
|
326
|
+
convert_to_string :to_strings_four => { :base => 2, :default => "7" }
|
|
327
|
+
convert_to_fraction :to_fractions
|
|
328
|
+
convert_to_number :to_numbers
|
|
329
|
+
convert_to_integer :to_integers_two => 2
|
|
330
|
+
convert_to_boolean :to_boolean
|
|
331
|
+
end
|
|
332
|
+
@tm.to_strings = 5
|
|
333
|
+
@tm.to_strings_two = @tm.to_strings_four = 0.5.to_r
|
|
334
|
+
@tm.to_strings_three = 123
|
|
335
|
+
@tm.to_integers = "12"
|
|
336
|
+
@tm.to_integers_two = "10001"
|
|
337
|
+
@tm.to_floats = "12.1234"
|
|
338
|
+
@tm.to_fractions = "1/2"
|
|
339
|
+
@tm.to_numbers = [ "1", 2, "3" ]
|
|
340
|
+
@tm.to_boolean = nil
|
|
341
|
+
@tm.save
|
|
342
|
+
@tm.to_strings.should == "5"
|
|
343
|
+
@tm.to_strings_two.should == "1/2"
|
|
344
|
+
@tm.to_strings_four.should == "7"
|
|
345
|
+
@tm.to_strings_three.should == "1111011"
|
|
346
|
+
@tm.to_integers.should == 12
|
|
347
|
+
@tm.to_floats.should == 12.1234
|
|
348
|
+
@tm.to_fractions.should == "1/2".to_r
|
|
349
|
+
@tm.to_numbers.should == [ 1, 2, 3 ]
|
|
350
|
+
@tm.to_integers_two.should == 17
|
|
351
|
+
@tm.to_boolean.should === false
|
|
352
|
+
end
|
|
353
|
+
|
|
196
354
|
shared_examples "splitting" do |ev|
|
|
197
355
|
before { TestModel.class_eval{before_save :split_attributes} }
|
|
198
356
|
it "should split attributes using syntax: #{ev}" do
|
|
@@ -200,7 +358,6 @@ describe ActiveModel::AttributeFilters do
|
|
|
200
358
|
@tm.real_name = "Paweł Wilk Trzy"
|
|
201
359
|
@tm.first_name = nil
|
|
202
360
|
@tm.last_name = nil
|
|
203
|
-
#-> { @tm.save }.should_not raise_error
|
|
204
361
|
@tm.save
|
|
205
362
|
@tm.first_name.should == 'Paweł'
|
|
206
363
|
@tm.last_name.should == 'Wilk'
|
|
@@ -304,7 +461,12 @@ describe ActiveModel::AttributeFilters do
|
|
|
304
461
|
@tm.last_name.should == nil
|
|
305
462
|
@tm.real_name.should == ["Paweł", "Wilk", "Trzy", "Cztery"]
|
|
306
463
|
|
|
307
|
-
TestModel.class_eval{split_attribute :real_name => {:limit => 2}}
|
|
464
|
+
TestModel.class_eval{split_attribute :real_name => {:limit => 2, :flatten => true}}
|
|
465
|
+
@tm.real_name = ["Paweł", "Wilk Trzy Osiem Dziewiec", "Cztery"]
|
|
466
|
+
-> { @tm.save }.should_not raise_error
|
|
467
|
+
@tm.real_name.should == ["Paweł", "Wilk", "Trzy Osiem Dziewiec", "Cztery"]
|
|
468
|
+
|
|
469
|
+
TestModel.class_eval{split_attribute :real_name => {:limit => 2, :flatten => false}}
|
|
308
470
|
@tm.real_name = ["Paweł", "Wilk Trzy Osiem Dziewiec", "Cztery"]
|
|
309
471
|
-> { @tm.save }.should_not raise_error
|
|
310
472
|
@tm.real_name.should == [["Paweł"], ["Wilk", "Trzy Osiem Dziewiec"], ["Cztery"]]
|
|
@@ -332,7 +494,7 @@ describe ActiveModel::AttributeFilters do
|
|
|
332
494
|
@tm.real_name = rn
|
|
333
495
|
@tm.first_name = "Paweł"
|
|
334
496
|
@tm.last_name = "Wilk"
|
|
335
|
-
|
|
497
|
+
@tm.save
|
|
336
498
|
@tm.first_name.should == 'Paweł'
|
|
337
499
|
@tm.last_name.should == 'Wilk'
|
|
338
500
|
@tm.real_name.should == 'Paweł Wilk'
|
data/spec/spec_helper.rb
CHANGED
|
@@ -21,14 +21,12 @@ class TestModel < SuperModel::Base
|
|
|
21
21
|
attributes_that should_be_titleized: [ :real_name ]
|
|
22
22
|
attributes_that should_be_squeezed: [ :real_name ]
|
|
23
23
|
attributes_that should_be_tested: [ :test_attribute ]
|
|
24
|
+
attributes_that should_be_effed: [ :ef_attribute ]
|
|
24
25
|
attributes_that do_not_exist: [ :nonexistent_attribute ]
|
|
25
26
|
|
|
26
27
|
the_attribute username: [ :should_be_stripped, :should_be_downcased ]
|
|
27
28
|
|
|
28
|
-
before_save :
|
|
29
|
-
before_save :downcase_attributes
|
|
30
|
-
before_save :titleize_attributes
|
|
31
|
-
before_save :squeeze_attributes
|
|
29
|
+
before_save :filter_attributes
|
|
32
30
|
|
|
33
31
|
def touch_nonexistent
|
|
34
32
|
filter_attributes_that :do_not_exist do |atr|
|
|
@@ -42,4 +40,11 @@ class TestModel < SuperModel::Base
|
|
|
42
40
|
end
|
|
43
41
|
end
|
|
44
42
|
|
|
43
|
+
def my_filtering_method
|
|
44
|
+
filter_attributes_that :should_be_effed do |atr|
|
|
45
|
+
atr + "F"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
filtering_method :my_filtering_method, :should_be_effed
|
|
49
|
+
|
|
45
50
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: attribute-filters
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.0.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,50 +9,38 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain:
|
|
12
|
-
- !
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
8SXN1/mZjMqWvYyEMSfQP4XzkFSOuyDcoDAf43OGhOhdv5Jcs/Et/FH6DgWYwRxq
|
|
41
|
-
|
|
42
|
-
RtATRWON5R99ugPeRb7i1nIpnzGEBA9V32r6r959Bp3XjkVEXylbItYMqSARaZlY
|
|
43
|
-
|
|
44
|
-
qzKSsIUjh7vDyTNqta0DjSgCk26dhnOwc0hmzhvVZtBwfZritSVhfCLp5uFwqCqY
|
|
45
|
-
|
|
46
|
-
NK3TIZaPCh1S2/ES6wXNvjQ+5EnEEL9j/pSEop9DYEBPaM2WDVR5i0jJTAaRWw==
|
|
47
|
-
|
|
48
|
-
-----END CERTIFICATE-----
|
|
49
|
-
|
|
50
|
-
'
|
|
51
|
-
date: 2012-08-24 00:00:00.000000000 Z
|
|
12
|
+
- !binary |-
|
|
13
|
+
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLakNDQWhLZ0F3SUJB
|
|
14
|
+
Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREE3TVE4d0RRWURWUVFEREFaemFX
|
|
15
|
+
Vm0KWTJFeEV6QVJCZ29Ka2lhSmsvSXNaQUVaRmdObmJuVXhFekFSQmdvSmtp
|
|
16
|
+
YUprL0lzWkFFWkZnTnZjbWN3SGhjTgpNRGt3TmpBMk1Ea3dPREE1V2hjTk1U
|
|
17
|
+
QXdOakEyTURrd09EQTVXakE3TVE4d0RRWURWUVFEREFaemFXVm1ZMkV4CkV6
|
|
18
|
+
QVJCZ29Ka2lhSmsvSXNaQUVaRmdObmJuVXhFekFSQmdvSmtpYUprL0lzWkFF
|
|
19
|
+
WkZnTnZjbWN3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dF
|
|
20
|
+
S0FvSUJBUUNkazQrOWllU3gySTJPUHNsUGNqL0xqYWp3dHNySAptZXY2RnMz
|
|
21
|
+
eEs5aGRESWJiTHVRTTlBeXBCUzdOZUtQLzJZVG9FT0d4c3Z6Y3BGekwyQWg3
|
|
22
|
+
MWNQNllmbitaMllvCnp2cXBBeDUvbmw3OVBySkt2amxrZHpWTk9GQnAvRU9r
|
|
23
|
+
TEs2N1FLNFB2OTdBQm5HMlBrRjRGb2txT2p1TkhMTTcKNDdPa0pQdkZ5Zkh5
|
|
24
|
+
TUJEWk43RUZsakJCTm0zSXVRUlRpTzQ4ZTVKY3AzTDc2MVBXT3ZDcG5WOHdp
|
|
25
|
+
Z2EwV3d0Mwo5OEdteTdjMW5XemZiUWMxd0h3S0xQSUNZL2FpZEtVMjBLeW1T
|
|
26
|
+
SEc2M0JTVzVwTzJjWFplY0llWWp3NVlOakdBCk0xUlpNaXdUN1FKOVc4NlZW
|
|
27
|
+
UCs4RXFiSktKT1M5NXhsbVFUSGpQSzU2eVh2OEdpdXlMUUhwUGg1QWdNQkFB
|
|
28
|
+
R2oKT1RBM01Ba0dBMVVkRXdRQ01BQXdIUVlEVlIwT0JCWUVGS09Lc3BaT05x
|
|
29
|
+
NGJ0NUQyREVleEIrdnNNQjJHTUFzRwpBMVVkRHdRRUF3SUVzREFOQmdrcWhr
|
|
30
|
+
aUc5dzBCQVFVRkFBT0NBUUVBVWgwTG5CNG81WEtwSDN5T3hhdkV5cDlYCk5l
|
|
31
|
+
bjJlODU0d3NTakFyMHdhU1Z6RXQzWHhZMXZveUlFNldDR3haSlUvLzQwQ1Iw
|
|
32
|
+
QmU3ajVDY3NKc0RVMkNaeVoKOFNYTjEvbVpqTXFXdll5RU1TZlFQNFh6a0ZT
|
|
33
|
+
T3V5RGNvREFmNDNPR2hPaGR2NUpjcy9FdC9GSDZEZ1dZd1J4cQpSdEFUUldP
|
|
34
|
+
TjVSOTl1Z1BlUmI3aTFuSXBuekdFQkE5VjMycjZyOTU5QnAzWGprVkVYeWxi
|
|
35
|
+
SXRZTXFTQVJhWmxZCnF6S1NzSVVqaDd2RHlUTnF0YTBEalNnQ2syNmRobk93
|
|
36
|
+
YzBobXpodlZadEJ3ZlpyaXRTVmhmQ0xwNXVGd3FDcVkKTkszVElaYVBDaDFT
|
|
37
|
+
Mi9FUzZ3WE52alErNUVuRUVMOWovcFNFb3A5RFlFQlBhTTJXRFZSNWkwakpU
|
|
38
|
+
QWFSV3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
|
39
|
+
date: 2012-11-01 00:00:00.000000000 Z
|
|
52
40
|
dependencies:
|
|
53
41
|
- !ruby/object:Gem::Dependency
|
|
54
42
|
name: railties
|
|
55
|
-
requirement:
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
56
44
|
none: false
|
|
57
45
|
requirements:
|
|
58
46
|
- - ~>
|
|
@@ -60,10 +48,15 @@ dependencies:
|
|
|
60
48
|
version: '3.0'
|
|
61
49
|
type: :runtime
|
|
62
50
|
prerelease: false
|
|
63
|
-
version_requirements:
|
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
+
none: false
|
|
53
|
+
requirements:
|
|
54
|
+
- - ~>
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
version: '3.0'
|
|
64
57
|
- !ruby/object:Gem::Dependency
|
|
65
58
|
name: activemodel
|
|
66
|
-
requirement:
|
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
|
67
60
|
none: false
|
|
68
61
|
requirements:
|
|
69
62
|
- - ~>
|
|
@@ -71,10 +64,15 @@ dependencies:
|
|
|
71
64
|
version: '3.0'
|
|
72
65
|
type: :runtime
|
|
73
66
|
prerelease: false
|
|
74
|
-
version_requirements:
|
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
68
|
+
none: false
|
|
69
|
+
requirements:
|
|
70
|
+
- - ~>
|
|
71
|
+
- !ruby/object:Gem::Version
|
|
72
|
+
version: '3.0'
|
|
75
73
|
- !ruby/object:Gem::Dependency
|
|
76
74
|
name: hoe-yard
|
|
77
|
-
requirement:
|
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
|
78
76
|
none: false
|
|
79
77
|
requirements:
|
|
80
78
|
- - ! '>='
|
|
@@ -82,10 +80,15 @@ dependencies:
|
|
|
82
80
|
version: 0.1.2
|
|
83
81
|
type: :development
|
|
84
82
|
prerelease: false
|
|
85
|
-
version_requirements:
|
|
83
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
84
|
+
none: false
|
|
85
|
+
requirements:
|
|
86
|
+
- - ! '>='
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: 0.1.2
|
|
86
89
|
- !ruby/object:Gem::Dependency
|
|
87
90
|
name: rspec
|
|
88
|
-
requirement:
|
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
|
89
92
|
none: false
|
|
90
93
|
requirements:
|
|
91
94
|
- - ! '>='
|
|
@@ -93,10 +96,15 @@ dependencies:
|
|
|
93
96
|
version: 2.6.0
|
|
94
97
|
type: :development
|
|
95
98
|
prerelease: false
|
|
96
|
-
version_requirements:
|
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
100
|
+
none: false
|
|
101
|
+
requirements:
|
|
102
|
+
- - ! '>='
|
|
103
|
+
- !ruby/object:Gem::Version
|
|
104
|
+
version: 2.6.0
|
|
97
105
|
- !ruby/object:Gem::Dependency
|
|
98
106
|
name: yard
|
|
99
|
-
requirement:
|
|
107
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
108
|
none: false
|
|
101
109
|
requirements:
|
|
102
110
|
- - ! '>='
|
|
@@ -104,10 +112,15 @@ dependencies:
|
|
|
104
112
|
version: 0.8.2
|
|
105
113
|
type: :development
|
|
106
114
|
prerelease: false
|
|
107
|
-
version_requirements:
|
|
115
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
116
|
+
none: false
|
|
117
|
+
requirements:
|
|
118
|
+
- - ! '>='
|
|
119
|
+
- !ruby/object:Gem::Version
|
|
120
|
+
version: 0.8.2
|
|
108
121
|
- !ruby/object:Gem::Dependency
|
|
109
122
|
name: rdoc
|
|
110
|
-
requirement:
|
|
123
|
+
requirement: !ruby/object:Gem::Requirement
|
|
111
124
|
none: false
|
|
112
125
|
requirements:
|
|
113
126
|
- - ! '>='
|
|
@@ -115,10 +128,15 @@ dependencies:
|
|
|
115
128
|
version: 3.8.0
|
|
116
129
|
type: :development
|
|
117
130
|
prerelease: false
|
|
118
|
-
version_requirements:
|
|
131
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
132
|
+
none: false
|
|
133
|
+
requirements:
|
|
134
|
+
- - ! '>='
|
|
135
|
+
- !ruby/object:Gem::Version
|
|
136
|
+
version: 3.8.0
|
|
119
137
|
- !ruby/object:Gem::Dependency
|
|
120
138
|
name: redcarpet
|
|
121
|
-
requirement:
|
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
|
122
140
|
none: false
|
|
123
141
|
requirements:
|
|
124
142
|
- - ! '>='
|
|
@@ -126,10 +144,15 @@ dependencies:
|
|
|
126
144
|
version: 2.1.0
|
|
127
145
|
type: :development
|
|
128
146
|
prerelease: false
|
|
129
|
-
version_requirements:
|
|
147
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
148
|
+
none: false
|
|
149
|
+
requirements:
|
|
150
|
+
- - ! '>='
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: 2.1.0
|
|
130
153
|
- !ruby/object:Gem::Dependency
|
|
131
154
|
name: supermodel
|
|
132
|
-
requirement:
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
133
156
|
none: false
|
|
134
157
|
requirements:
|
|
135
158
|
- - ! '>='
|
|
@@ -137,10 +160,15 @@ dependencies:
|
|
|
137
160
|
version: 0.1.6
|
|
138
161
|
type: :development
|
|
139
162
|
prerelease: false
|
|
140
|
-
version_requirements:
|
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
164
|
+
none: false
|
|
165
|
+
requirements:
|
|
166
|
+
- - ! '>='
|
|
167
|
+
- !ruby/object:Gem::Version
|
|
168
|
+
version: 0.1.6
|
|
141
169
|
- !ruby/object:Gem::Dependency
|
|
142
170
|
name: activerecord
|
|
143
|
-
requirement:
|
|
171
|
+
requirement: !ruby/object:Gem::Requirement
|
|
144
172
|
none: false
|
|
145
173
|
requirements:
|
|
146
174
|
- - ! '>='
|
|
@@ -148,10 +176,15 @@ dependencies:
|
|
|
148
176
|
version: '3.0'
|
|
149
177
|
type: :development
|
|
150
178
|
prerelease: false
|
|
151
|
-
version_requirements:
|
|
179
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
180
|
+
none: false
|
|
181
|
+
requirements:
|
|
182
|
+
- - ! '>='
|
|
183
|
+
- !ruby/object:Gem::Version
|
|
184
|
+
version: '3.0'
|
|
152
185
|
- !ruby/object:Gem::Dependency
|
|
153
186
|
name: bundler
|
|
154
|
-
requirement:
|
|
187
|
+
requirement: !ruby/object:Gem::Requirement
|
|
155
188
|
none: false
|
|
156
189
|
requirements:
|
|
157
190
|
- - ! '>='
|
|
@@ -159,10 +192,15 @@ dependencies:
|
|
|
159
192
|
version: 1.0.10
|
|
160
193
|
type: :development
|
|
161
194
|
prerelease: false
|
|
162
|
-
version_requirements:
|
|
195
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
196
|
+
none: false
|
|
197
|
+
requirements:
|
|
198
|
+
- - ! '>='
|
|
199
|
+
- !ruby/object:Gem::Version
|
|
200
|
+
version: 1.0.10
|
|
163
201
|
- !ruby/object:Gem::Dependency
|
|
164
202
|
name: hoe-bundler
|
|
165
|
-
requirement:
|
|
203
|
+
requirement: !ruby/object:Gem::Requirement
|
|
166
204
|
none: false
|
|
167
205
|
requirements:
|
|
168
206
|
- - ! '>='
|
|
@@ -170,10 +208,15 @@ dependencies:
|
|
|
170
208
|
version: 1.1.0
|
|
171
209
|
type: :development
|
|
172
210
|
prerelease: false
|
|
173
|
-
version_requirements:
|
|
211
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
212
|
+
none: false
|
|
213
|
+
requirements:
|
|
214
|
+
- - ! '>='
|
|
215
|
+
- !ruby/object:Gem::Version
|
|
216
|
+
version: 1.1.0
|
|
174
217
|
- !ruby/object:Gem::Dependency
|
|
175
218
|
name: hoe-gemspec
|
|
176
|
-
requirement:
|
|
219
|
+
requirement: !ruby/object:Gem::Requirement
|
|
177
220
|
none: false
|
|
178
221
|
requirements:
|
|
179
222
|
- - ! '>='
|
|
@@ -181,10 +224,15 @@ dependencies:
|
|
|
181
224
|
version: 1.0.0
|
|
182
225
|
type: :development
|
|
183
226
|
prerelease: false
|
|
184
|
-
version_requirements:
|
|
227
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
228
|
+
none: false
|
|
229
|
+
requirements:
|
|
230
|
+
- - ! '>='
|
|
231
|
+
- !ruby/object:Gem::Version
|
|
232
|
+
version: 1.0.0
|
|
185
233
|
- !ruby/object:Gem::Dependency
|
|
186
234
|
name: hoe
|
|
187
|
-
requirement:
|
|
235
|
+
requirement: !ruby/object:Gem::Requirement
|
|
188
236
|
none: false
|
|
189
237
|
requirements:
|
|
190
238
|
- - ~>
|
|
@@ -192,7 +240,12 @@ dependencies:
|
|
|
192
240
|
version: '2.16'
|
|
193
241
|
type: :development
|
|
194
242
|
prerelease: false
|
|
195
|
-
version_requirements:
|
|
243
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
244
|
+
none: false
|
|
245
|
+
requirements:
|
|
246
|
+
- - ~>
|
|
247
|
+
- !ruby/object:Gem::Version
|
|
248
|
+
version: '2.16'
|
|
196
249
|
description: Concise way of filtering model attributes in Rails.
|
|
197
250
|
email:
|
|
198
251
|
- pw@gnu.org
|
|
@@ -211,6 +264,7 @@ files:
|
|
|
211
264
|
- README.md
|
|
212
265
|
- Rakefile
|
|
213
266
|
- attribute-filters.gemspec
|
|
267
|
+
- docs/COMMON-FILTERS.md
|
|
214
268
|
- docs/COPYING
|
|
215
269
|
- docs/HISTORY
|
|
216
270
|
- docs/LEGAL
|
|
@@ -229,8 +283,13 @@ files:
|
|
|
229
283
|
- lib/attribute-filters/attribute_set_query.rb
|
|
230
284
|
- lib/attribute-filters/backports.rb
|
|
231
285
|
- lib/attribute-filters/common_filters.rb
|
|
286
|
+
- lib/attribute-filters/common_filters/bare.rb
|
|
232
287
|
- lib/attribute-filters/common_filters/case.rb
|
|
288
|
+
- lib/attribute-filters/common_filters/convert.rb
|
|
233
289
|
- lib/attribute-filters/common_filters/join.rb
|
|
290
|
+
- lib/attribute-filters/common_filters/order.rb
|
|
291
|
+
- lib/attribute-filters/common_filters/pick.rb
|
|
292
|
+
- lib/attribute-filters/common_filters/presence.rb
|
|
234
293
|
- lib/attribute-filters/common_filters/split.rb
|
|
235
294
|
- lib/attribute-filters/common_filters/squeeze.rb
|
|
236
295
|
- lib/attribute-filters/common_filters/strip.rb
|
|
@@ -238,6 +297,7 @@ files:
|
|
|
238
297
|
- lib/attribute-filters/dsl_filters.rb
|
|
239
298
|
- lib/attribute-filters/dsl_sets.rb
|
|
240
299
|
- lib/attribute-filters/helpers.rb
|
|
300
|
+
- lib/attribute-filters/meta_set.rb
|
|
241
301
|
- lib/attribute-filters/railtie.rb
|
|
242
302
|
- lib/attribute-filters/version.rb
|
|
243
303
|
- spec/attribute-filters_spec.rb
|
|
@@ -260,7 +320,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
260
320
|
version: '0'
|
|
261
321
|
segments:
|
|
262
322
|
- 0
|
|
263
|
-
hash:
|
|
323
|
+
hash: 3287018804216042017
|
|
264
324
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
265
325
|
none: false
|
|
266
326
|
requirements:
|
|
@@ -269,7 +329,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
269
329
|
version: '0'
|
|
270
330
|
requirements: []
|
|
271
331
|
rubyforge_project: attribute-filters
|
|
272
|
-
rubygems_version: 1.8.
|
|
332
|
+
rubygems_version: 1.8.24
|
|
273
333
|
signing_key:
|
|
274
334
|
specification_version: 3
|
|
275
335
|
summary: Concise way of filtering model attributes in Rails
|