identified 0.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.
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: