valvat 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/ruby.yml +8 -2
- data/CHANGES.md +9 -3
- data/README.md +2 -2
- data/certs/yolk.pem +25 -24
- data/gemfiles/activemodel-7 +7 -0
- data/lib/active_model/validations/valvat_validator.rb +1 -1
- data/lib/valvat/error.rb +6 -3
- data/lib/valvat/lookup/fault.rb +15 -8
- data/lib/valvat/lookup/request.rb +1 -1
- data/lib/valvat/utils.rb +1 -1
- data/lib/valvat/version.rb +1 -1
- data/spec/valvat/lookup/request_spec.rb +13 -0
- data/spec/valvat/lookup_spec.rb +34 -0
- data.tar.gz.sig +1 -3
- metadata +28 -27
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92de431f5777b0b5115169e30bac0233ce3d9047c1bc74b9d42fe02acb2b460d
|
4
|
+
data.tar.gz: 0146a80725a3dce432002a456b8e9f10e3a65ee5d36b27dac5c6d646dc48fa70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6d08a4d98163bd195d861c83a837042e93bfebe13606c0fce10a703bf702296eb406f75d39349e46e7078289b74d2779f511b3d3a77a49e4d4fb5e585fb01cc
|
7
|
+
data.tar.gz: c2190c0f729188281e4894fb1d7e2b4b771171215da07329b0fc92fcda8806f5ac8fe3d7d1eb2d2c1f1e941a06b3d3c22a975369d5617589702a86d727166d4b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/.github/workflows/ruby.yml
CHANGED
@@ -17,11 +17,17 @@ jobs:
|
|
17
17
|
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}
|
18
18
|
strategy:
|
19
19
|
matrix:
|
20
|
-
ruby-version: ['2.
|
21
|
-
gemfile: [ 'standalone', 'activemodel-5', 'activemodel-6' ]
|
20
|
+
ruby-version: ['2.6', '2.7', '3.0', '3.1', 'truffleruby-head', 'jruby-9.3.2.0']
|
21
|
+
gemfile: [ 'standalone', 'activemodel-5', 'activemodel-6', 'activemodel-7' ]
|
22
22
|
exclude:
|
23
23
|
- ruby-version: '3.0'
|
24
24
|
gemfile: 'activemodel-5'
|
25
|
+
- ruby-version: '3.1'
|
26
|
+
gemfile: 'activemodel-5'
|
27
|
+
- ruby-version: '2.6'
|
28
|
+
gemfile: 'activemodel-7'
|
29
|
+
- ruby-version: 'jruby-9.3.2.0'
|
30
|
+
gemfile: 'activemodel-7'
|
25
31
|
|
26
32
|
steps:
|
27
33
|
- uses: actions/checkout@v2
|
data/CHANGES.md
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
|
2
2
|
### dev
|
3
3
|
|
4
|
-
[full changelog](http://github.com/yolk/valvat/compare/v1.1.
|
4
|
+
[full changelog](http://github.com/yolk/valvat/compare/v1.1.3...master)
|
5
5
|
|
6
|
-
### 1.1.
|
6
|
+
### 1.1.3 / 2022-01-26
|
7
|
+
|
8
|
+
[full changelog](http://github.com/yolk/valvat/compare/v1.1.2...v1.1.3)
|
9
|
+
|
10
|
+
* Handle Savon::HTTPError and Savon::UnknownOperationError as ViesError and throw Valvat::HTTPError and Valvat::OperationUnknown instead.
|
11
|
+
|
12
|
+
### 1.1.2 / 2021-10-29
|
7
13
|
|
8
14
|
[full changelog](http://github.com/yolk/valvat/compare/v1.1.1...v1.1.2)
|
9
15
|
|
10
16
|
* Fixed SOAPAction error (#105) (by [Ľubo ](https://github.com/lubosch))
|
11
17
|
|
12
|
-
### 1.1.
|
18
|
+
### 1.1.1 / 2021-07-15
|
13
19
|
|
14
20
|
[full changelog](http://github.com/yolk/valvat/compare/v1.1.0...v1.1.1)
|
15
21
|
|
data/README.md
CHANGED
@@ -20,7 +20,7 @@ Northern Ireland received its own VAT number prefix - XI which is supported by V
|
|
20
20
|
* I18n locales for language specific error messages in English, German, French, Spanish, Italian, Portuguese, Polish, Swedish, Dutch, Danish, Czech, Slovakian, Hungarian, Bulgarian, Romanian, Latvian, Catalan, Norwegian, and Finnish.
|
21
21
|
* *Experimental* checksum verification
|
22
22
|
|
23
|
-
valvat is tested and works with ruby MRI 2.
|
23
|
+
valvat is tested and works with ruby MRI 2.6/2.7/3.0/3.1, jruby, truffleruby-head and ActiveModel 5/6/7. If you need support for ruby down to 1.9.3 and ActiveModel 3 and 4 use [v1.0.1](https://github.com/yolk/valvat/tree/v1.0.1).
|
24
24
|
|
25
25
|
## Installation
|
26
26
|
|
@@ -258,7 +258,7 @@ https://github.com/yolk/valvat/graphs/contributors
|
|
258
258
|
|
259
259
|
## BlaBla
|
260
260
|
|
261
|
-
Copyright (c) 2011-
|
261
|
+
Copyright (c) 2011-2022 Yolk Sebastian Munz & Julia Soergel GbR
|
262
262
|
|
263
263
|
Beyond that, the implementation is licensed under the MIT License.
|
264
264
|
|
data/certs/yolk.pem
CHANGED
@@ -1,25 +1,26 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
2
|
+
MIIEZDCCAsygAwIBAgIBATANBgkqhkiG9w0BAQsFADA8MRIwEAYDVQQDDAlzZWJh
|
3
|
+
c3RpYW4xEjAQBgoJkiaJk/IsZAEZFgJ5bzESMBAGCgmSJomT8ixkARkWAmxrMB4X
|
4
|
+
DTIyMDEyNjE4MjIxNFoXDTIzMDEyNjE4MjIxNFowPDESMBAGA1UEAwwJc2ViYXN0
|
5
|
+
aWFuMRIwEAYKCZImiZPyLGQBGRYCeW8xEjAQBgoJkiaJk/IsZAEZFgJsazCCAaIw
|
6
|
+
DQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAM8Gdm81LvuqMyJr9sO+KtJz+PhM
|
7
|
+
x75w6uc5q3J8sTHGhOtWJlXiBFf8gbBkxUsQwDMEEbJ+WV63oqq9InVBrMHg9FxH
|
8
|
+
415dC0UlCv5IjKij4N5OVRnUTZDoxXczVVscNFyQcRhJO1TqORw6uOF8gd/MVWl4
|
9
|
+
6gJapzkLBMTIaqRUVbX3hTJpiGc1RV2zJmLkkvBtJ+lzqza0bklXh52LLs2UpTc1
|
10
|
+
e5ADVoq9K09G5QXES/GlFMYerQbtdXl0KpUQugXtRFAOoOrFKQFLETZSDq80lC7p
|
11
|
+
+zN+wNOEAuHtJP7EZVk/gU8hEkSDMexW5NRndgeQb+N/JH8DIRBbhOytZbAo19Pq
|
12
|
+
LEZBucHheI0xstLWuIP+ktwa/rIWv5v4gv3JZ/4H3q6tGPHigLKneRmaXo3e6jna
|
13
|
+
RFDxQLXbJgI37qusk4Qyl/iBVSBZ+TABBvA/jPXnHdd29qkuMTXvWLIiBDM6H0+2
|
14
|
+
SUabsieR1CqNZs/6YLO7nQHwFudHqzo8OB4+3QIDAQABo3EwbzAJBgNVHRMEAjAA
|
15
|
+
MAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUfC99QRDzqEe0tw1Da+XR9u4dmjEwGgYD
|
16
|
+
VR0RBBMwEYEPc2ViYXN0aWFuQHlvLmxrMBoGA1UdEgQTMBGBD3NlYmFzdGlhbkB5
|
17
|
+
by5sazANBgkqhkiG9w0BAQsFAAOCAYEAwYCyAFFXgYXWgaO8vQEZoQSjp5v6g1v/
|
18
|
+
t9TcO8JmX6UqEgoRHsdxPEyCK9RroYIv7X5GDyJ12ZdiGpzCqJiBIC9Gz3cCWAbp
|
19
|
+
LtnkhO8SQbz5B0NMOvo4o6XnbAr+rhVihuJmf0zXInnm1KZW/Yi+4JNAebPqwF1S
|
20
|
+
VZ/2Dz2BtTuTFhqlHOGxV2NxcnZjFff9kfUOLwl/oNUKgBecsMP5aW74zSOmc2fO
|
21
|
+
3sykOkKf5mWSY/KSuaCmAP1Ou3UUXOQmxiPUW9SDAzhYGKS63yPMkzJAziDP9ewI
|
22
|
+
zmOE2OJr0NuCmH9ykqlJZU4wnmloCnE1+8kHCl4+76cgBnN5gnYnzUb4RDM3J4EI
|
23
|
+
Jdm7+JxQbgAP/HJ2C2ara+uwc9jwhw2s1b2+TPnVCZdh9uBttHWfk0wgDoeFwky1
|
24
|
+
BUdT7mtr41GgvWnIjaGWAldSuabxx5H+PKS5FzjNDMHThRZWuvYp/nP2RXDh4gIa
|
25
|
+
7hV09P+XxvS96G+petG5KmC/lev8VqKu
|
26
|
+
-----END CERTIFICATE-----
|
@@ -72,7 +72,7 @@ module ActiveModel
|
|
72
72
|
def add_invalid_vat_error(record, attribute, iso_country_code)
|
73
73
|
record.errors.add(attribute, :invalid_vat,
|
74
74
|
message: options[:message],
|
75
|
-
country_adjective: I18n.
|
75
|
+
country_adjective: I18n.translate(
|
76
76
|
:"valvat.country_adjectives.#{iso_country_code.downcase}",
|
77
77
|
default: [:"valvat.country_adjectives.eu", 'european']
|
78
78
|
))
|
data/lib/valvat/error.rb
CHANGED
@@ -4,9 +4,10 @@ class Valvat
|
|
4
4
|
Error = Class.new(RuntimeError)
|
5
5
|
|
6
6
|
class ViesError < Error
|
7
|
-
def initialize(faultstring = 'UNKNOWN')
|
8
|
-
@faultstring = faultstring
|
9
|
-
|
7
|
+
def initialize(faultstring = 'UNKNOWN', exception = nil)
|
8
|
+
@faultstring = faultstring || exception.inspect
|
9
|
+
@exception = exception
|
10
|
+
super(faultstring)
|
10
11
|
end
|
11
12
|
|
12
13
|
def to_s
|
@@ -22,6 +23,8 @@ class Valvat
|
|
22
23
|
ServiceUnavailable = Class.new(ViesMaintenanceError)
|
23
24
|
MemberStateUnavailable = Class.new(ViesMaintenanceError)
|
24
25
|
|
26
|
+
OperationUnknown = Class.new(ViesError)
|
27
|
+
HTTPError = Class.new(ViesError)
|
25
28
|
Timeout = Class.new(ViesError)
|
26
29
|
InvalidRequester = Class.new(ViesError)
|
27
30
|
BlockedError = Class.new(ViesError)
|
data/lib/valvat/lookup/fault.rb
CHANGED
@@ -3,11 +3,22 @@
|
|
3
3
|
class Valvat
|
4
4
|
class Lookup
|
5
5
|
class Fault < Response
|
6
|
-
def
|
7
|
-
|
8
|
-
|
6
|
+
def to_hash
|
7
|
+
@to_hash ||= case @raw
|
8
|
+
when Savon::HTTPError
|
9
|
+
{ error: HTTPError.new(nil, @raw) }
|
10
|
+
when Savon::UnknownOperationError
|
11
|
+
{ error: OperationUnknown.new(nil, @raw) }
|
12
|
+
else
|
13
|
+
fault = @raw.to_hash[:fault][:faultstring]
|
9
14
|
|
10
|
-
|
15
|
+
if fault == 'INVALID_INPUT'
|
16
|
+
{ valid: false }
|
17
|
+
else
|
18
|
+
error = (FAULTS[fault] || UnknownViesError).new(fault)
|
19
|
+
{ error: error }
|
20
|
+
end
|
21
|
+
end
|
11
22
|
end
|
12
23
|
|
13
24
|
FAULTS = {
|
@@ -22,10 +33,6 @@ class Valvat
|
|
22
33
|
'MS_MAX_CONCURRENT_REQ' => RateLimitError,
|
23
34
|
'MS_MAX_CONCURRENT_REQ_TIME' => RateLimitError
|
24
35
|
}.freeze
|
25
|
-
|
26
|
-
def self.fault_to_error(fault)
|
27
|
-
(FAULTS[fault] || UnknownViesError).new(fault)
|
28
|
-
end
|
29
36
|
end
|
30
37
|
end
|
31
38
|
end
|
data/lib/valvat/utils.rb
CHANGED
@@ -8,7 +8,7 @@ class Valvat
|
|
8
8
|
SUPPORTED_STATES = EU_MEMBER_STATES + %w[GB]
|
9
9
|
EU_COUNTRIES = EU_MEMBER_STATES # TODO: Remove constant
|
10
10
|
COUNTRY_PATTERN = /\A([A-Z]{2})(.+)\Z/.freeze
|
11
|
-
NORMALIZE_PATTERN = /[[:
|
11
|
+
NORMALIZE_PATTERN = /([[:punct:][:cntrl:]]|[[:space:]])+/.freeze
|
12
12
|
CONVERT_VAT_TO_ISO_COUNTRY = { 'EL' => 'GR', 'XI' => 'GB' }.freeze
|
13
13
|
CONVERT_ISO_TO_VAT_COUNTRY = CONVERT_VAT_TO_ISO_COUNTRY.invert.freeze
|
14
14
|
|
data/lib/valvat/version.rb
CHANGED
@@ -16,4 +16,17 @@ describe Valvat::Lookup::Request do
|
|
16
16
|
expect(response).to be_a(Valvat::Lookup::Fault)
|
17
17
|
expect(response.to_hash).to eql({ valid: false })
|
18
18
|
end
|
19
|
+
|
20
|
+
context 'when Savon::UnknownOperationError is (wrongly) thrown' do
|
21
|
+
before do
|
22
|
+
dbl = double(Savon::Client)
|
23
|
+
allow(Savon::Client).to receive(:new).and_return(dbl)
|
24
|
+
allow(dbl).to receive(:call).and_raise(Savon::UnknownOperationError.new('from stub'))
|
25
|
+
end
|
26
|
+
|
27
|
+
it "does handle it like vies down" do
|
28
|
+
response = described_class.new('IE6388047V', {}).perform
|
29
|
+
expect(response.to_hash[:error]).to be_a(Valvat::OperationUnknown)
|
30
|
+
end
|
31
|
+
end
|
19
32
|
end
|
data/spec/valvat/lookup_spec.rb
CHANGED
@@ -239,5 +239,39 @@ describe Valvat::Lookup do
|
|
239
239
|
expect(described_class.validate('DE601', options.merge(raise_error: false))).to be(nil)
|
240
240
|
end
|
241
241
|
end
|
242
|
+
|
243
|
+
describe 'Error : Savon::UnknownOperationError' do
|
244
|
+
before do
|
245
|
+
dbl = double(Savon::Client)
|
246
|
+
allow(Savon::Client).to receive(:new).and_return(dbl)
|
247
|
+
allow(dbl).to receive(:call).and_raise(Savon::UnknownOperationError.new('from stub'))
|
248
|
+
end
|
249
|
+
subject(:result) { described_class.validate('DE601', options) }
|
250
|
+
|
251
|
+
it 'raises error' do
|
252
|
+
expect { result }.to raise_error(Valvat::OperationUnknown, /#<Savon::UnknownOperationError: from stub>/)
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'returns nil with raise_error set to false' do
|
256
|
+
expect(described_class.validate('DE601', options.merge(raise_error: false))).to be(nil)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
describe 'Error : Savon::HTTPError' do
|
261
|
+
before do
|
262
|
+
dbl = double(Savon::Client)
|
263
|
+
allow(Savon::Client).to receive(:new).and_return(dbl)
|
264
|
+
allow(dbl).to receive(:call).and_raise(Savon::HTTPError.new(Struct.new(:code, :body).new(403, 'from stub')))
|
265
|
+
end
|
266
|
+
subject(:result) { described_class.validate('DE601', options) }
|
267
|
+
|
268
|
+
it 'raises error' do
|
269
|
+
expect { result }.to raise_error(Valvat::HTTPError, /#<Savon::HTTPError: HTTP error \(403\): from stub>/)
|
270
|
+
end
|
271
|
+
|
272
|
+
it 'returns nil with raise_error set to false' do
|
273
|
+
expect(described_class.validate('DE601', options.merge(raise_error: false))).to be(nil)
|
274
|
+
end
|
275
|
+
end
|
242
276
|
end
|
243
277
|
end
|
data.tar.gz.sig
CHANGED
@@ -1,3 +1 @@
|
|
1
|
-
|
2
|
-
n���S��������%�2l������_�!�L����O�:��
|
3
|
-
�K�?�aJmW�x´�L-�F��
|
1
|
+
X�R��oy����+�����k�d���/�P�je�?�C�5�����S���cQ�fۆ���=4f�À�nQ��Y�t8�u�f瑘 �}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: valvat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Munz
|
@@ -10,31 +10,32 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
13
|
+
MIIEZDCCAsygAwIBAgIBATANBgkqhkiG9w0BAQsFADA8MRIwEAYDVQQDDAlzZWJh
|
14
|
+
c3RpYW4xEjAQBgoJkiaJk/IsZAEZFgJ5bzESMBAGCgmSJomT8ixkARkWAmxrMB4X
|
15
|
+
DTIyMDEyNjE4MjIxNFoXDTIzMDEyNjE4MjIxNFowPDESMBAGA1UEAwwJc2ViYXN0
|
16
|
+
aWFuMRIwEAYKCZImiZPyLGQBGRYCeW8xEjAQBgoJkiaJk/IsZAEZFgJsazCCAaIw
|
17
|
+
DQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAM8Gdm81LvuqMyJr9sO+KtJz+PhM
|
18
|
+
x75w6uc5q3J8sTHGhOtWJlXiBFf8gbBkxUsQwDMEEbJ+WV63oqq9InVBrMHg9FxH
|
19
|
+
415dC0UlCv5IjKij4N5OVRnUTZDoxXczVVscNFyQcRhJO1TqORw6uOF8gd/MVWl4
|
20
|
+
6gJapzkLBMTIaqRUVbX3hTJpiGc1RV2zJmLkkvBtJ+lzqza0bklXh52LLs2UpTc1
|
21
|
+
e5ADVoq9K09G5QXES/GlFMYerQbtdXl0KpUQugXtRFAOoOrFKQFLETZSDq80lC7p
|
22
|
+
+zN+wNOEAuHtJP7EZVk/gU8hEkSDMexW5NRndgeQb+N/JH8DIRBbhOytZbAo19Pq
|
23
|
+
LEZBucHheI0xstLWuIP+ktwa/rIWv5v4gv3JZ/4H3q6tGPHigLKneRmaXo3e6jna
|
24
|
+
RFDxQLXbJgI37qusk4Qyl/iBVSBZ+TABBvA/jPXnHdd29qkuMTXvWLIiBDM6H0+2
|
25
|
+
SUabsieR1CqNZs/6YLO7nQHwFudHqzo8OB4+3QIDAQABo3EwbzAJBgNVHRMEAjAA
|
26
|
+
MAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUfC99QRDzqEe0tw1Da+XR9u4dmjEwGgYD
|
27
|
+
VR0RBBMwEYEPc2ViYXN0aWFuQHlvLmxrMBoGA1UdEgQTMBGBD3NlYmFzdGlhbkB5
|
28
|
+
by5sazANBgkqhkiG9w0BAQsFAAOCAYEAwYCyAFFXgYXWgaO8vQEZoQSjp5v6g1v/
|
29
|
+
t9TcO8JmX6UqEgoRHsdxPEyCK9RroYIv7X5GDyJ12ZdiGpzCqJiBIC9Gz3cCWAbp
|
30
|
+
LtnkhO8SQbz5B0NMOvo4o6XnbAr+rhVihuJmf0zXInnm1KZW/Yi+4JNAebPqwF1S
|
31
|
+
VZ/2Dz2BtTuTFhqlHOGxV2NxcnZjFff9kfUOLwl/oNUKgBecsMP5aW74zSOmc2fO
|
32
|
+
3sykOkKf5mWSY/KSuaCmAP1Ou3UUXOQmxiPUW9SDAzhYGKS63yPMkzJAziDP9ewI
|
33
|
+
zmOE2OJr0NuCmH9ykqlJZU4wnmloCnE1+8kHCl4+76cgBnN5gnYnzUb4RDM3J4EI
|
34
|
+
Jdm7+JxQbgAP/HJ2C2ara+uwc9jwhw2s1b2+TPnVCZdh9uBttHWfk0wgDoeFwky1
|
35
|
+
BUdT7mtr41GgvWnIjaGWAldSuabxx5H+PKS5FzjNDMHThRZWuvYp/nP2RXDh4gIa
|
36
|
+
7hV09P+XxvS96G+petG5KmC/lev8VqKu
|
36
37
|
-----END CERTIFICATE-----
|
37
|
-
date:
|
38
|
+
date: 2022-01-26 00:00:00.000000000 Z
|
38
39
|
dependencies:
|
39
40
|
- !ruby/object:Gem::Dependency
|
40
41
|
name: savon
|
@@ -112,6 +113,7 @@ files:
|
|
112
113
|
- certs/yolk.pem
|
113
114
|
- gemfiles/activemodel-5
|
114
115
|
- gemfiles/activemodel-6
|
116
|
+
- gemfiles/activemodel-7
|
115
117
|
- gemfiles/standalone
|
116
118
|
- lib/active_model/validations/valvat_validator.rb
|
117
119
|
- lib/valvat.rb
|
@@ -225,8 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
227
|
- !ruby/object:Gem::Version
|
226
228
|
version: '0'
|
227
229
|
requirements: []
|
228
|
-
|
229
|
-
rubygems_version: 2.7.6.2
|
230
|
+
rubygems_version: 3.3.3
|
230
231
|
signing_key:
|
231
232
|
specification_version: 4
|
232
233
|
summary: Validates european vat numbers. Standalone or as a ActiveModel validator.
|
metadata.gz.sig
CHANGED
Binary file
|