mask_validator 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
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