mask_validator 0.1 → 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- # Specify your gem's dependencies in mask_validator.gemspec
4
3
  gemspec
4
+
5
+ group :test do
6
+ gem "rspec"
7
+ gem "sqlite3"
8
+ end
data/README.markdown CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  This gem was inspired in the Sobrinho's gems to validate simple things inside of ActiveModel.
4
4
 
5
- Use mask in inputs and validate then in the models.
5
+ Use mask in inputs and validate in the models.
6
+
7
+ The gem works getting the value before type cast and comparing with a regexp from the mask pattern.
6
8
 
7
9
  ## Installation
8
10
 
data/Rakefile CHANGED
@@ -1,11 +1,2 @@
1
- require "bundler/gem_tasks"
2
- require 'rake/testtask'
3
-
1
+ require "bundler"
4
2
  Bundler::GemHelper.install_tasks
5
-
6
- task :default => :test
7
-
8
- Rake::TestTask.new(:test) do |t|
9
- t.libs << 'test'
10
- t.pattern = 'test/**/*_test.rb'
11
- end
@@ -2,27 +2,58 @@ class MaskValidator < ActiveModel::EachValidator
2
2
 
3
3
  #
4
4
  # This validator use the characters 'a', '9' and '*'
5
- # to validate the form of the content
5
+ # to validate the format with regular expression
6
6
  #
7
7
  # Example using in models:
8
- # validates :phone, mask: "(99) 9999-9999"
9
- # validates :acronym, mask: "***"
8
+ # validates :phone, :mask => "(99) 9999-9999"
9
+ # validates :acronym, :mask => "***"
10
10
  #
11
11
  # Where:
12
- # a - Represents an alpha character (A-Z,a-z)
13
- # 9 - Represents a numeric character (0-9)
14
- # * - Represents an alphanumeric character (A-Z,a-z,0-9)
12
+ # a - to letters (A-Z, a-z)
13
+ # 9 - to numbers (0-9)
14
+ # * - to alphanumerics (A-Z, a-z, 0-9)
15
15
  #
16
- # TODO: refactoring
17
16
  def validate_each(record, attribute, value)
18
- return true if value.nil? || value.empty?
17
+ value = record.send("#{attribute.to_s}_before_type_cast")
19
18
 
20
- definitions = { "9" => "[0-9]", "a" => "[a-zA-Z]", "*" => "[a-zA-Z0-9]" }
21
- regex = /#{(options[:with].to_s.each_char.collect { |char| definitions[char] || "\\#{char}" }).join}/
19
+ if value.nil?
20
+ record.errors.add(attribute, :blank) unless allow_nil?
21
+ end
22
22
 
23
- match = value.match(regex)
24
- unless match && match.to_s == value
25
- record.errors.add(attribute, options[:message])
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)
26
27
  end
27
28
  end
29
+
30
+ #
31
+ # Transform the string in a regular expression:
32
+ #
33
+ # options[:with] = "9a"
34
+ #
35
+ # regexp #=> /[0-9][a-zA-Z]/
36
+ #
37
+ # TODO: improve this
38
+ def regexp
39
+ /\A#{(options[:with].to_s.each_char.collect { |char| character_map[char] || "\\#{char}" }).join}\z/
40
+ end
41
+
42
+ def character_map
43
+ { "9" => "[0-9]", "a" => "[a-zA-Z]", "*" => "[a-zA-Z0-9]" }
44
+ end
45
+
46
+ private
47
+
48
+ def message
49
+ options[:message]
50
+ 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
28
59
  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.1"
6
+ s.version = "0.2"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Marcelo Cajueiro"]
9
9
  s.email = ["marcelocajueiro@gmail.com"]
@@ -18,6 +18,6 @@ Gem::Specification.new do |s|
18
18
  s.require_paths = ["lib"]
19
19
 
20
20
  s.add_dependency 'activemodel', ">= 3.0"
21
+ s.add_dependency 'activerecord', ">= 3.0"
21
22
  s.add_development_dependency 'rake', '>= 0.8.7'
22
-
23
23
  end
@@ -0,0 +1,160 @@
1
+ require 'spec_helper'
2
+
3
+ describe MaskValidator do
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
18
+ end
19
+
20
+ # 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
+
32
+ it "should be valid with a phone in according of the mask" do
33
+ subject.phone = '(48) 9874-4569'
34
+ subject.should be_valid
35
+ end
36
+
37
+ it "should not be valid with a phone with a wrong pattern" do
38
+ subject.phone = '4852458787'
39
+ subject.should_not be_valid
40
+
41
+ subject.phone = '48 9865 4879'
42
+ subject.should_not be_valid
43
+
44
+ subject.phone = '(48) 9874-45169'
45
+ subject.should_not be_valid
46
+
47
+ subject.phone = '(48)98956698'
48
+ subject.should_not be_valid
49
+ end
50
+ end
51
+
52
+ # 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
+
64
+ it "should be valid with a acronym in according of the mask" do
65
+ subject.acronym = '1gd'
66
+ subject.should be_valid
67
+
68
+ subject.acronym = '666'
69
+ subject.should be_valid
70
+
71
+ subject.acronym = 'zzz'
72
+ subject.should be_valid
73
+ end
74
+
75
+ it "should not be valid with a acronym with a wrong pattern" do
76
+ subject.acronym = '1qw1'
77
+ subject.should_not be_valid
78
+ end
79
+ end
80
+
81
+ # 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
+
93
+ it "should be valid with a alphanumeric in according of the mask" do
94
+ subject.alphanumeric = 'awe987'
95
+ subject.should be_valid
96
+ end
97
+
98
+ it "should not be valid with a alphanumeric with a wrong pattern" do
99
+ subject.alphanumeric = '999999'
100
+ subject.should_not be_valid
101
+
102
+ subject.alphanumeric = 'QQQQQQ'
103
+ subject.should_not be_valid
104
+
105
+ subject.alphanumeric = '666aaaa'
106
+ subject.should_not be_valid
107
+
108
+ subject.alphanumeric = '666AAA'
109
+ subject.should_not be_valid
110
+ end
111
+ end
112
+
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
118
+ end
119
+
120
+ it "should not be valid with an empty zip code" do
121
+ subject.zip_code = ''
122
+ subject.should_not be_valid
123
+ end
124
+ end
125
+
126
+ # validates :fax, :mask => "(99) 9999-9999", :allow_nil => false
127
+ context "mask validation to fax with explicit ':allow_nil => false'" do
128
+ it "should not be valid with an nil fax" do
129
+ subject.fax = nil
130
+ subject.should_not be_valid
131
+ end
132
+
133
+ it "should be valid with an empty fax" do
134
+ subject.fax = ''
135
+ subject.should be_valid
136
+ end
137
+ end
138
+
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
143
+ end
144
+
145
+ it "should not be valid with a wrong birth year" do
146
+ subject.birth_year = "20110"
147
+ subject.should be_invalid
148
+ end
149
+
150
+ it "should not be valid with a wrong birth time" do
151
+ subject.birth_time = "333:20"
152
+ subject.should be_invalid
153
+ end
154
+
155
+ it "should not be valid with a wrong body fat" do
156
+ subject.birth_time = "333,00%"
157
+ subject.should be_invalid
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,11 @@
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"
11
+ end
@@ -0,0 +1,7 @@
1
+ require 'rspec'
2
+ require 'active_model'
3
+ require 'active_record'
4
+ require 'mask_validator'
5
+
6
+ require "support/db/schema"
7
+ require "support/models/person"
@@ -0,0 +1,20 @@
1
+ ActiveRecord::Base.establish_connection(
2
+ :adapter => "sqlite3",
3
+ :database => ":memory:"
4
+ )
5
+
6
+ ActiveRecord::Schema.define do
7
+ self.verbose = false
8
+
9
+ create_table :people do |t|
10
+ t.string :phone
11
+ t.string :acronym
12
+ t.string :alphanumeric
13
+ t.string :zip_code
14
+ t.string :fax
15
+ t.decimal :body_fat
16
+ t.integer :birth_year
17
+ t.date :birth_date
18
+ t.datetime :birth_time
19
+ end
20
+ end
@@ -0,0 +1,11 @@
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"
11
+ 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.1'
4
+ version: '0.2'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-07 00:00:00.000000000 -03:00
13
- default_executable:
12
+ date: 2012-01-20 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: activemodel
17
- requirement: &78039790 !ruby/object:Gem::Requirement
16
+ requirement: &70361744263680 !ruby/object:Gem::Requirement
18
17
  none: false
19
18
  requirements:
20
19
  - - ! '>='
@@ -22,10 +21,21 @@ dependencies:
22
21
  version: '3.0'
23
22
  type: :runtime
24
23
  prerelease: false
25
- version_requirements: *78039790
24
+ version_requirements: *70361744263680
25
+ - !ruby/object:Gem::Dependency
26
+ name: activerecord
27
+ requirement: &70361744262500 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70361744262500
26
36
  - !ruby/object:Gem::Dependency
27
37
  name: rake
28
- requirement: &78033190 !ruby/object:Gem::Requirement
38
+ requirement: &70361744260860 !ruby/object:Gem::Requirement
29
39
  none: false
30
40
  requirements:
31
41
  - - ! '>='
@@ -33,7 +43,7 @@ dependencies:
33
43
  version: 0.8.7
34
44
  type: :development
35
45
  prerelease: false
36
- version_requirements: *78033190
46
+ version_requirements: *70361744260860
37
47
  description:
38
48
  email:
39
49
  - marcelocajueiro@gmail.com
@@ -42,15 +52,18 @@ extensions: []
42
52
  extra_rdoc_files: []
43
53
  files:
44
54
  - .gitignore
55
+ - .rspec
45
56
  - Gemfile
46
57
  - MIT-LICENSE
47
58
  - README.markdown
48
59
  - Rakefile
49
60
  - lib/mask_validator.rb
50
61
  - mask_validator.gemspec
51
- - test/mask_validator_test.rb
52
- - test/test_helper.rb
53
- has_rdoc: true
62
+ - spec/mask_validator_spec.rb
63
+ - spec/models/person.rb
64
+ - spec/spec_helper.rb
65
+ - spec/support/db/schema.rb
66
+ - spec/support/models/person.rb
54
67
  homepage: https://github.com/marcelocajueiro/mask_validator
55
68
  licenses: []
56
69
  post_install_message:
@@ -71,8 +84,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
71
84
  version: '0'
72
85
  requirements: []
73
86
  rubyforge_project: mask_validator
74
- rubygems_version: 1.6.2
87
+ rubygems_version: 1.8.10
75
88
  signing_key:
76
89
  specification_version: 3
77
90
  summary: Input Mask validation for ActiveModel
78
- test_files: []
91
+ test_files:
92
+ - spec/mask_validator_spec.rb
93
+ - spec/models/person.rb
94
+ - spec/spec_helper.rb
95
+ - spec/support/db/schema.rb
96
+ - spec/support/models/person.rb
97
+ has_rdoc:
@@ -1,50 +0,0 @@
1
- require 'test_helper'
2
-
3
- class MaskValidatorTest < Test::Unit::TestCase
4
- def test_phones
5
- create_asserts('phone')
6
-
7
- assert_invalid '4852458787'
8
- assert_invalid '48 9865 4879'
9
- assert_invalid "(48)98956698"
10
- assert_invalid "(48) 9874-45169"
11
- assert_valid "(48) 9874-4569"
12
- end
13
-
14
- def test_acronyms
15
- create_asserts('acronym')
16
-
17
- assert_invalid '1qw1'
18
- assert_valid '1gd'
19
- assert_valid '666'
20
- assert_valid 'zzz'
21
- end
22
-
23
- def test_alphanumerics
24
- create_asserts('alphanumeric')
25
-
26
- assert_invalid '999999'
27
- assert_invalid 'QQQQQQ'
28
- assert_invalid '666AAAA'
29
- assert_invalid '666AAA'
30
- assert_valid 'AAA666'
31
- end
32
-
33
- protected
34
-
35
- def create_asserts(attr)
36
- class_eval <<-RUBY
37
- def assert_valid(value)
38
- assert person(:#{attr} => value).valid?
39
- end
40
-
41
- def assert_invalid(value)
42
- assert person(:#{attr} => value).invalid?
43
- end
44
- RUBY
45
- end
46
-
47
- def person(attributes = {})
48
- Person.new(attributes)
49
- end
50
- end
data/test/test_helper.rb DELETED
@@ -1,12 +0,0 @@
1
- require 'rubygems'
2
- require 'test/unit'
3
- require 'active_model'
4
- require 'mask_validator'
5
- require 'ostruct'
6
-
7
- class Person < OpenStruct
8
- include ActiveModel::Validations
9
- validates :phone, mask: "(99) 9999-9999"
10
- validates :acronym, mask: "***"
11
- validates :alphanumeric, mask: "aaa999"
12
- end