eshopworks-rboss 0.1.0 → 0.1.1
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/History.txt +6 -1
- data/Manifest.txt +1 -0
- data/README.textile +91 -7
- data/TODO.txt +2 -1
- data/gem_tasks/rspec.rake +6 -0
- data/gem_tasks/verify_rcov.rake +7 -0
- data/lib/boss/api.rb +25 -10
- data/lib/boss/config.rb +2 -2
- data/lib/boss/version.rb +1 -1
- data/rboss.gemspec +3 -3
- data/spec/boss/api_spec.rb +28 -20
- data/spec/boss/config_spec.rb +6 -0
- data/spec/boss/result_factory_spec.rb +5 -0
- metadata +3 -2
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
data/README.textile
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
h1. RBoss-
|
2
|
-
|
3
|
-
"Yahoo boss search":http://developer.yahoo.com/search/boss/
|
4
|
-
|
5
|
-
"Yahoo boss API":http://developer.yahoo.com/search/boss/boss_guide/
|
1
|
+
h1. RBoss Gem - Yahoo! Boss Search
|
6
2
|
|
7
3
|
h2. DESCRIPTION:
|
8
4
|
|
9
5
|
A handy gem to make using the Yahoo Boss API nice and easy in ruby.
|
10
6
|
|
11
|
-
|
7
|
+
"Yahoo! Boss Search official site":http://developer.yahoo.com/search/boss/
|
8
|
+
|
9
|
+
"Yahoo! Boss Search API":http://developer.yahoo.com/search/boss/boss_guide/
|
10
|
+
|
11
|
+
Add feature requests and bugs here: "http://eshopworks.lighthouseapp.com/projects/15732-rboss/overview":http://eshopworks.lighthouseapp.com/projects/15732-rboss/overview
|
12
12
|
|
13
13
|
h2. FEATURES:
|
14
14
|
|
@@ -47,6 +47,12 @@ h2. USAGE:
|
|
47
47
|
# lang = eng
|
48
48
|
api.search('monkeys')
|
49
49
|
|
50
|
+
#Delimit multiple search terms with commas
|
51
|
+
api.search('dancing,monkeys')
|
52
|
+
|
53
|
+
#Delimit Exact search with quotation marks
|
54
|
+
api.search('"dancing monkeys"')
|
55
|
+
|
50
56
|
#Search images, spelling, news and web
|
51
57
|
api.search_images('monkeys')
|
52
58
|
api.search_spelling('monkeys')
|
@@ -66,8 +72,86 @@ h2. USAGE:
|
|
66
72
|
config.count = 5
|
67
73
|
end
|
68
74
|
</code></pre>
|
75
|
+
|
76
|
+
h3. Global Search Options
|
77
|
+
|
78
|
+
<pre><code>
|
79
|
+
api.search('monkeys') do |config|
|
80
|
+
config.start = 1
|
81
|
+
config.count = 10
|
82
|
+
config.lang = 'en'
|
83
|
+
config.region = 'us'
|
84
|
+
config.format = 'xml'
|
85
|
+
config.callback = ''
|
86
|
+
config.sites = 'abc.com,cnn.com'
|
87
|
+
end
|
88
|
+
</pre></code>
|
89
|
+
|
90
|
+
h3. Web Search Result
|
91
|
+
|
92
|
+
<pre><code>
|
93
|
+
results = api.search_web('monkeys')
|
94
|
+
results.each do |web|
|
95
|
+
puts web.abstract
|
96
|
+
puts web.date
|
97
|
+
puts web.dispurl #URL of document matching the query result.
|
98
|
+
puts web.clickurl #navigation URL that leads to the target URL
|
99
|
+
puts web.size #document’s size in bytes
|
100
|
+
puts web.title
|
101
|
+
puts web.url
|
102
|
+
end
|
103
|
+
</code></pre>
|
104
|
+
|
105
|
+
h3. News Search Result
|
106
|
+
|
107
|
+
<pre><code>
|
108
|
+
results = api.search_news('monkeys')
|
109
|
+
results.each do |news|
|
110
|
+
puts news.abstract
|
111
|
+
puts news.clickurl
|
112
|
+
puts news.title
|
113
|
+
puts news.language
|
114
|
+
puts news.date
|
115
|
+
puts news.time
|
116
|
+
puts news.source
|
117
|
+
puts news.sourceurl
|
118
|
+
puts news.url
|
119
|
+
end
|
120
|
+
</code></pre>
|
69
121
|
|
70
|
-
|
122
|
+
h3. Image Search Result
|
123
|
+
|
124
|
+
<pre><code>
|
125
|
+
results = api.search_image('monkeys')
|
126
|
+
results.each do |image|
|
127
|
+
puts image.abstract
|
128
|
+
puts image.clickurl
|
129
|
+
puts image.filename
|
130
|
+
puts image.size
|
131
|
+
puts image.format
|
132
|
+
puts image.height
|
133
|
+
puts image.date
|
134
|
+
puts image.mimetype
|
135
|
+
puts image.refererclickurl
|
136
|
+
puts image.refererurl
|
137
|
+
puts image.title
|
138
|
+
puts image.url
|
139
|
+
puts image.width
|
140
|
+
puts image.thumbnail_height
|
141
|
+
puts image.thumbnail_url
|
142
|
+
puts image.thumbnail_width
|
143
|
+
end
|
144
|
+
</code></pre>
|
145
|
+
|
146
|
+
h3. Spell Search Result
|
147
|
+
|
148
|
+
<pre><code>
|
149
|
+
results = api.search_spelling('monkeys')
|
150
|
+
results.each do |spell|
|
151
|
+
puts spell.suggestion
|
152
|
+
end
|
153
|
+
</code></pre>
|
154
|
+
|
71
155
|
|
72
156
|
h2. LICENSE:
|
73
157
|
|
data/TODO.txt
CHANGED
data/gem_tasks/rspec.rake
CHANGED
@@ -18,4 +18,10 @@ desc "Run the specs under spec/models"
|
|
18
18
|
Spec::Rake::SpecTask.new do |t|
|
19
19
|
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
20
|
t.spec_files = FileList['spec/**/*_spec.rb']
|
21
|
+
|
22
|
+
unless ENV['NO_RCOV']
|
23
|
+
t.rcov = true
|
24
|
+
t.rcov_dir = 'coverage'
|
25
|
+
t.rcov_opts = ['--exclude', 'spec\/boss,bin\/spec,examples,\/var\/lib\/gems,\/Library\/Ruby,\.autotest']
|
26
|
+
end
|
21
27
|
end
|
data/lib/boss/api.rb
CHANGED
@@ -3,6 +3,8 @@ require 'rexml/document'
|
|
3
3
|
require 'uri'
|
4
4
|
|
5
5
|
require 'ostruct'
|
6
|
+
require 'cgi'
|
7
|
+
|
6
8
|
|
7
9
|
module Boss
|
8
10
|
|
@@ -19,28 +21,35 @@ module Boss
|
|
19
21
|
|
20
22
|
class Api
|
21
23
|
|
24
|
+
attr_accessor :endpoint
|
25
|
+
|
22
26
|
def initialize(app_id)
|
23
27
|
@app_id = app_id
|
24
28
|
@endpoint = 'http://boss.yahooapis.com/ysearch/'
|
25
29
|
end
|
26
30
|
|
31
|
+
def search(term, *conditions, &block)
|
32
|
+
search_boss term, SearchType::WEB, *conditions, &block
|
33
|
+
end
|
34
|
+
|
27
35
|
def search_images(term, *conditions, &block)
|
28
|
-
|
36
|
+
search_boss term, SearchType::IMAGES, *conditions, &block
|
29
37
|
end
|
30
38
|
|
31
39
|
def search_news(term, *conditions, &block)
|
32
|
-
|
40
|
+
search_boss term, SearchType::NEWS, *conditions, &block
|
33
41
|
end
|
34
42
|
|
35
43
|
def search_web(term, *conditions, &block)
|
36
|
-
|
44
|
+
search_boss term, SearchType::WEB, *conditions, &block
|
37
45
|
end
|
38
46
|
|
39
47
|
def search_spelling(term, *conditions, &block)
|
40
|
-
|
48
|
+
search_boss term, SearchService::SPELL, *conditions, &block
|
41
49
|
end
|
42
50
|
|
43
|
-
|
51
|
+
private
|
52
|
+
def search_boss(terms, search_type=SearchType::WEB, config = {})
|
44
53
|
config = config.empty? ? Config.new : Config.new(config)
|
45
54
|
search_results = []
|
46
55
|
|
@@ -55,8 +64,9 @@ module Boss
|
|
55
64
|
|
56
65
|
raise InvalidFormat unless (FORMATS.include? config.format)
|
57
66
|
raise InvalidConfig unless (config.count>0)
|
58
|
-
|
59
|
-
|
67
|
+
|
68
|
+
request = query_url terms, search_type, config
|
69
|
+
response = Net::HTTP.get_response request
|
60
70
|
|
61
71
|
case response.code
|
62
72
|
when "200"
|
@@ -74,19 +84,24 @@ module Boss
|
|
74
84
|
search_results
|
75
85
|
end
|
76
86
|
|
87
|
+
#TODO: parse error responses
|
77
88
|
def parse_error(data)
|
89
|
+
"Error contacting yahoo webservice"
|
78
90
|
end
|
79
91
|
|
80
92
|
protected
|
81
93
|
def query_url(terms, search_type, config)
|
82
|
-
#
|
83
|
-
|
94
|
+
#We could use URI.encode but it leaves things like ? unencoded which fails search.
|
95
|
+
encoded_terms = CGI.escape terms
|
96
|
+
# puts "#{@endpoint}#{search_type}/#{boss_version}/#{encoded_terms}?appid=#{@app_id}#{config.to_url}"
|
97
|
+
"#{@endpoint}#{search_type}/#{boss_version}/#{encoded_terms}?appid=#{@app_id}#{config.to_url}"
|
84
98
|
end
|
85
99
|
|
100
|
+
protected
|
86
101
|
def boss_version
|
87
102
|
"v#{Boss::YAHOO_VERSION}"
|
88
103
|
end
|
89
104
|
|
90
105
|
end
|
91
106
|
|
92
|
-
end
|
107
|
+
end
|
data/lib/boss/config.rb
CHANGED
@@ -8,9 +8,9 @@ module Boss
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def to_url
|
11
|
-
self.marshal_dump.inject("") {|accum, key| accum+="&#{key[0]}=#{
|
11
|
+
self.marshal_dump.inject("") {|accum, key| encoded_value=CGI.escape(key[1].to_s); accum+="&#{key[0]}=#{encoded_value}" }
|
12
12
|
end
|
13
13
|
|
14
14
|
end
|
15
15
|
|
16
|
-
end
|
16
|
+
end
|
data/lib/boss/version.rb
CHANGED
data/rboss.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{rboss}
|
3
|
-
s.version = "0.1.
|
3
|
+
s.version = "0.1.1"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["Joseph Wilk"]
|
7
|
-
s.date = %q{2008-08-
|
7
|
+
s.date = %q{2008-08-21}
|
8
8
|
s.description = %q{Api wrapping Yahoo Boss search}
|
9
9
|
s.email = ["joe@eshopworks.co.uk"]
|
10
10
|
s.extra_rdoc_files = ["History.txt", "License.txt", "Manifest.txt", "TODO.txt"]
|
11
|
-
s.files = ["History.txt", "License.txt", "Manifest.txt", "README.textile", "Rakefile", "TODO.txt", "config/hoe.rb", "config/requirements.rb", "gem_tasks/deployment.rake", "gem_tasks/environment.rake", "gem_tasks/fix_cr_lf.rake", "gem_tasks/gemspec.rake", "gem_tasks/rspec.rake", "gem_tasks/website.rake", "lib/boss.rb", "lib/boss/api.rb", "lib/boss/config.rb", "lib/boss/result.rb", "lib/boss/result/base.rb", "lib/boss/result/image.rb", "lib/boss/result/news.rb", "lib/boss/result/spell.rb", "lib/boss/result/web.rb", "lib/boss/result_factory.rb", "lib/boss/version.rb", "rboss.gemspec", "spec/boss/api_spec.rb", "spec/boss/config_spec.rb", "spec/boss/result_factory_spec.rb", "spec/spec.opts", "spec/spec_helper.rb"]
|
11
|
+
s.files = ["History.txt", "License.txt", "Manifest.txt", "README.textile", "Rakefile", "TODO.txt", "config/hoe.rb", "config/requirements.rb", "gem_tasks/deployment.rake", "gem_tasks/environment.rake", "gem_tasks/fix_cr_lf.rake", "gem_tasks/gemspec.rake", "gem_tasks/rspec.rake", "gem_tasks/verify_rcov.rake", "gem_tasks/website.rake", "lib/boss.rb", "lib/boss/api.rb", "lib/boss/config.rb", "lib/boss/result.rb", "lib/boss/result/base.rb", "lib/boss/result/image.rb", "lib/boss/result/news.rb", "lib/boss/result/spell.rb", "lib/boss/result/web.rb", "lib/boss/result_factory.rb", "lib/boss/version.rb", "rboss.gemspec", "spec/boss/api_spec.rb", "spec/boss/config_spec.rb", "spec/boss/result_factory_spec.rb", "spec/spec.opts", "spec/spec_helper.rb"]
|
12
12
|
s.has_rdoc = true
|
13
13
|
s.homepage = %q{http://github.com/eshopworks/rboss-gem}
|
14
14
|
s.rdoc_options = ["--main", "README.txt"]
|
data/spec/boss/api_spec.rb
CHANGED
@@ -4,25 +4,25 @@ require File.dirname(__FILE__) + '/../spec_helper'
|
|
4
4
|
describe Boss::Api do
|
5
5
|
|
6
6
|
def mock_http_response(stubs={})
|
7
|
-
mock('http_response', {:body => '
|
7
|
+
mock('http_response', {:body => '{"ysearchresponse":{}}', :code => "200"}.merge(stubs))
|
8
8
|
end
|
9
9
|
|
10
10
|
before(:each) do
|
11
11
|
@api = Boss::Api.new( appid = 'test' )
|
12
|
+
@api.endpoint = 'http://www.example.com/'
|
12
13
|
end
|
13
14
|
|
14
15
|
describe "responding to spelling search" do
|
15
16
|
|
16
17
|
it "should make a spelling request to yahoo service" do
|
17
18
|
Net::HTTP.should_receive(:get_response).and_return{ mock_http_response }
|
18
|
-
Boss::ResultFactory.stub!(:build)
|
19
19
|
|
20
20
|
@api.search_spelling "girafes"
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should build the spelling objects" do
|
24
24
|
Net::HTTP.stub!(:get_response).and_return{ mock_http_response }
|
25
|
-
Boss::ResultFactory.should_receive(:build).with(Boss::SearchService::SPELL, '
|
25
|
+
Boss::ResultFactory.should_receive(:build).with(Boss::SearchService::SPELL, '{"ysearchresponse":{}}')
|
26
26
|
|
27
27
|
@api.search_spelling "girafes"
|
28
28
|
end
|
@@ -32,14 +32,13 @@ describe Boss::Api do
|
|
32
32
|
describe "responding to news search" do
|
33
33
|
it "should make a news request to yahoo service" do
|
34
34
|
Net::HTTP.should_receive(:get_response).and_return{ mock_http_response }
|
35
|
-
Boss::ResultFactory.stub!(:build)
|
36
35
|
|
37
36
|
@api.search_news "monkey"
|
38
37
|
end
|
39
38
|
|
40
39
|
it "should build the news objects" do
|
41
40
|
Net::HTTP.stub!(:get_response).and_return{ mock_http_response }
|
42
|
-
Boss::ResultFactory.should_receive(:build).with(Boss::SearchType::NEWS, '
|
41
|
+
Boss::ResultFactory.should_receive(:build).with(Boss::SearchType::NEWS, '{"ysearchresponse":{}}')
|
43
42
|
|
44
43
|
@api.search_news "monkey"
|
45
44
|
end
|
@@ -48,14 +47,13 @@ describe Boss::Api do
|
|
48
47
|
describe "responding to image search" do
|
49
48
|
it "should make a image request to yahoo service" do
|
50
49
|
Net::HTTP.should_receive(:get_response).and_return{ mock_http_response }
|
51
|
-
Boss::ResultFactory.stub!(:build)
|
52
50
|
|
53
51
|
@api.search_images "hippo"
|
54
52
|
end
|
55
53
|
|
56
54
|
it "should build the image objects" do
|
57
55
|
Net::HTTP.stub!(:get_response).and_return{ mock_http_response }
|
58
|
-
Boss::ResultFactory.should_receive(:build).with(Boss::SearchType::IMAGES, '
|
56
|
+
Boss::ResultFactory.should_receive(:build).with(Boss::SearchType::IMAGES, '{"ysearchresponse":{}}')
|
59
57
|
|
60
58
|
@api.search_images "hippo"
|
61
59
|
end
|
@@ -65,13 +63,13 @@ describe Boss::Api do
|
|
65
63
|
|
66
64
|
it "should make a web request to yahoo service" do
|
67
65
|
Net::HTTP.should_receive(:get_response).and_return{ mock_http_response }
|
68
|
-
|
66
|
+
|
69
67
|
@api.search_web "monkey"
|
70
68
|
end
|
71
69
|
|
72
70
|
it "should build the web objects" do
|
73
71
|
Net::HTTP.stub!(:get_response).and_return{ mock_http_response }
|
74
|
-
Boss::ResultFactory.should_receive(:build).with(Boss::SearchType::WEB, '
|
72
|
+
Boss::ResultFactory.should_receive(:build).with(Boss::SearchType::WEB, '{"ysearchresponse":{}}')
|
75
73
|
|
76
74
|
@api.search_web "monkey"
|
77
75
|
end
|
@@ -88,20 +86,10 @@ describe Boss::Api do
|
|
88
86
|
|
89
87
|
end
|
90
88
|
|
91
|
-
describe "search should still work when get returns a successful but not code 200" do
|
92
|
-
it "should description" do
|
93
|
-
pending("fix for http://rboss.lighthouseapp.com/projects/15732/tickets/1")
|
94
|
-
Net::HTTP.stub!(:get_response).and_return{ mock_http_response :code => "206" }
|
95
|
-
|
96
|
-
lambda { @api.search_web "monkey" }.should_not raise_error(Boss::BossError)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
89
|
describe "configuring search" do
|
101
90
|
|
102
91
|
before(:each) do
|
103
92
|
Net::HTTP.stub!(:get_response).and_return{ mock_http_response }
|
104
|
-
Boss::ResultFactory.stub!(:build)
|
105
93
|
|
106
94
|
@config = Boss::Config.new
|
107
95
|
end
|
@@ -149,4 +137,24 @@ describe Boss::Api do
|
|
149
137
|
|
150
138
|
end
|
151
139
|
|
152
|
-
|
140
|
+
describe "search should still work when get returns a successful but not code 200" do
|
141
|
+
it "should description" do
|
142
|
+
pending("fix for http://eshopworks.lighthouseapp.com/projects/15732/tickets/1")
|
143
|
+
Net::HTTP.stub!(:get_response).and_return{ mock_http_response :code => "206" }
|
144
|
+
|
145
|
+
lambda { @api.search_web "monkey" }.should_not raise_error(Boss::BossError)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe "searching terms" do
|
150
|
+
it "should encode invalid characters" do
|
151
|
+
Net::HTTP.stub!(:get_response).and_return{ mock_http_response }
|
152
|
+
CGI.stub!(:escape)
|
153
|
+
CGI.should_receive(:escape).with('monkey?magic').and_return('monkey%3Fmagic')
|
154
|
+
|
155
|
+
@api.search_web "monkey?magic"
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
data/spec/boss/config_spec.rb
CHANGED
@@ -24,4 +24,10 @@ describe Boss::Config do
|
|
24
24
|
config.to_url.should include("&mizaru=cannot_see")
|
25
25
|
end
|
26
26
|
|
27
|
+
it "should encode invalid url characters" do
|
28
|
+
config = Boss::Config.new :mizaru => 'dancing monkeys?'
|
29
|
+
|
30
|
+
config.to_url.should include("dancing+monkeys%3F")
|
31
|
+
end
|
32
|
+
|
27
33
|
end
|
@@ -10,6 +10,7 @@ describe Boss::ResultFactory do
|
|
10
10
|
|
11
11
|
spelling_json_result = '{"ysearchresponse":{"responsecode":"200","totalhits":"1","count":"1","start":"0","resultset_spell":[{"suggestion":"giraffes"}]}}'
|
12
12
|
|
13
|
+
error_json_result = '{"Error":"true"}'
|
13
14
|
|
14
15
|
it "should create a new news object from json" do
|
15
16
|
Boss::Result::News.should_receive(:new).once
|
@@ -41,4 +42,8 @@ describe Boss::ResultFactory do
|
|
41
42
|
Boss::ResultFactory.build(Boss::SearchType::SPELL, spelling_json_result)
|
42
43
|
end
|
43
44
|
|
45
|
+
it "should raise an error if json result carries an error" do
|
46
|
+
lambda { Boss::ResultFactory.build(Boss::SearchType::WEB, error_json_result) }.should raise_error(Boss::BossError)
|
47
|
+
end
|
48
|
+
|
44
49
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eshopworks-rboss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Wilk
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-08-
|
12
|
+
date: 2008-08-21 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -74,6 +74,7 @@ files:
|
|
74
74
|
- gem_tasks/fix_cr_lf.rake
|
75
75
|
- gem_tasks/gemspec.rake
|
76
76
|
- gem_tasks/rspec.rake
|
77
|
+
- gem_tasks/verify_rcov.rake
|
77
78
|
- gem_tasks/website.rake
|
78
79
|
- lib/boss.rb
|
79
80
|
- lib/boss/api.rb
|