Skip to content
Snippets Groups Projects
Commit 4df8fba3 authored by Alex Reisner's avatar Alex Reisner
Browse files

Fix handling of zip-code-only query results.

Also much code cleanup.
parent 9d58eb77
No related branches found
No related tags found
No related merge requests found
......@@ -12,16 +12,14 @@ module Geocoder::Lookup
end
def query_url(query)
return "#{protocol}://api.smartystreets.com/zipcode?#{url_query_string(query)}" if zipcode_only?(query)
"#{protocol}://api.smartystreets.com/street-address?#{url_query_string(query)}"
path = zipcode_only?(query) ? "zipcode" : "street-address"
"#{protocol}://api.smartystreets.com/#{path}?#{url_query_string(query)}"
end
private # ---------------------------------------------------------------
def zipcode_only?(query)
return false if query.text.is_a?(Array)
return true unless (query.to_s.strip =~ /\A[\d]{5}(-[\d]{4})?\Z/).nil?
false
!query.text.is_a?(Array) and query.to_s.strip =~ /\A\d{5}(-\d{4})?\Z/
end
def query_url_params(query)
......@@ -41,8 +39,7 @@ module Geocoder::Lookup
end
def results(query)
return [] unless doc = fetch_data(query)
doc
fetch_data(query) || []
end
end
end
......@@ -9,78 +9,98 @@ require 'geocoder/lookups/base'
module Geocoder::Result
class SmartyStreets < Base
def coordinates
%w(latitude longitude).map{|i| (zipcode_result? && zipcodes.first[i]) ||
metadata[i] }
%w(latitude longitude).map do |i|
(zipcode_result? && zipcodes.first[i]) || metadata[i]
end
end
def address
begin
line_2 = delivery_line_2
rescue KeyError
line_2 = ''
end
"#{delivery_line_1} #{line_2} #{last_line}".strip.gsub(" ", " ") || nil
[
delivery_line_1,
delivery_line_2,
last_line
].select{ |i| i.to_s != "" }.join(" ")
end
def state
components['state_abbreviation']
rescue KeyError
city_states.first['state']
components['state_abbreviation'] || city_states.first['state']
end
def state_code
city_states.first['state_abbreviation']
rescue KeyError
state
if cs = city_states.first
cs['state_abbreviation']
else
state
end
end
def country
# SmartyStreets returns results for USA only
"United States"
end
def country_code
# SmartyStreets returns results for USA only
"US"
end
alias_method :country_code, :country
## Extra methods not in base.rb ------------------------
## Extra methods not in base.rb ------------------------
def street
components['street_name']
rescue KeyError
nil
end
def city
components['city_name']
rescue KeyError
city_states.first['city']
components['city_name'] || city_states.first['city']
end
def zipcode
components['zipcode']
rescue KeyError
zipcodes.first['zipcode']
components['zipcode'] || zipcodes.first['zipcode']
end
alias_method :postal_code, :zipcode
def zip4
components['plus4_code']
rescue KeyError
nil
end
alias_method :postal_code_extended, :zip4
def fips
metadata['county_fips']
rescue KeyError
zipcodes.first['county_fips']
metadata['county_fips'] || zipcodes.first['county_fips']
end
def zipcode_result?
zipcodes.any? rescue false
zipcodes.any?
end
# References to `components`, `metadata`, `city_states`, `zipcodes` land here.
def method_missing(meth, *args, &block)
@data.fetch(meth.to_s)
[
:delivery_line_1,
:delivery_line_2,
:last_line,
:delivery_point_barcode,
:addressee
].each do |m|
define_method(m) do
@data[m.to_s] || ''
end
end
[
:components,
:metadata,
:analysis
].each do |m|
define_method(m) do
@data[m.to_s] || {}
end
end
[
:city_states,
:zipcodes
].each do |m|
define_method(m) do
@data[m.to_s] || []
end
end
end
end
[{"input_index":0,"city_states":[{"city":"Brooklyn","state_abbreviation":"NY","state":"New York"}],"zipcodes":[{"zipcode":"11211","zipcode_type":"S","county_fips":"36047","county_name":"Kings","latitude":40.71184,"longitude":-73.95288}]}]
\ No newline at end of file
# encoding: utf-8
$: << File.join(File.dirname(__FILE__), "..", "..")
require 'test_helper'
class SmartyStreetsTest < GeocoderTestCase
......@@ -16,17 +17,17 @@ class SmartyStreetsTest < GeocoderTestCase
def test_query_for_address_geocode
query = Geocoder::Query.new("42 Wallaby Way Sydney, AU")
assert_not_nil query.url =~ /api\.smartystreets\.com\/street-address\?/
assert_match /api\.smartystreets\.com\/street-address\?/, query.url
end
def test_query_for_zipcode_geocode
query = Geocoder::Query.new("22204")
assert_not_nil query.url =~ /api\.smartystreets\.com\/zipcode\?/
assert_match /api\.smartystreets\.com\/zipcode\?/, query.url
end
def test_query_for_zipfour_geocode
query = Geocoder::Query.new("22204-1603")
assert_not_nil query.url =~ /api\.smartystreets\.com\/zipcode\?/
query = Geocoder::Query.new("22204-1603")
assert_match /api\.smartystreets\.com\/zipcode\?/, query.url
end
def test_smarty_streets_result_components
......@@ -38,6 +39,13 @@ class SmartyStreetsTest < GeocoderTestCase
assert_equal "36061", result.fips
end
def test_smarty_streets_result_components_with_zipcode_only_query
result = Geocoder.search("11211").first
assert_equal "Brooklyn", result.city
assert_equal "New York", result.state
assert_equal "NY", result.state_code
end
def test_no_results
results = Geocoder.search("no results")
assert_equal 0, results.length
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment