activevalidators 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: de64a7aa6feb36cf4d57acc13a620b8b26ad7b14
4
+ data.tar.gz: e9983a0c5dba7483e26f6594e704f0e01468c872
5
+ SHA512:
6
+ metadata.gz: d5df00615461a33d2c4a71ee15cddbc99e69cdff6759421dfd4289b913b2b1b51c6481d27feb42a8f821a9a55b07c9615293583ab9792ba8679946767176d042
7
+ data.tar.gz: 5908af5ffe6643ba5c8df5b981254c5652964833e1af5f8ee61acfc9ac493ead71f957ce5866c9a789ac417d357b18a48936e5185da4c7a9c164eaf967d491c3
data/.travis.yml CHANGED
@@ -1,11 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
- - ree
5
- - jruby-18mode
6
- - rbx-18mode
7
- - 1.9.2
8
3
  - 1.9.3
4
+ - 2.1.0
9
5
  - jruby-19mode
10
- - rbx-19mode
6
+ - rbx
11
7
  - ruby-head
8
+ - jruby-head
data/Gemfile CHANGED
@@ -1,2 +1,12 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
  gemspec
3
+
4
+ group :test do
5
+ platform :rbx do
6
+ gem 'rubysl-singleton'
7
+ gem 'rubysl-mutex_m'
8
+ gem 'rubysl-net-smtp'
9
+ gem 'rubysl-ipaddr'
10
+ gem 'rubysl-base64'
11
+ end
12
+ end
data/README.md CHANGED
@@ -19,6 +19,7 @@ In your models, the gem provides new validators like `email`, or `url`:
19
19
  validates :email_address, :email => true # == :email => { :strict => false }
20
20
  validates :link_url, :url => true
21
21
  validates :user_phone, :phone => true
22
+ validates :company_siren, :siren => true
22
23
  validates :password, :password => { :strength => :medium }
23
24
  validates :twitter_at, :twitter => { :format => :username_with_at }
24
25
  validates :twitter_url, :twitter => { :format => :url }
@@ -61,6 +62,7 @@ Exhaustive list of supported validators and their implementation:
61
62
  * `phone` : based on a set of predefined masks
62
63
  * `postal_code`: based on a set of predefined masks
63
64
  * `respond_to`
65
+ * `siren`
64
66
  * `slug` : based on `ActiveSupport::String#parameterize`
65
67
  * `tracking_number`: based on a set of predefined masks
66
68
  * `twitter` : based on a regular expression
@@ -98,4 +100,4 @@ Lots of improvements can be made:
98
100
 
99
101
  ## Copyright
100
102
 
101
- Copyright (c) 2010-2012 Franck Verrot. MIT LICENSE. See LICENSE for details.
103
+ Copyright (c) 2010-2014 Franck Verrot. MIT LICENSE. See LICENSE for details.
@@ -1,20 +1,21 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = 'activevalidators'
4
- s.version = '2.0.2'
4
+ s.version = '2.1.0'
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.authors = ['Franck Verrot', 'Paco Guzmán', 'Oriol Gual', 'Garrett Bjerkhoel', 'Renato Riccieri Santos Zannon', 'Brian Moseley']
7
7
  s.email = ['franck@verrot.fr']
8
8
  s.homepage = 'http://github.com/franckverrot/activevalidators'
9
9
  s.summary = %q{Collection of ActiveModel/ActiveRecord validations}
10
10
  s.description = %q{ActiveValidators is a collection of ActiveModel/ActiveRecord validations}
11
+ s.license = 'MIT'
11
12
 
12
13
  s.add_development_dependency 'bundler'
13
- s.add_development_dependency 'minitest'
14
+ s.add_development_dependency 'minitest', '~> 4.2.0' # Rails fixes this...
14
15
  s.add_dependency 'rake' , '>= 0.8.7'
15
16
  s.add_dependency 'activemodel' , '>= 3.0.0'
16
- s.add_dependency 'phony' , '~> 1.7.4'
17
- s.add_dependency 'countries' , '~> 0.8.2'
17
+ s.add_dependency 'phony' , '>= 1.9.0'
18
+ s.add_dependency 'countries' , '~> 0.9.3'
18
19
  s.add_dependency 'mail'
19
20
  s.add_dependency 'date_validator'
20
21
 
@@ -46,22 +46,22 @@ module ActiveModel
46
46
  end
47
47
 
48
48
  def self.luhn_valid?(s)
49
- return false unless s && s.is_a?(String)
50
- return false if s.empty?
51
- value = s.gsub(/\D/, '')
52
- return false if value.empty?
53
- value.
54
- reverse.
55
- each_char.
56
- collect(&:to_i).
57
- each_with_index.
58
- inject(0) {| num, (i, index) |
59
- num + if (index + 1) % 2 == 0
60
- i*=2; ((i > 9) ? (i % 10) + 1 : i)
61
- else
62
- i
63
- end
64
- } % 10 == 0
49
+ value = s.gsub(/\D/, '').reverse
50
+
51
+ sum = i = 0
52
+
53
+ value.each_char do |ch|
54
+ n = ch.to_i
55
+
56
+ n *= 2 if i.odd?
57
+
58
+ n = 1 + (n - 10) if n >= 10
59
+
60
+ sum += n
61
+ i += 1
62
+ end
63
+
64
+ (sum % 10).zero?
65
65
  end
66
66
  end
67
67
  end
@@ -7,24 +7,10 @@ module ActiveModel
7
7
  end
8
8
 
9
9
  def validate_each(record, attribute, value)
10
- # takes from: https://github.com/hallelujah/valid_email
11
10
  begin
12
11
  mail = Mail::Address.new(value)
13
- # We must check that value contains a domain and that value is an email address
14
- valid = mail.domain && value.include?(mail.address)
15
12
 
16
- if options[:only_address]
17
- # We need to dig into treetop
18
- # A valid domain must have dot_atom_text elements size > 1
19
- # user@localhost is excluded
20
- # treetop must respond to domain
21
- # We exclude valid email values like <user@localhost.com>
22
- # Hence we use m.__send__(tree).domain
23
- tree = mail.__send__(:tree)
24
- valid &&= (tree.domain.dot_atom_text.elements.size > 1)
25
- else
26
- valid &&= (mail.domain.split('.').length > 1)
27
- end
13
+ valid = basic_check(mail) && value.include?(mail.address)
28
14
  rescue Exception => e
29
15
  valid = false
30
16
  end
@@ -37,6 +23,25 @@ module ActiveModel
37
23
 
38
24
  record.errors.add attribute, (options[:message]) unless valid
39
25
  end
26
+
27
+ def basic_check(mail)
28
+ # We must check that value contains a domain and that value is an email address
29
+ valid = !!mail.domain
30
+
31
+ if options[:only_address]
32
+ # We need to dig into treetop
33
+ # A valid domain must have dot_atom_text elements size > 1
34
+ # user@localhost is excluded
35
+ # treetop must respond to domain
36
+ # We exclude valid email values like <user@localhost.com>
37
+ # Hence we use m.__send__(tree).domain
38
+ tree = mail.__send__(:tree)
39
+ valid &&= (tree.domain.dot_atom_text.elements.size > 1)
40
+ else
41
+ valid &&= (mail.domain.split('.').length > 1)
42
+ end
43
+ valid
44
+ end
40
45
  end
41
46
  end
42
47
  end
@@ -2,7 +2,8 @@ module ActiveModel
2
2
  module Validations
3
3
  class IpValidator < EachValidator
4
4
  def validate_each(record, attribute, value)
5
- record.errors.add(attribute) if value.blank? || !regex.match(value)
5
+ value_str = value.to_s # might be an IPAddr
6
+ record.errors.add(attribute) if value_str.blank? || !regex.match(value_str)
6
7
  end
7
8
 
8
9
  def check_validity!
@@ -0,0 +1,33 @@
1
+ module ActiveModel
2
+ module Validations
3
+ class SirenValidator < EachValidator
4
+ # Validates siren format according to
5
+ # http://fr.wikipedia.org/wiki/SIREN
6
+ def valid_siren?(input)
7
+ str = input.to_s
8
+ reversed_array = str.split('').reverse
9
+
10
+ digits = reversed_array.each_with_index.map do |char, i|
11
+ coeff = (i % 2) + 1
12
+ (char.to_i * coeff).to_s.split('')
13
+ end
14
+
15
+ sum = digits.flatten.map(&:to_i).inject(:+)
16
+
17
+ (sum % 10) == 0
18
+ end
19
+
20
+ def validate_each(record, attribute, value)
21
+ if value.nil?
22
+ record.errors.add_on_blank(attribute)
23
+ else
24
+ if value.to_s.length != 9
25
+ record.errors.add attribute, :length
26
+ else
27
+ record.errors.add attribute, :format unless valid_siren?(value)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,4 @@
1
+ require 'active_support/core_ext/array/wrap'
1
2
  require 'uri'
2
3
 
3
4
  module ActiveModel
@@ -6,7 +6,7 @@ require 'active_validators/one_nine_shims/one_nine_string'
6
6
  module ActiveModel
7
7
  module Validations
8
8
  def self.activevalidators
9
- %w(email url respond_to phone slug ip credit_card date password twitter postal_code tracking_number)
9
+ %w(email url respond_to phone slug ip credit_card date password twitter postal_code tracking_number siren)
10
10
  end
11
11
 
12
12
  activevalidators.each do |validator_name|
data/test/test_helper.rb CHANGED
@@ -1,26 +1,20 @@
1
- require 'rubygems'
1
+ gem 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'minitest/mock'
2
4
 
3
5
  # silence warnings
4
6
  old_w, $-w = $-w, false
5
7
 
6
- require 'minitest/spec'
7
- require 'minitest/mock'
8
- require 'minitest/autorun'
8
+ require 'activevalidators'
9
9
 
10
10
  # unsilence warnings
11
11
  $-w = old_w
12
12
 
13
- require 'activevalidators'
14
-
15
- %w(models).each do |directory|
16
- Dir["#{File.dirname(__FILE__)}/#{directory}/*.rb"].each {|f| require f}
17
- end
18
-
19
13
  class TestRecord
20
14
  include ActiveModel::Validations
21
15
  attr_accessor :ip, :url, :slug, :responder, :global_condition,
22
16
  :local_condition, :phone, :email, :card, :password, :twitter_username,
23
- :postal_code, :carrier, :tracking_number, :start_date, :end_date
17
+ :postal_code, :carrier, :tracking_number, :start_date, :end_date, :siren
24
18
 
25
19
  def initialize(attrs = {})
26
20
  attrs.each_pair { |k,v| send("#{k}=", v) }
@@ -1,4 +1,5 @@
1
1
  require 'test_helper'
2
+ require 'active_support/core_ext/hash/reverse_merge'
2
3
 
3
4
  # ActiveValidators relies on another gem called "date_validator" edited
4
5
  # by the fine folks at Codegram.
@@ -1,4 +1,5 @@
1
1
  require 'test_helper.rb'
2
+ require 'ipaddr'
2
3
 
3
4
  describe "IP Validation" do
4
5
  describe "IPv4 Validation" do
@@ -8,6 +9,12 @@ describe "IP Validation" do
8
9
  subject.errors.size.must_equal 0
9
10
  end
10
11
 
12
+ it "accepts IPAddrs" do
13
+ subject = build_ip_record :v4, :ip => IPAddr.new('192.168.1.1')
14
+ subject.valid?.must_equal true
15
+ subject.errors.size.must_equal 0
16
+ end
17
+
11
18
  describe "for invalid IPs" do
12
19
  it "rejects invalid IPs" do
13
20
  subject = build_ip_record :v4, :ip => '267.34.56.3'
@@ -30,6 +37,12 @@ describe "IP Validation" do
30
37
  subject.errors.size.must_equal 0
31
38
  end
32
39
 
40
+ it "accepts IPAddrs" do
41
+ subject = build_ip_record :v6, :ip => IPAddr.new('::1')
42
+ subject.valid?.must_equal true
43
+ subject.errors.size.must_equal 0
44
+ end
45
+
33
46
  describe "for invalid IPs" do
34
47
  it "rejects invalid IPs" do
35
48
  subject = build_ip_record :v6, :ip => '192.168.1.1'
@@ -0,0 +1,55 @@
1
+ require 'test_helper.rb'
2
+
3
+ describe "Siren Validation" do
4
+ it "Rejects if not supplied" do
5
+ subject = build_siren_record true
6
+ subject.valid?.must_equal false
7
+ subject.errors.size.must_equal 1
8
+ end
9
+
10
+ describe 'supplied as a string' do
11
+ it "Accepts if valid" do
12
+ subject = build_siren_record true, :siren => '552100554'
13
+ subject.valid?.must_equal true
14
+ subject.errors.size.must_equal 0
15
+ end
16
+
17
+ it "Reject if invalid" do
18
+ subject = build_siren_record true, :siren => '552100553'
19
+ subject.valid?.must_equal false
20
+ subject.errors.size.must_equal 1
21
+ end
22
+
23
+ it "Reject if not the right size" do
24
+ subject = build_siren_record true, :siren => '55210055'
25
+ subject.valid?.must_equal false
26
+ subject.errors.size.must_equal 1
27
+ end
28
+ end
29
+
30
+ describe 'supplied as a number' do
31
+ it "Accepts if valid" do
32
+ subject = build_siren_record true, :siren => 732829320
33
+ subject.valid?.must_equal true
34
+ subject.errors.size.must_equal 0
35
+ end
36
+
37
+ it "Reject if invalid" do
38
+ subject = build_siren_record true, :siren => 732829321
39
+ subject.valid?.must_equal false
40
+ subject.errors.size.must_equal 1
41
+ end
42
+
43
+ it "Reject if not the right size" do
44
+ subject = build_siren_record true, :siren => 73282932
45
+ subject.valid?.must_equal false
46
+ subject.errors.size.must_equal 1
47
+ end
48
+ end
49
+
50
+ def build_siren_record siren, attrs = {}
51
+ TestRecord.reset_callbacks(:validate)
52
+ TestRecord.validates :siren, :siren => siren
53
+ TestRecord.new attrs
54
+ end
55
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activevalidators
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
5
- prerelease:
4
+ version: 2.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Franck Verrot
@@ -14,134 +13,118 @@ authors:
14
13
  autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
