fips_lookup 0.2.1 → 1.0.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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile +1 -7
  4. data/Gemfile.lock +66 -29
  5. data/README.md +82 -138
  6. data/db/schema.sql +45 -0
  7. data/lib/data/fips.sqlite3 +0 -0
  8. data/lib/fips/county.rb +98 -0
  9. data/lib/fips/database.rb +55 -0
  10. data/lib/fips/state.rb +67 -0
  11. data/lib/fips/subdivision.rb +160 -0
  12. data/lib/fips/version.rb +5 -0
  13. data/lib/fips.rb +69 -0
  14. data/sig/fips.rbs +50 -0
  15. metadata +128 -71
  16. data/lib/data/county/AK.csv +0 -29
  17. data/lib/data/county/AL.csv +0 -67
  18. data/lib/data/county/AR.csv +0 -75
  19. data/lib/data/county/AS.csv +0 -5
  20. data/lib/data/county/AZ.csv +0 -15
  21. data/lib/data/county/CA.csv +0 -58
  22. data/lib/data/county/CO.csv +0 -64
  23. data/lib/data/county/CT.csv +0 -8
  24. data/lib/data/county/DC.csv +0 -1
  25. data/lib/data/county/DE.csv +0 -3
  26. data/lib/data/county/FL.csv +0 -67
  27. data/lib/data/county/GA.csv +0 -159
  28. data/lib/data/county/GU.csv +0 -1
  29. data/lib/data/county/HI.csv +0 -5
  30. data/lib/data/county/IA.csv +0 -99
  31. data/lib/data/county/ID.csv +0 -44
  32. data/lib/data/county/IL.csv +0 -102
  33. data/lib/data/county/IN.csv +0 -92
  34. data/lib/data/county/KS.csv +0 -105
  35. data/lib/data/county/KY.csv +0 -120
  36. data/lib/data/county/LA.csv +0 -64
  37. data/lib/data/county/MA.csv +0 -14
  38. data/lib/data/county/MD.csv +0 -24
  39. data/lib/data/county/ME.csv +0 -16
  40. data/lib/data/county/MI.csv +0 -83
  41. data/lib/data/county/MN.csv +0 -87
  42. data/lib/data/county/MO.csv +0 -115
  43. data/lib/data/county/MP.csv +0 -4
  44. data/lib/data/county/MS.csv +0 -82
  45. data/lib/data/county/MT.csv +0 -56
  46. data/lib/data/county/NC.csv +0 -100
  47. data/lib/data/county/ND.csv +0 -53
  48. data/lib/data/county/NE.csv +0 -93
  49. data/lib/data/county/NH.csv +0 -10
  50. data/lib/data/county/NJ.csv +0 -21
  51. data/lib/data/county/NM.csv +0 -33
  52. data/lib/data/county/NV.csv +0 -17
  53. data/lib/data/county/NY.csv +0 -62
  54. data/lib/data/county/OH.csv +0 -88
  55. data/lib/data/county/OK.csv +0 -77
  56. data/lib/data/county/OR.csv +0 -36
  57. data/lib/data/county/PA.csv +0 -67
  58. data/lib/data/county/PR.csv +0 -78
  59. data/lib/data/county/RI.csv +0 -5
  60. data/lib/data/county/SC.csv +0 -46
  61. data/lib/data/county/SD.csv +0 -66
  62. data/lib/data/county/TN.csv +0 -95
  63. data/lib/data/county/TX.csv +0 -254
  64. data/lib/data/county/UM.csv +0 -1
  65. data/lib/data/county/UT.csv +0 -29
  66. data/lib/data/county/VA.csv +0 -134
  67. data/lib/data/county/VI.csv +0 -3
  68. data/lib/data/county/VT.csv +0 -14
  69. data/lib/data/county/WA.csv +0 -39
  70. data/lib/data/county/WI.csv +0 -72
  71. data/lib/data/county/WV.csv +0 -55
  72. data/lib/data/county/WY.csv +0 -23
  73. data/lib/data/state.csv +0 -57
  74. data/lib/fips_lookup/version.rb +0 -5
  75. data/lib/fips_lookup.rb +0 -91
  76. data/sig/fips_lookup.rbs +0 -4
