mlightner-zip_codes 0.5.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.
- data/README +0 -0
- data/Rakefile +100 -0
- data/bin/zipfind +23 -0
- data/data/zip_codes.db +0 -0
- data/lib/zip_code.rb +41 -0
- data/test.rb +5 -0
- data/zip_codes.gemspec +17 -0
- data/zip_codes.rb +24 -0
- metadata +77 -0
data/README
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'sqlite3'
|
6
|
+
|
7
|
+
DIR = File.dirname(__FILE__) + '/data'
|
8
|
+
system("mkdir -p #{DIR}")
|
9
|
+
|
10
|
+
desc 'Test the library.'
|
11
|
+
Rake::TestTask.new(:test) do |t|
|
12
|
+
t.libs << 'lib'
|
13
|
+
t.pattern = 'test/**/*_test.rb'
|
14
|
+
t.verbose = true
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Update gem files list"
|
18
|
+
task :gemfiles do
|
19
|
+
file_name = "zip_codes.gemspec"
|
20
|
+
files = `find ./ | grep -v \.git`.each_line.collect { |f| f.gsub(/^\.\//, '').strip }.reject { |e| e =~ /^\s*$/ }
|
21
|
+
file = File.new(file_name)
|
22
|
+
lines = file.readlines
|
23
|
+
file.close
|
24
|
+
|
25
|
+
newf = []
|
26
|
+
lines.each do |line|
|
27
|
+
if line =~ /^\s+s\.files\s*\=/
|
28
|
+
newf.push " s.files = [\"#{files.join('","')}\"]\n"
|
29
|
+
else
|
30
|
+
newf.push(line.rstrip + "\n")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Don't write the file if there are no changes
|
35
|
+
file = File.new(file_name,'w')
|
36
|
+
newf.each do |line|
|
37
|
+
file.write(line)
|
38
|
+
end
|
39
|
+
file.close
|
40
|
+
end
|
41
|
+
|
42
|
+
namespace :zip_codes do
|
43
|
+
|
44
|
+
desc "Reloads and refreshes db and data"
|
45
|
+
task :all => [ :clean, :download, :create_db, :load_data, :index ]
|
46
|
+
|
47
|
+
desc 'Downloads the zip code database'
|
48
|
+
task :download do
|
49
|
+
require 'open-uri'
|
50
|
+
chdir("#{DIR}")
|
51
|
+
system("/usr/bin/env wget http://www.populardata.com/downloads/zip_codes.zip")
|
52
|
+
system("/usr/bin/env unzip -p zip_codes.zip > zip_codes.csv")
|
53
|
+
puts "New zip code database downloaded."
|
54
|
+
end
|
55
|
+
|
56
|
+
desc 'Creates the test database'
|
57
|
+
task :create_db do
|
58
|
+
puts "Creating zip code database..."
|
59
|
+
require 'csv'
|
60
|
+
system("rm -f #{DIR}/zip_codes.db")
|
61
|
+
csv = CSV.open("#{DIR}/zip_codes.csv", "r")
|
62
|
+
db = SQLite3::Database.new( "#{DIR}/zip_codes.db" )
|
63
|
+
db.execute("create table zip_codes (
|
64
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
65
|
+
zip VARCHAR(9) NOT NULL,
|
66
|
+
zip_class VARCHAR(9) ,
|
67
|
+
city TEXT ,
|
68
|
+
county TEXT ,
|
69
|
+
state VARCHAR(2) ,
|
70
|
+
lat FLOAT ,
|
71
|
+
long FLOAT
|
72
|
+
);")
|
73
|
+
|
74
|
+
desc "Loads zip code data"
|
75
|
+
task :load_data
|
76
|
+
st = db.prepare("insert into zip_codes(zip, lat, long, city, state, county, zip_class) values(?, ?, ?, ?, ?, ?, ?)")
|
77
|
+
csv = CSV.open("#{DIR}/zip_codes.csv", "r")
|
78
|
+
csv.each_with_index do |r,i|
|
79
|
+
puts "Creating zip code #{r[0]} (#{i})"
|
80
|
+
st.execute(*r)
|
81
|
+
end
|
82
|
+
puts "Database created."
|
83
|
+
end
|
84
|
+
|
85
|
+
desc 'Creates index on zip codes table'
|
86
|
+
task :index do
|
87
|
+
db = SQLite3::Database.open( "#{DIR}/zip_codes.db" )
|
88
|
+
db.execute("create unique index zip_index on zip_codes (zip);") rescue nil
|
89
|
+
db.execute("create index zip_state_index on zip_coddes (state);") rescue nil
|
90
|
+
end
|
91
|
+
|
92
|
+
desc 'Cleans data dir'
|
93
|
+
task :clean do
|
94
|
+
File.unlink("#{DIR}/zip_codes.csv") rescue nil
|
95
|
+
File.unlink("#{DIR}/zip_codes.zip") rescue nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
task :default => ['zip_codes:all']
|
data/bin/zipfind
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.dirname(__FILE__) + '/../zip_codes.rb'
|
3
|
+
|
4
|
+
zip = ARGV[0].strip
|
5
|
+
|
6
|
+
raise "Syntax: $0 <zip_code>" unless zip
|
7
|
+
|
8
|
+
if zip !~ /^([\w\-]+)$/
|
9
|
+
raise "Zip is invalid format"
|
10
|
+
end
|
11
|
+
|
12
|
+
z = ZipCode.new(zip)
|
13
|
+
|
14
|
+
if z && z.valid?
|
15
|
+
puts "Results for zip code: #{zip}:"
|
16
|
+
ZipCode.columns.each do |c|
|
17
|
+
next if c == :id
|
18
|
+
next if c == :zip
|
19
|
+
puts " - #{c.to_s}: #{z.record[c.to_sym]}"
|
20
|
+
end
|
21
|
+
else
|
22
|
+
puts "No match for zip code: #{zip}:"
|
23
|
+
end
|
data/data/zip_codes.db
ADDED
Binary file
|
data/lib/zip_code.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
class ZipCode
|
2
|
+
|
3
|
+
attr_accessor :record
|
4
|
+
|
5
|
+
ZIP_COLUMNS.each do |f|
|
6
|
+
attr_accessor f.to_sym
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.db
|
10
|
+
raise "No database availablbe. Please initialize it with Rake." unless ZIP_DB.kind_of?(SQLite3::Database)
|
11
|
+
ZIP_DB
|
12
|
+
end
|
13
|
+
|
14
|
+
def db
|
15
|
+
self.class.db
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.columns
|
19
|
+
ZIP_COLUMNS
|
20
|
+
end
|
21
|
+
|
22
|
+
def columns
|
23
|
+
self.class.columns
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(zipl)
|
27
|
+
row = db.execute( "select * from zip_codes where zip = '#{zipl.to_s}';" ).first
|
28
|
+
return nil unless (row.kind_of?(Array) && row[1].to_s == zipl.to_s)
|
29
|
+
@record = {}
|
30
|
+
columns.each_with_index do |f,i|
|
31
|
+
@record[f.to_sym] = row[i]
|
32
|
+
self.instance_variable_set(:"@#{f.to_s}", row[i])
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def valid?
|
38
|
+
record.kind_of?(Hash) && record.has_key?(:zip)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/test.rb
ADDED
data/zip_codes.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = %q{zip_codes}
|
3
|
+
s.version = "0.5.0"
|
4
|
+
s.author = "Matt Lightner"
|
5
|
+
s.default_executable = %q{zip_codes}
|
6
|
+
s.description = %q{A library for looking up zip codes and their associated info.}
|
7
|
+
s.email = %q{mlightner@gmail.com}
|
8
|
+
s.executables = ["zipfind"]
|
9
|
+
s.files = ["README","bin","bin/zipfind","lib","lib/zip_code.rb","zip_codes.gemspec","data","data/zip_codes.db","Rakefile","zip_codes.rb","test.rb"]
|
10
|
+
s.has_rdoc = false
|
11
|
+
s.homepage = %q{http://github.com/mlightner/zip_codes}
|
12
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "zip_codes", "--main"]
|
13
|
+
s.require_paths = ["lib"]
|
14
|
+
s.summary = %q{A library for looking up zip codes and their associated info.}
|
15
|
+
|
16
|
+
s.add_dependency(%q<sqlite3>, [">= 0.0.0"])
|
17
|
+
end
|
data/zip_codes.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'sqlite3'
|
4
|
+
|
5
|
+
DBFILE = File.dirname(__FILE__) + '/data/zip_codes.db'
|
6
|
+
raise "Please populate the database first" unless File.exist?(DBFILE)
|
7
|
+
|
8
|
+
begin
|
9
|
+
ZIP_DB = SQLite3::Database.open( DBFILE )
|
10
|
+
raise "No database available. Please initialize it with Rake." unless ZIP_DB.kind_of?(SQLite3::Database)
|
11
|
+
ZIP_META = ZIP_DB.execute("SELECT * FROM sqlite_master;").first.last.split(/[\r\n\t]+/)
|
12
|
+
#raise "Can't query DB" unless (ZIP_META.kind_of?(Array) && ZIP_META.include?("zip_codes"))
|
13
|
+
ZIP_COLUMNS = []
|
14
|
+
ZIP_META.each do |l|
|
15
|
+
next unless l =~ /^ ([\S]+)\s+/
|
16
|
+
ZIP_COLUMNS.push($1.to_sym)
|
17
|
+
end
|
18
|
+
rescue Exception => e
|
19
|
+
puts "There is a problem with your database: #{e.message}"
|
20
|
+
end
|
21
|
+
|
22
|
+
#raise ZIP_META.inspect
|
23
|
+
|
24
|
+
require File.dirname(__FILE__) + '/lib/zip_code.rb'
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mlightner-zip_codes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matt Lightner
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-16 00:00:00 -07:00
|
13
|
+
default_executable: zip_codes
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: sqlite3
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
description: A library for looking up zip codes and their associated info.
|
26
|
+
email: mlightner@gmail.com
|
27
|
+
executables:
|
28
|
+
- zipfind
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- README
|
35
|
+
- bin
|
36
|
+
- bin/zipfind
|
37
|
+
- lib
|
38
|
+
- lib/zip_code.rb
|
39
|
+
- zip_codes.gemspec
|
40
|
+
- data
|
41
|
+
- data/zip_codes.db
|
42
|
+
- Rakefile
|
43
|
+
- zip_codes.rb
|
44
|
+
- test.rb
|
45
|
+
has_rdoc: false
|
46
|
+
homepage: http://github.com/mlightner/zip_codes
|
47
|
+
licenses:
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options:
|
50
|
+
- --line-numbers
|
51
|
+
- --inline-source
|
52
|
+
- --title
|
53
|
+
- zip_codes
|
54
|
+
- --main
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: "0"
|
62
|
+
version:
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
version:
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 1.3.5
|
73
|
+
signing_key:
|
74
|
+
specification_version: 2
|
75
|
+
summary: A library for looking up zip codes and their associated info.
|
76
|
+
test_files: []
|
77
|
+
|