graticule 0.2.12 → 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.autotest +13 -0
  2. data/.gitignore +2 -1
  3. data/CHANGELOG.txt +2 -0
  4. data/README.txt +5 -1
  5. data/Rakefile +31 -51
  6. data/VERSION +1 -1
  7. data/graticule.gemspec +102 -53
  8. data/lib/graticule/geocoder/base.rb +1 -1
  9. data/lib/graticule/geocoder/bogus.rb +8 -6
  10. data/lib/graticule/geocoder/freethepostcode.rb +38 -0
  11. data/lib/graticule/geocoder/geocoder_ca.rb +45 -20
  12. data/lib/graticule/geocoder/geocoder_us.rb +26 -14
  13. data/lib/graticule/geocoder/geonames.rb +51 -0
  14. data/lib/graticule/geocoder/google.rb +71 -44
  15. data/lib/graticule/geocoder/local_search_maps.rb +8 -7
  16. data/lib/graticule/geocoder/mapquest.rb +47 -27
  17. data/lib/graticule/geocoder/multi.rb +68 -8
  18. data/lib/graticule/geocoder/multimap.rb +49 -24
  19. data/lib/graticule/geocoder/yahoo.rb +57 -28
  20. data/lib/graticule/geocoder.rb +1 -0
  21. data/lib/graticule/location.rb +4 -0
  22. data/lib/graticule.rb +2 -4
  23. data/test/config.yml +32 -0
  24. data/test/config.yml.default +9 -12
  25. data/test/fixtures/responses/freethepostcode/not_found.txt +3 -0
  26. data/test/fixtures/responses/freethepostcode/success.txt +2 -0
  27. data/test/fixtures/responses/geocoder_ca/success.xml +12 -0
  28. data/test/fixtures/responses/geocoder_us/success.xml +3 -13
  29. data/test/fixtures/responses/geonames/missing.xml +4 -0
  30. data/test/fixtures/responses/geonames/success.xml +14 -0
  31. data/test/fixtures/responses/geonames/unknown.xml +4 -0
  32. data/test/fixtures/responses/google/partial.xml +16 -1
  33. data/test/fixtures/responses/google/success.xml +16 -1
  34. data/test/fixtures/responses/google/unknown_address.xml +8 -1
  35. data/test/fixtures/responses/yahoo/success.xml +2 -2
  36. data/test/fixtures/responses/yahoo/unknown_address.xml +1 -1
  37. data/test/{unit/graticule → graticule}/distance_test.rb +1 -1
  38. data/test/graticule/geocoder/freethepostcode_test.rb +36 -0
  39. data/test/graticule/geocoder/geocoder_ca_test.rb +41 -0
  40. data/test/{unit/graticule → graticule}/geocoder/geocoder_us_test.rb +1 -1
  41. data/test/{unit/graticule → graticule}/geocoder/geocoders.rb +1 -2
  42. data/test/graticule/geocoder/geonames_test.rb +48 -0
  43. data/test/{unit/graticule → graticule}/geocoder/google_test.rb +21 -26
  44. data/test/{unit/graticule → graticule}/geocoder/host_ip_test.rb +1 -1
  45. data/test/{unit/graticule → graticule}/geocoder/local_search_maps_test.rb +1 -1
  46. data/test/{unit/graticule → graticule}/geocoder/mapquest_test.rb +4 -2
  47. data/test/{unit/graticule → graticule}/geocoder/multi_test.rb +10 -2
  48. data/test/{unit/graticule → graticule}/geocoder/multimap_test.rb +2 -2
  49. data/test/{unit/graticule → graticule}/geocoder/yahoo_test.rb +6 -5
  50. data/test/{unit/graticule → graticule}/geocoder_test.rb +1 -5
  51. data/test/{unit/graticule → graticule}/location_test.rb +9 -1
  52. data/test/test_helper.rb +1 -2
  53. metadata +88 -47
  54. data/Manifest.txt +0 -84
  55. data/lib/graticule/geocoder/meta_carta.rb +0 -33
  56. data/lib/graticule/geocoder/postcode_anywhere.rb +0 -63
  57. data/lib/graticule/geocoder/rest.rb +0 -18
  58. data/lib/graticule/version.rb +0 -9
  59. data/test/fixtures/responses/meta_carta/bad_address.xml +0 -17
  60. data/test/fixtures/responses/meta_carta/multiple.xml +0 -33
  61. data/test/fixtures/responses/meta_carta/success.xml +0 -31
  62. data/test/fixtures/responses/postcode_anywhere/badkey.xml +0 -9
  63. data/test/fixtures/responses/postcode_anywhere/canada.xml +0 -16
  64. data/test/fixtures/responses/postcode_anywhere/empty.xml +0 -16
  65. data/test/fixtures/responses/postcode_anywhere/success.xml +0 -16
  66. data/test/fixtures/responses/postcode_anywhere/uk.xml +0 -18
  67. data/test/unit/graticule/geocoder/meta_carta_test.rb +0 -44
  68. data/test/unit/graticule/geocoder/postcode_anywhere_test.rb +0 -50