- date: 2012-11-23 00:00:00.000000000 Z
16
+ date: 2014-03-09 00:00:00.000000000 Z
18
17
  dependencies:
19
18
  - !ruby/object:Gem::Dependency
20
19
  name: bundler
21
20
  requirement: !ruby/object:Gem::Requirement
22
- none: false
23
21
  requirements:
24
- - - ! '>='
22
+ - - ">="
25
23
  - !ruby/object:Gem::Version
26
24
  version: '0'
27
25
  type: :development
28
26
  prerelease: false
29
27
  version_requirements: !ruby/object:Gem::Requirement
30
- none: false
31
28
  requirements:
32
- - - ! '>='
29
+ - - ">="
33
30
  - !ruby/object:Gem::Version
34
31
  version: '0'
35
32
  - !ruby/object:Gem::Dependency
36
33
  name: minitest
37
34
  requirement: !ruby/object:Gem::Requirement
38
- none: false
39
35
  requirements:
40
- - - ! '>='
36
+ - - "~>"
41
37
  - !ruby/object:Gem::Version
42
- version: '0'
38
+ version: 4.2.0
43
39
  type: :development
44
40
  prerelease: false
45
41
  version_requirements: !ruby/object:Gem::Requirement
46
- none: false
47
42
  requirements:
48
- - - ! '>='
43
+ - - "~>"
49
44
  - !ruby/object:Gem::Version
50
- version: '0'
45
+ version: 4.2.0
51
46
  - !ruby/object:Gem::Dependency
52
47
  name: rake
53
48
  requirement: !ruby/object:Gem::Requirement
54
- none: false
55
49
  requirements:
56
- - - ! '>='
50
+ - - ">="
57
51
  - !ruby/object:Gem::Version
58
52
  version: 0.8.7
59
53
  type: :runtime
60
54
  prerelease: false
61
55
  version_requirements: !ruby/object:Gem::Requirement
62
- none: false
63
56
  requirements:
64
- - - ! '>='
57
+ - - ">="
65
58
  - !ruby/object:Gem::Version
66
59
  version: 0.8.7
67
60
  - !ruby/object:Gem::Dependency
68
61
  name: activemodel
69
62
  requirement: !ruby/object:Gem::Requirement
70
- none: false
71
63
  requirements:
72
- - - ! '>='
64
+ - - ">="
73
65
  - !ruby/object:Gem::Version
74
66
  version: 3.0.0
75
67
  type: :runtime
76
68
  prerelease: false
77
69
  version_requirements: !ruby/object:Gem::Requirement
78
- none: false
79
70
  requirements:
80
- - - ! '>='
71
+ - - ">="
81
72
  - !ruby/object:Gem::Version
82
73
  version: 3.0.0
83
74
  - !ruby/object:Gem::Dependency
84
75
  name: phony
85
76
  requirement: !ruby/object:Gem::Requirement
86
- none: false
87
77
  requirements:
88
- - - ~>
78
+ - - ">="
89
79
  - !ruby/object:Gem::Version
90
- version: 1.7.4
80
+ version: 1.9.0
91
81
  type: :runtime
92
82
  prerelease: false
93
83
  version_requirements: !ruby/object:Gem::Requirement
94
- none: false
95
84
  requirements:
96
- - - ~>
85
+ - - ">="
97
86
  - !ruby/object:Gem::Version
98
- version: 1.7.4
87
+ version: 1.9.0
99
88
  - !ruby/object:Gem::Dependency
100
89
  name: countries
101
90
  requirement: !ruby/object:Gem::Requirement
102
- none: false
103
91
  requirements:
104
- - - ~>
92
+ - - "~>"
105
93
  - !ruby/object:Gem::Version
106
- version: 0.8.2
94
+ version: 0.9.3
107
95
  type: :runtime
108
96
  prerelease: false
109
97
  version_requirements: !ruby/object:Gem::Requirement
110
- none: false
111
98
  requirements:
112
- - - ~>
99
+ - - "~>"
113
100
  - !ruby/object:Gem::Version
114
- version: 0.8.2
101
+ version: 0.9.3
115
102
  - !ruby/object:Gem::Dependency
116
103
  name: mail
117
104
  requirement: !ruby/object:Gem::Requirement
118
- none: false
119
105
  requirements:
120
- - - ! '>='
106
+ - - ">="
121
107
  - !ruby/object:Gem::Version
122
108
  version: '0'
123
109
  type: :runtime
124
110
  prerelease: false
125
111
  version_requirements: !ruby/object:Gem::Requirement
126
- none: false
127
112
  requirements:
128
- - - ! '>='
113
+ - - ">="
129
114
  - !ruby/object:Gem::Version
130
115
  version: '0'
131
116
  - !ruby/object:Gem::Dependency
132
117
  name: date_validator
133
118
  requirement: !ruby/object:Gem::Requirement
134
- none: false
135
119
  requirements:
136
- - - ! '>='
120
+ - - ">="
137
121
  - !ruby/object:Gem::Version
138
122
  version: '0'
139
123
  type: :runtime
140
124
  prerelease: false
141
125
  version_requirements: !ruby/object:Gem::Requirement
142
- none: false
143
126
  requirements:
144
- - - ! '>='
127
+ - - ">="
145
128
  - !ruby/object:Gem::Version
146
129
  version: '0'
147
130
  description: ActiveValidators is a collection of ActiveModel/ActiveRecord validations
@@ -151,8 +134,8 @@ executables: []
151
134
  extensions: []
152
135
  extra_rdoc_files: []
153
136
  files:
154
- - .gitignore
155
- - .travis.yml
137
+ - ".gitignore"
138
+ - ".travis.yml"
156
139
  - Gemfile
157
140
  - LICENSE
158
141
  - README.md
@@ -165,6 +148,7 @@ files:
165
148
  - lib/active_model/validations/phone_validator.rb
166
149
  - lib/active_model/validations/postal_code_validator.rb
167
150
  - lib/active_model/validations/respond_to_validator.rb
151
+ - lib/active_model/validations/siren_validator.rb
168
152
  - lib/active_model/validations/slug_validator.rb
169
153
  - lib/active_model/validations/tracking_number_validator.rb
170
154
  - lib/active_model/validations/twitter_validator.rb
@@ -180,33 +164,34 @@ files:
180
164
  - test/validations/phone_test.rb
181
165
  - test/validations/postal_code_test.rb
182
166
  - test/validations/respond_to_test.rb
167
+ - test/validations/siren_test.rb
183
168
  - test/validations/slug_test.rb
184
169
  - test/validations/tracking_number_test.rb
185
170
  - test/validations/twitter_test.rb
186
171
  - test/validations/url_test.rb
187
172
  homepage: http://github.com/franckverrot/activevalidators
188
- licenses: []
173
+ licenses:
174
+ - MIT
175
+ metadata: {}
189
176
  post_install_message:
190
177
  rdoc_options: []
191
178
  require_paths:
192
179
  - lib
193
180
  required_ruby_version: !ruby/object:Gem::Requirement
194
- none: false
195
181
  requirements:
196
- - - ! '>='
182
+ - - ">="
197
183
  - !ruby/object:Gem::Version
198
184
  version: '0'
199
185
  required_rubygems_version: !ruby/object:Gem::Requirement
200
- none: false
201
186
  requirements:
202
- - - ! '>='
187
+ - - ">="
203
188
  - !ruby/object:Gem::Version
204
189
  version: '0'
205
190
  requirements: []
206
191
  rubyforge_project:
207
- rubygems_version: 1.8.23
192
+ rubygems_version: 2.2.0
208
193
  signing_key:
209
- specification_version: 3
194
+ specification_version: 4
210
195
  summary: Collection of ActiveModel/ActiveRecord validations
211
196
  test_files:
212
197
  - test/test_helper.rb
@@ -218,6 +203,7 @@ test_files:
218
203
  - test/validations/phone_test.rb
219
204
  - test/validations/postal_code_test.rb
220
205
  - test/validations/respond_to_test.rb
206
+ - test/validations/siren_test.rb
221
207
  - test/validations/slug_test.rb
222
208
  - test/validations/tracking_number_test.rb
223
209
  - test/validations/twitter_test.rb