overlord 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +1 -1
- data/README.rdoc +5 -3
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/app/helpers/overlord_google_helper.rb +21 -0
- data/app/views/google/_map.html.erb +56 -0
- data/lib/overlord/google_search_request.rb +85 -0
- data/overlord.gemspec +11 -6
- data/test/rails_root/app/controllers/default_controller.rb +5 -1
- data/test/rails_root/app/views/default/google_map.html.erb +1 -0
- data/test/rails_root/test/unit/google_feed_request_test.rb +1 -1
- data/test/rails_root/test/unit/google_search_request_test.rb +26 -0
- metadata +9 -3
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -4,6 +4,8 @@ Talk to the Google ajax apis and render the results. This gem contains several
|
|
4
4
|
out to the Google Ajax Apis (http://code.google.com/apis/ajax/).
|
5
5
|
|
6
6
|
== Usage
|
7
|
+
|
8
|
+
=== Settings
|
7
9
|
This gem requires some configuration before it will work in your Rails application:
|
8
10
|
You will need a global_config file with 'google_ajax_api_key' defined. You can set it up thus:
|
9
11
|
|
@@ -46,9 +48,9 @@ Then in global_config.yml:
|
|
46
48
|
|
47
49
|
application_url: 'localhost:3000'
|
48
50
|
|
49
|
-
|
51
|
+
=== Models
|
50
52
|
If you want to use the methods 'convert_google_feed_json_to_feed', 'convert_google_find_feeds_json_to_feeds', and
|
51
|
-
'convert_google_feed_json_to_entries' you will also need a Feed and Entry class with specific attributes. See the rails application
|
53
|
+
'convert_google_feed_json_to_entries' you will also need a Feed, Service and Entry class with specific attributes. See the rails application
|
52
54
|
inside of the test directory for more information on how to create these classes.
|
53
55
|
|
54
56
|
# Required attributes:
|
@@ -111,4 +113,4 @@ inside of the test directory for more information on how to create these classes
|
|
111
113
|
|
112
114
|
== Copyright
|
113
115
|
|
114
|
-
Copyright (c) 2009
|
116
|
+
Copyright (c) 2009 Tatemae. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -9,9 +9,9 @@ begin
|
|
9
9
|
gem.name = "overlord"
|
10
10
|
gem.summary = "Talk with our Google overlords"
|
11
11
|
gem.description = "Code to interact with the google ajax apis on the server and the client."
|
12
|
-
gem.email = "
|
12
|
+
gem.email = "justin@tatemae.com"
|
13
13
|
gem.homepage = "http://github.com/jbasdf/overlord"
|
14
|
-
gem.authors = ["Justin Ball"]
|
14
|
+
gem.authors = ["Justin Ball", "Joel Duffin"]
|
15
15
|
gem.add_development_dependency "thoughtbot-shoulda"
|
16
16
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
17
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
@@ -125,6 +125,20 @@ module OverlordGoogleHelper
|
|
125
125
|
render :partial => 'google/slide_show', :locals => { :feed => feed, :content_id => content_id, :options => options }
|
126
126
|
end
|
127
127
|
|
128
|
+
# Generate a google map that includes the location of each item in
|
129
|
+
# mapped_objects. Each object in mapped_objects must define a lat and lng attribute.
|
130
|
+
#
|
131
|
+
# mapped_objects: Collection of objects to be mapped.
|
132
|
+
# content_id: Name of the div that will hold the widget google generates.
|
133
|
+
# If this method is called more than once on a given page then you will need to
|
134
|
+
# specify different content_ids for each call.
|
135
|
+
# options: A hash containing the values to pass to the Google widget.
|
136
|
+
def google_map(mapped_objects,
|
137
|
+
content_id = 'map_content',
|
138
|
+
options = {})
|
139
|
+
render :partial => 'google/map', :locals => { :mapped_objects => mapped_objects, :content_id => content_id, :options => options }
|
140
|
+
end
|
141
|
+
|
128
142
|
# Given a feed attempts to assign an appropriate class
|
129
143
|
def feed_class(feed)
|
130
144
|
return '' if feed.service.blank?
|
@@ -287,6 +301,13 @@ module OverlordGoogleHelper
|
|
287
301
|
google_ajax_api_scripts + '<script type="text/javascript">google.load("search", "1");</script>'
|
288
302
|
end
|
289
303
|
|
304
|
+
# Output include script for google maps
|
305
|
+
def google_load_maps
|
306
|
+
return '' if defined?(@google_load_maps_included)
|
307
|
+
@google_load_maps_included = true
|
308
|
+
google_ajax_api_scripts + '<script type="text/javascript">google.load("maps", "2");</script>'
|
309
|
+
end
|
310
|
+
|
290
311
|
# Output include script to load jquery from google
|
291
312
|
def google_load_jquery
|
292
313
|
return '' if defined?(@google_load_jquery_included)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
<% content_for :head do -%>
|
2
|
+
<%= google_load_maps -%>
|
3
|
+
<% end -%>
|
4
|
+
|
5
|
+
<script type="text/javascript">
|
6
|
+
google.setOnLoadCallback(function() {
|
7
|
+
if (google.maps.BrowserIsCompatible()) {
|
8
|
+
var map = new google.maps.Map2(document.getElementById("<%=content_id%>"));
|
9
|
+
map.setCenter(new google.maps.LatLng(37.4419, -122.1419), 13);
|
10
|
+
map.addControl(new google.maps.SmallMapControl());
|
11
|
+
map.addControl(new google.maps.MapTypeControl());
|
12
|
+
|
13
|
+
// Create a base icon for all of our markers that specifies the
|
14
|
+
// shadow, icon dimensions, etc.
|
15
|
+
var baseIcon = new google.maps.Icon(G_DEFAULT_ICON);
|
16
|
+
baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
|
17
|
+
baseIcon.iconSize = new google.maps.Size(20, 34);
|
18
|
+
baseIcon.shadowSize = new google.maps.Size(37, 34);
|
19
|
+
baseIcon.iconAnchor = new google.maps.Point(9, 34);
|
20
|
+
baseIcon.infoWindowAnchor = new google.maps.Point(9, 2);
|
21
|
+
|
22
|
+
// Creates a marker whose info window displays the letter corresponding
|
23
|
+
// to the given index.
|
24
|
+
function createMarker(point, index) {
|
25
|
+
// Create a lettered icon for this point using our icon class
|
26
|
+
var letter = String.fromCharCode("A".charCodeAt(0) + index);
|
27
|
+
var letteredIcon = new google.maps.Icon(baseIcon);
|
28
|
+
letteredIcon.image = "http://www.google.com/mapfiles/marker" + letter + ".png";
|
29
|
+
|
30
|
+
// Set up our google.maps.MarkerOptions object
|
31
|
+
markerOptions = { icon:letteredIcon };
|
32
|
+
var marker = new google.maps.Marker(point, markerOptions);
|
33
|
+
|
34
|
+
google.maps.Event.addListener(marker, "click", function() {
|
35
|
+
marker.openInfoWindowHtml("Marker <b>" + letter + "</b>");
|
36
|
+
});
|
37
|
+
return marker;
|
38
|
+
}
|
39
|
+
|
40
|
+
// Add 10 markers to the map at random locations
|
41
|
+
var bounds = map.getBounds();
|
42
|
+
var southWest = bounds.getSouthWest();
|
43
|
+
var northEast = bounds.getNorthEast();
|
44
|
+
var lngSpan = northEast.lng() - southWest.lng();
|
45
|
+
var latSpan = northEast.lat() - southWest.lat();
|
46
|
+
for (var i = 0; i < 10; i++) {
|
47
|
+
var latlng = new google.maps.LatLng(southWest.lat() + latSpan * Math.random(),
|
48
|
+
southWest.lng() + lngSpan * Math.random());
|
49
|
+
map.addOverlay(createMarker(latlng, i));
|
50
|
+
}
|
51
|
+
}
|
52
|
+
});
|
53
|
+
</script>
|
54
|
+
|
55
|
+
onunload="google.maps.Unload()"
|
56
|
+
<div id="<%=content_id%>" style="width: 500px; height: 300px"></div>
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Overlord
|
2
|
+
# Google ajax search api reference:
|
3
|
+
# http://code.google.com/apis/ajaxsearch/documentation
|
4
|
+
#
|
5
|
+
# Google code playground:
|
6
|
+
# http://code.google.com/apis/ajax/playground
|
7
|
+
#
|
8
|
+
class GoogleSearchRequest
|
9
|
+
include HTTParty
|
10
|
+
format :json
|
11
|
+
|
12
|
+
# Initialize Google Request.
|
13
|
+
# Parameters:
|
14
|
+
# api_key_id: Valid Google access key (optional)
|
15
|
+
def initialize(api_key_id = nil)
|
16
|
+
@api_key_id = api_key_id
|
17
|
+
end
|
18
|
+
|
19
|
+
# Run a local search
|
20
|
+
# Google docs:
|
21
|
+
# http://code.google.com/apis/ajaxsearch/documentation/reference.html#_fonje_local
|
22
|
+
# For example:
|
23
|
+
# rsz This optional argument supplies the number of results that the application would like to recieve. A value of small
|
24
|
+
# indicates a small result set size or 4 results. A value of large indicates a large result set or 8 results.
|
25
|
+
# If this argument is not supplied, a value of small is assumed.
|
26
|
+
# start This optional argument supplies the start index of the first search result. Each successful response contains
|
27
|
+
# a cursor object (see below) which includes an array of pages. The start property for a page may be used as a
|
28
|
+
# valid value for this argument.
|
29
|
+
#
|
30
|
+
# Pass any of the standard search options:
|
31
|
+
# http://code.google.com/apis/ajaxsearch/documentation/reference.html#_intro_fonje
|
32
|
+
#
|
33
|
+
# Pass any of the following options:
|
34
|
+
# sll This optional argument supplies the search center point for a local search. It's value is a comma separated latitude/longitude pair, e.g., sll=48.8565,2.3509.
|
35
|
+
# sspn This optional argument supplies a bounding box that the local search should be relative to. When using a Google Map, the sspn value can be computed using: myMap.getBounds().toSpan().toUrlValue(); (e.g., sspn=0.065169,0.194149).
|
36
|
+
# mrt This optional argument specifies which type of listing the user is interested in. Valid values include:
|
37
|
+
# * blended - request KML, Local Business Listings, and Geocode results
|
38
|
+
# * kmlonly - request KML and Geocode results
|
39
|
+
# * localonly - request Local Business Listings and Geocode results
|
40
|
+
# If this argument is not supplied, the default value of localonly is used.
|
41
|
+
#
|
42
|
+
def self.local_search(query, options = {})
|
43
|
+
get('http://ajax.googleapis.com/ajax/services/search/local', :query => build_google_query(options.merge(:q => query)))
|
44
|
+
end
|
45
|
+
|
46
|
+
# Converts json returned from google into a feed object
|
47
|
+
# Each object has the following attributes. For more details on each attribute see http://code.google.com/apis/ajaxsearch/documentation/reference.html#_intro_fonje
|
48
|
+
# viewportmode "computed"
|
49
|
+
# country "United States"
|
50
|
+
# streetAddress "300 Grove St"
|
51
|
+
# region "CA"
|
52
|
+
# titleNoFormatting "Jardiniere Restaurant"
|
53
|
+
# ddUrlFromHere "http://www.google.com/maps?source=uds&saddr=300+Grove+St%2C+San+Francisco%2C+CA+%28Jardiniere+Restaurant%29+%4037.778127%2C-122.421735&iwstate1=dir%3Afrom"
|
54
|
+
# content ""
|
55
|
+
# ddUrlToHere "http://www.google.com/maps?source=uds&daddr=300+Grove+St%2C+San+Francisco%2C+CA+%28Jardiniere+Restaurant%29+%4037.778127%2C-122.421735&iwstate1=dir%3Ato"
|
56
|
+
# url "http://www.google.com/local?source=uds&q=food&sll=37.778127%2C-122.421735&latlng=37778127%2C-122421735%2C16134753875200198327&near=37.778127%2C-122.421735"
|
57
|
+
# city "San Francisco"
|
58
|
+
# accuracy "8"
|
59
|
+
# phoneNumbers [{"number"=>"(415) 861-5555", "type"=>""}, {"number"=>"(415) 555-1212", "type"=>""}]
|
60
|
+
# listingType "local"
|
61
|
+
# maxAge 604800
|
62
|
+
# title "Jardiniere Restaurant"
|
63
|
+
# ddUrl "http://www.google.com/maps?source=uds&daddr=300+Grove+St%2C+San+Francisco%2C+CA+%28Jardiniere+Restaurant%29+%4037.778127%2C-122.421735&saddr"
|
64
|
+
# staticMapUrl "http://mt.google.com/mapdata?cc=us&tstyp=5&Point=b&Point.latitude_e6=37778127&Point.longitude_e6=-122421735&Point.iconid=15&Point=e&w=150&h=100&zl=4"
|
65
|
+
# GsearchResultClass "GlocalSearch"
|
66
|
+
# lat "37.778127"
|
67
|
+
# addressLines ["300 Grove St", "San Francisco, CA"]
|
68
|
+
# lng "-122.421735"
|
69
|
+
def self.convert_google_search_json_to_objects(json)
|
70
|
+
if json['responseStatus'] == 200
|
71
|
+
if json['responseData']['results']
|
72
|
+
json['responseData']['results'].collect{ |result| OpenStruct.new(result) }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Add standard items to the google query
|
78
|
+
def self.build_google_query(query_options)
|
79
|
+
query_options[:v] = '1.0'
|
80
|
+
query_options[:key] = GlobalConfig.google_ajax_api_key if GlobalConfig.google_ajax_api_key
|
81
|
+
query_options
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
data/overlord.gemspec
CHANGED
@@ -5,13 +5,13 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{overlord}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Justin Ball"]
|
12
|
-
s.date = %q{2009-
|
11
|
+
s.authors = ["Justin Ball", "Joel Duffin"]
|
12
|
+
s.date = %q{2009-11-30}
|
13
13
|
s.description = %q{Code to interact with the google ajax apis on the server and the client.}
|
14
|
-
s.email = %q{
|
14
|
+
s.email = %q{justin@tatemae.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
17
|
"README.rdoc"
|
@@ -30,10 +30,12 @@ Gem::Specification.new do |s|
|
|
30
30
|
"app/views/google/_feed_search.html.erb",
|
31
31
|
"app/views/google/_feeds_scripts.html.erb",
|
32
32
|
"app/views/google/_hot_trends.html.erb",
|
33
|
+
"app/views/google/_map.html.erb",
|
33
34
|
"app/views/google/_search.html.erb",
|
34
35
|
"app/views/google/_slide_show.html.erb",
|
35
36
|
"lib/overlord.rb",
|
36
37
|
"lib/overlord/google_feed_request.rb",
|
38
|
+
"lib/overlord/google_search_request.rb",
|
37
39
|
"overlord.gemspec",
|
38
40
|
"rails/init.rb",
|
39
41
|
"test/rails_root/.gitignore",
|
@@ -51,6 +53,7 @@ Gem::Specification.new do |s|
|
|
51
53
|
"test/rails_root/app/views/default/google_dynamic_feeds_vertical.html.erb",
|
52
54
|
"test/rails_root/app/views/default/google_feed_search.html.erb",
|
53
55
|
"test/rails_root/app/views/default/google_feeds.html.erb",
|
56
|
+
"test/rails_root/app/views/default/google_map.html.erb",
|
54
57
|
"test/rails_root/app/views/default/google_search.html.erb",
|
55
58
|
"test/rails_root/app/views/default/google_slide_show.html.erb",
|
56
59
|
"test/rails_root/app/views/default/index.html.erb",
|
@@ -577,7 +580,8 @@ Gem::Specification.new do |s|
|
|
577
580
|
"test/rails_root/test/shoulda_macros/plugins.rb",
|
578
581
|
"test/rails_root/test/test_helper.rb",
|
579
582
|
"test/rails_root/test/unit/.keep",
|
580
|
-
"test/rails_root/test/unit/google_feed_request_test.rb"
|
583
|
+
"test/rails_root/test/unit/google_feed_request_test.rb",
|
584
|
+
"test/rails_root/test/unit/google_search_request_test.rb"
|
581
585
|
]
|
582
586
|
s.homepage = %q{http://github.com/jbasdf/overlord}
|
583
587
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -623,7 +627,8 @@ Gem::Specification.new do |s|
|
|
623
627
|
"test/rails_root/test/shoulda_macros/pagination.rb",
|
624
628
|
"test/rails_root/test/shoulda_macros/plugins.rb",
|
625
629
|
"test/rails_root/test/test_helper.rb",
|
626
|
-
"test/rails_root/test/unit/google_feed_request_test.rb"
|
630
|
+
"test/rails_root/test/unit/google_feed_request_test.rb",
|
631
|
+
"test/rails_root/test/unit/google_search_request_test.rb"
|
627
632
|
]
|
628
633
|
|
629
634
|
if s.respond_to? :specification_version then
|
@@ -23,7 +23,11 @@ class DefaultController < ApplicationController
|
|
23
23
|
def google_slide_show
|
24
24
|
@feed = Feed.new(:uri => 'feed://api.flickr.com/services/feeds/photos_public.gne?tags=autumn&lang=en-us&format=rss_200')
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
|
+
def google_map
|
28
|
+
@mapped_objects = []
|
29
|
+
end
|
30
|
+
|
27
31
|
def setup
|
28
32
|
@terms = CGI.unescape('mountain biking')
|
29
33
|
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= google_map(@mapped_objects) %>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class GoogleSearchRequestTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
context "google search requests" do
|
6
|
+
setup do
|
7
|
+
end
|
8
|
+
|
9
|
+
context "local search" do
|
10
|
+
setup do
|
11
|
+
@results = Overlord::GoogleSearchRequest.local_search('food')
|
12
|
+
end
|
13
|
+
should "get local search results" do
|
14
|
+
assert @results.length > 0
|
15
|
+
assert_equal 200, @results['responseStatus']
|
16
|
+
end
|
17
|
+
should "convert google json into objects" do
|
18
|
+
@objects = Overlord::GoogleSearchRequest.convert_google_search_json_to_objects(@results)
|
19
|
+
assert @objects.length > 0
|
20
|
+
assert @objects[0].country
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: overlord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Ball
|
8
|
+
- Joel Duffin
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
12
|
|
12
|
-
date: 2009-
|
13
|
+
date: 2009-11-30 00:00:00 -07:00
|
13
14
|
default_executable:
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
@@ -23,7 +24,7 @@ dependencies:
|
|
23
24
|
version: "0"
|
24
25
|
version:
|
25
26
|
description: Code to interact with the google ajax apis on the server and the client.
|
26
|
-
email:
|
27
|
+
email: justin@tatemae.com
|
27
28
|
executables: []
|
28
29
|
|
29
30
|
extensions: []
|
@@ -45,10 +46,12 @@ files:
|
|
45
46
|
- app/views/google/_feed_search.html.erb
|
46
47
|
- app/views/google/_feeds_scripts.html.erb
|
47
48
|
- app/views/google/_hot_trends.html.erb
|
49
|
+
- app/views/google/_map.html.erb
|
48
50
|
- app/views/google/_search.html.erb
|
49
51
|
- app/views/google/_slide_show.html.erb
|
50
52
|
- lib/overlord.rb
|
51
53
|
- lib/overlord/google_feed_request.rb
|
54
|
+
- lib/overlord/google_search_request.rb
|
52
55
|
- overlord.gemspec
|
53
56
|
- rails/init.rb
|
54
57
|
- test/rails_root/.gitignore
|
@@ -66,6 +69,7 @@ files:
|
|
66
69
|
- test/rails_root/app/views/default/google_dynamic_feeds_vertical.html.erb
|
67
70
|
- test/rails_root/app/views/default/google_feed_search.html.erb
|
68
71
|
- test/rails_root/app/views/default/google_feeds.html.erb
|
72
|
+
- test/rails_root/app/views/default/google_map.html.erb
|
69
73
|
- test/rails_root/app/views/default/google_search.html.erb
|
70
74
|
- test/rails_root/app/views/default/google_slide_show.html.erb
|
71
75
|
- test/rails_root/app/views/default/index.html.erb
|
@@ -593,6 +597,7 @@ files:
|
|
593
597
|
- test/rails_root/test/test_helper.rb
|
594
598
|
- test/rails_root/test/unit/.keep
|
595
599
|
- test/rails_root/test/unit/google_feed_request_test.rb
|
600
|
+
- test/rails_root/test/unit/google_search_request_test.rb
|
596
601
|
has_rdoc: true
|
597
602
|
homepage: http://github.com/jbasdf/overlord
|
598
603
|
licenses: []
|
@@ -661,3 +666,4 @@ test_files:
|
|
661
666
|
- test/rails_root/test/shoulda_macros/plugins.rb
|
662
667
|
- test/rails_root/test/test_helper.rb
|
663
668
|
- test/rails_root/test/unit/google_feed_request_test.rb
|
669
|
+
- test/rails_root/test/unit/google_search_request_test.rb
|