zipcoder 0.8.4 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 88837eb066b6b89505fb433f64a8d822bd81e262
4
- data.tar.gz: 451dcbbf801fca16cfa93ad2fdcbe21c069e4198
3
+ metadata.gz: 382bf99325cd32e9e8289b9638333b4635f6d99b
4
+ data.tar.gz: 3c1261c069f7f08a92a233bfef54bd7aaa1a09a1
5
5
  SHA512:
6
- metadata.gz: c3225a66cb6b94fb0eed9a6196530e2c8c5d20cec409f99baff3e8c9ae6422f212ac40e2d00c33d79efe835bf24f1a50e942ef69057e1172e52446435a3124f6
7
- data.tar.gz: f58b48e2fb82564a59a621ea5cb29c9f8477c8bcf36ca3b72bebe0cbb4bf8e64eef2ca1b08e0a6e4a5fc4c7abe832e5e9568bea8357df48589ec250b0b635d89
6
+ metadata.gz: 36d427b2293cbd5bfb143937e836403a49a44b1da70d65930f579256e95d94816844fcdc0223b74ca36d1ed9eb7fd353cdcf0b932f0ab3b19f76019867cde9f8
7
+ data.tar.gz: d510c2d4fbca592ccbcc9b4dd4bc7a1c5fb7714d107197c010365b71e9163946bedd81e68fa05bc943074dfef6de0b9cd9f9be8d6ab4617586ee7d01a0ecf157
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2018 Eric Chapman
3
+ Copyright (c) 2019 E2 Technologies LLC
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -7,6 +7,14 @@ Gem for performing zip code lookup operations
7
7
 
8
8
  ## Revision History
9
9
 
10
+ - v0.9.0:
11
+ - added counties - note that there is a slight inaccuracy. When a city is in
12
+ multiple counties (for example Austin, TX), ALL of the zip codes for Austin
13
+ will list ALL of the counties that Austin is in, even though the individual
14
+ zip codes aren't necessarily in all of the counties. This is an artifact
15
+ of the data being from multiple sources
16
+ - added printing out the time it took to load the data for performance reasons
17
+ - updated copyright
10
18
  - v0.8.4:
11
19
  - fixed data corruption issue due to not cloning city before modifying
12
20
  - v0.8.3:
@@ -54,6 +62,12 @@ Gem for performing zip code lookup operations
54
62
  - v0.1.0:
55
63
  - Initial Revision
56
64
 
65
+ ## Data
66
+ The data for this library is taken from several different open source areas and combined together
67
+
68
+ - zip codes: [Federal Goverment Zip Codes](http://federalgovernmentzipcodes.us/free-zipcode-database.csv)
69
+ - counties: [grammakov Github](https://raw.githubusercontent.com/grammakov/USA-cities-and-states/master/us_cities_states_counties.csv)
70
+
57
71
  ## Installation
58
72
 
59
73
  Add this line to your application's Gemfile:
@@ -113,7 +127,7 @@ cacher = Zipcoder::Cacher::Redis.new(**args)
113
127
  Zipcoder.load_cache(cacher)
114
128
  ```
115
129
 
116
- Please check [here](https://github.com/redis/redis-rb) for the different options
130
+ Please visit [Redis Github](https://github.com/redis/redis-rb) for the different options
117
131
  to use when instantiating the "Redis" client.
118
132
 
119
133
  ### Methods
@@ -154,11 +168,11 @@ require 'zipcoder'
154
168
 
155
169
  # Looks up a zip code by string
156
170
  puts "78748".zip_info
157
- # > {:zip=>"78748", :city=>"AUSTIN", :state=>"TX", :lat=>30.26, :long=>-97.74}
171
+ # > {:zip=>"78748", :city=>"Austin", :county=>"Travis,Williamson,Hays", :state=>"TX", :lat=>30.26, :long=>-97.74}
158
172
 
159
173
  # Looks up a zip code by integer
160
174
  puts 78748.zip_info
161
- # > {:zip=>"78748", :city=>"Austin", :state=>"TX", :lat=>30.26, :long=>-97.74}
175
+ # > {:zip=>"78748", :city=>"Austin", :county=>"Travis,Williamson,Hays", :state=>"TX", :lat=>30.26, :long=>-97.74}
162
176
 
163
177
  ```
164
178
 
@@ -198,7 +212,7 @@ require 'zipcoder'
198
212
 
199
213
  # Returns the cities for a zip_code
200
214
  puts "78701-78750,78613".zip_cities
201
- # > [{:zip=>"78701-78705,78710,78712,78717,...", :specified_zip => "78701-78750", :city=>"Austin", :state=>"TX", :lat=>30.26, :long=>-97.74}, ...
215
+ # > [{:zip=>"78701-78705,78710,78712,78717,...", :specified_zip => "78701-78750", :city=>"Austin", :county=>"Travis,...", :state=>"TX", :lat=>30.26, :long=>-97.74}, ...
202
216
 
203
217
  # Returns just the name of the cities
204
218
  puts "78701-78750,78613".zip_cities names_only: true
@@ -249,13 +263,13 @@ Zipcoder.city_info("Atlanta, GA", **args)
249
263
  require 'zipcoder'
250
264
 
251
265
  puts "Austin, TX".city_info
252
- # > {:zip=>"78701-78705,78710,78712,78717,...", :city=>"AUSTIN", :state=>"TX", :lat=>30.26, :long=>-97.74}
266
+ # > {:zip=>"78701-78705,78710,78712,78717,...", :city=>"Austin", :county=>"Travis,...", :state=>"TX", :lat=>30.26, :long=>-97.74}
253
267
 
254
268
  puts "Austin, TX".city_info(zips_only: true)
255
269
  # > ["78701", "78702", "78703", ...]
256
270
 
257
271
  puts "Austin, TX".city_info(filter: "78701-78704,78748")
258
- # > {:zip=>"78701-78705,78710,78712,78717,...", :specified_zip=> "78701-78704,78748", :city=>"AUSTIN", :state=>"TX", :lat=>30.26, :long=>-97.74}
272
+ # > {:zip=>"78701-78705,78710,78712,78717,...", :specified_zip=> "78701-78704,78748", :city=>"Austin", :county=>"Travis,...", :state=>"TX", :lat=>30.26, :long=>-97.74}
259
273
  ```
260
274
 
261
275
  #### Method: Zipcoder.state_cities(state, **args)
@@ -294,6 +308,36 @@ puts "TX".state_cities names_only: true
294
308
  # > ["Abbott", ...
295
309
  ```
296
310
 
311
+ #### Method: Zipcoder.state_counties(state, **args)
312
+
313
+ This will return the cities in a state
314
+
315
+ **variations:**
316
+
317
+ ``` ruby
318
+ Zipcoder.state_counties("GA", **args)
319
+ "GA".state_counties(**args)
320
+ ```
321
+
322
+ **parameters:**
323
+
324
+ - state [String] - the 2 letter state abbreviation
325
+ - **return** [Array] - list of county names
326
+
327
+ **arguments:**
328
+
329
+ - none
330
+
331
+ **examples:**
332
+
333
+ ``` ruby
334
+ require 'zipcoder'
335
+
336
+ # Returns List
337
+ puts "TX".state_counties
338
+ # > ["Anderson", ...
339
+ ```
340
+
297
341
  #### Method: Zipcoder.states
298
342
 
299
343
  This will return the states in the US
data/Rakefile CHANGED
@@ -13,30 +13,56 @@ namespace :zipcoder do
13
13
  desc "Pulls the latest zip code data base file"
14
14
  task :update do
15
15
 
16
- # Fetch the latest database file
17
- uri = URI("http://federalgovernmentzipcodes.us/free-zipcode-database.csv")
18
- puts "Downloading newest zip codes from '#{uri.to_s}'"
19
- doc = Net::HTTP.get(uri)
20
-
21
- # Write the file to the file system
22
- filename = "lib/data/zipcode.csv"
23
- puts "Writing to the file '#{filename}'"
24
- File.open(filename, 'w') { |file| file.write(doc.to_s) }
16
+ def download(url, output)
17
+ puts "Downloading data from '#{url}'"
18
+ puts " writing to the file '#{output}'"
19
+
20
+ # Download the file
21
+ uri = URI(url)
22
+ doc = Net::HTTP.get(uri)
23
+
24
+ # Write the file to the file system
25
+ File.open(output, 'w') { |file| file.write(doc.to_s) }
26
+ end
27
+
28
+ # Fetch the latest zip code file
29
+ download "http://federalgovernmentzipcodes.us/free-zipcode-database.csv", "lib/data/zipcode.csv"
30
+
31
+ # Fetch the latest county file
32
+ download "https://raw.githubusercontent.com/grammakov/USA-cities-and-states/master/us_cities_states_counties.csv", "lib/data/county.csv"
25
33
  end
26
34
 
27
35
  desc "Converts the database file into the formats expected for the library"
28
36
  task :convert do
29
37
 
30
- # Open the file
31
- filename = "lib/data/zipcode.csv"
32
- puts "Opening the file '#{filename}'"
33
- csv_text = File.read(filename)
38
+ def open_file(filename)
39
+ puts "Importing data from '#{filename}'"
40
+ File.read(filename)
41
+ end
42
+
43
+ # Open the county files
44
+ county_csv_text = open_file "lib/data/county.csv"
45
+ city_county = {}
46
+ county_csv_text.split("\n").each do |line|
47
+ components = line.split("|")
48
+ next if components.length < 5
49
+ state = components[1]
50
+ county = components[3]
51
+ city = components[4]
52
+
53
+ key = "#{city.upcase},#{state}"
54
+ counties = city_county[key] || []
55
+ counties << county.capitalize
56
+ city_county[key] = counties.uniq
57
+ end
58
+
59
+ # Open the zip file
60
+ zip_csv_text = open_file "lib/data/zipcode.csv"
34
61
 
35
62
  # Import the CSV file and build the data structure
36
63
  zip_lookup_data = {}
37
- csv = CSV.parse(csv_text, :headers => true)
38
- puts "Importing data from '#{filename}'"
39
- csv.each do |row|
64
+ zip_csv = CSV.parse(zip_csv_text, :headers => true)
65
+ zip_csv.each do |row|
40
66
  next if row["ZipCodeType"] != "STANDARD" or not (["PRIMARY", "ACCEPTABLE"].include? row["LocationType"])
41
67
 
42
68
  zip_code = row["Zipcode"]
@@ -46,9 +72,13 @@ namespace :zipcoder do
46
72
  lat = row["Lat"].to_f
47
73
  long = row["Long"].to_f
48
74
 
75
+ # Pull the county
76
+ key = "#{city.upcase},#{state}"
77
+ county = (city_county[key] || []).join(",")
78
+
49
79
  # Write the zip_lookup_data
50
80
  areas = zip_lookup_data[zip_code] || []
51
- areas << { zip: zip_code, city: city, state: state, lat: lat, long: long, primary: primary }
81
+ areas << { zip: zip_code, city: city, county: county, state: state, lat: lat, long: long, primary: primary }
52
82
  zip_lookup_data[zip_code] = areas
53
83
  end
54
84