ssn_validation 0.1.2 → 0.1.7
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 +4 -4
- data/.github/workflows/ruby.yml +35 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +36 -0
- data/README.md +43 -0
- data/Rakefile +3 -1
- data/lib/ssn_validation/ssn.rb +20 -4
- data/lib/ssn_validation/ssn_validation.rb +2 -0
- data/lib/ssn_validation.rb +7 -0
- data/lib/validators/social_security_number_validator.rb +5 -2
- data/lib/version.rb +1 -1
- data/ssn_validation.gemspec +1 -0
- data/test/lib/ssn_validation/ssn_test.rb +49 -32
- data/test/lib/validators/social_security_number_validator_test.rb +28 -16
- metadata +26 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0feef3d1f27edb2f2ccd820dc2fb1663c860826c376f33e15f36b134c089a7e9
|
4
|
+
data.tar.gz: 33ad0dfc1f6cce507e48599cf5a4a1d67b8ffdac7c27431f5579b6d2f68122ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fdb7750c8a6600fb576c9ae9ac0f6712e4b7b7c9fc52b4d0e1615fe5cadc72f5ca4c70f544dab0c5070bad228724ad21154ac08ae81059fe70b9c17d93acae22
|
7
|
+
data.tar.gz: c7cccf7151291da421987e1272c08044561b9863998c7fcb7a223d334541dfa8f7e242348dc025f55f7ce5c502c7469b0e41b28ab55b4ee8a24fd13d1fcc286c
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
|
19
|
+
runs-on: ubuntu-latest
|
20
|
+
strategy:
|
21
|
+
matrix:
|
22
|
+
ruby-version: ['2.6', '2.7', '3.0']
|
23
|
+
|
24
|
+
steps:
|
25
|
+
- uses: actions/checkout@v2
|
26
|
+
- name: Set up Ruby
|
27
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
28
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
29
|
+
# uses: ruby/setup-ruby@v1
|
30
|
+
uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
|
31
|
+
with:
|
32
|
+
ruby-version: ${{ matrix.ruby-version }}
|
33
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
34
|
+
- name: Run tests
|
35
|
+
run: bundle exec rake
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
ssn_validation (0.1.6)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
activemodel (5.2.6)
|
10
|
+
activesupport (= 5.2.6)
|
11
|
+
activesupport (5.2.6)
|
12
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
13
|
+
i18n (>= 0.7, < 2)
|
14
|
+
minitest (~> 5.1)
|
15
|
+
tzinfo (~> 1.1)
|
16
|
+
concurrent-ruby (1.1.9)
|
17
|
+
i18n (1.8.11)
|
18
|
+
concurrent-ruby (~> 1.0)
|
19
|
+
minitest (5.14.4)
|
20
|
+
rake (12.3.3)
|
21
|
+
thread_safe (0.3.6)
|
22
|
+
tzinfo (1.2.9)
|
23
|
+
thread_safe (~> 0.1)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
x86_64-darwin-20
|
27
|
+
x86_64-linux
|
28
|
+
|
29
|
+
DEPENDENCIES
|
30
|
+
activemodel (~> 5)
|
31
|
+
minitest
|
32
|
+
rake (~> 12)
|
33
|
+
ssn_validation!
|
34
|
+
|
35
|
+
BUNDLED WITH
|
36
|
+
2.2.22
|
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# SsnValidation
|
2
|
+
|
3
|
+
SsnValidation is a very basic ruby gem that can validate a US Social Security Number (SSN) or ITIN. It returns a hash of error keys/messages that can be
|
4
|
+
used within ActiveRecord errors or otherwise to ensure syntactically valid SSNs.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'ssn_validation'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
$ bundle
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
|
20
|
+
$ gem install ssn_validation
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
```
|
25
|
+
❯ irb
|
26
|
+
> require 'ssn_validation'
|
27
|
+
> SsnValidation::Ssn.validate('abc')
|
28
|
+
=> {:nine_digits=>"SSN value is not 9 digits", :non_digits=>"SSN value contains non-digits"}
|
29
|
+
> SsnValidation::Ssn.validate(123006789)
|
30
|
+
=> {:zero_group=>"SSN value contains zeros in group number xxx-00-xxxx"}
|
31
|
+
> SsnValidation::Ssn.validate(nil)
|
32
|
+
=> {:nine_digits=>"SSN value is not 9 digits"}
|
33
|
+
> SsnValidation::Ssn.validate('')
|
34
|
+
=> {:nine_digits=>"SSN value is not 9 digits"}
|
35
|
+
```
|
36
|
+
|
37
|
+
## Contributing
|
38
|
+
|
39
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/johnsinco/ssn_validation
|
40
|
+
|
41
|
+
## License
|
42
|
+
|
43
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
data/lib/ssn_validation/ssn.rb
CHANGED
@@ -2,10 +2,11 @@ module SsnValidation
|
|
2
2
|
module Ssn
|
3
3
|
DIGITS = %w[0 1 2 3 4 5 6 7 8 9].freeze
|
4
4
|
DIGITS_EX0 = DIGITS[1..-1]
|
5
|
+
VALID_ITIN_GROUPS = [50..65, 70..88, 90..92, 94..99].map(&:to_a).flatten.freeze
|
5
6
|
|
6
7
|
# returns a hash of 0..n key/value pairs for ssn validation error codes and a default message for each
|
7
8
|
def self.validate(ssn)
|
8
|
-
ssn = ssn.to_s
|
9
|
+
ssn = ssn.to_s.delete('-') # be lenient with incoming dash chars
|
9
10
|
errors = {}
|
10
11
|
return errors if test_ssn?(ssn)
|
11
12
|
|
@@ -18,15 +19,23 @@ module SsnValidation
|
|
18
19
|
(ssn[0..2] == "000") && errors[:zero_area] = "SSN value contains zeros in area number 000-xx-xxxx"
|
19
20
|
(ssn[3..4] == "00") && errors[:zero_group] = "SSN value contains zeros in group number xxx-00-xxxx"
|
20
21
|
(ssn[5..8] == "0000") && errors[:zero_serial] = "SSN value contains zeros in serial number xxx-xx-0000"
|
21
|
-
ascending?(ssn) && errors[:ascending] = "SSN value contains all ASCENDING digits"
|
22
|
-
descending?(ssn) && errors[:descending] = "SSN value contains all DESCENDING digits"
|
23
22
|
return errors if errors.any? # return if ssn conditions fail
|
24
23
|
|
25
24
|
# check valid ITIN format last
|
26
25
|
invalid_itin?(ssn) && errors[:invalid_itin] = "SSN value contains invalid ITIN format 9xx-[x]x-xxxx"
|
26
|
+
|
27
|
+
# check extra validations for possible fake ssns if enabled
|
28
|
+
errors.merge!(validate_ascending_descending(ssn)) if enable_ascending?
|
27
29
|
errors
|
28
30
|
end
|
29
31
|
|
32
|
+
def self.validate_ascending_descending(ssn)
|
33
|
+
errors = {}
|
34
|
+
ascending?(ssn) && errors[:ascending] = "SSN value contains all ASCENDING digits"
|
35
|
+
descending?(ssn) && errors[:descending] = "SSN value contains all DESCENDING digits"
|
36
|
+
return errors
|
37
|
+
end
|
38
|
+
|
30
39
|
def self.ascending?(ssn)
|
31
40
|
return true if ssn.chars == DIGITS.rotate(ssn[0].to_i)[0..8]
|
32
41
|
return true if ssn.chars == DIGITS_EX0.rotate(ssn[0].to_i - 1)
|
@@ -41,13 +50,20 @@ module SsnValidation
|
|
41
50
|
false
|
42
51
|
end
|
43
52
|
|
53
|
+
# https://www.irs.gov/irm/part3/irm_03-021-263r
|
44
54
|
def self.invalid_itin?(ssn)
|
45
|
-
ssn[0] == "9"
|
55
|
+
return false unless ssn[0] == "9"
|
56
|
+
group = ssn[3..4].to_i
|
57
|
+
!VALID_ITIN_GROUPS.include?(group)
|
46
58
|
end
|
47
59
|
|
48
60
|
def self.test_ssn?(ssn)
|
49
61
|
SsnValidation.config.test_ssns.any? {|p| p.match(ssn)}
|
50
62
|
end
|
63
|
+
|
64
|
+
def self.enable_ascending?
|
65
|
+
SsnValidation.config.enable_ascending
|
66
|
+
end
|
51
67
|
end
|
52
68
|
|
53
69
|
def self.validate(ssn)
|
data/lib/ssn_validation.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'ssn_validation/ssn'
|
3
|
+
|
1
4
|
module ActiveModel
|
2
5
|
module Validations
|
3
6
|
class SocialSecurityNumberValidator < EachValidator
|
4
7
|
def validate_each(record, attribute, value)
|
5
|
-
ssn_errors = Ssn.validate(value)
|
8
|
+
ssn_errors = SsnValidation::Ssn.validate(value)
|
6
9
|
return if ssn_errors.blank?
|
7
|
-
ssn_errors.values.each {|error| record.errors
|
10
|
+
ssn_errors.values.each { |error| record.errors.add(attribute, error) }
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
data/lib/version.rb
CHANGED
data/ssn_validation.gemspec
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
|
-
require 'ssn_validation
|
2
|
+
require 'ssn_validation'
|
3
3
|
|
4
4
|
class SsnTest < Minitest::Test
|
5
5
|
include SsnValidation
|
@@ -7,103 +7,120 @@ class SsnTest < Minitest::Test
|
|
7
7
|
describe 'valid formats' do
|
8
8
|
describe 'valid ITIN' do
|
9
9
|
it 'is valid' do
|
10
|
-
|
10
|
+
_(Ssn.validate('911781111')).must_equal({})
|
11
|
+
_(Ssn.validate('911501111')).must_equal({})
|
12
|
+
_(Ssn.validate('911651111')).must_equal({})
|
13
|
+
_(Ssn.validate('911651111')).must_equal({})
|
14
|
+
_(Ssn.validate('911881111')).must_equal({})
|
15
|
+
_(Ssn.validate('911901111')).must_equal({})
|
16
|
+
_(Ssn.validate('911991111')).must_equal({})
|
11
17
|
end
|
12
18
|
end
|
13
19
|
describe 'valid SSN' do
|
14
20
|
it 'is valid' do
|
15
|
-
|
21
|
+
_(Ssn.validate('123432100')).must_equal({})
|
16
22
|
end
|
17
23
|
end
|
18
24
|
describe 'valid repeating SSN' do
|
19
25
|
it 'is valid' do
|
20
|
-
|
26
|
+
_(Ssn.validate('123444444')).must_equal({})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
describe 'valid with dashes' do
|
30
|
+
it 'ignores the dashes' do
|
31
|
+
_(Ssn.validate('123-44-4444')).must_equal({})
|
21
32
|
end
|
22
33
|
end
|
23
34
|
end
|
24
35
|
describe 'invalid formats' do
|
25
36
|
describe '666 is invalid' do
|
26
37
|
it 'is valid' do
|
27
|
-
|
38
|
+
_(Ssn.validate('666123210')).must_equal({excluded_666: 'SSN value contains excluded area 666-xx-xxxx'})
|
28
39
|
end
|
29
40
|
end
|
30
41
|
describe 'zero area numbers invalid' do
|
31
42
|
it 'is invalid' do
|
32
|
-
|
43
|
+
_(Ssn.validate('000567890')).must_equal({zero_area: 'SSN value contains zeros in area number 000-xx-xxxx'})
|
33
44
|
end
|
34
45
|
end
|
35
46
|
describe 'zero group numbers invalid' do
|
36
47
|
it 'is invalid' do
|
37
|
-
|
48
|
+
_(Ssn.validate('567007890')).must_equal({zero_group: 'SSN value contains zeros in group number xxx-00-xxxx'})
|
38
49
|
end
|
39
50
|
end
|
40
51
|
describe 'zero serial numbers invalid' do
|
41
52
|
it 'is invalid' do
|
42
|
-
|
53
|
+
_(Ssn.validate('567890000')).must_equal({zero_serial: 'SSN value contains zeros in serial number xxx-xx-0000'})
|
43
54
|
end
|
44
55
|
end
|
45
56
|
describe 'non digits invalid' do
|
46
57
|
it 'is invalid' do
|
47
|
-
|
58
|
+
_(Ssn.validate('ABCDEFGHI')).must_equal({non_digits: 'SSN value contains non-digits'})
|
48
59
|
end
|
49
60
|
end
|
50
61
|
describe 'not 9 digits invalid' do
|
51
62
|
it 'is invalid' do
|
52
|
-
|
63
|
+
_(Ssn.validate('303')).must_equal({nine_digits: 'SSN value is not 9 digits'})
|
53
64
|
end
|
54
65
|
end
|
55
|
-
describe '
|
66
|
+
describe 'repeating digits invalid' do
|
56
67
|
it 'is invalid' do
|
57
|
-
|
58
|
-
assert_equal({ascending: 'SSN value contains all ASCENDING digits'}, Ssn.validate('567891234'))
|
68
|
+
_(Ssn.validate('888888888')).must_equal({repeating: 'SSN value contains repeating digits'})
|
59
69
|
end
|
60
70
|
end
|
61
|
-
describe '
|
71
|
+
describe 'invalid ITIN' do
|
62
72
|
it 'is invalid' do
|
63
|
-
|
64
|
-
|
65
|
-
assert_equal({ascending: 'SSN value contains all ASCENDING digits'}, Ssn.validate('234567891'))
|
73
|
+
_(Ssn.validate('900121234')).must_equal({invalid_itin: 'SSN value contains invalid ITIN format 9xx-[x]x-xxxx'})
|
74
|
+
_(Ssn.validate('900441234')).must_equal({invalid_itin: 'SSN value contains invalid ITIN format 9xx-[x]x-xxxx'})
|
66
75
|
end
|
67
76
|
end
|
68
|
-
|
77
|
+
end
|
78
|
+
describe 'do extra validations based on probably bogus SSNSs' do
|
79
|
+
before do
|
80
|
+
SsnValidation.config.enable_ascending = true
|
81
|
+
end
|
82
|
+
describe 'ascending digits invalid' do
|
69
83
|
it 'is invalid' do
|
70
|
-
|
71
|
-
|
72
|
-
assert_equal({descending: 'SSN value contains all DESCENDING digits'}, Ssn.validate('987654321'))
|
84
|
+
_(Ssn.validate('123456789')).must_equal({ascending: 'SSN value contains all ASCENDING digits'})
|
85
|
+
_(Ssn.validate('567891234')).must_equal({ascending: 'SSN value contains all ASCENDING digits'})
|
73
86
|
end
|
74
87
|
end
|
75
|
-
describe '
|
88
|
+
describe 'ascending digits ex 0 invalid' do
|
76
89
|
it 'is invalid' do
|
77
|
-
|
78
|
-
|
90
|
+
_(Ssn.validate('678912345')).must_equal({ascending: 'SSN value contains all ASCENDING digits'})
|
91
|
+
_(Ssn.validate('123456789')).must_equal({ascending: 'SSN value contains all ASCENDING digits'})
|
92
|
+
_(Ssn.validate('234567891')).must_equal({ascending: 'SSN value contains all ASCENDING digits'})
|
79
93
|
end
|
80
94
|
end
|
81
|
-
describe '
|
95
|
+
describe 'descending digits invalid' do
|
82
96
|
it 'is invalid' do
|
83
|
-
|
97
|
+
_(Ssn.validate('876543210')).must_equal({descending: 'SSN value contains all DESCENDING digits'})
|
98
|
+
_(Ssn.validate('321098765')).must_equal({descending: 'SSN value contains all DESCENDING digits'})
|
99
|
+
_(Ssn.validate('765432109')).must_equal({descending: 'SSN value contains all DESCENDING digits'})
|
84
100
|
end
|
85
101
|
end
|
86
|
-
describe 'invalid
|
102
|
+
describe 'descending digits ex 0 invalid' do
|
87
103
|
it 'is invalid' do
|
88
|
-
|
104
|
+
_(Ssn.validate('321987654')).must_equal({descending: 'SSN value contains all DESCENDING digits'})
|
105
|
+
_(Ssn.validate('765432198')).must_equal({descending: 'SSN value contains all DESCENDING digits'})
|
89
106
|
end
|
90
107
|
end
|
91
108
|
end
|
92
109
|
describe 'allowing dummy ssns' do
|
93
110
|
it 'allows 666xxxxx' do
|
94
111
|
SsnValidation.config.test_ssns = [/^666/]
|
95
|
-
|
112
|
+
_(Ssn.validate('666123456')).must_equal({})
|
96
113
|
SsnValidation.config.test_ssns = []
|
97
114
|
end
|
98
115
|
it 'allows random test ssns' do
|
99
116
|
SsnValidation.config.test_ssns = ['509421234']
|
100
|
-
|
117
|
+
_(Ssn.validate('509421234')).must_equal({})
|
101
118
|
SsnValidation.config.test_ssns = []
|
102
119
|
end
|
103
120
|
it 'allows multiple test ssns' do
|
104
121
|
SsnValidation.config.test_ssns = ['999999999', /^666/]
|
105
|
-
|
106
|
-
|
122
|
+
_(Ssn.validate('666123456')).must_equal({})
|
123
|
+
_(Ssn.validate('999999999')).must_equal({})
|
107
124
|
SsnValidation.config.test_ssns = []
|
108
125
|
end
|
109
126
|
end
|
@@ -1,18 +1,30 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'active_model'
|
3
|
+
require 'ssn_validation'
|
4
|
+
require 'validators/social_security_number_validator'
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
class SsnTestModel
|
7
|
+
include ActiveModel::Validations
|
8
|
+
attr_accessor :ssn
|
9
|
+
validates :ssn, social_security_number: true
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
class SocialSecurityNumberValidatorTest < Minitest::Test
|
13
|
+
describe 'it uses the ssn validation rules' do
|
14
|
+
it 'validates' do
|
15
|
+
subject = SsnTestModel.new
|
16
|
+
subject.ssn = '123454321'
|
17
|
+
assert subject.valid?
|
18
|
+
assert_equal({}, subject.errors.to_h)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'can use the ascending validation rules' do
|
22
|
+
SsnValidation.config.enable_ascending = true
|
23
|
+
subject = SsnTestModel.new
|
24
|
+
subject.ssn = '123456789'
|
25
|
+
subject.valid?
|
26
|
+
assert_equal({ssn: 'SSN value contains all ASCENDING digits'}, subject.errors.to_h)
|
27
|
+
SsnValidation.config.enable_ascending = false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ssn_validation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Stewart
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -38,12 +38,30 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '5'
|
41
|
-
|
42
|
-
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description:
|
56
|
+
email:
|
43
57
|
executables: []
|
44
58
|
extensions: []
|
45
59
|
extra_rdoc_files: []
|
46
60
|
files:
|
61
|
+
- ".github/workflows/ruby.yml"
|
62
|
+
- Gemfile
|
63
|
+
- Gemfile.lock
|
64
|
+
- README.md
|
47
65
|
- Rakefile
|
48
66
|
- lib/ssn_validation.rb
|
49
67
|
- lib/ssn_validation/ssn.rb
|
@@ -58,7 +76,7 @@ homepage: https://github.com/johnsinco/ssn_validation
|
|
58
76
|
licenses:
|
59
77
|
- Apache-2.0
|
60
78
|
metadata: {}
|
61
|
-
post_install_message:
|
79
|
+
post_install_message:
|
62
80
|
rdoc_options: []
|
63
81
|
require_paths:
|
64
82
|
- lib
|
@@ -73,9 +91,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
73
91
|
- !ruby/object:Gem::Version
|
74
92
|
version: '0'
|
75
93
|
requirements: []
|
76
|
-
|
77
|
-
|
78
|
-
signing_key:
|
94
|
+
rubygems_version: 3.2.22
|
95
|
+
signing_key:
|
79
96
|
specification_version: 4
|
80
97
|
summary: Social Security Number (SSN) Validation
|
81
98
|
test_files:
|