google_geocoding 0.1.5 → 0.2.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/VERSION +1 -1
- data/google_geocoding.gemspec +14 -6
- data/lib/google_geocoding/address_component.rb +25 -0
- data/lib/google_geocoding/errors.rb +31 -62
- data/lib/google_geocoding/geocoder.rb +5 -6
- data/lib/google_geocoding/request.rb +47 -0
- data/lib/google_geocoding/response.rb +23 -50
- data/lib/google_geocoding/result.rb +36 -0
- data/lib/google_geocoding.rb +18 -1
- data/spec/classes/request_spec.rb +26 -0
- data/spec/classes/response_spec.rb +80 -0
- data/spec/classes/result_spec.rb +32 -0
- data/spec/integration_spec.rb +14 -0
- data/spec/spec_helper.rb +2 -1
- metadata +55 -24
- data/lib/google_geocoding/placemark.rb +0 -30
- data/spec/google_geocoding_spec.rb +0 -7
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/google_geocoding.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{google_geocoding}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Rodrigo Kochenburger"]
|
12
|
-
s.date = %q{2010-03-
|
12
|
+
s.date = %q{2010-03-30}
|
13
13
|
s.description = %q{GoogleGeocoding is a small library for performing geocoding using the Google's HTTP geocoding API}
|
14
14
|
s.email = %q{divoxx@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -25,21 +25,29 @@ Gem::Specification.new do |s|
|
|
25
25
|
"VERSION",
|
26
26
|
"google_geocoding.gemspec",
|
27
27
|
"lib/google_geocoding.rb",
|
28
|
+
"lib/google_geocoding/address_component.rb",
|
28
29
|
"lib/google_geocoding/errors.rb",
|
29
30
|
"lib/google_geocoding/geocoder.rb",
|
30
|
-
"lib/google_geocoding/
|
31
|
+
"lib/google_geocoding/request.rb",
|
31
32
|
"lib/google_geocoding/response.rb",
|
32
|
-
"
|
33
|
+
"lib/google_geocoding/result.rb",
|
34
|
+
"spec/classes/request_spec.rb",
|
35
|
+
"spec/classes/response_spec.rb",
|
36
|
+
"spec/classes/result_spec.rb",
|
37
|
+
"spec/integration_spec.rb",
|
33
38
|
"spec/spec.opts",
|
34
39
|
"spec/spec_helper.rb"
|
35
40
|
]
|
36
41
|
s.homepage = %q{http://github.com/divoxx/google_geocoding}
|
37
42
|
s.rdoc_options = ["--charset=UTF-8"]
|
38
43
|
s.require_paths = ["lib"]
|
39
|
-
s.rubygems_version = %q{1.3.
|
44
|
+
s.rubygems_version = %q{1.3.6}
|
40
45
|
s.summary = %q{Google's geocoding library}
|
41
46
|
s.test_files = [
|
42
|
-
"spec/
|
47
|
+
"spec/classes/request_spec.rb",
|
48
|
+
"spec/classes/response_spec.rb",
|
49
|
+
"spec/classes/result_spec.rb",
|
50
|
+
"spec/integration_spec.rb",
|
43
51
|
"spec/spec_helper.rb"
|
44
52
|
]
|
45
53
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module GoogleGeocoding
|
2
|
+
class AddressComponent
|
3
|
+
REQUIRED_ATTRIBUTES = [:long_name, :short_name, :types].freeze
|
4
|
+
attr_reader *REQUIRED_ATTRIBUTES
|
5
|
+
|
6
|
+
def initialize(params)
|
7
|
+
process_args(params)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
def process_args(args)
|
12
|
+
error = Errors::InvalidParametersError.new(self)
|
13
|
+
|
14
|
+
REQUIRED_ATTRIBUTES.each do |req_attr|
|
15
|
+
error.add(req_attr, :required) unless args.include?(req_attr)
|
16
|
+
end
|
17
|
+
|
18
|
+
raise error unless error.empty?
|
19
|
+
|
20
|
+
@types = Array(args[:types]).map { |type| type.to_sym }.freeze
|
21
|
+
@long_name = args[:long_name].freeze
|
22
|
+
@short_name = args[:short_name].freeze
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,75 +1,44 @@
|
|
1
1
|
module GoogleGeocoding
|
2
2
|
module Errors
|
3
|
-
#
|
4
|
-
class
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
def initialize(address, response)
|
9
|
-
@address = address
|
10
|
-
@response = response
|
11
|
-
super "Could not geocode '#{@address}'. Server responded with #{@response.status}"
|
3
|
+
# Error representing that the parameters provided to the request are invalid.
|
4
|
+
class InvalidParametersError < BaseError
|
5
|
+
def initialize(request)
|
6
|
+
@request = request
|
7
|
+
@messages = Hash.new { |h,k| h[k] = [] }
|
12
8
|
end
|
13
|
-
end
|
14
|
-
|
15
|
-
# Services error means the service was reached but returned a unsuccessful response.
|
16
|
-
class ServiceError < BaseError; end
|
17
|
-
|
18
|
-
# 500 G_GEO_SERVER_ERROR
|
19
|
-
class ServerError < ServiceError
|
20
|
-
def initialize
|
21
|
-
super("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is unknown.")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# 601 G_GEO_MISSING_QUERY
|
26
|
-
class MissingQueryError < ServiceError
|
27
|
-
def initialize
|
28
|
-
super("An empty address was specified")
|
29
|
-
end
|
30
|
-
end
|
31
9
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
super("No corresponding geographic location could be found for the specified address, possibly because the address is relatively new, or because it may be incorrect.")
|
10
|
+
# Add a error message for the given param.
|
11
|
+
def add(param, identifier)
|
12
|
+
@messages[param] << identifier
|
36
13
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
def initialize
|
42
|
-
super("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.")
|
14
|
+
|
15
|
+
# Returns the messages for the given param
|
16
|
+
def on(param)
|
17
|
+
@messages[param]
|
43
18
|
end
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
19
|
+
|
20
|
+
# Returns a descriptive message of the error.
|
21
|
+
def message
|
22
|
+
message = "Some of the request parameters are invalid:"
|
23
|
+
@messages.each { |param, identifiers| message << "\n * #{param}: #{identifiers.join(', ')}" }
|
24
|
+
message
|
50
25
|
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
26
|
+
|
27
|
+
# Alias to_s to messages for easy terminal output
|
28
|
+
alias_method :to_s, :message
|
29
|
+
|
30
|
+
# Returns true/false for whether there are an error on any params
|
31
|
+
def empty?
|
32
|
+
@messages.empty?
|
57
33
|
end
|
58
34
|
end
|
59
35
|
|
60
|
-
#
|
61
|
-
class
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
603 => UnknownAddressError,
|
67
|
-
610 => BadKeyError,
|
68
|
-
620 => TooManyQueriesError
|
69
|
-
}
|
70
|
-
|
71
|
-
def self.build(status)
|
72
|
-
ERRORS_MAPPING[status].new
|
36
|
+
# Http error, will be raised when the server returns with a status code outside the 200...300 range.
|
37
|
+
class HttpError < BaseError
|
38
|
+
def initialize(address, response)
|
39
|
+
@address = address
|
40
|
+
@response = response
|
41
|
+
super "Could not geocode '#{@address}'. Server responded with #{@response.status}"
|
73
42
|
end
|
74
43
|
end
|
75
44
|
end
|
@@ -10,7 +10,7 @@ module GoogleGeocoding
|
|
10
10
|
@options = options
|
11
11
|
@sess = Patron::Session.new
|
12
12
|
@sess.timeout = options[:timeout] || 10
|
13
|
-
@sess.base_url = "http://maps.google.com/maps/
|
13
|
+
@sess.base_url = "http://maps.google.com/maps/api/geocode"
|
14
14
|
@sess.headers['User-Agent'] = options[:user_agent]
|
15
15
|
end
|
16
16
|
|
@@ -19,12 +19,11 @@ module GoogleGeocoding
|
|
19
19
|
# @param [String, #to_s]
|
20
20
|
# @return [Response]
|
21
21
|
def query(address)
|
22
|
-
|
23
|
-
|
24
|
-
resp = @sess.get(params)
|
22
|
+
request = Request.new(:address => address, :sensor => false)
|
23
|
+
response = @sess.get("/json?#{request.query_string}")
|
25
24
|
|
26
|
-
if (200...300).include?(
|
27
|
-
Response.new(
|
25
|
+
if (200...300).include?(response.status)
|
26
|
+
Response.new(response.body)
|
28
27
|
else
|
29
28
|
raise Errors::HttpError.new(address, resp)
|
30
29
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module GoogleGeocoding
|
2
|
+
# Encapsulation of the request information to be sent to the API endpoing.
|
3
|
+
class Request
|
4
|
+
# Creates a new request.
|
5
|
+
#
|
6
|
+
# @param [Hash] params hash of the parameters for the request. Valid parameters are:
|
7
|
+
# - address (required) - The address that you want to geocode.
|
8
|
+
# - *OR* latlng (required) - The textual latitude/longitude value for which you wish to obtain the closest, human-readable address.
|
9
|
+
# - bounds (optional) - The bounding box of the viewport within which to bias geocode results more prominently.
|
10
|
+
# - region (optional) - The region code, specified as a ccTLD ("top-level domain") two-character value.
|
11
|
+
# - language (optional) - The language in which to return results. See the supported list of domain languages.
|
12
|
+
# - sensor (required) - Indicates whether or not the geocoding request comes from a device with a location sensor. This value must be either true or false.
|
13
|
+
#
|
14
|
+
# @raise InvalidRequestParametersError
|
15
|
+
def initialize(params = {})
|
16
|
+
@params = params.dup
|
17
|
+
check_params!
|
18
|
+
end
|
19
|
+
|
20
|
+
# Return the request query string.
|
21
|
+
# @return [String]
|
22
|
+
def query_string
|
23
|
+
@params.map { |param, value| "#{CGI.escape(param.to_s)}=#{CGI.escape(value.to_s)}" }.join("&")
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def check_params!
|
28
|
+
error = Errors::InvalidParametersError.new(self)
|
29
|
+
|
30
|
+
if @params[:address].nil?
|
31
|
+
error.add(:address, :required)
|
32
|
+
end
|
33
|
+
|
34
|
+
if @params[:required] && @params[:latlng].nil?
|
35
|
+
error.add(:latlng, :required)
|
36
|
+
end
|
37
|
+
|
38
|
+
if @params[:sensor].nil?
|
39
|
+
error.add(:sensor, :required)
|
40
|
+
elsif ![true, false].include?(@params[:sensor])
|
41
|
+
error.add(:sensor, :boolean)
|
42
|
+
end
|
43
|
+
|
44
|
+
raise error unless error.empty?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -3,71 +3,44 @@ module GoogleGeocoding
|
|
3
3
|
# Creates a new response object from the given response body, expects to be a JSON string.
|
4
4
|
#
|
5
5
|
# @param [String]
|
6
|
-
def initialize(
|
7
|
-
@data
|
6
|
+
def initialize(payload, result_class = nil)
|
7
|
+
@data = JSON.parse(payload)
|
8
|
+
@result_class = result_class || GoogleGeocoding.const_get(:Result)
|
8
9
|
end
|
9
10
|
|
10
11
|
# Return the status code included in the server response.
|
11
12
|
#
|
12
|
-
# @return [
|
13
|
-
# @see http://code.google.com/apis/maps/documentation/geocoding
|
14
|
-
def
|
15
|
-
|
13
|
+
# @return [Symbol]
|
14
|
+
# @see http://code.google.com/apis/maps/documentation/geocoding/#StatusCodes
|
15
|
+
def status
|
16
|
+
@status ||= @data["status"].downcase.to_sym
|
16
17
|
end
|
17
18
|
|
18
19
|
# Return whether response successfully resolved the geolocation
|
19
20
|
def success?
|
20
|
-
|
21
|
+
status == :ok
|
21
22
|
end
|
22
23
|
|
23
24
|
# Return whether response failed to resolved the geolocation
|
24
25
|
def failure?
|
25
26
|
!success?
|
26
27
|
end
|
27
|
-
|
28
|
-
# Return the
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
accurracy = Integer(details["Accuracy"])
|
41
|
-
placemark = Placemark.new
|
42
|
-
placemark.accurracy = accurracy
|
43
|
-
placemark.coordinates = coordinates
|
44
|
-
|
45
|
-
if country = details["Country"]
|
46
|
-
placemark.country_name = country["CountryName"],
|
47
|
-
placemark.country_code = country["CountryNameCode"]
|
48
|
-
|
49
|
-
if admarea = country["AdministrativeArea"]
|
50
|
-
placemark.region = admarea["AdministrativeAreaName"]
|
51
|
-
subadmarea = admarea["SubAdministrativeArea"]
|
52
|
-
locality = subadmarea ? subadmarea["Locality"] : admarea["Locality"]
|
53
|
-
|
54
|
-
if locality
|
55
|
-
placemark.city = locality["LocalityName"]
|
56
|
-
|
57
|
-
if postal_code = locality["PostalCode"]
|
58
|
-
placemark.postal_code = postal_code["PostalCodeNumber"]
|
59
|
-
end
|
60
|
-
|
61
|
-
if thoroughfare = locality["Thoroughfare"]
|
62
|
-
placemark.street = thoroughfare["ThoroughfareName"]
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
placemarks << placemark
|
28
|
+
|
29
|
+
# Return the types of the result
|
30
|
+
def results
|
31
|
+
@result ||= @data["results"].map do |result_data|
|
32
|
+
result = @result_class.new(
|
33
|
+
:types => result_data["types"],
|
34
|
+
:address => result_data["formatted_address"],
|
35
|
+
:coordinates => result_data["geometry"]["location"].values_at("lat", "lng"),
|
36
|
+
:precision => result_data["geometry"]["location_type"]
|
37
|
+
)
|
38
|
+
|
39
|
+
result_data["address_components"].each do |addr_comp_data|
|
40
|
+
result << AddressComponent.new(:short_name => addr_comp_data["short_name"], :long_name => addr_comp_data["long_name"], :types => addr_comp_data["types"])
|
69
41
|
end
|
70
|
-
|
42
|
+
|
43
|
+
result
|
71
44
|
end
|
72
45
|
end
|
73
46
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module GoogleGeocoding
|
2
|
+
# Model that represents a placemark returned by the geocoding service.
|
3
|
+
class Result
|
4
|
+
REQUIRED_ATTRIBUTES = [:types, :address, :coordinates, :precision].freeze
|
5
|
+
attr_reader :components, *REQUIRED_ATTRIBUTES
|
6
|
+
|
7
|
+
def initialize(args = {})
|
8
|
+
process_args(args)
|
9
|
+
@components = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def <<(component)
|
13
|
+
@components << component
|
14
|
+
end
|
15
|
+
|
16
|
+
def each(&block)
|
17
|
+
@component.each(&block)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def process_args(args)
|
22
|
+
error = Errors::InvalidParametersError.new(self)
|
23
|
+
|
24
|
+
REQUIRED_ATTRIBUTES.each do |req_attr|
|
25
|
+
error.add(req_attr, :required) unless args.include?(req_attr)
|
26
|
+
end
|
27
|
+
|
28
|
+
raise error unless error.empty?
|
29
|
+
|
30
|
+
@types = Array(args[:types]).map { |type| type.to_sym }.freeze
|
31
|
+
@address = args[:address].freeze
|
32
|
+
@coordinates = args[:coordinates].freeze
|
33
|
+
@precision = args[:precision].downcase.to_sym
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/google_geocoding.rb
CHANGED
@@ -1,6 +1,23 @@
|
|
1
|
+
begin
|
2
|
+
require 'rubygems'
|
3
|
+
rescue LoadError
|
4
|
+
# Ignore
|
5
|
+
end
|
6
|
+
|
7
|
+
# Dependencies
|
8
|
+
require 'cgi'
|
1
9
|
require 'json'
|
2
10
|
require 'patron'
|
11
|
+
|
12
|
+
module GoogleGeocoding
|
13
|
+
# Base class for all errors
|
14
|
+
class BaseError < StandardError; end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Require google_geocoding parts
|
3
18
|
require 'google_geocoding/errors'
|
4
|
-
require 'google_geocoding/
|
19
|
+
require 'google_geocoding/request'
|
20
|
+
require 'google_geocoding/address_component'
|
21
|
+
require 'google_geocoding/result'
|
5
22
|
require 'google_geocoding/response'
|
6
23
|
require 'google_geocoding/geocoder'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe Request do
|
4
|
+
describe "request creation" do
|
5
|
+
it "should create a request with valid params" do
|
6
|
+
lambda { Request.new(:address => "2 Townsend St, San Francisco, CA", :sensor => false) }.should_not raise_error(Errors::InvalidParametersError)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should raise InvalidRequestParametersError when address is missing" do
|
10
|
+
lambda { Request.new }.should raise_error(Errors::InvalidParametersError) do |error|
|
11
|
+
error.on_param(:address).should include(:required)
|
12
|
+
error.on_param(:sensor).should include(:required)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "request usage" do
|
18
|
+
before :each do
|
19
|
+
@request = Request.new(:address => "2 Townsend St, San Francisco, CA", :sensor => false)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return the query string" do
|
23
|
+
@request.query_string.should == "address=2+Townsend+St%2C+San+Francisco%2C+CA&sensor=false"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe Response do
|
4
|
+
before :each do
|
5
|
+
@result_inst = mock(:result_instance, :<< => nil)
|
6
|
+
@result_class = mock(:result_class, :new => @result_inst)
|
7
|
+
@response = Response.new(DATA, @result_class)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should provide status" do
|
11
|
+
@response.status.should == :ok
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should provide whether it is a successful request" do
|
15
|
+
@response.should be_success
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should provide whether it is a failure request" do
|
19
|
+
@response.should_not be_failure
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should provide the results" do
|
23
|
+
args = {:types => ["street_address"], :address => "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA", :coordinates => [37.4219720, -122.0841430], :precision => "ROOFTOP"}
|
24
|
+
@result_class.should_receive(:new).once.with(args).and_return(@result_inst)
|
25
|
+
@response.results.should be_instance_of(Array)
|
26
|
+
@response.results.each { |item| item.should be(@result_inst) }
|
27
|
+
end
|
28
|
+
|
29
|
+
DATA = <<-EOF
|
30
|
+
{
|
31
|
+
"status": "OK",
|
32
|
+
"results": [ {
|
33
|
+
"types": [ "street_address" ],
|
34
|
+
"formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
|
35
|
+
"address_components": [ {
|
36
|
+
"long_name": "1600",
|
37
|
+
"short_name": "1600",
|
38
|
+
"types": [ "street_number" ]
|
39
|
+
}, {
|
40
|
+
"long_name": "Amphitheatre Pkwy",
|
41
|
+
"short_name": "Amphitheatre Pkwy",
|
42
|
+
"types": [ "route" ]
|
43
|
+
}, {
|
44
|
+
"long_name": "Mountain View",
|
45
|
+
"short_name": "Mountain View",
|
46
|
+
"types": [ "locality", "political" ]
|
47
|
+
}, {
|
48
|
+
"long_name": "California",
|
49
|
+
"short_name": "CA",
|
50
|
+
"types": [ "administrative_area_level_1", "political" ]
|
51
|
+
}, {
|
52
|
+
"long_name": "United States",
|
53
|
+
"short_name": "US",
|
54
|
+
"types": [ "country", "political" ]
|
55
|
+
}, {
|
56
|
+
"long_name": "94043",
|
57
|
+
"short_name": "94043",
|
58
|
+
"types": [ "postal_code" ]
|
59
|
+
} ],
|
60
|
+
"geometry": {
|
61
|
+
"location": {
|
62
|
+
"lat": 37.4219720,
|
63
|
+
"lng": -122.0841430
|
64
|
+
},
|
65
|
+
"location_type": "ROOFTOP",
|
66
|
+
"viewport": {
|
67
|
+
"southwest": {
|
68
|
+
"lat": 37.4188244,
|
69
|
+
"lng": -122.0872906
|
70
|
+
},
|
71
|
+
"northeast": {
|
72
|
+
"lat": 37.4251196,
|
73
|
+
"lng": -122.0809954
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
} ]
|
78
|
+
}
|
79
|
+
EOF
|
80
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe Result do
|
4
|
+
describe "result creation" do
|
5
|
+
it "should create object and set properties" do
|
6
|
+
result = Result.new(
|
7
|
+
:types => ["street_address"],
|
8
|
+
:address => "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
|
9
|
+
:coordinates => [37.4219720, -122.0841430],
|
10
|
+
:precision => "ROOFTOP"
|
11
|
+
)
|
12
|
+
|
13
|
+
result.types.should == [:street_address]
|
14
|
+
result.address.should == "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA"
|
15
|
+
result.coordinates.should == [37.4219720, -122.0841430]
|
16
|
+
result.precision.should == :rooftop
|
17
|
+
end
|
18
|
+
|
19
|
+
%w(types address coordinates precision).each do |missing_attr|
|
20
|
+
it "should raise an error when #{missing_attr} is missing" do
|
21
|
+
attrs = {
|
22
|
+
:types => ["street_address"],
|
23
|
+
:address => "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
|
24
|
+
:coordinates => [37.4219720, -122.0841430],
|
25
|
+
:precision => "ROOFTOP"
|
26
|
+
}
|
27
|
+
attrs.delete(missing_attr.to_sym)
|
28
|
+
lambda { Result.new(attrs) }.should raise_error(Errors::InvalidParametersError)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe "Full-stack geocoding (Integration test)" do
|
4
|
+
before :each do
|
5
|
+
@geocoder = GoogleGeocoding::Geocoder.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should return successful response with valida address" do
|
9
|
+
pending
|
10
|
+
response = @geocoder.query("2 Townsend St, San Francisco, CA")
|
11
|
+
response.status.should == :ok
|
12
|
+
response.should be_success
|
13
|
+
end
|
14
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_geocoding
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Rodrigo Kochenburger
|
@@ -9,49 +14,65 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-30 00:00:00 -07:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: json
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 2
|
30
|
+
- 0
|
23
31
|
version: 1.2.0
|
24
|
-
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: patron
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ">="
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 4
|
44
|
+
- 5
|
33
45
|
version: 0.4.5
|
34
|
-
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
35
48
|
- !ruby/object:Gem::Dependency
|
36
49
|
name: rspec
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
52
|
requirements:
|
41
53
|
- - ">="
|
42
54
|
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 1
|
57
|
+
- 2
|
58
|
+
- 9
|
43
59
|
version: 1.2.9
|
44
|
-
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
45
62
|
- !ruby/object:Gem::Dependency
|
46
63
|
name: yard
|
47
|
-
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
66
|
requirements:
|
51
67
|
- - ">="
|
52
68
|
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
- 5
|
72
|
+
- 3
|
53
73
|
version: 0.5.3
|
54
|
-
|
74
|
+
type: :development
|
75
|
+
version_requirements: *id004
|
55
76
|
description: GoogleGeocoding is a small library for performing geocoding using the Google's HTTP geocoding API
|
56
77
|
email: divoxx@gmail.com
|
57
78
|
executables: []
|
@@ -70,11 +91,16 @@ files:
|
|
70
91
|
- VERSION
|
71
92
|
- google_geocoding.gemspec
|
72
93
|
- lib/google_geocoding.rb
|
94
|
+
- lib/google_geocoding/address_component.rb
|
73
95
|
- lib/google_geocoding/errors.rb
|
74
96
|
- lib/google_geocoding/geocoder.rb
|
75
|
-
- lib/google_geocoding/
|
97
|
+
- lib/google_geocoding/request.rb
|
76
98
|
- lib/google_geocoding/response.rb
|
77
|
-
-
|
99
|
+
- lib/google_geocoding/result.rb
|
100
|
+
- spec/classes/request_spec.rb
|
101
|
+
- spec/classes/response_spec.rb
|
102
|
+
- spec/classes/result_spec.rb
|
103
|
+
- spec/integration_spec.rb
|
78
104
|
- spec/spec.opts
|
79
105
|
- spec/spec_helper.rb
|
80
106
|
has_rdoc: true
|
@@ -90,21 +116,26 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
90
116
|
requirements:
|
91
117
|
- - ">="
|
92
118
|
- !ruby/object:Gem::Version
|
119
|
+
segments:
|
120
|
+
- 0
|
93
121
|
version: "0"
|
94
|
-
version:
|
95
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
123
|
requirements:
|
97
124
|
- - ">="
|
98
125
|
- !ruby/object:Gem::Version
|
126
|
+
segments:
|
127
|
+
- 0
|
99
128
|
version: "0"
|
100
|
-
version:
|
101
129
|
requirements: []
|
102
130
|
|
103
131
|
rubyforge_project:
|
104
|
-
rubygems_version: 1.3.
|
132
|
+
rubygems_version: 1.3.6
|
105
133
|
signing_key:
|
106
134
|
specification_version: 3
|
107
135
|
summary: Google's geocoding library
|
108
136
|
test_files:
|
109
|
-
- spec/
|
137
|
+
- spec/classes/request_spec.rb
|
138
|
+
- spec/classes/response_spec.rb
|
139
|
+
- spec/classes/result_spec.rb
|
140
|
+
- spec/integration_spec.rb
|
110
141
|
- spec/spec_helper.rb
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module GoogleGeocoding
|
2
|
-
# Model that represents a placemark returned by the geocoding service.
|
3
|
-
class Placemark
|
4
|
-
# The level of accurracy for the placemark
|
5
|
-
# @see http://code.google.com/apis/maps/documentation/geocoding/index.html#GeocodingAccuracy
|
6
|
-
attr_accessor :accurracy
|
7
|
-
|
8
|
-
# The country name
|
9
|
-
attr_accessor :country_name
|
10
|
-
|
11
|
-
# The country ISO code
|
12
|
-
# @see http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm
|
13
|
-
attr_accessor :country_code
|
14
|
-
|
15
|
-
# The region/province/state
|
16
|
-
attr_accessor :region
|
17
|
-
|
18
|
-
# The city name
|
19
|
-
attr_accessor :city
|
20
|
-
|
21
|
-
# The postal/zip code
|
22
|
-
attr_accessor :postal_code
|
23
|
-
|
24
|
-
# The street address, including the number
|
25
|
-
attr_accessor :street
|
26
|
-
|
27
|
-
# An array with two positions: latitude and longitude
|
28
|
-
attr_accessor :coordinates
|
29
|
-
end
|
30
|
-
end
|