rails_validations 1.2 → 1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 101607105b5fc99a8762be3fc19f1b98c5195706
4
- data.tar.gz: d0486ef2ac9c0577b8d79c95c1370a0f7d5ce46d
3
+ metadata.gz: 951d63d5356bcdf895cef31ec5726e049079bc7a
4
+ data.tar.gz: bbfbf7c0b5e64858ad78723f1990d205aa40918b
5
5
  SHA512:
6
- metadata.gz: 1bbb66d567952305ba3d4832e18d7c5d15cc300d09cda5e519b6bda959cb83052e61fbc0771fb64d288ccd16ebe5908e667bce8f660aa3fc0866775ba8063473
7
- data.tar.gz: 7fa7a7624e58f7cd31e2e8543c1bc003d9ed9ca1efe972ba303fad0c67caac0517a88738d4a4c0eb55ac9067d37459ef39c097aeed06d72298da67e4590ebbd9
6
+ metadata.gz: 563d7dfa6e1f2cc9035a7c3b761f8b86a08f452b63ccc8725442f7d6abd7c60a4dc5ca28ff4f5ca2abacbf488fb0098bdae3b1bc42e41c1d6627a6f232e06449
7
+ data.tar.gz: 09f588a7881780926db041f19f4e8edce501cc1c8d12cc878f06f7bcb087f620a5502820d6eb0734c2440a1590994f85ccf63683ddeb63502cea17c4c4110330
@@ -1,4 +1,4 @@
1
- Copyright 2014 Martin Tournoij
1
+ Copyright © 2014-2015 LICO Innovations
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -6,16 +6,23 @@
6
6
 
7
7
  A few extra validations for Ruby on Rails.
8
8
 
9
- We try to do the sane thing by not being too strict, when in doubt, we accept
9
+ We try to do the sane thing by not being too strict, when in doubt, we accept
10
10
  input as being valid. We never want to reject valid input as invalid.
11
11
 
12
12
  For many formats doing a 100% foolproof check is not trivial, email addresses
13
13
  are a famous example, but it also applies to other formats.
14
14
  Regardless, you can never be sure it’s what the user *intended* anyway. For
15
15
  example, email validators will accept `artin@ico.nl` as being ‘valid’, even
16
- though my email address is `martin@lico.nl.`.
16
+ though my email address is `martin@lico.nl`.
17
17
 
18
18
 
19
+ I18N
20
+ ====
21
+ The gem includes English and Dutch error messages. If you want to translate it
22
+ to another language then copy [`config/locales/en.yml`][tr] to your project.
23
+ Please send us your translations so we can add them!
24
+
25
+ [tr]: https://github.com/bluerail/rails_validations/blob/master/config/locales/en.yml
19
26
 
20
27
 
21
28
  Available validations
@@ -109,8 +116,39 @@ Currently implemented countries:
109
116
  - `nl` - The Netherlands
110
117
 
111
118
 
