geocoder-us 1.0.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/LICENSE +27 -0
- data/Manifest.txt +7 -0
- data/README +42 -0
- data/Rakefile +66 -0
- data/lib/geocoder_us.rb +64 -0
- data/test/test_geocoder_us.rb +57 -0
- data/test/uri_stub.rb +17 -0
- metadata +52 -0
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
|
+
|
data/Manifest.txt
ADDED
data/README
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
= geocoder-us
|
2
|
+
|
3
|
+
Rubyforge Project:
|
4
|
+
|
5
|
+
http://rubyforge.org/projects/rctools
|
6
|
+
|
7
|
+
Documentation:
|
8
|
+
|
9
|
+
http://dev.robotcoop.com/Libraries/geocoder-us
|
10
|
+
|
11
|
+
== About
|
12
|
+
|
13
|
+
geocoder-us allows you to look up coordinates for addresses using geocoder.us.
|
14
|
+
|
15
|
+
== Installing geocoder-us
|
16
|
+
|
17
|
+
Just install the gem:
|
18
|
+
|
19
|
+
$ sudo gem install geocoder-us
|
20
|
+
|
21
|
+
== Using geocoder-us
|
22
|
+
|
23
|
+
The easy way:
|
24
|
+
|
25
|
+
require 'rubygems'
|
26
|
+
require 'geocoder-us'
|
27
|
+
|
28
|
+
p GeocoderUs.new.locate('1924 E Denny Way, Seattle, WA')
|
29
|
+
|
30
|
+
If you like you can use a geocoder.us account. You can sign up for an account
|
31
|
+
here:
|
32
|
+
|
33
|
+
http://geocoder.us/user/signup
|
34
|
+
|
35
|
+
And here's how you use your account:
|
36
|
+
|
37
|
+
require 'rubygems'
|
38
|
+
require 'geocoder-us'
|
39
|
+
|
40
|
+
gu = GeocoderUs.new 'username', 'password'
|
41
|
+
p gu.locate('1924 E Denny Way, Seattle, WA')
|
42
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,66 @@
|
|
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 = 'geocoder-us'
|
11
|
+
s.version = '1.0.0'
|
12
|
+
s.summary = 'Geocoder.us API Library'
|
13
|
+
s.description = 'Map addresses to latitude and longitude using geocoder.us'
|
14
|
+
s.author = 'Eric Hodel'
|
15
|
+
s.email = 'eric@robotcoop.com'
|
16
|
+
|
17
|
+
s.has_rdoc = true
|
18
|
+
s.files = File.read('Manifest.txt').split($/)
|
19
|
+
s.require_path = 'lib'
|
20
|
+
end
|
21
|
+
|
22
|
+
desc 'Run tests'
|
23
|
+
task :default => [ :test ]
|
24
|
+
|
25
|
+
Rake::TestTask.new('test') do |t|
|
26
|
+
t.libs << 'test'
|
27
|
+
t.pattern = 'test/test_*.rb'
|
28
|
+
t.verbose = true
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'Update Manifest.txt'
|
32
|
+
task :update_manifest do
|
33
|
+
sh "find . -type f | sed -e 's%./%%' | egrep -v 'svn|swp|~' | egrep -v '^(doc|pkg)/' | sort > Manifest.txt"
|
34
|
+
end
|
35
|
+
|
36
|
+
desc 'Generate RDoc'
|
37
|
+
Rake::RDocTask.new :rdoc do |rd|
|
38
|
+
rd.rdoc_dir = 'doc'
|
39
|
+
rd.rdoc_files.add 'lib', 'README', 'LICENSE'
|
40
|
+
rd.main = 'README'
|
41
|
+
rd.options << '-d' if `which dot` =~ /\/dot/
|
42
|
+
rd.options << '-t Geocoder.us'
|
43
|
+
end
|
44
|
+
|
45
|
+
desc 'Generate RDoc for dev.robotcoop.com'
|
46
|
+
Rake::RDocTask.new :dev_rdoc do |rd|
|
47
|
+
rd.rdoc_dir = '../../../www/trunk/dev/html/Libraries/geocoder-us'
|
48
|
+
rd.rdoc_files.add 'lib', 'README', 'LICENSE'
|
49
|
+
rd.main = 'README'
|
50
|
+
rd.options << '-d' if `which dot` =~ /\/dot/
|
51
|
+
rd.options << '-t Geocoder.us'
|
52
|
+
end
|
53
|
+
|
54
|
+
desc 'Build Gem'
|
55
|
+
Rake::GemPackageTask.new spec do |pkg|
|
56
|
+
pkg.need_tar = true
|
57
|
+
end
|
58
|
+
|
59
|
+
desc 'Clean up'
|
60
|
+
task :clean => [ :clobber_rdoc, :clobber_package ]
|
61
|
+
|
62
|
+
desc 'Clean up'
|
63
|
+
task :clobber => [ :clean ]
|
64
|
+
|
65
|
+
# vim: syntax=Ruby
|
66
|
+
|
data/lib/geocoder_us.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
##
|
4
|
+
# A library for lookup up coordinates with geocoder.us' API.
|
5
|
+
#
|
6
|
+
# http://geocoder.us/help/
|
7
|
+
|
8
|
+
class GeocoderUs
|
9
|
+
|
10
|
+
##
|
11
|
+
# Base error class
|
12
|
+
|
13
|
+
class Error < RuntimeError; end
|
14
|
+
|
15
|
+
##
|
16
|
+
# Raised if you give an unlocatable address.
|
17
|
+
|
18
|
+
class AddressError < Error; end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Raised if you give a bad username/password pair.
|
22
|
+
|
23
|
+
class LoginError < Error; end
|
24
|
+
|
25
|
+
##
|
26
|
+
# Creates a new GeocoderUs object optionally using +username+ and
|
27
|
+
# +password+.
|
28
|
+
#
|
29
|
+
# You can sign up for a geocoder.us account here:
|
30
|
+
#
|
31
|
+
# http://geocoder.us/user/signup
|
32
|
+
|
33
|
+
def initialize(user = nil, password = nil)
|
34
|
+
if user and password then
|
35
|
+
@url = URI.parse 'http://geocoder.us/member/service/csv'
|
36
|
+
@url.user = user
|
37
|
+
@url.password = password
|
38
|
+
else
|
39
|
+
@url = URI.parse 'http://rpc.geocoder.us/service/csv'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Locates +address+ and returns the address' latitude and longitude or
|
45
|
+
# raises an AddressError.
|
46
|
+
|
47
|
+
def locate(address)
|
48
|
+
url = @url.dup
|
49
|
+
url.query = "address=#{URI.escape address}"
|
50
|
+
|
51
|
+
url.open do |f|
|
52
|
+
response = f.read
|
53
|
+
raise AddressError, $' if response =~ /^2: /
|
54
|
+
lat, lon, = response.split ',', 3
|
55
|
+
lat = lat.to_f
|
56
|
+
lon = lon.to_f
|
57
|
+
return lat, lon
|
58
|
+
end
|
59
|
+
rescue OpenURI::HTTPError => e
|
60
|
+
raise LoginError if e.message =~ /^401 /
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/uri_stub'
|
3
|
+
require 'geocoder_us'
|
4
|
+
|
5
|
+
class TestGeocoderUs < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
URI::HTTP.responses = []
|
9
|
+
URI::HTTP.uris = []
|
10
|
+
|
11
|
+
@gu = GeocoderUs.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_locate
|
15
|
+
URI::HTTP.responses << <<-EOF
|
16
|
+
47.618620,-122.306942,1924 E Denny Way,Seattle,WA,98122
|
17
|
+
EOF
|
18
|
+
|
19
|
+
assert_equal [47.618620, -122.306942],
|
20
|
+
@gu.locate('1924 E Denny Way, Seattle, WA')
|
21
|
+
assert_equal true, URI::HTTP.responses.empty?
|
22
|
+
assert_equal 1, URI::HTTP.uris.length
|
23
|
+
assert_equal 'http://rpc.geocoder.us/service/csv?address=1924%20E%20Denny%20Way,%20Seattle,%20WA',
|
24
|
+
URI::HTTP.uris.first
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_locate_with_account
|
28
|
+
URI::HTTP.responses << <<-EOF
|
29
|
+
47.618620,-122.306942,1924 E Denny Way,Seattle,WA,98122
|
30
|
+
EOF
|
31
|
+
|
32
|
+
gu = GeocoderUs.new 'username', 'password'
|
33
|
+
assert_equal [47.618620, -122.306942],
|
34
|
+
gu.locate('1924 E Denny Way, Seattle, WA')
|
35
|
+
assert_equal true, URI::HTTP.responses.empty?
|
36
|
+
assert_equal 1, URI::HTTP.uris.length
|
37
|
+
assert_equal 'http://username:password@geocoder.us/member/service/csv?address=1924%20E%20Denny%20Way,%20Seattle,%20WA',
|
38
|
+
URI::HTTP.uris.first
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_locate_bad_address
|
42
|
+
URI::HTTP.responses << '2: couldn\'t find this address! sorry'
|
43
|
+
|
44
|
+
@gu.locate('yuck')
|
45
|
+
rescue GeocoderUs::AddressError => e
|
46
|
+
assert_equal 'couldn\'t find this address! sorry', e.message
|
47
|
+
|
48
|
+
assert_equal true, URI::HTTP.responses.empty?
|
49
|
+
assert_equal 1, URI::HTTP.uris.length
|
50
|
+
assert_equal 'http://rpc.geocoder.us/service/csv?address=yuck',
|
51
|
+
URI::HTTP.uris.first
|
52
|
+
else
|
53
|
+
flunk 'Expected GeocoderUs::AddressError'
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
data/test/uri_stub.rb
ADDED
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.11.15
|
3
|
+
specification_version: 1
|
4
|
+
name: geocoder-us
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 1.0.0
|
7
|
+
date: 2006-06-13 00:00:00 -07:00
|
8
|
+
summary: Geocoder.us API Library
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: eric@robotcoop.com
|
12
|
+
homepage:
|
13
|
+
rubyforge_project:
|
14
|
+
description: Map addresses to latitude and longitude using geocoder.us
|
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/geocoder_us.rb
|
37
|
+
- test/test_geocoder_us.rb
|
38
|
+
- test/uri_stub.rb
|
39
|
+
test_files: []
|
40
|
+
|
41
|
+
rdoc_options: []
|
42
|
+
|
43
|
+
extra_rdoc_files: []
|
44
|
+
|
45
|
+
executables: []
|
46
|
+
|
47
|
+
extensions: []
|
48
|
+
|
49
|
+
requirements: []
|
50
|
+
|
51
|
+
dependencies: []
|
52
|
+
|