twingly-search 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.travis.yml +27 -0
- data/CHANGELOG.md +63 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +77 -0
- data/Rakefile +23 -0
- data/examples/Gemfile +3 -0
- data/examples/find_all_posts_mentioning_github.rb +29 -0
- data/examples/hello_world.rb +11 -0
- data/lib/twingly/search.rb +6 -0
- data/lib/twingly/search/client.rb +19 -0
- data/lib/twingly/search/parser.rb +45 -0
- data/lib/twingly/search/post.rb +26 -0
- data/lib/twingly/search/query.rb +60 -0
- data/lib/twingly/search/result.rb +24 -0
- data/lib/twingly/search/version.rb +5 -0
- data/spec/client_spec.rb +27 -0
- data/spec/fixtures/invalid_result.xml +3 -0
- data/spec/fixtures/valid_result.xml +22975 -0
- data/spec/fixtures/vcr_cassettes/search_for_spotify_on_sv_blogs.yml +478 -0
- data/spec/fixtures/vcr_cassettes/search_without_valid_api_key.yml +41 -0
- data/spec/parser_spec.rb +14 -0
- data/spec/post_spec.rb +17 -0
- data/spec/query_spec.rb +122 -0
- data/spec/result_spec.rb +17 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/vcr_setup.rb +7 -0
- data/twingly-search-api-ruby.gemspec +30 -0
- metadata +202 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.twingly.com/analytics/Analytics.ashx?documentlang&key=wrong&searchpattern=something&ts&tsTo&xmloutputversion=2
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Twingly Analytics Ruby Client/2.0.1
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- nginx
|
23
|
+
Date:
|
24
|
+
- Tue, 03 Nov 2015 09:29:04 GMT
|
25
|
+
Content-Type:
|
26
|
+
- text/xml; charset=utf-8
|
27
|
+
Content-Length:
|
28
|
+
- '183'
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Cache-Control:
|
32
|
+
- private
|
33
|
+
Set-Cookie:
|
34
|
+
- SERVERID=web01; path=/
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?><blogstream xmlns=\"http://www.twingly.com\">\r\n
|
38
|
+
\ <operationResult resultType=\"failure\">The API key does not exist.</operationResult>\r\n</blogstream>"
|
39
|
+
http_version:
|
40
|
+
recorded_at: Tue, 03 Nov 2015 09:29:04 GMT
|
41
|
+
recorded_with: VCR 2.9.3
|
data/spec/parser_spec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Twingly::Search
|
4
|
+
|
5
|
+
describe Parser do
|
6
|
+
it { should respond_to(:parse) }
|
7
|
+
|
8
|
+
let(:document) { File.read('spec/fixtures/valid_result.xml') }
|
9
|
+
|
10
|
+
describe "#parse" do
|
11
|
+
subject { Parser.new.parse(document) }
|
12
|
+
it { should be_a Result }
|
13
|
+
end
|
14
|
+
end
|
data/spec/post_spec.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Twingly::Search
|
4
|
+
|
5
|
+
describe Post do
|
6
|
+
it { should respond_to :url }
|
7
|
+
it { should respond_to :title }
|
8
|
+
it { should respond_to :summary }
|
9
|
+
it { should respond_to :language_code }
|
10
|
+
it { should respond_to :indexed }
|
11
|
+
it { should respond_to :published }
|
12
|
+
it { should respond_to :blog_url }
|
13
|
+
it { should respond_to :blog_name }
|
14
|
+
it { should respond_to :authority }
|
15
|
+
it { should respond_to :blog_rank }
|
16
|
+
it { should respond_to :tags }
|
17
|
+
end
|
data/spec/query_spec.rb
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'vcr_setup'
|
3
|
+
|
4
|
+
include Twingly::Search
|
5
|
+
|
6
|
+
describe Query do
|
7
|
+
|
8
|
+
it "BASE_URL should be parsable" do
|
9
|
+
expect(URI(Query::BASE_URL).to_s).to eq(Query::BASE_URL)
|
10
|
+
end
|
11
|
+
|
12
|
+
context "without client" do
|
13
|
+
subject { Query.new }
|
14
|
+
|
15
|
+
it "should not work" do
|
16
|
+
expect { subject }.to raise_error(ArgumentError)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
before(:each) do
|
21
|
+
@client = double('client')
|
22
|
+
allow(@client).to receive(:api_key).and_return('api_key')
|
23
|
+
end
|
24
|
+
|
25
|
+
subject { Query.new(@client) }
|
26
|
+
|
27
|
+
it { should respond_to(:pattern) }
|
28
|
+
it { should respond_to(:language) }
|
29
|
+
it { should respond_to(:start_time) }
|
30
|
+
it { should respond_to(:end_time) }
|
31
|
+
it { should respond_to(:execute) }
|
32
|
+
it { should respond_to(:client) }
|
33
|
+
|
34
|
+
describe "#url" do
|
35
|
+
let(:query) { Query.new(@client) }
|
36
|
+
|
37
|
+
context "with valid pattern" do
|
38
|
+
before { query.pattern = "christmas" }
|
39
|
+
subject { query.url }
|
40
|
+
|
41
|
+
it { should include("xmloutputversion=2") }
|
42
|
+
end
|
43
|
+
|
44
|
+
context "without valid pattern" do
|
45
|
+
it "raises an error" do
|
46
|
+
expect { query.url }.to raise_error(RuntimeError, "Missing pattern")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "with empty pattern" do
|
51
|
+
before { query.pattern = "" }
|
52
|
+
|
53
|
+
it "raises an error" do
|
54
|
+
expect { query.url }.to raise_error(RuntimeError, "Missing pattern")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "with valid pattern" do
|
60
|
+
before { subject.pattern = "christmas" }
|
61
|
+
|
62
|
+
it "should add language" do
|
63
|
+
subject.language = "en"
|
64
|
+
expect(subject.request_parameters).to include(documentlang: 'en')
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should add start_time" do
|
68
|
+
subject.start_time = Time.new(2012, 12, 28, 9, 01, 22)
|
69
|
+
expect(subject.request_parameters).to include(ts: '2012-12-28 09:01:22')
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should add end_time" do
|
73
|
+
subject.end_time = Time.new(2013, 12, 28, 9, 01, 22)
|
74
|
+
expect(subject.request_parameters).to include(tsTo: '2013-12-28 09:01:22')
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should encode url paramters" do
|
78
|
+
subject.end_time = Time.new(2013, 12, 28, 9, 01, 22)
|
79
|
+
expect(subject.url_parameters).to include('tsTo=2013-12-28+09%3A01%3A22')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#pattern" do
|
84
|
+
before { subject.pattern = "spotify" }
|
85
|
+
|
86
|
+
it "should add searchpattern" do
|
87
|
+
expect(subject.url_parameters).to include("searchpattern=spotify")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "#execute" do
|
92
|
+
context "with invalid API key" do
|
93
|
+
subject {
|
94
|
+
query = Query.new(Client.new('wrong'))
|
95
|
+
query.pattern = 'something'
|
96
|
+
query
|
97
|
+
}
|
98
|
+
|
99
|
+
it "should raise error on invalid API key" do
|
100
|
+
VCR.use_cassette('search_without_valid_api_key') do
|
101
|
+
expect { subject.execute }.to raise_error(RuntimeError, "The API key does not exist.")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "when searching for spotify" do
|
107
|
+
subject {
|
108
|
+
query = Query.new(Client.new('api_key'))
|
109
|
+
query.pattern = 'spotify page-size:10'
|
110
|
+
query.language = 'sv'
|
111
|
+
query
|
112
|
+
}
|
113
|
+
|
114
|
+
it "should get posts when searching for spotify" do
|
115
|
+
VCR.use_cassette('search_for_spotify_on_sv_blogs') do
|
116
|
+
result = subject.execute
|
117
|
+
expect(result.posts).not_to be_empty
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/spec/result_spec.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rspec/its'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
include Twingly::Search
|
6
|
+
|
7
|
+
describe Result do
|
8
|
+
it { should respond_to :posts }
|
9
|
+
it { should respond_to :number_of_matches_returned }
|
10
|
+
it { should respond_to :number_of_matches_total }
|
11
|
+
it { should respond_to :seconds_elapsed }
|
12
|
+
it { should respond_to :all_results_returned? }
|
13
|
+
|
14
|
+
context "before query has populated responses" do
|
15
|
+
its(:posts) { should be_empty }
|
16
|
+
end
|
17
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/twingly/search'
|
data/spec/vcr_setup.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'twingly/search/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "twingly-search"
|
8
|
+
spec.version = Twingly::Search::VERSION
|
9
|
+
spec.platform = Gem::Platform::RUBY
|
10
|
+
spec.authors = ["Twingly AB"]
|
11
|
+
spec.email = ["support@twingly.com"]
|
12
|
+
spec.homepage = "http://github.com/twingly/twingly-search-api-ruby"
|
13
|
+
spec.summary = "Ruby API client for Twingly Search"
|
14
|
+
spec.description = "Twingly Search is a product from Twingly AB"
|
15
|
+
spec.license = 'MIT'
|
16
|
+
spec.required_ruby_version = ">= 1.9.3"
|
17
|
+
|
18
|
+
spec.files = `git ls-files`.split($/)
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_dependency "faraday", ['>= 0.9.2', '< 0.10']
|
23
|
+
spec.add_dependency "nokogiri", "~> 1.0"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3"
|
25
|
+
spec.add_development_dependency "rspec-its", "~> 1"
|
26
|
+
spec.add_development_dependency "vcr", "~> 2.6"
|
27
|
+
spec.add_development_dependency "webmock", "~> 1.0"
|
28
|
+
spec.add_development_dependency "rake", "~> 0"
|
29
|
+
spec.add_development_dependency "github_changelog_generator", "~> 1.8"
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,202 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: twingly-search
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Twingly AB
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-11-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.9.2
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0.10'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.2
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0.10'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: nokogiri
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '3'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rspec-its
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '1'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '1'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: vcr
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '2.6'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '2.6'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: webmock
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '1.0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: rake
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: github_changelog_generator
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '1.8'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '1.8'
|
131
|
+
description: Twingly Search is a product from Twingly AB
|
132
|
+
email:
|
133
|
+
- support@twingly.com
|
134
|
+
executables: []
|
135
|
+
extensions: []
|
136
|
+
extra_rdoc_files: []
|
137
|
+
files:
|
138
|
+
- ".gitignore"
|
139
|
+
- ".travis.yml"
|
140
|
+
- CHANGELOG.md
|
141
|
+
- Gemfile
|
142
|
+
- LICENSE
|
143
|
+
- README.md
|
144
|
+
- Rakefile
|
145
|
+
- examples/Gemfile
|
146
|
+
- examples/find_all_posts_mentioning_github.rb
|
147
|
+
- examples/hello_world.rb
|
148
|
+
- lib/twingly/search.rb
|
149
|
+
- lib/twingly/search/client.rb
|
150
|
+
- lib/twingly/search/parser.rb
|
151
|
+
- lib/twingly/search/post.rb
|
152
|
+
- lib/twingly/search/query.rb
|
153
|
+
- lib/twingly/search/result.rb
|
154
|
+
- lib/twingly/search/version.rb
|
155
|
+
- spec/client_spec.rb
|
156
|
+
- spec/fixtures/invalid_result.xml
|
157
|
+
- spec/fixtures/valid_result.xml
|
158
|
+
- spec/fixtures/vcr_cassettes/search_for_spotify_on_sv_blogs.yml
|
159
|
+
- spec/fixtures/vcr_cassettes/search_without_valid_api_key.yml
|
160
|
+
- spec/parser_spec.rb
|
161
|
+
- spec/post_spec.rb
|
162
|
+
- spec/query_spec.rb
|
163
|
+
- spec/result_spec.rb
|
164
|
+
- spec/spec_helper.rb
|
165
|
+
- spec/vcr_setup.rb
|
166
|
+
- twingly-search-api-ruby.gemspec
|
167
|
+
homepage: http://github.com/twingly/twingly-search-api-ruby
|
168
|
+
licenses:
|
169
|
+
- MIT
|
170
|
+
metadata: {}
|
171
|
+
post_install_message:
|
172
|
+
rdoc_options: []
|
173
|
+
require_paths:
|
174
|
+
- lib
|
175
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: 1.9.3
|
180
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
185
|
+
requirements: []
|
186
|
+
rubyforge_project:
|
187
|
+
rubygems_version: 2.5.0
|
188
|
+
signing_key:
|
189
|
+
specification_version: 4
|
190
|
+
summary: Ruby API client for Twingly Search
|
191
|
+
test_files:
|
192
|
+
- spec/client_spec.rb
|
193
|
+
- spec/fixtures/invalid_result.xml
|
194
|
+
- spec/fixtures/valid_result.xml
|
195
|
+
- spec/fixtures/vcr_cassettes/search_for_spotify_on_sv_blogs.yml
|
196
|
+
- spec/fixtures/vcr_cassettes/search_without_valid_api_key.yml
|
197
|
+
- spec/parser_spec.rb
|
198
|
+
- spec/post_spec.rb
|
199
|
+
- spec/query_spec.rb
|
200
|
+
- spec/result_spec.rb
|
201
|
+
- spec/spec_helper.rb
|
202
|
+
- spec/vcr_setup.rb
|