Commit e3aaf966a804aa775883b1803bd4da6e81cf1f31
1 parent
83b2a192
Exists in
master
and in
29 other branches
Remove geokit, as finding by location is done by solr
Showing
36 changed files
with
0 additions
and
3374 deletions
Show diff stats
test/unit/product_test.rb
@@ -126,16 +126,6 @@ class ProductTest < ActiveSupport::TestCase | @@ -126,16 +126,6 @@ class ProductTest < ActiveSupport::TestCase | ||
126 | assert_in_delta 45.0, prod.lng, 0.0001 | 126 | assert_in_delta 45.0, prod.lng, 0.0001 |
127 | end | 127 | end |
128 | 128 | ||
129 | - should 'be searched by radius and distance' do | ||
130 | - prod1 = fast_create(Product, :name => 'prod test 1', :lat => 30.0, :lng => 30.0, :product_category_id => @product_category.id) | ||
131 | - prod2 = fast_create(Product, :name => 'prod test 2', :lat => 45.0, :lng => 45.0, :product_category_id => @product_category.id) | ||
132 | - | ||
133 | - prods = Product.find(:all, :within => 10, :origin => [30.0, 30.0]) | ||
134 | - | ||
135 | - assert_includes prods, prod1 | ||
136 | - assert_not_includes prods, prod2 | ||
137 | - end | ||
138 | - | ||
139 | should 'provide url' do | 129 | should 'provide url' do |
140 | product = Product.new | 130 | product = Product.new |
141 | 131 |
test/unit/profile_test.rb
@@ -439,12 +439,6 @@ class ProfileTest < ActiveSupport::TestCase | @@ -439,12 +439,6 @@ class ProfileTest < ActiveSupport::TestCase | ||
439 | assert_includes Enterprise.find_within(2, :origin => [45, 45]), e | 439 | assert_includes Enterprise.find_within(2, :origin => [45, 45]), e |
440 | end | 440 | end |
441 | 441 | ||
442 | - should 'have latitude and longitude and find' do | ||
443 | - e = fast_create(Enterprise, :lat => 45, :lng => 45) | ||
444 | - | ||
445 | - assert_includes Enterprise.find(:all, :within => 2, :origin => [45, 45]), e | ||
446 | - end | ||
447 | - | ||
448 | should 'have a public profile by default' do | 442 | should 'have a public profile by default' do |
449 | assert_equal true, Profile.new.public_profile | 443 | assert_equal true, Profile.new.public_profile |
450 | end | 444 | end |
vendor/plugins/geokit/MIT-LICENSE
@@ -1,20 +0,0 @@ | @@ -1,20 +0,0 @@ | ||
1 | -Copyright (c) 2007 Bill Eisenhauer & Andre Lewis | ||
2 | - | ||
3 | -Permission is hereby granted, free of charge, to any person obtaining | ||
4 | -a copy of this software and associated documentation files (the | ||
5 | -"Software"), to deal in the Software without restriction, including | ||
6 | -without limitation the rights to use, copy, modify, merge, publish, | ||
7 | -distribute, sublicense, and/or sell copies of the Software, and to | ||
8 | -permit persons to whom the Software is furnished to do so, subject to | ||
9 | -the following conditions: | ||
10 | - | ||
11 | -The above copyright notice and this permission notice shall be | ||
12 | -included in all copies or substantial portions of the Software. | ||
13 | - | ||
14 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
15 | -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
16 | -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
17 | -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | ||
18 | -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||
19 | -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||
20 | -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
21 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/README
@@ -1,451 +0,0 @@ | @@ -1,451 +0,0 @@ | ||
1 | -## FEATURE SUMMARY | ||
2 | - | ||
3 | -This plugin provides key functionality for location-oriented Rails applications: | ||
4 | - | ||
5 | -- Distance calculations, for both flat and spherical environments. For example, | ||
6 | - given the location of two points on the earth, you can calculate the miles/KM | ||
7 | - between them. | ||
8 | -- ActiveRecord distance-based finders. For example, you can find all the points | ||
9 | - in your database within a 50-mile radius. | ||
10 | -- Geocoding from multiple providers. It currently supports Google, Yahoo, | ||
11 | - Geocoder.us, and Geocoder.ca geocoders, and it provides a uniform response | ||
12 | - structure from all of them. It also provides a fail-over mechanism, in case | ||
13 | - your input fails to geocode in one service. | ||
14 | -- IP-based location lookup utilizing hostip.info. Provide an IP address, and get | ||
15 | - city name and latitude/longitude in return | ||
16 | -- A before_filter helper to geocoder the user's location based on IP address, | ||
17 | - and retain the location in a cookie. | ||
18 | - | ||
19 | -The goal of this plugin is to provide the common functionality for location-oriented | ||
20 | -applications (geocoding, location lookup, distance calculation) in an easy-to-use | ||
21 | -package. | ||
22 | - | ||
23 | -## A NOTE ON TERMINOLOGY | ||
24 | - | ||
25 | -Throughout the code and API of this, latitude and longitude are referred to as lat | ||
26 | -and lng. We've found over the long term the abbreviation saves lots of typing time. | ||
27 | - | ||
28 | -## DISTANCE CALCULATIONS AND QUERIES | ||
29 | - | ||
30 | -If you want only distance calculation services, you need only mix in the Mappable | ||
31 | -module like so: | ||
32 | - | ||
33 | - class Location | ||
34 | - include GeoKit::Mappable | ||
35 | - end | ||
36 | - | ||
37 | -After doing so, you can do things like: | ||
38 | - | ||
39 | - Location.distance_between(from, to) | ||
40 | - | ||
41 | -with optional parameters :units and :formula. Values for :units can be :miles or | ||
42 | -:kms with :miles as the default. Values for :formula can be :sphere or :flat with | ||
43 | -:sphere as the default. :sphere gives you Haversine calculations, while :flat | ||
44 | -gives the Pythagoreum Theory. These defaults persist through out the plug-in. | ||
45 | - | ||
46 | -You can also do: | ||
47 | - | ||
48 | - location.distance_to(other) | ||
49 | - | ||
50 | -The real power and utility of the plug-in is in its query support. This is | ||
51 | -achieved through mixing into an ActiveRecord model object: | ||
52 | - | ||
53 | - class Location < ActiveRecord::Base | ||
54 | - acts_as_mappable | ||
55 | - end | ||
56 | - | ||
57 | -The plug-in uses the above-mentioned defaults, but can be modified to use | ||
58 | -different units and a different formulae. This is done through the :default_units | ||
59 | -and :default_formula keys which accept the same values as mentioned above. | ||
60 | - | ||
61 | -The plug-in creates a calculated column and potentially a calculated condition. | ||
62 | -By default, these are known as "distance" but this can be changed through the | ||
63 | -:distance_field_name key. | ||
64 | - | ||
65 | -So, an alternative invocation would look as below: | ||
66 | - | ||
67 | - class Location < ActiveRecord::Base | ||
68 | - acts_as_mappable :default_units => :kms, | ||
69 | - :default_formula => :flat, | ||
70 | - :distance_field_name => :distance | ||
71 | - end | ||
72 | - | ||
73 | -You can also define alternative column names for latitude and longitude using | ||
74 | -the :lat_column_name and :lng_column_name keys. The defaults are 'lat' and | ||
75 | -'lng' respectively. | ||
76 | - | ||
77 | -Thereafter, a set of finder methods are made available. Below are the | ||
78 | -different combinations: | ||
79 | - | ||
80 | -Origin as a two-element array of latititude/longitude: | ||
81 | - | ||
82 | - find(:all, :origin => [37.792,-122.393]) | ||
83 | - | ||
84 | -Origin as a geocodeable string: | ||
85 | - | ||
86 | - find(:all, :origin => '100 Spear st, San Francisco, CA') | ||
87 | - | ||
88 | -Origin as an object which responds to lat and lng methods, | ||
89 | -or latitude and longitude methods, or whatever methods you have | ||
90 | -specified for lng_column_name and lat_column_name: | ||
91 | - | ||
92 | - find(:all, :origin=>my_store) # my_store.lat and my_store.lng methods exist | ||
93 | - | ||
94 | -Often you will need to find within a certain distance. The prefered syntax is: | ||
95 | - | ||
96 | - find(:all, :origin => @somewhere, :within => 5) | ||
97 | - | ||
98 | -. . . however these syntaxes will also work: | ||
99 | - | ||
100 | - find_within(5, :origin => @somewhere) | ||
101 | - find(:all, :origin => @somewhere, :conditions => "distance < 5") | ||
102 | - | ||
103 | -Note however that the third form should be avoided. With either of the first two, | ||
104 | -GeoKit automatically adds a bounding box to speed up the radial query in the database. | ||
105 | -With the third form, it does not. | ||
106 | - | ||
107 | -If you need to combine distance conditions with other conditions, you should do | ||
108 | -so like this: | ||
109 | - | ||
110 | - find(:all, :origin => @somewhere, :within => 5, :conditions=>['state=?',state]) | ||
111 | - | ||
112 | -If :origin is not provided in the finder call, the find method | ||
113 | -works as normal. Further, the key is removed | ||
114 | -from the :options hash prior to invoking the superclass behavior. | ||
115 | - | ||
116 | -Other convenience methods work intuitively and are as follows: | ||
117 | - | ||
118 | - find_within(distance, :origin => @somewhere) | ||
119 | - find_beyond(distance, :origin => @somewhere) | ||
120 | - find_closest(:origin => @somewhere) | ||
121 | - find_farthest(:origin => @somewhere) | ||
122 | - | ||
123 | -where the options respect the defaults, but can be overridden if | ||
124 | -desired. | ||
125 | - | ||
126 | -Lastly, if all that is desired is the raw SQL for distance | ||
127 | -calculations, you can use the following: | ||
128 | - | ||
129 | - distance_sql(origin, units=default_units, formula=default_formula) | ||
130 | - | ||
131 | -Thereafter, you are free to use it in find_by_sql as you wish. | ||
132 | - | ||
133 | -There are methods available to enable you to get the count based upon | ||
134 | -the find condition that you have provided. These all work similarly to | ||
135 | -the finders. So for instance: | ||
136 | - | ||
137 | - count(:origin, :conditions => "distance < 5") | ||
138 | - count_within(distance, :origin => @somewhere) | ||
139 | - count_beyond(distance, :origin => @somewhere) | ||
140 | - | ||
141 | -## FINDING WITHIN A BOUNDING BOX | ||
142 | - | ||
143 | -If you are displaying points on a map, you probably need to query for whatever falls within the rectangular bounds of the map: | ||
144 | - | ||
145 | - Store.find :all, :bounds=>[sw_point,ne_point] | ||
146 | - | ||
147 | -The input to :bounds can be array with the two points or a Bounds object. However you provide them, the order should always be the southwest corner, northeast corner of the rectangle. Typically, you will be getting the sw_point and ne_point from a map that is displayed on a web page. | ||
148 | - | ||
149 | -If you need to calculate the bounding box from a point and radius, you can do that: | ||
150 | - | ||
151 | - bounds=Bounds.from_point_and_radius(home,5) | ||
152 | - Store.find :all, :bounds=>bounds | ||
153 | - | ||
154 | -## USING INCLUDES | ||
155 | - | ||
156 | -You can use includes along with your distance finders: | ||
157 | - | ||
158 | - stores=Store.find :all, :origin=>home, :include=>[:reviews,:cities] :within=>5, :order=>'distance' | ||
159 | - | ||
160 | -*However*, ActiveRecord drops the calculated distance column when you use include. So, if you need to | ||
161 | -use the distance column, you'll have to re-calculate it post-query in Ruby: | ||
162 | - | ||
163 | - stores.sort_by_distance_from(home) | ||
164 | - | ||
165 | -In this case, you may want to just use the bounding box | ||
166 | -condition alone in your SQL (there's no use calculating the distance twice): | ||
167 | - | ||
168 | - bounds=Bounds.from_point_and_radius(home,5) | ||
169 | - stores=Store.find :all, :include=>[:reviews,:cities] :bounds=>bounds | ||
170 | - stores.sort_by_distance_from(home) | ||
171 | - | ||
172 | -## IP GEOCODING | ||
173 | - | ||
174 | -You can obtain the location for an IP at any time using the geocoder | ||
175 | -as in the following example: | ||
176 | - | ||
177 | - location = IpGeocoder.geocode('12.215.42.19') | ||
178 | - | ||
179 | -where Location is a GeoLoc instance containing the latitude, | ||
180 | -longitude, city, state, and country code. Also, the success | ||
181 | -value is true. | ||
182 | - | ||
183 | -If the IP cannot be geocoded, a GeoLoc instance is returned with a | ||
184 | -success value of false. | ||
185 | - | ||
186 | -It should be noted that the IP address needs to be visible to the | ||
187 | -Rails application. In other words, you need to ensure that the | ||
188 | -requesting IP address is forwarded by any front-end servers that | ||
189 | -are out in front of the Rails app. Otherwise, the IP will always | ||
190 | -be that of the front-end server. | ||
191 | - | ||
192 | -## IP GEOCODING HELPER | ||
193 | - | ||
194 | -A class method called geocode_ip_address has been mixed into the | ||
195 | -ActionController::Base. This enables before_filter style lookup of | ||
196 | -the IP address. Since it is a filter, it can accept any of the | ||
197 | -available filter options. | ||
198 | - | ||
199 | -Usage is as below: | ||
200 | - | ||
201 | - class LocationAwareController < ActionController::Base | ||
202 | - geocode_ip_address | ||
203 | - end | ||
204 | - | ||
205 | -A first-time lookup will result in the GeoLoc class being stored | ||
206 | -in the session as :geo_location as well as in a cookie called | ||
207 | -:geo_session. Subsequent lookups will use the session value if it | ||
208 | -exists or the cookie value if it doesn't exist. The last resort is | ||
209 | -to make a call to the web service. Clients are free to manage the | ||
210 | -cookie as they wish. | ||
211 | - | ||
212 | -The intent of this feature is to be able to provide a good guess as | ||
213 | -to a new visitor's location. | ||
214 | - | ||
215 | -## INTEGRATED FIND AND GEOCODING | ||
216 | - | ||
217 | -Geocoding has been integrated with the finders enabling you to pass | ||
218 | -a physical address or an IP address. This would look the following: | ||
219 | - | ||
220 | - Location.find_farthest(:origin => '217.15.10.9') | ||
221 | - Location.find_farthest(:origin => 'Irving, TX') | ||
222 | - | ||
223 | -where the IP or physical address would be geocoded to a location and | ||
224 | -then the resulting latitude and longitude coordinates would be used | ||
225 | -in the find. This is not expected to be common usage, but it can be | ||
226 | -done nevertheless. | ||
227 | - | ||
228 | -## ADDRESS GEOCODING | ||
229 | - | ||
230 | -GeoKit can geocode addresses using multiple geocodeing web services. | ||
231 | -Currently, GeoKit supports Google, Yahoo, and Geocoder.us geocoding | ||
232 | -services. | ||
233 | - | ||
234 | -These geocoder services are made available through three classes: | ||
235 | -GoogleGeocoder, YahooGeocoder, and UsGeocoder. Further, an additional | ||
236 | -geocoder class called MultiGeocoder incorporates an ordered failover | ||
237 | -sequence to increase the probability of successful geocoding. | ||
238 | - | ||
239 | -All classes are called using the following signature: | ||
240 | - | ||
241 | - include GeoKit::Geocoders | ||
242 | - location = XxxGeocoder.geocode(address) | ||
243 | - | ||
244 | -where you replace Xxx Geocoder with the appropriate class. A GeoLoc | ||
245 | -instance is the result of the call. This class has a "success" | ||
246 | -attribute which will be true if a successful geocoding occurred. | ||
247 | -If successful, the lat and lng properties will be populated. | ||
248 | - | ||
249 | -Geocoders are named with the naming convention NameGeocoder. This | ||
250 | -naming convention enables Geocoder to auto-detect its sub-classes | ||
251 | -in order to create methods called name_geocoder(address) so that | ||
252 | -all geocoders are called through the base class. This is done | ||
253 | -purely for convenience; the individual geocoder classes are expected | ||
254 | -to be used independently. | ||
255 | - | ||
256 | -The MultiGeocoder class requires the configuration of a provider | ||
257 | -order which dictates what order to use the various geocoders. Ordering | ||
258 | -is done through the PROVIDER_ORDER constant found in environment.rb. | ||
259 | - | ||
260 | -On installation, this plugin appends a template for your API keys to | ||
261 | -your environment.rb. | ||
262 | - | ||
263 | -Make sure your failover configuration matches the usage characteristics | ||
264 | -of your application -- for example, if you routinely get bogus input to | ||
265 | -geocode, your code will be much slower if you have to failover among | ||
266 | -multiple geocoders before determining that the input was in fact bogus. | ||
267 | - | ||
268 | -The Geocoder.geocode method returns a GeoLoc object. Basic usage: | ||
269 | - | ||
270 | - loc=Geocoder.geocode('100 Spear St, San Francisco, CA') | ||
271 | - if loc.success | ||
272 | - puts loc.lat | ||
273 | - puts loc.lng | ||
274 | - puts loc.full_address | ||
275 | - end | ||
276 | - | ||
277 | -## INTEGRATED FIND WITH ADDRESS GEOCODING | ||
278 | - | ||
279 | -Just has you can pass an IP address directly into an ActiveRecord finder | ||
280 | -as the origin, you can also pass a physical address as the origin: | ||
281 | - | ||
282 | - Location.find_closest(:origin => '100 Spear st, San Francisco, CA') | ||
283 | - | ||
284 | -where the physical address would be geocoded to a location and then the | ||
285 | -resulting latitude and longitude coordinates would be used in the | ||
286 | -find. | ||
287 | - | ||
288 | -Note that if the address fails to geocode, the find method will raise an | ||
289 | -ActiveRecord::GeocodeError you must be prepared to catch. Alternatively, | ||
290 | -You can geocoder the address beforehand, and pass the resulting lat/lng | ||
291 | -into the finder if successful. | ||
292 | - | ||
293 | -## Auto Geocoding | ||
294 | - | ||
295 | -If your geocoding needs are simple, you can tell your model to automatically | ||
296 | -geocode itself on create: | ||
297 | - | ||
298 | - class Store < ActiveRecord::Base | ||
299 | - acts_as_mappable :auto_geocode=>true | ||
300 | - end | ||
301 | - | ||
302 | -It takes two optional params: | ||
303 | - | ||
304 | - class Store < ActiveRecord::Base | ||
305 | - acts_as_mappable :auto_geocode=>{:field=>:address, :error_message=>'Could not geocode address'} | ||
306 | - end | ||
307 | - | ||
308 | -. . . which is equivilent to: | ||
309 | - | ||
310 | - class Store << ActiveRecord::Base | ||
311 | - acts_as_mappable | ||
312 | - before_validation_on_create :geocode_address | ||
313 | - | ||
314 | - private | ||
315 | - def geocode_address | ||
316 | - geo=GeoKit::Geocoders::MultiGeocoder.geocode (address) | ||
317 | - errors.add(:address, "Could not Geocode address") if !geo.success | ||
318 | - self.lat, self.lng = geo.lat,geo.lng if geo.success | ||
319 | - end | ||
320 | - end | ||
321 | - | ||
322 | -If you need any more complicated geocoding behavior for your model, you should roll your own | ||
323 | -before_validate callback. | ||
324 | - | ||
325 | - | ||
326 | -## Distances, headings, endpoints, and midpoints | ||
327 | - | ||
328 | - distance=home.distance_from(work, :units=>:miles) | ||
329 | - heading=home.heading_to(work) # result is in degrees, 0 is north | ||
330 | - endpoint=home.endpoint(90,2) # two miles due east | ||
331 | - midpoing=home.midpoint_to(work) | ||
332 | - | ||
333 | -## Cool stuff you can do with bounds | ||
334 | - | ||
335 | - bounds=Bounds.new(sw_point,ne_point) | ||
336 | - bounds.contains?(home) | ||
337 | - puts bounds.center | ||
338 | - | ||
339 | - | ||
340 | -HOW TO . . . | ||
341 | -================================================================================= | ||
342 | - | ||
343 | -## How to install the GeoKit plugin | ||
344 | - cd [APP_ROOT] | ||
345 | - ruby script/plugin install svn://rubyforge.org/var/svn/geokit/trunk | ||
346 | - or, to install as an external (your project must be version controlled): | ||
347 | - ruby script/plugin install -x svn://rubyforge.org/var/svn/geokit/trunk | ||
348 | - | ||
349 | -## How to find all stores within a 10-mile radius of a given lat/lng | ||
350 | -1. ensure your stores table has lat and lng columns with numeric or float | ||
351 | - datatypes to store your latitude/longitude | ||
352 | - | ||
353 | -3. use acts_as_mappable on your store model: | ||
354 | - class Store < ActiveRecord::Base | ||
355 | - acts_as_mappable | ||
356 | - ... | ||
357 | - end | ||
358 | -3. finders now have extra capabilities: | ||
359 | - Store.find(:all, :origin =>[32.951613,-96.958444], :within=>10) | ||
360 | - | ||
361 | -## How to geocode an address | ||
362 | - | ||
363 | -1. configure your geocoder key(s) in environment.rb | ||
364 | - | ||
365 | -2. also in environment.rb, make sure that PROVIDER_ORDER reflects the | ||
366 | - geocoder(s). If you only want to use one geocoder, there should | ||
367 | - be only one symbol in the array. For example: | ||
368 | - PROVIDER_ORDER=[:google] | ||
369 | - | ||
370 | -3. Test it out in script/console | ||
371 | - include GeoKit::Geocoders | ||
372 | - res = MultiGeocoder.geocode('100 Spear St, San Francisco, CA') | ||
373 | - puts res.lat | ||
374 | - puts res.lng | ||
375 | - puts res.full_address | ||
376 | - ... etc. The return type is GeoLoc, see the API for | ||
377 | - all the methods you can call on it. | ||
378 | - | ||
379 | -## How to find all stores within 10 miles of a given address | ||
380 | - | ||
381 | -1. as above, ensure your table has the lat/lng columns, and you've | ||
382 | - applied acts_as_mappable to the Store model. | ||
383 | - | ||
384 | -2. configure and test out your geocoder, as above | ||
385 | - | ||
386 | -3. pass the address in under the :origin key | ||
387 | - Store.find(:all, :origin=>'100 Spear st, San Francisco, CA', | ||
388 | - :within=>10) | ||
389 | - | ||
390 | -4. you can also use a zipcode, or anything else that's geocodable: | ||
391 | - Store.find(:all, :origin=>'94117', | ||
392 | - :conditions=>'distance<10') | ||
393 | - | ||
394 | -## How to sort a query by distance from an origin | ||
395 | - | ||
396 | -You now have access to a 'distance' column, and you can use it | ||
397 | -as you would any other column. For example: | ||
398 | - Store.find(:all, :origin=>'94117', :order=>'distance') | ||
399 | - | ||
400 | -## How to elements of an array according to distance from a common point | ||
401 | - | ||
402 | -Usually, you can do your sorting in the database as part of your find call. | ||
403 | -If you need to sort things post-query, you can do so: | ||
404 | - | ||
405 | - stores=Store.find :all | ||
406 | - stores.sort_by_distance_from(home) | ||
407 | - puts stores.first.distance | ||
408 | - | ||
409 | -Obviously, each of the items in the array must have a latitude/longitude so | ||
410 | -they can be sorted by distance. | ||
411 | - | ||
412 | -Database Compatability | ||
413 | -================================================================================= | ||
414 | -GeoKit does *not* work with SQLite, as it lacks the necessary geometry functions. | ||
415 | -GeoKit works with MySQL (tested with version 5.0.41) or PostgreSQL (tested with version 8.2.6) | ||
416 | -GeoKit is known to *not* work with Postgres <8.1 -- it uses the least() funciton. | ||
417 | - | ||
418 | - | ||
419 | -HIGH-LEVEL NOTES ON WHAT'S WHERE | ||
420 | -================================================================================= | ||
421 | - | ||
422 | -acts_as_mappable.rb, as you'd expect, contains the ActsAsMappable | ||
423 | -module which gets mixed into your models to provide the | ||
424 | -location-based finder goodness. | ||
425 | - | ||
426 | -mappable.rb contains the Mappable module, which provides basic | ||
427 | -distance calculation methods, i.e., calculating the distance | ||
428 | -between two points. | ||
429 | - | ||
430 | -mappable.rb also contains LatLng, GeoLoc, and Bounds. | ||
431 | -LatLng is a simple container for latitude and longitude, but | ||
432 | -it's made more powerful by mixing in the above-mentioned Mappable | ||
433 | -module -- therefore, you can calculate easily the distance between two | ||
434 | -LatLng ojbects with distance = first.distance_to(other) | ||
435 | - | ||
436 | -GeoLoc (also in mappable.rb) represents an address or location which | ||
437 | -has been geocoded. You can get the city, zipcode, street address, etc. | ||
438 | -from a GeoLoc object. GeoLoc extends LatLng, so you also get lat/lng | ||
439 | -AND the Mappable modeule goodness for free. | ||
440 | - | ||
441 | -geocoders.rb contains the geocoder classes. | ||
442 | - | ||
443 | -ip_geocode_lookup.rb contains the before_filter helper method which | ||
444 | -enables auto lookup of the requesting IP address. | ||
445 | - | ||
446 | -## IMPORTANT NOTE: We have appended to your environment.rb file | ||
447 | - | ||
448 | -Installation of this plugin has appended an API key template | ||
449 | -to your environment.rb file. You *must* add your own keys for the various | ||
450 | -geocoding services if you want to use geocoding. If you need to refer to the original | ||
451 | -template again, see the api_keys_template file in the root of the plugin. |
vendor/plugins/geokit/Rakefile
@@ -1,22 +0,0 @@ | @@ -1,22 +0,0 @@ | ||
1 | -require 'rake' | ||
2 | -require 'rake/testtask' | ||
3 | -require 'rake/rdoctask' | ||
4 | - | ||
5 | -desc 'Default: run unit tests.' | ||
6 | -task :default => :test | ||
7 | - | ||
8 | -desc 'Test the GeoKit plugin.' | ||
9 | -Rake::TestTask.new(:test) do |t| | ||
10 | - t.libs << 'lib' | ||
11 | - t.pattern = 'test/**/*_test.rb' | ||
12 | - t.verbose = true | ||
13 | -end | ||
14 | - | ||
15 | -desc 'Generate documentation for the GeoKit plugin.' | ||
16 | -Rake::RDocTask.new(:rdoc) do |rdoc| | ||
17 | - rdoc.rdoc_dir = 'rdoc' | ||
18 | - rdoc.title = 'GeoKit' | ||
19 | - rdoc.options << '--line-numbers' << '--inline-source' | ||
20 | - rdoc.rdoc_files.include('README') | ||
21 | - rdoc.rdoc_files.include('lib/**/*.rb') | ||
22 | -end | ||
23 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/VERSION_HISTORY.txt
@@ -1,4 +0,0 @@ | @@ -1,4 +0,0 @@ | ||
1 | -01/20/08 Version 1.0.1. Further fix of distance calculation, this time in SQL. Now uses least() function, which is available in MySQL version 3.22.5+ and postgres versions 8.1+ | ||
2 | -01/16/08 fixed the "zero-distance" bug (calculating between two points that are the same) | ||
3 | -12/11/07 fixed a small but with queries crossing meridian, and also fixed find(:closest) | ||
4 | -10/11/07 Fixed Rails2/Edge compatability | ||
5 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/about.yml
@@ -1,9 +0,0 @@ | @@ -1,9 +0,0 @@ | ||
1 | -author: | ||
2 | - name_1: Bill Eisenhauer | ||
3 | - homepage_1: http://blog.billeisenhauer.com | ||
4 | - name_2: Andre Lewis | ||
5 | - homepage_2: http://www.earthcode.com | ||
6 | -summary: Geo distance calculations, distance calculation query support, geocoding for physical and ip addresses. | ||
7 | -version: 1.0.1 | ||
8 | -rails_version: 1.0+ | ||
9 | -license: MIT | ||
10 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/assets/api_keys_template
@@ -1,50 +0,0 @@ | @@ -1,50 +0,0 @@ | ||
1 | -# These defaults are used in GeoKit::Mappable.distance_to and in acts_as_mappable | ||
2 | -GeoKit::default_units = :miles | ||
3 | -GeoKit::default_formula = :sphere | ||
4 | - | ||
5 | -# This is the timeout value in seconds to be used for calls to the geocoder web | ||
6 | -# services. For no timeout at all, comment out the setting. The timeout unit | ||
7 | -# is in seconds. | ||
8 | -GeoKit::Geocoders::timeout = 3 | ||
9 | - | ||
10 | -# These settings are used if web service calls must be routed through a proxy. | ||
11 | -# These setting can be nil if not needed, otherwise, addr and port must be | ||
12 | -# filled in at a minimum. If the proxy requires authentication, the username | ||
13 | -# and password can be provided as well. | ||
14 | -GeoKit::Geocoders::proxy_addr = nil | ||
15 | -GeoKit::Geocoders::proxy_port = nil | ||
16 | -GeoKit::Geocoders::proxy_user = nil | ||
17 | -GeoKit::Geocoders::proxy_pass = nil | ||
18 | - | ||
19 | -# This is your yahoo application key for the Yahoo Geocoder. | ||
20 | -# See http://developer.yahoo.com/faq/index.html#appid | ||
21 | -# and http://developer.yahoo.com/maps/rest/V1/geocode.html | ||
22 | -GeoKit::Geocoders::yahoo = 'REPLACE_WITH_YOUR_YAHOO_KEY' | ||
23 | - | ||
24 | -# This is your Google Maps geocoder key. | ||
25 | -# See http://www.google.com/apis/maps/signup.html | ||
26 | -# and http://www.google.com/apis/maps/documentation/#Geocoding_Examples | ||
27 | -GeoKit::Geocoders::google = 'REPLACE_WITH_YOUR_GOOGLE_KEY' | ||
28 | - | ||
29 | -# This is your username and password for geocoder.us. | ||
30 | -# To use the free service, the value can be set to nil or false. For | ||
31 | -# usage tied to an account, the value should be set to username:password. | ||
32 | -# See http://geocoder.us | ||
33 | -# and http://geocoder.us/user/signup | ||
34 | -GeoKit::Geocoders::geocoder_us = false | ||
35 | - | ||
36 | -# This is your authorization key for geocoder.ca. | ||
37 | -# To use the free service, the value can be set to nil or false. For | ||
38 | -# usage tied to an account, set the value to the key obtained from | ||
39 | -# Geocoder.ca. | ||
40 | -# See http://geocoder.ca | ||
41 | -# and http://geocoder.ca/?register=1 | ||
42 | -GeoKit::Geocoders::geocoder_ca = false | ||
43 | - | ||
44 | -# This is the order in which the geocoders are called in a failover scenario | ||
45 | -# If you only want to use a single geocoder, put a single symbol in the array. | ||
46 | -# Valid symbols are :google, :yahoo, :us, and :ca. | ||
47 | -# Be aware that there are Terms of Use restrictions on how you can use the | ||
48 | -# various geocoders. Make sure you read up on relevant Terms of Use for each | ||
49 | -# geocoder you are going to use. | ||
50 | -GeoKit::Geocoders::provider_order = [:google,:us] | ||
51 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/init.rb
@@ -1,14 +0,0 @@ | @@ -1,14 +0,0 @@ | ||
1 | -# Load modules and classes needed to automatically mix in ActiveRecord and | ||
2 | -# ActionController helpers. All other functionality must be explicitly | ||
3 | -# required. | ||
4 | -require 'geo_kit/defaults' | ||
5 | -require 'geo_kit/mappable' | ||
6 | -require 'geo_kit/acts_as_mappable' | ||
7 | -require 'geo_kit/ip_geocode_lookup' | ||
8 | -require 'geo_kit/sqlite_extension' | ||
9 | - | ||
10 | -# Automatically mix in distance finder support into ActiveRecord classes. | ||
11 | -ActiveRecord::Base.send :include, GeoKit::ActsAsMappable | ||
12 | - | ||
13 | -# Automatically mix in ip geocoding helpers into ActionController classes. | ||
14 | -ActionController::Base.send :include, GeoKit::IpGeocodeLookup |
vendor/plugins/geokit/install.rb
@@ -1,7 +0,0 @@ | @@ -1,7 +0,0 @@ | ||
1 | -# Display to the console the contents of the README file. | ||
2 | -puts IO.read(File.join(File.dirname(__FILE__), 'README')) | ||
3 | - | ||
4 | -# Append the contents of api_keys_template to the application's environment.rb file | ||
5 | -environment_rb = File.open(File.expand_path(File.join(File.dirname(__FILE__), '../../../config/environment.rb')), "a") | ||
6 | -environment_rb.puts IO.read(File.join(File.dirname(__FILE__), '/assets/api_keys_template')) | ||
7 | -environment_rb.close |
vendor/plugins/geokit/lib/geo_kit/acts_as_mappable.rb
@@ -1,446 +0,0 @@ | @@ -1,446 +0,0 @@ | ||
1 | -module GeoKit | ||
2 | - # Contains the class method acts_as_mappable targeted to be mixed into ActiveRecord. | ||
3 | - # When mixed in, augments find services such that they provide distance calculation | ||
4 | - # query services. The find method accepts additional options: | ||
5 | - # | ||
6 | - # * :origin - can be | ||
7 | - # 1. a two-element array of latititude/longitude -- :origin=>[37.792,-122.393] | ||
8 | - # 2. a geocodeable string -- :origin=>'100 Spear st, San Francisco, CA' | ||
9 | - # 3. an object which responds to lat and lng methods, or latitude and longitude methods, | ||
10 | - # or whatever methods you have specified for lng_column_name and lat_column_name | ||
11 | - # | ||
12 | - # Other finder methods are provided for specific queries. These are: | ||
13 | - # | ||
14 | - # * find_within (alias: find_inside) | ||
15 | - # * find_beyond (alias: find_outside) | ||
16 | - # * find_closest (alias: find_nearest) | ||
17 | - # * find_farthest | ||
18 | - # | ||
19 | - # Counter methods are available and work similarly to finders. | ||
20 | - # | ||
21 | - # If raw SQL is desired, the distance_sql method can be used to obtain SQL appropriate | ||
22 | - # to use in a find_by_sql call. | ||
23 | - module ActsAsMappable | ||
24 | - # Mix below class methods into ActiveRecord. | ||
25 | - def self.included(base) # :nodoc: | ||
26 | - base.extend ClassMethods | ||
27 | - end | ||
28 | - | ||
29 | - # Class method to mix into active record. | ||
30 | - module ClassMethods # :nodoc: | ||
31 | - # Class method to bring distance query support into ActiveRecord models. By default | ||
32 | - # uses :miles for distance units and performs calculations based upon the Haversine | ||
33 | - # (sphere) formula. These can be changed by setting GeoKit::default_units and | ||
34 | - # GeoKit::default_formula. Also, by default, uses lat, lng, and distance for respective | ||
35 | - # column names. All of these can be overridden using the :default_units, :default_formula, | ||
36 | - # :lat_column_name, :lng_column_name, and :distance_column_name hash keys. | ||
37 | - # | ||
38 | - # Can also use to auto-geocode a specific column on create. Syntax; | ||
39 | - # | ||
40 | - # acts_as_mappable :auto_geocode=>true | ||
41 | - # | ||
42 | - # By default, it tries to geocode the "address" field. Or, for more customized behavior: | ||
43 | - # | ||
44 | - # acts_as_mappable :auto_geocode=>{:field=>:address,:error_message=>'bad address'} | ||
45 | - # | ||
46 | - # In both cases, it creates a before_validation_on_create callback to geocode the given column. | ||
47 | - # For anything more customized, we recommend you forgo the auto_geocode option | ||
48 | - # and create your own AR callback to handle geocoding. | ||
49 | - def acts_as_mappable(options = {}) | ||
50 | - # Mix in the module, but ensure to do so just once. | ||
51 | - return if self.included_modules.include?(GeoKit::ActsAsMappable::InstanceMethods) | ||
52 | - send :include, GeoKit::ActsAsMappable::InstanceMethods | ||
53 | - # include the Mappable module. | ||
54 | - send :include, Mappable | ||
55 | - | ||
56 | - # Handle class variables. | ||
57 | - cattr_accessor :distance_column_name, :default_units, :default_formula, :lat_column_name, :lng_column_name, :qualified_lat_column_name, :qualified_lng_column_name | ||
58 | - self.distance_column_name = options[:distance_column_name] || 'distance' | ||
59 | - self.default_units = options[:default_units] || GeoKit::default_units | ||
60 | - self.default_formula = options[:default_formula] || GeoKit::default_formula | ||
61 | - self.lat_column_name = options[:lat_column_name] || 'lat' | ||
62 | - self.lng_column_name = options[:lng_column_name] || 'lng' | ||
63 | - self.qualified_lat_column_name = "#{table_name}.#{lat_column_name}" | ||
64 | - self.qualified_lng_column_name = "#{table_name}.#{lng_column_name}" | ||
65 | - if options.include?(:auto_geocode) && options[:auto_geocode] | ||
66 | - # if the form auto_geocode=>true is used, let the defaults take over by suppling an empty hash | ||
67 | - options[:auto_geocode] = {} if options[:auto_geocode] == true | ||
68 | - cattr_accessor :auto_geocode_field, :auto_geocode_error_message | ||
69 | - self.auto_geocode_field = options[:auto_geocode][:field] || 'address' | ||
70 | - self.auto_geocode_error_message = options[:auto_geocode][:error_message] || 'could not locate address' | ||
71 | - | ||
72 | - # set the actual callback here | ||
73 | - before_validation_on_create :auto_geocode_address | ||
74 | - end | ||
75 | - end | ||
76 | - end | ||
77 | - | ||
78 | - # this is the callback for auto_geocoding | ||
79 | - def auto_geocode_address | ||
80 | - address=self.send(auto_geocode_field) | ||
81 | - geo=GeoKit::Geocoders::MultiGeocoder.geocode(address) | ||
82 | - | ||
83 | - if geo.success | ||
84 | - self.send("#{lat_column_name}=", geo.lat) | ||
85 | - self.send("#{lng_column_name}=", geo.lng) | ||
86 | - else | ||
87 | - errors.add(auto_geocode_field, auto_geocode_error_message) | ||
88 | - end | ||
89 | - | ||
90 | - geo.success | ||
91 | - end | ||
92 | - | ||
93 | - # Instance methods to mix into ActiveRecord. | ||
94 | - module InstanceMethods #:nodoc: | ||
95 | - # Mix class methods into module. | ||
96 | - def self.included(base) # :nodoc: | ||
97 | - base.extend SingletonMethods | ||
98 | - end | ||
99 | - | ||
100 | - # Class singleton methods to mix into ActiveRecord. | ||
101 | - module SingletonMethods # :nodoc: | ||
102 | - # Extends the existing find method in potentially two ways: | ||
103 | - # - If a mappable instance exists in the options, adds a distance column. | ||
104 | - # - If a mappable instance exists in the options and the distance column exists in the | ||
105 | - # conditions, substitutes the distance sql for the distance column -- this saves | ||
106 | - # having to write the gory SQL. | ||
107 | - def find(*args) | ||
108 | - prepare_for_find_or_count(:find, args) | ||
109 | - super(*args) | ||
110 | - end | ||
111 | - | ||
112 | - # Extends the existing count method by: | ||
113 | - # - If a mappable instance exists in the options and the distance column exists in the | ||
114 | - # conditions, substitutes the distance sql for the distance column -- this saves | ||
115 | - # having to write the gory SQL. | ||
116 | - def count(*args) | ||
117 | - prepare_for_find_or_count(:count, args) | ||
118 | - super(*args) | ||
119 | - end | ||
120 | - | ||
121 | - # Finds within a distance radius. | ||
122 | - def find_within(distance, options={}) | ||
123 | - options[:within] = distance | ||
124 | - find(:all, options) | ||
125 | - end | ||
126 | - alias find_inside find_within | ||
127 | - | ||
128 | - # Finds beyond a distance radius. | ||
129 | - def find_beyond(distance, options={}) | ||
130 | - options[:beyond] = distance | ||
131 | - find(:all, options) | ||
132 | - end | ||
133 | - alias find_outside find_beyond | ||
134 | - | ||
135 | - # Finds according to a range. Accepts inclusive or exclusive ranges. | ||
136 | - def find_by_range(range, options={}) | ||
137 | - options[:range] = range | ||
138 | - find(:all, options) | ||
139 | - end | ||
140 | - | ||
141 | - # Finds the closest to the origin. | ||
142 | - def find_closest(options={}) | ||
143 | - find(:nearest, options) | ||
144 | - end | ||
145 | - alias find_nearest find_closest | ||
146 | - | ||
147 | - # Finds the farthest from the origin. | ||
148 | - def find_farthest(options={}) | ||
149 | - find(:farthest, options) | ||
150 | - end | ||
151 | - | ||
152 | - # Finds within rectangular bounds (sw,ne). | ||
153 | - def find_within_bounds(bounds, options={}) | ||
154 | - options[:bounds] = bounds | ||
155 | - find(:all, options) | ||
156 | - end | ||
157 | - | ||
158 | - # counts within a distance radius. | ||
159 | - def count_within(distance, options={}) | ||
160 | - options[:within] = distance | ||
161 | - count(options) | ||
162 | - end | ||
163 | - alias count_inside count_within | ||
164 | - | ||
165 | - # Counts beyond a distance radius. | ||
166 | - def count_beyond(distance, options={}) | ||
167 | - options[:beyond] = distance | ||
168 | - count(options) | ||
169 | - end | ||
170 | - alias count_outside count_beyond | ||
171 | - | ||
172 | - # Counts according to a range. Accepts inclusive or exclusive ranges. | ||
173 | - def count_by_range(range, options={}) | ||
174 | - options[:range] = range | ||
175 | - count(options) | ||
176 | - end | ||
177 | - | ||
178 | - # Finds within rectangular bounds (sw,ne). | ||
179 | - def count_within_bounds(bounds, options={}) | ||
180 | - options[:bounds] = bounds | ||
181 | - count(options) | ||
182 | - end | ||
183 | - | ||
184 | - # Returns the distance calculation to be used as a display column or a condition. This | ||
185 | - # is provide for anyone wanting access to the raw SQL. | ||
186 | - def distance_sql(origin, units=default_units, formula=default_formula) | ||
187 | - case formula | ||
188 | - when :sphere | ||
189 | - sql = sphere_distance_sql(origin, units) | ||
190 | - when :flat | ||
191 | - sql = flat_distance_sql(origin, units) | ||
192 | - end | ||
193 | - sql | ||
194 | - end | ||
195 | - | ||
196 | - private | ||
197 | - | ||
198 | - # Prepares either a find or a count action by parsing through the options and | ||
199 | - # conditionally adding to the select clause for finders. | ||
200 | - def prepare_for_find_or_count(action, args) | ||
201 | - options = defined?(args.extract_options!) ? args.extract_options! : extract_options_from_args!(args) | ||
202 | - # Obtain items affecting distance condition. | ||
203 | - origin = extract_origin_from_options(options) | ||
204 | - units = extract_units_from_options(options) | ||
205 | - formula = extract_formula_from_options(options) | ||
206 | - bounds = extract_bounds_from_options(options) | ||
207 | - # if no explicit bounds were given, try formulating them from the point and distance given | ||
208 | - bounds = formulate_bounds_from_distance(options, origin, units) unless bounds | ||
209 | - # Apply select adjustments based upon action. | ||
210 | - add_distance_to_select(options, origin, units, formula) if origin && action == :find | ||
211 | - # Apply the conditions for a bounding rectangle if applicable | ||
212 | - apply_bounds_conditions(options,bounds) if bounds | ||
213 | - # Apply distance scoping and perform substitutions. | ||
214 | - apply_distance_scope(options) | ||
215 | - substitute_distance_in_conditions(options, origin, units, formula) if origin && options.has_key?(:conditions) | ||
216 | - # Order by scoping for find action. | ||
217 | - apply_find_scope(args, options) if action == :find | ||
218 | - # Unfortunatley, we need to do extra work if you use an :include. See the method for more info. | ||
219 | - handle_order_with_include(options,origin,units,formula) if options.include?(:include) && options.include?(:order) && origin | ||
220 | - # Restore options minus the extra options that we used for the | ||
221 | - # GeoKit API. | ||
222 | - args.push(options) | ||
223 | - end | ||
224 | - | ||
225 | - # If we're here, it means that 1) an origin argument, 2) an :include, 3) an :order clause were supplied. | ||
226 | - # Now we have to sub some SQL into the :order clause. The reason is that when you do an :include, | ||
227 | - # ActiveRecord drops the psuedo-column (specificically, distance) which we supplied for :select. | ||
228 | - # So, the 'distance' column isn't available for the :order clause to reference when we use :include. | ||
229 | - def handle_order_with_include(options, origin, units, formula) | ||
230 | - # replace the distance_column_name with the distance sql in order clause | ||
231 | - options[:order].sub!(distance_column_name, distance_sql(origin, units, formula)) | ||
232 | - end | ||
233 | - | ||
234 | - # Looks for mapping-specific tokens and makes appropriate translations so that the | ||
235 | - # original finder has its expected arguments. Resets the the scope argument to | ||
236 | - # :first and ensures the limit is set to one. | ||
237 | - def apply_find_scope(args, options) | ||
238 | - case args.first | ||
239 | - when :nearest, :closest | ||
240 | - args[0] = :first | ||
241 | - options[:limit] = 1 | ||
242 | - options[:order] = "#{distance_column_name} ASC" | ||
243 | - when :farthest | ||
244 | - args[0] = :first | ||
245 | - options[:limit] = 1 | ||
246 | - options[:order] = "#{distance_column_name} DESC" | ||
247 | - end | ||
248 | - end | ||
249 | - | ||
250 | - # If it's a :within query, add a bounding box to improve performance. | ||
251 | - # This only gets called if a :bounds argument is not otherwise supplied. | ||
252 | - def formulate_bounds_from_distance(options, origin, units) | ||
253 | - distance = options[:within] if options.has_key?(:within) | ||
254 | - distance = options[:range].last-(options[:range].exclude_end?? 1 : 0) if options.has_key?(:range) | ||
255 | - if distance | ||
256 | - res=GeoKit::Bounds.from_point_and_radius(origin,distance,:units=>units) | ||
257 | - else | ||
258 | - nil | ||
259 | - end | ||
260 | - end | ||
261 | - | ||
262 | - # Replace :within, :beyond and :range distance tokens with the appropriate distance | ||
263 | - # where clauses. Removes these tokens from the options hash. | ||
264 | - def apply_distance_scope(options) | ||
265 | - distance_condition = "#{distance_column_name} <= #{options[:within]}" if options.has_key?(:within) | ||
266 | - distance_condition = "#{distance_column_name} > #{options[:beyond]}" if options.has_key?(:beyond) | ||
267 | - distance_condition = "#{distance_column_name} >= #{options[:range].first} AND #{distance_column_name} <#{'=' unless options[:range].exclude_end?} #{options[:range].last}" if options.has_key?(:range) | ||
268 | - [:within, :beyond, :range].each { |option| options.delete(option) } if distance_condition | ||
269 | - | ||
270 | - options[:conditions]=augment_conditions(options[:conditions],distance_condition) if distance_condition | ||
271 | - end | ||
272 | - | ||
273 | - # This method lets you transparently add a new condition to a query without | ||
274 | - # worrying about whether it currently has conditions, or what kind of conditions they are | ||
275 | - # (string or array). | ||
276 | - # | ||
277 | - # Takes the current conditions (which can be an array or a string, or can be nil/false), | ||
278 | - # and a SQL string. It inserts the sql into the existing conditions, and returns new conditions | ||
279 | - # (which can be a string or an array | ||
280 | - def augment_conditions(current_conditions,sql) | ||
281 | - if current_conditions && current_conditions.is_a?(String) | ||
282 | - res="#{current_conditions} AND #{sql}" | ||
283 | - elsif current_conditions && current_conditions.is_a?(Array) | ||
284 | - current_conditions[0]="#{current_conditions[0]} AND #{sql}" | ||
285 | - res=current_conditions | ||
286 | - else | ||
287 | - res=sql | ||
288 | - end | ||
289 | - res | ||
290 | - end | ||
291 | - | ||
292 | - # Alters the conditions to include rectangular bounds conditions. | ||
293 | - def apply_bounds_conditions(options,bounds) | ||
294 | - sw,ne=bounds.sw,bounds.ne | ||
295 | - lng_sql= bounds.crosses_meridian? ? "(#{qualified_lng_column_name}<#{sw.lng} OR #{qualified_lng_column_name}>#{ne.lng})" : "#{qualified_lng_column_name}>#{sw.lng} AND #{qualified_lng_column_name}<#{ne.lng}" | ||
296 | - bounds_sql="#{qualified_lat_column_name}>#{sw.lat} AND #{qualified_lat_column_name}<#{ne.lat} AND #{lng_sql}" | ||
297 | - options[:conditions]=augment_conditions(options[:conditions],bounds_sql) | ||
298 | - end | ||
299 | - | ||
300 | - # Extracts the origin instance out of the options if it exists and returns | ||
301 | - # it. If there is no origin, looks for latitude and longitude values to | ||
302 | - # create an origin. The side-effect of the method is to remove these | ||
303 | - # option keys from the hash. | ||
304 | - def extract_origin_from_options(options) | ||
305 | - origin = options.delete(:origin) | ||
306 | - res = normalize_point_to_lat_lng(origin) if origin | ||
307 | - res | ||
308 | - end | ||
309 | - | ||
310 | - # Extract the units out of the options if it exists and returns it. If | ||
311 | - # there is no :units key, it uses the default. The side effect of the | ||
312 | - # method is to remove the :units key from the options hash. | ||
313 | - def extract_units_from_options(options) | ||
314 | - units = options[:units] || default_units | ||
315 | - options.delete(:units) | ||
316 | - units | ||
317 | - end | ||
318 | - | ||
319 | - # Extract the formula out of the options if it exists and returns it. If | ||
320 | - # there is no :formula key, it uses the default. The side effect of the | ||
321 | - # method is to remove the :formula key from the options hash. | ||
322 | - def extract_formula_from_options(options) | ||
323 | - formula = options[:formula] || default_formula | ||
324 | - options.delete(:formula) | ||
325 | - formula | ||
326 | - end | ||
327 | - | ||
328 | - def extract_bounds_from_options(options) | ||
329 | - bounds = options.delete(:bounds) | ||
330 | - bounds = GeoKit::Bounds.normalize(bounds) if bounds | ||
331 | - end | ||
332 | - | ||
333 | - # Geocode IP address. | ||
334 | - def geocode_ip_address(origin) | ||
335 | - geo_location = GeoKit::Geocoders::IpGeocoder.geocode(origin) | ||
336 | - return geo_location if geo_location.success | ||
337 | - raise GeoKit::Geocoders::GeocodeError | ||
338 | - end | ||
339 | - | ||
340 | - | ||
341 | - # Given a point in a variety of (an address to geocode, | ||
342 | - # an array of [lat,lng], or an object with appropriate lat/lng methods, an IP addres) | ||
343 | - # this method will normalize it into a GeoKit::LatLng instance. The only thing this | ||
344 | - # method adds on top of LatLng#normalize is handling of IP addresses | ||
345 | - def normalize_point_to_lat_lng(point) | ||
346 | - res = geocode_ip_address(point) if point.is_a?(String) && /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?$/.match(point) | ||
347 | - res = GeoKit::LatLng.normalize(point) unless res | ||
348 | - res | ||
349 | - end | ||
350 | - | ||
351 | - # Augments the select with the distance SQL. | ||
352 | - def add_distance_to_select(options, origin, units=default_units, formula=default_formula) | ||
353 | - if origin | ||
354 | - distance_selector = distance_sql(origin, units, formula) + " AS #{distance_column_name}" | ||
355 | - selector = options.has_key?(:select) && options[:select] ? options[:select] : "*" | ||
356 | - options[:select] = "#{selector}, #{distance_selector}" | ||
357 | - end | ||
358 | - end | ||
359 | - | ||
360 | - # Looks for the distance column and replaces it with the distance sql. If an origin was not | ||
361 | - # passed in and the distance column exists, we leave it to be flagged as bad SQL by the database. | ||
362 | - # Conditions are either a string or an array. In the case of an array, the first entry contains | ||
363 | - # the condition. | ||
364 | - def substitute_distance_in_conditions(options, origin, units=default_units, formula=default_formula) | ||
365 | - original_conditions = options[:conditions] | ||
366 | - condition = original_conditions.is_a?(String) ? original_conditions : original_conditions.first | ||
367 | - pattern = Regexp.new("\s*#{distance_column_name}(\s<>=)*") | ||
368 | - condition = condition.gsub(pattern, distance_sql(origin, units, formula)) | ||
369 | - original_conditions = condition if original_conditions.is_a?(String) | ||
370 | - original_conditions[0] = condition if original_conditions.is_a?(Array) | ||
371 | - options[:conditions] = original_conditions | ||
372 | - end | ||
373 | - | ||
374 | - # Returns the distance SQL using the spherical world formula (Haversine). The SQL is tuned | ||
375 | - # to the database in use. | ||
376 | - def sphere_distance_sql(origin, units) | ||
377 | - lat = deg2rad(origin.lat) | ||
378 | - lng = deg2rad(origin.lng) | ||
379 | - multiplier = units_sphere_multiplier(units) | ||
380 | - case connection.adapter_name.downcase | ||
381 | - when "mysql" | ||
382 | - sql=<<-SQL_END | ||
383 | - (ACOS(least(1,COS(#{lat})*COS(#{lng})*COS(RADIANS(#{qualified_lat_column_name}))*COS(RADIANS(#{qualified_lng_column_name}))+ | ||
384 | - COS(#{lat})*SIN(#{lng})*COS(RADIANS(#{qualified_lat_column_name}))*SIN(RADIANS(#{qualified_lng_column_name}))+ | ||
385 | - SIN(#{lat})*SIN(RADIANS(#{qualified_lat_column_name}))))*#{multiplier}) | ||
386 | - SQL_END | ||
387 | - when "postgresql" | ||
388 | - sql=<<-SQL_END | ||
389 | - (ACOS(least(1,COS(#{lat})*COS(#{lng})*COS(RADIANS(#{qualified_lat_column_name}))*COS(RADIANS(#{qualified_lng_column_name}))+ | ||
390 | - COS(#{lat})*SIN(#{lng})*COS(RADIANS(#{qualified_lat_column_name}))*SIN(RADIANS(#{qualified_lng_column_name}))+ | ||
391 | - SIN(#{lat})*SIN(RADIANS(#{qualified_lat_column_name}))))*#{multiplier}) | ||
392 | - SQL_END | ||
393 | - when "sqlite" | ||
394 | - # The /1.0 in the end is to force the convertion to float | ||
395 | - sql=<<-SQL_END | ||
396 | - (SPHERIC_DISTANCE(#{lat},#{lng},RADIANS(#{qualified_lat_column_name}),RADIANS(#{qualified_lng_column_name}),#{multiplier})/1.0) | ||
397 | - SQL_END | ||
398 | - else | ||
399 | - sql = "unhandled #{connection.adapter_name.downcase} adapter" | ||
400 | - end | ||
401 | - end | ||
402 | - | ||
403 | - # Returns the distance SQL using the flat-world formula (Phythagorean Theory). The SQL is tuned | ||
404 | - # to the database in use. | ||
405 | - def flat_distance_sql(origin, units) | ||
406 | - lat_degree_units = units_per_latitude_degree(units) | ||
407 | - lng_degree_units = units_per_longitude_degree(origin.lat, units) | ||
408 | - case connection.adapter_name.downcase | ||
409 | - when "mysql" | ||
410 | - sql=<<-SQL_END | ||
411 | - SQRT(POW(#{lat_degree_units}*(#{origin.lat}-#{qualified_lat_column_name}),2)+ | ||
412 | - POW(#{lng_degree_units}*(#{origin.lng}-#{qualified_lng_column_name}),2)) | ||
413 | - SQL_END | ||
414 | - when "postgresql" | ||
415 | - sql=<<-SQL_END | ||
416 | - SQRT(POW(#{lat_degree_units}*(#{origin.lat}-#{qualified_lat_column_name}),2)+ | ||
417 | - POW(#{lng_degree_units}*(#{origin.lng}-#{qualified_lng_column_name}),2)) | ||
418 | - SQL_END | ||
419 | - when "sqlite" | ||
420 | - sql=<<-SQL_END | ||
421 | - (SQRT(POW(#{lat_degree_units}*(#{origin.lat}-#{qualified_lat_column_name}),2)+ | ||
422 | - POW(#{lng_degree_units}*(#{origin.lng}-#{qualified_lng_column_name}),2))/1.0) | ||
423 | - SQL_END | ||
424 | - else | ||
425 | - sql = "unhandled #{connection.adapter_name.downcase} adapter" | ||
426 | - end | ||
427 | - end | ||
428 | - end | ||
429 | - end | ||
430 | - end | ||
431 | -end | ||
432 | - | ||
433 | -# Extend Array with a sort_by_distance method. | ||
434 | -# This method creates a "distance" attribute on each object, | ||
435 | -# calculates the distance from the passed origin, | ||
436 | -# and finally sorts the array by the resulting distance. | ||
437 | -class Array | ||
438 | - def sort_by_distance_from(origin, opts={}) | ||
439 | - distance_attribute_name = opts.delete(:distance_attribute_name) || 'distance' | ||
440 | - self.each do |e| | ||
441 | - e.class.send(:attr_accessor, distance_attribute_name) if !e.respond_to? "#{distance_attribute_name}=" | ||
442 | - e.send("#{distance_attribute_name}=", origin.distance_to(e,opts)) | ||
443 | - end | ||
444 | - self.sort!{|a,b|a.send(distance_attribute_name) <=> b.send(distance_attribute_name)} | ||
445 | - end | ||
446 | -end |
vendor/plugins/geokit/lib/geo_kit/defaults.rb
@@ -1,21 +0,0 @@ | @@ -1,21 +0,0 @@ | ||
1 | -module GeoKit | ||
2 | - # These defaults are used in GeoKit::Mappable.distance_to and in acts_as_mappable | ||
3 | - @@default_units = :miles | ||
4 | - @@default_formula = :sphere | ||
5 | - | ||
6 | - [:default_units, :default_formula].each do |sym| | ||
7 | - class_eval <<-EOS, __FILE__, __LINE__ | ||
8 | - def self.#{sym} | ||
9 | - if defined?(#{sym.to_s.upcase}) | ||
10 | - #{sym.to_s.upcase} | ||
11 | - else | ||
12 | - @@#{sym} | ||
13 | - end | ||
14 | - end | ||
15 | - | ||
16 | - def self.#{sym}=(obj) | ||
17 | - @@#{sym} = obj | ||
18 | - end | ||
19 | - EOS | ||
20 | - end | ||
21 | -end |
vendor/plugins/geokit/lib/geo_kit/geocoders.rb
@@ -1,348 +0,0 @@ | @@ -1,348 +0,0 @@ | ||
1 | -require 'net/http' | ||
2 | -require 'rexml/document' | ||
3 | -require 'yaml' | ||
4 | -require 'timeout' | ||
5 | - | ||
6 | -module GeoKit | ||
7 | - # Contains a set of geocoders which can be used independently if desired. The list contains: | ||
8 | - # | ||
9 | - # * Google Geocoder - requires an API key. | ||
10 | - # * Yahoo Geocoder - requires an API key. | ||
11 | - # * Geocoder.us - may require authentication if performing more than the free request limit. | ||
12 | - # * Geocoder.ca - for Canada; may require authentication as well. | ||
13 | - # * IP Geocoder - geocodes an IP address using hostip.info's web service. | ||
14 | - # * Multi Geocoder - provides failover for the physical location geocoders. | ||
15 | - # | ||
16 | - # Some configuration is required for these geocoders and can be located in the environment | ||
17 | - # configuration files. | ||
18 | - module Geocoders | ||
19 | - @@proxy_addr = nil | ||
20 | - @@proxy_port = nil | ||
21 | - @@proxy_user = nil | ||
22 | - @@proxy_pass = nil | ||
23 | - @@timeout = nil | ||
24 | - @@yahoo = 'REPLACE_WITH_YOUR_YAHOO_KEY' | ||
25 | - @@google = 'REPLACE_WITH_YOUR_GOOGLE_KEY' | ||
26 | - @@geocoder_us = false | ||
27 | - @@geocoder_ca = false | ||
28 | - @@provider_order = [:google,:us] | ||
29 | - | ||
30 | - [:yahoo, :google, :geocoder_us, :geocoder_ca, :provider_order, :timeout, | ||
31 | - :proxy_addr, :proxy_port, :proxy_user, :proxy_pass].each do |sym| | ||
32 | - class_eval <<-EOS, __FILE__, __LINE__ | ||
33 | - def self.#{sym} | ||
34 | - if defined?(#{sym.to_s.upcase}) | ||
35 | - #{sym.to_s.upcase} | ||
36 | - else | ||
37 | - @@#{sym} | ||
38 | - end | ||
39 | - end | ||
40 | - | ||
41 | - def self.#{sym}=(obj) | ||
42 | - @@#{sym} = obj | ||
43 | - end | ||
44 | - EOS | ||
45 | - end | ||
46 | - | ||
47 | - # Error which is thrown in the event a geocoding error occurs. | ||
48 | - class GeocodeError < StandardError; end | ||
49 | - | ||
50 | - # The Geocoder base class which defines the interface to be used by all | ||
51 | - # other geocoders. | ||
52 | - class Geocoder | ||
53 | - # Main method which calls the do_geocode template method which subclasses | ||
54 | - # are responsible for implementing. Returns a populated GeoLoc or an | ||
55 | - # empty one with a failed success code. | ||
56 | - def self.geocode(address) | ||
57 | - res = do_geocode(address) | ||
58 | - return res.success ? res : GeoLoc.new | ||
59 | - end | ||
60 | - | ||
61 | - # Call the geocoder service using the timeout if configured. | ||
62 | - def self.call_geocoder_service(url) | ||
63 | - timeout(GeoKit::Geocoders::timeout) { return self.do_get(url) } if GeoKit::Geocoders::timeout | ||
64 | - return self.do_get(url) | ||
65 | - rescue TimeoutError | ||
66 | - return nil | ||
67 | - end | ||
68 | - | ||
69 | - protected | ||
70 | - | ||
71 | - def self.logger() RAILS_DEFAULT_LOGGER; end | ||
72 | - | ||
73 | - private | ||
74 | - | ||
75 | - # Wraps the geocoder call around a proxy if necessary. | ||
76 | - def self.do_get(url) | ||
77 | - return Net::HTTP::Proxy(GeoKit::Geocoders::proxy_addr, GeoKit::Geocoders::proxy_port, | ||
78 | - GeoKit::Geocoders::proxy_user, GeoKit::Geocoders::proxy_pass).get_response(URI.parse(url)) | ||
79 | - end | ||
80 | - | ||
81 | - # Adds subclass' geocode method making it conveniently available through | ||
82 | - # the base class. | ||
83 | - def self.inherited(clazz) | ||
84 | - class_name = clazz.name.split('::').last | ||
85 | - src = <<-END_SRC | ||
86 | - def self.#{class_name.underscore}(address) | ||
87 | - #{class_name}.geocode(address) | ||
88 | - end | ||
89 | - END_SRC | ||
90 | - class_eval(src) | ||
91 | - end | ||
92 | - end | ||
93 | - | ||
94 | - # Geocoder CA geocoder implementation. Requires the GeoKit::Geocoders::GEOCODER_CA variable to | ||
95 | - # contain true or false based upon whether authentication is to occur. Conforms to the | ||
96 | - # interface set by the Geocoder class. | ||
97 | - # | ||
98 | - # Returns a response like: | ||
99 | - # <?xml version="1.0" encoding="UTF-8" ?> | ||
100 | - # <geodata> | ||
101 | - # <latt>49.243086</latt> | ||
102 | - # <longt>-123.153684</longt> | ||
103 | - # </geodata> | ||
104 | - class CaGeocoder < Geocoder | ||
105 | - | ||
106 | - private | ||
107 | - | ||
108 | - # Template method which does the geocode lookup. | ||
109 | - def self.do_geocode(address) | ||
110 | - raise ArgumentError('Geocoder.ca requires a GeoLoc argument') unless address.is_a?(GeoLoc) | ||
111 | - url = construct_request(address) | ||
112 | - res = self.call_geocoder_service(url) | ||
113 | - return GeoLoc.new if !res.is_a?(Net::HTTPSuccess) | ||
114 | - xml = res.body | ||
115 | - logger.debug "Geocoder.ca geocoding. Address: #{address}. Result: #{xml}" | ||
116 | - # Parse the document. | ||
117 | - doc = REXML::Document.new(xml) | ||
118 | - address.lat = doc.elements['//latt'].text | ||
119 | - address.lng = doc.elements['//longt'].text | ||
120 | - address.success = true | ||
121 | - return address | ||
122 | - rescue | ||
123 | - logger.error "Caught an error during Geocoder.ca geocoding call: "+$! | ||
124 | - return GeoLoc.new | ||
125 | - end | ||
126 | - | ||
127 | - # Formats the request in the format acceptable by the CA geocoder. | ||
128 | - def self.construct_request(location) | ||
129 | - url = "" | ||
130 | - url += add_ampersand(url) + "stno=#{location.street_number}" if location.street_address | ||
131 | - url += add_ampersand(url) + "addresst=#{CGI.escape(location.street_name)}" if location.street_address | ||
132 | - url += add_ampersand(url) + "city=#{CGI.escape(location.city)}" if location.city | ||
133 | - url += add_ampersand(url) + "prov=#{location.state}" if location.state | ||
134 | - url += add_ampersand(url) + "postal=#{location.zip}" if location.zip | ||
135 | - url += add_ampersand(url) + "auth=#{GeoKit::Geocoders::geocoder_ca}" if GeoKit::Geocoders::geocoder_ca | ||
136 | - url += add_ampersand(url) + "geoit=xml" | ||
137 | - 'http://geocoder.ca/?' + url | ||
138 | - end | ||
139 | - | ||
140 | - def self.add_ampersand(url) | ||
141 | - url && url.length > 0 ? "&" : "" | ||
142 | - end | ||
143 | - end | ||
144 | - | ||
145 | - # Google geocoder implementation. Requires the GeoKit::Geocoders::GOOGLE variable to | ||
146 | - # contain a Google API key. Conforms to the interface set by the Geocoder class. | ||
147 | - class GoogleGeocoder < Geocoder | ||
148 | - | ||
149 | - private | ||
150 | - | ||
151 | - # Template method which does the geocode lookup. | ||
152 | - def self.do_geocode(address) | ||
153 | - address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address | ||
154 | - res = self.call_geocoder_service("http://maps.google.com/maps/geo?q=#{CGI.escape(address_str)}&output=xml&key=#{GeoKit::Geocoders::google}&oe=utf-8") | ||
155 | -# res = Net::HTTP.get_response(URI.parse("http://maps.google.com/maps/geo?q=#{CGI.escape(address_str)}&output=xml&key=#{GeoKit::Geocoders::google}&oe=utf-8")) | ||
156 | - return GeoLoc.new if !res.is_a?(Net::HTTPSuccess) | ||
157 | - xml=res.body | ||
158 | - logger.debug "Google geocoding. Address: #{address}. Result: #{xml}" | ||
159 | - doc=REXML::Document.new(xml) | ||
160 | - | ||
161 | - if doc.elements['//kml/Response/Status/code'].text == '200' | ||
162 | - res = GeoLoc.new | ||
163 | - coordinates=doc.elements['//coordinates'].text.to_s.split(',') | ||
164 | - | ||
165 | - #basics | ||
166 | - res.lat=coordinates[1] | ||
167 | - res.lng=coordinates[0] | ||
168 | - res.country_code=doc.elements['//CountryNameCode'].text | ||
169 | - res.provider='google' | ||
170 | - | ||
171 | - #extended -- false if not not available | ||
172 | - res.city = doc.elements['//LocalityName'].text if doc.elements['//LocalityName'] | ||
173 | - res.state = doc.elements['//AdministrativeAreaName'].text if doc.elements['//AdministrativeAreaName'] | ||
174 | - res.full_address = doc.elements['//address'].text if doc.elements['//address'] # google provides it | ||
175 | - res.zip = doc.elements['//PostalCodeNumber'].text if doc.elements['//PostalCodeNumber'] | ||
176 | - res.street_address = doc.elements['//ThoroughfareName'].text if doc.elements['//ThoroughfareName'] | ||
177 | - # Translate accuracy into Yahoo-style token address, street, zip, zip+4, city, state, country | ||
178 | - # For Google, 1=low accuracy, 8=high accuracy | ||
179 | - # old way -- address_details=doc.elements['//AddressDetails','urn:oasis:names:tc:ciq:xsdschema:xAL:2.0'] | ||
180 | - address_details=doc.elements['//*[local-name() = "AddressDetails"]'] | ||
181 | - accuracy = address_details ? address_details.attributes['Accuracy'].to_i : 0 | ||
182 | - res.precision=%w{unknown country state state city zip zip+4 street address}[accuracy] | ||
183 | - res.success=true | ||
184 | - | ||
185 | - return res | ||
186 | - else | ||
187 | - logger.info "Google was unable to geocode address: "+address | ||
188 | - return GeoLoc.new | ||
189 | - end | ||
190 | - | ||
191 | - rescue | ||
192 | - logger.error "Caught an error during Google geocoding call: "+$! | ||
193 | - return GeoLoc.new | ||
194 | - end | ||
195 | - end | ||
196 | - | ||
197 | - # Provides geocoding based upon an IP address. The underlying web service is a hostip.info | ||
198 | - # which sources their data through a combination of publicly available information as well | ||
199 | - # as community contributions. | ||
200 | - class IpGeocoder < Geocoder | ||
201 | - | ||
202 | - private | ||
203 | - | ||
204 | - # Given an IP address, returns a GeoLoc instance which contains latitude, | ||
205 | - # longitude, city, and country code. Sets the success attribute to false if the ip | ||
206 | - # parameter does not match an ip address. | ||
207 | - def self.do_geocode(ip) | ||
208 | - return GeoLoc.new unless /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?$/.match(ip) | ||
209 | - url = "http://api.hostip.info/get_html.php?ip=#{ip}&position=true" | ||
210 | - response = self.call_geocoder_service(url) | ||
211 | - response.is_a?(Net::HTTPSuccess) ? parse_body(response.body) : GeoLoc.new | ||
212 | - rescue | ||
213 | - logger.error "Caught an error during HostIp geocoding call: "+$! | ||
214 | - return GeoLoc.new | ||
215 | - end | ||
216 | - | ||
217 | - # Converts the body to YAML since its in the form of: | ||
218 | - # | ||
219 | - # Country: UNITED STATES (US) | ||
220 | - # City: Sugar Grove, IL | ||
221 | - # Latitude: 41.7696 | ||
222 | - # Longitude: -88.4588 | ||
223 | - # | ||
224 | - # then instantiates a GeoLoc instance to populate with location data. | ||
225 | - def self.parse_body(body) # :nodoc: | ||
226 | - yaml = YAML.load(body) | ||
227 | - res = GeoLoc.new | ||
228 | - res.provider = 'hostip' | ||
229 | - res.city, res.state = yaml['City'].split(', ') | ||
230 | - country, res.country_code = yaml['Country'].split(' (') | ||
231 | - res.lat = yaml['Latitude'] | ||
232 | - res.lng = yaml['Longitude'] | ||
233 | - res.country_code.chop! | ||
234 | - res.success = res.city != "(Private Address)" | ||
235 | - res | ||
236 | - end | ||
237 | - end | ||
238 | - | ||
239 | - # Geocoder Us geocoder implementation. Requires the GeoKit::Geocoders::GEOCODER_US variable to | ||
240 | - # contain true or false based upon whether authentication is to occur. Conforms to the | ||
241 | - # interface set by the Geocoder class. | ||
242 | - class UsGeocoder < Geocoder | ||
243 | - | ||
244 | - private | ||
245 | - | ||
246 | - # For now, the geocoder_method will only geocode full addresses -- not zips or cities in isolation | ||
247 | - def self.do_geocode(address) | ||
248 | - address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address | ||
249 | - url = "http://"+(GeoKit::Geocoders::geocoder_us || '')+"geocoder.us/service/csv/geocode?address=#{CGI.escape(address_str)}" | ||
250 | - res = self.call_geocoder_service(url) | ||
251 | - return GeoLoc.new if !res.is_a?(Net::HTTPSuccess) | ||
252 | - data = res.body | ||
253 | - logger.debug "Geocoder.us geocoding. Address: #{address}. Result: #{data}" | ||
254 | - array = data.chomp.split(',') | ||
255 | - | ||
256 | - if array.length == 6 | ||
257 | - res=GeoLoc.new | ||
258 | - res.lat,res.lng,res.street_address,res.city,res.state,res.zip=array | ||
259 | - res.country_code='US' | ||
260 | - res.success=true | ||
261 | - return res | ||
262 | - else | ||
263 | - logger.info "geocoder.us was unable to geocode address: "+address | ||
264 | - return GeoLoc.new | ||
265 | - end | ||
266 | - rescue | ||
267 | - logger.error "Caught an error during geocoder.us geocoding call: "+$! | ||
268 | - return GeoLoc.new | ||
269 | - end | ||
270 | - end | ||
271 | - | ||
272 | - # Yahoo geocoder implementation. Requires the GeoKit::Geocoders::YAHOO variable to | ||
273 | - # contain a Yahoo API key. Conforms to the interface set by the Geocoder class. | ||
274 | - class YahooGeocoder < Geocoder | ||
275 | - | ||
276 | - private | ||
277 | - | ||
278 | - # Template method which does the geocode lookup. | ||
279 | - def self.do_geocode(address) | ||
280 | - address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address | ||
281 | - url="http://api.local.yahoo.com/MapsService/V1/geocode?appid=#{GeoKit::Geocoders::yahoo}&location=#{CGI.escape(address_str)}" | ||
282 | - res = self.call_geocoder_service(url) | ||
283 | - return GeoLoc.new if !res.is_a?(Net::HTTPSuccess) | ||
284 | - xml = res.body | ||
285 | - doc = REXML::Document.new(xml) | ||
286 | - logger.debug "Yahoo geocoding. Address: #{address}. Result: #{xml}" | ||
287 | - | ||
288 | - if doc.elements['//ResultSet'] | ||
289 | - res=GeoLoc.new | ||
290 | - | ||
291 | - #basic | ||
292 | - res.lat=doc.elements['//Latitude'].text | ||
293 | - res.lng=doc.elements['//Longitude'].text | ||
294 | - res.country_code=doc.elements['//Country'].text | ||
295 | - res.provider='yahoo' | ||
296 | - | ||
297 | - #extended - false if not available | ||
298 | - res.city=doc.elements['//City'].text if doc.elements['//City'] && doc.elements['//City'].text != nil | ||
299 | - res.state=doc.elements['//State'].text if doc.elements['//State'] && doc.elements['//State'].text != nil | ||
300 | - res.zip=doc.elements['//Zip'].text if doc.elements['//Zip'] && doc.elements['//Zip'].text != nil | ||
301 | - res.street_address=doc.elements['//Address'].text if doc.elements['//Address'] && doc.elements['//Address'].text != nil | ||
302 | - res.precision=doc.elements['//Result'].attributes['precision'] if doc.elements['//Result'] | ||
303 | - res.success=true | ||
304 | - return res | ||
305 | - else | ||
306 | - logger.info "Yahoo was unable to geocode address: "+address | ||
307 | - return GeoLoc.new | ||
308 | - end | ||
309 | - | ||
310 | - rescue | ||
311 | - logger.info "Caught an error during Yahoo geocoding call: "+$! | ||
312 | - return GeoLoc.new | ||
313 | - end | ||
314 | - end | ||
315 | - | ||
316 | - # Provides methods to geocode with a variety of geocoding service providers, plus failover | ||
317 | - # among providers in the order you configure. | ||
318 | - # | ||
319 | - # Goal: | ||
320 | - # - homogenize the results of multiple geocoders | ||
321 | - # | ||
322 | - # Limitations: | ||
323 | - # - currently only provides the first result. Sometimes geocoders will return multiple results. | ||
324 | - # - currently discards the "accuracy" component of the geocoding calls | ||
325 | - class MultiGeocoder < Geocoder | ||
326 | - private | ||
327 | - | ||
328 | - # This method will call one or more geocoders in the order specified in the | ||
329 | - # configuration until one of the geocoders work. | ||
330 | - # | ||
331 | - # The failover approach is crucial for production-grade apps, but is rarely used. | ||
332 | - # 98% of your geocoding calls will be successful with the first call | ||
333 | - def self.do_geocode(address) | ||
334 | - GeoKit::Geocoders::provider_order.each do |provider| | ||
335 | - begin | ||
336 | - klass = GeoKit::Geocoders.const_get "#{provider.to_s.capitalize}Geocoder" | ||
337 | - res = klass.send :geocode, address | ||
338 | - return res if res.success | ||
339 | - rescue | ||
340 | - logger.error("Something has gone very wrong during geocoding, OR you have configured an invalid class name in GeoKit::Geocoders::provider_order. Address: #{address}. Provider: #{provider}") | ||
341 | - end | ||
342 | - end | ||
343 | - # If we get here, we failed completely. | ||
344 | - GeoLoc.new | ||
345 | - end | ||
346 | - end | ||
347 | - end | ||
348 | -end | ||
349 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/lib/geo_kit/ip_geocode_lookup.rb
@@ -1,46 +0,0 @@ | @@ -1,46 +0,0 @@ | ||
1 | -require 'yaml' | ||
2 | - | ||
3 | -module GeoKit | ||
4 | - # Contains a class method geocode_ip_address which can be used to enable automatic geocoding | ||
5 | - # for request IP addresses. The geocoded information is stored in a cookie and in the | ||
6 | - # session to minimize web service calls. The point of the helper is to enable location-based | ||
7 | - # websites to have a best-guess for new visitors. | ||
8 | - module IpGeocodeLookup | ||
9 | - # Mix below class methods into ActionController. | ||
10 | - def self.included(base) # :nodoc: | ||
11 | - base.extend ClassMethods | ||
12 | - end | ||
13 | - | ||
14 | - # Class method to mix into active record. | ||
15 | - module ClassMethods # :nodoc: | ||
16 | - def geocode_ip_address(filter_options = {}) | ||
17 | - before_filter :store_ip_location, filter_options | ||
18 | - end | ||
19 | - end | ||
20 | - | ||
21 | - private | ||
22 | - | ||
23 | - # Places the IP address' geocode location into the session if it | ||
24 | - # can be found. Otherwise, looks for a geo location cookie and | ||
25 | - # uses that value. The last resort is to call the web service to | ||
26 | - # get the value. | ||
27 | - def store_ip_location | ||
28 | - session[:geo_location] ||= retrieve_location_from_cookie_or_service | ||
29 | - cookies[:geo_location] = { :value => session[:geo_location].to_yaml, :expires => 30.days.from_now } if session[:geo_location] | ||
30 | - end | ||
31 | - | ||
32 | - # Uses the stored location value from the cookie if it exists. If | ||
33 | - # no cookie exists, calls out to the web service to get the location. | ||
34 | - def retrieve_location_from_cookie_or_service | ||
35 | - return YAML.load(cookies[:geo_location]) if cookies[:geo_location] | ||
36 | - location = Geocoders::IpGeocoder.geocode(get_ip_address) | ||
37 | - return location.success ? location : nil | ||
38 | - end | ||
39 | - | ||
40 | - # Returns the real ip address, though this could be the localhost ip | ||
41 | - # address. No special handling here anymore. | ||
42 | - def get_ip_address | ||
43 | - request.remote_ip | ||
44 | - end | ||
45 | - end | ||
46 | -end | ||
47 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/lib/geo_kit/mappable.rb
@@ -1,432 +0,0 @@ | @@ -1,432 +0,0 @@ | ||
1 | -require 'geo_kit/defaults' | ||
2 | - | ||
3 | -module GeoKit | ||
4 | - # Contains class and instance methods providing distance calcuation services. This | ||
5 | - # module is meant to be mixed into classes containing lat and lng attributes where | ||
6 | - # distance calculation is desired. | ||
7 | - # | ||
8 | - # At present, two forms of distance calculations are provided: | ||
9 | - # | ||
10 | - # * Pythagorean Theory (flat Earth) - which assumes the world is flat and loses accuracy over long distances. | ||
11 | - # * Haversine (sphere) - which is fairly accurate, but at a performance cost. | ||
12 | - # | ||
13 | - # Distance units supported are :miles and :kms. | ||
14 | - module Mappable | ||
15 | - PI_DIV_RAD = 0.0174 | ||
16 | - KMS_PER_MILE = 1.609 | ||
17 | - EARTH_RADIUS_IN_MILES = 3963.19 | ||
18 | - EARTH_RADIUS_IN_KMS = EARTH_RADIUS_IN_MILES * KMS_PER_MILE | ||
19 | - MILES_PER_LATITUDE_DEGREE = 69.1 | ||
20 | - KMS_PER_LATITUDE_DEGREE = MILES_PER_LATITUDE_DEGREE * KMS_PER_MILE | ||
21 | - LATITUDE_DEGREES = EARTH_RADIUS_IN_MILES / MILES_PER_LATITUDE_DEGREE | ||
22 | - | ||
23 | - # Mix below class methods into the includer. | ||
24 | - def self.included(receiver) # :nodoc: | ||
25 | - receiver.extend ClassMethods | ||
26 | - end | ||
27 | - | ||
28 | - module ClassMethods #:nodoc: | ||
29 | - # Returns the distance between two points. The from and to parameters are | ||
30 | - # required to have lat and lng attributes. Valid options are: | ||
31 | - # :units - valid values are :miles or :kms (GeoKit::default_units is the default) | ||
32 | - # :formula - valid values are :flat or :sphere (GeoKit::default_formula is the default) | ||
33 | - def distance_between(from, to, options={}) | ||
34 | - from=GeoKit::LatLng.normalize(from) | ||
35 | - to=GeoKit::LatLng.normalize(to) | ||
36 | - return 0.0 if from == to # fixes a "zero-distance" bug | ||
37 | - units = options[:units] || GeoKit::default_units | ||
38 | - formula = options[:formula] || GeoKit::default_formula | ||
39 | - case formula | ||
40 | - when :sphere | ||
41 | - units_sphere_multiplier(units) * | ||
42 | - Math.acos( Math.sin(deg2rad(from.lat)) * Math.sin(deg2rad(to.lat)) + | ||
43 | - Math.cos(deg2rad(from.lat)) * Math.cos(deg2rad(to.lat)) * | ||
44 | - Math.cos(deg2rad(to.lng) - deg2rad(from.lng))) | ||
45 | - when :flat | ||
46 | - Math.sqrt((units_per_latitude_degree(units)*(from.lat-to.lat))**2 + | ||
47 | - (units_per_longitude_degree(from.lat, units)*(from.lng-to.lng))**2) | ||
48 | - end | ||
49 | - end | ||
50 | - | ||
51 | - # Returns heading in degrees (0 is north, 90 is east, 180 is south, etc) | ||
52 | - # from the first point to the second point. Typicaly, the instance methods will be used | ||
53 | - # instead of this method. | ||
54 | - def heading_between(from,to) | ||
55 | - from=GeoKit::LatLng.normalize(from) | ||
56 | - to=GeoKit::LatLng.normalize(to) | ||
57 | - | ||
58 | - d_lng=deg2rad(to.lng-from.lng) | ||
59 | - from_lat=deg2rad(from.lat) | ||
60 | - to_lat=deg2rad(to.lat) | ||
61 | - y=Math.sin(d_lng) * Math.cos(to_lat) | ||
62 | - x=Math.cos(from_lat)*Math.sin(to_lat)-Math.sin(from_lat)*Math.cos(to_lat)*Math.cos(d_lng) | ||
63 | - heading=to_heading(Math.atan2(y,x)) | ||
64 | - end | ||
65 | - | ||
66 | - # Given a start point, distance, and heading (in degrees), provides | ||
67 | - # an endpoint. Returns a LatLng instance. Typically, the instance method | ||
68 | - # will be used instead of this method. | ||
69 | - def endpoint(start,heading, distance, options={}) | ||
70 | - units = options[:units] || GeoKit::default_units | ||
71 | - radius = units == :miles ? EARTH_RADIUS_IN_MILES : EARTH_RADIUS_IN_KMS | ||
72 | - start=GeoKit::LatLng.normalize(start) | ||
73 | - lat=deg2rad(start.lat) | ||
74 | - lng=deg2rad(start.lng) | ||
75 | - heading=deg2rad(heading) | ||
76 | - distance=distance.to_f | ||
77 | - | ||
78 | - end_lat=Math.asin(Math.sin(lat)*Math.cos(distance/radius) + | ||
79 | - Math.cos(lat)*Math.sin(distance/radius)*Math.cos(heading)) | ||
80 | - | ||
81 | - end_lng=lng+Math.atan2(Math.sin(heading)*Math.sin(distance/radius)*Math.cos(lat), | ||
82 | - Math.cos(distance/radius)-Math.sin(lat)*Math.sin(end_lat)) | ||
83 | - | ||
84 | - LatLng.new(rad2deg(end_lat),rad2deg(end_lng)) | ||
85 | - end | ||
86 | - | ||
87 | - # Returns the midpoint, given two points. Returns a LatLng. | ||
88 | - # Typically, the instance method will be used instead of this method. | ||
89 | - # Valid option: | ||
90 | - # :units - valid values are :miles or :kms (:miles is the default) | ||
91 | - def midpoint_between(from,to,options={}) | ||
92 | - from=GeoKit::LatLng.normalize(from) | ||
93 | - | ||
94 | - units = options[:units] || GeoKit::default_units | ||
95 | - | ||
96 | - heading=from.heading_to(to) | ||
97 | - distance=from.distance_to(to,options) | ||
98 | - midpoint=from.endpoint(heading,distance/2,options) | ||
99 | - end | ||
100 | - | ||
101 | - # Geocodes a location using the multi geocoder. | ||
102 | - def geocode(location) | ||
103 | - res = Geocoders::MultiGeocoder.geocode(location) | ||
104 | - return res if res.success | ||
105 | - raise GeoKit::Geocoders::GeocodeError | ||
106 | - end | ||
107 | - | ||
108 | - protected | ||
109 | - | ||
110 | - def deg2rad(degrees) | ||
111 | - degrees.to_f / 180.0 * Math::PI | ||
112 | - end | ||
113 | - | ||
114 | - def rad2deg(rad) | ||
115 | - rad.to_f * 180.0 / Math::PI | ||
116 | - end | ||
117 | - | ||
118 | - def to_heading(rad) | ||
119 | - (rad2deg(rad)+360)%360 | ||
120 | - end | ||
121 | - | ||
122 | - # Returns the multiplier used to obtain the correct distance units. | ||
123 | - def units_sphere_multiplier(units) | ||
124 | - units == :miles ? EARTH_RADIUS_IN_MILES : EARTH_RADIUS_IN_KMS | ||
125 | - end | ||
126 | - | ||
127 | - # Returns the number of units per latitude degree. | ||
128 | - def units_per_latitude_degree(units) | ||
129 | - units == :miles ? MILES_PER_LATITUDE_DEGREE : KMS_PER_LATITUDE_DEGREE | ||
130 | - end | ||
131 | - | ||
132 | - # Returns the number units per longitude degree. | ||
133 | - def units_per_longitude_degree(lat, units) | ||
134 | - miles_per_longitude_degree = (LATITUDE_DEGREES * Math.cos(lat * PI_DIV_RAD)).abs | ||
135 | - units == :miles ? miles_per_longitude_degree : miles_per_longitude_degree * KMS_PER_MILE | ||
136 | - end | ||
137 | - end | ||
138 | - | ||
139 | - # ----------------------------------------------------------------------------------------------- | ||
140 | - # Instance methods below here | ||
141 | - # ----------------------------------------------------------------------------------------------- | ||
142 | - | ||
143 | - # Extracts a LatLng instance. Use with models that are acts_as_mappable | ||
144 | - def to_lat_lng | ||
145 | - return self if instance_of?(GeoKit::LatLng) || instance_of?(GeoKit::GeoLoc) | ||
146 | - return LatLng.new(send(self.class.lat_column_name),send(self.class.lng_column_name)) if self.class.respond_to?(:acts_as_mappable) | ||
147 | - return nil | ||
148 | - end | ||
149 | - | ||
150 | - # Returns the distance from another point. The other point parameter is | ||
151 | - # required to have lat and lng attributes. Valid options are: | ||
152 | - # :units - valid values are :miles or :kms (:miles is the default) | ||
153 | - # :formula - valid values are :flat or :sphere (:sphere is the default) | ||
154 | - def distance_to(other, options={}) | ||
155 | - self.class.distance_between(self, other, options) | ||
156 | - end | ||
157 | - alias distance_from distance_to | ||
158 | - | ||
159 | - # Returns heading in degrees (0 is north, 90 is east, 180 is south, etc) | ||
160 | - # to the given point. The given point can be a LatLng or a string to be Geocoded | ||
161 | - def heading_to(other) | ||
162 | - self.class.heading_between(self,other) | ||
163 | - end | ||
164 | - | ||
165 | - # Returns heading in degrees (0 is north, 90 is east, 180 is south, etc) | ||
166 | - # FROM the given point. The given point can be a LatLng or a string to be Geocoded | ||
167 | - def heading_from(other) | ||
168 | - self.class.heading_between(other,self) | ||
169 | - end | ||
170 | - | ||
171 | - # Returns the endpoint, given a heading (in degrees) and distance. | ||
172 | - # Valid option: | ||
173 | - # :units - valid values are :miles or :kms (:miles is the default) | ||
174 | - def endpoint(heading,distance,options={}) | ||
175 | - self.class.endpoint(self,heading,distance,options) | ||
176 | - end | ||
177 | - | ||
178 | - # Returns the midpoint, given another point on the map. | ||
179 | - # Valid option: | ||
180 | - # :units - valid values are :miles or :kms (:miles is the default) | ||
181 | - def midpoint_to(other, options={}) | ||
182 | - self.class.midpoint_between(self,other,options) | ||
183 | - end | ||
184 | - | ||
185 | - end | ||
186 | - | ||
187 | - class LatLng | ||
188 | - include Mappable | ||
189 | - | ||
190 | - attr_accessor :lat, :lng | ||
191 | - | ||
192 | - # Accepts latitude and longitude or instantiates an empty instance | ||
193 | - # if lat and lng are not provided. Converted to floats if provided | ||
194 | - def initialize(lat=nil, lng=nil) | ||
195 | - lat = lat.to_f if lat && !lat.is_a?(Numeric) | ||
196 | - lng = lng.to_f if lng && !lng.is_a?(Numeric) | ||
197 | - @lat = lat | ||
198 | - @lng = lng | ||
199 | - end | ||
200 | - | ||
201 | - # Latitude attribute setter; stored as a float. | ||
202 | - def lat=(lat) | ||
203 | - @lat = lat.to_f if lat | ||
204 | - end | ||
205 | - | ||
206 | - # Longitude attribute setter; stored as a float; | ||
207 | - def lng=(lng) | ||
208 | - @lng=lng.to_f if lng | ||
209 | - end | ||
210 | - | ||
211 | - # Returns the lat and lng attributes as a comma-separated string. | ||
212 | - def ll | ||
213 | - "#{lat},#{lng}" | ||
214 | - end | ||
215 | - | ||
216 | - #returns a string with comma-separated lat,lng values | ||
217 | - def to_s | ||
218 | - ll | ||
219 | - end | ||
220 | - | ||
221 | - #returns a two-element array | ||
222 | - def to_a | ||
223 | - [lat,lng] | ||
224 | - end | ||
225 | - # Returns true if the candidate object is logically equal. Logical equivalence | ||
226 | - # is true if the lat and lng attributes are the same for both objects. | ||
227 | - def ==(other) | ||
228 | - other.is_a?(LatLng) ? self.lat == other.lat && self.lng == other.lng : false | ||
229 | - end | ||
230 | - | ||
231 | - # A *class* method to take anything which can be inferred as a point and generate | ||
232 | - # a LatLng from it. You should use this anything you're not sure what the input is, | ||
233 | - # and want to deal with it as a LatLng if at all possible. Can take: | ||
234 | - # 1) two arguments (lat,lng) | ||
235 | - # 2) a string in the format "37.1234,-129.1234" or "37.1234 -129.1234" | ||
236 | - # 3) a string which can be geocoded on the fly | ||
237 | - # 4) an array in the format [37.1234,-129.1234] | ||
238 | - # 5) a LatLng or GeoLoc (which is just passed through as-is) | ||
239 | - # 6) anything which acts_as_mappable -- a LatLng will be extracted from it | ||
240 | - def self.normalize(thing,other=nil) | ||
241 | - # if an 'other' thing is supplied, normalize the input by creating an array of two elements | ||
242 | - thing=[thing,other] if other | ||
243 | - | ||
244 | - if thing.is_a?(String) | ||
245 | - thing.strip! | ||
246 | - if match=thing.match(/(\-?\d+\.?\d*)[, ] ?(\-?\d+\.?\d*)$/) | ||
247 | - return GeoKit::LatLng.new(match[1],match[2]) | ||
248 | - else | ||
249 | - res = GeoKit::Geocoders::MultiGeocoder.geocode(thing) | ||
250 | - return res if res.success | ||
251 | - raise GeoKit::Geocoders::GeocodeError | ||
252 | - end | ||
253 | - elsif thing.is_a?(Array) && thing.size==2 | ||
254 | - return GeoKit::LatLng.new(thing[0],thing[1]) | ||
255 | - elsif thing.is_a?(LatLng) # will also be true for GeoLocs | ||
256 | - return thing | ||
257 | - elsif thing.class.respond_to?(:acts_as_mappable) && thing.class.respond_to?(:distance_column_name) | ||
258 | - return thing.to_lat_lng | ||
259 | - end | ||
260 | - | ||
261 | - throw ArgumentError.new("#{thing} (#{thing.class}) cannot be normalized to a LatLng. We tried interpreting it as an array, string, Mappable, etc., but no dice.") | ||
262 | - end | ||
263 | - | ||
264 | - end | ||
265 | - | ||
266 | - # This class encapsulates the result of a geocoding call | ||
267 | - # It's primary purpose is to homogenize the results of multiple | ||
268 | - # geocoding providers. It also provides some additional functionality, such as | ||
269 | - # the "full address" method for geocoders that do not provide a | ||
270 | - # full address in their results (for example, Yahoo), and the "is_us" method. | ||
271 | - class GeoLoc < LatLng | ||
272 | - # Location attributes. Full address is a concatenation of all values. For example: | ||
273 | - # 100 Spear St, San Francisco, CA, 94101, US | ||
274 | - attr_accessor :street_address, :city, :state, :zip, :country_code, :full_address | ||
275 | - # Attributes set upon return from geocoding. Success will be true for successful | ||
276 | - # geocode lookups. The provider will be set to the name of the providing geocoder. | ||
277 | - # Finally, precision is an indicator of the accuracy of the geocoding. | ||
278 | - attr_accessor :success, :provider, :precision | ||
279 | - # Street number and street name are extracted from the street address attribute. | ||
280 | - attr_reader :street_number, :street_name | ||
281 | - | ||
282 | - # Constructor expects a hash of symbols to correspond with attributes. | ||
283 | - def initialize(h={}) | ||
284 | - @street_address=h[:street_address] | ||
285 | - @city=h[:city] | ||
286 | - @state=h[:state] | ||
287 | - @zip=h[:zip] | ||
288 | - @country_code=h[:country_code] | ||
289 | - @success=false | ||
290 | - @precision='unknown' | ||
291 | - super(h[:lat],h[:lng]) | ||
292 | - end | ||
293 | - | ||
294 | - # Returns true if geocoded to the United States. | ||
295 | - def is_us? | ||
296 | - country_code == 'US' | ||
297 | - end | ||
298 | - | ||
299 | - # full_address is provided by google but not by yahoo. It is intended that the google | ||
300 | - # geocoding method will provide the full address, whereas for yahoo it will be derived | ||
301 | - # from the parts of the address we do have. | ||
302 | - def full_address | ||
303 | - @full_address ? @full_address : to_geocodeable_s | ||
304 | - end | ||
305 | - | ||
306 | - # Extracts the street number from the street address if the street address | ||
307 | - # has a value. | ||
308 | - def street_number | ||
309 | - street_address[/(\d*)/] if street_address | ||
310 | - end | ||
311 | - | ||
312 | - # Returns the street name portion of the street address. | ||
313 | - def street_name | ||
314 | - street_address[street_number.length, street_address.length].strip if street_address | ||
315 | - end | ||
316 | - | ||
317 | - # gives you all the important fields as key-value pairs | ||
318 | - def hash | ||
319 | - res={} | ||
320 | - [:success,:lat,:lng,:country_code,:city,:state,:zip,:street_address,:provider,:full_address,:is_us?,:ll,:precision].each { |s| res[s] = self.send(s.to_s) } | ||
321 | - res | ||
322 | - end | ||
323 | - alias to_hash hash | ||
324 | - | ||
325 | - # Sets the city after capitalizing each word within the city name. | ||
326 | - def city=(city) | ||
327 | - @city = city.titleize if city | ||
328 | - end | ||
329 | - | ||
330 | - # Sets the street address after capitalizing each word within the street address. | ||
331 | - def street_address=(address) | ||
332 | - @street_address = address.titleize if address | ||
333 | - end | ||
334 | - | ||
335 | - # Returns a comma-delimited string consisting of the street address, city, state, | ||
336 | - # zip, and country code. Only includes those attributes that are non-blank. | ||
337 | - def to_geocodeable_s | ||
338 | - a=[street_address, city, state, zip, country_code].compact | ||
339 | - a.delete_if { |e| !e || e == '' } | ||
340 | - a.join(', ') | ||
341 | - end | ||
342 | - | ||
343 | - # Returns a string representation of the instance. | ||
344 | - def to_s | ||
345 | - "Provider: #{provider}\n Street: #{street_address}\nCity: #{city}\nState: #{state}\nZip: #{zip}\nLatitude: #{lat}\nLongitude: #{lng}\nCountry: #{country_code}\nSuccess: #{success}" | ||
346 | - end | ||
347 | - end | ||
348 | - | ||
349 | - # Bounds represents a rectangular bounds, defined by the SW and NE corners | ||
350 | - class Bounds | ||
351 | - # sw and ne are LatLng objects | ||
352 | - attr_accessor :sw, :ne | ||
353 | - | ||
354 | - # provide sw and ne to instantiate a new Bounds instance | ||
355 | - def initialize(sw,ne) | ||
356 | - raise ArguementError if !(sw.is_a?(GeoKit::LatLng) && ne.is_a?(GeoKit::LatLng)) | ||
357 | - @sw,@ne=sw,ne | ||
358 | - end | ||
359 | - | ||
360 | - #returns the a single point which is the center of the rectangular bounds | ||
361 | - def center | ||
362 | - @sw.midpoint_to(@ne) | ||
363 | - end | ||
364 | - | ||
365 | - # a simple string representation:sw,ne | ||
366 | - def to_s | ||
367 | - "#{@sw.to_s},#{@ne.to_s}" | ||
368 | - end | ||
369 | - | ||
370 | - # a two-element array of two-element arrays: sw,ne | ||
371 | - def to_a | ||
372 | - [@sw.to_a, @ne.to_a] | ||
373 | - end | ||
374 | - | ||
375 | - # Returns true if the bounds contain the passed point. | ||
376 | - # allows for bounds which cross the meridian | ||
377 | - def contains?(point) | ||
378 | - point=GeoKit::LatLng.normalize(point) | ||
379 | - res = point.lat > @sw.lat && point.lat < @ne.lat | ||
380 | - if crosses_meridian? | ||
381 | - res &= point.lng < @ne.lng || point.lng > @sw.lng | ||
382 | - else | ||
383 | - res &= point.lng < @ne.lng && point.lng > @sw.lng | ||
384 | - end | ||
385 | - res | ||
386 | - end | ||
387 | - | ||
388 | - # returns true if the bounds crosses the international dateline | ||
389 | - def crosses_meridian? | ||
390 | - @sw.lng > @ne.lng | ||
391 | - end | ||
392 | - | ||
393 | - # Returns true if the candidate object is logically equal. Logical equivalence | ||
394 | - # is true if the lat and lng attributes are the same for both objects. | ||
395 | - def ==(other) | ||
396 | - other.is_a?(Bounds) ? self.sw == other.sw && self.ne == other.ne : false | ||
397 | - end | ||
398 | - | ||
399 | - class <<self | ||
400 | - | ||
401 | - # returns an instance of bounds which completely encompases the given circle | ||
402 | - def from_point_and_radius(point,radius,options={}) | ||
403 | - point=LatLng.normalize(point) | ||
404 | - p0=point.endpoint(0,radius,options) | ||
405 | - p90=point.endpoint(90,radius,options) | ||
406 | - p180=point.endpoint(180,radius,options) | ||
407 | - p270=point.endpoint(270,radius,options) | ||
408 | - sw=GeoKit::LatLng.new(p180.lat,p270.lng) | ||
409 | - ne=GeoKit::LatLng.new(p0.lat,p90.lng) | ||
410 | - GeoKit::Bounds.new(sw,ne) | ||
411 | - end | ||
412 | - | ||
413 | - # Takes two main combinations of arguements to create a bounds: | ||
414 | - # point,point (this is the only one which takes two arguments | ||
415 | - # [point,point] | ||
416 | - # . . . where a point is anything LatLng#normalize can handle (which is quite a lot) | ||
417 | - # | ||
418 | - # NOTE: everything combination is assumed to pass points in the order sw, ne | ||
419 | - def normalize (thing,other=nil) | ||
420 | - # maybe this will be simple -- an actual bounds object is passed, and we can all go home | ||
421 | - return thing if thing.is_a? Bounds | ||
422 | - | ||
423 | - # no? OK, if there's no "other," the thing better be a two-element array | ||
424 | - thing,other=thing if !other && thing.is_a?(Array) && thing.size==2 | ||
425 | - | ||
426 | - # Now that we're set with a thing and another thing, let LatLng do the heavy lifting. | ||
427 | - # Exceptions may be thrown | ||
428 | - Bounds.new(GeoKit::LatLng.normalize(thing),GeoKit::LatLng.normalize(other)) | ||
429 | - end | ||
430 | - end | ||
431 | - end | ||
432 | -end | ||
433 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/lib/geo_kit/sqlite_extension.rb
@@ -1,28 +0,0 @@ | @@ -1,28 +0,0 @@ | ||
1 | -if ActiveRecord::Base.connection.adapter_name =~ /^sqlite$/i | ||
2 | - | ||
3 | - database = ActiveRecord::Base.connection.raw_connection | ||
4 | - | ||
5 | - database.create_function('pow', 2, 1) do |func, base, exponent| | ||
6 | - func.set_result(base.to_f ** exponent.to_f) | ||
7 | - end | ||
8 | - | ||
9 | - database.create_function('sqrt', 1, 1) do |func, value| | ||
10 | - func.set_result(Math.sqrt(value)) | ||
11 | - end | ||
12 | - | ||
13 | - database.create_function('radians', 1, 1) do |func, value| | ||
14 | - func.set_result(value.to_f * Math::PI / 180.0) | ||
15 | - end | ||
16 | - | ||
17 | - database.create_function('spheric_distance', 5, 1) do |func, lat1, long1, lat2, long2, radius| | ||
18 | - func.set_result( | ||
19 | - radius.to_f * Math.acos( | ||
20 | - [1, | ||
21 | - Math.cos(lat1.to_f) * Math.cos(long1.to_f) * Math.cos(lat2.to_f) * Math.cos(long2.to_f) + | ||
22 | - Math.cos(lat1.to_f) * Math.sin(long1.to_f) * Math.cos(lat2.to_f) * Math.sin(long2.to_f) + | ||
23 | - Math.sin(lat1.to_f) * Math.sin(lat2.to_f) | ||
24 | - ].min | ||
25 | - ) | ||
26 | - ) | ||
27 | - end | ||
28 | -end |
vendor/plugins/geokit/test/acts_as_mappable_test.rb
@@ -1,481 +0,0 @@ | @@ -1,481 +0,0 @@ | ||
1 | -require 'rubygems' | ||
2 | -require 'mocha' | ||
3 | -require File.join(File.dirname(__FILE__), 'test_helper') | ||
4 | - | ||
5 | -GeoKit::Geocoders::provider_order=[:google,:us] | ||
6 | - | ||
7 | -# Uses defaults | ||
8 | -class Company < ActiveRecord::Base #:nodoc: all | ||
9 | - has_many :locations | ||
10 | -end | ||
11 | - | ||
12 | -# Configures everything. | ||
13 | -class Location < ActiveRecord::Base #:nodoc: all | ||
14 | - belongs_to :company | ||
15 | - acts_as_mappable | ||
16 | -end | ||
17 | - | ||
18 | -# for auto_geocode | ||
19 | -class Store < ActiveRecord::Base | ||
20 | - acts_as_mappable :auto_geocode=>true | ||
21 | -end | ||
22 | - | ||
23 | -# Uses deviations from conventions. | ||
24 | -class CustomLocation < ActiveRecord::Base #:nodoc: all | ||
25 | - belongs_to :company | ||
26 | - acts_as_mappable :distance_column_name => 'dist', | ||
27 | - :default_units => :kms, | ||
28 | - :default_formula => :flat, | ||
29 | - :lat_column_name => 'latitude', | ||
30 | - :lng_column_name => 'longitude' | ||
31 | - | ||
32 | - def to_s | ||
33 | - "lat: #{latitude} lng: #{longitude} dist: #{dist}" | ||
34 | - end | ||
35 | -end | ||
36 | - | ||
37 | -class ActsAsMappableTest < Test::Unit::TestCase #:nodoc: all | ||
38 | - | ||
39 | - LOCATION_A_IP = "217.10.83.5" | ||
40 | - | ||
41 | - #self.fixture_path = File.dirname(__FILE__) + '/fixtures' | ||
42 | - #self.fixture_path = RAILS_ROOT + '/test/fixtures/' | ||
43 | - #puts "Rails Path #{RAILS_ROOT}" | ||
44 | - #puts "Fixture Path: #{self.fixture_path}" | ||
45 | - #self.fixture_path = ' /Users/bill_eisenhauer/Projects/geokit_test/test/fixtures/' | ||
46 | - fixtures :companies, :locations, :custom_locations, :stores | ||
47 | - | ||
48 | - def setup | ||
49 | - @location_a = GeoKit::GeoLoc.new | ||
50 | - @location_a.lat = 32.918593 | ||
51 | - @location_a.lng = -96.958444 | ||
52 | - @location_a.city = "Irving" | ||
53 | - @location_a.state = "TX" | ||
54 | - @location_a.country_code = "US" | ||
55 | - @location_a.success = true | ||
56 | - | ||
57 | - @sw = GeoKit::LatLng.new(32.91663,-96.982841) | ||
58 | - @ne = GeoKit::LatLng.new(32.96302,-96.919495) | ||
59 | - @bounds_center=GeoKit::LatLng.new((@sw.lat+@ne.lat)/2,(@sw.lng+@ne.lng)/2) | ||
60 | - | ||
61 | - @starbucks = companies(:starbucks) | ||
62 | - @loc_a = locations(:a) | ||
63 | - @custom_loc_a = custom_locations(:a) | ||
64 | - @loc_e = locations(:e) | ||
65 | - @custom_loc_e = custom_locations(:e) | ||
66 | - end | ||
67 | - | ||
68 | - def test_override_default_units_the_hard_way | ||
69 | - Location.default_units = :kms | ||
70 | - locations = Location.find(:all, :origin => @loc_a, :conditions => "distance < 3.97") | ||
71 | - assert_equal 5, locations.size | ||
72 | - locations = Location.count(:origin => @loc_a, :conditions => "distance < 3.97") | ||
73 | - assert_equal 5, locations | ||
74 | - Location.default_units = :miles | ||
75 | - end | ||
76 | - | ||
77 | - def test_include | ||
78 | - locations = Location.find(:all, :origin => @loc_a, :include => :company, :conditions => "company_id = 1") | ||
79 | - assert !locations.empty? | ||
80 | - assert_equal 1, locations[0].company.id | ||
81 | - assert_equal 'Starbucks', locations[0].company.name | ||
82 | - end | ||
83 | - | ||
84 | - def test_distance_between_geocoded | ||
85 | - GeoKit::Geocoders::MultiGeocoder.expects(:geocode).with("Irving, TX").returns(@location_a) | ||
86 | - GeoKit::Geocoders::MultiGeocoder.expects(:geocode).with("San Francisco, CA").returns(@location_a) | ||
87 | - assert_equal 0, Location.distance_between("Irving, TX", "San Francisco, CA") | ||
88 | - end | ||
89 | - | ||
90 | - def test_distance_to_geocoded | ||
91 | - GeoKit::Geocoders::MultiGeocoder.expects(:geocode).with("Irving, TX").returns(@location_a) | ||
92 | - assert_equal 0, @custom_loc_a.distance_to("Irving, TX") | ||
93 | - end | ||
94 | - | ||
95 | - def test_distance_to_geocoded_error | ||
96 | - GeoKit::Geocoders::MultiGeocoder.expects(:geocode).with("Irving, TX").returns(GeoKit::GeoLoc.new) | ||
97 | - assert_raise(GeoKit::Geocoders::GeocodeError) { @custom_loc_a.distance_to("Irving, TX") } | ||
98 | - end | ||
99 | - | ||
100 | - def test_custom_attributes_distance_calculations | ||
101 | - assert_equal 0, @custom_loc_a.distance_to(@loc_a) | ||
102 | - assert_equal 0, CustomLocation.distance_between(@custom_loc_a, @loc_a) | ||
103 | - end | ||
104 | - | ||
105 | - def test_distance_column_in_select | ||
106 | - locations = Location.find(:all, :origin => @loc_a, :order => "distance ASC") | ||
107 | - assert_equal 6, locations.size | ||
108 | - assert_equal 0, @loc_a.distance_to(locations.first) | ||
109 | - assert_in_delta 3.97, @loc_a.distance_to(locations.last, :units => :miles, :formula => :sphere), 0.01 | ||
110 | - end | ||
111 | - | ||
112 | - def test_find_with_distance_condition | ||
113 | - locations = Location.find(:all, :origin => @loc_a, :conditions => "distance < 3.97") | ||
114 | - assert_equal 5, locations.size | ||
115 | - locations = Location.count(:origin => @loc_a, :conditions => "distance < 3.97") | ||
116 | - assert_equal 5, locations | ||
117 | - end | ||
118 | - | ||
119 | - def test_find_with_distance_condition_with_units_override | ||
120 | - locations = Location.find(:all, :origin => @loc_a, :units => :kms, :conditions => "distance < 6.387") | ||
121 | - assert_equal 5, locations.size | ||
122 | - locations = Location.count(:origin => @loc_a, :units => :kms, :conditions => "distance < 6.387") | ||
123 | - assert_equal 5, locations | ||
124 | - end | ||
125 | - | ||
126 | - def test_find_with_distance_condition_with_formula_override | ||
127 | - locations = Location.find(:all, :origin => @loc_a, :formula => :flat, :conditions => "distance < 6.387") | ||
128 | - assert_equal 6, locations.size | ||
129 | - locations = Location.count(:origin => @loc_a, :formula => :flat, :conditions => "distance < 6.387") | ||
130 | - assert_equal 6, locations | ||
131 | - end | ||
132 | - | ||
133 | - def test_find_within | ||
134 | - locations = Location.find_within(3.97, :origin => @loc_a) | ||
135 | - assert_equal 5, locations.size | ||
136 | - locations = Location.count_within(3.97, :origin => @loc_a) | ||
137 | - assert_equal 5, locations | ||
138 | - end | ||
139 | - | ||
140 | - def test_find_within_with_token | ||
141 | - locations = Location.find(:all, :within => 3.97, :origin => @loc_a) | ||
142 | - assert_equal 5, locations.size | ||
143 | - locations = Location.count(:within => 3.97, :origin => @loc_a) | ||
144 | - assert_equal 5, locations | ||
145 | - end | ||
146 | - | ||
147 | - def test_find_within_with_coordinates | ||
148 | - locations = Location.find_within(3.97, :origin =>[@loc_a.lat,@loc_a.lng]) | ||
149 | - assert_equal 5, locations.size | ||
150 | - locations = Location.count_within(3.97, :origin =>[@loc_a.lat,@loc_a.lng]) | ||
151 | - assert_equal 5, locations | ||
152 | - end | ||
153 | - | ||
154 | - def test_find_with_compound_condition | ||
155 | - locations = Location.find(:all, :origin => @loc_a, :conditions => "distance < 5 and city = 'Coppell'") | ||
156 | - assert_equal 2, locations.size | ||
157 | - locations = Location.count(:origin => @loc_a, :conditions => "distance < 5 and city = 'Coppell'") | ||
158 | - assert_equal 2, locations | ||
159 | - end | ||
160 | - | ||
161 | - def test_find_with_secure_compound_condition | ||
162 | - locations = Location.find(:all, :origin => @loc_a, :conditions => ["distance < ? and city = ?", 5, 'Coppell']) | ||
163 | - assert_equal 2, locations.size | ||
164 | - locations = Location.count(:origin => @loc_a, :conditions => ["distance < ? and city = ?", 5, 'Coppell']) | ||
165 | - assert_equal 2, locations | ||
166 | - end | ||
167 | - | ||
168 | - def test_find_beyond | ||
169 | - locations = Location.find_beyond(3.95, :origin => @loc_a) | ||
170 | - assert_equal 1, locations.size | ||
171 | - locations = Location.count_beyond(3.95, :origin => @loc_a) | ||
172 | - assert_equal 1, locations | ||
173 | - end | ||
174 | - | ||
175 | - def test_find_beyond_with_token | ||
176 | - locations = Location.find(:all, :beyond => 3.95, :origin => @loc_a) | ||
177 | - assert_equal 1, locations.size | ||
178 | - locations = Location.count(:beyond => 3.95, :origin => @loc_a) | ||
179 | - assert_equal 1, locations | ||
180 | - end | ||
181 | - | ||
182 | - def test_find_beyond_with_coordinates | ||
183 | - locations = Location.find_beyond(3.95, :origin =>[@loc_a.lat, @loc_a.lng]) | ||
184 | - assert_equal 1, locations.size | ||
185 | - locations = Location.count_beyond(3.95, :origin =>[@loc_a.lat, @loc_a.lng]) | ||
186 | - assert_equal 1, locations | ||
187 | - end | ||
188 | - | ||
189 | - def test_find_range_with_token | ||
190 | - locations = Location.find(:all, :range => 0..10, :origin => @loc_a) | ||
191 | - assert_equal 6, locations.size | ||
192 | - locations = Location.count(:range => 0..10, :origin => @loc_a) | ||
193 | - assert_equal 6, locations | ||
194 | - end | ||
195 | - | ||
196 | - def test_find_range_with_token_with_conditions | ||
197 | - locations = Location.find(:all, :origin => @loc_a, :range => 0..10, :conditions => ["city = ?", 'Coppell']) | ||
198 | - assert_equal 2, locations.size | ||
199 | - locations = Location.count(:origin => @loc_a, :range => 0..10, :conditions => ["city = ?", 'Coppell']) | ||
200 | - assert_equal 2, locations | ||
201 | - end | ||
202 | - | ||
203 | - def test_find_range_with_token_excluding_end | ||
204 | - locations = Location.find(:all, :range => 0...10, :origin => @loc_a) | ||
205 | - assert_equal 6, locations.size | ||
206 | - locations = Location.count(:range => 0...10, :origin => @loc_a) | ||
207 | - assert_equal 6, locations | ||
208 | - end | ||
209 | - | ||
210 | - def test_find_nearest | ||
211 | - assert_equal @loc_a, Location.find_nearest(:origin => @loc_a) | ||
212 | - end | ||
213 | - | ||
214 | - def test_find_nearest_through_find | ||
215 | - assert_equal @loc_a, Location.find(:nearest, :origin => @loc_a) | ||
216 | - end | ||
217 | - | ||
218 | - def test_find_nearest_with_coordinates | ||
219 | - assert_equal @loc_a, Location.find_nearest(:origin =>[@loc_a.lat, @loc_a.lng]) | ||
220 | - end | ||
221 | - | ||
222 | - def test_find_farthest | ||
223 | - assert_equal @loc_e, Location.find_farthest(:origin => @loc_a) | ||
224 | - end | ||
225 | - | ||
226 | - def test_find_farthest_through_find | ||
227 | - assert_equal @loc_e, Location.find(:farthest, :origin => @loc_a) | ||
228 | - end | ||
229 | - | ||
230 | - def test_find_farthest_with_coordinates | ||
231 | - assert_equal @loc_e, Location.find_farthest(:origin =>[@loc_a.lat, @loc_a.lng]) | ||
232 | - end | ||
233 | - | ||
234 | - def test_scoped_distance_column_in_select | ||
235 | - locations = @starbucks.locations.find(:all, :origin => @loc_a, :order => "distance ASC") | ||
236 | - assert_equal 5, locations.size | ||
237 | - assert_equal 0, @loc_a.distance_to(locations.first) | ||
238 | - assert_in_delta 3.97, @loc_a.distance_to(locations.last, :units => :miles, :formula => :sphere), 0.01 | ||
239 | - end | ||
240 | - | ||
241 | - def test_scoped_find_with_distance_condition | ||
242 | - locations = @starbucks.locations.find(:all, :origin => @loc_a, :conditions => "distance < 3.97") | ||
243 | - assert_equal 4, locations.size | ||
244 | - locations = @starbucks.locations.count(:origin => @loc_a, :conditions => "distance < 3.97") | ||
245 | - assert_equal 4, locations | ||
246 | - end | ||
247 | - | ||
248 | - def test_scoped_find_within | ||
249 | - locations = @starbucks.locations.find_within(3.97, :origin => @loc_a) | ||
250 | - assert_equal 4, locations.size | ||
251 | - locations = @starbucks.locations.count_within(3.97, :origin => @loc_a) | ||
252 | - assert_equal 4, locations | ||
253 | - end | ||
254 | - | ||
255 | - def test_scoped_find_with_compound_condition | ||
256 | - locations = @starbucks.locations.find(:all, :origin => @loc_a, :conditions => "distance < 5 and city = 'Coppell'") | ||
257 | - assert_equal 2, locations.size | ||
258 | - locations = @starbucks.locations.count( :origin => @loc_a, :conditions => "distance < 5 and city = 'Coppell'") | ||
259 | - assert_equal 2, locations | ||
260 | - end | ||
261 | - | ||
262 | - def test_scoped_find_beyond | ||
263 | - locations = @starbucks.locations.find_beyond(3.95, :origin => @loc_a) | ||
264 | - assert_equal 1, locations.size | ||
265 | - locations = @starbucks.locations.count_beyond(3.95, :origin => @loc_a) | ||
266 | - assert_equal 1, locations | ||
267 | - end | ||
268 | - | ||
269 | - def test_scoped_find_nearest | ||
270 | - assert_equal @loc_a, @starbucks.locations.find_nearest(:origin => @loc_a) | ||
271 | - end | ||
272 | - | ||
273 | - def test_scoped_find_farthest | ||
274 | - assert_equal @loc_e, @starbucks.locations.find_farthest(:origin => @loc_a) | ||
275 | - end | ||
276 | - | ||
277 | - def test_ip_geocoded_distance_column_in_select | ||
278 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
279 | - locations = Location.find(:all, :origin => LOCATION_A_IP, :order => "distance ASC") | ||
280 | - assert_equal 6, locations.size | ||
281 | - assert_equal 0, @loc_a.distance_to(locations.first) | ||
282 | - assert_in_delta 3.97, @loc_a.distance_to(locations.last, :units => :miles, :formula => :sphere), 0.01 | ||
283 | - end | ||
284 | - | ||
285 | - def test_ip_geocoded_find_with_distance_condition | ||
286 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
287 | - locations = Location.find(:all, :origin => LOCATION_A_IP, :conditions => "distance < 3.97") | ||
288 | - assert_equal 5, locations.size | ||
289 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
290 | - locations = Location.count(:origin => LOCATION_A_IP, :conditions => "distance < 3.97") | ||
291 | - assert_equal 5, locations | ||
292 | - end | ||
293 | - | ||
294 | - def test_ip_geocoded_find_within | ||
295 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
296 | - locations = Location.find_within(3.97, :origin => LOCATION_A_IP) | ||
297 | - assert_equal 5, locations.size | ||
298 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
299 | - locations = Location.count_within(3.97, :origin => LOCATION_A_IP) | ||
300 | - assert_equal 5, locations | ||
301 | - end | ||
302 | - | ||
303 | - def test_ip_geocoded_find_with_compound_condition | ||
304 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
305 | - locations = Location.find(:all, :origin => LOCATION_A_IP, :conditions => "distance < 5 and city = 'Coppell'") | ||
306 | - assert_equal 2, locations.size | ||
307 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
308 | - locations = Location.count(:origin => LOCATION_A_IP, :conditions => "distance < 5 and city = 'Coppell'") | ||
309 | - assert_equal 2, locations | ||
310 | - end | ||
311 | - | ||
312 | - def test_ip_geocoded_find_with_secure_compound_condition | ||
313 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
314 | - locations = Location.find(:all, :origin => LOCATION_A_IP, :conditions => ["distance < ? and city = ?", 5, 'Coppell']) | ||
315 | - assert_equal 2, locations.size | ||
316 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
317 | - locations = Location.count(:origin => LOCATION_A_IP, :conditions => ["distance < ? and city = ?", 5, 'Coppell']) | ||
318 | - assert_equal 2, locations | ||
319 | - end | ||
320 | - | ||
321 | - def test_ip_geocoded_find_beyond | ||
322 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
323 | - locations = Location.find_beyond(3.95, :origin => LOCATION_A_IP) | ||
324 | - assert_equal 1, locations.size | ||
325 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
326 | - locations = Location.count_beyond(3.95, :origin => LOCATION_A_IP) | ||
327 | - assert_equal 1, locations | ||
328 | - end | ||
329 | - | ||
330 | - def test_ip_geocoded_find_nearest | ||
331 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
332 | - assert_equal @loc_a, Location.find_nearest(:origin => LOCATION_A_IP) | ||
333 | - end | ||
334 | - | ||
335 | - def test_ip_geocoded_find_farthest | ||
336 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with(LOCATION_A_IP).returns(@location_a) | ||
337 | - assert_equal @loc_e, Location.find_farthest(:origin => LOCATION_A_IP) | ||
338 | - end | ||
339 | - | ||
340 | - def test_ip_geocoder_exception | ||
341 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with('127.0.0.1').returns(GeoKit::GeoLoc.new) | ||
342 | - assert_raises GeoKit::Geocoders::GeocodeError do | ||
343 | - Location.find_farthest(:origin => '127.0.0.1') | ||
344 | - end | ||
345 | - end | ||
346 | - | ||
347 | - def test_address_geocode | ||
348 | - GeoKit::Geocoders::MultiGeocoder.expects(:geocode).with('Irving, TX').returns(@location_a) | ||
349 | - locations = Location.find(:all, :origin => 'Irving, TX', :conditions => ["distance < ? and city = ?", 5, 'Coppell']) | ||
350 | - assert_equal 2, locations.size | ||
351 | - end | ||
352 | - | ||
353 | - def test_find_with_custom_distance_condition | ||
354 | - locations = CustomLocation.find(:all, :origin => @loc_a, :conditions => "dist < 3.97") | ||
355 | - assert_equal 5, locations.size | ||
356 | - locations = CustomLocation.count(:origin => @loc_a, :conditions => "dist < 3.97") | ||
357 | - assert_equal 5, locations | ||
358 | - end | ||
359 | - | ||
360 | - def test_find_with_custom_distance_condition_using_custom_origin | ||
361 | - locations = CustomLocation.find(:all, :origin => @custom_loc_a, :conditions => "dist < 3.97") | ||
362 | - assert_equal 5, locations.size | ||
363 | - locations = CustomLocation.count(:origin => @custom_loc_a, :conditions => "dist < 3.97") | ||
364 | - assert_equal 5, locations | ||
365 | - end | ||
366 | - | ||
367 | - def test_find_within_with_custom | ||
368 | - locations = CustomLocation.find_within(3.97, :origin => @loc_a) | ||
369 | - assert_equal 5, locations.size | ||
370 | - locations = CustomLocation.count_within(3.97, :origin => @loc_a) | ||
371 | - assert_equal 5, locations | ||
372 | - end | ||
373 | - | ||
374 | - def test_find_within_with_coordinates_with_custom | ||
375 | - locations = CustomLocation.find_within(3.97, :origin =>[@loc_a.lat, @loc_a.lng]) | ||
376 | - assert_equal 5, locations.size | ||
377 | - locations = CustomLocation.count_within(3.97, :origin =>[@loc_a.lat, @loc_a.lng]) | ||
378 | - assert_equal 5, locations | ||
379 | - end | ||
380 | - | ||
381 | - def test_find_with_compound_condition_with_custom | ||
382 | - locations = CustomLocation.find(:all, :origin => @loc_a, :conditions => "dist < 5 and city = 'Coppell'") | ||
383 | - assert_equal 1, locations.size | ||
384 | - locations = CustomLocation.count(:origin => @loc_a, :conditions => "dist < 5 and city = 'Coppell'") | ||
385 | - assert_equal 1, locations | ||
386 | - end | ||
387 | - | ||
388 | - def test_find_with_secure_compound_condition_with_custom | ||
389 | - locations = CustomLocation.find(:all, :origin => @loc_a, :conditions => ["dist < ? and city = ?", 5, 'Coppell']) | ||
390 | - assert_equal 1, locations.size | ||
391 | - locations = CustomLocation.count(:origin => @loc_a, :conditions => ["dist < ? and city = ?", 5, 'Coppell']) | ||
392 | - assert_equal 1, locations | ||
393 | - end | ||
394 | - | ||
395 | - def test_find_beyond_with_custom | ||
396 | - locations = CustomLocation.find_beyond(3.95, :origin => @loc_a) | ||
397 | - assert_equal 1, locations.size | ||
398 | - locations = CustomLocation.count_beyond(3.95, :origin => @loc_a) | ||
399 | - assert_equal 1, locations | ||
400 | - end | ||
401 | - | ||
402 | - def test_find_beyond_with_coordinates_with_custom | ||
403 | - locations = CustomLocation.find_beyond(3.95, :origin =>[@loc_a.lat, @loc_a.lng]) | ||
404 | - assert_equal 1, locations.size | ||
405 | - locations = CustomLocation.count_beyond(3.95, :origin =>[@loc_a.lat, @loc_a.lng]) | ||
406 | - assert_equal 1, locations | ||
407 | - end | ||
408 | - | ||
409 | - def test_find_nearest_with_custom | ||
410 | - assert_equal @custom_loc_a, CustomLocation.find_nearest(:origin => @loc_a) | ||
411 | - end | ||
412 | - | ||
413 | - def test_find_nearest_with_coordinates_with_custom | ||
414 | - assert_equal @custom_loc_a, CustomLocation.find_nearest(:origin =>[@loc_a.lat, @loc_a.lng]) | ||
415 | - end | ||
416 | - | ||
417 | - def test_find_farthest_with_custom | ||
418 | - assert_equal @custom_loc_e, CustomLocation.find_farthest(:origin => @loc_a) | ||
419 | - end | ||
420 | - | ||
421 | - def test_find_farthest_with_coordinates_with_custom | ||
422 | - assert_equal @custom_loc_e, CustomLocation.find_farthest(:origin =>[@loc_a.lat, @loc_a.lng]) | ||
423 | - end | ||
424 | - | ||
425 | - def test_find_with_array_origin | ||
426 | - locations = Location.find(:all, :origin =>[@loc_a.lat,@loc_a.lng], :conditions => "distance < 3.97") | ||
427 | - assert_equal 5, locations.size | ||
428 | - locations = Location.count(:origin =>[@loc_a.lat,@loc_a.lng], :conditions => "distance < 3.97") | ||
429 | - assert_equal 5, locations | ||
430 | - end | ||
431 | - | ||
432 | - | ||
433 | - # Bounding box tests | ||
434 | - | ||
435 | - def test_find_within_bounds | ||
436 | - locations = Location.find_within_bounds([@sw,@ne]) | ||
437 | - assert_equal 2, locations.size | ||
438 | - locations = Location.count_within_bounds([@sw,@ne]) | ||
439 | - assert_equal 2, locations | ||
440 | - end | ||
441 | - | ||
442 | - def test_find_within_bounds_ordered_by_distance | ||
443 | - locations = Location.find_within_bounds([@sw,@ne], :origin=>@bounds_center, :order=>'distance asc') | ||
444 | - assert_equal locations[0], locations(:d) | ||
445 | - assert_equal locations[1], locations(:a) | ||
446 | - end | ||
447 | - | ||
448 | - def test_find_within_bounds_with_token | ||
449 | - locations = Location.find(:all, :bounds=>[@sw,@ne]) | ||
450 | - assert_equal 2, locations.size | ||
451 | - locations = Location.count(:bounds=>[@sw,@ne]) | ||
452 | - assert_equal 2, locations | ||
453 | - end | ||
454 | - | ||
455 | - def test_find_within_bounds_with_string_conditions | ||
456 | - locations = Location.find(:all, :bounds=>[@sw,@ne], :conditions=>"id !=#{locations(:a).id}") | ||
457 | - assert_equal 1, locations.size | ||
458 | - end | ||
459 | - | ||
460 | - def test_find_within_bounds_with_array_conditions | ||
461 | - locations = Location.find(:all, :bounds=>[@sw,@ne], :conditions=>["id != ?", locations(:a).id]) | ||
462 | - assert_equal 1, locations.size | ||
463 | - end | ||
464 | - | ||
465 | - def test_auto_geocode | ||
466 | - GeoKit::Geocoders::MultiGeocoder.expects(:geocode).with("Irving, TX").returns(@location_a) | ||
467 | - store=Store.new(:address=>'Irving, TX') | ||
468 | - store.save | ||
469 | - assert_equal store.lat,@location_a.lat | ||
470 | - assert_equal store.lng,@location_a.lng | ||
471 | - assert_equal 0, store.errors.size | ||
472 | - end | ||
473 | - | ||
474 | - def test_auto_geocode_failure | ||
475 | - GeoKit::Geocoders::MultiGeocoder.expects(:geocode).with("BOGUS").returns(GeoKit::GeoLoc.new) | ||
476 | - store=Store.new(:address=>'BOGUS') | ||
477 | - store.save | ||
478 | - assert store.new_record? | ||
479 | - assert_equal 1, store.errors.size | ||
480 | - end | ||
481 | -end |
vendor/plugins/geokit/test/base_geocoder_test.rb
@@ -1,57 +0,0 @@ | @@ -1,57 +0,0 @@ | ||
1 | -require 'test/unit' | ||
2 | -require 'net/http' | ||
3 | -require 'rubygems' | ||
4 | -require 'mocha' | ||
5 | -require File.join(File.dirname(__FILE__), '../../../../config/environment') | ||
6 | - | ||
7 | - | ||
8 | -class MockSuccess < Net::HTTPSuccess #:nodoc: all | ||
9 | - def initialize | ||
10 | - end | ||
11 | -end | ||
12 | - | ||
13 | -class MockFailure < Net::HTTPServiceUnavailable #:nodoc: all | ||
14 | - def initialize | ||
15 | - end | ||
16 | -end | ||
17 | - | ||
18 | -# Base class for testing geocoders. | ||
19 | -class BaseGeocoderTest < Test::Unit::TestCase #:nodoc: all | ||
20 | - | ||
21 | - # Defines common test fixtures. | ||
22 | - def setup | ||
23 | - @address = 'San Francisco, CA' | ||
24 | - @full_address = '100 Spear St, San Francisco, CA, 94105-1522, US' | ||
25 | - @full_address_short_zip = '100 Spear St, San Francisco, CA, 94105, US' | ||
26 | - | ||
27 | - @success = GeoKit::GeoLoc.new({:city=>"SAN FRANCISCO", :state=>"CA", :country_code=>"US", :lat=>37.7742, :lng=>-122.417068}) | ||
28 | - @success.success = true | ||
29 | - end | ||
30 | - | ||
31 | - def test_timeout_call_web_service | ||
32 | - GeoKit::Geocoders::Geocoder.class_eval do | ||
33 | - def self.do_get(url) | ||
34 | - sleep(2) | ||
35 | - end | ||
36 | - end | ||
37 | - url = "http://www.anything.com" | ||
38 | - GeoKit::Geocoders::timeout = 1 | ||
39 | - assert_nil GeoKit::Geocoders::Geocoder.call_geocoder_service(url) | ||
40 | - end | ||
41 | - | ||
42 | - def test_successful_call_web_service | ||
43 | - url = "http://www.anything.com" | ||
44 | - GeoKit::Geocoders::Geocoder.expects(:do_get).with(url).returns("SUCCESS") | ||
45 | - assert_equal "SUCCESS", GeoKit::Geocoders::Geocoder.call_geocoder_service(url) | ||
46 | - end | ||
47 | - | ||
48 | - def test_find_geocoder_methods | ||
49 | - public_methods = GeoKit::Geocoders::Geocoder.public_methods | ||
50 | - assert public_methods.include?("yahoo_geocoder") | ||
51 | - assert public_methods.include?("google_geocoder") | ||
52 | - assert public_methods.include?("ca_geocoder") | ||
53 | - assert public_methods.include?("us_geocoder") | ||
54 | - assert public_methods.include?("multi_geocoder") | ||
55 | - assert public_methods.include?("ip_geocoder") | ||
56 | - end | ||
57 | -end | ||
58 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/bounds_test.rb
@@ -1,75 +0,0 @@ | @@ -1,75 +0,0 @@ | ||
1 | -$LOAD_PATH.unshift File.join('..', 'lib') | ||
2 | -require 'geo_kit/mappable' | ||
3 | -require 'test/unit' | ||
4 | - | ||
5 | -class BoundsTest < Test::Unit::TestCase #:nodoc: all | ||
6 | - | ||
7 | - def setup | ||
8 | - # This is the area in Texas | ||
9 | - @sw = GeoKit::LatLng.new(32.91663,-96.982841) | ||
10 | - @ne = GeoKit::LatLng.new(32.96302,-96.919495) | ||
11 | - @bounds=GeoKit::Bounds.new(@sw,@ne) | ||
12 | - @loc_a=GeoKit::LatLng.new(32.918593,-96.958444) # inside bounds | ||
13 | - @loc_b=GeoKit::LatLng.new(32.914144,-96.958444) # outside bouds | ||
14 | - | ||
15 | - # this is a cross-meridan area | ||
16 | - @cross_meridian=GeoKit::Bounds.normalize([30,170],[40,-170]) | ||
17 | - @inside_cm=GeoKit::LatLng.new(35,175) | ||
18 | - @inside_cm_2=GeoKit::LatLng.new(35,-175) | ||
19 | - @east_of_cm=GeoKit::LatLng.new(35,-165) | ||
20 | - @west_of_cm=GeoKit::LatLng.new(35,165) | ||
21 | - | ||
22 | - end | ||
23 | - | ||
24 | - def test_equality | ||
25 | - assert_equal GeoKit::Bounds.new(@sw,@ne), GeoKit::Bounds.new(@sw,@ne) | ||
26 | - end | ||
27 | - | ||
28 | - def test_normalize | ||
29 | - res=GeoKit::Bounds.normalize(@sw,@ne) | ||
30 | - assert_equal res,GeoKit::Bounds.new(@sw,@ne) | ||
31 | - res=GeoKit::Bounds.normalize([@sw,@ne]) | ||
32 | - assert_equal res,GeoKit::Bounds.new(@sw,@ne) | ||
33 | - res=GeoKit::Bounds.normalize([@sw.lat,@sw.lng],[@ne.lat,@ne.lng]) | ||
34 | - assert_equal res,GeoKit::Bounds.new(@sw,@ne) | ||
35 | - res=GeoKit::Bounds.normalize([[@sw.lat,@sw.lng],[@ne.lat,@ne.lng]]) | ||
36 | - assert_equal res,GeoKit::Bounds.new(@sw,@ne) | ||
37 | - end | ||
38 | - | ||
39 | - def test_point_inside_bounds | ||
40 | - assert @bounds.contains?(@loc_a) | ||
41 | - end | ||
42 | - | ||
43 | - def test_point_outside_bounds | ||
44 | - assert !@bounds.contains?(@loc_b) | ||
45 | - end | ||
46 | - | ||
47 | - def test_point_inside_bounds_cross_meridian | ||
48 | - assert @cross_meridian.contains?(@inside_cm) | ||
49 | - assert @cross_meridian.contains?(@inside_cm_2) | ||
50 | - end | ||
51 | - | ||
52 | - def test_point_outside_bounds_cross_meridian | ||
53 | - assert !@cross_meridian.contains?(@east_of_cm) | ||
54 | - assert !@cross_meridian.contains?(@west_of_cm) | ||
55 | - end | ||
56 | - | ||
57 | - def test_center | ||
58 | - assert_in_delta 32.939828,@bounds.center.lat,0.00005 | ||
59 | - assert_in_delta -96.9511763,@bounds.center.lng,0.00005 | ||
60 | - end | ||
61 | - | ||
62 | - def test_center_cross_meridian | ||
63 | - assert_in_delta 35.41160, @cross_meridian.center.lat,0.00005 | ||
64 | - assert_in_delta 179.38112, @cross_meridian.center.lng,0.00005 | ||
65 | - end | ||
66 | - | ||
67 | - def test_creation_from_circle | ||
68 | - bounds=GeoKit::Bounds.from_point_and_radius([32.939829, -96.951176],2.5) | ||
69 | - inside=GeoKit::LatLng.new 32.9695270000,-96.9901590000 | ||
70 | - outside=GeoKit::LatLng.new 32.8951550000,-96.9584440000 | ||
71 | - assert bounds.contains?(inside) | ||
72 | - assert !bounds.contains?(outside) | ||
73 | - end | ||
74 | - | ||
75 | -end | ||
76 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/ca_geocoder_test.rb
@@ -1,41 +0,0 @@ | @@ -1,41 +0,0 @@ | ||
1 | -require File.join(File.dirname(__FILE__), 'base_geocoder_test') | ||
2 | - | ||
3 | -GeoKit::Geocoders::geocoder_ca = "SOMEKEYVALUE" | ||
4 | - | ||
5 | -class CaGeocoderTest < BaseGeocoderTest #:nodoc: all | ||
6 | - | ||
7 | - CA_SUCCESS=<<-EOF | ||
8 | - <?xml version="1.0" encoding="UTF-8" ?> | ||
9 | - <geodata><latt>49.243086</latt><longt>-123.153684</longt></geodata> | ||
10 | - EOF | ||
11 | - | ||
12 | - def setup | ||
13 | - @ca_full_hash = {:street_address=>"2105 West 32nd Avenue",:city=>"Vancouver", :state=>"BC"} | ||
14 | - @ca_full_loc = GeoKit::GeoLoc.new(@ca_full_hash) | ||
15 | - end | ||
16 | - | ||
17 | - def test_geocoder_with_geo_loc_with_account | ||
18 | - response = MockSuccess.new | ||
19 | - response.expects(:body).returns(CA_SUCCESS) | ||
20 | - url = "http://geocoder.ca/?stno=2105&addresst=West+32nd+Avenue&city=Vancouver&prov=BC&auth=SOMEKEYVALUE&geoit=xml" | ||
21 | - GeoKit::Geocoders::CaGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
22 | - verify(GeoKit::Geocoders::CaGeocoder.geocode(@ca_full_loc)) | ||
23 | - end | ||
24 | - | ||
25 | - def test_service_unavailable | ||
26 | - response = MockFailure.new | ||
27 | - #Net::HTTP.expects(:get_response).with(URI.parse("http://geocoder.ca/?stno=2105&addresst=West+32nd+Avenue&city=Vancouver&prov=BC&auth=SOMEKEYVALUE&geoit=xml")).returns(response) | ||
28 | - url = "http://geocoder.ca/?stno=2105&addresst=West+32nd+Avenue&city=Vancouver&prov=BC&auth=SOMEKEYVALUE&geoit=xml" | ||
29 | - GeoKit::Geocoders::CaGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
30 | - assert !GeoKit::Geocoders::CaGeocoder.geocode(@ca_full_loc).success | ||
31 | - end | ||
32 | - | ||
33 | - private | ||
34 | - | ||
35 | - def verify(location) | ||
36 | - assert_equal "BC", location.state | ||
37 | - assert_equal "Vancouver", location.city | ||
38 | - assert_equal "49.243086,-123.153684", location.ll | ||
39 | - assert !location.is_us? | ||
40 | - end | ||
41 | -end | ||
42 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/database.yml
@@ -1,15 +0,0 @@ | @@ -1,15 +0,0 @@ | ||
1 | -mysql: | ||
2 | - adapter: mysql | ||
3 | - host: localhost | ||
4 | - username: root | ||
5 | - password: | ||
6 | - database: geokit_plugin_test | ||
7 | -postgresql: | ||
8 | - adapter: postgresql | ||
9 | - host: localhost | ||
10 | - username: root | ||
11 | - password: | ||
12 | - database: geokit_plugin_test | ||
13 | -sqlite: | ||
14 | - adapter: sqlite3 | ||
15 | - database: tmp/geokit_plugin_test.sqlite3 |
vendor/plugins/geokit/test/fixtures/companies.yml
vendor/plugins/geokit/test/fixtures/custom_locations.yml
@@ -1,54 +0,0 @@ | @@ -1,54 +0,0 @@ | ||
1 | -a: | ||
2 | - id: 1 | ||
3 | - company_id: 1 | ||
4 | - street: 7979 N MacArthur Blvd | ||
5 | - city: Irving | ||
6 | - state: TX | ||
7 | - postal_code: 75063 | ||
8 | - latitude: 32.918593 | ||
9 | - longitude: -96.958444 | ||
10 | -b: | ||
11 | - id: 2 | ||
12 | - company_id: 1 | ||
13 | - street: 7750 N Macarthur Blvd # 160 | ||
14 | - city: Irving | ||
15 | - state: TX | ||
16 | - postal_code: 75063 | ||
17 | - latitude: 32.914144 | ||
18 | - longitude: -96.958444 | ||
19 | -c: | ||
20 | - id: 3 | ||
21 | - company_id: 1 | ||
22 | - street: 5904 N Macarthur Blvd # 160 | ||
23 | - city: Irving | ||
24 | - state: TX | ||
25 | - postal_code: 75039 | ||
26 | - latitude: 32.895155 | ||
27 | - longitude: -96.958444 | ||
28 | -d: | ||
29 | - id: 4 | ||
30 | - company_id: 1 | ||
31 | - street: 817 S Macarthur Blvd # 145 | ||
32 | - city: Coppell | ||
33 | - state: TX | ||
34 | - postal_code: 75019 | ||
35 | - latitude: 32.951613 | ||
36 | - longitude: -96.958444 | ||
37 | -e: | ||
38 | - id: 5 | ||
39 | - company_id: 1 | ||
40 | - street: 106 N Denton Tap Rd # 350 | ||
41 | - city: Coppell | ||
42 | - state: TX | ||
43 | - postal_code: 75019 | ||
44 | - latitude: 32.969527 | ||
45 | - longitude: -96.990159 | ||
46 | -f: | ||
47 | - id: 6 | ||
48 | - company_id: 2 | ||
49 | - street: 5904 N Macarthur Blvd # 160 | ||
50 | - city: Irving | ||
51 | - state: TX | ||
52 | - postal_code: 75039 | ||
53 | - latitude: 32.895155 | ||
54 | - longitude: -96.958444 | ||
55 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/fixtures/locations.yml
@@ -1,54 +0,0 @@ | @@ -1,54 +0,0 @@ | ||
1 | -a: | ||
2 | - id: 1 | ||
3 | - company_id: 1 | ||
4 | - street: 7979 N MacArthur Blvd | ||
5 | - city: Irving | ||
6 | - state: TX | ||
7 | - postal_code: 75063 | ||
8 | - lat: 32.918593 | ||
9 | - lng: -96.958444 | ||
10 | -b: | ||
11 | - id: 2 | ||
12 | - company_id: 1 | ||
13 | - street: 7750 N Macarthur Blvd # 160 | ||
14 | - city: Irving | ||
15 | - state: TX | ||
16 | - postal_code: 75063 | ||
17 | - lat: 32.914144 | ||
18 | - lng: -96.958444 | ||
19 | -c: | ||
20 | - id: 3 | ||
21 | - company_id: 1 | ||
22 | - street: 5904 N Macarthur Blvd # 160 | ||
23 | - city: Irving | ||
24 | - state: TX | ||
25 | - postal_code: 75039 | ||
26 | - lat: 32.895155 | ||
27 | - lng: -96.958444 | ||
28 | -d: | ||
29 | - id: 4 | ||
30 | - company_id: 1 | ||
31 | - street: 817 S Macarthur Blvd # 145 | ||
32 | - city: Coppell | ||
33 | - state: TX | ||
34 | - postal_code: 75019 | ||
35 | - lat: 32.951613 | ||
36 | - lng: -96.958444 | ||
37 | -e: | ||
38 | - id: 5 | ||
39 | - company_id: 1 | ||
40 | - street: 106 N Denton Tap Rd # 350 | ||
41 | - city: Coppell | ||
42 | - state: TX | ||
43 | - postal_code: 75019 | ||
44 | - lat: 32.969527 | ||
45 | - lng: -96.990159 | ||
46 | -f: | ||
47 | - id: 6 | ||
48 | - company_id: 2 | ||
49 | - street: 5904 N Macarthur Blvd # 160 | ||
50 | - city: Irving | ||
51 | - state: TX | ||
52 | - postal_code: 75039 | ||
53 | - lat: 32.895155 | ||
54 | - lng: -96.958444 | ||
55 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/fixtures/stores.yml
vendor/plugins/geokit/test/geoloc_test.rb
@@ -1,49 +0,0 @@ | @@ -1,49 +0,0 @@ | ||
1 | -require 'test/unit' | ||
2 | -require File.join(File.dirname(__FILE__), '../../../../config/environment') | ||
3 | - | ||
4 | -class GeoLocTest < Test::Unit::TestCase #:nodoc: all | ||
5 | - | ||
6 | - def setup | ||
7 | - @loc = GeoKit::GeoLoc.new | ||
8 | - end | ||
9 | - | ||
10 | - def test_is_us | ||
11 | - assert !@loc.is_us? | ||
12 | - @loc.country_code = 'US' | ||
13 | - assert @loc.is_us? | ||
14 | - end | ||
15 | - | ||
16 | - def test_street_number | ||
17 | - @loc.street_address = '123 Spear St.' | ||
18 | - assert_equal '123', @loc.street_number | ||
19 | - end | ||
20 | - | ||
21 | - def test_street_name | ||
22 | - @loc.street_address = '123 Spear St.' | ||
23 | - assert_equal 'Spear St.', @loc.street_name | ||
24 | - end | ||
25 | - | ||
26 | - def test_city | ||
27 | - @loc.city = "san francisco" | ||
28 | - assert_equal 'San Francisco', @loc.city | ||
29 | - end | ||
30 | - | ||
31 | - def test_full_address | ||
32 | - @loc.city = 'San Francisco' | ||
33 | - @loc.state = 'CA' | ||
34 | - @loc.zip = '94105' | ||
35 | - @loc.country_code = 'US' | ||
36 | - assert_equal 'San Francisco, CA, 94105, US', @loc.full_address | ||
37 | - @loc.full_address = 'Irving, TX, 75063, US' | ||
38 | - assert_equal 'Irving, TX, 75063, US', @loc.full_address | ||
39 | - end | ||
40 | - | ||
41 | - def test_hash | ||
42 | - @loc.city = 'San Francisco' | ||
43 | - @loc.state = 'CA' | ||
44 | - @loc.zip = '94105' | ||
45 | - @loc.country_code = 'US' | ||
46 | - @another = GeoKit::GeoLoc.new @loc.to_hash | ||
47 | - assert_equal @loc, @another | ||
48 | - end | ||
49 | -end | ||
50 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/google_geocoder_test.rb
@@ -1,88 +0,0 @@ | @@ -1,88 +0,0 @@ | ||
1 | -require File.join(File.dirname(__FILE__), 'base_geocoder_test') | ||
2 | - | ||
3 | -GeoKit::Geocoders::google = 'Google' | ||
4 | - | ||
5 | -class GoogleGeocoderTest < BaseGeocoderTest #:nodoc: all | ||
6 | - | ||
7 | - GOOGLE_FULL=<<-EOF.strip | ||
8 | - <?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://earth.google.com/kml/2.0"><Response><name>100 spear st, san francisco, ca</name><Status><code>200</code><request>geocode</request></Status><Placemark><address>100 Spear St, San Francisco, CA 94105, USA</address><AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>US</CountryNameCode><AdministrativeArea><AdministrativeAreaName>CA</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>San Francisco</SubAdministrativeAreaName><Locality><LocalityName>San Francisco</LocalityName><Thoroughfare><ThoroughfareName>100 Spear St</ThoroughfareName></Thoroughfare><PostalCode><PostalCodeNumber>94105</PostalCodeNumber></PostalCode></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails><Point><coordinates>-122.393985,37.792501,0</coordinates></Point></Placemark></Response></kml> | ||
9 | - EOF | ||
10 | - | ||
11 | - GOOGLE_CITY=<<-EOF.strip | ||
12 | - <?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://earth.google.com/kml/2.0"><Response><name>San Francisco</name><Status><code>200</code><request>geocode</request></Status><Placemark><address>San Francisco, CA, USA</address><AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>US</CountryNameCode><AdministrativeArea><AdministrativeAreaName>CA</AdministrativeAreaName><Locality><LocalityName>San Francisco</LocalityName></Locality></AdministrativeArea></Country></AddressDetails><Point><coordinates>-122.418333,37.775000,0</coordinates></Point></Placemark></Response></kml> | ||
13 | - EOF | ||
14 | - | ||
15 | - def setup | ||
16 | - super | ||
17 | - @google_full_hash = {:street_address=>"100 Spear St", :city=>"San Francisco", :state=>"CA", :zip=>"94105", :country_code=>"US"} | ||
18 | - @google_city_hash = {:city=>"San Francisco", :state=>"CA"} | ||
19 | - | ||
20 | - @google_full_loc = GeoKit::GeoLoc.new(@google_full_hash) | ||
21 | - @google_city_loc = GeoKit::GeoLoc.new(@google_city_hash) | ||
22 | - end | ||
23 | - | ||
24 | - def test_google_full_address | ||
25 | - response = MockSuccess.new | ||
26 | - response.expects(:body).returns(GOOGLE_FULL) | ||
27 | - url = "http://maps.google.com/maps/geo?q=#{CGI.escape(@address)}&output=xml&key=Google&oe=utf-8" | ||
28 | - GeoKit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
29 | - res=GeoKit::Geocoders::GoogleGeocoder.geocode(@address) | ||
30 | - assert_equal "CA", res.state | ||
31 | - assert_equal "San Francisco", res.city | ||
32 | - assert_equal "37.792501,-122.393985", res.ll # slightly dif from yahoo | ||
33 | - assert res.is_us? | ||
34 | - assert_equal "100 Spear St, San Francisco, CA 94105, USA", res.full_address #slightly different from yahoo | ||
35 | - assert_equal "google", res.provider | ||
36 | - end | ||
37 | - | ||
38 | - def test_google_full_address_with_geo_loc | ||
39 | - response = MockSuccess.new | ||
40 | - response.expects(:body).returns(GOOGLE_FULL) | ||
41 | - url = "http://maps.google.com/maps/geo?q=#{CGI.escape(@full_address_short_zip)}&output=xml&key=Google&oe=utf-8" | ||
42 | - GeoKit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
43 | - res=GeoKit::Geocoders::GoogleGeocoder.geocode(@google_full_loc) | ||
44 | - assert_equal "CA", res.state | ||
45 | - assert_equal "San Francisco", res.city | ||
46 | - assert_equal "37.792501,-122.393985", res.ll # slightly dif from yahoo | ||
47 | - assert res.is_us? | ||
48 | - assert_equal "100 Spear St, San Francisco, CA 94105, USA", res.full_address #slightly different from yahoo | ||
49 | - assert_equal "google", res.provider | ||
50 | - end | ||
51 | - | ||
52 | - def test_google_city | ||
53 | - response = MockSuccess.new | ||
54 | - response.expects(:body).returns(GOOGLE_CITY) | ||
55 | - url = "http://maps.google.com/maps/geo?q=#{CGI.escape(@address)}&output=xml&key=Google&oe=utf-8" | ||
56 | - GeoKit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
57 | - res=GeoKit::Geocoders::GoogleGeocoder.geocode(@address) | ||
58 | - assert_equal "CA", res.state | ||
59 | - assert_equal "San Francisco", res.city | ||
60 | - assert_equal "37.775,-122.418333", res.ll | ||
61 | - assert res.is_us? | ||
62 | - assert_equal "San Francisco, CA, USA", res.full_address | ||
63 | - assert_nil res.street_address | ||
64 | - assert_equal "google", res.provider | ||
65 | - end | ||
66 | - | ||
67 | - def test_google_city_with_geo_loc | ||
68 | - response = MockSuccess.new | ||
69 | - response.expects(:body).returns(GOOGLE_CITY) | ||
70 | - url = "http://maps.google.com/maps/geo?q=#{CGI.escape(@address)}&output=xml&key=Google&oe=utf-8" | ||
71 | - GeoKit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
72 | - res=GeoKit::Geocoders::GoogleGeocoder.geocode(@google_city_loc) | ||
73 | - assert_equal "CA", res.state | ||
74 | - assert_equal "San Francisco", res.city | ||
75 | - assert_equal "37.775,-122.418333", res.ll | ||
76 | - assert res.is_us? | ||
77 | - assert_equal "San Francisco, CA, USA", res.full_address | ||
78 | - assert_nil res.street_address | ||
79 | - assert_equal "google", res.provider | ||
80 | - end | ||
81 | - | ||
82 | - def test_service_unavailable | ||
83 | - response = MockFailure.new | ||
84 | - url = "http://maps.google.com/maps/geo?q=#{CGI.escape(@address)}&output=xml&key=Google&oe=utf-8" | ||
85 | - GeoKit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
86 | - assert !GeoKit::Geocoders::GoogleGeocoder.geocode(@google_city_loc).success | ||
87 | - end | ||
88 | -end | ||
89 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/ip_geocode_lookup_test.rb
@@ -1,84 +0,0 @@ | @@ -1,84 +0,0 @@ | ||
1 | -require File.join(File.dirname(__FILE__), '../../../../config/environment') | ||
2 | -require 'action_controller/test_process' | ||
3 | -require 'test/unit' | ||
4 | -require 'rubygems' | ||
5 | -require 'mocha' | ||
6 | - | ||
7 | - | ||
8 | -class LocationAwareController < ActionController::Base #:nodoc: all | ||
9 | - geocode_ip_address | ||
10 | - | ||
11 | - def index | ||
12 | - render :nothing => true | ||
13 | - end | ||
14 | -end | ||
15 | - | ||
16 | -class ActionController::TestRequest #:nodoc: all | ||
17 | - attr_accessor :remote_ip | ||
18 | -end | ||
19 | - | ||
20 | -# Re-raise errors caught by the controller. | ||
21 | -class LocationAwareController #:nodoc: all | ||
22 | - def rescue_action(e) raise e end; | ||
23 | -end | ||
24 | - | ||
25 | -class IpGeocodeLookupTest < Test::Unit::TestCase #:nodoc: all | ||
26 | - | ||
27 | - def setup | ||
28 | - @success = GeoKit::GeoLoc.new | ||
29 | - @success.provider = "hostip" | ||
30 | - @success.lat = 41.7696 | ||
31 | - @success.lng = -88.4588 | ||
32 | - @success.city = "Sugar Grove" | ||
33 | - @success.state = "IL" | ||
34 | - @success.country_code = "US" | ||
35 | - @success.success = true | ||
36 | - | ||
37 | - @failure = GeoKit::GeoLoc.new | ||
38 | - @failure.provider = "hostip" | ||
39 | - @failure.city = "(Private Address)" | ||
40 | - @failure.success = false | ||
41 | - | ||
42 | - @controller = LocationAwareController.new | ||
43 | - @request = ActionController::TestRequest.new | ||
44 | - @response = ActionController::TestResponse.new | ||
45 | - end | ||
46 | - | ||
47 | - def test_no_location_in_cookie_or_session | ||
48 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with("good ip").returns(@success) | ||
49 | - @request.remote_ip = "good ip" | ||
50 | - get :index | ||
51 | - verify | ||
52 | - end | ||
53 | - | ||
54 | - def test_location_in_cookie | ||
55 | - @request.remote_ip = "good ip" | ||
56 | - @request.cookies['geo_location'] = CGI::Cookie.new('geo_location', @success.to_yaml) | ||
57 | - get :index | ||
58 | - verify | ||
59 | - end | ||
60 | - | ||
61 | - def test_location_in_session | ||
62 | - @request.remote_ip = "good ip" | ||
63 | - @request.session[:geo_location] = @success | ||
64 | - @request.cookies['geo_location'] = CGI::Cookie.new('geo_location', @success.to_yaml) | ||
65 | - get :index | ||
66 | - verify | ||
67 | - end | ||
68 | - | ||
69 | - def test_ip_not_located | ||
70 | - GeoKit::Geocoders::IpGeocoder.expects(:geocode).with("bad ip").returns(@failure) | ||
71 | - @request.remote_ip = "bad ip" | ||
72 | - get :index | ||
73 | - assert_nil @request.session[:geo_location] | ||
74 | - end | ||
75 | - | ||
76 | - private | ||
77 | - | ||
78 | - def verify | ||
79 | - assert_response :success | ||
80 | - assert_equal @success, @request.session[:geo_location] | ||
81 | - assert_not_nil cookies['geo_location'] | ||
82 | - assert_equal @success, YAML.load(cookies['geo_location'].join) | ||
83 | - end | ||
84 | -end | ||
85 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/ipgeocoder_test.rb
@@ -1,87 +0,0 @@ | @@ -1,87 +0,0 @@ | ||
1 | -require File.join(File.dirname(__FILE__), 'base_geocoder_test') | ||
2 | - | ||
3 | -class IpGeocoderTest < BaseGeocoderTest #:nodoc: all | ||
4 | - | ||
5 | - IP_FAILURE=<<-EOF | ||
6 | - Country: (Private Address) (XX) | ||
7 | - City: (Private Address) | ||
8 | - Latitude: | ||
9 | - Longitude: | ||
10 | - EOF | ||
11 | - | ||
12 | - IP_SUCCESS=<<-EOF | ||
13 | - Country: UNITED STATES (US) | ||
14 | - City: Sugar Grove, IL | ||
15 | - Latitude: 41.7696 | ||
16 | - Longitude: -88.4588 | ||
17 | - EOF | ||
18 | - | ||
19 | - IP_UNICODED=<<-EOF | ||
20 | - Country: SWEDEN (SE) | ||
21 | - City: Borås | ||
22 | - Latitude: 57.7167 | ||
23 | - Longitude: 12.9167 | ||
24 | - EOF | ||
25 | - | ||
26 | - def setup | ||
27 | - super | ||
28 | - @success.provider = "hostip" | ||
29 | - end | ||
30 | - | ||
31 | - def test_successful_lookup | ||
32 | - success = MockSuccess.new | ||
33 | - success.expects(:body).returns(IP_SUCCESS) | ||
34 | - url = 'http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true' | ||
35 | - GeoKit::Geocoders::IpGeocoder.expects(:call_geocoder_service).with(url).returns(success) | ||
36 | - location = GeoKit::Geocoders::IpGeocoder.geocode('12.215.42.19') | ||
37 | - assert_not_nil location | ||
38 | - assert_equal 41.7696, location.lat | ||
39 | - assert_equal -88.4588, location.lng | ||
40 | - assert_equal "Sugar Grove", location.city | ||
41 | - assert_equal "IL", location.state | ||
42 | - assert_equal "US", location.country_code | ||
43 | - assert_equal "hostip", location.provider | ||
44 | - assert location.success | ||
45 | - end | ||
46 | - | ||
47 | - def test_unicoded_lookup | ||
48 | - success = MockSuccess.new | ||
49 | - success.expects(:body).returns(IP_UNICODED) | ||
50 | - url = 'http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true' | ||
51 | - GeoKit::Geocoders::IpGeocoder.expects(:call_geocoder_service).with(url).returns(success) | ||
52 | - location = GeoKit::Geocoders::IpGeocoder.geocode('12.215.42.19') | ||
53 | - assert_not_nil location | ||
54 | - assert_equal 57.7167, location.lat | ||
55 | - assert_equal 12.9167, location.lng | ||
56 | - assert_equal "Borås", location.city | ||
57 | - assert_nil location.state | ||
58 | - assert_equal "SE", location.country_code | ||
59 | - assert_equal "hostip", location.provider | ||
60 | - assert location.success | ||
61 | - end | ||
62 | - | ||
63 | - def test_failed_lookup | ||
64 | - failure = MockSuccess.new | ||
65 | - failure.expects(:body).returns(IP_FAILURE) | ||
66 | - url = 'http://api.hostip.info/get_html.php?ip=0.0.0.0&position=true' | ||
67 | - GeoKit::Geocoders::IpGeocoder.expects(:call_geocoder_service).with(url).returns(failure) | ||
68 | - location = GeoKit::Geocoders::IpGeocoder.geocode("0.0.0.0") | ||
69 | - assert_not_nil location | ||
70 | - assert !location.success | ||
71 | - end | ||
72 | - | ||
73 | - def test_invalid_ip | ||
74 | - location = GeoKit::Geocoders::IpGeocoder.geocode("blah") | ||
75 | - assert_not_nil location | ||
76 | - assert !location.success | ||
77 | - end | ||
78 | - | ||
79 | - def test_service_unavailable | ||
80 | - failure = MockFailure.new | ||
81 | - url = 'http://api.hostip.info/get_html.php?ip=0.0.0.0&position=true' | ||
82 | - GeoKit::Geocoders::IpGeocoder.expects(:call_geocoder_service).with(url).returns(failure) | ||
83 | - location = GeoKit::Geocoders::IpGeocoder.geocode("0.0.0.0") | ||
84 | - assert_not_nil location | ||
85 | - assert !location.success | ||
86 | - end | ||
87 | -end | ||
88 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/latlng_test.rb
@@ -1,112 +0,0 @@ | @@ -1,112 +0,0 @@ | ||
1 | -$LOAD_PATH.unshift File.join('..', 'lib') | ||
2 | -require 'geo_kit/mappable' | ||
3 | -require 'test/unit' | ||
4 | - | ||
5 | -class LatLngTest < Test::Unit::TestCase #:nodoc: all | ||
6 | - | ||
7 | - def setup | ||
8 | - @loc_a = GeoKit::LatLng.new(32.918593,-96.958444) | ||
9 | - @loc_e = GeoKit::LatLng.new(32.969527,-96.990159) | ||
10 | - @point = GeoKit::LatLng.new(@loc_a.lat, @loc_a.lng) | ||
11 | - end | ||
12 | - | ||
13 | - def test_distance_between_same_using_defaults | ||
14 | - assert_equal 0, GeoKit::LatLng.distance_between(@loc_a, @loc_a) | ||
15 | - assert_equal 0, @loc_a.distance_to(@loc_a) | ||
16 | - end | ||
17 | - | ||
18 | - def test_distance_between_same_with_miles_and_flat | ||
19 | - assert_equal 0, GeoKit::LatLng.distance_between(@loc_a, @loc_a, :units => :miles, :formula => :flat) | ||
20 | - assert_equal 0, @loc_a.distance_to(@loc_a, :units => :miles, :formula => :flat) | ||
21 | - end | ||
22 | - | ||
23 | - def test_distance_between_same_with_kms_and_flat | ||
24 | - assert_equal 0, GeoKit::LatLng.distance_between(@loc_a, @loc_a, :units => :kms, :formula => :flat) | ||
25 | - assert_equal 0, @loc_a.distance_to(@loc_a, :units => :kms, :formula => :flat) | ||
26 | - end | ||
27 | - | ||
28 | - def test_distance_between_same_with_miles_and_sphere | ||
29 | - assert_equal 0, GeoKit::LatLng.distance_between(@loc_a, @loc_a, :units => :miles, :formula => :sphere) | ||
30 | - assert_equal 0, @loc_a.distance_to(@loc_a, :units => :miles, :formula => :sphere) | ||
31 | - end | ||
32 | - | ||
33 | - def test_distance_between_same_with_kms_and_sphere | ||
34 | - assert_equal 0, GeoKit::LatLng.distance_between(@loc_a, @loc_a, :units => :kms, :formula => :sphere) | ||
35 | - assert_equal 0, @loc_a.distance_to(@loc_a, :units => :kms, :formula => :sphere) | ||
36 | - end | ||
37 | - | ||
38 | - def test_distance_between_diff_using_defaults | ||
39 | - assert_in_delta 3.97, GeoKit::LatLng.distance_between(@loc_a, @loc_e), 0.01 | ||
40 | - assert_in_delta 3.97, @loc_a.distance_to(@loc_e), 0.01 | ||
41 | - end | ||
42 | - | ||
43 | - def test_distance_between_diff_with_miles_and_flat | ||
44 | - assert_in_delta 3.97, GeoKit::LatLng.distance_between(@loc_a, @loc_e, :units => :miles, :formula => :flat), 0.2 | ||
45 | - assert_in_delta 3.97, @loc_a.distance_to(@loc_e, :units => :miles, :formula => :flat), 0.2 | ||
46 | - end | ||
47 | - | ||
48 | - def test_distance_between_diff_with_kms_and_flat | ||
49 | - assert_in_delta 6.39, GeoKit::LatLng.distance_between(@loc_a, @loc_e, :units => :kms, :formula => :flat), 0.4 | ||
50 | - assert_in_delta 6.39, @loc_a.distance_to(@loc_e, :units => :kms, :formula => :flat), 0.4 | ||
51 | - end | ||
52 | - | ||
53 | - def test_distance_between_diff_with_miles_and_sphere | ||
54 | - assert_in_delta 3.97, GeoKit::LatLng.distance_between(@loc_a, @loc_e, :units => :miles, :formula => :sphere), 0.01 | ||
55 | - assert_in_delta 3.97, @loc_a.distance_to(@loc_e, :units => :miles, :formula => :sphere), 0.01 | ||
56 | - end | ||
57 | - | ||
58 | - def test_distance_between_diff_with_kms_and_sphere | ||
59 | - assert_in_delta 6.39, GeoKit::LatLng.distance_between(@loc_a, @loc_e, :units => :kms, :formula => :sphere), 0.01 | ||
60 | - assert_in_delta 6.39, @loc_a.distance_to(@loc_e, :units => :kms, :formula => :sphere), 0.01 | ||
61 | - end | ||
62 | - | ||
63 | - def test_manually_mixed_in | ||
64 | - assert_equal 0, GeoKit::LatLng.distance_between(@point, @point) | ||
65 | - assert_equal 0, @point.distance_to(@point) | ||
66 | - assert_equal 0, @point.distance_to(@loc_a) | ||
67 | - assert_in_delta 3.97, @point.distance_to(@loc_e, :units => :miles, :formula => :flat), 0.2 | ||
68 | - assert_in_delta 6.39, @point.distance_to(@loc_e, :units => :kms, :formula => :flat), 0.4 | ||
69 | - end | ||
70 | - | ||
71 | - def test_heading_between | ||
72 | - assert_in_delta 332, GeoKit::LatLng.heading_between(@loc_a,@loc_e), 0.5 | ||
73 | - end | ||
74 | - | ||
75 | - def test_heading_to | ||
76 | - assert_in_delta 332, @loc_a.heading_to(@loc_e), 0.5 | ||
77 | - end | ||
78 | - | ||
79 | - def test_class_endpoint | ||
80 | - endpoint=GeoKit::LatLng.endpoint(@loc_a, 332, 3.97) | ||
81 | - assert_in_delta @loc_e.lat, endpoint.lat, 0.0005 | ||
82 | - assert_in_delta @loc_e.lng, endpoint.lng, 0.0005 | ||
83 | - end | ||
84 | - | ||
85 | - def test_instance_endpoint | ||
86 | - endpoint=@loc_a.endpoint(332, 3.97) | ||
87 | - assert_in_delta @loc_e.lat, endpoint.lat, 0.0005 | ||
88 | - assert_in_delta @loc_e.lng, endpoint.lng, 0.0005 | ||
89 | - end | ||
90 | - | ||
91 | - def test_midpoint | ||
92 | - midpoint=@loc_a.midpoint_to(@loc_e) | ||
93 | - assert_in_delta 32.944061, midpoint.lat, 0.0005 | ||
94 | - assert_in_delta -96.974296, midpoint.lng, 0.0005 | ||
95 | - end | ||
96 | - | ||
97 | - def test_normalize | ||
98 | - lat=37.7690 | ||
99 | - lng=-122.443 | ||
100 | - res=GeoKit::LatLng.normalize(lat,lng) | ||
101 | - assert_equal res,GeoKit::LatLng.new(lat,lng) | ||
102 | - res=GeoKit::LatLng.normalize("#{lat}, #{lng}") | ||
103 | - assert_equal res,GeoKit::LatLng.new(lat,lng) | ||
104 | - res=GeoKit::LatLng.normalize("#{lat} #{lng}") | ||
105 | - assert_equal res,GeoKit::LatLng.new(lat,lng) | ||
106 | - res=GeoKit::LatLng.normalize("#{lat.to_i} #{lng.to_i}") | ||
107 | - assert_equal res,GeoKit::LatLng.new(lat.to_i,lng.to_i) | ||
108 | - res=GeoKit::LatLng.normalize([lat,lng]) | ||
109 | - assert_equal res,GeoKit::LatLng.new(lat,lng) | ||
110 | - end | ||
111 | - | ||
112 | -end | ||
113 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/multi_geocoder_test.rb
@@ -1,44 +0,0 @@ | @@ -1,44 +0,0 @@ | ||
1 | -require File.join(File.dirname(__FILE__), 'base_geocoder_test') | ||
2 | - | ||
3 | -GeoKit::Geocoders::provider_order=[:google,:yahoo,:us] | ||
4 | - | ||
5 | -class MultiGeocoderTest < BaseGeocoderTest #:nodoc: all | ||
6 | - | ||
7 | - def setup | ||
8 | - super | ||
9 | - @failure = GeoKit::GeoLoc.new | ||
10 | - end | ||
11 | - | ||
12 | - def test_successful_first | ||
13 | - GeoKit::Geocoders::GoogleGeocoder.expects(:geocode).with(@address).returns(@success) | ||
14 | - assert_equal @success, GeoKit::Geocoders::MultiGeocoder.geocode(@address) | ||
15 | - end | ||
16 | - | ||
17 | - def test_failover | ||
18 | - GeoKit::Geocoders::GoogleGeocoder.expects(:geocode).with(@address).returns(@failure) | ||
19 | - GeoKit::Geocoders::YahooGeocoder.expects(:geocode).with(@address).returns(@success) | ||
20 | - assert_equal @success, GeoKit::Geocoders::MultiGeocoder.geocode(@address) | ||
21 | - end | ||
22 | - | ||
23 | - def test_double_failover | ||
24 | - GeoKit::Geocoders::GoogleGeocoder.expects(:geocode).with(@address).returns(@failure) | ||
25 | - GeoKit::Geocoders::YahooGeocoder.expects(:geocode).with(@address).returns(@failure) | ||
26 | - GeoKit::Geocoders::UsGeocoder.expects(:geocode).with(@address).returns(@success) | ||
27 | - assert_equal @success, GeoKit::Geocoders::MultiGeocoder.geocode(@address) | ||
28 | - end | ||
29 | - | ||
30 | - def test_failure | ||
31 | - GeoKit::Geocoders::GoogleGeocoder.expects(:geocode).with(@address).returns(@failure) | ||
32 | - GeoKit::Geocoders::YahooGeocoder.expects(:geocode).with(@address).returns(@failure) | ||
33 | - GeoKit::Geocoders::UsGeocoder.expects(:geocode).with(@address).returns(@failure) | ||
34 | - assert_equal @failure, GeoKit::Geocoders::MultiGeocoder.geocode(@address) | ||
35 | - end | ||
36 | - | ||
37 | - def test_invalid_provider | ||
38 | - temp = GeoKit::Geocoders::provider_order | ||
39 | - GeoKit::Geocoders.provider_order = [:bogus] | ||
40 | - assert_equal @failure, GeoKit::Geocoders::MultiGeocoder.geocode(@address) | ||
41 | - GeoKit::Geocoders.provider_order = temp | ||
42 | - end | ||
43 | - | ||
44 | -end | ||
45 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/schema.rb
@@ -1,31 +0,0 @@ | @@ -1,31 +0,0 @@ | ||
1 | -ActiveRecord::Schema.define(:version => 0) do | ||
2 | - create_table :companies, :force => true do |t| | ||
3 | - t.column :name, :string | ||
4 | - end | ||
5 | - | ||
6 | - create_table :locations, :force => true do |t| | ||
7 | - t.column :company_id, :integer, :default => 0, :null => false | ||
8 | - t.column :street, :string, :limit => 60 | ||
9 | - t.column :city, :string, :limit => 60 | ||
10 | - t.column :state, :string, :limit => 2 | ||
11 | - t.column :postal_code, :string, :limit => 16 | ||
12 | - t.column :lat, :decimal, :precision => 15, :scale => 10 | ||
13 | - t.column :lng, :decimal, :precision => 15, :scale => 10 | ||
14 | - end | ||
15 | - | ||
16 | - create_table :custom_locations, :force => true do |t| | ||
17 | - t.column :company_id, :integer, :default => 0, :null => false | ||
18 | - t.column :street, :string, :limit => 60 | ||
19 | - t.column :city, :string, :limit => 60 | ||
20 | - t.column :state, :string, :limit => 2 | ||
21 | - t.column :postal_code, :string, :limit => 16 | ||
22 | - t.column :latitude, :decimal, :precision => 15, :scale => 10 | ||
23 | - t.column :longitude, :decimal, :precision => 15, :scale => 10 | ||
24 | - end | ||
25 | - | ||
26 | - create_table :stores, :force=> true do |t| | ||
27 | - t.column :address, :string | ||
28 | - t.column :lat, :decimal, :precision => 15, :scale => 10 | ||
29 | - t.column :lng, :decimal, :precision => 15, :scale => 10 | ||
30 | - end | ||
31 | -end | ||
32 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/sqlite_extension_test.rb
@@ -1,27 +0,0 @@ | @@ -1,27 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/test_helper' | ||
2 | - | ||
3 | -if ActiveRecord::Base.connection.adapter_name =~ /^sqlite$/i | ||
4 | - | ||
5 | - # this test only makes sense when using sqlite | ||
6 | - class SQliteExtensionTest < Test::Unit::TestCase | ||
7 | - | ||
8 | - def test_pow_function | ||
9 | - assert_in_delta 8.0, ActiveRecord::Base.connection.execute('select pow(2.0, 3.0) as result').first['result'], 0.0001 | ||
10 | - end | ||
11 | - | ||
12 | - def test_radians_function | ||
13 | - assert_in_delta Math::PI/2, ActiveRecord::Base.connection.execute('select radians(90) as rad').first['rad'], 0.0001 | ||
14 | - end | ||
15 | - | ||
16 | - def test_sqrt_function | ||
17 | - assert_in_delta 1.4142, ActiveRecord::Base.connection.execute('select sqrt(2) as sqrt').first['sqrt'], 0.0001 | ||
18 | - end | ||
19 | - | ||
20 | - def test_spheric_distance_function | ||
21 | - args = [32.918593, -96.958444, 32.951613, -96.958444].map{|l|l * Math::PI/180} | ||
22 | - assert_in_delta 2.28402, ActiveRecord::Base.connection.execute("select spheric_distance(#{args.inspect[1..-2]}, 3963.19) as dist").first['dist'], 0.0001 | ||
23 | - end | ||
24 | - | ||
25 | - end | ||
26 | - | ||
27 | -end |
vendor/plugins/geokit/test/test_helper.rb
@@ -1,20 +0,0 @@ | @@ -1,20 +0,0 @@ | ||
1 | -require 'test/unit' | ||
2 | - | ||
3 | -plugin_test_dir = File.dirname(__FILE__) | ||
4 | - | ||
5 | -# Load the Rails environment | ||
6 | -require File.join(plugin_test_dir, '../../../../config/environment') | ||
7 | -require 'active_record/fixtures' | ||
8 | -databases = YAML::load(IO.read(plugin_test_dir + '/database.yml')) | ||
9 | -ActiveRecord::Base.logger = Logger.new(plugin_test_dir + "/debug.log") | ||
10 | - | ||
11 | -# A specific database can be used by setting the DB environment variable | ||
12 | -ActiveRecord::Base.establish_connection(databases[ENV['DB'] || 'mysql']) | ||
13 | - | ||
14 | -# Load the test schema into the database | ||
15 | -load(File.join(plugin_test_dir, 'schema.rb')) | ||
16 | - | ||
17 | -# Load fixtures from the plugin | ||
18 | -Test::Unit::TestCase.fixture_path = File.join(plugin_test_dir, 'fixtures/') | ||
19 | - | ||
20 | -require File.join(plugin_test_dir, '..', 'lib', 'geo_kit', 'sqlite_extension') |
vendor/plugins/geokit/test/us_geocoder_test.rb
@@ -1,47 +0,0 @@ | @@ -1,47 +0,0 @@ | ||
1 | -require File.join(File.dirname(__FILE__), 'base_geocoder_test') | ||
2 | - | ||
3 | -GeoKit::Geocoders::geocoder_us = nil | ||
4 | - | ||
5 | -class UsGeocoderTest < BaseGeocoderTest #:nodoc: all | ||
6 | - | ||
7 | - GEOCODER_US_FULL='37.792528,-122.393981,100 Spear St,San Francisco,CA,94105' | ||
8 | - | ||
9 | - def setup | ||
10 | - super | ||
11 | - @us_full_hash = {:city=>"San Francisco", :state=>"CA"} | ||
12 | - @us_full_loc = GeoKit::GeoLoc.new(@us_full_hash) | ||
13 | - end | ||
14 | - | ||
15 | - def test_geocoder_us | ||
16 | - response = MockSuccess.new | ||
17 | - response.expects(:body).returns(GEOCODER_US_FULL) | ||
18 | - url = "http://geocoder.us/service/csv/geocode?address=#{CGI.escape(@address)}" | ||
19 | - GeoKit::Geocoders::UsGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
20 | - verify(GeoKit::Geocoders::UsGeocoder.geocode(@address)) | ||
21 | - end | ||
22 | - | ||
23 | - def test_geocoder_with_geo_loc | ||
24 | - response = MockSuccess.new | ||
25 | - response.expects(:body).returns(GEOCODER_US_FULL) | ||
26 | - url = "http://geocoder.us/service/csv/geocode?address=#{CGI.escape(@address)}" | ||
27 | - GeoKit::Geocoders::UsGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
28 | - verify(GeoKit::Geocoders::UsGeocoder.geocode(@us_full_loc)) | ||
29 | - end | ||
30 | - | ||
31 | - def test_service_unavailable | ||
32 | - response = MockFailure.new | ||
33 | - url = "http://geocoder.us/service/csv/geocode?address=#{CGI.escape(@address)}" | ||
34 | - GeoKit::Geocoders::UsGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
35 | - assert !GeoKit::Geocoders::UsGeocoder.geocode(@us_full_loc).success | ||
36 | - end | ||
37 | - | ||
38 | - private | ||
39 | - | ||
40 | - def verify(location) | ||
41 | - assert_equal "CA", location.state | ||
42 | - assert_equal "San Francisco", location.city | ||
43 | - assert_equal "37.792528,-122.393981", location.ll | ||
44 | - assert location.is_us? | ||
45 | - assert_equal "100 Spear St, San Francisco, CA, 94105, US", location.full_address #slightly different from yahoo | ||
46 | - end | ||
47 | -end | ||
48 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/geokit/test/yahoo_geocoder_test.rb
@@ -1,87 +0,0 @@ | @@ -1,87 +0,0 @@ | ||
1 | -require File.join(File.dirname(__FILE__), 'base_geocoder_test') | ||
2 | - | ||
3 | -GeoKit::Geocoders::yahoo = 'Yahoo' | ||
4 | - | ||
5 | -class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all | ||
6 | - YAHOO_FULL=<<-EOF.strip | ||
7 | - <?xml version="1.0"?> | ||
8 | - <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"><Latitude>37.792406</Latitude><Longitude>-122.39411</Longitude><Address>100 SPEAR ST</Address><City>SAN FRANCISCO</City><State>CA</State><Zip>94105-1522</Zip><Country>US</Country></Result></ResultSet> | ||
9 | - <!-- ws01.search.scd.yahoo.com uncompressed/chunked Mon Jan 29 16:23:43 PST 2007 --> | ||
10 | - EOF | ||
11 | - | ||
12 | - YAHOO_CITY=<<-EOF.strip | ||
13 | - <?xml version="1.0"?> | ||
14 | - <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="city"><Latitude>37.7742</Latitude><Longitude>-122.417068</Longitude><Address></Address><City>SAN FRANCISCO</City><State>CA</State><Zip></Zip><Country>US</Country></Result></ResultSet> | ||
15 | - <!-- ws02.search.scd.yahoo.com uncompressed/chunked Mon Jan 29 18:00:28 PST 2007 --> | ||
16 | - EOF | ||
17 | - | ||
18 | - def setup | ||
19 | - super | ||
20 | - @yahoo_full_hash = {:street_address=>"100 Spear St", :city=>"San Francisco", :state=>"CA", :zip=>"94105-1522", :country_code=>"US"} | ||
21 | - @yahoo_city_hash = {:city=>"San Francisco", :state=>"CA"} | ||
22 | - @yahoo_full_loc = GeoKit::GeoLoc.new(@yahoo_full_hash) | ||
23 | - @yahoo_city_loc = GeoKit::GeoLoc.new(@yahoo_city_hash) | ||
24 | - end | ||
25 | - | ||
26 | - # the testing methods themselves | ||
27 | - def test_yahoo_full_address | ||
28 | - response = MockSuccess.new | ||
29 | - response.expects(:body).returns(YAHOO_FULL) | ||
30 | - url = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=Yahoo&location=#{CGI.escape(@address)}" | ||
31 | - GeoKit::Geocoders::YahooGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
32 | - do_full_address_assertions(GeoKit::Geocoders::YahooGeocoder.geocode(@address)) | ||
33 | - end | ||
34 | - | ||
35 | - def test_yahoo_full_address_with_geo_loc | ||
36 | - response = MockSuccess.new | ||
37 | - response.expects(:body).returns(YAHOO_FULL) | ||
38 | - url = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=Yahoo&location=#{CGI.escape(@full_address)}" | ||
39 | - GeoKit::Geocoders::YahooGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
40 | - do_full_address_assertions(GeoKit::Geocoders::YahooGeocoder.geocode(@yahoo_full_loc)) | ||
41 | - end | ||
42 | - | ||
43 | - def test_yahoo_city | ||
44 | - response = MockSuccess.new | ||
45 | - response.expects(:body).returns(YAHOO_CITY) | ||
46 | - url = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=Yahoo&location=#{CGI.escape(@address)}" | ||
47 | - GeoKit::Geocoders::YahooGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
48 | - do_city_assertions(GeoKit::Geocoders::YahooGeocoder.geocode(@address)) | ||
49 | - end | ||
50 | - | ||
51 | - def test_yahoo_city_with_geo_loc | ||
52 | - response = MockSuccess.new | ||
53 | - response.expects(:body).returns(YAHOO_CITY) | ||
54 | - url = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=Yahoo&location=#{CGI.escape(@address)}" | ||
55 | - GeoKit::Geocoders::YahooGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
56 | - do_city_assertions(GeoKit::Geocoders::YahooGeocoder.geocode(@yahoo_city_loc)) | ||
57 | - end | ||
58 | - | ||
59 | - def test_service_unavailable | ||
60 | - response = MockFailure.new | ||
61 | - url = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=Yahoo&location=#{CGI.escape(@address)}" | ||
62 | - GeoKit::Geocoders::YahooGeocoder.expects(:call_geocoder_service).with(url).returns(response) | ||
63 | - assert !GeoKit::Geocoders::YahooGeocoder.geocode(@yahoo_city_loc).success | ||
64 | - end | ||
65 | - | ||
66 | - private | ||
67 | - | ||
68 | - # next two methods do the assertions for both address-level and city-level lookups | ||
69 | - def do_full_address_assertions(res) | ||
70 | - assert_equal "CA", res.state | ||
71 | - assert_equal "San Francisco", res.city | ||
72 | - assert_equal "37.792406,-122.39411", res.ll | ||
73 | - assert res.is_us? | ||
74 | - assert_equal "100 Spear St, San Francisco, CA, 94105-1522, US", res.full_address | ||
75 | - assert_equal "yahoo", res.provider | ||
76 | - end | ||
77 | - | ||
78 | - def do_city_assertions(res) | ||
79 | - assert_equal "CA", res.state | ||
80 | - assert_equal "San Francisco", res.city | ||
81 | - assert_equal "37.7742,-122.417068", res.ll | ||
82 | - assert res.is_us? | ||
83 | - assert_equal "San Francisco, CA, US", res.full_address | ||
84 | - assert_nil res.street_address | ||
85 | - assert_equal "yahoo", res.provider | ||
86 | - end | ||
87 | -end | ||
88 | \ No newline at end of file | 0 | \ No newline at end of file |