normatron 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +1 -1
- data/README.rdoc +47 -81
- data/Rakefile +1 -2
- data/lib/normatron.rb +4 -1
- data/lib/normatron/active_record.rb +33 -58
- data/lib/normatron/filters.rb +21 -29
- data/spec/active_record_spec.rb +137 -0
- data/spec/filters_spec.rb +176 -35
- data/spec/spec_helper.rb +2 -2
- data/spec/{schema.rb → support/schema.rb} +0 -0
- data/spec/support/test_model.rb +4 -0
- metadata +16 -16
- data/lib/normatron/version.rb +0 -3
- data/spec/normatron_spec.rb +0 -86
data/MIT-LICENSE
CHANGED
@@ -17,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
17
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
18
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
19
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -1,29 +1,22 @@
|
|
1
1
|
= Normatron
|
2
2
|
|
3
|
-
Normatron is
|
3
|
+
Normatron is an attribute normalizer for Ruby On Rails ActiveRecord objects.
|
4
4
|
With it you can convert attributes to the desired format before saving them in the database.
|
5
|
-
This gem inhibits the work of having to override attributes or create a specific method to perform the
|
5
|
+
This gem inhibits the work of having to override attributes or create a specific method to perform the normalizations.
|
6
6
|
|
7
7
|
= Installation
|
8
|
-
|
9
8
|
Let the bundler install the gem by adding the following into your application gemfile:
|
10
|
-
|
11
9
|
gem 'normatron'
|
12
10
|
|
13
11
|
And then bundle it up:
|
14
|
-
|
15
12
|
$ bundle install
|
16
13
|
|
17
14
|
Or install it by yourself:
|
18
|
-
|
19
15
|
$ gem install normatron
|
20
16
|
|
21
17
|
= The problem
|
22
|
-
|
23
|
-
I have a product model as the following:
|
24
|
-
|
18
|
+
Suppose you have a product model as the following:
|
25
19
|
# ./db/migrate/20120101010000_create_products.rb
|
26
|
-
|
27
20
|
class CreateProducts < ActiveRecord::Migration
|
28
21
|
def change
|
29
22
|
create_table :products do |t|
|
@@ -34,47 +27,19 @@ I have a product model as the following:
|
|
34
27
|
end
|
35
28
|
|
36
29
|
# ./app/models/products.rb
|
37
|
-
|
38
30
|
class Product < ActiveRecord::Base
|
39
31
|
attr_accessible :name, :price
|
40
32
|
end
|
41
33
|
|
42
|
-
And
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
class Product < ActiveRecord::Base
|
50
|
-
attr_accessible :name, :price
|
51
|
-
|
52
|
-
def name=(value)
|
53
|
-
super value.mb_chars.upcase
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
== b. Using the before_validation callback
|
58
|
-
|
59
|
-
# ./app/models/products.rb
|
60
|
-
|
61
|
-
class Product < ActiveRecord::Base
|
62
|
-
attr_accessible :name, :price
|
63
|
-
|
64
|
-
before_validation :do_upcase
|
65
|
-
|
66
|
-
def do_upcase
|
67
|
-
write_attribute :name, name.mb_chars.upcase
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
Both ways are ilenegant, boring, error prone and expensive.
|
72
|
-
Which led me to use a third method:
|
34
|
+
And you want the 'name' attribute be uppercased before saving it into the database.
|
35
|
+
The most usual approach to do it includes:
|
36
|
+
* Override the 'name' setter and convert the value to an uppercased string.
|
37
|
+
* Use the 'before_validation' callback to run a method or block doing the task.
|
38
|
+
Both ways are ilenegant, boring, error prone and very expensive.
|
39
|
+
What led me to make this gem and offer a third way to solve the problem:
|
73
40
|
|
74
41
|
= Usage
|
75
|
-
|
76
42
|
# ./app/models/products.rb
|
77
|
-
|
78
43
|
class Product < ActiveRecord::Base
|
79
44
|
attr_accessible :name, :price
|
80
45
|
|
@@ -86,41 +51,14 @@ Which led me to use a third method:
|
|
86
51
|
> p.name
|
87
52
|
=> " MEMORY CARD "
|
88
53
|
|
89
|
-
You can assign multiple attributes to the same filter:
|
90
|
-
|
91
|
-
# ./app/models/products.rb
|
92
|
-
|
93
|
-
class Product < ActiveRecord::Base
|
94
|
-
attr_accessible :name, :description, :brand, :price
|
95
|
-
|
96
|
-
normalize :name, :brand, :with => :capitalize
|
97
|
-
end
|
98
|
-
|
99
|
-
$ rails console
|
100
|
-
> p = Product.create :name => "memory card 4 GB ", :brand => "OEM"
|
101
|
-
> p.name
|
102
|
-
=> "Memory card 4 GB "
|
103
|
-
> p.brand
|
104
|
-
=> "Oem"
|
105
|
-
|
106
|
-
And/or assign multiple filters to multiple attributes:
|
107
|
-
|
108
|
-
# ./app/models/products.rb
|
109
|
-
|
110
|
-
class Product < ActiveRecord::Base
|
111
|
-
attr_accessible :name, :description, :brand, :price
|
54
|
+
You can also assign multiple attributes to the same filter:
|
55
|
+
normalize :name, :brand, :with => :capitalize
|
112
56
|
|
113
|
-
|
114
|
-
|
57
|
+
And multiple filters to an unique attribute:
|
58
|
+
normalize :email, :with => [:downcase, :squish]
|
115
59
|
|
116
|
-
|
117
|
-
|
118
|
-
> p.name
|
119
|
-
=> "MEMORY CARD 4 GB"
|
120
|
-
> p.brand
|
121
|
-
=> "OEM"
|
122
|
-
> p.description
|
123
|
-
=> nil
|
60
|
+
Or mixing both:
|
61
|
+
normalize :name, :description, :with => [:upcase, :squish, :blank]
|
124
62
|
|
125
63
|
= Filters
|
126
64
|
== :upcase and :downcase
|
@@ -209,13 +147,13 @@ Remove trailing and leading spaces and then changing remaining consecutive white
|
|
209
147
|
> p.description
|
210
148
|
=> "My product is cheap!!!"
|
211
149
|
|
212
|
-
== :
|
150
|
+
== :blank
|
213
151
|
Convert a blank attribute into nil.
|
214
152
|
|
215
153
|
class Person < ActiveRecord::Base
|
216
154
|
attr_accessible :gender, :name
|
217
155
|
|
218
|
-
normalize :gender, :with => :
|
156
|
+
normalize :gender, :with => :blank
|
219
157
|
end
|
220
158
|
|
221
159
|
$ rails console
|
@@ -225,7 +163,35 @@ Convert a blank attribute into nil.
|
|
225
163
|
> p.name
|
226
164
|
=> " "
|
227
165
|
|
166
|
+
= Contributing
|
167
|
+
* Fork it, add your new features or bug fixes, make your tests and commit.
|
168
|
+
* Report any bug or unexpected behavior.
|
169
|
+
* Send me your feedback.
|
170
|
+
* Pay me a beer. =]
|
171
|
+
|
228
172
|
= Special Thanks
|
229
173
|
This gem was inspired on work of {fnando}[https://github.com/fnando] called {normalize_attributes}[https://github.com/fnando/normalize_attributes].
|
230
|
-
I just forked his gem and added some functionalities
|
231
|
-
He has a lot of interesting gems on his repo, please take a look.
|
174
|
+
I just forked his gem and added some functionalities.<br>
|
175
|
+
He has a lot of interesting gems on his repo, please take a look.
|
176
|
+
|
177
|
+
= Licence
|
178
|
+
Copyright 2012 Fernando Rodrigues da Silva
|
179
|
+
|
180
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
181
|
+
a copy of this software and associated documentation files (the
|
182
|
+
"Software"), to deal in the Software without restriction, including
|
183
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
184
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
185
|
+
permit persons to whom the Software is furnished to do so, subject to
|
186
|
+
the following conditions:
|
187
|
+
|
188
|
+
The above copyright notice and this permission notice shall be
|
189
|
+
included in all copies or substantial portions of the Software.
|
190
|
+
|
191
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
192
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
193
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
194
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
195
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
196
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
197
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
data/lib/normatron.rb
CHANGED
@@ -1,76 +1,51 @@
|
|
1
|
+
require "normatron/filters"
|
1
2
|
require "active_record"
|
2
3
|
|
3
4
|
module Normatron
|
4
5
|
module ActiveRecord
|
5
|
-
|
6
6
|
def self.included(base)
|
7
7
|
base.instance_eval do
|
8
|
-
|
9
|
-
|
10
|
-
before_validation :normalize_attributes
|
8
|
+
before_validation :apply_normalization
|
11
9
|
|
12
10
|
class << self
|
13
|
-
attr_accessor :
|
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
|
-
# Check filters
|
40
|
-
filters.each do |f|
|
41
|
-
unless Filters::NAMES.include? f
|
42
|
-
raise "Normalization filter '#{f}' doesn't exist"
|
11
|
+
attr_accessor :normalization_filters
|
12
|
+
|
13
|
+
def normalize(*args)
|
14
|
+
options = args.extract_options!
|
15
|
+
options[:with] ||= [:blank, :squish]
|
16
|
+
|
17
|
+
filters = [options[:with]].flatten.compact
|
18
|
+
filters.map!(&:to_sym)
|
19
|
+
intersect = filters & (Filters.filter_names + methods(false))
|
20
|
+
|
21
|
+
unless intersect == filters
|
22
|
+
raise "Normalization filters #{filters - intersect} doesn't exist"
|
23
|
+
end
|
24
|
+
|
25
|
+
@normalization_filters ||= {}
|
26
|
+
args.each do |raw_attribute|
|
27
|
+
attribute = raw_attribute.to_sym
|
28
|
+
|
29
|
+
if self.column_names.include? attribute.to_s
|
30
|
+
@normalization_filters[attribute] ||= []
|
31
|
+
@normalization_filters[attribute] += filters
|
32
|
+
else
|
33
|
+
raise "Attribute '#{attribute}' doesn't exist in #{self}"
|
34
|
+
end
|
35
|
+
end
|
43
36
|
end
|
44
37
|
end
|
45
|
-
|
46
|
-
# Add normalization callbacks
|
47
|
-
args.each do |attribute|
|
48
|
-
# Check attributes
|
49
|
-
unless self.column_names.include? attribute.to_s
|
50
|
-
raise "Attribute '#{attribute}' doesn't exist in #{self.name}"
|
51
|
-
end
|
52
|
-
|
53
|
-
@normalization_options[attribute] ||= []
|
54
|
-
@normalization_options[attribute] += filters
|
55
|
-
end
|
56
38
|
end
|
57
|
-
alias :normatron :normalize
|
58
39
|
end
|
40
|
+
|
41
|
+
def apply_normalization
|
42
|
+
return unless self.class.normalization_filters.is_a? Hash
|
59
43
|
|
60
|
-
|
61
|
-
options = self.class.normalization_options
|
62
|
-
return unless options
|
63
|
-
|
64
|
-
options.each do |attribute, methods|
|
44
|
+
self.class.normalization_filters.each do |attribute, filters|
|
65
45
|
value = send("#{attribute}_before_type_cast") || send(attribute)
|
66
46
|
|
67
|
-
|
68
|
-
value = Filters.
|
69
|
-
|
70
|
-
if value == :no_method
|
71
|
-
raise ArgumentError, "Method :#{method} cannot be resolved.
|
72
|
-
Check options for #{attribute} in #{klass}", caller
|
73
|
-
end
|
47
|
+
filters.each do |filter|
|
48
|
+
value = Filters.apply(filter, value)
|
74
49
|
end
|
75
50
|
|
76
51
|
write_attribute attribute, value
|
data/lib/normatron/filters.rb
CHANGED
@@ -1,42 +1,33 @@
|
|
1
|
-
require "i18n"
|
2
1
|
require "active_support/all"
|
3
2
|
|
4
3
|
module Normatron
|
5
4
|
module Filters
|
5
|
+
class << self
|
6
|
+
def apply(filter, value)
|
7
|
+
return value unless value.is_a? String
|
8
|
+
|
9
|
+
case filter
|
10
|
+
when :upcase, :downcase, :capitalize, :titlecase, :titleize
|
11
|
+
value.mb_chars.send(filter).to_s
|
12
|
+
when :squish, :lstrip, :rstrip, :strip
|
13
|
+
value.send(filter)
|
14
|
+
when :blank
|
15
|
+
send("to_#{filter}", value)
|
16
|
+
end
|
17
|
+
end
|
6
18
|
|
7
|
-
|
8
|
-
|
9
|
-
MB_CHARS_METHODS = [:upcase, :downcase, :capitalize, :lstrip, :rstrip, :strip, :titlecase, :titleize]
|
10
|
-
SELF_METHODS = [:nillify, :nullify, :nil, :squish, :currency, :integer, :float]
|
11
|
-
|
12
|
-
public
|
13
|
-
|
14
|
-
NAMES = MB_CHARS_METHODS + SELF_METHODS
|
15
|
-
|
16
|
-
def self.do_filter(method, value)
|
17
|
-
if MB_CHARS_METHODS.include? method
|
18
|
-
value.mb_chars.send(method).to_s
|
19
|
-
elsif SELF_METHODS.include? method
|
20
|
-
send("filter_#{method}", value)
|
21
|
-
else
|
22
|
-
:no_method
|
19
|
+
def filter_names
|
20
|
+
[:upcase, :downcase, :capitalize, :titlecase, :titleize, :squish, :lstrip, :rstrip, :strip, :blank]
|
23
21
|
end
|
24
|
-
end
|
25
22
|
|
26
|
-
|
27
|
-
def self.filter_nillify(value)
|
28
|
-
value.blank? ? nil : value
|
29
|
-
end
|
30
|
-
class << self
|
31
|
-
alias :filter_nil :filter_nillify
|
32
|
-
alias :filter_nullify :filter_nillify
|
33
|
-
end
|
23
|
+
private
|
34
24
|
|
35
|
-
|
36
|
-
|
37
|
-
|
25
|
+
def to_blank(value)
|
26
|
+
value.blank? ? nil : value
|
27
|
+
end
|
38
28
|
end
|
39
29
|
|
30
|
+
=begin
|
40
31
|
def self.filter_currency(value)
|
41
32
|
filter_number value, :currency
|
42
33
|
end
|
@@ -75,5 +66,6 @@ module Normatron
|
|
75
66
|
|
76
67
|
res
|
77
68
|
end
|
69
|
+
=end
|
78
70
|
end
|
79
71
|
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Normatron::ActiveRecord do
|
4
|
+
before :each do
|
5
|
+
TestModel.normalization_filters = nil
|
6
|
+
end
|
7
|
+
|
8
|
+
it "filters should be accessible" do
|
9
|
+
TestModel.normalize :string_column, :with => [:capitalize, :upcase]
|
10
|
+
TestModel.normalize :integer_column, :with => :blank
|
11
|
+
TestModel.normalization_filters.should == { :string_column => [:capitalize, :upcase],
|
12
|
+
:integer_column => [:blank] }
|
13
|
+
TestModel.normalization_filters.delete :string_column
|
14
|
+
TestModel.normalization_filters.should == { :integer_column => [:blank] }
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should save without normalization" do
|
18
|
+
lambda do
|
19
|
+
instance = TestModel.new :string_column => "Any string"
|
20
|
+
instance.save!
|
21
|
+
end.should_not raise_error
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should skip normalization when filters aren't a Hash" do
|
25
|
+
TestModel.normalization_filters = true
|
26
|
+
lambda do
|
27
|
+
instance = TestModel.new :string_column => "Any string"
|
28
|
+
instance.valid?
|
29
|
+
end.should_not raise_error
|
30
|
+
|
31
|
+
TestModel.normalization_filters = 1
|
32
|
+
lambda do
|
33
|
+
instance = TestModel.new :string_column => "Any string"
|
34
|
+
instance.valid?
|
35
|
+
end.should_not raise_error
|
36
|
+
|
37
|
+
TestModel.normalization_filters = false
|
38
|
+
lambda do
|
39
|
+
instance = TestModel.new :string_column => "Any string"
|
40
|
+
instance.valid?
|
41
|
+
end.should_not raise_error
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should apply default filter to single attribute" do
|
45
|
+
TestModel.normalize :string_column
|
46
|
+
TestModel.normalization_filters.should == { :string_column => [:blank, :squish] }
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should apply default filter to multiple attributes" do
|
50
|
+
TestModel.normalize :string_column, :integer_column
|
51
|
+
TestModel.normalization_filters.should == { :string_column => [:blank, :squish],
|
52
|
+
:integer_column => [:blank, :squish] }
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should apply single filter to single attribute" do
|
56
|
+
TestModel.normalize :string_column, :with => :upcase
|
57
|
+
TestModel.normalization_filters.should == { :string_column => [:upcase] }
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should apply single filter to multiple attributes" do
|
61
|
+
TestModel.normalize :string_column, :integer_column, :with => :blank
|
62
|
+
TestModel.normalization_filters.should == { :string_column => [:blank],
|
63
|
+
:integer_column => [:blank] }
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should apply multiple filters to single attribute" do
|
67
|
+
TestModel.normalize :string_column, :with => [:blank, :upcase]
|
68
|
+
TestModel.normalization_filters.should == { :string_column => [:blank, :upcase] }
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should apply multiple filters to multiple attributes" do
|
72
|
+
TestModel.normalize :string_column, :integer_column, :with => [:squish, :blank]
|
73
|
+
TestModel.normalization_filters.should == { :string_column => [:squish, :blank],
|
74
|
+
:integer_column => [:squish, :blank] }
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should stack filters for the same attribute" do
|
78
|
+
TestModel.normalize :string_column, :with => [:upcase, :squish]
|
79
|
+
TestModel.normalize :string_column, :integer_column, :with => :blank
|
80
|
+
TestModel.normalize :string_column, :integer_column, :with => [:downcase, :strip]
|
81
|
+
TestModel.normalization_filters.should == { :string_column => [:upcase, :squish, :blank, :downcase, :strip],
|
82
|
+
:integer_column => [:blank, :downcase, :strip] }
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should apply attributes as string" do
|
86
|
+
TestModel.normalize "string_column", :with => :upcase
|
87
|
+
|
88
|
+
instance = TestModel.new :string_column => "Any string"
|
89
|
+
instance.valid?
|
90
|
+
instance.string_column.should == "ANY STRING"
|
91
|
+
|
92
|
+
TestModel.normalization_filters.should == { :string_column => [:upcase] }
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should apply filters as one word string" do
|
96
|
+
TestModel.normalize :string_column, :with => "upcase"
|
97
|
+
|
98
|
+
TestModel.normalization_filters.should == { :string_column => [:upcase] }
|
99
|
+
|
100
|
+
instance = TestModel.new :string_column => "Any string"
|
101
|
+
instance.valid?
|
102
|
+
instance.string_column.should == "ANY STRING"
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should raise error when a wrong filter is used" do
|
106
|
+
lambda do
|
107
|
+
TestModel.normalize :string_column, :with => :wrong_filter
|
108
|
+
end.should raise_error "Normalization filters [:wrong_filter] doesn't exist"
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should raise error when a wrong attribute is used" do
|
112
|
+
lambda do
|
113
|
+
TestModel.normalize :wrong_column, :with => :upcase
|
114
|
+
end.should raise_error "Attribute 'wrong_column' doesn't exist in TestModel"
|
115
|
+
end
|
116
|
+
|
117
|
+
pending "should allow use an instance method as a filter" do
|
118
|
+
lambda do
|
119
|
+
TestModel.normalize :string_column, :with => :my_custom_filter_method
|
120
|
+
end.should_not raise_error "Normalization filters [:my_custom_filter_method] doesn't exist"
|
121
|
+
|
122
|
+
TestModel.normalization_filters.should == { :string_column => [:my_custom_filter_method] }
|
123
|
+
end
|
124
|
+
|
125
|
+
pending "should apply an instance method used as a filter" do
|
126
|
+
TestModel.normalize :string_column, :with => :my_custom_filter_method
|
127
|
+
|
128
|
+
m = TestModel.new :string_column => "My life for Aiur"
|
129
|
+
m.string_column.should == "M-y- -l-i-f-e- -f-o-r- -A-i-u-r"
|
130
|
+
end
|
131
|
+
|
132
|
+
pending "should allow change default callback"
|
133
|
+
pending "should allow get value after type cast"
|
134
|
+
pending "should allow use blocks"
|
135
|
+
pending "should allow build custom filters"
|
136
|
+
pending "should allow use a instance method as a filter"
|
137
|
+
end
|
data/spec/filters_spec.rb
CHANGED
@@ -5,73 +5,214 @@ require "spec_helper"
|
|
5
5
|
describe Normatron::Filters do
|
6
6
|
|
7
7
|
before :each do
|
8
|
-
TestModel.
|
8
|
+
TestModel.normalization_filters = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
it :blank do
|
12
|
+
value = nil
|
13
|
+
expected = nil
|
14
|
+
Normatron::Filters.apply(:blank, value).should == expected
|
15
|
+
|
16
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
17
|
+
expected = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
18
|
+
Normatron::Filters.apply(:blank, value).should == expected
|
19
|
+
|
20
|
+
value = " "
|
21
|
+
expected = nil
|
22
|
+
Normatron::Filters.apply(:blank, value).should == expected
|
23
|
+
|
24
|
+
value = ""
|
25
|
+
expected = nil
|
26
|
+
Normatron::Filters.apply(:blank, value).should == expected
|
9
27
|
end
|
10
28
|
|
11
29
|
it :capitalize do
|
12
|
-
|
30
|
+
value = nil
|
31
|
+
expected = nil
|
32
|
+
Normatron::Filters.apply(:capitalize, value).should == expected
|
13
33
|
|
14
|
-
|
15
|
-
|
34
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
35
|
+
expected = " abc \f def \n 123 áèç \t !*& \r 4gü "
|
36
|
+
Normatron::Filters.apply(:capitalize, value).should == expected
|
16
37
|
|
17
|
-
|
18
|
-
|
19
|
-
|
38
|
+
value = "abc \f DEF \n 123 áÈç \t !*& \r 4gü"
|
39
|
+
expected = "Abc \f def \n 123 áèç \t !*& \r 4gü"
|
40
|
+
Normatron::Filters.apply(:capitalize, value).should == expected
|
20
41
|
end
|
21
42
|
|
22
43
|
it :downcase do
|
23
|
-
|
44
|
+
value = nil
|
45
|
+
expected = nil
|
46
|
+
Normatron::Filters.apply(:downcase, value).should == expected
|
24
47
|
|
25
|
-
|
26
|
-
|
48
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
49
|
+
expected = " abc \f def \n 123 áèç \t !*& \r 4gü "
|
50
|
+
Normatron::Filters.apply(:downcase, value).should == expected
|
51
|
+
end
|
52
|
+
|
53
|
+
it :lstrip do
|
54
|
+
value = nil
|
55
|
+
expected = nil
|
56
|
+
Normatron::Filters.apply(:lstrip, value).should == expected
|
57
|
+
|
58
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
59
|
+
expected = "abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
60
|
+
Normatron::Filters.apply(:lstrip, value).should == expected
|
61
|
+
end
|
62
|
+
|
63
|
+
it :rstrip do
|
64
|
+
value = nil
|
65
|
+
expected = nil
|
66
|
+
Normatron::Filters.apply(:rstrip, value).should == expected
|
67
|
+
|
68
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
69
|
+
expected = " abc \f DEF \n 123 áÈç \t !*& \r 4gü"
|
70
|
+
Normatron::Filters.apply(:rstrip, value).should == expected
|
27
71
|
end
|
28
72
|
|
29
73
|
it :squish do
|
30
|
-
|
74
|
+
value = nil
|
75
|
+
expected = nil
|
76
|
+
Normatron::Filters.apply(:squish, value).should == expected
|
31
77
|
|
32
|
-
|
33
|
-
|
78
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
79
|
+
expected = "abc DEF 123 áÈç !*& 4gü"
|
80
|
+
Normatron::Filters.apply(:squish, value).should == expected
|
34
81
|
end
|
35
82
|
|
36
83
|
it :strip do
|
37
|
-
|
84
|
+
value = nil
|
85
|
+
expected = nil
|
86
|
+
Normatron::Filters.apply(:strip, value).should == expected
|
38
87
|
|
39
|
-
|
40
|
-
|
88
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
89
|
+
expected = "abc \f DEF \n 123 áÈç \t !*& \r 4gü"
|
90
|
+
Normatron::Filters.apply(:strip, value).should == expected
|
41
91
|
end
|
42
92
|
|
43
93
|
it :titlecase do
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
94
|
+
value = nil
|
95
|
+
expected = nil
|
96
|
+
Normatron::Filters.apply(:titlecase, value).should == expected
|
97
|
+
Normatron::Filters.apply(:titleize, value).should == expected
|
98
|
+
|
99
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
100
|
+
expected = " Abc \f Def \n 123 Áèç \t !*& \r 4gü "
|
101
|
+
Normatron::Filters.apply(:titlecase, value).should == expected
|
102
|
+
Normatron::Filters.apply(:titleize, value).should == expected
|
48
103
|
end
|
49
104
|
|
50
105
|
it :upcase do
|
51
|
-
|
106
|
+
value = nil
|
107
|
+
expected = nil
|
108
|
+
Normatron::Filters.apply(:upcase, value).should == expected
|
52
109
|
|
53
|
-
|
54
|
-
|
110
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
111
|
+
expected = " ABC \f DEF \n 123 ÁÈÇ \t !*& \r 4GÜ "
|
112
|
+
Normatron::Filters.apply(:upcase, value).should == expected
|
55
113
|
end
|
56
114
|
|
57
|
-
|
58
|
-
|
115
|
+
pending "singularize"
|
116
|
+
pending "pluralize"
|
117
|
+
pending "parameterize"
|
118
|
+
pending "humanize"
|
119
|
+
pending "upper_camelcase"
|
120
|
+
pending "lower_camelcase"
|
121
|
+
pending "classify"
|
122
|
+
pending "dasherize"
|
123
|
+
pending "deconstantize"
|
124
|
+
pending "demodulize"
|
125
|
+
pending "html_safe"
|
126
|
+
pending "constantize"
|
127
|
+
pending "tableize"
|
128
|
+
pending "underscore"
|
129
|
+
=begin
|
130
|
+
it :singularize do
|
131
|
+
value = nil
|
132
|
+
expected = nil
|
133
|
+
Normatron::Filters.apply(:singularize, value).should == expected
|
134
|
+
|
135
|
+
value = "products"
|
136
|
+
expected = "product"
|
137
|
+
Normatron::Filters.apply(:singularize, value).should == expected
|
138
|
+
end
|
59
139
|
|
60
|
-
|
61
|
-
|
140
|
+
it :pluralize do
|
141
|
+
value = nil
|
142
|
+
expected = nil
|
143
|
+
Normatron::Filters.apply(:pluralize, value).should == expected
|
144
|
+
|
145
|
+
value = "product"
|
146
|
+
expected = "products"
|
147
|
+
Normatron::Filters.apply(:pluralize, value).should == expected
|
62
148
|
end
|
63
149
|
|
64
|
-
it :
|
65
|
-
|
150
|
+
it :parameterize do
|
151
|
+
value = nil
|
152
|
+
expected = nil
|
153
|
+
Normatron::Filters.apply(:parameterize, value).should == expected
|
66
154
|
|
67
|
-
|
68
|
-
|
155
|
+
value = " abc \f DEF \n 123 áÈç \t !*& \r 4gü "
|
156
|
+
expected = "abc-def-123-aec-4gu"
|
157
|
+
Normatron::Filters.apply(:parameterize, value).should == expected
|
69
158
|
end
|
70
159
|
|
71
|
-
it :
|
72
|
-
|
160
|
+
it :humanize do
|
161
|
+
value = nil
|
162
|
+
expected = nil
|
163
|
+
Normatron::Filters.apply(:humanize, value).should == expected
|
164
|
+
|
165
|
+
value = "éou_shall_not_pass"
|
166
|
+
expected = "Éou_shall_not_pass"
|
167
|
+
Normatron::Filters.apply(:humanize, value).should == expected
|
168
|
+
end
|
169
|
+
|
170
|
+
it :upper_camelcase do
|
171
|
+
value = nil
|
172
|
+
expected = nil
|
173
|
+
Normatron::Filters.apply(:camelize, value).should == expected
|
174
|
+
Normatron::Filters.apply(:camelcase, value).should == expected
|
175
|
+
Normatron::Filters.apply(:upper_camelize, value).should == expected
|
176
|
+
Normatron::Filters.apply(:upper_camelcase, value).should == expected
|
177
|
+
|
178
|
+
value = "active_record/érrors"
|
179
|
+
expected = "ActiveRecord::Érrors"
|
180
|
+
Normatron::Filters.apply(:camelize, value).should == expected
|
181
|
+
Normatron::Filters.apply(:camelcase, value).should == expected
|
182
|
+
Normatron::Filters.apply(:upper_camelize, value).should == expected
|
183
|
+
Normatron::Filters.apply(:upper_camelcase, value).should == expected
|
184
|
+
end
|
185
|
+
|
186
|
+
it :lower_camelcase do
|
187
|
+
value = nil
|
188
|
+
expected = nil
|
189
|
+
Normatron::Filters.apply(:lower_camelize, value).should == expected
|
190
|
+
Normatron::Filters.apply(:lower_camelcase, value).should == expected
|
191
|
+
|
192
|
+
value = "active_record/érrors"
|
193
|
+
expected = "activeRecord::Érrors"
|
194
|
+
Normatron::Filters.apply(:lower_camelize, value).should == expected
|
195
|
+
Normatron::Filters.apply(:lower_camelcase, value).should == expected
|
196
|
+
end
|
197
|
+
|
198
|
+
it :classify do
|
199
|
+
value = nil
|
200
|
+
expected = nil
|
201
|
+
Normatron::Filters.apply(:classify, value).should == expected
|
202
|
+
|
203
|
+
value = "áctive_record/errors"
|
204
|
+
expected = "ÁctiveRecord::Errors"
|
205
|
+
Normatron::Filters.apply(:classify, value).should == expected
|
206
|
+
end
|
207
|
+
|
208
|
+
it :dasherize do
|
209
|
+
value = nil
|
210
|
+
expected = nil
|
211
|
+
Normatron::Filters.apply(:dasherize, value).should == expected
|
73
212
|
|
74
|
-
|
75
|
-
|
213
|
+
value = "active_record/errors"
|
214
|
+
expected = "active-record/errors"
|
215
|
+
Normatron::Filters.apply(:dasherize, value).should == expected
|
76
216
|
end
|
217
|
+
=end
|
77
218
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,6 +3,6 @@ require "normatron"
|
|
3
3
|
|
4
4
|
ActiveRecord::Base.establish_connection :adapter => "sqlite3", :database => ":memory:"
|
5
5
|
|
6
|
-
load "schema.rb"
|
7
6
|
|
8
|
-
|
7
|
+
|
8
|
+
Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each { |f| require f }
|
File without changes
|
data/spec/support/test_model.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: normatron
|
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-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
37
|
+
version: 1.3.0
|
38
38
|
type: :development
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
45
|
+
version: 1.3.0
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: rspec
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ! '>='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 2.
|
53
|
+
version: 2.10.0
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,26 +58,26 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 2.
|
62
|
-
description: ! " Normatron is
|
63
|
-
|
64
|
-
|
61
|
+
version: 2.10.0
|
62
|
+
description: ! " Normatron is an attribute normalizer for ActiveRecord objects.\n
|
63
|
+
\ With it you can convert attributes to the desired format before saving them
|
64
|
+
in the database.\n This gem inhibits the work of having to override attributes
|
65
|
+
or create a specific method to perform the normalizations.\n"
|
65
66
|
email:
|
66
|
-
- fernandors87@
|
67
|
+
- fernandors87@gmail.com
|
67
68
|
executables: []
|
68
69
|
extensions: []
|
69
70
|
extra_rdoc_files: []
|
70
71
|
files:
|
71
72
|
- lib/normatron/filters.rb
|
72
73
|
- lib/normatron/active_record.rb
|
73
|
-
- lib/normatron/version.rb
|
74
74
|
- lib/normatron.rb
|
75
75
|
- MIT-LICENSE
|
76
76
|
- Rakefile
|
77
77
|
- README.rdoc
|
78
78
|
- spec/support/test_model.rb
|
79
|
-
- spec/
|
80
|
-
- spec/
|
79
|
+
- spec/support/schema.rb
|
80
|
+
- spec/active_record_spec.rb
|
81
81
|
- spec/filters_spec.rb
|
82
82
|
- spec/spec_helper.rb
|
83
83
|
homepage: https://github.com/fernandors87/normatron
|
@@ -103,10 +103,10 @@ rubyforge_project:
|
|
103
103
|
rubygems_version: 1.8.24
|
104
104
|
signing_key:
|
105
105
|
specification_version: 3
|
106
|
-
summary:
|
106
|
+
summary: Normalize attributes for ActiveRecord objects.
|
107
107
|
test_files:
|
108
108
|
- spec/support/test_model.rb
|
109
|
-
- spec/
|
110
|
-
- spec/
|
109
|
+
- spec/support/schema.rb
|
110
|
+
- spec/active_record_spec.rb
|
111
111
|
- spec/filters_spec.rb
|
112
112
|
- spec/spec_helper.rb
|
data/lib/normatron/version.rb
DELETED
data/spec/normatron_spec.rb
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Normatron do
|
6
|
-
before :each do
|
7
|
-
TestModel.normalization_options = nil
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should respond to aliases" do
|
11
|
-
TestModel.should respond_to :normatron
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should save without normalization option" do
|
15
|
-
lambda do
|
16
|
-
instance = TestModel.new
|
17
|
-
instance.string_column = "Any string"
|
18
|
-
instance.save!
|
19
|
-
end.should_not raise_error
|
20
|
-
end
|
21
|
-
|
22
|
-
it "filters should be accessible" do
|
23
|
-
TestModel.normalize :string_column, :with => [:capitalize, :upcase]
|
24
|
-
TestModel.normalize :integer_column, :with => :integer
|
25
|
-
TestModel.normalization_options.should == { :string_column => [:capitalize, :upcase], :integer_column => [:integer] }
|
26
|
-
TestModel.normalization_options.delete :string_column
|
27
|
-
TestModel.normalization_options.should == { :integer_column => [:integer] }
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should apply single filter" do
|
31
|
-
TestModel.normalize :string_column, :with => :upcase
|
32
|
-
|
33
|
-
m = TestModel.create :string_column => "master of puppets"
|
34
|
-
m.string_column.should == "MASTER OF PUPPETS"
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should apply multiple filters" do
|
38
|
-
TestModel.normalize :string_column, :with => [:downcase, :squish, :nil]
|
39
|
-
|
40
|
-
m = TestModel.create :string_column => " YOU SHALL NOT PASS "
|
41
|
-
m.string_column.should == "you shall not pass"
|
42
|
-
|
43
|
-
m = TestModel.create :string_column => " "
|
44
|
-
m.string_column.should == nil
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should stack filters for the same attribute" do
|
48
|
-
TestModel.normalize :string_column, :with => [:upcase, :squish]
|
49
|
-
TestModel.normalize :string_column, :with => :nil
|
50
|
-
TestModel.normalization_options.should == { :string_column => [:upcase, :squish, :nil] }
|
51
|
-
end
|
52
|
-
|
53
|
-
it "default filters should be :squish and :nillify" do
|
54
|
-
TestModel.normalize :string_column
|
55
|
-
TestModel.normalization_options.should == { :string_column => [:squish, :nillify] }
|
56
|
-
end
|
57
|
-
|
58
|
-
it "default filters should be :squish and :nillify" do
|
59
|
-
TestModel.normalize :string_column
|
60
|
-
TestModel.normalization_options.should == { :string_column => [:squish, :nillify] }
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should filter multiple attributes" do
|
64
|
-
TestModel.normalize :string_column, :integer_column, :with => :nil
|
65
|
-
|
66
|
-
m = TestModel.create :string_column => " ", :integer_column => " "
|
67
|
-
m.string_column.should == nil
|
68
|
-
m.integer_column.should == nil
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should raise error if a wrong option is set and the right isn't" do
|
72
|
-
lambda do
|
73
|
-
TestModel.normalize :string_column, :wrong_option => :upcase
|
74
|
-
end.should raise_error "Wrong normalization key in TestModel, use :with instead of wrong_option"
|
75
|
-
|
76
|
-
lambda do
|
77
|
-
TestModel.normalize :string_column, :wrong_option => :upcase, :with => :downcase
|
78
|
-
end.should_not raise_error
|
79
|
-
end
|
80
|
-
|
81
|
-
it "should raise error if wrong filter is called" do
|
82
|
-
lambda do
|
83
|
-
TestModel.normalize :string_column, :with => :wrong_filter
|
84
|
-
end.should raise_error "Normalization filter 'wrong_filter' doesn't exist"
|
85
|
-
end
|
86
|
-
end
|