fips_lookup 0.3.0 → 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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/Gemfile.lock +39 -30
- data/README.md +82 -138
- data/db/schema.sql +45 -0
- data/lib/data/fips.sqlite3 +0 -0
- data/lib/fips/county.rb +98 -0
- data/lib/fips/database.rb +55 -0
- data/lib/fips/state.rb +67 -0
- data/lib/fips/subdivision.rb +160 -0
- data/lib/fips/version.rb +5 -0
- data/lib/fips.rb +69 -0
- data/sig/fips.rbs +50 -0
- metadata +56 -125
- data/lib/data/county/AK.csv +0 -30
- data/lib/data/county/AL.csv +0 -67
- data/lib/data/county/AR.csv +0 -75
- data/lib/data/county/AS.csv +0 -5
- data/lib/data/county/AZ.csv +0 -15
- data/lib/data/county/CA.csv +0 -58
- data/lib/data/county/CO.csv +0 -64
- data/lib/data/county/CT.csv +0 -8
- data/lib/data/county/DC.csv +0 -1
- data/lib/data/county/DE.csv +0 -3
- data/lib/data/county/FL.csv +0 -67
- data/lib/data/county/GA.csv +0 -159
- data/lib/data/county/GU.csv +0 -1
- data/lib/data/county/HI.csv +0 -5
- data/lib/data/county/IA.csv +0 -99
- data/lib/data/county/ID.csv +0 -44
- data/lib/data/county/IL.csv +0 -102
- data/lib/data/county/IN.csv +0 -92
- data/lib/data/county/KS.csv +0 -105
- data/lib/data/county/KY.csv +0 -120
- data/lib/data/county/LA.csv +0 -64
- data/lib/data/county/MA.csv +0 -14
- data/lib/data/county/MD.csv +0 -24
- data/lib/data/county/ME.csv +0 -16
- data/lib/data/county/MI.csv +0 -83
- data/lib/data/county/MN.csv +0 -87
- data/lib/data/county/MO.csv +0 -115
- data/lib/data/county/MP.csv +0 -4
- data/lib/data/county/MS.csv +0 -82
- data/lib/data/county/MT.csv +0 -56
- data/lib/data/county/NC.csv +0 -100
- data/lib/data/county/ND.csv +0 -53
- data/lib/data/county/NE.csv +0 -93
- data/lib/data/county/NH.csv +0 -10
- data/lib/data/county/NJ.csv +0 -21
- data/lib/data/county/NM.csv +0 -33
- data/lib/data/county/NV.csv +0 -17
- data/lib/data/county/NY.csv +0 -62
- data/lib/data/county/OH.csv +0 -88
- data/lib/data/county/OK.csv +0 -77
- data/lib/data/county/OR.csv +0 -36
- data/lib/data/county/PA.csv +0 -67
- data/lib/data/county/PR.csv +0 -78
- data/lib/data/county/RI.csv +0 -5
- data/lib/data/county/SC.csv +0 -46
- data/lib/data/county/SD.csv +0 -66
- data/lib/data/county/TN.csv +0 -95
- data/lib/data/county/TX.csv +0 -254
- data/lib/data/county/UM.csv +0 -1
- data/lib/data/county/UT.csv +0 -29
- data/lib/data/county/VA.csv +0 -133
- data/lib/data/county/VI.csv +0 -3
- data/lib/data/county/VT.csv +0 -14
- data/lib/data/county/WA.csv +0 -39
- data/lib/data/county/WI.csv +0 -72
- data/lib/data/county/WV.csv +0 -55
- data/lib/data/county/WY.csv +0 -23
- data/lib/data/state.csv +0 -57
- data/lib/data/subdivision/AK.csv +0 -37
- data/lib/data/subdivision/AL.csv +0 -390
- data/lib/data/subdivision/AR.csv +0 -1210
- data/lib/data/subdivision/AS.csv +0 -16
- data/lib/data/subdivision/AZ.csv +0 -80
- data/lib/data/subdivision/CA.csv +0 -404
- data/lib/data/subdivision/CO.csv +0 -209
- data/lib/data/subdivision/CT.csv +0 -173
- data/lib/data/subdivision/DC.csv +0 -1
- data/lib/data/subdivision/DE.csv +0 -27
- data/lib/data/subdivision/FL.csv +0 -316
- data/lib/data/subdivision/GA.csv +0 -586
- data/lib/data/subdivision/GU.csv +0 -20
- data/lib/data/subdivision/HI.csv +0 -44
- data/lib/data/subdivision/IA.csv +0 -1662
- data/lib/data/subdivision/ID.csv +0 -170
- data/lib/data/subdivision/IL.csv +0 -1708
- data/lib/data/subdivision/IN.csv +0 -1012
- data/lib/data/subdivision/KS.csv +0 -1531
- data/lib/data/subdivision/KY.csv +0 -493
- data/lib/data/subdivision/LA.csv +0 -576
- data/lib/data/subdivision/MA.csv +0 -357
- data/lib/data/subdivision/MD.csv +0 -290
- data/lib/data/subdivision/ME.csv +0 -530
- data/lib/data/subdivision/MI.csv +0 -1579
- data/lib/data/subdivision/MN.csv +0 -2761
- data/lib/data/subdivision/MO.csv +0 -1394
- data/lib/data/subdivision/MP.csv +0 -12
- data/lib/data/subdivision/MS.csv +0 -410
- data/lib/data/subdivision/MT.csv +0 -194
- data/lib/data/subdivision/NC.csv +0 -1041
- data/lib/data/subdivision/ND.csv +0 -1762
- data/lib/data/subdivision/NE.csv +0 -1193
- data/lib/data/subdivision/NH.csv +0 -260
- data/lib/data/subdivision/NJ.csv +0 -570
- data/lib/data/subdivision/NM.csv +0 -130
- data/lib/data/subdivision/NV.csv +0 -71
- data/lib/data/subdivision/NY.csv +0 -1023
- data/lib/data/subdivision/OH.csv +0 -1606
- data/lib/data/subdivision/OK.csv +0 -305
- data/lib/data/subdivision/OR.csv +0 -212
- data/lib/data/subdivision/PA.csv +0 -2573
- data/lib/data/subdivision/PR.csv +0 -939
- data/lib/data/subdivision/RI.csv +0 -40
- data/lib/data/subdivision/SC.csv +0 -299
- data/lib/data/subdivision/SD.csv +0 -1331
- data/lib/data/subdivision/TN.csv +0 -844
- data/lib/data/subdivision/TX.csv +0 -862
- data/lib/data/subdivision/UM.csv +0 -1
- data/lib/data/subdivision/UT.csv +0 -93
- data/lib/data/subdivision/VA.csv +0 -552
- data/lib/data/subdivision/VI.csv +0 -23
- data/lib/data/subdivision/VT.csv +0 -255
- data/lib/data/subdivision/WA.csv +0 -242
- data/lib/data/subdivision/WI.csv +0 -1922
- data/lib/data/subdivision/WV.csv +0 -228
- data/lib/data/subdivision/WY.csv +0 -71
- data/lib/fips_lookup/county.rb +0 -65
- data/lib/fips_lookup/state.rb +0 -46
- data/lib/fips_lookup/subdivision.rb +0 -48
- data/lib/fips_lookup/version.rb +0 -5
- data/lib/fips_lookup.rb +0 -25
- 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
|
data/lib/fips/version.rb
ADDED
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,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fips_lookup
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Erik Barroso
|
|
@@ -9,6 +9,34 @@ bindir: exe
|
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
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'
|
|
12
40
|
- !ruby/object:Gem::Dependency
|
|
13
41
|
name: csv
|
|
14
42
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -16,7 +44,7 @@ dependencies:
|
|
|
16
44
|
- - "~>"
|
|
17
45
|
- !ruby/object:Gem::Version
|
|
18
46
|
version: '3.0'
|
|
19
|
-
type: :
|
|
47
|
+
type: :development
|
|
20
48
|
prerelease: false
|
|
21
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
50
|
requirements:
|
|
@@ -51,6 +79,20 @@ dependencies:
|
|
|
51
79
|
- - ">="
|
|
52
80
|
- !ruby/object:Gem::Version
|
|
53
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'
|
|
54
96
|
- !ruby/object:Gem::Dependency
|
|
55
97
|
name: rake
|
|
56
98
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -107,131 +149,20 @@ files:
|
|
|
107
149
|
- LICENSE.txt
|
|
108
150
|
- README.md
|
|
109
151
|
- Rakefile
|
|
110
|
-
-
|
|
111
|
-
- lib/data/
|
|
112
|
-
- lib/
|
|
113
|
-
- lib/
|
|
114
|
-
- lib/
|
|
115
|
-
- lib/
|
|
116
|
-
- lib/
|
|
117
|
-
- lib/
|
|
118
|
-
-
|
|
119
|
-
- lib/data/county/DE.csv
|
|
120
|
-
- lib/data/county/FL.csv
|
|
121
|
-
- lib/data/county/GA.csv
|
|
122
|
-
- lib/data/county/GU.csv
|
|
123
|
-
- lib/data/county/HI.csv
|
|
124
|
-
- lib/data/county/IA.csv
|
|
125
|
-
- lib/data/county/ID.csv
|
|
126
|
-
- lib/data/county/IL.csv
|
|
127
|
-
- lib/data/county/IN.csv
|
|
128
|
-
- lib/data/county/KS.csv
|
|
129
|
-
- lib/data/county/KY.csv
|
|
130
|
-
- lib/data/county/LA.csv
|
|
131
|
-
- lib/data/county/MA.csv
|
|
132
|
-
- lib/data/county/MD.csv
|
|
133
|
-
- lib/data/county/ME.csv
|
|
134
|
-
- lib/data/county/MI.csv
|
|
135
|
-
- lib/data/county/MN.csv
|
|
136
|
-
- lib/data/county/MO.csv
|
|
137
|
-
- lib/data/county/MP.csv
|
|
138
|
-
- lib/data/county/MS.csv
|
|
139
|
-
- lib/data/county/MT.csv
|
|
140
|
-
- lib/data/county/NC.csv
|
|
141
|
-
- lib/data/county/ND.csv
|
|
142
|
-
- lib/data/county/NE.csv
|
|
143
|
-
- lib/data/county/NH.csv
|
|
144
|
-
- lib/data/county/NJ.csv
|
|
145
|
-
- lib/data/county/NM.csv
|
|
146
|
-
- lib/data/county/NV.csv
|
|
147
|
-
- lib/data/county/NY.csv
|
|
148
|
-
- lib/data/county/OH.csv
|
|
149
|
-
- lib/data/county/OK.csv
|
|
150
|
-
- lib/data/county/OR.csv
|
|
151
|
-
- lib/data/county/PA.csv
|
|
152
|
-
- lib/data/county/PR.csv
|
|
153
|
-
- lib/data/county/RI.csv
|
|
154
|
-
- lib/data/county/SC.csv
|
|
155
|
-
- lib/data/county/SD.csv
|
|
156
|
-
- lib/data/county/TN.csv
|
|
157
|
-
- lib/data/county/TX.csv
|
|
158
|
-
- lib/data/county/UM.csv
|
|
159
|
-
- lib/data/county/UT.csv
|
|
160
|
-
- lib/data/county/VA.csv
|
|
161
|
-
- lib/data/county/VI.csv
|
|
162
|
-
- lib/data/county/VT.csv
|
|
163
|
-
- lib/data/county/WA.csv
|
|
164
|
-
- lib/data/county/WI.csv
|
|
165
|
-
- lib/data/county/WV.csv
|
|
166
|
-
- lib/data/county/WY.csv
|
|
167
|
-
- lib/data/state.csv
|
|
168
|
-
- lib/data/subdivision/AK.csv
|
|
169
|
-
- lib/data/subdivision/AL.csv
|
|
170
|
-
- lib/data/subdivision/AR.csv
|
|
171
|
-
- lib/data/subdivision/AS.csv
|
|
172
|
-
- lib/data/subdivision/AZ.csv
|
|
173
|
-
- lib/data/subdivision/CA.csv
|
|
174
|
-
- lib/data/subdivision/CO.csv
|
|
175
|
-
- lib/data/subdivision/CT.csv
|
|
176
|
-
- lib/data/subdivision/DC.csv
|
|
177
|
-
- lib/data/subdivision/DE.csv
|
|
178
|
-
- lib/data/subdivision/FL.csv
|
|
179
|
-
- lib/data/subdivision/GA.csv
|
|
180
|
-
- lib/data/subdivision/GU.csv
|
|
181
|
-
- lib/data/subdivision/HI.csv
|
|
182
|
-
- lib/data/subdivision/IA.csv
|
|
183
|
-
- lib/data/subdivision/ID.csv
|
|
184
|
-
- lib/data/subdivision/IL.csv
|
|
185
|
-
- lib/data/subdivision/IN.csv
|
|
186
|
-
- lib/data/subdivision/KS.csv
|
|
187
|
-
- lib/data/subdivision/KY.csv
|
|
188
|
-
- lib/data/subdivision/LA.csv
|
|
189
|
-
- lib/data/subdivision/MA.csv
|
|
190
|
-
- lib/data/subdivision/MD.csv
|
|
191
|
-
- lib/data/subdivision/ME.csv
|
|
192
|
-
- lib/data/subdivision/MI.csv
|
|
193
|
-
- lib/data/subdivision/MN.csv
|
|
194
|
-
- lib/data/subdivision/MO.csv
|
|
195
|
-
- lib/data/subdivision/MP.csv
|
|
196
|
-
- lib/data/subdivision/MS.csv
|
|
197
|
-
- lib/data/subdivision/MT.csv
|
|
198
|
-
- lib/data/subdivision/NC.csv
|
|
199
|
-
- lib/data/subdivision/ND.csv
|
|
200
|
-
- lib/data/subdivision/NE.csv
|
|
201
|
-
- lib/data/subdivision/NH.csv
|
|
202
|
-
- lib/data/subdivision/NJ.csv
|
|
203
|
-
- lib/data/subdivision/NM.csv
|
|
204
|
-
- lib/data/subdivision/NV.csv
|
|
205
|
-
- lib/data/subdivision/NY.csv
|
|
206
|
-
- lib/data/subdivision/OH.csv
|
|
207
|
-
- lib/data/subdivision/OK.csv
|
|
208
|
-
- lib/data/subdivision/OR.csv
|
|
209
|
-
- lib/data/subdivision/PA.csv
|
|
210
|
-
- lib/data/subdivision/PR.csv
|
|
211
|
-
- lib/data/subdivision/RI.csv
|
|
212
|
-
- lib/data/subdivision/SC.csv
|
|
213
|
-
- lib/data/subdivision/SD.csv
|
|
214
|
-
- lib/data/subdivision/TN.csv
|
|
215
|
-
- lib/data/subdivision/TX.csv
|
|
216
|
-
- lib/data/subdivision/UM.csv
|
|
217
|
-
- lib/data/subdivision/UT.csv
|
|
218
|
-
- lib/data/subdivision/VA.csv
|
|
219
|
-
- lib/data/subdivision/VI.csv
|
|
220
|
-
- lib/data/subdivision/VT.csv
|
|
221
|
-
- lib/data/subdivision/WA.csv
|
|
222
|
-
- lib/data/subdivision/WI.csv
|
|
223
|
-
- lib/data/subdivision/WV.csv
|
|
224
|
-
- lib/data/subdivision/WY.csv
|
|
225
|
-
- lib/fips_lookup.rb
|
|
226
|
-
- lib/fips_lookup/county.rb
|
|
227
|
-
- lib/fips_lookup/state.rb
|
|
228
|
-
- lib/fips_lookup/subdivision.rb
|
|
229
|
-
- lib/fips_lookup/version.rb
|
|
230
|
-
- 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
|
|
231
161
|
homepage: https://github.com/3barroso/fips_lookup
|
|
232
162
|
licenses:
|
|
233
163
|
- MIT
|
|
234
|
-
metadata:
|
|
164
|
+
metadata:
|
|
165
|
+
rubygems_mfa_required: 'true'
|
|
235
166
|
rdoc_options: []
|
|
236
167
|
require_paths:
|
|
237
168
|
- lib
|
|
@@ -239,7 +170,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
239
170
|
requirements:
|
|
240
171
|
- - ">="
|
|
241
172
|
- !ruby/object:Gem::Version
|
|
242
|
-
version: '3.
|
|
173
|
+
version: '3.2'
|
|
243
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
244
175
|
requirements:
|
|
245
176
|
- - ">="
|
data/lib/data/county/AK.csv
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
AK,02,013,Aleutians East Borough,01419964,H1,A
|
|
2
|
-
AK,02,016,Aleutians West Census Area,01419965,H5,S
|
|
3
|
-
AK,02,020,Anchorage Municipality,01416061,H6,C
|
|
4
|
-
AK,02,050,Bethel Census Area,01419966,H5,S
|
|
5
|
-
AK,02,060,Bristol Bay Borough,01419967,H1,A
|
|
6
|
-
AK,02,063,Chugach Census Area,02804400,H5,S
|
|
7
|
-
AK,02,066,Copper River Census Area,02804401,H5,S
|
|
8
|
-
AK,02,068,Denali Borough,01419988,H1,A
|
|
9
|
-
AK,02,070,Dillingham Census Area,01419968,H5,S
|
|
10
|
-
AK,02,090,Fairbanks North Star Borough,01419969,H1,A
|
|
11
|
-
AK,02,100,Haines Borough,01419970,H1,A
|
|
12
|
-
AK,02,105,Hoonah-Angoon Census Area,02371430,H5,S
|
|
13
|
-
AK,02,110,Juneau City and Borough,01419971,H6,C
|
|
14
|
-
AK,02,122,Kenai Peninsula Borough,01419972,H1,A
|
|
15
|
-
AK,02,130,Ketchikan Gateway Borough,01419973,H1,A
|
|
16
|
-
AK,02,150,Kodiak Island Borough,01419974,H1,A
|
|
17
|
-
AK,02,158,Kusilvak Census Area,01419985,H5,S
|
|
18
|
-
AK,02,164,Lake and Peninsula Borough,01419975,H1,A
|
|
19
|
-
AK,02,170,Matanuska-Susitna Borough,01419976,H1,A
|
|
20
|
-
AK,02,180,Nome Census Area,01419977,H5,S
|
|
21
|
-
AK,02,185,North Slope Borough,01419978,H1,A
|
|
22
|
-
AK,02,188,Northwest Arctic Borough,01419979,H1,A
|
|
23
|
-
AK,02,195,Petersburg Borough,02516404,H1,A
|
|
24
|
-
AK,02,198,Prince of Wales-Hyder Census Area,01419980,H5,S
|
|
25
|
-
AK,02,220,Sitka City and Borough,01419981,H6,C
|
|
26
|
-
AK,02,230,Skagway Municipality,02339479,H1,A
|
|
27
|
-
AK,02,240,Southeast Fairbanks Census Area,01419983,H5,S
|
|
28
|
-
AK,02,275,Wrangell City and Borough,02516402,H6,C
|
|
29
|
-
AK,02,282,Yakutat City and Borough,01419986,H1,A
|
|
30
|
-
AK,02,290,Yukon-Koyukuk Census Area,01419987,H5,S
|
data/lib/data/county/AL.csv
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
AL,01,001,Autauga County,00161526,H1,A
|
|
2
|
-
AL,01,003,Baldwin County,00161527,H1,A
|
|
3
|
-
AL,01,005,Barbour County,00161528,H1,A
|
|
4
|
-
AL,01,007,Bibb County,00161529,H1,A
|
|
5
|
-
AL,01,009,Blount County,00161530,H1,A
|
|
6
|
-
AL,01,011,Bullock County,00161531,H1,A
|
|
7
|
-
AL,01,013,Butler County,00161532,H1,A
|
|
8
|
-
AL,01,015,Calhoun County,00161533,H1,A
|
|
9
|
-
AL,01,017,Chambers County,00161534,H1,A
|
|
10
|
-
AL,01,019,Cherokee County,00161535,H1,A
|
|
11
|
-
AL,01,021,Chilton County,00161536,H1,A
|
|
12
|
-
AL,01,023,Choctaw County,00161537,H1,A
|
|
13
|
-
AL,01,025,Clarke County,00161538,H1,A
|
|
14
|
-
AL,01,027,Clay County,00161539,H1,A
|
|
15
|
-
AL,01,029,Cleburne County,00161540,H1,A
|
|
16
|
-
AL,01,031,Coffee County,00161541,H1,A
|
|
17
|
-
AL,01,033,Colbert County,00161542,H1,A
|
|
18
|
-
AL,01,035,Conecuh County,00161543,H1,A
|
|
19
|
-
AL,01,037,Coosa County,00161544,H1,A
|
|
20
|
-
AL,01,039,Covington County,00161545,H1,A
|
|
21
|
-
AL,01,041,Crenshaw County,00161546,H1,A
|
|
22
|
-
AL,01,043,Cullman County,00161547,H1,A
|
|
23
|
-
AL,01,045,Dale County,00161548,H1,A
|
|
24
|
-
AL,01,047,Dallas County,00161549,H1,A
|
|
25
|
-
AL,01,049,DeKalb County,00161550,H1,A
|
|
26
|
-
AL,01,051,Elmore County,00161551,H1,A
|
|
27
|
-
AL,01,053,Escambia County,00161552,H1,A
|
|
28
|
-
AL,01,055,Etowah County,00161553,H1,A
|
|
29
|
-
AL,01,057,Fayette County,00161554,H1,A
|
|
30
|
-
AL,01,059,Franklin County,00161555,H1,A
|
|
31
|
-
AL,01,061,Geneva County,00161556,H1,A
|
|
32
|
-
AL,01,063,Greene County,00161557,H1,A
|
|
33
|
-
AL,01,065,Hale County,00161558,H1,A
|
|
34
|
-
AL,01,067,Henry County,00161559,H1,A
|
|
35
|
-
AL,01,069,Houston County,00161560,H1,A
|
|
36
|
-
AL,01,071,Jackson County,00161561,H1,A
|
|
37
|
-
AL,01,073,Jefferson County,00161562,H1,A
|
|
38
|
-
AL,01,075,Lamar County,00161563,H1,A
|
|
39
|
-
AL,01,077,Lauderdale County,00161564,H1,A
|
|
40
|
-
AL,01,079,Lawrence County,00161565,H1,A
|
|
41
|
-
AL,01,081,Lee County,00161566,H1,A
|
|
42
|
-
AL,01,083,Limestone County,00161567,H1,A
|
|
43
|
-
AL,01,085,Lowndes County,00161568,H1,A
|
|
44
|
-
AL,01,087,Macon County,00161569,H1,A
|
|
45
|
-
AL,01,089,Madison County,00161570,H1,A
|
|
46
|
-
AL,01,091,Marengo County,00161572,H1,A
|
|
47
|
-
AL,01,093,Marion County,00161573,H1,A
|
|
48
|
-
AL,01,095,Marshall County,00161574,H1,A
|
|
49
|
-
AL,01,097,Mobile County,00161575,H1,A
|
|
50
|
-
AL,01,099,Monroe County,00161576,H1,A
|
|
51
|
-
AL,01,101,Montgomery County,00161577,H1,A
|
|
52
|
-
AL,01,103,Morgan County,00161578,H1,A
|
|
53
|
-
AL,01,105,Perry County,00161579,H1,A
|
|
54
|
-
AL,01,107,Pickens County,00161580,H1,A
|
|
55
|
-
AL,01,109,Pike County,00161581,H1,A
|
|
56
|
-
AL,01,111,Randolph County,00161582,H1,A
|
|
57
|
-
AL,01,113,Russell County,00161583,H1,A
|
|
58
|
-
AL,01,115,St. Clair County,00164997,H1,A
|
|
59
|
-
AL,01,117,Shelby County,00161584,H1,A
|
|
60
|
-
AL,01,119,Sumter County,00161585,H1,A
|
|
61
|
-
AL,01,121,Talladega County,00161586,H1,A
|
|
62
|
-
AL,01,123,Tallapoosa County,00161587,H1,A
|
|
63
|
-
AL,01,125,Tuscaloosa County,00161588,H1,A
|
|
64
|
-
AL,01,127,Walker County,00161589,H1,A
|
|
65
|
-
AL,01,129,Washington County,00161590,H1,A
|
|
66
|
-
AL,01,131,Wilcox County,00161591,H1,A
|
|
67
|
-
AL,01,133,Winston County,00161592,H1,A
|