google_maps 0.1.1 → 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 CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.0
data/google_maps.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "google_maps"
8
- s.version = "0.1.1"
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 = ["Tushar Ranka"]
12
- s.date = "2012-05-11"
12
+ s.date = "2012-05-15"
13
13
  s.description = "General Purpose Library to interact with Google Maps v3 api. Geocoder. "
14
14
  s.email = "tusharranka@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
31
31
  "lib/google_maps/geocoder/location.rb",
32
32
  "lib/google_maps/geocoder/result.rb",
33
33
  "test/google_maps/geocoder_test.rb",
34
+ "test/google_maps_test.rb",
34
35
  "test/test_helper.rb"
35
36
  ]
36
37
  s.homepage = "http://github.com/appfolio/geocode"
@@ -3,7 +3,35 @@ module GoogleMaps
3
3
  class Location
4
4
 
5
5
  LOCATION_TYPES = [ "ROOFTOP", "RANGE_INTERPOLATED", "GEOMETRIC_CENTER", "APPROXIMATE"]
6
+ TYPES = [
7
+ "street_address", # indicates a precise street address.
8
+ "route", # indicates a named route (such as "US 101").
9
+ "intersection", # indicates a major intersection, usually of two major roads.
10
+ "political", # indicates a political entity. Usually, this type indicates a polygon of some civil administration.
11
+ "country", # indicates the national political entity, and is typically the highest order type returned by the Geocoder.
12
+ "administrative_area_level_1", # indicates a first-order civil entity below the country level. Within the United States, these administrative levels are states. Not all nations exhibit these administrative levels.
13
+ "administrative_area_level_2", # indicates a second-order civil entity below the country level. Within the United States, these administrative levels are counties. Not all nations exhibit these administrative levels.
14
+ "administrative_area_level_3", # indicates a third-order civil entity below the country level. This type indicates a minor civil division. Not all nations exhibit these administrative levels.
15
+ "colloquial_area", # indicates a commonly-used alternative name for the entity.
16
+ "locality", # indicates an incorporated city or town political entity.
17
+ "sublocality", # indicates an first-order civil entity below a locality
18
+ "neighborhood", # indicates a named neighborhood
19
+ "premise", # indicates a named location, usually a building or collection of buildings with a common name
20
+ "subpremise", # indicates a first-order entity below a named location, usually a singular building within a collection of buildings with a common name
21
+ "postal_code", # indicates a postal code as used to address postal mail within the country.
22
+ "natural_feature", # indicates a prominent natural feature.
23
+ "airport", # indicates an airport.
24
+ "park", # indicates a named park.
25
+ "point_of_interest", # indicates a named point of interest. Typically, these "POI"s are prominent local entities that don't easily fit in another category such as "Empire State Building" or "Statue of Liberty."
26
+ "post_box", # indicates a specific postal box.
27
+ "street_number", # indicates the precise street number.
28
+ "floor", # indicates the floor of a building address.
29
+ "room", # indicates the room of a building address.
30
+ ]
31
+
6
32
  ACCURATE_TYPES = [ "street_address", "premise", "subpremise" ]
33
+
34
+
7
35
 
8
36
  attr_accessor :formatted_address, :location_type, :latitude, :longitude, :types
9
37
 
@@ -2,26 +2,33 @@ require 'google_maps/geocoder/result'
2
2
  require 'google_maps/geocoder/location'
3
3
 
4
4
  module GoogleMaps
5
+ class GeocodeFailed < StandardError
6
+ def initialize(location, original_error)
7
+ super "Failed while geocoding '#{location}': #{original_error.class.name}: #{original_error.message}"
8
+ end
9
+ end
10
+
5
11
  module Geocoder
6
12
 
7
13
  URI_BASE = "maps.googleapis.com/maps/api/geocode/json"
8
14
 
9
15
  def self.locate!(address, options = { })
10
16
  options = {
11
- :ssl => false,
17
+ :ssl => false,
12
18
  :address => address,
13
- :sensor => false
19
+ :sensor => false
14
20
  }.merge(options)
15
21
 
16
22
  json = ActiveSupport::JSON.decode RestClient.get(url(options))
17
-
18
23
  Geocoder::Result.new(json)
24
+ rescue => e
25
+ raise GeocodeFailed.new(address, e)
19
26
  end
20
27
 
21
28
  def self.url(options)
22
29
  ssl = options.delete(:ssl)
23
30
 
24
- if !options[:clientId] && ::GoogleMaps.enterprise_account
31
+ if !options[:clientId] && ::GoogleMaps.enterprise_account?
25
32
  options.merge!(::GoogleMaps.geocoder_key_name => ::GoogleMaps.key)
26
33
  end
27
34
 
@@ -36,6 +43,5 @@ module GoogleMaps
36
43
  protocol = options[:ssl] ? "https" : "http"
37
44
  "#{protocol}://#{URI_BASE}"
38
45
  end
39
-
40
46
  end
41
47
  end
data/lib/google_maps.rb CHANGED
@@ -4,13 +4,38 @@ require 'active_support/all'
4
4
  require 'google_maps/geocoder'
5
5
 
6
6
  module GoogleMaps
