mlightner-zip_codes 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
+