identified 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/data/ssn/area_data.txt +58 -0
  3. data/data/ssn/area_data_raw.txt +66 -0
  4. data/data/ssn/high_groups/april_2004_raw.txt +145 -0
  5. data/data/ssn/high_groups/april_2005_raw.txt +138 -0
  6. data/data/ssn/high_groups/april_2006_raw.txt +140 -0
  7. data/data/ssn/high_groups/april_2007_raw.txt +141 -0
  8. data/data/ssn/high_groups/april_2008_raw.txt +141 -0
  9. data/data/ssn/high_groups/april_2009_raw.txt +140 -0
  10. data/data/ssn/high_groups/april_2010_raw.txt +140 -0
  11. data/data/ssn/high_groups/april_2011_raw.txt +141 -0
  12. data/data/ssn/high_groups/august_2004_raw.txt +137 -0
  13. data/data/ssn/high_groups/august_2005_raw.txt +139 -0
  14. data/data/ssn/high_groups/august_2006_raw.txt +140 -0
  15. data/data/ssn/high_groups/august_2007_raw.txt +141 -0
  16. data/data/ssn/high_groups/august_2008_raw.txt +141 -0
  17. data/data/ssn/high_groups/august_2009_raw.txt +140 -0
  18. data/data/ssn/high_groups/august_2010_raw.txt +141 -0
  19. data/data/ssn/high_groups/december_2003_raw.txt +138 -0
  20. data/data/ssn/high_groups/december_2004_raw.txt +138 -0
  21. data/data/ssn/high_groups/december_2005_raw.txt +140 -0
  22. data/data/ssn/high_groups/december_2006_raw.txt +140 -0
  23. data/data/ssn/high_groups/december_2007_raw.txt +141 -0
  24. data/data/ssn/high_groups/december_2008_raw.txt +141 -0
  25. data/data/ssn/high_groups/december_2009_raw.txt +140 -0
  26. data/data/ssn/high_groups/december_2010_raw.txt +141 -0
  27. data/data/ssn/high_groups/february_2004_raw.txt +137 -0
  28. data/data/ssn/high_groups/february_2005_raw.txt +138 -0
  29. data/data/ssn/high_groups/february_2006_raw.txt +140 -0
  30. data/data/ssn/high_groups/february_2007_raw.txt +141 -0
  31. data/data/ssn/high_groups/february_2008_raw.txt +141 -0
  32. data/data/ssn/high_groups/february_2009_raw.txt +140 -0
  33. data/data/ssn/high_groups/february_2010_raw.txt +140 -0
  34. data/data/ssn/high_groups/february_2011_raw.txt +141 -0
  35. data/data/ssn/high_groups/january_2004_raw.txt +137 -0
  36. data/data/ssn/high_groups/january_2005_raw.txt +138 -0
  37. data/data/ssn/high_groups/january_2006_raw.txt +140 -0
  38. data/data/ssn/high_groups/january_2007_raw.txt +141 -0
  39. data/data/ssn/high_groups/january_2008_raw.txt +141 -0
  40. data/data/ssn/high_groups/january_2009_raw.txt +141 -0
  41. data/data/ssn/high_groups/january_2010_raw.txt +140 -0
  42. data/data/ssn/high_groups/january_2011_raw.txt +141 -0
  43. data/data/ssn/high_groups/july_2004_raw.txt +137 -0
  44. data/data/ssn/high_groups/july_2005_raw.txt +139 -0
  45. data/data/ssn/high_groups/july_2006_raw.txt +140 -0
  46. data/data/ssn/high_groups/july_2007_raw.txt +141 -0
  47. data/data/ssn/high_groups/july_2008_raw.txt +141 -0
  48. data/data/ssn/high_groups/july_2009_raw.txt +140 -0
  49. data/data/ssn/high_groups/july_2010_raw.txt +141 -0
  50. data/data/ssn/high_groups/june_2004_raw.txt +137 -0
  51. data/data/ssn/high_groups/june_2005_raw.txt +139 -0
  52. data/data/ssn/high_groups/june_2006_raw.txt +140 -0
  53. data/data/ssn/high_groups/june_2007_raw.txt +141 -0
  54. data/data/ssn/high_groups/june_2008_raw.txt +141 -0
  55. data/data/ssn/high_groups/june_2009_raw.txt +140 -0
  56. data/data/ssn/high_groups/june_2010_raw.txt +141 -0
  57. data/data/ssn/high_groups/june_2011_raw.txt +141 -0
  58. data/data/ssn/high_groups/june_24_2011_raw.txt +141 -0
  59. data/data/ssn/high_groups/march_2004_raw.txt +137 -0
  60. data/data/ssn/high_groups/march_2005_raw.txt +138 -0
  61. data/data/ssn/high_groups/march_2006_raw.txt +140 -0
  62. data/data/ssn/high_groups/march_2007_raw.txt +141 -0
  63. data/data/ssn/high_groups/march_2008_raw.txt +141 -0
  64. data/data/ssn/high_groups/march_2009_raw.txt +140 -0
  65. data/data/ssn/high_groups/march_2010_raw.txt +140 -0
  66. data/data/ssn/high_groups/march_2011_raw.txt +141 -0
  67. data/data/ssn/high_groups/may_2004_raw.txt +137 -0
  68. data/data/ssn/high_groups/may_2005_raw.txt +139 -0
  69. data/data/ssn/high_groups/may_2006_raw.txt +140 -0
  70. data/data/ssn/high_groups/may_2007_raw.txt +141 -0
  71. data/data/ssn/high_groups/may_2008_raw.txt +141 -0
  72. data/data/ssn/high_groups/may_2009_raw.txt +140 -0
  73. data/data/ssn/high_groups/may_2010_raw.txt +140 -0
  74. data/data/ssn/high_groups/may_2011_raw.txt +141 -0
  75. data/data/ssn/high_groups/november_2003_raw.txt +138 -0
  76. data/data/ssn/high_groups/november_2004_raw.txt +137 -0
  77. data/data/ssn/high_groups/november_2005_raw.txt +140 -0
  78. data/data/ssn/high_groups/november_2006_raw.txt +140 -0
  79. data/data/ssn/high_groups/november_2007_raw.txt +141 -0
  80. data/data/ssn/high_groups/november_2008_raw.txt +141 -0
  81. data/data/ssn/high_groups/november_2009_raw.txt +140 -0
  82. data/data/ssn/high_groups/november_2010_raw.txt +142 -0
  83. data/data/ssn/high_groups/october_2004_raw.txt +137 -0
  84. data/data/ssn/high_groups/october_2005_raw.txt +139 -0
  85. data/data/ssn/high_groups/october_2006_raw.txt +140 -0
  86. data/data/ssn/high_groups/october_2007_raw.txt +141 -0
  87. data/data/ssn/high_groups/october_2008_raw.txt +141 -0
  88. data/data/ssn/high_groups/october_2009_raw.txt +140 -0
  89. data/data/ssn/high_groups/october_2010_raw.txt +141 -0
  90. data/data/ssn/high_groups/september_2004_raw.txt +137 -0
  91. data/data/ssn/high_groups/september_2005_raw.txt +139 -0
  92. data/data/ssn/high_groups/september_2006_raw.txt +140 -0
  93. data/data/ssn/high_groups/september_2007_raw.txt +141 -0
  94. data/data/ssn/high_groups/september_2008_raw.txt +141 -0
  95. data/data/ssn/high_groups/september_2009_raw.txt +141 -0
  96. data/data/ssn/high_groups/september_2010_raw.txt +141 -0
  97. data/lib/identified.rb +24 -0
  98. data/lib/identified/errors/error.rb +5 -0
  99. data/lib/identified/errors/ssn/malformed_ssn_error.rb +5 -0
  100. data/lib/identified/ssn/area_number.rb +15 -0
  101. data/lib/identified/ssn/group_number.rb +27 -0
  102. data/lib/identified/ssn/high_group_data.rb +27 -0
  103. data/lib/identified/ssn/high_group_list.rb +48 -0
  104. data/lib/identified/ssn/issuing_state_data.rb +44 -0
  105. data/lib/identified/ssn/sequential_group_number.rb +43 -0
  106. data/lib/identified/ssn/serial_number.rb +10 -0
  107. data/lib/identified/ssn/ssn.rb +74 -0
  108. metadata +150 -0
