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 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
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'zip_codes'
4
+
5
+ puts ZipCode.new('94949').inspect
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
+