trusty_google_custom_search 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README +51 -0
- data/Rakefile +28 -0
- data/google_custom_search-1.0.0.gem +0 -0
- data/init.rb +2 -0
- data/install.rb +1 -0
- data/lib/google_custom_search/search.rb +43 -0
- data/lib/google_custom_search/search_result.rb +45 -0
- data/lib/google_custom_search/search_result_item.rb +15 -0
- data/lib/google_custom_search.rb +1 -0
- data/spec/google_custom_search/search_result_item_spec.rb +43 -0
- data/spec/google_custom_search/search_result_spec.rb +84 -0
- data/spec/google_custom_search/search_spec.rb +53 -0
- data/spec/rcov.opts +5 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +4 -0
- data/tasks/google_custom_search_tasks.rake +4 -0
- data/trusty-google-custom-search.gemspec +27 -0
- data/uninstall.rb +1 -0
- metadata +87 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 [name of plugin creator]
|
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.
|
data/README
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
GoogleCustomSearch
|
2
|
+
==================
|
3
|
+
|
4
|
+
Rewritten version of the GoogleCustomSearch plugin, replacing the now deprecated AJAX API with
|
5
|
+
the Google Site Search XML API.
|
6
|
+
|
7
|
+
How to Use
|
8
|
+
==========
|
9
|
+
|
10
|
+
After adding the Google Custom Search plugin to your vendor/plugins directory, add the following to your environment.rb file:
|
11
|
+
|
12
|
+
GoogleCustomSearch::Search.google_search_api_key = "Your Google API Key"
|
13
|
+
|
14
|
+
From there, you can run a search like so:
|
15
|
+
|
16
|
+
@results = GoogleCustomSearch::Search.new.with_page_index(1).for url_encode("query")
|
17
|
+
|
18
|
+
Result items can be accessed through the items parameter (i.e. result.items). An example implementation for a view:
|
19
|
+
|
20
|
+
<% @results.items.each do |result_item| %>
|
21
|
+
<div class="result">
|
22
|
+
<div class="title">
|
23
|
+
<h4>
|
24
|
+
<%= link_to sanitize(result_item.title), result_item.url %>
|
25
|
+
</h4>
|
26
|
+
</div>
|
27
|
+
<div class="description">
|
28
|
+
<%= sanitize(result_item.content) %>
|
29
|
+
</div>
|
30
|
+
<div class="url">
|
31
|
+
<%= result_item.url %>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
<% end %>
|
35
|
+
|
36
|
+
And, finally, a sample implementation to create next and previous page links:
|
37
|
+
|
38
|
+
<div class="pagination-links">
|
39
|
+
<% if @result.items.count > 0 %>
|
40
|
+
<% unless @result.first_page? %>
|
41
|
+
<%= render :partial => "page", :locals => {:page_number => @result.previous_page_number, :label => "< Previous"} %>
|
42
|
+
<% end %>
|
43
|
+
<% unless @result.last_page? %>
|
44
|
+
<%= render :partial => "page", :locals => {:page_number => @result.next_page_number, :label => "Next >"} %>
|
45
|
+
<% end %>
|
46
|
+
<% end %>
|
47
|
+
</div>
|
48
|
+
|
49
|
+
|
50
|
+
Modifications (c) 2011 The Pittsburgh Cultural Trust, released under the MIT license
|
51
|
+
Copyright (c) 2010 Anand Agarwal / Anay Kamat, released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
require "spec"
|
5
|
+
require "spec/rake/spectask"
|
6
|
+
|
7
|
+
desc 'Default: run unit tests.'
|
8
|
+
task :default => :test
|
9
|
+
|
10
|
+
desc 'Test the google_custom_search plugin.'
|
11
|
+
Spec::Rake::SpecTask.new(:test) do |t|
|
12
|
+
plugin_root = File.dirname(__FILE__)
|
13
|
+
# t.rcov = true
|
14
|
+
# t.rcov_opts = lambda do
|
15
|
+
# IO.readlines("#{plugin_root}/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
|
16
|
+
# end
|
17
|
+
t.spec_opts = ['--options', "\"#{plugin_root}/spec/spec.opts\""]
|
18
|
+
t.spec_files = FileList[].include(File.join(plugin_root, 'spec', '**/*_spec.rb'))
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Generate documentation for the google_custom_search plugin.'
|
22
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
23
|
+
rdoc.rdoc_dir = 'rdoc'
|
24
|
+
rdoc.title = 'GoogleCustomSearch'
|
25
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
26
|
+
rdoc.rdoc_files.include('README')
|
27
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
28
|
+
end
|
Binary file
|
data/init.rb
ADDED
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Install hook code here
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'hpricot'
|
4
|
+
|
5
|
+
module GoogleCustomSearch
|
6
|
+
|
7
|
+
class Search
|
8
|
+
|
9
|
+
class << self
|
10
|
+
attr_accessor :google_search_api_key
|
11
|
+
end
|
12
|
+
def initialize
|
13
|
+
@page_index = 0
|
14
|
+
@query_parameters = {
|
15
|
+
:num => 10,
|
16
|
+
:start => 1
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def for keyword
|
21
|
+
uri = build_query_url(keyword)
|
22
|
+
search_data = uri.read
|
23
|
+
xml_data = Hpricot(search_data)
|
24
|
+
GoogleCustomSearch::SearchResult.new xml_data
|
25
|
+
end
|
26
|
+
|
27
|
+
def with_page_index index
|
28
|
+
@page_index = index - 1
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def build_query_url(keyword)
|
34
|
+
@query_parameters[:start] = @query_parameters[:num] * @page_index
|
35
|
+
google_search_url = "http://www.google.com/cse?client=google-csbe&output=xml_no_dtd"
|
36
|
+
arguments = @query_parameters.collect { |key, value| "#{key}=#{value}" }
|
37
|
+
arguments.sort!
|
38
|
+
URI.parse("#{google_search_url}&cx=#{self.class.google_search_api_key}&q=#{keyword}&"+arguments.join("&"))
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'hpricot'
|
2
|
+
module GoogleCustomSearch
|
3
|
+
class SearchResult
|
4
|
+
def initialize result
|
5
|
+
@result = result
|
6
|
+
end
|
7
|
+
|
8
|
+
def estimated_count
|
9
|
+
(@result/"res"/"m").innerHTML.to_i
|
10
|
+
end
|
11
|
+
|
12
|
+
def start_index
|
13
|
+
@result.at('res').attributes['sn'].to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
def end_index
|
17
|
+
@result.at('res').attributes['en'].to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
def items
|
21
|
+
(@result/"r").collect { |result| SearchResultItem.new result }
|
22
|
+
end
|
23
|
+
|
24
|
+
def range
|
25
|
+
start_index..end_index
|
26
|
+
end
|
27
|
+
|
28
|
+
def first_page?
|
29
|
+
start_index == 1
|
30
|
+
end
|
31
|
+
|
32
|
+
def previous_page_number
|
33
|
+
(start_index - 1) / 10 unless first_page?
|
34
|
+
end
|
35
|
+
|
36
|
+
def last_page?
|
37
|
+
end_index >= estimated_count
|
38
|
+
end
|
39
|
+
|
40
|
+
def next_page_number
|
41
|
+
(end_index / 10) + 1 unless last_page?
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'hpricot'
|
2
|
+
require 'cgi'
|
3
|
+
module GoogleCustomSearch
|
4
|
+
|
5
|
+
class SearchResultItem
|
6
|
+
|
7
|
+
attr_reader :title, :content, :url
|
8
|
+
|
9
|
+
def initialize(search_item)
|
10
|
+
@title = CGI.unescapeHTML((search_item/"t").innerHTML)
|
11
|
+
@content = CGI.unescapeHTML((search_item/"s").innerHTML)
|
12
|
+
@url = (search_item/"u").innerHTML
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Dir["#{File.dirname(__FILE__)}/google_custom_search/**/*.rb"].each { |file| require file }
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'hpricot'
|
2
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
|
3
|
+
|
4
|
+
describe GoogleCustomSearch::SearchResultItem do
|
5
|
+
|
6
|
+
MOCK_XML =<<-xml
|
7
|
+
<GSP VER="3.2">
|
8
|
+
<TM>0.129014</TM><Q>Wicked</Q>
|
9
|
+
<PARAM name="cx" value="abcd" original_value="abcd" url_escaped_value="abcd" js_escaped_value="abcd"/>
|
10
|
+
<PARAM name="client" value="google-csbe" original_value="google-csbe" url_escaped_value="google-csbe" js_escaped_value="google-csbe"/>
|
11
|
+
<PARAM name="output" value="xml_no_dtd" original_value="xml_no_dtd" url_escaped_value="xml_no_dtd" js_escaped_value="xml_no_dtd"/>
|
12
|
+
<PARAM name="q" value="Wicked" original_value="Wicked" url_escaped_value="Wicked" js_escaped_value="Wicked"/>
|
13
|
+
<Context><title>Cultural District Search Engine</title></Context><ARES/><RES SN="1" EN="1">
|
14
|
+
<M>33</M>
|
15
|
+
<FI/><NB><NU>/custom?q=Wicked&hl=en&safe=off&client=google-csbe&cx=004905679161489350096:rymp5afccji&boostcse=0&site=culturaldistrict.org&output=xml_no_dtd&ie=UTF-8&oe=UTF-8&ei=wFH_TdLGI8fKgQfGpMXwCg&start=10&sa=N</NU>
|
16
|
+
</NB><RG START="1" SIZE="1"/><RG START="1" SIZE="1"/><R N="1"><U>http://pgharts.culturaldistrict.org/production/26485</U><UE>http://pgharts.culturaldistrict.org/production/26485</UE><T><b>Wicked</b> Pittsburgh Benedum Center Tickets</T><RK>0</RK><S><b>Wicked</b> Pittsburgh Benedum Center Tickets Entertainment Weekly calls <b>WICKED</b> &quot;the <br> best musical of the decade,” and when it first played Pittsburgh in 2006, <b>...</b></S><LANG>en</LANG><Label>_cse_rymp5afccji</Label><HAS><L/><C SZ="25k" CID="zZcvqAH799sJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
17
|
+
</RES>
|
18
|
+
</GSP>
|
19
|
+
xml
|
20
|
+
|
21
|
+
def item_xml
|
22
|
+
results = Hpricot(MOCK_XML)
|
23
|
+
(results/"r").first
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
it "should return the title of search item" do
|
28
|
+
item = GoogleCustomSearch::SearchResultItem.new item_xml
|
29
|
+
item.title.should == "<b>Wicked</b> Pittsburgh Benedum Center Tickets"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return the url of search item" do
|
33
|
+
item = GoogleCustomSearch::SearchResultItem.new item_xml
|
34
|
+
item.url.should == "http://pgharts.culturaldistrict.org/production/26485"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return the content of search item" do
|
38
|
+
item = GoogleCustomSearch::SearchResultItem.new item_xml
|
39
|
+
item.content.should_not be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec'
|
2
|
+
require 'hpricot'
|
3
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
|
4
|
+
|
5
|
+
describe GoogleCustomSearch::SearchResult do
|
6
|
+
|
7
|
+
RESULTS_XML = <<xml
|
8
|
+
<GSP VER="3.2">
|
9
|
+
<TM>0.129014</TM><Q>Wicked</Q>
|
10
|
+
<PARAM name="cx" value="abcd" original_value="abcd" url_escaped_value="abcd" js_escaped_value="abcd"/>
|
11
|
+
<PARAM name="client" value="google-csbe" original_value="google-csbe" url_escaped_value="google-csbe" js_escaped_value="google-csbe"/>
|
12
|
+
<PARAM name="output" value="xml_no_dtd" original_value="xml_no_dtd" url_escaped_value="xml_no_dtd" js_escaped_value="xml_no_dtd"/>
|
13
|
+
<PARAM name="q" value="Wicked" original_value="Wicked" url_escaped_value="Wicked" js_escaped_value="Wicked"/>
|
14
|
+
<PARAM name="site" value="culturaldistrict.org" original_value="culturaldistrict.org" url_escaped_value="culturaldistrict.org" js_escaped_value="culturaldistrict.org"/>
|
15
|
+
<PARAM name="adkw" value="AELymgX673ECcjZDQxtHuHEb5eHdobDdCLAvA552m-THsHQIu0ADF7SYAAoooi6mXsZjdqeBc-erFEdiD5Ir7Jml7ViklMSxqaFvPG05sJJoTebK88Rys-Q" original_value="AELymgX673ECcjZDQxtHuHEb5eHdobDdCLAvA552m-THsHQIu0ADF7SYAAoooi6mXsZjdqeBc-erFEdiD5Ir7Jml7ViklMSxqaFvPG05sJJoTebK88Rys-Q" url_escaped_value="AELymgX673ECcjZDQxtHuHEb5eHdobDdCLAvA552m-THsHQIu0ADF7SYAAoooi6mXsZjdqeBc-erFEdiD5Ir7Jml7ViklMSxqaFvPG05sJJoTebK88Rys-Q" js_escaped_value="AELymgX673ECcjZDQxtHuHEb5eHdobDdCLAvA552m-THsHQIu0ADF7SYAAoooi6mXsZjdqeBc-erFEdiD5Ir7Jml7ViklMSxqaFvPG05sJJoTebK88Rys-Q"/>
|
16
|
+
<PARAM name="hl" value="en" original_value="en" url_escaped_value="en" js_escaped_value="en"/>
|
17
|
+
<PARAM name="oe" value="UTF-8" original_value="UTF-8" url_escaped_value="UTF-8" js_escaped_value="UTF-8"/>
|
18
|
+
<PARAM name="ie" value="UTF-8" original_value="UTF-8" url_escaped_value="UTF-8" js_escaped_value="UTF-8"/>
|
19
|
+
<PARAM name="boostcse" value="0" original_value="0" url_escaped_value="0" js_escaped_value="0"/>
|
20
|
+
<Context><title>Cultural District Search Engine</title></Context><ARES/><RES SN="1" EN="10">
|
21
|
+
<M>33</M>
|
22
|
+
<FI/><NB><NU>/custom?q=Wicked&hl=en&safe=off&client=google-csbe&cx=004905679161489350096:rymp5afccji&boostcse=0&site=culturaldistrict.org&output=xml_no_dtd&ie=UTF-8&oe=UTF-8&ei=wFH_TdLGI8fKgQfGpMXwCg&start=10&sa=N</NU>
|
23
|
+
</NB>
|
24
|
+
|
25
|
+
<RG START="1" SIZE="10"/><RG START="1" SIZE="1"/><R N="1"><U>http://pgharts.culturaldistrict.org/production/26485</U><UE>http://pgharts.culturaldistrict.org/production/26485</UE><T><b>Wicked</b> Pittsburgh Benedum Center Tickets</T><RK>0</RK><S><b>Wicked</b> Pittsburgh Benedum Center Tickets Entertainment Weekly calls <b>WICKED</b> &quot;the <br> best musical of the decade,” and when it first played Pittsburgh in 2006, <b>...</b></S><LANG>en</LANG><Label>_cse_rymp5afccji</Label><HAS><L/><C SZ="25k" CID="zZcvqAH799sJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
26
|
+
<RG START="2" SIZE="1"/><R N="2"><U>http://pgharts.culturaldistrict.org/production/26485/wicked?cid=CT_05122011_FB_Wicked_WickedPresale</U><UE>http://pgharts.culturaldistrict.org/production/26485/wicked%3Fcid%3DCT_05122011_FB_Wicked_WickedPresale</UE><T><b>Wicked</b> Pittsburgh Benedum Center Tickets</T><RK>0</RK><BYLINEDATE>1305231821</BYLINEDATE><S>May 12, 2011 <b>...</b> <b>Wicked</b> Pittsburgh Benedum Center Tickets Entertainment Weekly calls <b>WICKED</b> &quot;the <br> best musical of the decade,” and when it first played <b>...</b></S><LANG>en</LANG><Label>3</Label><Label>4</Label><HAS><L/><C SZ="26k" CID="unFTTJ48B_oJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
27
|
+
<RG START="3" SIZE="1"/><R N="3"><U>http://www.culturaldistrict.org/tickets/tickets/reserve.aspx?performanceNumber=24471</U><UE>http://www.culturaldistrict.org/tickets/tickets/reserve.aspx%3FperformanceNumber%3D24471</UE><T>Idina Menzel Pittsburgh Heinz Hall Tickets</T><RK>0</RK><S>Broadway powerhouse Idina Menzel – the Tony award-winning &quot;Elphaba&quot; from <br> international blockbuster <b>Wicked</b> – performs for one-night-only at Heinz Hall <br> with <b>...</b></S><LANG>en</LANG><Label>3</Label><Label>4</Label><HAS><L/><C SZ="25k" CID="LixRI1ZIT5oJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
28
|
+
<RG START="4" SIZE="1"/><R N="4"><U>http://pgharts.culturaldistrict.org/calendar/daily/2011/10/1</U><UE>http://pgharts.culturaldistrict.org/calendar/daily/2011/10/1</UE><T>The Pittsburgh Cultural Trust: Event Calendar: Saturday October 01 <b>...</b></T><RK>0</RK><S><b>Wicked</b>. 2:00 PM. Presented By: PNC Broadway Across America - Pittsburgh | Venue: <br> Benedum Center. The untold story of the witches of Oz <b>...</b></S><LANG>en</LANG><Label>3</Label><Label>4</Label><HAS><L/><C SZ="31k" CID="-OI1Yk1Uu00J"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
29
|
+
<RG START="5" SIZE="1"/><R N="5"><U>http://pgharts.culturaldistrict.org/pct_home/subscriptions/pnc-broadway-subscriber-benefits/</U><UE>http://pgharts.culturaldistrict.org/pct_home/subscriptions/pnc-broadway-subscriber-benefits/</UE><T>PNC Broadway Subscriber Benefits</T><RK>0</RK><S>You&#39;ll also be able to swap out of a subscription series show into a special as <br> they are announced (excludes <b>Wicked</b>.) You can swap your tickets out of only <b>...</b></S><LANG>en</LANG><Label>_cse_rymp5afccji</Label><HAS><L/><C SZ="17k" CID="wlaQgeznJUsJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
30
|
+
<RG START="6" SIZE="1"/><R N="6" MIME="application/pdf"><U>http://pgharts.culturaldistrict.org/uploads/File/PCT%20Group%20Sales/Broadway/bwy_WICKED_groupsales.pdf</U><UE>http://pgharts.culturaldistrict.org/uploads/File/PCT%2520Group%2520Sales/Broadway/bwy_WICKED_groupsales.pdf</UE><T>September 7-October 2, 2011 • Benedum Center</T><RK>0</RK><S>Visit <b>wicked</b>.pgharts.org for information. $4 per order handling fee is added to <br> final purchase. prices, dates and times are subject to change without notice <b>...</b></S><LANG>en</LANG><Label>_cse_rymp5afccji</Label><PageMap><DataObject type="metatags"><Attribute name="creationdate" value="D:20110506145045-04'00'"/><Attribute name="creator" value="Adobe InDesign CS3 (5.0.4)"/><Attribute name="producer" value="Adobe PDF Library 8.0"/><Attribute name="moddate" value="D:20110506145046-04'00'"/></DataObject></PageMap><HAS><L/><C SZ="" CID="D57QXYGUDqAJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET BLOB_REF="ADGEESicCNeh5IbblmeWGTjD7GhHhT-x68j4uxcR1ABteSioixexJKoYjJy8N-QGkEid67mu1eQMILVLRJlcms6fB7PrpRy_Jbq_4DXkV0G-1mEXtPrlG5c5L6_iX055ApzMWVGgP6nC"/></R>
|
31
|
+
<RG START="7" SIZE="1"/><R N="7"><U>http://www.culturaldistrict.org/calendar/daily/2011/9/11</U><UE>http://www.culturaldistrict.org/calendar/daily/2011/9/11</UE><T>CulturalDistrict.org: Event Calendar: Sunday September 11, 2011</T><RK>0</RK><S><b>Wicked</b>. 1:00 PM. Presented By: PNC Broadway Across America - Pittsburgh | Venue: <br> Benedum Center. The untold story of the witches of Oz <b>...</b></S><LANG>en</LANG><Label>3</Label><Label>4</Label><HAS><L/><C SZ="31k" CID="kLpVCLvWg9MJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
32
|
+
<RG START="8" SIZE="1"/><R N="8"><U>http://www.culturaldistrict.org/calendar/daily/2011/9/8</U><UE>http://www.culturaldistrict.org/calendar/daily/2011/9/8</UE><T>CulturalDistrict.org: Event Calendar: Thursday September 08, 2011</T><RK>0</RK><S><b>Wicked</b>. 2:00 PM. Presented By: PNC Broadway Across America - Pittsburgh | Venue: <br> Benedum Center. The untold story of the witches of Oz <b>...</b></S><LANG>en</LANG><Label>3</Label><Label>4</Label><HAS><L/><C SZ="31k" CID="401rjaqny8oJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
33
|
+
<RG START="9" SIZE="1"/><R N="9"><U>http://www.culturaldistrict.org/calendar/daily/2011/9/24</U><UE>http://www.culturaldistrict.org/calendar/daily/2011/9/24</UE><T>CulturalDistrict.org: Event Calendar: Saturday September 24, 2011</T><RK>0</RK><S><b>Wicked</b>. 2:00 PM. Presented By: PNC Broadway Across America - Pittsburgh | Venue: <br> Benedum Center. The untold story of the witches of Oz <b>...</b></S><LANG>en</LANG><Label>3</Label><Label>4</Label><HAS><L/><C SZ="34k" CID="vvjjOCKmgKIJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
34
|
+
<RG START="10" SIZE="1"/><R N="10"><U>http://www.culturaldistrict.org/calendar/daily/2011/9/30</U><UE>http://www.culturaldistrict.org/calendar/daily/2011/9/30</UE><T>CulturalDistrict.org: Event Calendar: Friday September 30, 2011</T><RK>0</RK><S><b>Wicked</b>. 8:00 PM. Presented By: PNC Broadway Across America - Pittsburgh | Venue: <br> Benedum Center. The untold story of the witches of Oz <b>...</b></S><LANG>en</LANG><Label>3</Label><Label>4</Label><HAS><L/><C SZ="31k" CID="BqNFJisYpOkJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
35
|
+
</RES>
|
36
|
+
</GSP>
|
37
|
+
xml
|
38
|
+
|
39
|
+
RESULTS_XML_NO_RESULTS = <<xml
|
40
|
+
<GSP VER="3.2">
|
41
|
+
<TM>0.166453</TM>
|
42
|
+
<Q>ffffggggg</Q>
|
43
|
+
<PARAM name="cx" value="abcd" original_value="abcd" url_escaped_value="abcd" js_escaped_value="abcd"/>
|
44
|
+
<PARAM name="client" value="google-csbe" original_value="google-csbe" url_escaped_value="google-csbe" js_escaped_value="google-csbe"/>
|
45
|
+
<PARAM name="output" value="xml_no_dtd" original_value="xml_no_dtd" url_escaped_value="xml_no_dtd" js_escaped_value="xml_no_dtd"/>
|
46
|
+
<PARAM name="q" value="ffffggggg" original_value="ffffggggg" url_escaped_value="ffffggggg" js_escaped_value="ffffggggg"/>
|
47
|
+
<PARAM name="site" value="culturaldistrict.org" original_value="culturaldistrict.org" url_escaped_value="culturaldistrict.org" js_escaped_value="culturaldistrict.org"/>
|
48
|
+
<PARAM name="adkw" value="AELymgXMiR0AyItzzgcJ88snCQ2ZQzi95BHYCpbuWqtNT-FkkxqTr3DTojcP0wKL9BMQD_VtA2nqsPZBKc_VkpC2x_UStZxn28VD4JyE6g1V53hVHpaf2js" original_value="AELymgXMiR0AyItzzgcJ88snCQ2ZQzi95BHYCpbuWqtNT-FkkxqTr3DTojcP0wKL9BMQD_VtA2nqsPZBKc_VkpC2x_UStZxn28VD4JyE6g1V53hVHpaf2js" url_escaped_value="AELymgXMiR0AyItzzgcJ88snCQ2ZQzi95BHYCpbuWqtNT-FkkxqTr3DTojcP0wKL9BMQD_VtA2nqsPZBKc_VkpC2x_UStZxn28VD4JyE6g1V53hVHpaf2js" js_escaped_value="AELymgXMiR0AyItzzgcJ88snCQ2ZQzi95BHYCpbuWqtNT-FkkxqTr3DTojcP0wKL9BMQD_VtA2nqsPZBKc_VkpC2x_UStZxn28VD4JyE6g1V53hVHpaf2js"/>
|
49
|
+
<PARAM name="hl" value="en" original_value="en" url_escaped_value="en" js_escaped_value="en"/>
|
50
|
+
<PARAM name="oe" value="UTF-8" original_value="UTF-8" url_escaped_value="UTF-8" js_escaped_value="UTF-8"/>
|
51
|
+
<PARAM name="ie" value="UTF-8" original_value="UTF-8" url_escaped_value="UTF-8" js_escaped_value="UTF-8"/>
|
52
|
+
<PARAM name="boostcse" value="0" original_value="0" url_escaped_value="0" js_escaped_value="0"/>
|
53
|
+
<Spelling>
|
54
|
+
<Suggestion q="ffggggg"><b><i>ffggggg</i></b></Suggestion>
|
55
|
+
</Spelling>
|
56
|
+
<ARES/>
|
57
|
+
</GSP>
|
58
|
+
xml
|
59
|
+
|
60
|
+
it "should find the estimated count from the given search result json data" do
|
61
|
+
result = GoogleCustomSearch::SearchResult.new Hpricot(RESULTS_XML)
|
62
|
+
result.estimated_count.should == 33
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
it "should return the range of results" do
|
67
|
+
result = GoogleCustomSearch::SearchResult.new Hpricot(RESULTS_XML)
|
68
|
+
result.range.should == (1..10)
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "items" do
|
72
|
+
it "should return the search result items" do
|
73
|
+
result = GoogleCustomSearch::SearchResult.new Hpricot(RESULTS_XML)
|
74
|
+
result.items.size.should == 10
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should return the title of search item" do
|
78
|
+
result = GoogleCustomSearch::SearchResult.new Hpricot(RESULTS_XML)
|
79
|
+
result.items.first.title.should == "<b>Wicked</b> Pittsburgh Benedum Center Tickets"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec'
|
2
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
|
3
|
+
|
4
|
+
describe GoogleCustomSearch::Search do
|
5
|
+
|
6
|
+
MOCK_JSON = {"responseData"=>{"results"=>[{"GsearchResultClass"=>"GwebSearch", "title"=>"Tile of the page", "url"=>"http://www.localhost.site/tickets/tickets/production.aspx%3FperformanceNumber%3D17303", "cacheUrl"=>"http://www.google.com/search?q=cache:pGjUcr1qUkgJ:www.localhost.site", "content"=>"Search matching content", "visibleUrl"=>"www.localhost.site", "unescapedUrl"=>"http://www.localhost.site/tickets/tickets/production.aspx?performanceNumber=17303", "titleNoFormatting"=>"Tile of the page"}, {"GsearchResultClass"=>"GwebSearch", "title"=>"Tile of the page", "url"=>"http://www.localhost.site/tickets/tickets/reserve.aspx%3FperformanceNumber%3D21140", "cacheUrl"=>"http://www.google.com/search?q=cache:E5_VPQiQo3kJ:www.localhost.site", "content"=>"1234", "visibleUrl"=>"www.localhost.site", "unescapedUrl"=>"http://www.localhost.site/tickets/tickets/reserve.aspx?performanceNumber=21140", "titleNoFormatting"=>"Tile of the page"}, {"GsearchResultClass"=>"GwebSearch", "title"=>"Tile of the page", "url"=>"http://www.localhost.site/tickets/tickets/production.aspx%3FperformanceNumber%3D23379", "cacheUrl"=>"http://www.google.com/search?q=cache:V7cn6Foe2rMJ:www.localhost.site", "content"=>"abcd", "visibleUrl"=>"www.localhost.site", "unescapedUrl"=>"http://www.localhost.site/tickets/tickets/production.aspx?performanceNumber=23379", "titleNoFormatting"=>"Tile of the page"}, {"GsearchResultClass"=>"GwebSearch", "title"=>"Tile of the page", "url"=>"http://www.localhost.site/tickets/tickets/production.aspx%3FperformanceNumber%3D17350", "cacheUrl"=>"http://www.google.com/search?q=cache:fJurfpC17DYJ:www.localhost.site", "content"=>"uiuio", "visibleUrl"=>"www.localhost.site", "unescapedUrl"=>"http://www.localhost.site/tickets/tickets/production.aspx?performanceNumber=17350", "titleNoFormatting"=>"Tile of the page"}, {"GsearchResultClass"=>"GwebSearch", "title"=>"Tile of the page", "url"=>"http://www.localhost.site/tickets/tickets/production.aspx%3FperformanceNumber%3D23374", "cacheUrl"=>"http://www.google.com/search?q=cache:jExxaBgeDD0J:www.localhost.site", "content"=>"this looks great", "visibleUrl"=>"www.localhost.site", "unescapedUrl"=>"http://www.localhost.site/tickets/tickets/production.aspx?performanceNumber=23374", "titleNoFormatting"=>"Tile of the page"}, {"GsearchResultClass"=>"GwebSearch", "title"=>"Tile of the page", "url"=>"http://www.localhost.site/tickets/tickets/production.aspx%3FperformanceNumber%3D17353", "cacheUrl"=>"http://www.google.com/search?q=cache:h43Ggs_qthYJ:www.localhost.site", "content"=>"super duper content", "visibleUrl"=>"www.localhost.site", "unescapedUrl"=>"http://www.localhost.site/tickets/tickets/production.aspx?performanceNumber=17353", "titleNoFormatting"=>"Tile of the page"}, {"GsearchResultClass"=>"GwebSearch", "title"=>"Tile of the page", "url"=>"http://www.localhost.site/tickets/calendar/", "cacheUrl"=>"http://www.google.com/search?q=cache:cI47PY7ITc4J:www.localhost.site", "content"=>"this should be useful", "visibleUrl"=>"www.localhost.site", "unescapedUrl"=>"http://www.localhost.site/tickets/calendar/", "titleNoFormatting"=>"Tile of the page"}, {"GsearchResultClass"=>"GwebSearch", "title"=>"Tile of the page - Your Show Place!", "url"=>"http://localhost.site/%3Fop%3Dcontact", "cacheUrl"=>"http://www.google.com/search?q=cache:UUq_Mw_-UnIJ:localhost.site", "content"=>"cards game", "visibleUrl"=>"localhost.site", "unescapedUrl"=>"http://localhost.site/?op=contact", "titleNoFormatting"=>"Tile of the page - Your Show Place!"}], "cursor"=>{"estimatedResultCount"=>"409", "currentPageIndex"=>3, "moreResultsUrl"=>"http://www.google.com/cse?oe=utf8&ie=utf8&source=uds&cx=004905679161489350096%3Arymp5afccji&start=28&hl=en&q=org", "pages"=>[{"label"=>1, "start"=>"0"}, {"label"=>2, "start"=>"8"}, {"label"=>3, "start"=>"16"}, {"label"=>4, "start"=>"24"}, {"label"=>5, "start"=>"32"}, {"label"=>6, "start"=>"40"}, {"label"=>7, "start"=>"48"}, {"label"=>8, "start"=>"56"}]}, "context"=>{"title"=>"Cultural District Search Engine", "facets"=>[]}}, "responseDetails"=>nil, "responseStatus"=>200}
|
7
|
+
|
8
|
+
MOCK_XML =<<-xml
|
9
|
+
<GSP VER="3.2">
|
10
|
+
<TM>0.129014</TM><Q>Wicked</Q>
|
11
|
+
<PARAM name="cx" value="abcd" original_value="abcd" url_escaped_value="abcd" js_escaped_value="abcd"/>
|
12
|
+
<PARAM name="client" value="google-csbe" original_value="google-csbe" url_escaped_value="google-csbe" js_escaped_value="google-csbe"/>
|
13
|
+
<PARAM name="output" value="xml_no_dtd" original_value="xml_no_dtd" url_escaped_value="xml_no_dtd" js_escaped_value="xml_no_dtd"/>
|
14
|
+
<PARAM name="q" value="Wicked" original_value="Wicked" url_escaped_value="Wicked" js_escaped_value="Wicked"/>
|
15
|
+
<Context><title>Cultural District Search Engine</title></Context><ARES/><RES SN="1" EN="1">
|
16
|
+
<M>33</M>
|
17
|
+
<FI/><NB><NU>/custom?q=Wicked&hl=en&safe=off&client=google-csbe&cx=004905679161489350096:rymp5afccji&boostcse=0&site=culturaldistrict.org&output=xml_no_dtd&ie=UTF-8&oe=UTF-8&ei=wFH_TdLGI8fKgQfGpMXwCg&start=10&sa=N</NU>
|
18
|
+
</NB><RG START="1" SIZE="1"/><RG START="1" SIZE="1"/><R N="1"><U>http://pgharts.culturaldistrict.org/production/26485</U><UE>http://pgharts.culturaldistrict.org/production/26485</UE><T><b>Wicked</b> Pittsburgh Benedum Center Tickets</T><RK>0</RK><S><b>Wicked</b> Pittsburgh Benedum Center Tickets Entertainment Weekly calls <b>WICKED</b> &quot;the <br> best musical of the decade,” and when it first played Pittsburgh in 2006, <b>...</b></S><LANG>en</LANG><Label>_cse_rymp5afccji</Label><HAS><L/><C SZ="25k" CID="zZcvqAH799sJ"/><RT/></HAS><ELIGIBLE_FOR_VISUAL_SNIPPET/></R>
|
19
|
+
</RES>
|
20
|
+
</GSP>
|
21
|
+
xml
|
22
|
+
|
23
|
+
ERROR_RESPONSE = {"responseData" => nil, "responseDetails" => "out of range start", "responseStatus" => 400}
|
24
|
+
|
25
|
+
GoogleCustomSearch::Search.google_search_api_key = "abcd"
|
26
|
+
|
27
|
+
describe "for" do
|
28
|
+
|
29
|
+
it "should return the estimated results count for the given search" do
|
30
|
+
mock_uri "http://www.google.com/cse?client=google-csbe&output=xml_no_dtd&cx=abcd&q=org&num=10&start=0", MOCK_XML
|
31
|
+
search = GoogleCustomSearch::Search.new
|
32
|
+
results = search.for("org")
|
33
|
+
results.estimated_count.should == 33
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return correct start and end index for results received" do
|
39
|
+
result = MOCK_XML
|
40
|
+
mock_uri "http://www.google.com/cse?client=google-csbe&output=xml_no_dtd&cx=abcd&q=org&num=10&start=10", result
|
41
|
+
search = GoogleCustomSearch::Search.new
|
42
|
+
results = search.with_page_index(2).for("org")
|
43
|
+
results.start_index.should == 1
|
44
|
+
results.end_index.should == 1
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def mock_uri url, result
|
49
|
+
mock_uri = mock(URI)
|
50
|
+
mock_uri.should_receive(:read).and_return(result)
|
51
|
+
URI.should_receive(:parse).with(url).and_return(mock_uri)
|
52
|
+
end
|
53
|
+
end
|
data/spec/rcov.opts
ADDED
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "google_custom_search"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "trusty_google_custom_search"
|
7
|
+
s.version = '1.0.0'
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Eric Sipple"]
|
10
|
+
s.email = ["sipple@trustarts.org"]
|
11
|
+
s.homepage = "https://github.com/pgharts/google_custom_search/"
|
12
|
+
s.summary = %q{Interface for google custom search}
|
13
|
+
s.description = %q{Provides access to google custom search that can be integrated with a website.}
|
14
|
+
|
15
|
+
|
16
|
+
s.add_dependency "hpricot", '~> 0.8.6'
|
17
|
+
|
18
|
+
ignores = if File.exist?('.gitignore')
|
19
|
+
File.read('.gitignore').split("\n").inject([]) {|a,p| a + Dir[p] }
|
20
|
+
else
|
21
|
+
[]
|
22
|
+
end
|
23
|
+
s.files = Dir['**/*'] - ignores
|
24
|
+
s.test_files = Dir['test/**/*','spec/**/*','features/**/*'] - ignores
|
25
|
+
# s.executables = Dir['bin/*'] - ignores
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
end
|
data/uninstall.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Uninstall hook code here
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: trusty_google_custom_search
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Eric Sipple
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-12-08 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: hpricot
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.8.6
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.8.6
|
30
|
+
description: Provides access to google custom search that can be integrated with a
|
31
|
+
website.
|
32
|
+
email:
|
33
|
+
- sipple@trustarts.org
|
34
|
+
executables: []
|
35
|
+
extensions: []
|
36
|
+
extra_rdoc_files: []
|
37
|
+
files:
|
38
|
+
- google_custom_search-1.0.0.gem
|
39
|
+
- init.rb
|
40
|
+
- install.rb
|
41
|
+
- lib/google_custom_search/search.rb
|
42
|
+
- lib/google_custom_search/search_result.rb
|
43
|
+
- lib/google_custom_search/search_result_item.rb
|
44
|
+
- lib/google_custom_search.rb
|
45
|
+
- MIT-LICENSE
|
46
|
+
- Rakefile
|
47
|
+
- README
|
48
|
+
- spec/google_custom_search/search_result_item_spec.rb
|
49
|
+
- spec/google_custom_search/search_result_spec.rb
|
50
|
+
- spec/google_custom_search/search_spec.rb
|
51
|
+
- spec/rcov.opts
|
52
|
+
- spec/spec.opts
|
53
|
+
- spec/spec_helper.rb
|
54
|
+
- tasks/google_custom_search_tasks.rake
|
55
|
+
- trusty-google-custom-search.gemspec
|
56
|
+
- uninstall.rb
|
57
|
+
homepage: https://github.com/pgharts/google_custom_search/
|
58
|
+
licenses: []
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.8.29
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: Interface for google custom search
|
81
|
+
test_files:
|
82
|
+
- spec/google_custom_search/search_result_item_spec.rb
|
83
|
+
- spec/google_custom_search/search_result_spec.rb
|
84
|
+
- spec/google_custom_search/search_spec.rb
|
85
|
+
- spec/rcov.opts
|
86
|
+
- spec/spec.opts
|
87
|
+
- spec/spec_helper.rb
|