geogle 0.2.2 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +62 -17
- data/geogle.gemspec +0 -1
- data/lib/geogle/base.rb +4 -3
- data/lib/geogle/url_builder.rb +1 -1
- data/lib/geogle/version.rb +1 -1
- data/spec/fixtures/cassettes/geocode_by_address_DE.yml +99 -0
- data/spec/fixtures/cassettes/geocode_by_latlng_invalid_business.yml +50 -0
- data/spec/geogle/{client_spec.rb → geocoder_spec.rb} +25 -0
- data/spec/geogle/url_builder_spec.rb +3 -2
- metadata +8 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f470b89b70dfc743b33fa0acc1efd0da3bfebc84
|
4
|
+
data.tar.gz: 059ef9de83990d21fb60370b919c36354883b398
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 252efd684801b8f1398f35f1e4fa49b080cc4c67c1f3b8904e4761d1f5e3dc64f67e29983e70e2270dd45015436ba0655e8c69aee09727d4fd960631263ae634
|
7
|
+
data.tar.gz: 6df63d56ec93a7415ce1bcab5d8839ae9b5a4ca621197269d90902aa7ae3c1ec941b51193dbe7471fc5ae7974f3602d929e5f090bf26685626ce9b4084fed2b6
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
# Geogle
|
2
2
|
|
3
|
-
|
3
|
+
Still in development!
|
4
4
|
|
5
|
-
|
5
|
+
[![wercker status](https://app.wercker.com/status/6122e4f0966ee255949e2eb465aefd10/m "wercker status")](https://app.wercker.com/project/bykey/6122e4f0966ee255949e2eb465aefd10)
|
6
6
|
|
7
|
-
|
8
|
-
Documentation
|
9
|
-
https://developers.google.com/maps/documentation/geocoding/
|
7
|
+
Ruby wrapper for the Geocoding and Directions services provided from the Google Maps API.
|
10
8
|
|
11
9
|
|
12
10
|
## Installation
|
@@ -25,39 +23,86 @@ Or install it yourself as:
|
|
25
23
|
|
26
24
|
## Usage
|
27
25
|
|
28
|
-
|
26
|
+
### Geocoding
|
27
|
+
Google geocoding documentation:
|
28
|
+
https://developers.google.com/maps/documentation/geocoding/
|
29
|
+
|
30
|
+
When creating the Geogle::Geocoder instance you can pass:
|
29
31
|
|
30
|
-
* sensor
|
31
|
-
* language
|
32
|
+
* **sensor**: true or false (false by default)
|
33
|
+
* **language**: ("en" by default).
|
32
34
|
|
33
35
|
In case you wanna use Google Maps API for Business, you'll need to pass the following attributes in order to sign the URL.
|
34
|
-
* client_id
|
35
|
-
* crypto_key
|
36
|
+
* **client_id**: ID of the client. It starts with "gme-" prefix.
|
37
|
+
* **crypto_key**: Criptographic key.
|
36
38
|
|
37
39
|
Here's more information about Google Maps API for Business:
|
38
40
|
https://developers.google.com/maps/documentation/business/webservices
|
39
41
|
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
There are two methods that can be called:
|
43
|
+
* **address**: Geocoding by name of the location.
|
44
|
+
* **latlng**: Reverse geocode.
|
45
|
+
|
46
|
+
Both methods return an array of Geogle::Model::Place. Each place is composed by:
|
47
|
+
* **geometry**:
|
48
|
+
* **location**:
|
49
|
+
* **lat**: Float
|
50
|
+
* **lng**: Float
|
51
|
+
* **location_type**: String
|
52
|
+
* **bounds**:
|
53
|
+
* **northeast**:
|
54
|
+
* **lat**: Float
|
55
|
+
* **lng**: Float
|
56
|
+
* **southwest**:
|
57
|
+
* **lat**: Float
|
58
|
+
* **lng**: Float
|
59
|
+
* **viewport**:
|
60
|
+
* **northeast**:
|
61
|
+
* **lat**: Float
|
62
|
+
* **lng**: Float
|
63
|
+
* **southwest**:
|
64
|
+
* **lat**: Float
|
65
|
+
* **lng**: Float
|
66
|
+
* **address**:
|
67
|
+
* **street_number**: String
|
68
|
+
* **street**: String
|
69
|
+
* **locality**: String
|
70
|
+
* **area_level_1**: String
|
71
|
+
* **area_level_1_code**: String
|
72
|
+
* **area_level_2**: String
|
73
|
+
* **area_level_2_code**: String
|
74
|
+
* **country**: String
|
75
|
+
* **country_code**: String
|
76
|
+
* **formatted**: String
|
77
|
+
|
78
|
+
### By address without an account
|
79
|
+
|
80
|
+
$ client = Geogle::Geocoder.new({ sensor: false, language: "es" })
|
43
81
|
$ client.address("Blasco Ibañez, Valencia")
|
44
82
|
|
45
|
-
###
|
83
|
+
### By address making use of the components
|
46
84
|
|
47
|
-
$ client = Geogle::
|
85
|
+
$ client = Geogle::Geocoder.new({ sensor: false, language: "es" })
|
48
86
|
$ components = { country: 'ES' }
|
49
87
|
$ client.address("Blasco Ibañez, Valencia", components)
|
50
88
|
|
51
89
|
Available components to be used can be found here:
|
52
90
|
https://developers.google.com/maps/documentation/geocoding/#ComponentFiltering
|
53
91
|
|
92
|
+
### Reverse geocoding (by latitude and longitude)
|
93
|
+
|
94
|
+
$ Geogle::Geocoder.new.latlng(39.5073225, -0.2914778)
|
95
|
+
|
54
96
|
### Using a business account
|
55
97
|
|
56
|
-
$ client = Geogle::
|
57
|
-
$
|
98
|
+
$ client = Geogle::Geocoder.new({ client_id: "gme-client-id", crypto_key: "crypto-key" })
|
99
|
+
$ client.latlng(39.5073225, -0.2914778)
|
58
100
|
|
59
101
|
The signature required to do the request will be included in the URL.
|
60
102
|
|
103
|
+
### Directions
|
104
|
+
Directions service is still in development
|
105
|
+
|
61
106
|
|
62
107
|
## Contributing
|
63
108
|
|
data/geogle.gemspec
CHANGED
data/lib/geogle/base.rb
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require "faraday"
|
4
3
|
require "json"
|
4
|
+
require "net/http"
|
5
5
|
|
6
6
|
module Geogle
|
7
7
|
class Base
|
8
8
|
def initialize(args = {})
|
9
9
|
@args = args
|
10
10
|
@parametizer = Parametizer.new(args)
|
11
|
-
@conn = Faraday.new
|
12
11
|
end
|
13
12
|
|
14
13
|
protected
|
15
14
|
|
16
15
|
def request(url, params)
|
17
|
-
|
16
|
+
uri = UrlBuilder.new(url, @args).build(params)
|
17
|
+
response = Net::HTTP.get_response(uri)
|
18
|
+
raise InvalidKeyError if response.code == "403"
|
18
19
|
body = JSON.parse(response.body)
|
19
20
|
ErrorHandler.check(body['status'])
|
20
21
|
body
|
data/lib/geogle/url_builder.rb
CHANGED
@@ -33,7 +33,7 @@ module Geogle
|
|
33
33
|
|
34
34
|
# encode the signature into base64 for url use form.
|
35
35
|
signature = url_safe_base64_encode(raw_signature)
|
36
|
-
"#{url.scheme}://#{url.host}#{url_to_sign}&signature=#{signature}"
|
36
|
+
URI("#{url.scheme}://#{url.host}#{url_to_sign}&signature=#{signature}")
|
37
37
|
end
|
38
38
|
|
39
39
|
def url_safe_base64_decode(base64_string)
|
data/lib/geogle/version.rb
CHANGED
@@ -0,0 +1,99 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://maps.googleapis.com/maps/api/geocode/json?address=Berlin&components=country:DE&language=de&sensor=false
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.0
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Content-Type:
|
22
|
+
- application/json; charset=UTF-8
|
23
|
+
Date:
|
24
|
+
- Thu, 28 Aug 2014 08:52:39 GMT
|
25
|
+
Expires:
|
26
|
+
- Fri, 29 Aug 2014 08:52:39 GMT
|
27
|
+
Cache-Control:
|
28
|
+
- public, max-age=86400
|
29
|
+
Access-Control-Allow-Origin:
|
30
|
+
- "*"
|
31
|
+
Server:
|
32
|
+
- mafe
|
33
|
+
X-Xss-Protection:
|
34
|
+
- 1; mode=block
|
35
|
+
X-Frame-Options:
|
36
|
+
- SAMEORIGIN
|
37
|
+
Alternate-Protocol:
|
38
|
+
- 443:quic
|
39
|
+
Transfer-Encoding:
|
40
|
+
- chunked
|
41
|
+
body:
|
42
|
+
encoding: UTF-8
|
43
|
+
string: |
|
44
|
+
{
|
45
|
+
"results" : [
|
46
|
+
{
|
47
|
+
"address_components" : [
|
48
|
+
{
|
49
|
+
"long_name" : "Berlin",
|
50
|
+
"short_name" : "Berlin",
|
51
|
+
"types" : [ "locality", "political" ]
|
52
|
+
},
|
53
|
+
{
|
54
|
+
"long_name" : "Berlin",
|
55
|
+
"short_name" : "Berlin",
|
56
|
+
"types" : [ "administrative_area_level_1", "political" ]
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"long_name" : "Deutschland",
|
60
|
+
"short_name" : "DE",
|
61
|
+
"types" : [ "country", "political" ]
|
62
|
+
}
|
63
|
+
],
|
64
|
+
"formatted_address" : "Berlin, Deutschland",
|
65
|
+
"geometry" : {
|
66
|
+
"bounds" : {
|
67
|
+
"northeast" : {
|
68
|
+
"lat" : 52.6754542,
|
69
|
+
"lng" : 13.7611176
|
70
|
+
},
|
71
|
+
"southwest" : {
|
72
|
+
"lat" : 52.33962959999999,
|
73
|
+
"lng" : 13.0911663
|
74
|
+
}
|
75
|
+
},
|
76
|
+
"location" : {
|
77
|
+
"lat" : 52.52000659999999,
|
78
|
+
"lng" : 13.404954
|
79
|
+
},
|
80
|
+
"location_type" : "APPROXIMATE",
|
81
|
+
"viewport" : {
|
82
|
+
"northeast" : {
|
83
|
+
"lat" : 52.6754542,
|
84
|
+
"lng" : 13.7611176
|
85
|
+
},
|
86
|
+
"southwest" : {
|
87
|
+
"lat" : 52.33962959999999,
|
88
|
+
"lng" : 13.0911663
|
89
|
+
}
|
90
|
+
}
|
91
|
+
},
|
92
|
+
"types" : [ "locality", "political" ]
|
93
|
+
}
|
94
|
+
],
|
95
|
+
"status" : "OK"
|
96
|
+
}
|
97
|
+
http_version:
|
98
|
+
recorded_at: Thu, 28 Aug 2014 08:52:39 GMT
|
99
|
+
recorded_with: VCR 2.8.0
|
@@ -0,0 +1,50 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://maps.googleapis.com/maps/api/geocode/json?client=gme-foo&language=en&latlng=39.4699075,-0.3762881&sensor=false&signature=hDQSukmnhjyDe6y81ph3C_tbs_M=
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.0
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 403
|
19
|
+
message: Forbidden
|
20
|
+
headers:
|
21
|
+
Content-Type:
|
22
|
+
- text/plain; charset=UTF-8
|
23
|
+
Date:
|
24
|
+
- Thu, 28 Aug 2014 12:31:17 GMT
|
25
|
+
Pragma:
|
26
|
+
- no-cache
|
27
|
+
Expires:
|
28
|
+
- Fri, 01 Jan 1990 00:00:00 GMT
|
29
|
+
Cache-Control:
|
30
|
+
- no-cache, must-revalidate
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- "*"
|
33
|
+
Server:
|
34
|
+
- mafe
|
35
|
+
X-Xss-Protection:
|
36
|
+
- 1; mode=block
|
37
|
+
X-Frame-Options:
|
38
|
+
- SAMEORIGIN
|
39
|
+
Alternate-Protocol:
|
40
|
+
- 443:quic
|
41
|
+
Transfer-Encoding:
|
42
|
+
- chunked
|
43
|
+
body:
|
44
|
+
encoding: UTF-8
|
45
|
+
string: 'Unable to authenticate the request. Provided ''signature'' is not valid
|
46
|
+
for the provided client ID, or the provided ''client'' is not valid. Learn
|
47
|
+
more: https://developers.google.com/maps/documentation/business/webservices/auth'
|
48
|
+
http_version:
|
49
|
+
recorded_at: Thu, 28 Aug 2014 12:31:17 GMT
|
50
|
+
recorded_with: VCR 2.8.0
|
@@ -11,6 +11,18 @@ describe Geogle::Geocoder do
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
describe 'searching with a non-default locale' do
|
15
|
+
let(:places) do
|
16
|
+
VCR.use_cassette('geocode_by_address_DE') do
|
17
|
+
described_class.new(language: "de").address('Berlin', { country: 'DE' })
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns an array" do
|
22
|
+
expect(places).to be_kind_of(Array)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
describe 'searching by latlng' do
|
15
27
|
let(:places) do
|
16
28
|
VCR.use_cassette('geocode_by_latlng') do
|
@@ -32,4 +44,17 @@ describe Geogle::Geocoder do
|
|
32
44
|
end
|
33
45
|
end
|
34
46
|
end
|
47
|
+
|
48
|
+
describe "when using non-valid business credentials" do
|
49
|
+
let(:places) do
|
50
|
+
VCR.use_cassette('geocode_by_latlng_invalid_business') do
|
51
|
+
geocoder = described_class.new(client_id: "gme-foo", crypto_key: "bar")
|
52
|
+
geocoder.latlng(39.4699075, -0.3762881)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it "an exception InvalidKeyError is raised" do
|
57
|
+
expect{ places }.to raise_error(Geogle::InvalidKeyError)
|
58
|
+
end
|
59
|
+
end
|
35
60
|
end
|
@@ -4,6 +4,7 @@ describe Geogle::UrlBuilder do
|
|
4
4
|
let(:params) do
|
5
5
|
{
|
6
6
|
address: "Street FooBar",
|
7
|
+
language: "de",
|
7
8
|
sensor: true
|
8
9
|
}
|
9
10
|
end
|
@@ -13,7 +14,7 @@ describe Geogle::UrlBuilder do
|
|
13
14
|
let(:business_attrs) { {} }
|
14
15
|
|
15
16
|
it "the built url doesn't contain a query param signature" do
|
16
|
-
expect(built_url.to_s).to eq("https://www.foo.com?address=Street+FooBar&sensor=true")
|
17
|
+
expect(built_url.to_s).to eq("https://www.foo.com?address=Street+FooBar&language=de&sensor=true")
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
@@ -26,7 +27,7 @@ describe Geogle::UrlBuilder do
|
|
26
27
|
end
|
27
28
|
|
28
29
|
it "the built url contains a query param signature" do
|
29
|
-
expect(built_url).to eq("https://www.foo.com?client=gme-clientid&address=Street+FooBar&sensor=true&signature=
|
30
|
+
expect(built_url.to_s).to eq("https://www.foo.com?client=gme-clientid&address=Street+FooBar&language=de&sensor=true&signature=1klekRivPNXr3vOpOixX16LNGuI=")
|
30
31
|
end
|
31
32
|
end
|
32
33
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geogle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yone_lc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: faraday
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: virtus
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -183,8 +169,10 @@ files:
|
|
183
169
|
- lib/geogle/url_builder.rb
|
184
170
|
- lib/geogle/version.rb
|
185
171
|
- spec/fixtures/cassettes/geocode_by_address.yml
|
172
|
+
- spec/fixtures/cassettes/geocode_by_address_DE.yml
|
186
173
|
- spec/fixtures/cassettes/geocode_by_latlng.yml
|
187
|
-
- spec/
|
174
|
+
- spec/fixtures/cassettes/geocode_by_latlng_invalid_business.yml
|
175
|
+
- spec/geogle/geocoder_spec.rb
|
188
176
|
- spec/geogle/parser_spec.rb
|
189
177
|
- spec/geogle/url_builder_spec.rb
|
190
178
|
- spec/spec_helper.rb
|
@@ -216,8 +204,10 @@ summary: Provides a Ruby interface to geocode requests to Google Maps API V3 and
|
|
216
204
|
the response
|
217
205
|
test_files:
|
218
206
|
- spec/fixtures/cassettes/geocode_by_address.yml
|
207
|
+
- spec/fixtures/cassettes/geocode_by_address_DE.yml
|
219
208
|
- spec/fixtures/cassettes/geocode_by_latlng.yml
|
220
|
-
- spec/
|
209
|
+
- spec/fixtures/cassettes/geocode_by_latlng_invalid_business.yml
|
210
|
+
- spec/geogle/geocoder_spec.rb
|
221
211
|
- spec/geogle/parser_spec.rb
|
222
212
|
- spec/geogle/url_builder_spec.rb
|
223
213
|
- spec/spec_helper.rb
|