-
Notifications
You must be signed in to change notification settings - Fork 3
/
zip_lookup.rb
74 lines (53 loc) · 2.14 KB
/
zip_lookup.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# -*- encoding : utf-8 -*-
require 'mechanize'
module USPSStandardizer
#TODO: Change from 'mechanize' to 'net/hhtp'
#TODO: Implement 'timeout'
class ZipLookup
attr_accessor :address, :state, :city, :zipcode
def initialize(options = {}, mechanize = Mechanize.new)
@address, @state, @city, @zipcode, @county = '', '', '', '', ''
@mechanize = mechanize
options.each do |name, value|
send("#{name}=", value)
end
end
def std_address
if(cache and response = cache[redis_key(@address)])
address, city, state, county, zipcode = response.split('::')
return {:address => address, :city => city, :state => state, :county => county, :zipcode => zipcode}
end
return {} unless (content = get_std_address_content)
content.gsub!(/\t|\n|\r/, '')
content.scan %r{<span class=\"address1 range\">([^<]*)}
@r_address = $1.gsub(/^ | $/, '')
content.scan %r{<span class=\"city range\">([^<]*)}
@r_city = $1.gsub(/^ | $/, '')
content.scan %r{<span class=\"state range\">([^<]*)}
@r_state = $1.gsub(/^ | $/, '')
content.scan %r{<span class=\"zip\" style=\"\">([^<]*)}
@r_zipcode = $1.gsub(/^ | $/, '')
content.scan %r{<dt>County</dt><dd>([^<]*)}
@r_county = ($1.empty?) ? '' : $1.gsub(/^ | $/, '')
results = {:address => @r_address, :city => @r_city, :state => @r_state, :county => @r_county, :zipcode => @r_zipcode}
if cache
cache[redis_key(@address)] = "#{@r_address}::#{@r_city}::#{@r_state}::#{@r_county}::#{@r_zipcode}"
end
results
end
private
def get_std_address_content
url = "https://tools.usps.com/go/ZipLookupResultsAction!input.action?resultMode=0&companyName=&address1=#{@address}&address2=&city=#{@city}&state=#{@state}&urbanCode=&postalCode=&zip="
@mechanize.get url
return false unless @mechanize.page.search('div#error-box').empty?
return @mechanize.page.search('div#result-list ul li:first').to_html
end
def cache
USPSStandardizer.cache
end
private
def redis_key(address)
address.downcase.gsub(' ', '_')
end
end
end