119
+ commerce\_number
120
+ ---------------
121
+ Check if this is a valid chamber of commerce identification number.
122
+
123
+ validates :commerce_number_column, commerce_number: { country: :nl }
124
+
125
+ Currently implemented countries:
126
+
127
+ - `nl` - The Netherlands
128
+
129
+
130
+ vat\_number
131
+ -----------
132
+ Check if this is a valid [VAT identification number](https://en.wikipedia.org/wiki/VAT_identification_number)
133
+
134
+ validates :vat_number_column, vat_number: { country: :nl }
135
+
136
+ Currently implemented countries:
137
+
138
+ - `nl` - The Netherlands
139
+
140
+
112
141
  ChangeLog
113
142
  =========
143
+
144
+ Version 1.3, 2015-05-22
145
+ -----------------------
146
+ - Add `commerce_number` validation.
147
+ - Add `vat_number` validation.
148
+ - The `postal_code` validation will now raise an error if an invalid country
149
+ code is given.
150
+
151
+
114
152
  Version 1.2, 2015-03-07
115
153
  -----------------------
116
154
  - The IBAN check will now defaults to just a "is invalid" message, set the
@@ -27,3 +27,9 @@ en:
27
27
  invalid: not a valid domain
28
28
  max_domain_parts: only %{max} domain parts are allowed
29
29
  min_domain_parts: needs to have at least %{min} domain parts
30
+
31
+ vat_number:
32
+ invalid: not a valid VAT identification number
33
+
34
+ commerce_number:
35
+ invalid: not a valid chamber of commerce number
@@ -27,3 +27,9 @@ nl:
27
27
  invalid: geen geldig domain
28
28
  max_domain_parts: er zijn %{max} domeinstukken toegestaan
29
29
  min_domain_parts: er moeten minimaal %{min} domeinstukken zijn
30
+
31
+ vat_number:
32
+ invalid: geen geldig BTW nummer
33
+
34
+ commerce_number:
35
+ invalid: geen geldig KvK nummer
@@ -1,10 +1,11 @@
1
+ require 'validators/commerce_number_validator'
1
2
  require 'validators/date_validator'
2
3
  require 'validators/domain_validator'
3
4
  require 'validators/email_validator'
4
5
  require 'validators/iban_validator'
5
6
  require 'validators/phone_validator'
6
7
  require 'validators/postal_code_validator'
7
- #require 'validators/presence_of_validator'
8
+ require 'validators/vat_number_validator'
8
9
 
9
10
  I18n.load_path += Dir["#{File.dirname(__FILE__)}/../config/locales/*.yml"]
10
11
 
@@ -0,0 +1,18 @@
1
+ # Check digit for BSN, but see if we can make this more generic
2
+ #class ElevenProofValidator < ActiveModel::EachValidator
3
+ # # The eleven-proof of a BSN is as follows:
4
+ # # Given: BSN presented as ABCDEFGHI with length is 9:
5
+ # # 9xA+8xB+7xC+6xD+5xE+4xF+3xG+2xH-1xI (caveat: the minus!)
6
+ #
7
+ # def validate_each(record, attribute, value)
8
+ # return if value.to_s.empty?
9
+ #
10
+ # total = 0
11
+ # if value.to_s.length == 9
12
+ # 8.times { |x| total += value[x].to_i * (9-x) }
13
+ # total -= value[8].to_i
14
+ # end
15
+ #
16
+ # record.errors.add(attribute, I18n.t('errors.messages.eleven_proof_error')) if total.modulo(11)!=0 || value.length != 9
17
+ # end
18
+ #end
@@ -0,0 +1,28 @@
1
+ # Chamber of commerce number
2
+ class CommerceNumberValidator < ActiveModel::EachValidator
3
+ # keys are ISO-3366-1 alpha2
4
+ REGEXP = {
5
+ # KvK nummer; 8 digits. Allow space, -, and . for formatting
6
+ nl: -> (v) { v.gsub(/[.\- ]/, '') =~ /\A\d{8}\z/ },
7
+ }.freeze
8
+
9
+
10
+ def validate_each record, attribute, value
11
+ key = (options[:country] || I18n.locale).downcase.to_sym
12
+ key = :gb if key == :uk # Since it's easy to get this wrong
13
+ raise ArgumentError, "There is no validation for the country `#{key}'" if REGEXP[key].nil?
14
+
15
+ value = value.to_s
16
+
17
+ valid = true
18
+ if REGEXP[key].respond_to? :call
19
+ valid = false unless REGEXP[key].call value
20
+ elsif value !=~ REGEXP[key]
21
+ valid = false
22
+ end
23
+
24
+ if !valid
25
+ record.errors.add attribute, (options[:message] || I18n.t('rails_validations.commerce_number.invalid'))
26
+ end
27
+ end
28
+ end
@@ -8,6 +8,7 @@ class PostalCodeValidator < ActiveModel::EachValidator
8
8
  def validate_each record, attribute, value
9
9
  key = (options[:country] || I18n.locale).downcase.to_sym
10
10
  key = :gb if key == :uk # Since it's easy to get this wrong
11
+ raise ArgumentError, "There is no validation for the country `#{key}'" if REGEXP[key].nil?
11
12
 
12
13
  record.errors.add attribute, (options[:message] || I18n.t('rails_validations.postal_code.invalid')) unless value =~ REGEXP[key]
13
14
  end
@@ -0,0 +1,32 @@
1
+ # https://en.wikipedia.org/wiki/VAT_identification_number
2
+ # http://ec.europa.eu/taxation_customs/vies/faqvies.do#item_7
3
+ class VatNumberValidator < ActiveModel::EachValidator
4
+ # keys are ISO-3366-1 alpha2
5
+ REGEXP = {
6
+ # 'NL' + 9 digits + B + 2-digit company index – e.g. NL999999999B99
7
+ # Allow space, -, and . for formatting
8
+ # TODO: I think this also has a check digit?
9
+ nl: -> (v) { v.upcase.gsub(/[.\- ]/, '') =~ /\ANL\d{9}B\d{2}\z/ },
10
+ }.freeze
11
+
12
+
13
+ def validate_each record, attribute, value
14
+ key = (options[:country] || I18n.locale).downcase.to_sym
15
+ key = :gb if key == :uk # Since it's easy to get this wrong
16
+ raise ArgumentError, "There is no validation for the country `#{key}'" if REGEXP[key].nil?
17
+
18
+ value = value.to_s
19
+
20
+ valid = true
21
+ if REGEXP[key].respond_to? :call
22
+ valid = false unless REGEXP[key].call value
23
+ elsif value !=~ REGEXP[key]
24
+ valid = false
25
+ end
26
+
27
+ if !valid
28
+ record.errors.add attribute, (options[:message] || I18n.t('rails_validations.vat_number.invalid'))
29
+ end
30
+ end
31
+ end
32
+
@@ -82,10 +82,19 @@ end
82
82
 
83
83
  shared_examples :validation do |validation|
84
84
  it 'accepts a custom error message' do
85
- with_validation "#{validation}: { message: 'foobar' }" do
85
+ with_validation "#{validation}: { country: :nl, message: 'foobar' }" do
86
86
  m = described_class.new v: 'not even remotely valid'
87
87
  expect(m.valid?).to eq(false)
88
88
  expect(m.errors[:v].first).to eq('foobar')
89
89
  end
90
90
  end
91
91
  end
92
+
93
+
94
+ shared_examples :country_code do |validation|
95
+ it 'raises an error on an invalid country' do
96
+ with_validation "#{validation}: { country: :not_a_country_code }" do
97
+ expect { described_class.new(v: 123).valid? }.to raise_error(ArgumentError)
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ module ValidationsSpecHelper
4
+ class CommerceNumber < ValidationsSpecHelper::Record
5
+ end
6
+ end
7
+
8
+ describe ValidationsSpecHelper::CommerceNumber do
9
+ include ValidationsSpecHelper
10
+
11
+ it_behaves_like :validation, 'commerce_number'
12
+ it_behaves_like :country_code, 'commerce_number'
13
+
14
+ it 'works for nl codes' do
15
+ with_validation 'commerce_number: { country: :nl }' do
16
+ [
17
+ 12345678,
18
+ '12345678',
19
+ :'12345678',
20
+ '123 45-6.78',
21
+ ].each do |v|
22
+ expect(model(v)).to be_valid
23
+ end
24
+ end
25
+ end
26
+
27
+
28
+ it 'gives an error for nl codes' do
29
+ with_validation 'commerce_number: { country: :nl }' do
30
+ %w{
31
+ whoops
32
+ 1234567
33
+ 123456789
34
+ }.each do |v|
35
+ expect(model(v)).to be_invalid('commerce_number.invalid')
36
+ end
37
+ end
38
+ end
39
+ end
@@ -10,6 +10,7 @@ describe ValidationsSpecHelper::PostalCode do
10
10
  include ValidationsSpecHelper
11
11
 
12
12
  it_behaves_like :validation, 'postal_code'
13
+ it_behaves_like :country_code, 'postal_code'
13
14
 
14
15
  it 'works for nl codes' do
15
16
  with_validation 'postal_code: { country: :nl }' do
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ module ValidationsSpecHelper
4
+ class VatNumber < ValidationsSpecHelper::Record
5
+ end
6
+ end
7
+
8
+ describe ValidationsSpecHelper::VatNumber do
9
+ include ValidationsSpecHelper
10
+
11
+ it_behaves_like :validation, 'vat_number'
12
+ it_behaves_like :country_code, 'vat_number'
13
+
14
+ it 'works for nl codes' do
15
+ with_validation 'vat_number: { country: :nl }' do
16
+ %w{
17
+ NL123456789B00
18
+ NL123456789B99
19
+ NL.00-00\ 01\ 34-0B.57
20
+ nl123456789b00
21
+ }.each do |v|
22
+ expect(model(v)).to be_valid
23
+ end
24
+ end
25
+ end
26
+
27
+
28
+ it 'gives an error for nl codes' do
29
+ with_validation 'vat_number: { country: :nl }' do
30
+ %w{
31
+ NL123456789A00
32
+ NL123456789B9
33
+ NL23456789B99
34
+ NL1234567890B99
35
+ NLL1234567890B99
36
+ }.each do |v|
37
+ expect(model(v)).to be_invalid('vat_number.invalid')
38
+ end
39
+ end
40
+ end
41
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_validations
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.2'
4
+ version: '1.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Tournoij
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-06 00:00:00.000000000 Z
11
+ date: 2015-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -79,19 +79,24 @@ files:
79
79
  - config/locales/en.yml
80
80
  - config/locales/nl.yml
81
81
  - lib/rails_validations.rb
82
+ - lib/validators/check_digit_validator.rb
83
+ - lib/validators/commerce_number_validator.rb
82
84
  - lib/validators/date_validator.rb
83
85
  - lib/validators/domain_validator.rb
84
86
  - lib/validators/email_validator.rb
85
87
  - lib/validators/iban_validator.rb
86
88
  - lib/validators/phone_validator.rb
87
89
  - lib/validators/postal_code_validator.rb
90
+ - lib/validators/vat_number_validator.rb
88
91
  - spec/spec_helper.rb
92
+ - spec/validations/commerce_number_spec.rb
89
93
  - spec/validations/date_spec.rb
90
94
  - spec/validations/domain_spec.rb
91
95
  - spec/validations/email_spec.rb
92
96
  - spec/validations/iban_spec.rb
93
97
  - spec/validations/phone_spec.rb
94
98
  - spec/validations/postal_code_spec.rb
99
+ - spec/validations/vat_number_spec.rb
95
100
  homepage: https://github.com/bluerail/rails_validations
96
101
  licenses:
97
102
  - MIT
@@ -124,3 +129,5 @@ test_files:
124
129
  - spec/validations/phone_spec.rb
125
130
  - spec/validations/postal_code_spec.rb
126
131
  - spec/validations/domain_spec.rb
132
+ - spec/validations/commerce_number_spec.rb
133
+ - spec/validations/vat_number_spec.rb