yahoo-geocode 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ Copyright 2006 Eric Hodel, The Robot Co-op. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright
10
+ notice, this list of conditions and the following disclaimer in the
11
+ documentation and/or other materials provided with the distribution.
12
+ 3. Neither the names of the authors nor the names of their contributors
13
+ may be used to endorse or promote products derived from this software
14
+ without specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
17
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
20
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
22
+ OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
@@ -0,0 +1,6 @@
1
+ LICENSE
2
+ Manifest.txt
3
+ README
4
+ Rakefile
5
+ lib/yahoo/geocode.rb
6
+ test/test_geocode.rb
data/README ADDED
@@ -0,0 +1,35 @@
1
+ = yahoo-geocode
2
+
3
+ Rubyforge Project:
4
+
5
+ http://rubyforge.org/projects/rctools/
6
+
7
+ Documentation:
8
+
9
+ http://dev.robotcoop.com/Libraries/yahoo-geocode/
10
+
11
+ == About
12
+
13
+ yahoo-geocode implements version 1 of Yahoo's Maps Web Services Geocoding API.
14
+
15
+ == Installing yahoo-geocode
16
+
17
+ Just install the gem:
18
+
19
+ $ sudo gem install yahoo-geocode
20
+
21
+ == Using yahoo-geocode
22
+
23
+ First you'll need a Yahoo Application ID. You can register for one here:
24
+
25
+ http://api.search.yahoo.com/webservices/register_application
26
+
27
+ Then you create a Yahoo::Geocode object and start locating addresses:
28
+
29
+ require 'rubygems'
30
+ require 'yahoo/geocode'
31
+
32
+ yg = Yahoo::Geocode.new application_id
33
+ locations = yg.locate '701 First Street, Sunnyvale, CA'
34
+ p location.first.coordinates
35
+
@@ -0,0 +1,73 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/rdoctask'
5
+ require 'rake/gempackagetask'
6
+
7
+ $VERBOSE = nil
8
+
9
+ spec = Gem::Specification.new do |s|
10
+ s.name = 'yahoo-geocode'
11
+ s.version = '1.0.0'
12
+ s.summary = 'A Ruby Yahoo Geocoder Library'
13
+ s.description = 'An interface to Yahoo\'s Geocoder service.
14
+
15
+ http://developer.yahoo.com/maps/rest/V1/geocode.html'
16
+
17
+ s.author = 'Eric Hodel'
18
+ s.email = 'eric@robotcoop.com'
19
+
20
+ s.has_rdoc = true
21
+ s.files = File.read('Manifest.txt').split($/)
22
+ s.require_path = 'lib'
23
+
24
+ s.add_dependency 'yahoo', '1.0.0'
25
+ end
26
+
27
+ desc 'Run tests'
28
+ task :default => [ :test ]
29
+
30
+ Rake::TestTask.new('test') do |t|
31
+ t.libs << 'test'
32
+ t.libs << '../yahoo'
33
+ t.libs << '../yahoo/lib'
34
+ t.pattern = 'test/test_*.rb'
35
+ t.verbose = true
36
+ end
37
+
38
+ desc 'Update Manifest.txt'
39
+ task :update_manifest do
40
+ sh "find . -type f | sed -e 's%./%%' | egrep -v 'svn|swp|~' | egrep -v '^(doc|pkg)/' | sort > Manifest.txt"
41
+ end
42
+
43
+ desc 'Generate RDoc'
44
+ Rake::RDocTask.new :rdoc do |rd|
45
+ rd.rdoc_dir = 'doc'
46
+ rd.rdoc_files.add 'lib', 'README', 'LICENSE'
47
+ rd.main = 'README'
48
+ rd.options << '-d' if `which dot` =~ /\/dot/
49
+ rd.options << '-t Yahoo Maps Web Services Geocoding API'
50
+ end
51
+
52
+ desc 'Generate RDoc for dev.robotcoop.com'
53
+ Rake::RDocTask.new :dev_rdoc do |rd|
54
+ rd.rdoc_dir = '../../../www/trunk/dev/html/Libraries/yahoo-geocode'
55
+ rd.rdoc_files.add 'lib', 'README', 'LICENSE'
56
+ rd.main = 'README'
57
+ rd.options << '-d' if `which dot` =~ /\/dot/
58
+ rd.options << '-t Yahoo Maps Web Services Geocoding API'
59
+ end
60
+
61
+ desc 'Build Gem'
62
+ Rake::GemPackageTask.new spec do |pkg|
63
+ pkg.need_tar = true
64
+ end
65
+
66
+ desc 'Clean up'
67
+ task :clean => [ :clobber_rdoc, :clobber_package ]
68
+
69
+ desc 'Clean up'
70
+ task :clobber => [ :clean ]
71
+
72
+ # vim: syntax=Ruby
73
+
@@ -0,0 +1,103 @@
1
+ require 'yahoo'
2
+
3
+ ##
4
+ # Yahoo geocoding API.
5
+ #
6
+ # http://developer.yahoo.com/maps/rest/V1/geocode.html
7
+
8
+ class Yahoo::Geocode < Yahoo
9
+
10
+ ##
11
+ # Location result Struct.
12
+
13
+ Location = Struct.new :latitude, :longitude, :address, :city, :state, :zip,
14
+ :country, :precision, :warning
15
+
16
+ def initialize(*args) # :nodoc:
17
+ @host = 'api.local.yahoo.com'
18
+ @service_name = 'MapsService'
19
+ @version = 'V1'
20
+ @method = 'geocode'
21
+ super
22
+ end
23
+
24
+ ##
25
+ # Returns a Location for +address+.
26
+ #
27
+ # The +address+ can be any of:
28
+ # * city, state
29
+ # * city, state, zip
30
+ # * zip
31
+ # * street, city, state
32
+ # * street, city, state, zip
33
+ # * street, zip
34
+
35
+ def locate(address)
36
+ get :location => address
37
+ end
38
+
39
+ def parse_response(xml) # :nodoc:
40
+ addresses = []
41
+
42
+ xml.elements['ResultSet'].each do |r|
43
+ address = Location.new
44
+
45
+ address.precision = r.attributes['precision']
46
+
47
+ if r.attributes.include? 'warning' then
48
+ address.warning = r.attributes['warning']
49
+ end
50
+
51
+ address.latitude = r.elements['Latitude'].text.to_f
52
+ address.longitude = r.elements['Longitude'].text.to_f
53
+
54
+ address.address = r.elements['Address'].text
55
+ address.city = r.elements['City'].text
56
+ address.state = r.elements['State'].text
57
+ address.zip = r.elements['Zip'].text
58
+ address.country = r.elements['Country'].text
59
+
60
+ addresses << address
61
+ end
62
+
63
+ return addresses
64
+ end
65
+
66
+ end
67
+
68
+ ##
69
+ # A Location contains the following fields:
70
+ #
71
+ # +latitude+:: Latitude of the location
72
+ # +longitude+:: Longitude of the location
73
+ # +address+:: Street address of the result, if a specific location could be
74
+ # determined
75
+ # +city+:: City in which the result is located
76
+ # +state+:: State in which the result is located
77
+ # +zip+:: Zip code, if known
78
+ # +country+:: Country in which the result is located
79
+ # +precision+:: The precision of the address used for geocoding
80
+ # +warning+:: If the exact address was not found, the closest available match
81
+ #
82
+ # Precision can be one of the following, from most specific to most general:
83
+ #
84
+ # * address
85
+ # * street
86
+ # * zip+4
87
+ # * zip+2
88
+ # * zip
89
+ # * city
90
+ # * state
91
+ # * country
92
+
93
+ class Yahoo::Geocode::Location
94
+
95
+ ##
96
+ # Returns an Array with latitude and longitude.
97
+
98
+ def coordinates
99
+ [latitude, longitude]
100
+ end
101
+
102
+ end
103
+
@@ -0,0 +1,61 @@
1
+ require 'test/unit'
2
+ require 'test/uri_stub'
3
+ require 'yahoo/geocode'
4
+
5
+ class Yahoo::TestGeocode < Test::Unit::TestCase
6
+
7
+ def setup
8
+ URI::HTTP.responses = []
9
+ URI::HTTP.uris = []
10
+
11
+ @g = Yahoo::Geocode.new 'APP_ID'
12
+ @location = '701 First Street, Sunnyvale, CA'
13
+ end
14
+
15
+ def test_locate
16
+ URI::HTTP.responses << <<-EOF.strip
17
+ <?xml version="1.0"?>
18
+ <ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:maps" xsi:schemaLocation="urn:yahoo:maps http://api.local.yahoo.com/MapsService/V1/GeocodeResponse.xsd"><Result precision="address" warning="The exact location could not be found, here is the closest match: 701 First Ave, Sunnyvale, CA 94089"><Latitude>37.416384</Latitude><Longitude>-122.024853</Longitude><Address>701 FIRST AVE</Address><City>SUNNYVALE</City><State>CA</State><Zip>94089-1019</Zip><Country>US</Country></Result></ResultSet>
19
+ <!-- ws02.search.scd.yahoo.com compressed/chunked Thu Jun 8 15:20:46 PDT 2006 -->
20
+ EOF
21
+
22
+ assert_equal [37.416384, -122.024853],
23
+ @g.locate('701 First Street, Sunnyvale, CA').first.coordinates
24
+ assert_equal true, URI::HTTP.responses.empty?
25
+ assert_equal 1, URI::HTTP.uris.length
26
+ assert_equal 'http://api.local.yahoo.com/MapsService/V1/geocode?appid=APP_ID&location=701%20First%20Street,%20Sunnyvale,%20CA&output=xml',
27
+ URI::HTTP.uris.first
28
+ end
29
+
30
+ def test_locate_bad_address
31
+ URI::HTTP.responses << <<-EOF.strip
32
+ <?xml version="1.0" encoding="UTF-8"?> <Error xmlns="urn:yahoo:api">
33
+ The following errors were detected:
34
+ <Message>unable to parse location</Message></Error>
35
+ <!-- ws02.search.scd.yahoo.com uncompressed/chunked Thu Jun 8 15:53:20 PDT 2006 -->
36
+ EOF
37
+
38
+ assert_raise Yahoo::Error do
39
+ @g.locate 'yucksthoeusthaoeusnhtaosu'
40
+ end
41
+
42
+ assert_equal true, URI::HTTP.responses.empty?
43
+ assert_equal 1, URI::HTTP.uris.length
44
+ assert_equal 'http://api.local.yahoo.com/MapsService/V1/geocode?appid=APP_ID&location=yucksthoeusthaoeusnhtaosu&output=xml',
45
+ URI::HTTP.uris.first
46
+ end
47
+
48
+ end
49
+
50
+ class Yahoo::Geocode::TestLocation < Test::Unit::TestCase
51
+
52
+ def test_coordinates
53
+ loc = Yahoo::Geocode::Location.new
54
+ loc.latitude = Math::E
55
+ loc.longitude = Math::PI
56
+
57
+ assert_equal [Math::E, Math::PI], loc.coordinates
58
+ end
59
+
60
+ end
61
+
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11.15
3
+ specification_version: 1
4
+ name: yahoo-geocode
5
+ version: !ruby/object:Gem::Version
6
+ version: 1.0.0
7
+ date: 2006-06-10 00:00:00 -07:00
8
+ summary: A Ruby Yahoo Geocoder Library
9
+ require_paths:
10
+ - lib
11
+ email: eric@robotcoop.com
12
+ homepage:
13
+ rubyforge_project:
14
+ description: An interface to Yahoo's Geocoder service. http://developer.yahoo.com/maps/rest/V1/geocode.html
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Eric Hodel
31
+ files:
32
+ - LICENSE
33
+ - Manifest.txt
34
+ - README
35
+ - Rakefile
36
+ - lib/yahoo/geocode.rb
37
+ - test/test_geocode.rb
38
+ test_files: []
39
+
40
+ rdoc_options: []
41
+
42
+ extra_rdoc_files: []
43
+
44
+ executables: []
45
+
46
+ extensions: []
47
+
48
+ requirements: []
49
+
50
+ dependencies:
51
+ - !ruby/object:Gem::Dependency
52
+ name: yahoo
53
+ version_requirement:
54
+ version_requirements: !ruby/object:Gem::Version::Requirement
55
+ requirements:
56
+ - - "="
57
+ - !ruby/object:Gem::Version
58
+ version: 1.0.0
59
+ version: