attribute_normalizer 0.2.1 → 0.3.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/README.textile +19 -4
- data/lib/attribute_normalizer/model_inclusions.rb +25 -11
- data/lib/attribute_normalizer/normalizers/blank_normalizer.rb +9 -0
- data/lib/attribute_normalizer/normalizers/phone_normalizer.rb +10 -0
- data/lib/attribute_normalizer/normalizers/strip_normalizer.rb +9 -0
- data/lib/attribute_normalizer.rb +17 -2
- data/spec/author_spec.rb +25 -0
- data/spec/book_spec.rb +6 -1
- data/spec/connection_and_schema.rb +7 -0
- data/spec/models/author.rb +5 -10
- data/spec/models/book.rb +5 -1
- data/spec/test_helper.rb +8 -0
- metadata +9 -4
data/README.textile
CHANGED
@@ -4,6 +4,11 @@ p. A little normalization goes a long way in helping maintain data integrity.
|
|
4
4
|
|
5
5
|
h2. Recent Changes
|
6
6
|
|
7
|
+
* 0.3.0
|
8
|
+
** Normalizer Chaining
|
9
|
+
** Built-in common normalizers
|
10
|
+
** Ability to change the default attribute normalization.
|
11
|
+
|
7
12
|
* 0.2.1
|
8
13
|
** ActiveModel Support Built-in
|
9
14
|
** Fix for :with option getting dropped when normalizing several attributes
|
@@ -54,10 +59,16 @@ p. Lets create a quick test/spec for what we want to accomplish as far as normal
|
|
54
59
|
describe Book do
|
55
60
|
it { should normalize_attribute(:author) }
|
56
61
|
it { should normalize_attribute(:price).from('$3,450.98').to(3450.98) }
|
57
|
-
it { should normalize_attribute(:summary).from('Here is my summary that is a little to long').to('Here is m...') }
|
58
|
-
it { should normalize_attribute(:title).from('pick up chicks with magic tricks').to('Pick Up Chicks With Magic Tricks')}
|
62
|
+
it { should normalize_attribute(:summary).from(' Here is my summary that is a little to long ').to('Here is m...') }
|
63
|
+
it { should normalize_attribute(:title).from(' pick up chicks with magic tricks ').to('Pick Up Chicks With Magic Tricks')}
|
59
64
|
end</code></pre>
|
60
65
|
|
66
|
+
p. The following normalizers are already included with the +0.3 version of the gem.
|
67
|
+
|
68
|
+
* _:blank_ Will return _nil_ on empty strings
|
69
|
+
* _:phone_ Will strip out all non-digit characters and return nil on empty strings
|
70
|
+
* _:strip_ Will strip leading and trailing whitespace.
|
71
|
+
|
61
72
|
p. And lets predefine some normalizers that we may use in other classes/models or that we don't want to clutter up our class/model's readability with.
|
62
73
|
|
63
74
|
<pre><code># config/initializers/attribute_normalizer.rb
|
@@ -78,6 +89,10 @@ AttributeNormalizer.configure do |config|
|
|
78
89
|
end
|
79
90
|
end
|
80
91
|
|
92
|
+
# The default normalizers if no :with option or block is given is to apply the :strip and :blank normalizers (in that order).
|
93
|
+
# You can change this if you would like as follows:
|
94
|
+
# config.default_normalizers = :strip, :blank
|
95
|
+
|
81
96
|
end
|
82
97
|
</code></pre>
|
83
98
|
|
@@ -92,8 +107,8 @@ The _normalize_attributes_ method is eager loaded into your ORM. _normalize_att
|
|
92
107
|
# Using one of our predefined normalizers.
|
93
108
|
normalize_attribute :price, :with => :currency
|
94
109
|
|
95
|
-
# Using one of our predefined normalizers with options
|
96
|
-
normalize_attribute :summary, :with => :
|
110
|
+
# Using more then one of our predefined normalizers including one with options
|
111
|
+
normalize_attribute :summary, :with => [ :strip, { :truncate => { :length => 12 } } ]
|
97
112
|
|
98
113
|
# You can also define your normalization block inline.
|
99
114
|
normalize_attribute :title do |value|
|
@@ -6,23 +6,37 @@ module AttributeNormalizer
|
|
6
6
|
|
7
7
|
module ClassMethods
|
8
8
|
def normalize_attributes(*attributes, &block)
|
9
|
-
options = attributes.
|
10
|
-
|
9
|
+
options = attributes.last.is_a?(::Hash) ? attributes.pop : {}
|
10
|
+
|
11
|
+
normalizers = [options.delete(:with)].flatten.compact
|
12
|
+
if normalizers.empty? && !block_given?
|
13
|
+
normalizers = AttributeNormalizer.configuration.default_normalizers # the default normalizers
|
14
|
+
end
|
11
15
|
|
12
16
|
attributes.each do |attribute|
|
13
|
-
|
14
|
-
|
17
|
+
if block_given?
|
18
|
+
define_method "normalize_#{attribute}" do |value|
|
15
19
|
yield(value)
|
16
|
-
|
17
|
-
|
18
|
-
|
20
|
+
end
|
21
|
+
else
|
22
|
+
define_method "normalize_#{attribute}" do |value|
|
23
|
+
normalized=value
|
24
|
+
normalizers.each do |normalizer_name|
|
25
|
+
unless normalizer_name.kind_of?(Symbol)
|
26
|
+
normalizer_name,options=normalizer_name.keys[0],normalizer_name[normalizer_name.keys[0]]
|
27
|
+
end
|
28
|
+
|
29
|
+
normalizer=AttributeNormalizer.configuration.normalizers[normalizer_name]
|
30
|
+
raise AttributeNormalizer::MissingNormalizer.new("No normalizer was found for #{normalizer_name}") unless normalizer
|
31
|
+
|
32
|
+
normalized= normalizer.respond_to?(:normalize) ? normalizer.normalize(normalized,options) :
|
33
|
+
normalizer.call(normalized, options)
|
34
|
+
#puts "#{normalizer_name} : ->'#{normalized}' (#{normalized.class})"
|
19
35
|
end
|
20
|
-
|
21
|
-
else
|
22
|
-
value.is_a?(String) ? value.strip : value
|
36
|
+
normalized
|
23
37
|
end
|
24
|
-
normalized.nil? || (normalized.is_a?(String) && normalized == '') ? nil : normalized
|
25
38
|
end
|
39
|
+
|
26
40
|
self.send :private, "normalize_#{attribute}"
|
27
41
|
|
28
42
|
define_method "#{attribute}=" do |value|
|
data/lib/attribute_normalizer.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
require 'attribute_normalizer/normalizers/blank_normalizer'
|
2
|
+
require 'attribute_normalizer/normalizers/phone_normalizer'
|
3
|
+
require 'attribute_normalizer/normalizers/strip_normalizer'
|
4
|
+
|
1
5
|
module AttributeNormalizer
|
2
6
|
|
3
7
|
class MissingNormalizer < ArgumentError; end
|
@@ -11,11 +15,23 @@ module AttributeNormalizer
|
|
11
15
|
yield(configuration)
|
12
16
|
end
|
13
17
|
|
18
|
+
|
14
19
|
class Configuration
|
15
|
-
attr_accessor :normalizers
|
20
|
+
attr_accessor :default_normalizers, :normalizers
|
21
|
+
|
22
|
+
def default_normalizers=(normalizers)
|
23
|
+
@default_normalizers = normalizers.is_a?(Array) ? normalizers : [ normalizers ]
|
24
|
+
end
|
25
|
+
|
16
26
|
def initialize
|
17
27
|
@normalizers = {}
|
28
|
+
@normalizers[ :blank ] = AttributeNormalizer::Normalizers::BlankNormalizer
|
29
|
+
@normalizers[ :phone ] = AttributeNormalizer::Normalizers::PhoneNormalizer
|
30
|
+
@normalizers[ :strip ] = AttributeNormalizer::Normalizers::StripNormalizer
|
31
|
+
@default_normalizers = [ :strip, :blank ]
|
18
32
|
end
|
33
|
+
|
34
|
+
|
19
35
|
end
|
20
36
|
|
21
37
|
end
|
@@ -24,7 +40,6 @@ end
|
|
24
40
|
require 'attribute_normalizer/model_inclusions'
|
25
41
|
require 'attribute_normalizer/rspec_matcher'
|
26
42
|
|
27
|
-
|
28
43
|
def include_attribute_normalizer(class_or_module)
|
29
44
|
return if class_or_module.include?(AttributeNormalizer)
|
30
45
|
class_or_module.class_eval do
|
data/spec/author_spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
describe Author do
|
4
|
+
|
5
|
+
context 'Testing the built in normalizers' do
|
6
|
+
# default normalization [ :strip, :blank ]
|
7
|
+
it { should normalize_attribute(:name) }
|
8
|
+
it { should normalize_attribute(:name).from(' this ').to('this') }
|
9
|
+
it { should normalize_attribute(:name).from(' ').to(nil) }
|
10
|
+
|
11
|
+
# :strip normalizer
|
12
|
+
it { should normalize_attribute(:first_name).from(' this ').to('this') }
|
13
|
+
it { should normalize_attribute(:first_name).from(' ').to('') }
|
14
|
+
|
15
|
+
# :blank normalizer
|
16
|
+
it { should normalize_attribute(:last_name).from('').to(nil) }
|
17
|
+
it { should normalize_attribute(:last_name).from(' this ').to(' this ') }
|
18
|
+
|
19
|
+
# :phone normalizer
|
20
|
+
it { should normalize_attribute(:phone_number).from('no-numbers-here').to(nil) }
|
21
|
+
it { should normalize_attribute(:phone_number).from('1.877.987.9875').to('18779879875') }
|
22
|
+
it { should normalize_attribute(:phone_number).from('+ 1 (877) 987-9875').to('18779879875') }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/spec/book_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe Book do
|
|
7
7
|
it { should normalize_attribute(:us_price).from('$3.50').to(3.50) }
|
8
8
|
it { should normalize_attribute(:cnd_price).from('$3,450.98').to(3450.98) }
|
9
9
|
|
10
|
-
it { should normalize_attribute(:summary).from('Here is my summary that is a little to long').to('Here is m...') }
|
10
|
+
it { should normalize_attribute(:summary).from(' Here is my summary that is a little to long ').to('Here is m...') }
|
11
11
|
|
12
12
|
it { should normalize_attribute(:title).from('pick up chicks with magic tricks').to('Pick Up Chicks With Magic Tricks') }
|
13
13
|
|
@@ -44,4 +44,9 @@ describe Book do
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
+
context 'with the default normalizer changed' do
|
48
|
+
@book = Book.new :author => 'testing the default normalizer'
|
49
|
+
@book.author.should == 'testing the default normalizer'
|
50
|
+
end
|
51
|
+
|
47
52
|
end
|
@@ -5,6 +5,13 @@ ActiveRecord::Base.establish_connection({
|
|
5
5
|
})
|
6
6
|
|
7
7
|
ActiveRecord::Schema.define do
|
8
|
+
create_table :authors, :force => true do |t|
|
9
|
+
t.string :name
|
10
|
+
t.string :first_name
|
11
|
+
t.string :last_name
|
12
|
+
t.string :phone_number
|
13
|
+
end
|
14
|
+
|
8
15
|
create_table :books, :force => true do |t|
|
9
16
|
t.string :author
|
10
17
|
t.string :isbn
|
data/spec/models/author.rb
CHANGED
@@ -1,13 +1,8 @@
|
|
1
|
-
class Author <
|
1
|
+
class Author < ActiveRecord::Base
|
2
2
|
|
3
|
-
normalize_attribute
|
4
|
-
|
5
|
-
normalize_attribute
|
6
|
-
|
7
|
-
normalize_attributes :biography, :with => :truncate, :length => 12
|
8
|
-
|
9
|
-
normalize_attributes :email_address do |value|
|
10
|
-
value.is_a?(String) ? value.titleize.strip : value
|
11
|
-
end
|
3
|
+
normalize_attribute :name
|
4
|
+
normalize_attribute :first_name, :with => :strip
|
5
|
+
normalize_attribute :last_name, :with => :blank
|
6
|
+
normalize_attribute :phone_number, :with => :phone
|
12
7
|
|
13
8
|
end
|
data/spec/models/book.rb
CHANGED
@@ -4,7 +4,11 @@ class Book < ActiveRecord::Base
|
|
4
4
|
|
5
5
|
normalize_attribute :us_price, :cnd_price, :with => :currency
|
6
6
|
|
7
|
-
normalize_attributes :summary, :with => :
|
7
|
+
normalize_attributes :summary, :with => [ :strip,
|
8
|
+
{ :truncate => { :length => 12 } },
|
9
|
+
:blank
|
10
|
+
]
|
11
|
+
|
8
12
|
|
9
13
|
normalize_attributes :title do |value|
|
10
14
|
value.is_a?(String) ? value.titleize.strip : value
|
data/spec/test_helper.rb
CHANGED
@@ -3,6 +3,7 @@ require 'spec'
|
|
3
3
|
require 'active_record'
|
4
4
|
|
5
5
|
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
|
6
|
+
|
6
7
|
require 'attribute_normalizer'
|
7
8
|
|
8
9
|
|
@@ -23,11 +24,18 @@ AttributeNormalizer.configure do |config|
|
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
27
|
+
config.normalizers[:special_normalizer] = lambda do |value, options|
|
28
|
+
(value.is_a?(String) && value.match(/testing the default normalizer/)) ? 'testing the default normalizer' : value
|
29
|
+
end
|
30
|
+
|
31
|
+
config.default_normalizers = :strip, :special_normalizer, :blank
|
32
|
+
|
26
33
|
end
|
27
34
|
|
28
35
|
|
29
36
|
require 'connection_and_schema'
|
30
37
|
require 'models/book'
|
38
|
+
require 'models/author'
|
31
39
|
|
32
40
|
|
33
41
|
Spec::Runner.configure do |config|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attribute_normalizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Michael Deering
|
@@ -35,9 +35,13 @@ files:
|
|
35
35
|
- install.txt
|
36
36
|
- lib/attribute_normalizer.rb
|
37
37
|
- lib/attribute_normalizer/model_inclusions.rb
|
38
|
+
- lib/attribute_normalizer/normalizers/blank_normalizer.rb
|
39
|
+
- lib/attribute_normalizer/normalizers/phone_normalizer.rb
|
40
|
+
- lib/attribute_normalizer/normalizers/strip_normalizer.rb
|
38
41
|
- lib/attribute_normalizer/rspec_matcher.rb
|
39
42
|
- rails/init.rb
|
40
43
|
- spec/attribute_normalizer_spec.rb
|
44
|
+
- spec/author_spec.rb
|
41
45
|
- spec/book_spec.rb
|
42
46
|
- spec/connection_and_schema.rb
|
43
47
|
- spec/models/author.rb
|
@@ -81,6 +85,7 @@ specification_version: 3
|
|
81
85
|
summary: Attribute normalizer that excepts code blocks.
|
82
86
|
test_files:
|
83
87
|
- spec/attribute_normalizer_spec.rb
|
88
|
+
- spec/author_spec.rb
|
84
89
|
- spec/book_spec.rb
|
85
90
|
- spec/connection_and_schema.rb
|
86
91
|
- spec/models/author.rb
|