@@ -0,0 +1,43 @@
1
+ module Identified
2
+ # An alternate version of the group number indexed by the allocation sequence. 1 indicates the 1st
3
+ # group number issued. 70 indicates the 70th group number issued, etc.
4
+ class SequentialGroupNumber < DelegateClass(Fixnum)
5
+ # Takes a regular group number and becomes a representation sequenced by allocation order.
6
+ # Input values must be between 1 and 99. Output values will be between 1 and 100
7
+ def initialize(group_number)
8
+ sequential_group_number = self.class.convert_to_sequential_number(group_number)
9
+ super(sequential_group_number)
10
+ end
11
+
12
+ # Converts a group number to the index of the sequence of its allocation. Valid return values
13
+ # are between 1 and 100.
14
+ def self.convert_to_sequential_number(group_number)
15
+ @group_index_table ||= generate_index_conversion
16
+ @group_index_table.fetch(group_number)
17
+ end
18
+
19
+ # Creates the conversion table that goes from regular group number to the index of allocation
20
+ def self.generate_index_conversion
21
+ index_table = {}
22
+
23
+ # Build the lookup table (group number => sequence number).
24
+ allocation_sequence.each.with_index(1) do |group_number, index|
25
+ index_table[group_number] = index
26
+ end
27
+
28
+ index_table
29
+ end
30
+ private_class_method :generate_index_conversion
31
+
32
+ def self.allocation_sequence
33
+ # Group numbers are allocated in the order that follows:
34
+ # ODD - 01, 03, 05, 07, 09
35
+ # EVEN - 10 to 98
36
+ # EVEN - 02, 04, 06, 08
37
+ # ODD - 11 to 99
38
+ # See http://www.ssa.gov/history/ssn/geocard.html for details.
39
+ [*(1..9).step(2), *(10..98).step(2), *(2..8).step(2), *(11..99).step(2)]
40
+ end
41
+ private_class_method :allocation_sequence
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ module Identified
2
+ # Represents the serial number of an SSN and performs simple validation.
3
+ class SerialNumber < DelegateClass(Fixnum)
4
+ # All non-zero serial numbers are valid regardless of when the ssn was issued.
5
+ # See http://www.ssa.gov/history/ssn/geocard.html
6
+ def valid?
7
+ (1..9999).include?(self)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,74 @@
1
+ module Identified
2
+ # Represents a Social Security Number and provides validation functionality.
3
+ class SSN
4
+ RANDOMIZATION_DATE = Date.parse('2011-06-25').freeze
5
+ RETIRED_SSNS = %w(078-05-1120 219-09-9999)
6
+ SSN_REGEX = /\A\d{3}-\d{2}-\d{4}\Z/
7
+ SSN_REGEX_WITHOUT_DASHES = /\A(?<area>\d{3})(?<group>\d{2})(?<serial>\d{4})\Z/
8
+
9
+ attr_reader :date_issued, :area, :group, :serial
10
+
11
+ # Date is optional but should be provided to improve validation quality.
12
+ def initialize(ssn_string, options = {})
13
+ area_num, group_num, serial_num = extract_ssn_values(ssn_string)
14
+
15
+ @area = AreaNumber.new(area_num)
16
+ @group = GroupNumber.new(group_num)
17
+ @serial = SerialNumber.new(serial_num)
18
+
19
+ # Emulating keyword arguments to provide ruby 1.9.3 support.
20
+ if options.instance_of?(Hash)
21
+ @date_issued = options.delete(:date_issued)
22
+ else
23
+ fail ArgumentError, 'Unexpected argument. The second argument must be an options hash.'
24
+ end
25
+ fail ArgumentError, "Unrecgonized option(s): #{options}" if options.any?
26
+ end
27
+
28
+ # Returns whether the ssn COULD be a valid ssn.
29
+ def valid?
30
+ area.valid? && group.valid?(area, date_issued) && serial.valid? && !retired?
31
+ end
32
+
33
+ # Provides an array of potential states or protectorates the ssn was issued in. This information
34
+ # cannot be known unless an issuance date is known and it before SSN randomizaiton. If no
35
+ # information is avaliable, issuing_states will return [].
36
+ def issuing_states
37
+ IssuingStateData.issuing_states(area, date_issued)
38
+ end
39
+
40
+ def ==(other)
41
+ area == other.area && group == other.group && serial == other.serial
42
+ end
43
+
44
+ # Uses '123-45-6789' format.
45
+ def to_s
46
+ format('%.03d-%.02d-%.04d', area, group, serial)
47
+ end
48
+
49
+ private
50
+
51
+ # Determines if the ssn is one of the handful of abused / always invalid ssns.
52
+ def retired?
53
+ RETIRED_SSNS.map { |ssn_string| SSN.new(ssn_string) }.any? { |ssn| ssn == self }
54
+ end
55
+
56
+ # Returns the integer components of a normalized ssn string for easy mass-assignment.
57
+ def extract_ssn_values(ssn_string)
58
+ formatted_ssn = format_ssn(ssn_string)
59
+ formatted_ssn.split('-').map(&:to_i)
60
+ end
61
+
62
+ # Validates / converts an inputted ssn string to the normalized 123-45-6789 format.
63
+ def format_ssn(ssn_string)
64
+ if ssn_string =~ SSN_REGEX
65
+ ssn_string
66
+ elsif ssn_string =~ SSN_REGEX_WITHOUT_DASHES
67
+ match = Regexp.last_match
68
+ "#{match[:area]}-#{match[:group]}-#{match[:serial]}"
69
+ else
70
+ fail MalformedSSNError
71
+ end
72
+ end
73
+ end
74
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: identified
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Gollahon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-29 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Validate government document identifiers (like SSNs) with ease.
14
+ email: Daniel.Gollahon@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - data/ssn/area_data.txt
20
+ - data/ssn/area_data_raw.txt
21
+ - data/ssn/high_groups/april_2004_raw.txt
22
+ - data/ssn/high_groups/april_2005_raw.txt
23
+ - data/ssn/high_groups/april_2006_raw.txt
24
+ - data/ssn/high_groups/april_2007_raw.txt
25
+ - data/ssn/high_groups/april_2008_raw.txt
26
+ - data/ssn/high_groups/april_2009_raw.txt
27
+ - data/ssn/high_groups/april_2010_raw.txt
28
+ - data/ssn/high_groups/april_2011_raw.txt
29
+ - data/ssn/high_groups/august_2004_raw.txt
30
+ - data/ssn/high_groups/august_2005_raw.txt
31
+ - data/ssn/high_groups/august_2006_raw.txt
32
+ - data/ssn/high_groups/august_2007_raw.txt
33
+ - data/ssn/high_groups/august_2008_raw.txt
34
+ - data/ssn/high_groups/august_2009_raw.txt
35
+ - data/ssn/high_groups/august_2010_raw.txt
36
+ - data/ssn/high_groups/december_2003_raw.txt
37
+ - data/ssn/high_groups/december_2004_raw.txt
38
+ - data/ssn/high_groups/december_2005_raw.txt
39
+ - data/ssn/high_groups/december_2006_raw.txt
40
+ - data/ssn/high_groups/december_2007_raw.txt
41
+ - data/ssn/high_groups/december_2008_raw.txt
42
+ - data/ssn/high_groups/december_2009_raw.txt
43
+ - data/ssn/high_groups/december_2010_raw.txt
44
+ - data/ssn/high_groups/february_2004_raw.txt
45
+ - data/ssn/high_groups/february_2005_raw.txt
46
+ - data/ssn/high_groups/february_2006_raw.txt
47
+ - data/ssn/high_groups/february_2007_raw.txt
48
+ - data/ssn/high_groups/february_2008_raw.txt
49
+ - data/ssn/high_groups/february_2009_raw.txt
50
+ - data/ssn/high_groups/february_2010_raw.txt
51
+ - data/ssn/high_groups/february_2011_raw.txt
52
+ - data/ssn/high_groups/january_2004_raw.txt
53
+ - data/ssn/high_groups/january_2005_raw.txt
54
+ - data/ssn/high_groups/january_2006_raw.txt
55
+ - data/ssn/high_groups/january_2007_raw.txt
56
+ - data/ssn/high_groups/january_2008_raw.txt
57
+ - data/ssn/high_groups/january_2009_raw.txt
58
+ - data/ssn/high_groups/january_2010_raw.txt
59
+ - data/ssn/high_groups/january_2011_raw.txt
60
+ - data/ssn/high_groups/july_2004_raw.txt
61
+ - data/ssn/high_groups/july_2005_raw.txt
62
+ - data/ssn/high_groups/july_2006_raw.txt
63
+ - data/ssn/high_groups/july_2007_raw.txt
64
+ - data/ssn/high_groups/july_2008_raw.txt
65
+ - data/ssn/high_groups/july_2009_raw.txt
66
+ - data/ssn/high_groups/july_2010_raw.txt
67
+ - data/ssn/high_groups/june_2004_raw.txt
68
+ - data/ssn/high_groups/june_2005_raw.txt
69
+ - data/ssn/high_groups/june_2006_raw.txt
70
+ - data/ssn/high_groups/june_2007_raw.txt
71
+ - data/ssn/high_groups/june_2008_raw.txt
72
+ - data/ssn/high_groups/june_2009_raw.txt
73
+ - data/ssn/high_groups/june_2010_raw.txt
74
+ - data/ssn/high_groups/june_2011_raw.txt
75
+ - data/ssn/high_groups/june_24_2011_raw.txt
76
+ - data/ssn/high_groups/march_2004_raw.txt
77
+ - data/ssn/high_groups/march_2005_raw.txt
78
+ - data/ssn/high_groups/march_2006_raw.txt
79
+ - data/ssn/high_groups/march_2007_raw.txt
80
+ - data/ssn/high_groups/march_2008_raw.txt
81
+ - data/ssn/high_groups/march_2009_raw.txt
82
+ - data/ssn/high_groups/march_2010_raw.txt
83
+ - data/ssn/high_groups/march_2011_raw.txt
84
+ - data/ssn/high_groups/may_2004_raw.txt
85
+ - data/ssn/high_groups/may_2005_raw.txt
86
+ - data/ssn/high_groups/may_2006_raw.txt
87
+ - data/ssn/high_groups/may_2007_raw.txt
88
+ - data/ssn/high_groups/may_2008_raw.txt
89
+ - data/ssn/high_groups/may_2009_raw.txt
90
+ - data/ssn/high_groups/may_2010_raw.txt
91
+ - data/ssn/high_groups/may_2011_raw.txt
92
+ - data/ssn/high_groups/november_2003_raw.txt
93
+ - data/ssn/high_groups/november_2004_raw.txt
94
+ - data/ssn/high_groups/november_2005_raw.txt
95
+ - data/ssn/high_groups/november_2006_raw.txt
96
+ - data/ssn/high_groups/november_2007_raw.txt
97
+ - data/ssn/high_groups/november_2008_raw.txt
98
+ - data/ssn/high_groups/november_2009_raw.txt
99
+ - data/ssn/high_groups/november_2010_raw.txt
100
+ - data/ssn/high_groups/october_2004_raw.txt
101
+ - data/ssn/high_groups/october_2005_raw.txt
102
+ - data/ssn/high_groups/october_2006_raw.txt
103
+ - data/ssn/high_groups/october_2007_raw.txt
104
+ - data/ssn/high_groups/october_2008_raw.txt
105
+ - data/ssn/high_groups/october_2009_raw.txt
106
+ - data/ssn/high_groups/october_2010_raw.txt
107
+ - data/ssn/high_groups/september_2004_raw.txt
108
+ - data/ssn/high_groups/september_2005_raw.txt
109
+ - data/ssn/high_groups/september_2006_raw.txt
110
+ - data/ssn/high_groups/september_2007_raw.txt
111
+ - data/ssn/high_groups/september_2008_raw.txt
112
+ - data/ssn/high_groups/september_2009_raw.txt
113
+ - data/ssn/high_groups/september_2010_raw.txt
114
+ - lib/identified.rb
115
+ - lib/identified/errors/error.rb
116
+ - lib/identified/errors/ssn/malformed_ssn_error.rb
117
+ - lib/identified/ssn/area_number.rb
118
+ - lib/identified/ssn/group_number.rb
119
+ - lib/identified/ssn/high_group_data.rb
120
+ - lib/identified/ssn/high_group_list.rb
121
+ - lib/identified/ssn/issuing_state_data.rb
122
+ - lib/identified/ssn/sequential_group_number.rb
123
+ - lib/identified/ssn/serial_number.rb
124
+ - lib/identified/ssn/ssn.rb
125
+ homepage: http://rubygems.org/gems/identified
126
+ licenses:
127
+ - MIT
128
+ metadata: {}
129
+ post_install_message:
130
+ rdoc_options: []
131
+ require_paths:
132
+ - lib
133
+ required_ruby_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 1.9.3
138
+ required_rubygems_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 2.4.6
146
+ signing_key:
147
+ specification_version: 4
148
+ summary: A simple ssn validator.
149
+ test_files: []
150
+ has_rdoc: