gmaps4rails 1.5.2 → 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile.lock +7 -1
  3. data/README.rdoc +2 -2
  4. data/app/assets/javascripts/gmaps4rails/gmaps4rails.base.js.coffee +37 -96
  5. data/app/assets/javascripts/gmaps4rails/gmaps4rails.bing.js.coffee +11 -0
  6. data/app/assets/javascripts/gmaps4rails/gmaps4rails.googlemaps.js.coffee +85 -9
  7. data/app/assets/javascripts/gmaps4rails/gmaps4rails.mapquest.js.coffee +13 -2
  8. data/app/assets/javascripts/gmaps4rails/gmaps4rails.openlayers.js.coffee +54 -2
  9. data/app/views/gmaps4rails/_gmaps4rails.html.erb +1 -1
  10. data/gmaps4rails.gemspec +1 -0
  11. data/lib/generators/gmaps4rails/install_generator.rb +28 -12
  12. data/lib/gmaps4rails/acts_as_gmappable.rb +3 -46
  13. data/lib/gmaps4rails/api_wrappers/base_net_methods.rb +40 -0
  14. data/lib/gmaps4rails/api_wrappers/direction.rb +87 -0
  15. data/lib/gmaps4rails/api_wrappers/geocoder.rb +54 -0
  16. data/lib/gmaps4rails/api_wrappers/places.rb +74 -0
  17. data/lib/gmaps4rails/base.rb +80 -22
  18. data/lib/gmaps4rails/extensions/{array.rb → enumerable.rb} +1 -1
  19. data/lib/gmaps4rails/js_builder.rb +9 -17
  20. data/lib/gmaps4rails/json_builder.rb +1 -7
  21. data/lib/gmaps4rails/model_handler.rb +79 -0
  22. data/lib/gmaps4rails/version.rb +1 -1
  23. data/lib/gmaps4rails/view_helper.rb +4 -6
  24. data/public/javascripts/gmaps4rails/gmaps4rails.base.js +35 -112
  25. data/public/javascripts/gmaps4rails/gmaps4rails.bing.js +12 -0
  26. data/public/javascripts/gmaps4rails/gmaps4rails.googlemaps.js +123 -7
  27. data/public/javascripts/gmaps4rails/gmaps4rails.mapquest.js +12 -0
  28. data/public/javascripts/gmaps4rails/gmaps4rails.openlayers.js +53 -2
  29. data/spec/dummy/app/views/users/index.html.erb +88 -85
  30. data/spec/fixtures/google_direction_valid.json +65 -0
  31. data/spec/fixtures/google_geocoding_toulon_france.json +58 -0
  32. data/spec/fixtures/google_places_valid.json +45 -0
  33. data/spec/fixtures/google_wrong_geocoding.json +4 -0
  34. data/spec/lib/base_spec.rb +59 -0
  35. data/spec/lib/direction_spec.rb +53 -0
  36. data/spec/lib/geocoder_spec.rb +46 -0
  37. data/spec/{base/base_spec.rb → lib/js_builder_spec.rb} +0 -6
  38. data/spec/lib/json_builder_spec.rb +232 -0
  39. data/spec/lib/places_spec.rb +25 -0
  40. data/spec/models/user_spec.rb +75 -357
  41. data/spec/spec_helper.rb +1 -0
  42. data/spec/support/geocoding.rb +27 -1
  43. metadata +47 -12
  44. data/lib/gmaps4rails/geocoding.rb +0 -113
  45. data/lib/gmaps4rails/google_places.rb +0 -76
  46. data/spec/base/geocoding_spec.rb +0 -17
@@ -1,113 +0,0 @@
1
- require 'net/http'
2
- require 'uri'
3
- require 'json'
4
-
5
- module Gmaps4rails
6
-
7
- # This method geocodes an address using the GoogleMaps webservice
8
- # options are:
9
- # * address: string, mandatory
10
- # * lang: to set the language one wants the result to be translated (default is english)
11
- # * raw: to get the raw response from google, default is false
12
- def Gmaps4rails.geocode(address, lang="en", raw = false, protocol = "http")
13
- if address.nil? || address.empty?
14
- raise Gmaps4rails::GeocodeInvalidQuery, "You must provide an address"
15
- else #coordinates are valid
16
- geocoder = "#{protocol}://maps.googleapis.com/maps/api/geocode/json?language=#{lang}&address="
17
- output = "&sensor=false"
18
- #send request to the google api to get the lat/lng
19
- request = geocoder + address + output
20
- url = URI.escape(request)
21
- Gmaps4rails.handle_geocoding_response(request, Gmaps4rails.get_response(url), raw)
22
- end # end address valid
23
- end
24
-
25
- # This method retrieves destination results provided by GoogleMaps webservice
26
- # options are:
27
- # * start_end: Hash { "from" => string, "to" => string}, mandatory
28
- # * options: details given in the github's wiki
29
- # * output: could be "pretty", "raw" or "clean"; filters the output from google
30
- #output could be raw, pretty or clean
31
- def Gmaps4rails.destination(start_end, options={}, output="pretty")
32
- if start_end["from"].nil? || start_end["to"].empty?
33
- raise Gmaps4rails::DirectionInvalidQuery, "Origin and destination must be provided in a hash as first argument"
34
- else #great, we have stuff to work with
35
- geocoder = "http://maps.googleapis.com/maps/api/directions/json?origin=#{start_end["from"]}&destination=#{start_end["to"]}"
36
- #if value is an Array, it means it contains the waypoints, otherwise it's chained normally
37
- dest_options = options.empty? ? "" : "&" + options.map {|k,v| v.is_a?(Array) ? k + "=" + v * ("|") : k + "=" + v }*("&")
38
- #send request to the google api to get the directions
39
- request = geocoder + dest_options + "&sensor=false"
40
- url = URI.escape(request)
41
- Gmaps4rails.handle_destination_response(request, Gmaps4rails.get_response(url), output)
42
- end # end origin + destination exist
43
- end #end destination
44
-
45
- private
46
-
47
- def Gmaps4rails.handle_geocoding_response(request, response, raw)
48
- #parse result if result received properly
49
- if response.is_a?(Net::HTTPSuccess)
50
- #parse the json
51
- parse = JSON.parse(response.body)
52
- #check if google went well
53
- if parse["status"] == "OK"
54
- return parse if raw == true
55
- array = []
56
- parse["results"].each do |result|
57
- array << {
58
- :lat => result["geometry"]["location"]["lat"],
59
- :lng => result["geometry"]["location"]["lng"],
60
- :matched_address => result["formatted_address"],
61
- :bounds => result["geometry"]["bounds"],
62
- :full_data => result
63
- }
64
- end
65
- return array
66
- else #status != OK
67
- raise Gmaps4rails::GeocodeStatus, "The address you passed seems invalid, status was: #{parse["status"]}.
68
- Request was: #{request}"
69
- end #end parse status
70
-
71
- else #if not http success
72
- raise Gmaps4rails::GeocodeNetStatus, "The request sent to google was invalid (not http success): #{request}.
73
- Response was: #{response}"
74
- end #end resp test
75
- end
76
-
77
- def Gmaps4rails.handle_destination_response(request, response, output)
78
- if response.is_a?(Net::HTTPSuccess)
79
- #parse the json
80
- parse = JSON.parse(response.body)
81
- #check if google went well
82
- if parse["status"] == "OK"
83
- legs = []
84
- #Each element in the legs array specifies a single leg of the journey from the origin to the destination in the calculated route
85
- parse["routes"].first["legs"].each do |leg|
86
- #delete coded polyline elements from legs and store it in polylines to make output cleaner
87
- polylines = leg["steps"].map {|step| step.delete("polyline")} if output == "pretty" || output == "clean"
88
- legs << {
89
- "duration" => { "text" => leg["duration"]["text"], "value" => leg["duration"]["value"].to_f },
90
- "distance" => { "text" => leg["distance"]["text"], "value" => leg["distance"]["value"].to_f },
91
- "steps" => leg["steps"]
92
- }
93
- if output == "pretty"
94
- #polylines contain levels data, which are not that useful.
95
- polylines.map{|poly| poly.delete("levels")}
96
- #create valid json from all polylines, this could be directly passed to javascript for display
97
- json = polylines.map { |poly| {"coded_array" => poly["points"]} }.to_json
98
- #merge results in legs
99
- legs.last.merge!({ "polylines" => json })
100
- end
101
- end
102
- return legs
103
- else #status != OK
104
- raise Gmaps4rails::DirectionStatus, "The query you passed seems invalid, status was: #{parse["status"]}.
105
- Request was: #{request}"
106
- end #end parse status
107
- else #if not http success
108
- raise Gmaps4rails::DirectionNetStatus, "The request sent to google was invalid (not http success): #{request}.
109
- Response was: #{response}"
110
- end #end resp test
111
- end
112
-
113
- end
@@ -1,76 +0,0 @@
1
- module Gmaps4rails
2
-
3
- # does two things... 1) gecode the given address string and 2) triggers a a places query around that geo location
4
- # optionally a keyword can be given for a filter over all places fields (e.g. "Bungy" to give all Bungy related places)
5
- # IMPORTANT: Places API calls require an API key (param "key")
6
-
7
- def Gmaps4rails.places_for_address(address, key, keyword = nil, radius = 7500, lang="en", raw = false)
8
- if address.nil?
9
- raise Gmaps4rails::GeocodeInvalidQuery, "you must provide an address for a places_for_address query"
10
- elsif key.nil?
11
- raise "Google Places API requires an API key"
12
- else
13
- res = Gmaps4rails.geocode(address) # will throw exception if nothing could be geocoded
14
- Gmaps4rails.places(res.first[:lat], res.first[:lng], key, keyword, radius, lang, raw)
15
- end
16
- end
17
-
18
- # does a places query around give geo location (lat/lng)
19
- # optionally a keyword can be given for a filter over all places fields (e.g. "Bungy" to give all Bungy related places)
20
- # IMPORTANT: Places API calls require an API key (param "key")
21
- def Gmaps4rails.places(lat, lng, key, keyword = nil, radius = 7500, lang="en", raw = false, protocol = "https")
22
- if lat.nil? || lng.nil?
23
- raise Gmaps4rails::PlacesInvalidQuery, "You must provide at least a lat/lon for a Google places query"
24
- elsif key.nil?
25
- raise "Google Places API requires an API key"
26
- else #lat/lng are valid
27
- geocoder = "#{protocol}://maps.googleapis.com/maps/api/place/search/json?language=#{lang}&location=#{[lat.to_s, lng.to_s].join(",")}"
28
- output = "&sensor=false&radius=#{radius}&key=#{key}"
29
-
30
- # add filter keyword
31
- geocoder += "&keyword=#{keyword}" unless keyword.nil?
32
-
33
- #send request to the google api to get the lat/lng
34
- request = geocoder + output
35
- url = URI.escape(request)
36
- uri = URI.parse(url)
37
- http = Net::HTTP.new(uri.host, uri.port)
38
- http.use_ssl = true # Places API wants https
39
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE # to avoid any cert issues
40
-
41
- Gmaps4rails.handle_places_response(request, http.request(Net::HTTP::Get.new(uri.request_uri)), raw)
42
- end # end lat/lng valid
43
- end
44
-
45
- # handles the places query response
46
- def Gmaps4rails.handle_places_response(request, response, raw)
47
- #parse result if result received properly
48
- if response.is_a?(Net::HTTPSuccess)
49
- #parse the json
50
- parse = JSON.parse(response.body)
51
- #check if google went well
52
- if parse["status"] == "OK"
53
- return parse if raw == true
54
- array = []
55
- parse["results"].each do |result|
56
- array << {
57
- :lat => result["geometry"]["location"]["lat"],
58
- :lng => result["geometry"]["location"]["lng"],
59
- :name => result["name"],
60
- :reference => result["reference"],
61
- :vicinity => result["vicinity"],
62
- :full_data => result
63
- }
64
- end
65
- return array
66
- else #status != OK
67
- raise Gmaps4rails::PlacesStatus, "The address you passed seems invalid, status was: #{parse["status"]}.
68
- Request was: #{request}"
69
- end #end parse status
70
-
71
- else #if not http success
72
- raise Gmaps4rails::PlacesNetStatus, "The request sent to google was invalid (not http success): #{request}.
73
- Response was: #{response}"
74
- end #end resp test
75
- end
76
- end
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Geocode" do
4
-
5
- it "should raise an error when address invalid" do
6
- lambda { Gmaps4rails.geocode("home")}.should raise_error Gmaps4rails::GeocodeStatus
7
- end
8
-
9
- it "should return results in the specified language" do
10
- result = Gmaps4rails.geocode("Toulon, France", "de")
11
- result.first[:matched_address].should eq "Toulon, Frankreich"
12
- end
13
-
14
- it "should raise an error when net connection failed" #TODO: Damn, I don't know how to test that!
15
-
16
- end
17
-