go_maps 0.1.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/.gitignore +11 -0
- data/README.markdown +28 -0
- data/Rakefile +47 -0
- data/lib/go_maps/address.rb +33 -0
- data/lib/go_maps/address_not_found_exception.rb +5 -0
- data/lib/go_maps.rb +4 -0
- data/spec/data/address_error +5 -0
- data/spec/data/address_success +356 -0
- data/spec/data/distance_error +5 -0
- data/spec/data/distance_success_10.8 +426 -0
- data/spec/go_maps/address_spec.rb +32 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +28 -0
- metadata +116 -0
data/.gitignore
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
## ABOUT
|
2
|
+
|
3
|
+
Easy way to get the distance between two addresses (by car)
|
4
|
+
|
5
|
+
## LICENSE
|
6
|
+
|
7
|
+
(The MIT License)
|
8
|
+
|
9
|
+
Copyright © 2010
|
10
|
+
|
11
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
12
|
+
a copy of this software and associated documentation files (the
|
13
|
+
‘Software’), to deal in the Software without restriction, including
|
14
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
15
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
16
|
+
permit persons to whom the Software is furnished to do so, subject to
|
17
|
+
the following conditions:
|
18
|
+
|
19
|
+
The above copyright notice and this permission notice shall be
|
20
|
+
included in all copies or substantial portions of the Software.
|
21
|
+
|
22
|
+
THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND,
|
23
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
24
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
25
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
26
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
27
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
28
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "go_maps"
|
8
|
+
gem.version = "0.1.0"
|
9
|
+
gem.summary = %Q{Ruby API to geographic operations}
|
10
|
+
gem.description = %Q{Ruby API to geographic operations}
|
11
|
+
gem.homepage = "http://github.com/gonow/go_maps"
|
12
|
+
gem.authors = ["Gonow"]
|
13
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
+
gem.add_development_dependency "fakeweb", ">= 1.2.8"
|
15
|
+
gem.add_dependency("crack", ">= 0.1.6")
|
16
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
|
+
end
|
18
|
+
Jeweler::GemcutterTasks.new
|
19
|
+
rescue LoadError
|
20
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'spec/rake/spectask'
|
24
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
25
|
+
spec.libs << 'lib' << 'spec'
|
26
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
27
|
+
end
|
28
|
+
|
29
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
30
|
+
spec.libs << 'lib' << 'spec'
|
31
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
32
|
+
spec.rcov = true
|
33
|
+
end
|
34
|
+
|
35
|
+
task :spec => :check_dependencies
|
36
|
+
|
37
|
+
task :default => :spec
|
38
|
+
|
39
|
+
require 'rake/rdoctask'
|
40
|
+
Rake::RDocTask.new do |rdoc|
|
41
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
42
|
+
|
43
|
+
rdoc.rdoc_dir = 'rdoc'
|
44
|
+
rdoc.title = "go_maps #{version}"
|
45
|
+
rdoc.rdoc_files.include('README*')
|
46
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
47
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module GoMaps
|
2
|
+
class Address
|
3
|
+
def initialize(address)
|
4
|
+
@address = address
|
5
|
+
end
|
6
|
+
|
7
|
+
def exists?
|
8
|
+
location['status'] == 'OK'
|
9
|
+
end
|
10
|
+
|
11
|
+
def distance_to(address)
|
12
|
+
directions_to(address)['routes'].first['legs'].first['distance']['text'].gsub(' km', '').gsub(',', '.').to_f rescue raise AddressNotFoundException
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def directions_to(address)
|
18
|
+
api_response :directions, "origin=#{@address}&destination=#{address}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def location
|
22
|
+
api_response :geocode, "address=#{@address}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def api_response(api, query_string)
|
26
|
+
Crack::JSON.parse open(URI.escape(url_for(api) + query_string)).read
|
27
|
+
end
|
28
|
+
|
29
|
+
def url_for(api)
|
30
|
+
"http://maps.google.com/maps/api/#{api}/json?sensor=false&language=pt-BR&"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/go_maps.rb
ADDED
@@ -0,0 +1,356 @@
|
|
1
|
+
{
|
2
|
+
"status": "OK",
|
3
|
+
"results": [ {
|
4
|
+
"types": [ "street_address" ],
|
5
|
+
"formatted_address": "R. Tenerife, 31 - Vila Anchieta, São José do Rio Preto - São Paulo, 15050-120, Brasil",
|
6
|
+
"address_components": [ {
|
7
|
+
"long_name": "31",
|
8
|
+
"short_name": "31",
|
9
|
+
"types": [ "street_number" ]
|
10
|
+
}, {
|
11
|
+
"long_name": "R. Tenerife",
|
12
|
+
"short_name": "R. Tenerife",
|
13
|
+
"types": [ "route" ]
|
14
|
+
}, {
|
15
|
+
"long_name": "Vila Anchieta",
|
16
|
+
"short_name": "Vila Anchieta",
|
17
|
+
"types": [ "neighborhood", "political" ]
|
18
|
+
}, {
|
19
|
+
"long_name": "São José do Rio Preto",
|
20
|
+
"short_name": "São José do Rio Preto",
|
21
|
+
"types": [ "locality", "political" ]
|
22
|
+
}, {
|
23
|
+
"long_name": "São Paulo",
|
24
|
+
"short_name": "São Paulo",
|
25
|
+
"types": [ "administrative_area_level_1", "political" ]
|
26
|
+
}, {
|
27
|
+
"long_name": "Brasil",
|
28
|
+
"short_name": "BR",
|
29
|
+
"types": [ "country", "political" ]
|
30
|
+
}, {
|
31
|
+
"long_name": "15050-120",
|
32
|
+
"short_name": "15050-120",
|
33
|
+
"types": [ "postal_code" ]
|
34
|
+
} ],
|
35
|
+
"geometry": {
|
36
|
+
"location": {
|
37
|
+
"lat": -20.8011840,
|
38
|
+
"lng": -49.3747043
|
39
|
+
},
|
40
|
+
"location_type": "RANGE_INTERPOLATED",
|
41
|
+
"viewport": {
|
42
|
+
"southwest": {
|
43
|
+
"lat": -20.8043407,
|
44
|
+
"lng": -49.3778522
|
45
|
+
},
|
46
|
+
"northeast": {
|
47
|
+
"lat": -20.7980455,
|
48
|
+
"lng": -49.3715569
|
49
|
+
}
|
50
|
+
},
|
51
|
+
"bounds": {
|
52
|
+
"southwest": {
|
53
|
+
"lat": -20.8012022,
|
54
|
+
"lng": -49.3747048
|
55
|
+
},
|
56
|
+
"northeast": {
|
57
|
+
"lat": -20.8011840,
|
58
|
+
"lng": -49.3747043
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}, {
|
63
|
+
"types": [ "street_address" ],
|
64
|
+
"formatted_address": "R. Tenerife, 31 - Jardim Atlântico, Belo Horizonte - MG, 31550-220, Brasil",
|
65
|
+
"address_components": [ {
|
66
|
+
"long_name": "31",
|
67
|
+
"short_name": "31",
|
68
|
+
"types": [ "street_number" ]
|
69
|
+
}, {
|
70
|
+
"long_name": "R. Tenerife",
|
71
|
+
"short_name": "R. Tenerife",
|
72
|
+
"types": [ "route" ]
|
73
|
+
}, {
|
74
|
+
"long_name": "Jardim Atlântico",
|
75
|
+
"short_name": "Jardim Atlântico",
|
76
|
+
"types": [ "neighborhood", "political" ]
|
77
|
+
}, {
|
78
|
+
"long_name": "Belo Horizonte",
|
79
|
+
"short_name": "Belo Horizonte",
|
80
|
+
"types": [ "locality", "political" ]
|
81
|
+
}, {
|
82
|
+
"long_name": "Minas Gerais",
|
83
|
+
"short_name": "MG",
|
84
|
+
"types": [ "administrative_area_level_1", "political" ]
|
85
|
+
}, {
|
86
|
+
"long_name": "Brasil",
|
87
|
+
"short_name": "BR",
|
88
|
+
"types": [ "country", "political" ]
|
89
|
+
}, {
|
90
|
+
"long_name": "31550-220",
|
91
|
+
"short_name": "31550-220",
|
92
|
+
"types": [ "postal_code" ]
|
93
|
+
} ],
|
94
|
+
"geometry": {
|
95
|
+
"location": {
|
96
|
+
"lat": -19.8425571,
|
97
|
+
"lng": -43.9901379
|
98
|
+
},
|
99
|
+
"location_type": "RANGE_INTERPOLATED",
|
100
|
+
"viewport": {
|
101
|
+
"southwest": {
|
102
|
+
"lat": -19.8456962,
|
103
|
+
"lng": -43.9932891
|
104
|
+
},
|
105
|
+
"northeast": {
|
106
|
+
"lat": -19.8394010,
|
107
|
+
"lng": -43.9869938
|
108
|
+
}
|
109
|
+
},
|
110
|
+
"bounds": {
|
111
|
+
"southwest": {
|
112
|
+
"lat": -19.8425571,
|
113
|
+
"lng": -43.9901450
|
114
|
+
},
|
115
|
+
"northeast": {
|
116
|
+
"lat": -19.8425401,
|
117
|
+
"lng": -43.9901379
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}
|
121
|
+
}, {
|
122
|
+
"types": [ "street_address" ],
|
123
|
+
"formatted_address": "R. Tenerife, 31 - Jardim Industrial, Contagem - MG, 32220-080, Brasil",
|
124
|
+
"address_components": [ {
|
125
|
+
"long_name": "31",
|
126
|
+
"short_name": "31",
|
127
|
+
"types": [ "street_number" ]
|
128
|
+
}, {
|
129
|
+
"long_name": "R. Tenerife",
|
130
|
+
"short_name": "R. Tenerife",
|
131
|
+
"types": [ "route" ]
|
132
|
+
}, {
|
133
|
+
"long_name": "Jardim Industrial",
|
134
|
+
"short_name": "Jardim Industrial",
|
135
|
+
"types": [ "neighborhood", "political" ]
|
136
|
+
}, {
|
137
|
+
"long_name": "Contagem",
|
138
|
+
"short_name": "Contagem",
|
139
|
+
"types": [ "locality", "political" ]
|
140
|
+
}, {
|
141
|
+
"long_name": "Minas Gerais",
|
142
|
+
"short_name": "MG",
|
143
|
+
"types": [ "administrative_area_level_1", "political" ]
|
144
|
+
}, {
|
145
|
+
"long_name": "Brasil",
|
146
|
+
"short_name": "BR",
|
147
|
+
"types": [ "country", "political" ]
|
148
|
+
}, {
|
149
|
+
"long_name": "32220-080",
|
150
|
+
"short_name": "32220-080",
|
151
|
+
"types": [ "postal_code" ]
|
152
|
+
} ],
|
153
|
+
"geometry": {
|
154
|
+
"location": {
|
155
|
+
"lat": -19.9674684,
|
156
|
+
"lng": -44.0224518
|
157
|
+
},
|
158
|
+
"location_type": "RANGE_INTERPOLATED",
|
159
|
+
"viewport": {
|
160
|
+
"southwest": {
|
161
|
+
"lat": -19.9706228,
|
162
|
+
"lng": -44.0256060
|
163
|
+
},
|
164
|
+
"northeast": {
|
165
|
+
"lat": -19.9643275,
|
166
|
+
"lng": -44.0193108
|
167
|
+
}
|
168
|
+
},
|
169
|
+
"bounds": {
|
170
|
+
"southwest": {
|
171
|
+
"lat": -19.9674819,
|
172
|
+
"lng": -44.0224650
|
173
|
+
},
|
174
|
+
"northeast": {
|
175
|
+
"lat": -19.9674684,
|
176
|
+
"lng": -44.0224518
|
177
|
+
}
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}, {
|
181
|
+
"types": [ "street_address" ],
|
182
|
+
"formatted_address": "R. Tenerife, 31 - Itaim Bibi, São Paulo, 04548-040, Brasil",
|
183
|
+
"address_components": [ {
|
184
|
+
"long_name": "31",
|
185
|
+
"short_name": "31",
|
186
|
+
"types": [ "street_number" ]
|
187
|
+
}, {
|
188
|
+
"long_name": "R. Tenerife",
|
189
|
+
"short_name": "R. Tenerife",
|
190
|
+
"types": [ "route" ]
|
191
|
+
}, {
|
192
|
+
"long_name": "Itaim Bibi",
|
193
|
+
"short_name": "Itaim Bibi",
|
194
|
+
"types": [ "neighborhood", "political" ]
|
195
|
+
}, {
|
196
|
+
"long_name": "São Paulo",
|
197
|
+
"short_name": "São Paulo",
|
198
|
+
"types": [ "locality", "political" ]
|
199
|
+
}, {
|
200
|
+
"long_name": "São Paulo",
|
201
|
+
"short_name": "São Paulo",
|
202
|
+
"types": [ "administrative_area_level_1", "political" ]
|
203
|
+
}, {
|
204
|
+
"long_name": "Brasil",
|
205
|
+
"short_name": "BR",
|
206
|
+
"types": [ "country", "political" ]
|
207
|
+
}, {
|
208
|
+
"long_name": "04548-040",
|
209
|
+
"short_name": "04548-040",
|
210
|
+
"types": [ "postal_code" ]
|
211
|
+
} ],
|
212
|
+
"geometry": {
|
213
|
+
"location": {
|
214
|
+
"lat": -23.5962501,
|
215
|
+
"lng": -46.6878790
|
216
|
+
},
|
217
|
+
"location_type": "RANGE_INTERPOLATED",
|
218
|
+
"viewport": {
|
219
|
+
"southwest": {
|
220
|
+
"lat": -23.5993942,
|
221
|
+
"lng": -46.6910355
|
222
|
+
},
|
223
|
+
"northeast": {
|
224
|
+
"lat": -23.5930989,
|
225
|
+
"lng": -46.6847403
|
226
|
+
}
|
227
|
+
},
|
228
|
+
"bounds": {
|
229
|
+
"southwest": {
|
230
|
+
"lat": -23.5962501,
|
231
|
+
"lng": -46.6878968
|
232
|
+
},
|
233
|
+
"northeast": {
|
234
|
+
"lat": -23.5962430,
|
235
|
+
"lng": -46.6878790
|
236
|
+
}
|
237
|
+
}
|
238
|
+
}
|
239
|
+
}, {
|
240
|
+
"types": [ "street_address" ],
|
241
|
+
"formatted_address": "R. Tenerife, 31 - Fazenda Rio Grande - PR, 83820-000, Brasil",
|
242
|
+
"address_components": [ {
|
243
|
+
"long_name": "31",
|
244
|
+
"short_name": "31",
|
245
|
+
"types": [ "street_number" ]
|
246
|
+
}, {
|
247
|
+
"long_name": "R. Tenerife",
|
248
|
+
"short_name": "R. Tenerife",
|
249
|
+
"types": [ "route" ]
|
250
|
+
}, {
|
251
|
+
"long_name": "Fazenda Rio Grande",
|
252
|
+
"short_name": "Fazenda Rio Grande",
|
253
|
+
"types": [ "locality", "political" ]
|
254
|
+
}, {
|
255
|
+
"long_name": "Paraná",
|
256
|
+
"short_name": "PR",
|
257
|
+
"types": [ "administrative_area_level_1", "political" ]
|
258
|
+
}, {
|
259
|
+
"long_name": "Brasil",
|
260
|
+
"short_name": "BR",
|
261
|
+
"types": [ "country", "political" ]
|
262
|
+
}, {
|
263
|
+
"long_name": "83820-000",
|
264
|
+
"short_name": "83820-000",
|
265
|
+
"types": [ "postal_code" ]
|
266
|
+
} ],
|
267
|
+
"geometry": {
|
268
|
+
"location": {
|
269
|
+
"lat": -25.6641852,
|
270
|
+
"lng": -49.3006341
|
271
|
+
},
|
272
|
+
"location_type": "RANGE_INTERPOLATED",
|
273
|
+
"viewport": {
|
274
|
+
"southwest": {
|
275
|
+
"lat": -25.6673372,
|
276
|
+
"lng": -49.3037901
|
277
|
+
},
|
278
|
+
"northeast": {
|
279
|
+
"lat": -25.6610420,
|
280
|
+
"lng": -49.2974949
|
281
|
+
}
|
282
|
+
},
|
283
|
+
"bounds": {
|
284
|
+
"southwest": {
|
285
|
+
"lat": -25.6641940,
|
286
|
+
"lng": -49.3006509
|
287
|
+
},
|
288
|
+
"northeast": {
|
289
|
+
"lat": -25.6641852,
|
290
|
+
"lng": -49.3006341
|
291
|
+
}
|
292
|
+
}
|
293
|
+
}
|
294
|
+
}, {
|
295
|
+
"types": [ "street_address" ],
|
296
|
+
"formatted_address": "R. Tenerife, 31 - Parada de Lucas, Rio de Janeiro - RJ, 21010-000, Brasil",
|
297
|
+
"address_components": [ {
|
298
|
+
"long_name": "31",
|
299
|
+
"short_name": "31",
|
300
|
+
"types": [ "street_number" ]
|
301
|
+
}, {
|
302
|
+
"long_name": "R. Tenerife",
|
303
|
+
"short_name": "R. Tenerife",
|
304
|
+
"types": [ "route" ]
|
305
|
+
}, {
|
306
|
+
"long_name": "Parada de Lucas",
|
307
|
+
"short_name": "Parada de Lucas",
|
308
|
+
"types": [ "neighborhood", "political" ]
|
309
|
+
}, {
|
310
|
+
"long_name": "Rio de Janeiro",
|
311
|
+
"short_name": "Rio de Janeiro",
|
312
|
+
"types": [ "locality", "political" ]
|
313
|
+
}, {
|
314
|
+
"long_name": "Rio de Janeiro",
|
315
|
+
"short_name": "RJ",
|
316
|
+
"types": [ "administrative_area_level_1", "political" ]
|
317
|
+
}, {
|
318
|
+
"long_name": "Brasil",
|
319
|
+
"short_name": "BR",
|
320
|
+
"types": [ "country", "political" ]
|
321
|
+
}, {
|
322
|
+
"long_name": "21010-000",
|
323
|
+
"short_name": "21010-000",
|
324
|
+
"types": [ "postal_code" ]
|
325
|
+
} ],
|
326
|
+
"geometry": {
|
327
|
+
"location": {
|
328
|
+
"lat": -22.8167748,
|
329
|
+
"lng": -43.2958111
|
330
|
+
},
|
331
|
+
"location_type": "RANGE_INTERPOLATED",
|
332
|
+
"viewport": {
|
333
|
+
"southwest": {
|
334
|
+
"lat": -22.8199308,
|
335
|
+
"lng": -43.2989551
|
336
|
+
},
|
337
|
+
"northeast": {
|
338
|
+
"lat": -22.8136355,
|
339
|
+
"lng": -43.2926599
|
340
|
+
}
|
341
|
+
},
|
342
|
+
"bounds": {
|
343
|
+
"southwest": {
|
344
|
+
"lat": -22.8167915,
|
345
|
+
"lng": -43.2958111
|
346
|
+
},
|
347
|
+
"northeast": {
|
348
|
+
"lat": -22.8167748,
|
349
|
+
"lng": -43.2958039
|
350
|
+
}
|
351
|
+
}
|
352
|
+
},
|
353
|
+
"partial_match": true
|
354
|
+
} ]
|
355
|
+
}
|
356
|
+
|
@@ -0,0 +1,426 @@
|
|
1
|
+
{
|
2
|
+
"status": "OK",
|
3
|
+
"routes": [ {
|
4
|
+
"summary": "Av. dos Bandeirantes",
|
5
|
+
"legs": [ {
|
6
|
+
"steps": [ {
|
7
|
+
"travel_mode": "DRIVING",
|
8
|
+
"start_location": {
|
9
|
+
"lat": -23.5962400,
|
10
|
+
"lng": -46.6879000
|
11
|
+
},
|
12
|
+
"end_location": {
|
13
|
+
"lat": -23.5968300,
|
14
|
+
"lng": -46.6881800
|
15
|
+
},
|
16
|
+
"polyline": {
|
17
|
+
"points": "ns_oCjv}{GtBv@",
|
18
|
+
"levels": "BB"
|
19
|
+
},
|
20
|
+
"duration": {
|
21
|
+
"value": 10,
|
22
|
+
"text": "1 min"
|
23
|
+
},
|
24
|
+
"html_instructions": "Siga na direção \u003cb\u003esudoeste\u003c/b\u003e na \u003cb\u003eR. Tenerife\u003c/b\u003e em direção à \u003cb\u003eAv. Dr. Cardoso de Melo\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e72 m\u003c/b\u003e\u003c/span\u003e",
|
25
|
+
"distance": {
|
26
|
+
"value": 72,
|
27
|
+
"text": "72 m"
|
28
|
+
}
|
29
|
+
}, {
|
30
|
+
"travel_mode": "DRIVING",
|
31
|
+
"start_location": {
|
32
|
+
"lat": -23.5968300,
|
33
|
+
"lng": -46.6881800
|
34
|
+
},
|
35
|
+
"end_location": {
|
36
|
+
"lat": -23.5993100,
|
37
|
+
"lng": -46.6827900
|
38
|
+
},
|
39
|
+
"polyline": {
|
40
|
+
"points": "dw_oCbx}{GxBuFtJ_Y",
|
41
|
+
"levels": "B?B"
|
42
|
+
},
|
43
|
+
"duration": {
|
44
|
+
"value": 116,
|
45
|
+
"text": "2 minutos"
|
46
|
+
},
|
47
|
+
"html_instructions": "Pegue a primeira \u003cb\u003eà esquerda\u003c/b\u003e para pegar a \u003cb\u003eAv. Dr. Cardoso de Melo\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e600 m\u003c/b\u003e\u003c/span\u003e",
|
48
|
+
"distance": {
|
49
|
+
"value": 615,
|
50
|
+
"text": "0,6 km"
|
51
|
+
}
|
52
|
+
}, {
|
53
|
+
"travel_mode": "DRIVING",
|
54
|
+
"start_location": {
|
55
|
+
"lat": -23.5993100,
|
56
|
+
"lng": -46.6827900
|
57
|
+
},
|
58
|
+
"end_location": {
|
59
|
+
"lat": -23.6002500,
|
60
|
+
"lng": -46.6827500
|
61
|
+
},
|
62
|
+
"polyline": {
|
63
|
+
"points": "tf`oClv|{GzDG",
|
64
|
+
"levels": "BB"
|
65
|
+
},
|
66
|
+
"duration": {
|
67
|
+
"value": 21,
|
68
|
+
"text": "1 min"
|
69
|
+
},
|
70
|
+
"html_instructions": "Vire à \u003cb\u003edireita\u003c/b\u003e na \u003cb\u003eR. Alvorada\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e110 m\u003c/b\u003e\u003c/span\u003e",
|
71
|
+
"distance": {
|
72
|
+
"value": 105,
|
73
|
+
"text": "0,1 km"
|
74
|
+
}
|
75
|
+
}, {
|
76
|
+
"travel_mode": "DRIVING",
|
77
|
+
"start_location": {
|
78
|
+
"lat": -23.6002500,
|
79
|
+
"lng": -46.6827500
|
80
|
+
},
|
81
|
+
"end_location": {
|
82
|
+
"lat": -23.6014400,
|
83
|
+
"lng": -46.6828100
|
84
|
+
},
|
85
|
+
"polyline": {
|
86
|
+
"points": "pl`oCdv|{GhEMb@X",
|
87
|
+
"levels": "B?B"
|
88
|
+
},
|
89
|
+
"duration": {
|
90
|
+
"value": 27,
|
91
|
+
"text": "1 min"
|
92
|
+
},
|
93
|
+
"html_instructions": "Continue para \u003cb\u003eR. Dr. Manuel da Rocha Passos Filho\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e140 m\u003c/b\u003e\u003c/span\u003e",
|
94
|
+
"distance": {
|
95
|
+
"value": 137,
|
96
|
+
"text": "0,1 km"
|
97
|
+
}
|
98
|
+
}, {
|
99
|
+
"travel_mode": "DRIVING",
|
100
|
+
"start_location": {
|
101
|
+
"lat": -23.6014400,
|
102
|
+
"lng": -46.6828100
|
103
|
+
},
|
104
|
+
"end_location": {
|
105
|
+
"lat": -23.6041800,
|
106
|
+
"lng": -46.6798400
|
107
|
+
},
|
108
|
+
"polyline": {
|
109
|
+
"points": "~s`oCpv|{GbGqHxCkCzAoBh@c@",
|
110
|
+
"levels": "B???B"
|
111
|
+
},
|
112
|
+
"duration": {
|
113
|
+
"value": 98,
|
114
|
+
"text": "2 minutos"
|
115
|
+
},
|
116
|
+
"html_instructions": "Vire à \u003cb\u003eesquerda\u003c/b\u003e na \u003cb\u003eAv. dos Bandeirantes\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e450 m\u003c/b\u003e\u003c/span\u003e",
|
117
|
+
"distance": {
|
118
|
+
"value": 431,
|
119
|
+
"text": "0,4 km"
|
120
|
+
}
|
121
|
+
}, {
|
122
|
+
"travel_mode": "DRIVING",
|
123
|
+
"start_location": {
|
124
|
+
"lat": -23.6041800,
|
125
|
+
"lng": -46.6798400
|
126
|
+
},
|
127
|
+
"end_location": {
|
128
|
+
"lat": -23.6085300,
|
129
|
+
"lng": -46.6767400
|
130
|
+
},
|
131
|
+
"polyline": {
|
132
|
+
"points": "beaoC~c|{G|AaA`O{Ft@k@nEaG",
|
133
|
+
"levels": "B???B"
|
134
|
+
},
|
135
|
+
"duration": {
|
136
|
+
"value": 28,
|
137
|
+
"text": "1 min"
|
138
|
+
},
|
139
|
+
"html_instructions": "Curva suave à \u003cb\u003edireita\u003c/b\u003e na \u003cb\u003eAv. dos Bandeirantes-pista Central\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e600 m\u003c/b\u003e\u003c/span\u003e",
|
140
|
+
"distance": {
|
141
|
+
"value": 588,
|
142
|
+
"text": "0,6 km"
|
143
|
+
}
|
144
|
+
}, {
|
145
|
+
"travel_mode": "DRIVING",
|
146
|
+
"start_location": {
|
147
|
+
"lat": -23.6085300,
|
148
|
+
"lng": -46.6767400
|
149
|
+
},
|
150
|
+
"end_location": {
|
151
|
+
"lat": -23.6178200,
|
152
|
+
"lng": -46.6609300
|
153
|
+
},
|
154
|
+
"polyline": {
|
155
|
+
"points": "h`boCrp{{GjBwBrGoEvBgBbAwAtBeEbEuLrAyCdDoEvEeHhAyCtC_RxGkQ",
|
156
|
+
"levels": "B???@????@??B"
|
157
|
+
},
|
158
|
+
"duration": {
|
159
|
+
"value": 94,
|
160
|
+
"text": "2 minutos"
|
161
|
+
},
|
162
|
+
"html_instructions": "Continue para \u003cb\u003eAv. dos Bandeirantes\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e2,0 km\u003c/b\u003e\u003c/span\u003e",
|
163
|
+
"distance": {
|
164
|
+
"value": 1957,
|
165
|
+
"text": "2,0 km"
|
166
|
+
}
|
167
|
+
}, {
|
168
|
+
"travel_mode": "DRIVING",
|
169
|
+
"start_location": {
|
170
|
+
"lat": -23.6178200,
|
171
|
+
"lng": -46.6609300
|
172
|
+
},
|
173
|
+
"end_location": {
|
174
|
+
"lat": -23.6179000,
|
175
|
+
"lng": -46.6619600
|
176
|
+
},
|
177
|
+
"polyline": {
|
178
|
+
"points": "jzcoCxmx{GnA]d@P^f@p@|A?ZMVQVYJ{AIa@D",
|
179
|
+
"levels": "B???@?????B"
|
180
|
+
},
|
181
|
+
"duration": {
|
182
|
+
"value": 38,
|
183
|
+
"text": "1 min"
|
184
|
+
},
|
185
|
+
"html_instructions": "Pegue a saída em direção a \u003cb\u003eVd. João Julião da Costa Aguiar\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e280 m\u003c/b\u003e\u003c/span\u003e",
|
186
|
+
"distance": {
|
187
|
+
"value": 284,
|
188
|
+
"text": "0,3 km"
|
189
|
+
}
|
190
|
+
}, {
|
191
|
+
"travel_mode": "DRIVING",
|
192
|
+
"start_location": {
|
193
|
+
"lat": -23.6179000,
|
194
|
+
"lng": -46.6619600
|
195
|
+
},
|
196
|
+
"end_location": {
|
197
|
+
"lat": -23.6158800,
|
198
|
+
"lng": -46.6602800
|
199
|
+
},
|
200
|
+
"polyline": {
|
201
|
+
"points": "zzcoCftx{GoBcAcHkG",
|
202
|
+
"levels": "B?B"
|
203
|
+
},
|
204
|
+
"duration": {
|
205
|
+
"value": 27,
|
206
|
+
"text": "1 min"
|
207
|
+
},
|
208
|
+
"html_instructions": "Vire à \u003cb\u003edireita\u003c/b\u003e na \u003cb\u003eVd. João Julião da Costa Aguiar\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e280 m\u003c/b\u003e\u003c/span\u003e",
|
209
|
+
"distance": {
|
210
|
+
"value": 284,
|
211
|
+
"text": "0,3 km"
|
212
|
+
}
|
213
|
+
}, {
|
214
|
+
"travel_mode": "DRIVING",
|
215
|
+
"start_location": {
|
216
|
+
"lat": -23.6158800,
|
217
|
+
"lng": -46.6602800
|
218
|
+
},
|
219
|
+
"end_location": {
|
220
|
+
"lat": -23.6078900,
|
221
|
+
"lng": -46.6526800
|
222
|
+
},
|
223
|
+
"polyline": {
|
224
|
+
"points": "fncoCvix{GsIiIwCaDaIwGoWkV",
|
225
|
+
"levels": "B???B"
|
226
|
+
},
|
227
|
+
"duration": {
|
228
|
+
"value": 91,
|
229
|
+
"text": "2 minutos"
|
230
|
+
},
|
231
|
+
"html_instructions": "Continue para \u003cb\u003eAv. Moreira Guimarães\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e1,2 km\u003c/b\u003e\u003c/span\u003e",
|
232
|
+
"distance": {
|
233
|
+
"value": 1179,
|
234
|
+
"text": "1,2 km"
|
235
|
+
}
|
236
|
+
}, {
|
237
|
+
"travel_mode": "DRIVING",
|
238
|
+
"start_location": {
|
239
|
+
"lat": -23.6078900,
|
240
|
+
"lng": -46.6526800
|
241
|
+
},
|
242
|
+
"end_location": {
|
243
|
+
"lat": -23.5910200,
|
244
|
+
"lng": -46.6509300
|
245
|
+
},
|
246
|
+
"polyline": {
|
247
|
+
"points": "h|aoCfzv{GwCyBa@QeC_A_C[kWoA{p@cC_C?oDPuFjA",
|
248
|
+
"levels": "B???@?@??B"
|
249
|
+
},
|
250
|
+
"duration": {
|
251
|
+
"value": 93,
|
252
|
+
"text": "2 minutos"
|
253
|
+
},
|
254
|
+
"html_instructions": "Continue para \u003cb\u003eAv. Rubem Berta\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e1,9 km\u003c/b\u003e\u003c/span\u003e",
|
255
|
+
"distance": {
|
256
|
+
"value": 1917,
|
257
|
+
"text": "1,9 km"
|
258
|
+
}
|
259
|
+
}, {
|
260
|
+
"travel_mode": "DRIVING",
|
261
|
+
"start_location": {
|
262
|
+
"lat": -23.5910200,
|
263
|
+
"lng": -46.6509300
|
264
|
+
},
|
265
|
+
"end_location": {
|
266
|
+
"lat": -23.5787000,
|
267
|
+
"lng": -46.6463300
|
268
|
+
},
|
269
|
+
"polyline": {
|
270
|
+
"points": "zr~nChov{Gq_@~MuCJgAGiAUqCqAkB}AeKiPaNkS",
|
271
|
+
"levels": "B@??@???B"
|
272
|
+
},
|
273
|
+
"duration": {
|
274
|
+
"value": 84,
|
275
|
+
"text": "1 min"
|
276
|
+
},
|
277
|
+
"html_instructions": "Continue para \u003cb\u003eAv. Vinte e Três de Maio\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e1,7 km\u003c/b\u003e\u003c/span\u003e",
|
278
|
+
"distance": {
|
279
|
+
"value": 1747,
|
280
|
+
"text": "1,7 km"
|
281
|
+
}
|
282
|
+
}, {
|
283
|
+
"travel_mode": "DRIVING",
|
284
|
+
"start_location": {
|
285
|
+
"lat": -23.5787000,
|
286
|
+
"lng": -46.6463300
|
287
|
+
},
|
288
|
+
"end_location": {
|
289
|
+
"lat": -23.5785200,
|
290
|
+
"lng": -46.6457800
|
291
|
+
},
|
292
|
+
"polyline": {
|
293
|
+
"points": "ze|nCpru{Gc@mB",
|
294
|
+
"levels": "BB"
|
295
|
+
},
|
296
|
+
"duration": {
|
297
|
+
"value": 15,
|
298
|
+
"text": "1 min"
|
299
|
+
},
|
300
|
+
"html_instructions": "Curva suave à \u003cb\u003edireita\u003c/b\u003e na \u003cb\u003ePraça Toronto\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e60 m\u003c/b\u003e\u003c/span\u003e",
|
301
|
+
"distance": {
|
302
|
+
"value": 60,
|
303
|
+
"text": "60 m"
|
304
|
+
}
|
305
|
+
}, {
|
306
|
+
"travel_mode": "DRIVING",
|
307
|
+
"start_location": {
|
308
|
+
"lat": -23.5785200,
|
309
|
+
"lng": -46.6457800
|
310
|
+
},
|
311
|
+
"end_location": {
|
312
|
+
"lat": -23.5771500,
|
313
|
+
"lng": -46.6407500
|
314
|
+
},
|
315
|
+
"polyline": {
|
316
|
+
"points": "vd|nCbou{Gk@gDkCcLyAaL",
|
317
|
+
"levels": "B??B"
|
318
|
+
},
|
319
|
+
"duration": {
|
320
|
+
"value": 93,
|
321
|
+
"text": "2 minutos"
|
322
|
+
},
|
323
|
+
"html_instructions": "Continue para \u003cb\u003eR. Estela\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e550 m\u003c/b\u003e\u003c/span\u003e",
|
324
|
+
"distance": {
|
325
|
+
"value": 536,
|
326
|
+
"text": "0,5 km"
|
327
|
+
}
|
328
|
+
}, {
|
329
|
+
"travel_mode": "DRIVING",
|
330
|
+
"start_location": {
|
331
|
+
"lat": -23.5771500,
|
332
|
+
"lng": -46.6407500
|
333
|
+
},
|
334
|
+
"end_location": {
|
335
|
+
"lat": -23.5763400,
|
336
|
+
"lng": -46.6409600
|
337
|
+
},
|
338
|
+
"polyline": {
|
339
|
+
"points": "d|{nCtot{G}APcAV",
|
340
|
+
"levels": "B?B"
|
341
|
+
},
|
342
|
+
"duration": {
|
343
|
+
"value": 39,
|
344
|
+
"text": "1 min"
|
345
|
+
},
|
346
|
+
"html_instructions": "Vire à \u003cb\u003eesquerda\u003c/b\u003e na \u003cb\u003eR. Vergueiro\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e93 m\u003c/b\u003e\u003c/span\u003e",
|
347
|
+
"distance": {
|
348
|
+
"value": 93,
|
349
|
+
"text": "93 m"
|
350
|
+
}
|
351
|
+
}, {
|
352
|
+
"travel_mode": "DRIVING",
|
353
|
+
"start_location": {
|
354
|
+
"lat": -23.5763400,
|
355
|
+
"lng": -46.6409600
|
356
|
+
},
|
357
|
+
"end_location": {
|
358
|
+
"lat": -23.5712300,
|
359
|
+
"lng": -46.6441400
|
360
|
+
},
|
361
|
+
"polyline": {
|
362
|
+
"points": "bw{nC~pt{GqF|BaAPuOhGsD`F",
|
363
|
+
"levels": "B??@B"
|
364
|
+
},
|
365
|
+
"duration": {
|
366
|
+
"value": 88,
|
367
|
+
"text": "1 min"
|
368
|
+
},
|
369
|
+
"html_instructions": "Continue para \u003cb\u003eAv. Bernardino de Campos/Vd. Santa Generosa\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e650 m\u003c/b\u003e\u003c/span\u003e\u003cdiv style=\"font-size:0.9em\"\u003eContinue na Av. Bernardino de Campos\u003c/div\u003e",
|
370
|
+
"distance": {
|
371
|
+
"value": 666,
|
372
|
+
"text": "0,7 km"
|
373
|
+
}
|
374
|
+
}, {
|
375
|
+
"travel_mode": "DRIVING",
|
376
|
+
"start_location": {
|
377
|
+
"lat": -23.5712300,
|
378
|
+
"lng": -46.6441400
|
379
|
+
},
|
380
|
+
"end_location": {
|
381
|
+
"lat": -23.5706500,
|
382
|
+
"lng": -46.6449200
|
383
|
+
},
|
384
|
+
"polyline": {
|
385
|
+
"points": "dwznCzdu{GsBzC",
|
386
|
+
"levels": "BB"
|
387
|
+
},
|
388
|
+
"duration": {
|
389
|
+
"value": 30,
|
390
|
+
"text": "1 min"
|
391
|
+
},
|
392
|
+
"html_instructions": "Continue para \u003cb\u003eAv. Paulista\u003c/b\u003e \u003cspan style=\"white-space: nowrap\"\u003e- siga \u003cb\u003e100 m\u003c/b\u003e\u003c/span\u003e\u003cdiv style=\"font-size:0.9em\"\u003eO destino estará à direita\u003c/div\u003e",
|
393
|
+
"distance": {
|
394
|
+
"value": 103,
|
395
|
+
"text": "0,1 km"
|
396
|
+
}
|
397
|
+
} ],
|
398
|
+
"duration": {
|
399
|
+
"value": 992,
|
400
|
+
"text": "17 minutos"
|
401
|
+
},
|
402
|
+
"distance": {
|
403
|
+
"value": 10774,
|
404
|
+
"text": "10,8 km"
|
405
|
+
},
|
406
|
+
"start_location": {
|
407
|
+
"lat": -23.5962400,
|
408
|
+
"lng": -46.6879000
|
409
|
+
},
|
410
|
+
"end_location": {
|
411
|
+
"lat": -23.5706500,
|
412
|
+
"lng": -46.6449200
|
413
|
+
},
|
414
|
+
"start_address": "R. Tenerife, 31 - Itaim Bibi, São Paulo, 04548-040, Brasil",
|
415
|
+
"end_address": "Av. Paulista, 100 - Bela Vista, São Paulo, 01310-000, Brasil"
|
416
|
+
} ],
|
417
|
+
"copyrights": "Map data ©2010 MapLink",
|
418
|
+
"overview_polyline": {
|
419
|
+
"points": "ns_oCjv}{GtBv@xBuFtJ_YdKUb@XbGqHxCkCzAoBbA{@bAi@`O{Ft@k@|EwG|AaBrGoEvBgB~BsDx@iBbEuLrAyCfH{JzB}Db@uAh@sCfAoIb@{BxGkQnA]l@Xl@bAZx@?Z_@n@YJ{AIa@DoBcAcHkGsIiIwCaDaIwGwHaHgNyMgCiB{B_AcBa@sY{AeYgAuV{@kFFkAJmFhAq_@~MuCJgAGiAUqCqAkB}AeKiPaNkSoAuGkCcLyAaL}APcAVqF|BaAPuOhGgH|J",
|
420
|
+
"levels": "B@?@?@???@?@????@?????@????@??A???@??@????????@???@??@??@???@??@????@B"
|
421
|
+
},
|
422
|
+
"warnings": [ ],
|
423
|
+
"waypoint_order": [ ]
|
424
|
+
} ]
|
425
|
+
}
|
426
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe GoMaps::Address do
|
4
|
+
context 'on #exists?' do
|
5
|
+
it 'should return true given a valid address' do
|
6
|
+
address = 'Valid Address'
|
7
|
+
map_address_to_file address, 'address_success'
|
8
|
+
GoMaps::Address.new(address).exists?.should be_true
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should return false given an invalid address' do
|
12
|
+
address = 'Invalid Address'
|
13
|
+
map_address_to_file address, 'address_error'
|
14
|
+
GoMaps::Address.new(address).exists?.should be_false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'on #distance_to' do
|
19
|
+
it 'should return the distance given valid addresses' do
|
20
|
+
address1, address2 = 'Valid Address 1', 'Valid Address 2'
|
21
|
+
map_addresses_to_file address1, address2, 'distance_success_10.8'
|
22
|
+
GoMaps::Address.new(address1).distance_to(address2).should == 10.8
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should raise AddressNotFoundException given invalid addresses' do
|
26
|
+
address1, address2 = 'Invalid Address 1', 'Invalid Address 2'
|
27
|
+
map_addresses_to_file address1, address2, 'distance_error'
|
28
|
+
lambda { GoMaps::Address.new(address1).distance_to(address2) }.should raise_error(GoMaps::AddressNotFoundException)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'rubygems'
|
4
|
+
require 'go_maps'
|
5
|
+
require 'spec'
|
6
|
+
require 'spec/autorun'
|
7
|
+
require 'fakeweb'
|
8
|
+
|
9
|
+
Spec::Runner.configure do |config|
|
10
|
+
FakeWeb.allow_net_connect = false
|
11
|
+
end
|
12
|
+
|
13
|
+
def map_addresses_to_file(address1, address2, file_name)
|
14
|
+
map_query_string_to_file "origin=#{address1}&destination=#{address2}", file_name
|
15
|
+
end
|
16
|
+
|
17
|
+
def map_address_to_file(address, file_name)
|
18
|
+
map_query_string_to_file "address=#{address}", file_name
|
19
|
+
end
|
20
|
+
|
21
|
+
def map_query_string_to_file(query_string, file_name)
|
22
|
+
api = query_string.include?('destination') ? 'directions' : 'geocode'
|
23
|
+
map_url_to_file "http://maps.google.com/maps/api/#{api}/json?sensor=false&language=pt-BR&#{query_string}", file_name
|
24
|
+
end
|
25
|
+
|
26
|
+
def map_url_to_file(url, file_name)
|
27
|
+
FakeWeb.register_uri(:get, URI.escape(url), :body => File.open("#{File.dirname(__FILE__)}/data/#{file_name}").read)
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: go_maps
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Gonow
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-07-09 00:00:00 -03:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 2
|
30
|
+
- 9
|
31
|
+
version: 1.2.9
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: fakeweb
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 2
|
44
|
+
- 8
|
45
|
+
version: 1.2.8
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: crack
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
- 1
|
58
|
+
- 6
|
59
|
+
version: 0.1.6
|
60
|
+
type: :runtime
|
61
|
+
version_requirements: *id003
|
62
|
+
description: Ruby API to geographic operations
|
63
|
+
email:
|
64
|
+
executables: []
|
65
|
+
|
66
|
+
extensions: []
|
67
|
+
|
68
|
+
extra_rdoc_files:
|
69
|
+
- README.markdown
|
70
|
+
files:
|
71
|
+
- .gitignore
|
72
|
+
- README.markdown
|
73
|
+
- Rakefile
|
74
|
+
- lib/go_maps.rb
|
75
|
+
- lib/go_maps/address.rb
|
76
|
+
- lib/go_maps/address_not_found_exception.rb
|
77
|
+
- spec/data/address_error
|
78
|
+
- spec/data/address_success
|
79
|
+
- spec/data/distance_error
|
80
|
+
- spec/data/distance_success_10.8
|
81
|
+
- spec/go_maps/address_spec.rb
|
82
|
+
- spec/spec.opts
|
83
|
+
- spec/spec_helper.rb
|
84
|
+
has_rdoc: true
|
85
|
+
homepage: http://github.com/gonow/go_maps
|
86
|
+
licenses: []
|
87
|
+
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options:
|
90
|
+
- --charset=UTF-8
|
91
|
+
require_paths:
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
version: "0"
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
version: "0"
|
107
|
+
requirements: []
|
108
|
+
|
109
|
+
rubyforge_project:
|
110
|
+
rubygems_version: 1.3.6
|
111
|
+
signing_key:
|
112
|
+
specification_version: 3
|
113
|
+
summary: Ruby API to geographic operations
|
114
|
+
test_files:
|
115
|
+
- spec/go_maps/address_spec.rb
|
116
|
+
- spec/spec_helper.rb
|