mask_validator 0.2 → 0.2.1

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.markdown CHANGED
@@ -8,7 +8,9 @@ The gem works getting the value before type cast and comparing with a regexp fro
8
8
 
9
9
  ## Installation
10
10
 
11
- `gem "mask_validator"`
11
+ Use the github version until a really stable version be released.
12
+
13
+ `gem "mask_validator", :git => "git://github.com/MarceloCajueiro/mask_validator.git"`
12
14
 
13
15
  ## Usage:
14
16
 
@@ -16,6 +18,10 @@ The gem works getting the value before type cast and comparing with a regexp fro
16
18
 
17
19
  `validates :acronym, mask: "***"`
18
20
 
21
+ `validates :acronym, mask: :custom_method`
22
+
23
+ `validates :acronym, mask: Proc.new{|o| o.custom_method}`
24
+
19
25
  * a - Represents an alpha character (A-Z,a-z)
20
26
  * 9 - Represents a numeric character (0-9)
21
27
  * * - Represents an alphanumeric character (A-Z,a-z,0-9)
@@ -13,47 +13,58 @@ class MaskValidator < ActiveModel::EachValidator
13
13
  # 9 - to numbers (0-9)
14
14
  # * - to alphanumerics (A-Z, a-z, 0-9)
15
15
  #
16
+ def initialize(options)
17
+ @allow_nil, @allow_blank = options.delete(:allow_nil), options.delete(:allow_blank)
18
+
19
+ super
20
+ end
21
+
16
22
  def validate_each(record, attribute, value)
17
23
  value = record.send("#{attribute.to_s}_before_type_cast")
18
24
 
19
- if value.nil?
20
- record.errors.add(attribute, :blank) unless allow_nil?
21
- end
25
+ return if (@allow_nil && value.nil?) || (@allow_blank && value.blank?)
22
26
 
23
- if value.blank?
24
- record.errors.add(attribute, :empty) unless allow_blank?
25
- else
26
- record.errors.add(attribute, message, options) unless value.match(regexp)
27
- end
27
+ record.errors.add(attribute, message, options) unless value.to_s.match regexp(record)
28
28
  end
29
29
 
30
30
  #
31
31
  # Transform the string in a regular expression:
32
32
  #
33
- # options[:with] = "9a"
33
+ # mask_value_for(record) => "9a"
34
34
  #
35
35
  # regexp #=> /[0-9][a-zA-Z]/
36
36
  #
37
37
  # TODO: improve this
38
- def regexp
39
- /\A#{(options[:with].to_s.each_char.collect { |char| character_map[char] || "\\#{char}" }).join}\z/
38
+ def regexp(record=nil)
39
+ /\A#{(mask_value_for(record).to_s.each_char.collect { |char| character_map[char] || "\\#{char}" }).join}\z/
40
40
  end
41
41
 
42
42
  def character_map
43
43
  { "9" => "[0-9]", "a" => "[a-zA-Z]", "*" => "[a-zA-Z0-9]" }
44
44
  end
45
45
 
46
+ #
47
+ # Evaluate the options[:with] according with its class:
48
+ #
49
+ # options[:with] = :custom_mask
50
+ # options[:with] = Proc.new {|o| o.custom_mask}
51
+ # options[:with] = "9a"
52
+ #
53
+ # TODO: improve this
54
+ def mask_value_for(record=nil)
55
+ case options[:with]
56
+ when String
57
+ options[:with]
58
+ when Proc
59
+ options[:with].call(record)
60
+ when Symbol
61
+ record.send(options[:with])
62
+ end
63
+ end
64
+
46
65
  private
47
66
 
48
67
  def message
49
68
  options[:message]
50
69
  end
51
-
52
- def allow_nil?
53
- options.include?(:allow_nil) && options[:allow_nil] == false ? false : true
54
- end
55
-
56
- def allow_blank?
57
- options.include?(:allow_blank) && options[:allow_blank] == false ? false : true
58
- end
59
70
  end
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "mask_validator"
6
- s.version = "0.2"
6
+ s.version = "0.2.1"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Marcelo Cajueiro"]
9
9
  s.email = ["marcelocajueiro@gmail.com"]