data/.autotest ADDED
@@ -0,0 +1,13 @@
1
+ Autotest.add_hook :initialize do |at|
2
+ at.clear_mappings
3
+
4
+ at.add_mapping %r%^lib/(.*)\.rb$% do |_, m|
5
+ at.files_matching %r%^test/#{m[1]}_test.rb$%
6
+ end
7
+
8
+ at.add_mapping(%r%^test/.*\.rb$%) {|filename, _| filename }
9
+
10
+ at.add_mapping %r%^test/fixtures/(.*)s.yml% do |_, _|
11
+ at.files_matching %r%^test/.*\.rb$%
12
+ end
13
+ end
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  test/config.yml
2
2
  *.gem
3
3
  pkg
4
- coverage
4
+ coverage
5
+ rdoc
data/CHANGELOG.txt CHANGED
@@ -1,3 +1,5 @@
1
+ * Added freethepostcode.org geocoder [Chris Lowis]
2
+
1
3
  0.2.12 (2009-09-06)
2
4
  * Fixed geocoder_us [Aubrey Holland]
3
5
 
data/README.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  = Graticule
2
2
 
3
- Graticule is a geocoding API for looking up address coordinates. It supports many popular APIs, including Yahoo, Google, Geocoder.ca, Geocoder.us, PostcodeAnywhere and MetaCarta.
3
+ Graticule is a geocoding API for looking up address coordinates. It supports many popular APIs, including Yahoo, Google, Geocoder.ca and Geocoder.us.
4
4
 
5
5
  = Usage
6
6
 
@@ -24,6 +24,10 @@ Graticule includes a command line interface (CLI).
24
24
  Washington, DC US
25
25
  latitude: 38.895222, longitude: -77.036758
26
26
 
27
+ = Mailing List
28
+
29
+ Join us on the mailing list at http://groups.google.com/group/graticule
30
+
27
31
  = How to contribute
28
32
 
29
33
  If you find what you might think is a bug:
data/Rakefile CHANGED
@@ -4,23 +4,26 @@ rescue LoadError
4
4
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
5
5
  exit 1
6
6
  end
7
+ require 'rubygems'
8
+ require 'activesupport'
7
9
  require 'rake/testtask'
8
10
  require 'rake/rdoctask'
9
11
  require 'rcov/rcovtask'
10
12
 
11
13
  Jeweler::Tasks.new do |s|
12
- s.name = "graticule"
14
+ s.name = "graticule"
13
15
  s.rubyforge_project = "graticule"
14
- s.author = 'Brandon Keepers'
15
- s.email = 'brandon@opensoul.org'
16
- s.summary = "API for using all the popular geocoding services."
17
- s.description = 'Graticule is a geocoding API that provides a common interface to all the popular services, including Google, Yahoo, Geocoder.us, and MetaCarta.'
18
- s.homepage = "http://github.com/collectiveidea/graticule"
19
- s.add_dependency "activesupport"
20
- s.has_rdoc = true
21
- s.extra_rdoc_files = ["README.txt"]
22
- s.rdoc_options = ["--main", "README.rdoc", "--inline-source", "--line-numbers"]
23
- s.test_files = Dir['test/**/*.{yml,rb}']
16
+ s.author = 'Brandon Keepers'
17
+ s.email = 'brandon@opensoul.org'
18
+ s.summary = "API for using all the popular geocoding services."
19
+ s.description = 'Graticule is a geocoding API that provides a common interface to all the popular services, including Google, Yahoo, Geocoder.us, and MetaCarta.'
20
+ s.homepage = "http://github.com/collectiveidea/graticule"
21
+ s.add_dependency "activesupport"
22
+ s.add_dependency 'happymapper', '>=0.3.0'
23
+ s.has_rdoc = true
24
+ s.extra_rdoc_files = ["README.txt"]
25
+ s.rdoc_options = ["--main", "README.rdoc", "--inline-source", "--line-numbers"]
26
+ s.test_files = Dir['test/**/*']
24
27
  end
25
28
 
26
29
  desc 'Default: run unit tests.'
@@ -28,7 +31,7 @@ task :default => :test
28
31
 
29
32
  desc 'Run the unit tests'
30
33
  Rake::TestTask.new(:test) do |t|
31
- t.libs << 'lib'
34
+ t.libs << 'lib' << 'test'
32
35
  t.pattern = 'test/**/*_test.rb'
33
36
  t.verbose = true
34
37
  end
@@ -75,44 +78,6 @@ namespace :rubyforge do
75
78
  end
76
79
  end
77
80
 
78
- namespace :test do
79
- namespace :cache do
80
- desc 'Cache test responses from all the free geocoders'
81
- task :free => [:google, :geocoder_us, :host_ip, :local_search_maps, :meta_carta, :yahoo]
82
-
83
- desc 'Cache test responses from Google'
84
- task :google do
85
- cache_responses('google')
86
- end
87
-
88
- desc 'Cache test responses from Geocoder.us'
89
- task :geocoder_us do
90
- cache_responses('geocoder_us')
91
- end
92
-
93
- desc 'Cache test responses from HostIP'
94
- task :host_ip do
95
- cache_responses('host_ip')
96
- end
97
-
98
- desc 'Cache test responses from Local Search Maps'
99
- task :local_search_maps do
100
- cache_responses('local_search_maps')
101
- end
102
-
103
- desc 'Cache test responses from Meta Carta'
104
- task :meta_carta do
105
- cache_responses('meta_carta')
106
- end
107
-
108
- desc 'Cache test responses from Yahoo'
109
- task :yahoo do
110
- cache_responses('yahoo')
111
- end
112
-
113
- end
114
- end
115
-
116
81
  require 'active_support'
117
82
  require 'net/http'
118
83
  require 'uri'
@@ -140,4 +105,19 @@ def update_placeholders!(config, thing)
140
105
  config.each do |option, value|
141
106
  thing.gsub!(":#{option}", value) if value.is_a?(String)
142
107
  end
143
- end
108
+ end
109
+
110
+ namespace :test do
111
+ namespace :cache do
112
+ desc 'Cache test responses from all the geocoders'
113
+ task :all => test_config.keys
114
+
115
+ test_config.keys.each do |service|
116
+ desc "Cache test responses for #{service}"
117
+ task service do
118
+ cache_responses(service)
119
+ end
120
+ end
121
+ end
122
+ end
123
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.12
1
+ 1.0.0.pre
data/graticule.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # Generated by jeweler
2
- # DO NOT EDIT THIS FILE
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{graticule}
8
- s.version = "0.2.12"
8
+ s.version = "1.0.0.pre"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brandon Keepers"]
12
- s.date = %q{2009-09-06}
12
+ s.date = %q{2009-12-05}
13
13
  s.default_executable = %q{geocode}
14
14
  s.description = %q{Graticule is a geocoding API that provides a common interface to all the popular services, including Google, Yahoo, Geocoder.us, and MetaCarta.}
15
15
  s.email = %q{brandon@opensoul.org}
