activevalidators 2.0.2 → 2.1.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.
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