7
- mattr_accessor :key, :enterprise_account
7
+ @@enterprise_account = false
8
+ @@key = nil
9
+
10
+ def self.configure(&block)
11
+ block.call(self)
12
+ end
13
+
14
+ def self.key(*args)
15
+ if args.present?
16
+ @@key = args.first
17
+ else
18
+ @@key
19
+ end
20
+ end
21
+
22
+ def self.use_enterprise_account(*args)
23
+ if args.first.present? && args.first == false
24
+ @@enterprise_account = false
25
+ else
26
+ @@enterprise_account = true
27
+ end
28
+ end
29
+
30
+ def self.enterprise_account?
31
+ @@enterprise_account || false
32
+ end
8
33
 
9
34
  def self.key_name
10
- enterprise_account ? "client" : "key"
35
+ enterprise_account? ? :client : :key
11
36
  end
12
37
 
13
38
  def self.geocoder_key_name
14
- "clientId" if enterprise_account
39
+ :clientId if enterprise_account?
15
40
  end
16
41
  end
@@ -1,5 +1,4 @@
1
1
  require 'test_helper'
2
- require 'mocha'
3
2
 
4
3
  class GoogleMaps::GeocoderTest < ActiveSupport::TestCase
5
4
 
@@ -44,8 +43,25 @@ class GoogleMaps::GeocoderTest < ActiveSupport::TestCase
44
43
  assert !manhattan_ny.location_type.rooftop?
45
44
  assert manhattan_ny.location_type.approximate?
46
45
  assert_equal ["sublocality", "political"], manhattan_ny.types
47
-
48
46
  end
47
+
48
+ def test_locate__error
49
+ error = StandardError.new("there was an error doing that")
50
+
51
+ GoogleMaps::Geocoder.expects(:url).returns(:url)
52
+ RestClient.expects(:get).with(:url).raises(error)
53
+ error_raised = false
54
+ begin
55
+ GoogleMaps::Geocoder.locate!("New York")
56
+ rescue => e
57
+ error_raised = true
58
+ assert e.is_a?(GoogleMaps::GeocodeFailed), e.class.name
59
+ assert_equal "Failed while geocoding 'New York': StandardError: there was an error doing that", e.message
60
+ end
61
+
62
+ assert error_raised
63
+ end
64
+
49
65
 
50
66
  def test_url_base_path
51
67
  assert_equal "http://#{GoogleMaps::Geocoder::URI_BASE}", GoogleMaps::Geocoder.uri_base_path
@@ -59,12 +75,10 @@ class GoogleMaps::GeocoderTest < ActiveSupport::TestCase
59
75
  end
60
76
 
61
77
  def test_url__with_client_id
62
- GoogleMaps.key = "bar"
63
- GoogleMaps.enterprise_account = true
78
+ GoogleMaps.key "bar"
79
+ GoogleMaps.use_enterprise_account
64
80
  assert_url_parts expected_url("address=A&sensor=false&clientId=foo"), GoogleMaps::Geocoder.url(ordered_hash(:sensor => false, :address => "A", :clientId => 'foo'))
65
81
  assert_url_parts expected_url("address=A&sensor=false&clientId=bar"), GoogleMaps::Geocoder.url(ordered_hash(:sensor => false, :address => "A"))
66
- #assert_equal expected_url("address=A&sensor=false&clientId=foo"), GoogleMaps::Geocoder.url(ordered_hash(:sensor => false, :address => "A", :clientId => 'foo'))
67
- #
68
82
  end
69
83
 
70
84
  private
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+
3
+ class GoogleMaps::GeocoderTest < ActiveSupport::TestCase
4
+ def test_configure__free_key
5
+ GoogleMaps.configure do |maps|
6
+ maps.key "foobar"
7
+ end
8
+
9
+ assert_equal "foobar", GoogleMaps.key
10
+ assert_equal false, GoogleMaps.enterprise_account?
11
+ assert_equal :key, GoogleMaps.key_name
12
+ assert_equal nil, GoogleMaps.geocoder_key_name
13
+ end
14
+
15
+ def test_configure__enterprise_key
16
+ GoogleMaps.configure do |maps|
17
+ maps.key "foobarenterprise"
18
+ maps.use_enterprise_account
19
+ end
20
+
21
+ assert_equal "foobarenterprise", GoogleMaps.key
22
+ assert GoogleMaps.enterprise_account?
23
+ assert_equal :client, GoogleMaps.key_name
24
+ assert_equal :clientId, GoogleMaps.geocoder_key_name
25
+ end
26
+
27
+
28
+ end
data/test/test_helper.rb CHANGED
@@ -15,14 +15,15 @@ require 'test/unit'
15
15
  $LOAD_PATH.unshift(File.dirname(__FILE__))
16
16
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
17
17
  require 'google_maps'
18
+ require 'mocha'
18
19
 
19
20
  class ActiveSupport::TestCase
20
21
 
21
22
  setup :clear_configuration
22
23
 
23
24
  def clear_configuration
24
- GoogleMaps.enterprise_account = nil
25
- GoogleMaps.key = nil
25
+ GoogleMaps.send :class_variable_set, :@@key, nil
26
+ GoogleMaps.send :class_variable_set, :@@enterprise_account, false
26
27
  end
27
28
 
28
29
  def castilian_json
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google_maps
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tushar Ranka
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-05-11 00:00:00 Z
18
+ date: 2012-05-15 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  type: :runtime
@@ -115,6 +115,7 @@ files:
115
115
  - lib/google_maps/geocoder/location.rb
116
116
  - lib/google_maps/geocoder/result.rb
117
117
  - test/google_maps/geocoder_test.rb
118
+ - test/google_maps_test.rb
118
119
  - test/test_helper.rb
119
120
  homepage: http://github.com/appfolio/geocode
120
121
  licenses: