rails-geocoder 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,12 @@
1
+ = Changelog
2
+
3
+ Per-release changes to Geocoder.
4
+
5
+ == 0.8.1 (2009 Oct 8)
6
+
7
+ * Extract XML-fetching code from Geocoder.search and place in Geocoder._fetch_xml (for ease of mocking).
8
+ * Add tests for coordinate-fetching instance methods.
9
+
10
+ == 0.8.0 (2009 Oct 1)
11
+
12
+ First release.
data/README.rdoc CHANGED
@@ -1,14 +1,14 @@
1
1
  = Geocoder
2
2
 
3
- Geocoder adds database-agnostic object geocoding to Rails (via Google). It does not rely on proprietary database functions so reasonably accurate distances can be calculated in MySQL or even SQLite.
3
+ Geocoder adds object geocoding and database-agnostic distance calculations to Ruby on Rails. It does not rely on proprietary database functions so finding geocoded objects in a given area is easily done using out-of-the-box MySQL or even SQLite.
4
4
 
5
- == Setup
5
+ == Install
6
6
 
7
- Install either *as a plugin*:
7
+ Install either as a plugin:
8
8
 
9
9
  script/plugin install git://github.com/alexreisner/geocoder.git
10
10
 
11
- or *as a gem*:
11
+ or as a gem:
12
12
 
13
13
  # add to config/environment.rb:
14
14
  config.gem "rails-geocoder", :lib => "geocoder", :source => "http://gemcutter.org/"
@@ -16,6 +16,8 @@ or *as a gem*:
16
16
  # at command prompt:
17
17
  sudo rake gems:install
18
18
 
19
+ == Configure
20
+
19
21
  To add geocoding features to a class:
20
22
 
21
23
  geocoded_by :location
@@ -36,8 +38,7 @@ If your model has +address+, +city+, +state+, and +country+ attributes your +loc
36
38
  [address, city, state, country].compact.join(', ')
37
39
  end
38
40
 
39
-
40
- == Features
41
+ == Use
41
42
 
42
43
  Assuming +Venue+ is a geocoded model:
43
44
 
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ begin
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "rails-geocoder"
8
8
  gem.summary = %Q{Add geocoding functionality to Rails models.}
9
- gem.description = %Q{Add geocoding functionality to Rails models.}
9
+ gem.description = %Q{Geocoder adds object geocoding and database-agnostic distance calculations to Ruby on Rails. It does not rely on proprietary database functions so finding geocoded objects in a given area is easily done using out-of-the-box MySQL or even SQLite.}
10
10
  gem.email = "alex@alexreisner.com"
11
11
  gem.homepage = "http://github.com/alexreisner/geocoder"
12
12
  gem.authors = ["Alex Reisner"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.8.1
data/lib/geocoder.rb CHANGED
@@ -210,7 +210,21 @@ module Geocoder
210
210
  # Returns the XML response as a hash. This method is not intended for
211
211
  # general use (prefer Geocoder.search).
212
212
  #
213
+ # Google's XML document has incorrect encoding (says UTF-8 but is actually
214
+ # ISO 8859-1). We have to fix this or REXML won't parse it correctly.
215
+ # This may be fixed in the future; see the bug report at:
216
+ # http://code.google.com/p/gmaps-api-issues/issues/detail?id=233
217
+ #
213
218
  def self.search(query)
219
+ if doc = _fetch_xml(query)
220
+ REXML::Document.new(doc.sub('UTF-8', 'ISO-8859-1'))
221
+ end
222
+ end
223
+
224
+ ##
225
+ # Request an XML geo search result from Google.
226
+ #
227
+ def self._fetch_xml(query)
214
228
  params = { :q => query, :output => "xml" }
215
229
  url = "http://maps.google.com/maps/geo?" + params.to_query
216
230
 
@@ -218,19 +232,11 @@ module Geocoder
218
232
  begin
219
233
  resp = nil
220
234
  timeout(3) do
221
- resp = Net::HTTP.get_response(URI.parse(url))
235
+ Net::HTTP.get_response(URI.parse(url)).body
222
236
  end
223
237
  rescue SocketError, TimeoutError
224
238
  return nil
225
239
  end
226
-
227
- # Google's XML document has incorrect encoding (says UTF-8 but is actually
228
- # ISO 8859-1). Have to fix this or REXML won't parse correctly.
229
- # This may be fixed in the future; see the bug report at:
230
- # http://code.google.com/p/gmaps-api-issues/issues/detail?id=233
231
- doc = resp.body.sub('UTF-8', 'ISO-8859-1')
232
-
233
- REXML::Document.new(doc)
234
240
  end
235
241
  end
236
242
 
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rails-geocoder}
8
- s.version = "0.8.0"
8
+ s.version = "0.8.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alex Reisner"]
12
- s.date = %q{2009-10-01}
13
- s.description = %q{Add geocoding functionality to Rails models.}
12
+ s.date = %q{2009-10-08}
13
+ s.description = %q{Geocoder adds object geocoding and database-agnostic distance calculations to Ruby on Rails. It does not rely on proprietary database functions so finding geocoded objects in a given area is easily done using out-of-the-box MySQL or even SQLite.}
14
14
  s.email = %q{alex@alexreisner.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  ".gitignore",
22
+ "CHANGELOG.rdoc",
22
23
  "LICENSE",
23
24
  "README.rdoc",
24
25
  "Rakefile",
@@ -26,6 +27,7 @@ Gem::Specification.new do |s|
26
27
  "init.rb",
27
28
  "lib/geocoder.rb",
28
29
  "rails-geocoder.gemspec",
30
+ "test/fixtures/madison_square_garden.xml",
29
31
  "test/geocoder_test.rb",
30
32
  "test/test_helper.rb"
31
33
  ]
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <kml xmlns="http://earth.google.com/kml/2.0"><Response>
3
+ <name>4 Penn Plaza, New York, NY</name>
4
+ <Status>
5
+ <code>200</code>
6
+ <request>geocode</request>
7
+ </Status>
8
+ <Placemark id="p1">
9
+ <address>4 Penn Plaza, New York, NY 10001, USA</address>
10
+ <AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>US</CountryNameCode><CountryName>USA</CountryName><AdministrativeArea><AdministrativeAreaName>NY</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>New York</SubAdministrativeAreaName><Locality><LocalityName>New York</LocalityName><Thoroughfare><ThoroughfareName>4 Penn Plaza</ThoroughfareName></Thoroughfare><PostalCode><PostalCodeNumber>10001</PostalCodeNumber></PostalCode></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails>
11
+ <ExtendedData>
12
+ <LatLonBox north="40.7527158" south="40.7464206" east="-73.9885076" west="-73.9948028" />
13
+ </ExtendedData>
14
+ <Point><coordinates>-73.9916733,40.7495760,0</coordinates></Point>
15
+ </Placemark>
16
+ </Response></kml>
@@ -1,8 +1,15 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class GeocoderTest < Test::Unit::TestCase
4
- # Replace this with your real tests.
5
- def test_this_plugin
6
- flunk
4
+
5
+ def test_fetch_coordinates
6
+ v = Venue.new(*venue_params(:msg))
7
+ assert_equal [40.7495760, -73.9916733], v.fetch_coordinates
8
+ end
9
+
10
+ def test_fetch_coordinates!
11
+ v = Venue.new(*venue_params(:msg))
12
+ v.fetch_coordinates!
13
+ assert_equal [40.7495760, -73.9916733], [v.latitude, v.longitude]
7
14
  end
8
15
  end
data/test/test_helper.rb CHANGED
@@ -1,9 +1,68 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
+ require 'activesupport'
3
4
 
4
5
  $LOAD_PATH.unshift(File.dirname(__FILE__))
5
6
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+
8
+ ##
9
+ # Simulate enough of ActiveRecord::Base that objects can be used for testing.
10
+ #
11
+ module ActiveRecord
12
+ class Base
13
+
14
+ def initialize
15
+ @attributes = {}
16
+ end
17
+
18
+ def read_attribute(attr_name)
19
+ @attributes[attr_name.to_s]
20
+ end
21
+
22
+ def write_attribute(attr_name, value)
23
+ attr_name = attr_name.to_s
24
+ @attributes[attr_name] = value
25
+ end
26
+
27
+ def self.named_scope(*args); end
28
+ end
29
+ end
30
+
31
+ # Require Geocoder after ActiveRecord simulator.
6
32
  require 'geocoder'
7
33
 
34
+ ##
35
+ # Mock HTTP request to Google.
36
+ #
37
+ module Geocoder
38
+ def self._fetch_xml(query)
39
+ filename = File.join("test", "fixtures", "madison_square_garden.xml")
40
+ File.read(filename)
41
+ end
42
+ end
43
+
44
+ ##
45
+ # Geocoded model.
46
+ #
47
+ class Venue < ActiveRecord::Base
48
+ geocoded_by :address
49
+
50
+ def initialize(name, address)
51
+ super()
52
+ write_attribute :name, name
53
+ write_attribute :address, address
54
+ end
55
+
56
+ # could implement these with method_missing
57
+ # to simulate custom lat/lon methods
58
+ def latitude; read_attribute(:latitude); end
59
+ def longitude; read_attribute(:longitude); end
60
+ end
61
+
8
62
  class Test::Unit::TestCase
63
+ def venue_params(abbrev)
64
+ {
65
+ :msg => ["Madison Square Garden", "4 Penn Plaza, New York, NY"]
66
+ }[abbrev]
67
+ end
9
68
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-geocoder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Reisner
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-01 00:00:00 -04:00
12
+ date: 2009-10-08 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: Add geocoding functionality to Rails models.
16
+ description: Geocoder adds object geocoding and database-agnostic distance calculations to Ruby on Rails. It does not rely on proprietary database functions so finding geocoded objects in a given area is easily done using out-of-the-box MySQL or even SQLite.
17
17
  email: alex@alexreisner.com
18
18
  executables: []
19
19
 
@@ -25,6 +25,7 @@ extra_rdoc_files:
25
25
  files:
26
26
  - .document
27
27
  - .gitignore
28
+ - CHANGELOG.rdoc
28
29
  - LICENSE
29
30
  - README.rdoc
30
31
  - Rakefile
@@ -32,6 +33,7 @@ files:
32
33
  - init.rb
33
34
  - lib/geocoder.rb
34
35
  - rails-geocoder.gemspec
36
+ - test/fixtures/madison_square_garden.xml
35
37
  - test/geocoder_test.rb
36
38
  - test/test_helper.rb
37
39
  has_rdoc: true