data/lib/fips/state.rb ADDED
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ # FIPS::State
4
+ module FIPS
5
+ class State
6
+ extend FIPS::Database::Access
7
+
8
+ class << self
9
+ def lookup(**params)
10
+ fips = params.fetch(:fips, nil)
11
+ state = params.fetch(:state, nil)
12
+
13
+ unless fips.nil?
14
+ raise ArgumentError, "FIPS input must be a 2 digit string" unless fips.is_a?(String) && fips.match?(/\A\d{2}\z/)
15
+
16
+ return by_fips(fips)
17
+ end
18
+
19
+ unless state.nil?
20
+ raise ArgumentError, "State input must be a non-empty string" unless state.is_a?(String) && !state.strip.empty?
21
+
22
+ return by_name(state)
23
+ end
24
+
25
+ raise ArgumentError, "Could not identify state with parameters provided: #{params.inspect}"
26
+ end
27
+
28
+ def all
29
+ db_all(
30
+ "SELECT state_fips AS fips, state_abbr AS abbr, name, ansi FROM states ORDER BY state_fips"
31
+ ).map { |state_row| formatted_state(state_row) }
32
+ end
33
+
34
+ private
35
+
36
+ def by_fips(fips)
37
+ state = db_first(
38
+ "SELECT state_fips AS fips, state_abbr AS abbr, name, ansi FROM states WHERE state_fips = ?",
39
+ [fips]
40
+ )
41
+ return formatted_state(state) unless state.nil?
42
+
43
+ raise FIPS::NotFoundError, "No state found with fips #{fips}"
44
+ end
45
+
46
+ def by_name(state)
47
+ state_upcase = state.upcase
48
+ state_row = db_first(
49
+ "SELECT state_fips AS fips, state_abbr AS abbr, name, ansi FROM states WHERE state_abbr = ? OR name_key = ? OR ansi = ? OR state_fips = ? LIMIT 1",
50
+ [state_upcase, state_upcase, state, state]
51
+ )
52
+ return formatted_state(state_row) unless state_row.nil?
53
+
54
+ raise FIPS::NotFoundError, "No state found matching: #{state}"
55
+ end
56
+
57
+ def formatted_state(row)
58
+ {
59
+ fips: row["fips"],
60
+ abbr: row["abbr"],
61
+ name: row["name"],
62
+ ansi: row["ansi"]
63
+ }
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ # FIPS::Subdivision
4
+ module FIPS
5
+ class Subdivision
6
+ extend FIPS::Database::Access
7
+
8
+ class << self
9
+ def lookup(**params)
10
+ fips = params.fetch(:fips, nil)
11
+ state = params.fetch(:state, nil)
12
+ county = params.fetch(:county, nil)
13
+ subdivision = params.fetch(:subdivision, nil)
14
+
15
+ unless fips.nil? || (fips.is_a?(String) && fips.match?(/\A(?:\d{2}|\d{3}|\d{5}|\d{10})\z/))
16
+ raise ArgumentError, "FIPS input must be a 2, 3, 5, or 10 digit string"
17
+ end
18
+ raise ArgumentError, "State input must be a non-empty string" unless state.nil? || (state.is_a?(String) && !state.strip.empty?)
19
+ raise ArgumentError, "County input must be a non-empty string" unless county.nil? || (county.is_a?(String) && !county.strip.empty?)
20
+ unless subdivision.nil? || (subdivision.is_a?(String) && !subdivision.strip.empty?)
21
+ raise ArgumentError, "Subdivision input must be a non-empty string"
22
+ end
23
+
24
+ location = identify_with_fips(fips, state, county, subdivision)
25
+ return location unless location.nil?
26
+
27
+ if %i[state county subdivision].all? { |key| !params[key].nil? }
28
+ state_fips = FIPS::State.lookup(state: state)[:fips]
29
+ return by_name(state_fips, county, subdivision) unless state_fips.nil?
30
+ end
31
+
32
+ raise ArgumentError, "cannot determine subdivision: no valid parameters provided"
33
+ end
34
+
35
+ def all(state:, county: nil)
36
+ raise ArgumentError, "State input must be a non-empty string" unless state.is_a?(String) && !state.strip.empty?
37
+ raise ArgumentError, "County input must be a non-empty string" unless county.nil? || (county.is_a?(String) && !county.strip.empty?)
38
+
39
+ state_fips = FIPS::State.lookup(state: state)[:fips]
40
+ where_clause = "subdivisions.state_fips = ?"
41
+ bind_vars = [state_fips]
42
+ unless county.nil?
43
+ where_clause += " AND counties.name_key = ?"
44
+ bind_vars << county.upcase
45
+ end
46
+ select_subdivisions(where_clause, bind_vars)
47
+ end
48
+
49
+ private
50
+
51
+ def identify_with_fips(fips, state, county, subdivision)
52
+ return nil if fips.nil?
53
+
54
+ case fips.length
55
+ when 2
56
+ return nil if county.nil? || subdivision.nil?
57
+
58
+ by_name(fips, county, subdivision)
59
+ when 3
60
+ return nil if state.nil? || subdivision.nil?
61
+
62
+ state_fips = FIPS::State.lookup(state: state)[:fips]
63
+ by_fips_and_sub_name(state_fips + fips, subdivision)
64
+ when 5
65
+ return by_fips_and_sub_name(fips, subdivision) unless subdivision.nil?
66
+ return nil if state.nil?
67
+
68
+ by_state_and_sub_fips(state, fips)
69
+ when 10
70
+ by_fips(fips)
71
+ end
72
+ end
73
+
74
+ def by_state_and_sub_fips(state, fips)
75
+ state_fips = FIPS::State.lookup(state: state)[:fips]
76
+ subdivision_row = select_subdivision(
77
+ "subdivisions.state_fips = ? AND subdivisions.subdivision_fips = ?",
78
+ [state_fips, fips]
79
+ )
80
+ return subdivision_row unless subdivision_row.nil?
81
+
82
+ raise FIPS::NotFoundError, "No subdivision found matching fips: #{fips}"
83
+ end
84
+
85
+ def by_fips_and_sub_name(fips, subdivision)
86
+ subdivision_row = by_county_fips_and_sub_name(fips[0, 2], fips[2, 3], subdivision)
87
+ return subdivision_row unless subdivision_row.nil?
88
+
89
+ raise FIPS::NotFoundError, "No subdivision found matching fips: #{fips} and name: #{subdivision}"
90
+ end
91
+
92
+ def by_fips(fips)
93
+ subdivision_row = select_subdivision("subdivisions.full_fips = ?", [fips])
94
+ return subdivision_row unless subdivision_row.nil?
95
+
96
+ raise FIPS::NotFoundError, "No subdivision found matching fips: #{fips}"
97
+ end
98
+
99
+ def by_name(state_fips, county, subdivision)
100
+ row = db_first(
101
+ "SELECT states.state_abbr AS state_abbr, subdivisions.full_fips AS fips, counties.name AS county_name, " \
102
+ "subdivisions.gnis AS gnis, subdivisions.name AS name, subdivisions.class_code AS class_code, subdivisions.status AS status " \
103
+ "FROM counties INDEXED BY counties_state_name_idx " \
104
+ "JOIN subdivisions INDEXED BY subdivisions_county_name_idx USING (state_fips, county_fips) " \
105
+ "JOIN states USING (state_fips) " \
106
+ "WHERE counties.state_fips = ? AND counties.name_key = ? AND subdivisions.name_key = ? LIMIT 1",
107
+ [state_fips, county.upcase, subdivision.upcase]
108
+ )
109
+ subdivision_row = formatted_subdivision(row)
110
+ return subdivision_row unless subdivision_row.nil?
111
+
112
+ raise FIPS::NotFoundError, "No subdivision found matching: #{subdivision} in #{county}"
113
+ end
114
+
115
+ def by_county_fips_and_sub_name(state_fips, county_fips, subdivision)
116
+ select_subdivision(
117
+ "subdivisions.state_fips = ? AND subdivisions.county_fips = ? AND subdivisions.name_key = ?",
118
+ [state_fips, county_fips, subdivision.upcase]
119
+ )
120
+ end
121
+
122
+ def select_subdivision(where_clause, bind_vars)
123
+ row = db_first(
124
+ "#{subdivision_select_sql(where_clause)} LIMIT 1",
125
+ bind_vars
126
+ )
127
+ formatted_subdivision(row)
128
+ end
129
+
130
+ def select_subdivisions(where_clause, bind_vars)
131
+ rows = db_all(
132
+ "#{subdivision_select_sql(where_clause)} ORDER BY subdivisions.full_fips",
133
+ bind_vars
134
+ )
135
+ rows.map { |row| formatted_subdivision(row) }
136
+ end
137
+
138
+ def subdivision_select_sql(where_clause)
139
+ "SELECT states.state_abbr AS state_abbr, subdivisions.full_fips AS fips, counties.name AS county_name, " \
140
+ "subdivisions.gnis AS gnis, subdivisions.name AS name, subdivisions.class_code AS class_code, subdivisions.status AS status " \
141
+ "FROM subdivisions JOIN states USING (state_fips) JOIN counties USING (state_fips, county_fips) " \
142
+ "WHERE #{where_clause}"
143
+ end
144
+
145
+ def formatted_subdivision(row)
146
+ return nil if row.nil?
147
+
148
+ {
149
+ state_abbr: row["state_abbr"],
150
+ fips: row["fips"],
151
+ county_name: row["county_name"],
152
+ gnis: row["gnis"],
153
+ name: row["name"],
154
+ class_code: row["class_code"],
155
+ status: row["status"]
156
+ }
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FIPS
4
+ VERSION = "1.0.0"
5
+ end
data/lib/fips.rb ADDED
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+
5
+ module FIPS
6
+ loader = Zeitwerk::Loader.for_gem
7
+ loader.inflector.inflect("fips" => "FIPS")
8
+ loader.setup
9
+
10
+ class NotFoundError < StandardError
11
+ end
12
+
13
+ class << self
14
+ def lookup(**params)
15
+ # params: fips, state, county, subdivision, (add gnis?, etc.)
16
+ fips = params.fetch(:fips, nil)
17
+ state = params.fetch(:state, nil)
18
+ county = params.fetch(:county, nil)
19
+ subdivision = params.fetch(:subdivision, nil)
20
+ return identify_by_fips(fips, state, county, subdivision) unless fips.nil?
21
+
22
+ return FIPS::State.lookup(state: state) if !state.nil? && county.nil? && subdivision.nil?
23
+ return FIPS::County.lookup(state: state, county: county) if !state.nil? && !county.nil? && subdivision.nil?
24
+
25
+ if !state.nil? && !county.nil? && !subdivision.nil?
26
+ return FIPS::Subdivision.lookup(state: state, county: county,
27
+ subdivision: subdivision)
28
+ end
29
+
30
+ raise ArgumentError, "Insufficient parameters to identify a state, county, or subdivision: #{params.inspect}"
31
+ end
32
+
33
+ private
34
+
35
+ def identify_by_fips(fips, state, county, subdivision)
36
+ raise ArgumentError, "FIPS input must be a string" unless fips.is_a?(String)
37
+
38
+ case fips.length
39
+ when 2
40
+ return FIPS::Subdivision.lookup(fips: fips, county: county, subdivision: subdivision) if !county.nil? && !subdivision.nil?
41
+ return FIPS::County.lookup(fips: fips, county: county) if !county.nil? && subdivision.nil?
42
+ unless county.nil? && subdivision.nil?
43
+ raise ArgumentError, "A 2-digit FIPS code requires both county and subdivision names for subdivision lookup"
44
+ end
45
+
46
+ FIPS::State.lookup(fips: fips)
47
+ when 3
48
+ return FIPS::Subdivision.lookup(fips: fips, state: state, subdivision: subdivision) if !state.nil? && !subdivision.nil?
49
+ unless !state.nil? && county.nil? && subdivision.nil?
50
+ raise ArgumentError, "A 3-digit FIPS code requires a state for county lookup, or state and subdivision for subdivision lookup"
51
+ end
52
+
53
+ FIPS::County.lookup(fips: fips, state: state)
54
+ when 5
55
+ return FIPS::Subdivision.lookup(fips: fips, subdivision: subdivision) unless subdivision.nil?
56
+ return FIPS::Subdivision.lookup(fips: fips, state: state) if !state.nil? && county.nil?
57
+ unless state.nil? && county.nil? && subdivision.nil?
58
+ raise ArgumentError, "A 5-digit FIPS code accepts either state for subdivision FIPS or subdivision name for county FIPS"
59
+ end
60
+
61
+ FIPS::County.lookup(fips: fips)
62
+ when 10
63
+ FIPS::Subdivision.lookup(fips: fips)
64
+ else
65
+ raise ArgumentError, "FIPS code (#{fips}) must identify a state, county, or subdivision"
66
+ end
67
+ end
68
+ end
69
+ end
data/sig/fips.rbs ADDED
@@ -0,0 +1,50 @@
1
+ module FIPS
2
+ VERSION: String
3
+
4
+ type state_record = {
5
+ fips: String,
6
+ abbr: String,
7
+ name: String,
8
+ ansi: String
9
+ }
10
+
11
+ type county_record = {
12
+ state_abbr: String,
13
+ fips: String,
14
+ gnis: String,
15
+ name: String,
16
+ class_code: String,
17
+ status: String
18
+ }
19
+
20
+ type subdivision_record = {
21
+ state_abbr: String,
22
+ fips: String,
23
+ county_name: String,
24
+ gnis: String,
25
+ name: String,
26
+ class_code: String,
27
+ status: String
28
+ }
29
+
30
+ type lookup_record = state_record | county_record | subdivision_record
31
+ class NotFoundError < StandardError
32
+ end
33
+
34
+ def self.lookup: (?fips: String?, ?state: String?, ?county: String?, ?subdivision: String?) -> lookup_record
35
+
36
+ class State
37
+ def self.lookup: (?fips: String?, ?state: String?) -> state_record
38
+ def self.all: () -> Array[state_record]
39
+ end
40
+
41
+ class County
42
+ def self.lookup: (?fips: String?, ?state: String?, ?county: String?) -> county_record
43
+ def self.all: (state: String state) -> Array[county_record]
44
+ end
45
+
46
+ class Subdivision
47
+ def self.lookup: (?fips: String?, ?state: String?, ?county: String?, ?subdivision: String?) -> subdivision_record
48
+ def self.all: (state: String state, ?county: String?) -> Array[subdivision_record]
49
+ end
50
+ end
metadata CHANGED
@@ -1,15 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fips_lookup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Barroso
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-03-28 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: sqlite3
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '2.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '2.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: zeitwerk
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.8'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.8'
13
40
  - !ruby/object:Gem::Dependency
14
41
  name: csv
15
42
  requirement: !ruby/object:Gem::Requirement
@@ -17,14 +44,97 @@ dependencies:
17
44
  - - "~>"
18
45
  - !ruby/object:Gem::Version
19
46
  version: '3.0'
20
- type: :runtime
47
+ type: :development
21
48
  prerelease: false
22
49
  version_requirements: !ruby/object:Gem::Requirement
23
50
  requirements:
24
51
  - - "~>"
25
52
  - !ruby/object:Gem::Version
26
53
  version: '3.0'
27
- description:
54
+ - !ruby/object:Gem::Dependency
55
+ name: irb
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: ostruct
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: benchmark
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.2'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.2'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rake
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '13.0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '13.0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rspec
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '3.2'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.2'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rubocop
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.21'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.21'
28
138
  email:
29
139
  - erikbarroso22@gmail.com
30
140
  executables: []
@@ -39,72 +149,20 @@ files:
39
149
  - LICENSE.txt
40
150
  - README.md
41
151
  - Rakefile
42
- - lib/data/county/AK.csv
43
- - lib/data/county/AL.csv
44
- - lib/data/county/AR.csv
45
- - lib/data/county/AS.csv
46
- - lib/data/county/AZ.csv
47
- - lib/data/county/CA.csv
48
- - lib/data/county/CO.csv
49
- - lib/data/county/CT.csv
50
- - lib/data/county/DC.csv
51
- - lib/data/county/DE.csv
52
- - lib/data/county/FL.csv
53
- - lib/data/county/GA.csv
54
- - lib/data/county/GU.csv
55
- - lib/data/county/HI.csv
56
- - lib/data/county/IA.csv
57
- - lib/data/county/ID.csv
58
- - lib/data/county/IL.csv
59
- - lib/data/county/IN.csv
60
- - lib/data/county/KS.csv
61
- - lib/data/county/KY.csv
62
- - lib/data/county/LA.csv
63
- - lib/data/county/MA.csv
64
- - lib/data/county/MD.csv
65
- - lib/data/county/ME.csv
66
- - lib/data/county/MI.csv
67
- - lib/data/county/MN.csv
68
- - lib/data/county/MO.csv
69
- - lib/data/county/MP.csv
70
- - lib/data/county/MS.csv
71
- - lib/data/county/MT.csv
72
- - lib/data/county/NC.csv
73
- - lib/data/county/ND.csv
74
- - lib/data/county/NE.csv
75
- - lib/data/county/NH.csv
76
- - lib/data/county/NJ.csv
77
- - lib/data/county/NM.csv
78
- - lib/data/county/NV.csv
79
- - lib/data/county/NY.csv
80
- - lib/data/county/OH.csv
81
- - lib/data/county/OK.csv
82
- - lib/data/county/OR.csv
83
- - lib/data/county/PA.csv
84
- - lib/data/county/PR.csv
85
- - lib/data/county/RI.csv
86
- - lib/data/county/SC.csv
87
- - lib/data/county/SD.csv
88
- - lib/data/county/TN.csv
89
- - lib/data/county/TX.csv
90
- - lib/data/county/UM.csv
91
- - lib/data/county/UT.csv
92
- - lib/data/county/VA.csv
93
- - lib/data/county/VI.csv
94
- - lib/data/county/VT.csv
95
- - lib/data/county/WA.csv
96
- - lib/data/county/WI.csv
97
- - lib/data/county/WV.csv
98
- - lib/data/county/WY.csv
99
- - lib/data/state.csv
100
- - lib/fips_lookup.rb
101
- - lib/fips_lookup/version.rb
102
- - sig/fips_lookup.rbs
152
+ - db/schema.sql
153
+ - lib/data/fips.sqlite3
154
+ - lib/fips.rb
155
+ - lib/fips/county.rb
156
+ - lib/fips/database.rb
157
+ - lib/fips/state.rb
158
+ - lib/fips/subdivision.rb
159
+ - lib/fips/version.rb
160
+ - sig/fips.rbs
103
161
  homepage: https://github.com/3barroso/fips_lookup
104
162
  licenses:
105
163
  - MIT
106
- metadata: {}
107
- post_install_message:
164
+ metadata:
165
+ rubygems_mfa_required: 'true'
108
166
  rdoc_options: []
109
167
  require_paths:
110
168
  - lib
@@ -112,15 +170,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
170
  requirements:
113
171
  - - ">="
114
172
  - !ruby/object:Gem::Version
115
- version: '3.0'
173
+ version: '3.2'
116
174
  required_rubygems_version: !ruby/object:Gem::Requirement
117
175
  requirements:
118
176
  - - ">="
119
177
  - !ruby/object:Gem::Version
120
178
  version: '0'
121
179
  requirements: []
122
- rubygems_version: 3.5.6
123
- signing_key:
180
+ rubygems_version: 4.0.6
124
181
  specification_version: 4
125
182
  summary: Stores FIPS codes for US States and Counties
126
183
  test_files: []
@@ -1,29 +0,0 @@
1
- AK,02,013,Aleutians East Borough,H1
2
- AK,02,016,Aleutians West Census Area,H5
3
- AK,02,020,Anchorage Municipality,H6
4
- AK,02,050,Bethel Census Area,H5
5
- AK,02,060,Bristol Bay Borough,H1
6
- AK,02,068,Denali Borough,H1
7
- AK,02,070,Dillingham Census Area,H5
8
- AK,02,090,Fairbanks North Star Borough,H1
9
- AK,02,100,Haines Borough,H1
10
- AK,02,105,Hoonah-Angoon Census Area,H5
11
- AK,02,110,Juneau City and Borough,H6
12
- AK,02,122,Kenai Peninsula Borough,H1
13
- AK,02,130,Ketchikan Gateway Borough,H1
14
- AK,02,150,Kodiak Island Borough,H1
15
- AK,02,164,Lake and Peninsula Borough,H1
16
- AK,02,170,Matanuska-Susitna Borough,H1
17
- AK,02,180,Nome Census Area,H5
18
- AK,02,185,North Slope Borough,H1
19
- AK,02,188,Northwest Arctic Borough,H1
20
- AK,02,195,Petersburg Census Area,H5
21
- AK,02,198,Prince of Wales-Hyder Census Area,H5
22
- AK,02,220,Sitka City and Borough,H6
23
- AK,02,230,Skagway Municipality,H1
24
- AK,02,240,Southeast Fairbanks Census Area,H5
25
- AK,02,261,Valdez-Cordova Census Area,H5
26
- AK,02,270,Wade Hampton Census Area,H5
27
- AK,02,275,Wrangell City and Borough,H1
28
- AK,02,282,Yakutat City and Borough,H1
29
- AK,02,290,Yukon-Koyukuk Census Area,H5
@@ -1,67 +0,0 @@
1
- AL,01,001,Autauga County,H1
2
- AL,01,003,Baldwin County,H1
3
- AL,01,005,Barbour County,H1
4
- AL,01,007,Bibb County,H1
5
- AL,01,009,Blount County,H1
6
- AL,01,011,Bullock County,H1
7
- AL,01,013,Butler County,H1
8
- AL,01,015,Calhoun County,H1
9
- AL,01,017,Chambers County,H1
10
- AL,01,019,Cherokee County,H1
11
- AL,01,021,Chilton County,H1
12
- AL,01,023,Choctaw County,H1
13
- AL,01,025,Clarke County,H1
14
- AL,01,027,Clay County,H1
15
- AL,01,029,Cleburne County,H1
16
- AL,01,031,Coffee County,H1
17
- AL,01,033,Colbert County,H1
18
- AL,01,035,Conecuh County,H1
19
- AL,01,037,Coosa County,H1
20
- AL,01,039,Covington County,H1
21
- AL,01,041,Crenshaw County,H1
22
- AL,01,043,Cullman County,H1
23
- AL,01,045,Dale County,H1
24
- AL,01,047,Dallas County,H1
25
- AL,01,049,DeKalb County,H1
26
- AL,01,051,Elmore County,H1
27
- AL,01,053,Escambia County,H1
28
- AL,01,055,Etowah County,H1
29
- AL,01,057,Fayette County,H1
30
- AL,01,059,Franklin County,H1
31
- AL,01,061,Geneva County,H1
32
- AL,01,063,Greene County,H1
33
- AL,01,065,Hale County,H1
34
- AL,01,067,Henry County,H1
35
- AL,01,069,Houston County,H1
36
- AL,01,071,Jackson County,H1
37
- AL,01,073,Jefferson County,H1
38
- AL,01,075,Lamar County,H1
39
- AL,01,077,Lauderdale County,H1
40
- AL,01,079,Lawrence County,H1
41
- AL,01,081,Lee County,H1
42
- AL,01,083,Limestone County,H1
43
- AL,01,085,Lowndes County,H1
44
- AL,01,087,Macon County,H1
45
- AL,01,089,Madison County,H1
46
- AL,01,091,Marengo County,H1
47
- AL,01,093,Marion County,H1
48
- AL,01,095,Marshall County,H1
49
- AL,01,097,Mobile County,H1
50
- AL,01,099,Monroe County,H1
51
- AL,01,101,Montgomery County,H1
52
- AL,01,103,Morgan County,H1
53
- AL,01,105,Perry County,H1
54
- AL,01,107,Pickens County,H1
55
- AL,01,109,Pike County,H1
56
- AL,01,111,Randolph County,H1
57
- AL,01,113,Russell County,H1
58
- AL,01,115,St. Clair County,H1
59
- AL,01,117,Shelby County,H1
60
- AL,01,119,Sumter County,H1
61
- AL,01,121,Talladega County,H1
62
- AL,01,123,Tallapoosa County,H1
63
- AL,01,125,Tuscaloosa County,H1
64
- AL,01,127,Walker County,H1
65
- AL,01,129,Washington County,H1
66
- AL,01,131,Wilcox County,H1
67
- AL,01,133,Winston County,H1