@@ -18,10 +18,10 @@ Gem::Specification.new do |s|
18
18
  "README.txt"
19
19
  ]
20
20
  s.files = [
21
- ".gitignore",
21
+ ".autotest",
22
+ ".gitignore",
22
23
  "CHANGELOG.txt",
23
24
  "LICENSE.txt",
24
- "Manifest.txt",
25
25
  "README.txt",
26
26
  "Rakefile",
27
27
  "VERSION",
@@ -38,26 +38,30 @@ Gem::Specification.new do |s|
38
38
  "lib/graticule/geocoder.rb",
39
39
  "lib/graticule/geocoder/base.rb",
40
40
  "lib/graticule/geocoder/bogus.rb",
41
+ "lib/graticule/geocoder/freethepostcode.rb",
41
42
  "lib/graticule/geocoder/geocoder_ca.rb",
42
43
  "lib/graticule/geocoder/geocoder_us.rb",
44
+ "lib/graticule/geocoder/geonames.rb",
43
45
  "lib/graticule/geocoder/google.rb",
44
46
  "lib/graticule/geocoder/host_ip.rb",
45
47
  "lib/graticule/geocoder/local_search_maps.rb",
46
48
  "lib/graticule/geocoder/mapquest.rb",
47
- "lib/graticule/geocoder/meta_carta.rb",
48
49
  "lib/graticule/geocoder/multi.rb",
49
50
  "lib/graticule/geocoder/multimap.rb",
50
- "lib/graticule/geocoder/postcode_anywhere.rb",
51
- "lib/graticule/geocoder/rest.rb",
52
51
  "lib/graticule/geocoder/yahoo.rb",
53
52
  "lib/graticule/location.rb",
54
- "lib/graticule/version.rb",
55
53
  "site/index.html",
56
54
  "site/plugin.html",
57
55
  "site/stylesheets/style.css",
58
56
  "test/config.yml.default",
57
+ "test/fixtures/responses/freethepostcode/not_found.txt",
58
+ "test/fixtures/responses/freethepostcode/success.txt",
59
+ "test/fixtures/responses/geocoder_ca/success.xml",
59
60
  "test/fixtures/responses/geocoder_us/success.xml",
60
61
  "test/fixtures/responses/geocoder_us/unknown.xml",
62
+ "test/fixtures/responses/geonames/missing.xml",
63
+ "test/fixtures/responses/geonames/success.xml",
64
+ "test/fixtures/responses/geonames/unknown.xml",
61
65
  "test/fixtures/responses/google/badkey.xml",
62
66
  "test/fixtures/responses/google/limit.xml",
63
67
  "test/fixtures/responses/google/missing_address.xml",
@@ -76,72 +80,117 @@ Gem::Specification.new do |s|
76
80
  "test/fixtures/responses/local_search_maps/success.txt",
77
81
  "test/fixtures/responses/mapquest/multi_result.xml",
78
82
  "test/fixtures/responses/mapquest/success.xml",
79
- "test/fixtures/responses/meta_carta/bad_address.xml",
80
- "test/fixtures/responses/meta_carta/multiple.xml",
81
- "test/fixtures/responses/meta_carta/success.xml",
82
83
  "test/fixtures/responses/multimap/missing_params.xml",
83
84
  "test/fixtures/responses/multimap/no_matches.xml",
84
85
  "test/fixtures/responses/multimap/success.xml",
85
- "test/fixtures/responses/postcode_anywhere/badkey.xml",
86
- "test/fixtures/responses/postcode_anywhere/canada.xml",
87
- "test/fixtures/responses/postcode_anywhere/empty.xml",
88
- "test/fixtures/responses/postcode_anywhere/success.xml",
89
- "test/fixtures/responses/postcode_anywhere/uk.xml",
90
86
  "test/fixtures/responses/yahoo/success.xml",
91
87
  "test/fixtures/responses/yahoo/unknown_address.xml",
88
+ "test/graticule/distance_test.rb",
89
+ "test/graticule/geocoder/freethepostcode_test.rb",
90
+ "test/graticule/geocoder/geocoder_ca_test.rb",
91
+ "test/graticule/geocoder/geocoder_us_test.rb",
92
+ "test/graticule/geocoder/geocoders.rb",
93
+ "test/graticule/geocoder/geonames_test.rb",
94
+ "test/graticule/geocoder/google_test.rb",
95
+ "test/graticule/geocoder/host_ip_test.rb",
96
+ "test/graticule/geocoder/local_search_maps_test.rb",
97
+ "test/graticule/geocoder/mapquest_test.rb",
98
+ "test/graticule/geocoder/multi_test.rb",
99
+ "test/graticule/geocoder/multimap_test.rb",
100
+ "test/graticule/geocoder/yahoo_test.rb",
101
+ "test/graticule/geocoder_test.rb",
102
+ "test/graticule/location_test.rb",
92
103
  "test/mocks/uri.rb",
93
- "test/test_helper.rb",
94
- "test/unit/graticule/distance_test.rb",
95
- "test/unit/graticule/geocoder/geocoder_us_test.rb",
96
- "test/unit/graticule/geocoder/geocoders.rb",
97
- "test/unit/graticule/geocoder/google_test.rb",
98
- "test/unit/graticule/geocoder/host_ip_test.rb",
99
- "test/unit/graticule/geocoder/local_search_maps_test.rb",
100
- "test/unit/graticule/geocoder/mapquest_test.rb",
101
- "test/unit/graticule/geocoder/meta_carta_test.rb",
102
- "test/unit/graticule/geocoder/multi_test.rb",
103
- "test/unit/graticule/geocoder/multimap_test.rb",
104
- "test/unit/graticule/geocoder/postcode_anywhere_test.rb",
105
- "test/unit/graticule/geocoder/yahoo_test.rb",
106
- "test/unit/graticule/geocoder_test.rb",
107
- "test/unit/graticule/location_test.rb"
104
+ "test/test_helper.rb"
108
105
  ]
109
- s.has_rdoc = true
110
106
  s.homepage = %q{http://github.com/collectiveidea/graticule}
111
107
  s.rdoc_options = ["--main", "README.rdoc", "--inline-source", "--line-numbers"]
112
108
  s.require_paths = ["lib"]
113
109
  s.rubyforge_project = %q{graticule}
114
- s.rubygems_version = %q{1.3.1}
110
+ s.rubygems_version = %q{1.3.5}
115
111
  s.summary = %q{API for using all the popular geocoding services.}
116
112
  s.test_files = [
117
- "test/mocks/uri.rb",
118
- "test/test_helper.rb",
119
- "test/unit/graticule/distance_test.rb",
120
- "test/unit/graticule/geocoder/geocoder_us_test.rb",
121
- "test/unit/graticule/geocoder/geocoders.rb",
122
- "test/unit/graticule/geocoder/google_test.rb",
123
- "test/unit/graticule/geocoder/host_ip_test.rb",
124
- "test/unit/graticule/geocoder/local_search_maps_test.rb",
125
- "test/unit/graticule/geocoder/mapquest_test.rb",
126
- "test/unit/graticule/geocoder/meta_carta_test.rb",
127
- "test/unit/graticule/geocoder/multi_test.rb",
128
- "test/unit/graticule/geocoder/multimap_test.rb",
129
- "test/unit/graticule/geocoder/postcode_anywhere_test.rb",
130
- "test/unit/graticule/geocoder/yahoo_test.rb",
131
- "test/unit/graticule/geocoder_test.rb",
132
- "test/unit/graticule/location_test.rb"
113
+ "test/config.yml",
114
+ "test/config.yml.default",
115
+ "test/fixtures",
116
+ "test/fixtures/responses",
117
+ "test/fixtures/responses/freethepostcode",
118
+ "test/fixtures/responses/freethepostcode/not_found.txt",
119
+ "test/fixtures/responses/freethepostcode/success.txt",
120
+ "test/fixtures/responses/geocoder_ca",
121
+ "test/fixtures/responses/geocoder_ca/success.xml",
122
+ "test/fixtures/responses/geocoder_us",
123
+ "test/fixtures/responses/geocoder_us/success.xml",
124
+ "test/fixtures/responses/geocoder_us/unknown.xml",
125
+ "test/fixtures/responses/geonames",
126
+ "test/fixtures/responses/geonames/missing.xml",
127
+ "test/fixtures/responses/geonames/success.xml",
128
+ "test/fixtures/responses/geonames/unknown.xml",
129
+ "test/fixtures/responses/google",
130
+ "test/fixtures/responses/google/badkey.xml",
131
+ "test/fixtures/responses/google/limit.xml",
132
+ "test/fixtures/responses/google/missing_address.xml",
133
+ "test/fixtures/responses/google/only_coordinates.xml",
134
+ "test/fixtures/responses/google/partial.xml",
135
+ "test/fixtures/responses/google/server_error.xml",
136
+ "test/fixtures/responses/google/success.xml",
137
+ "test/fixtures/responses/google/success_multiple_results.xml",
138
+ "test/fixtures/responses/google/unavailable.xml",
139
+ "test/fixtures/responses/google/unknown_address.xml",
140
+ "test/fixtures/responses/host_ip",
141
+ "test/fixtures/responses/host_ip/private.txt",
142
+ "test/fixtures/responses/host_ip/success.txt",
143
+ "test/fixtures/responses/host_ip/unknown.txt",
144
+ "test/fixtures/responses/local_search_maps",
145
+ "test/fixtures/responses/local_search_maps/empty.txt",
146
+ "test/fixtures/responses/local_search_maps/not_found.txt",
147
+ "test/fixtures/responses/local_search_maps/success.txt",
148
+ "test/fixtures/responses/mapquest",
149
+ "test/fixtures/responses/mapquest/multi_result.xml",
150
+ "test/fixtures/responses/mapquest/success.xml",
151
+ "test/fixtures/responses/multimap",
152
+ "test/fixtures/responses/multimap/missing_params.xml",
153
+ "test/fixtures/responses/multimap/no_matches.xml",
154
+ "test/fixtures/responses/multimap/success.xml",
155
+ "test/fixtures/responses/yahoo",
156
+ "test/fixtures/responses/yahoo/success.xml",
157
+ "test/fixtures/responses/yahoo/unknown_address.xml",
158
+ "test/graticule",
159
+ "test/graticule/distance_test.rb",
160
+ "test/graticule/geocoder",
161
+ "test/graticule/geocoder/freethepostcode_test.rb",
162
+ "test/graticule/geocoder/geocoder_ca_test.rb",
163
+ "test/graticule/geocoder/geocoder_us_test.rb",
164
+ "test/graticule/geocoder/geocoders.rb",
165
+ "test/graticule/geocoder/geonames_test.rb",
166
+ "test/graticule/geocoder/google_test.rb",
167
+ "test/graticule/geocoder/host_ip_test.rb",
168
+ "test/graticule/geocoder/local_search_maps_test.rb",
169
+ "test/graticule/geocoder/mapquest_test.rb",
170
+ "test/graticule/geocoder/multi_test.rb",
171
+ "test/graticule/geocoder/multimap_test.rb",
172
+ "test/graticule/geocoder/yahoo_test.rb",
173
+ "test/graticule/geocoder_test.rb",
174
+ "test/graticule/location_test.rb",
175
+ "test/mocks",
176
+ "test/mocks/uri.rb",
177
+ "test/test_helper.rb"
133
178
  ]
134
179
 
135
180
  if s.respond_to? :specification_version then
136
181
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
137
- s.specification_version = 2
182
+ s.specification_version = 3
138
183
 
139
184
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
140
185
  s.add_runtime_dependency(%q<activesupport>, [">= 0"])
186
+ s.add_runtime_dependency(%q<happymapper>, [">= 0.3.0"])
141
187
  else
142
188
  s.add_dependency(%q<activesupport>, [">= 0"])
189
+ s.add_dependency(%q<happymapper>, [">= 0.3.0"])
143
190
  end
144
191
  else
145
192
  s.add_dependency(%q<activesupport>, [">= 0"])
193
+ s.add_dependency(%q<happymapper>, [">= 0.3.0"])
146
194
  end
147
195
  end
196
+
@@ -50,7 +50,7 @@ module Graticule #:nodoc:
50
50
  # end
51
51
  #
52
52
  class Base
53
- USER_AGENT = "Mozilla/5.0 (compatible; Graticule/#{Graticule::Version::STRING}; http://graticule.rubyforge.org)"
53
+ USER_AGENT = "Mozilla/5.0 (compatible; Graticule; http://graticule.rubyforge.org)"
54
54
 
55
55
  def initialize
56
56
  raise NotImplementedError
@@ -1,15 +1,17 @@
1
1
  module Graticule #:nodoc:
2
2
  module Geocoder #:nodoc:
3
-
4
3
  # Bogus geocoder that can be used for test purposes
5
4
  class Bogus
6
-
7
- # returns a new location with the address set to the original query string
5
+ # A queue of canned responses
6
+ class_inheritable_accessor :responses
7
+ self.responses = []
8
+
9
+ # A default location to use if the responses queue is empty
10
+ class_inheritable_accessor :default
11
+
8
12
  def locate(address)
9
- Location.new :street => address
13
+ responses.shift || default || Location.new(:street => address)
10
14
  end
11
-
12
15
  end
13
-
14
16
  end
15
17
  end
@@ -0,0 +1,38 @@
1
+ module Graticule #:nodoc:
2
+ module Geocoder #:nodoc:
3
+
4
+ # freethepostcode.org (http://www.freethepostcode.org/) is a
5
+ # free service to convert UK postcodes into geolocation data.
6
+ #
7
+ # gg = Graticule.service(:FreeThePostcode).new
8
+ # location = gg.locate 'W1A 1AA'
9
+ # location.coordinates
10
+ # #=> [51.52093, -0.13714]
11
+ class FreeThePostcode < Base
12
+
13
+ def initialize
14
+ @url = URI.parse 'http://www.freethepostcode.org/geocode'
15
+ end
16
+
17
+ def locate(postcode)
18
+ get :postcode => postcode
19
+ end
20
+
21
+ private
22
+
23
+ def prepare_response(response)
24
+ response.split("\n")[1]
25
+ end
26
+
27
+ def parse_response(response)
28
+ data = response.split
29
+ Location.new(:latitude => data[0].to_f, :longitude => data[1].to_f, :precision => :unknown)
30
+ end
31
+
32
+ def check_error(response)
33
+ raise AddressError, 'unknown address' if response.blank?
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -2,7 +2,7 @@ module Graticule #:nodoc:
2
2
  module Geocoder #:nodoc:
3
3
 
4
4
  # TODO: Reverse Geocoding
5
- class GeocoderCa < Rest
5
+ class GeocoderCa < Base
6
6
 
7
7
  def initialize(auth = nil)
8
8
  @url = URI.parse 'http://geocoder.ca/'
@@ -14,29 +14,54 @@ module Graticule #:nodoc:
14
14
  end
15
15
 
16
16
  private
17
-
18
- def parse_response(xml) #:nodoc:
19
- returning Location.new do |location|
20
- location.latitude = xml.elements['geodata/latt'].text.to_f
21
- location.longitude = xml.elements['geodata/longt'].text.to_f
22
- location.street = xml.elements['geodata/standard/staddress'].text
23
- location.locality = xml.elements['geodata/standard/city'].text
24
- location.region = xml.elements['geodata/standard/prov'].text
17
+
18
+ class Response
19
+ include HappyMapper
20
+ tag 'geodata'
21
+ element :latitude, Float, :tag => 'latt'
22
+ element :longitude, Float, :tag => 'longt'
23
+ element :street_number, String, :deep => true, :tag => 'stnumber'
24
+ element :street_name, String, :deep => true, :tag => 'staddress'
25
+ element :locality, String, :deep => true, :tag => 'city'
26
+ element :postal_code, String, :tag => 'postal'
27
+ element :region, String, :deep => true, :tag => 'prov'
28
+
29
+ class Error
30
+ include HappyMapper
31
+ tag 'error'
32
+ element :code, Integer
33
+ element :description, String
34
+ end
35
+
36
+ has_one :error, Error
37
+
38
+ def street
39
+ [street_number, street_name].join(' ')
25
40
  end
26
41
  end
42
+
43
+ def prepare_response(xml)
44
+ Response.parse(xml, :single => true)
45
+ end
46
+
47
+ def parse_response(response) #:nodoc:
48
+ Location.new(
49
+ :latitude => response.latitude,
50
+ :longitude => response.longitude,
51
+ :street => response.street,
52
+ :locality => response.locality,
53
+ :region => response.region
54
+ )
55
+ end
27
56
 
28
- def check_error(xml) #:nodoc:
29
- error = xml.elements['geodata/error']
30
- if error
31
- code = error.elements['code'].text.to_i
32
- message = error.elements['description'].text
33
- if (1..3).include?(code)
34
- raise CredentialsError, message
35
- elsif (4..8).include?(code)
36
- raise AddressError, message
37
- else
38
- raise Error, message
57
+ def check_error(response) #:nodoc:
58
+ if response.error
59
+ exception = case response.error.code
60
+ when 1..3; CredentialsError
61
+ when 4..8; AddressError
62
+ else; Error
39
63
  end
64
+ raise exception, response.error.message
40
65
  end
41
66
  end
42
67
 
@@ -4,7 +4,7 @@ module Graticule #:nodoc:
4
4
  # A library for lookup up coordinates with geocoder.us' API.
5
5
  #
6
6
  # http://geocoder.us/help/
7
- class GeocoderUs < Rest
7
+ class GeocoderUs < Base
8
8
 
9
9
  # Creates a new GeocoderUs object optionally using +username+ and
10
10
  # +password+.
@@ -13,7 +13,7 @@ module Graticule #:nodoc:
13
13
  #
14
14
  # http://geocoder.us/user/signup
15
15
  def initialize(user = nil, password = nil)
16
- if user and password then
16
+ if user && password
17
17
  @url = URI.parse 'http://geocoder.us/member/service/rest/geocode'
18
18
  @url.user = user
19
19
  @url.password = password
@@ -29,22 +29,34 @@ module Graticule #:nodoc:
29
29
  end
30
30
 
31
31
  private
32
+ class Point
33
+ include HappyMapper
34
+ tag 'Point'
35
+ namespace 'http://www.w3.org/2003/01/geo/wgs84_pos#'
36
+
37
+ element :description, String, :namespace => 'http://purl.org/dc/elements/1.1/'
38
+ element :longitude, Float, :tag => 'long'
39
+ element :latitude, Float, :tag => 'lat'
40
+ end
32
41
 
33
42
  def parse_response(xml) #:nodoc:
34
- location = Location.new
35
- location.street = xml.elements['rdf:RDF/geo:Point/dc:description'].text
36
-
37
- location.latitude = xml.elements['rdf:RDF/geo:Point/geo:lat'].text.to_f
38
- location.longitude = xml.elements['rdf:RDF/geo:Point/geo:long'].text.to_f
39
-
40
- return location
43
+ point = Point.parse(xml, :single => true)
44
+ Location.new(
45
+ :street => point.description,
46
+ :latitude => point.latitude,
47
+ :longitude => point.longitude
48
+ )
41
49
  end
42
50
 
43
- def check_error(xml) #:nodoc:
44
- text = xml.to_s
45
- raise AddressError, text if text =~ /couldn't find this address! sorry/
46
- raise Error, text if text =~ /Your browser sent a request that this server could not understand./
47
- raise Error, text if !(text =~ /geo:Point/)
51
+ def check_error(response) #:nodoc:
52
+ case response
53
+ when /geo:Point/
54
+ # success
55
+ when /couldn't find this address! sorry/
56
+ raise AddressError, response
57
+ else
58
+ raise Error, response
59
+ end
48
60
  end
49
61
 
50
62
  end