@@ -2,124 +2,147 @@ require 'spec_helper'
2
2
 
3
3
  describe MaskValidator do
4
4
  subject do
5
- Person.new :phone => '(12) 3456-7890',
6
- :fax => '(12) 3456-7890',
7
- :acronym => 'ABC',
8
- :alphanumeric => 'AAA666',
9
- :zip_code => '88900-000',
10
- :birth_date => '13/10/1989',
11
- :birth_time => '10:20',
12
- :birth_year => '2011',
13
- :body_fat => '23,44'
14
- end
15
-
16
- it "Person should be valid" do
17
- subject.should be_valid
5
+ Person.new
18
6
  end
19
7
 
20
8
  # validates :phone, :mask => "(99) 9999-9999", :allow_blank => true
21
- context "mask validation to phone with explicit ':allow_blank => true'" do
22
- it "should be valid with a nil phone" do
23
- subject.phone = nil
24
- subject.should be_valid
25
- end
26
-
27
- it "should be valid with an empty phone" do
28
- subject.phone = ''
29
- subject.should be_valid
30
- end
31
-
9
+ context "mask validation to phone" do
32
10
  it "should be valid with a phone in according of the mask" do
33
11
  subject.phone = '(48) 9874-4569'
34
- subject.should be_valid
12
+ subject.should have_valid_value_to(:phone)
35
13
  end
36
14
 
37
15
  it "should not be valid with a phone with a wrong pattern" do
38
16
  subject.phone = '4852458787'
39
- subject.should_not be_valid
17
+ subject.should_not have_valid_value_to(:phone)
40
18
 
41
19
  subject.phone = '48 9865 4879'
42
- subject.should_not be_valid
20
+ subject.should_not have_valid_value_to(:phone)
43
21
 
44
22
  subject.phone = '(48) 9874-45169'
45
- subject.should_not be_valid
23
+ subject.should_not have_valid_value_to(:phone)
46
24
 
47
25
  subject.phone = '(48)98956698'
48
- subject.should_not be_valid
26
+ subject.should_not have_valid_value_to(:phone)
49
27
  end
50
28
  end
51
29
 
52
30
  # validates :acronym, :mask => "***", :allow_nil => true
53
- context "mask validation to acronym with explicit ':allow_nil => true'" do
54
- it "should be valid with an nil acronym" do
55
- subject.acronym = nil
56
- subject.should be_valid
57
- end
58
-
59
- it "should be valid with an empty acronym" do
60
- subject.acronym = ''
61
- subject.should be_valid
62
- end
63
-
31
+ context "mask validation to acronym" do
64
32
  it "should be valid with a acronym in according of the mask" do
65
33
  subject.acronym = '1gd'
66
- subject.should be_valid
34
+ subject.should have_valid_value_to(:acronym)
67
35
 
68
36
  subject.acronym = '666'
69
- subject.should be_valid
37
+ subject.should have_valid_value_to(:acronym)
70
38
 
71
39
  subject.acronym = 'zzz'
72
- subject.should be_valid
40
+ subject.should have_valid_value_to(:acronym)
73
41
  end
74
42
 
75
43
  it "should not be valid with a acronym with a wrong pattern" do
76
44
  subject.acronym = '1qw1'
77
- subject.should_not be_valid
45
+ subject.should_not have_valid_value_to(:acronym)
78
46
  end
79
47
  end
80
48
 
81
49
  # validates :alphanumeric, :mask => "aaa999"
82
- context "mask validation to alphanumeric with implicit ':allow_nil => true' and ':allow_blank => true'" do
83
- it "should be valid with an nil alphanumeric" do
84
- subject.alphanumeric = nil
85
- subject.should be_valid
86
- end
87
-
88
- it "should be valid with an empty alphanumeric" do
89
- subject.alphanumeric = ''
90
- subject.should be_valid
91
- end
92
-
50
+ context "mask validation to alphanumeric" do
93
51
  it "should be valid with a alphanumeric in according of the mask" do
94
52
  subject.alphanumeric = 'awe987'
95
- subject.should be_valid
53
+ subject.should have_valid_value_to(:alphanumeric)
96
54
  end
97
55
 
98
56
  it "should not be valid with a alphanumeric with a wrong pattern" do
99
57
  subject.alphanumeric = '999999'
100
- subject.should_not be_valid
58
+ subject.should_not have_valid_value_to(:alphanumeric)
101
59
 
102
60
  subject.alphanumeric = 'QQQQQQ'
103
- subject.should_not be_valid
61
+ subject.should_not have_valid_value_to(:alphanumeric)
104
62
 
105
63
  subject.alphanumeric = '666aaaa'
106
- subject.should_not be_valid
64
+ subject.should_not have_valid_value_to(:alphanumeric)
107
65
 
108
66
  subject.alphanumeric = '666AAA'
109
- subject.should_not be_valid
67
+ subject.should_not have_valid_value_to(:alphanumeric)
110
68
  end
111
69
  end
112
70
 
113
- # validates :zip_code, :mask => "99999-999", :allow_blank => false
114
- context "mask validation to zip code with explicit ':allow_blank => false'" do
115
- it "should not be valid with an nil zip code" do
116
- subject.zip_code = nil
117
- subject.should_not be_valid
71
+ context "when the attributes type is not a string" do
72
+ it "should not be valid with a wrong date format" do
73
+ subject.birth_date = "15-12-2009"
74
+ subject.should_not have_valid_value_to(:birth_date)
118
75
  end
119
76
 
120
- it "should not be valid with an empty zip code" do
121
- subject.zip_code = ''
122
- subject.should_not be_valid
77
+ it "should not be valid with a wrong birth year" do
78
+ subject.birth_year = 20110
79
+ subject.should_not have_valid_value_to(:birth_year)
80
+ end
81
+
82
+ it "should not be valid with a wrong birth time" do
83
+ subject.birth_time = "333:20"
84
+ subject.should_not have_valid_value_to(:birth_time)
85
+ end
86
+
87
+ it "should not be valid with a wrong body fat" do
88
+ subject.body_fat = 333.00
89
+ subject.should_not have_valid_value_to(:body_fat)
90
+ end
91
+ end
92
+
93
+ # validates :custom, :mask => :custom_mask, :allow_blank => false
94
+ context "mask validation to custom field using custom_mask method" do
95
+ it "should be valid with an correct custom value" do
96
+ subject.stub!(:custom_mask => "99999-999")
97
+ subject.custom = '32632-567'
98
+ subject.should have_valid_value_to(:custom)
99
+ end
100
+
101
+ it "should not be valid with an empty custom value" do
102
+ subject.stub!(:custom_mask => "9.9.9")
103
+ subject.custom = ''
104
+ subject.should_not have_valid_value_to(:custom)
105
+ end
106
+ end
107
+
108
+ # validates :identification, :mask => Proc.new{|o| o.proc_mask}, :allow_blank => false
109
+ context "mask validation to proc field using a Proc" do
110
+ it "should be valid with an correct value" do
111
+ subject.stub!(:proc_mask => "999.9.99")
112
+ subject.identification = '326.3.67'
113
+ subject.should have_valid_value_to(:identification)
114
+ end
115
+
116
+ it "should not be valid with an empty value" do
117
+ subject.stub!(:prock_mask => "9.9.9")
118
+ subject.identification = ''
119
+ subject.should_not have_valid_value_to(:identification)
120
+ end
121
+ end
122
+
123
+ # validates :phone, :mask => "99999-999", :allow_blank => true
124
+ context "mask validation to phone with explicit ':allow_blank => true'" do
125
+ it "should not be valid with an nil phone" do
126
+ subject.phone = nil
127
+ subject.should have_valid_value_to(:phone)
128
+ end
129
+
130
+ it "should be valid with an empty phone" do
131
+ subject.phone = ''
132
+ subject.should have_valid_value_to(:phone)
133
+ end
134
+ end
135
+
136
+ # validates :acronym, :mask => "***", :allow_nil => true
137
+ context "mask validation to acronym with explicit ':allow_nil => true'" do
138
+ it "should be valid with an nil acronym" do
139
+ subject.acronym = nil
140
+ subject.should have_valid_value_to(:acronym)
141
+ end
142
+
143
+ it "should be valid with an empty acronym" do
144
+ subject.acronym = ''
145
+ subject.should_not have_valid_value_to(:acronym)
123
146
  end
124
147
  end
125
148
 
@@ -127,34 +150,38 @@ describe MaskValidator do
127
150
  context "mask validation to fax with explicit ':allow_nil => false'" do
128
151
  it "should not be valid with an nil fax" do
129
152
  subject.fax = nil
130
- subject.should_not be_valid
153
+ subject.should_not have_valid_value_to(:fax)
131
154
  end
132
155
 
133
156
  it "should be valid with an empty fax" do
134
157
  subject.fax = ''
135
- subject.should be_valid
158
+ subject.should_not have_valid_value_to(:fax)
136
159
  end
137
160
  end
138
161
 
139
- context "when the attributes type is not a string" do
140
- it "should not be valid with a wrong date format" do
141
- subject.birth_date = "15-12-2009"
142
- subject.should be_invalid
162
+ # validates :zip_code, :mask => "99999-999", :allow_blank => false
163
+ context "mask validation to zip_code with explicit ':allow_blank => false'" do
164
+ it "should not be valid with an nil zip_code" do
165
+ subject.zip_code = nil
166
+ subject.should_not have_valid_value_to(:zip_code)
143
167
  end
144
168
 
145
- it "should not be valid with a wrong birth year" do
146
- subject.birth_year = "20110"
147
- subject.should be_invalid
169
+ it "should be valid with an empty zip_code" do
170
+ subject.zip_code = ''
171
+ subject.should_not have_valid_value_to(:zip_code)
148
172
  end
173
+ end
149
174
 
150
- it "should not be valid with a wrong birth time" do
151
- subject.birth_time = "333:20"
152
- subject.should be_invalid
175
+ # validates :birth_date, :mask => '99/99/9999'
176
+ context "mask validation to birth_date with implicit ':allow_blank => false'" do
177
+ it "should not be valid with an nil birth_date" do
178
+ subject.birth_date = nil
179
+ subject.should_not have_valid_value_to(:birth_date)
153
180
  end
154
181
 
155
- it "should not be valid with a wrong body fat" do
156
- subject.birth_time = "333,00%"
157
- subject.should be_invalid
182
+ it "should be valid with an empty birth_date" do
183
+ subject.birth_date = ''
184
+ subject.should_not have_valid_value_to(:birth_date)
158
185
  end
159
186
  end
160
187
  end
@@ -1,11 +1,21 @@
1
1
  class Person < ActiveRecord::Base
2
- validates :phone, :mask => "(99) 9999-9999", :allow_blank => true
3
- validates :fax, :mask => "(99) 9999-9999", :allow_nil => false
4
- validates :acronym, :mask => "***", :allow_nil => true
5
- validates :alphanumeric, :mask => "aaa999"
6
- validates :zip_code, :mask => "99999-999", :allow_blank => false
7
- validates :birth_date, :mask => '99/99/9999'
8
- validates :birth_time, :mask => '99:99'
9
- validates :birth_year, :mask => '9999'
10
- validates :body_fat, :mask => "99,99"
2
+ validates :phone, :mask => "(99) 9999-9999", :allow_blank => true
3
+ validates :fax, :mask => "(99) 9999-9999", :allow_nil => false
4
+ validates :acronym, :mask => "***", :allow_nil => true
5
+ validates :alphanumeric, :mask => "aaa999"
6
+ validates :zip_code, :mask => "99999-999", :allow_blank => false
7
+ validates :birth_date, :mask => '99/99/9999'
8
+ validates :birth_time, :mask => '99:99'
9
+ validates :birth_year, :mask => '9999'
10
+ validates :body_fat, :mask => "99,99"
11
+ validates :custom, :mask => :custom_mask, :allow_blank => false
12
+ validates :identification, :mask => Proc.new{|o| o.proc_mask}, :allow_blank => false
13
+
14
+ def custom_mask
15
+ "999.99"
16
+ end
17
+
18
+ def proc_mask
19
+ "99.99"
20
+ end
11
21
  end
data/spec/spec_helper.rb CHANGED
@@ -5,3 +5,19 @@ require 'mask_validator'
5
5
 
6
6
  require "support/db/schema"
7
7
  require "support/models/person"
8
+
9
+ RSpec::Matchers.define :have_valid_value_to do |attribute|
10
+ match do |actual|
11
+ actual.valid?
12
+
13
+ !actual.errors[attribute].include?("is invalid")
14
+ end
15
+
16
+ failure_message_for_should do |actual|
17
+ "expected that the #{attribute} attribute would be valid"
18
+ end
19
+
20
+ failure_message_for_should_not do |actual|
21
+ "expected that the #{attribute} attribute would be invalid"
22
+ end
23
+ end
@@ -16,5 +16,7 @@ ActiveRecord::Schema.define do
16
16
  t.integer :birth_year
17
17
  t.date :birth_date
18
18
  t.datetime :birth_time
19
+ t.string :custom
20
+ t.string :identification
19
21
  end
20
22
  end
@@ -1,11 +1,21 @@
1
1
  class Person < ActiveRecord::Base
2
- validates :phone, :mask => "(99) 9999-9999", :allow_blank => true
3
- validates :fax, :mask => "(99) 9999-9999", :allow_nil => false
4
- validates :acronym, :mask => "***", :allow_nil => true
5
- validates :alphanumeric, :mask => "aaa999"
6
- validates :zip_code, :mask => "99999-999", :allow_blank => false
7
- validates :birth_date, :mask => '99/99/9999'
8
- validates :birth_time, :mask => '99:99'
9
- validates :birth_year, :mask => '9999'
10
- validates :body_fat, :mask => "99,99"
2
+ validates :phone, :mask => "(99) 9999-9999", :allow_blank => true
3
+ validates :fax, :mask => "(99) 9999-9999", :allow_nil => false
4
+ validates :acronym, :mask => "***", :allow_nil => true
5
+ validates :alphanumeric, :mask => "aaa999"
6
+ validates :zip_code, :mask => "99999-999", :allow_blank => false
7
+ validates :birth_date, :mask => '99/99/9999'
8
+ validates :birth_time, :mask => '99:99'
9
+ validates :birth_year, :mask => '9999'
10
+ validates :body_fat, :mask => "99,99"
11
+ validates :custom, :mask => :custom_mask, :allow_blank => false
12
+ validates :identification, :mask => Proc.new{|o| o.proc_mask}, :allow_blank => false
13
+
14
+ def custom_mask
15
+ "999.99"
16
+ end
17
+
18
+ def proc_mask
19
+ "99.99"
20
+ end
11
21
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mask_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-20 00:00:00.000000000 Z
12
+ date: 2012-04-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
16
- requirement: &70361744263680 !ruby/object:Gem::Requirement
16
+ requirement: &70113695766940 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70361744263680
24
+ version_requirements: *70113695766940
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activerecord
27
- requirement: &70361744262500 !ruby/object:Gem::Requirement
27
+ requirement: &70113695766380 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '3.0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70361744262500
35
+ version_requirements: *70113695766380
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &70361744260860 !ruby/object:Gem::Requirement
38
+ requirement: &70113695765640 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 0.8.7
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70361744260860
46
+ version_requirements: *70113695765640
47
47
  description:
48
48
  email:
49
49
  - marcelocajueiro@gmail.com
@@ -84,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  version: '0'
85
85
  requirements: []
86
86
  rubyforge_project: mask_validator
87
- rubygems_version: 1.8.10
87
+ rubygems_version: 1.8.17
88
88
  signing_key:
89
89
  specification_version: 3
90
90
  summary: Input Mask validation for ActiveModel