si-copyscape 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +64 -0
- data/Guardfile +42 -0
- data/README.md +112 -0
- data/lib/copyscape.rb +70 -0
- data/lib/copyscape_api.rb +39 -0
- data/lib/copyscape_matches.rb +52 -0
- data/lib/copyscape_response.rb +47 -0
- data/lib/si-copyscape.rb +8 -0
- data/lib/version.rb +5 -0
- data/si-copyscape.gemspec +28 -0
- data/test/cassettes/api_add_to_private_index.yml +42 -0
- data/test/cassettes/api_balance.yml +43 -0
- data/test/cassettes/api_error.yml +42 -0
- data/test/cassettes/api_internet_and_private_matches.yml +163 -0
- data/test/cassettes/api_internet_matches.yml +170 -0
- data/test/cassettes/api_private_matches.yml +50 -0
- data/test/test_copyscape.rb +89 -0
- data/test/test_copyscape_api.rb +15 -0
- data/test/test_copyscape_matches.rb +71 -0
- data/test/test_copyscape_response.rb +47 -0
- data/test/test_helper.rb +16 -0
- metadata +163 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://www.copyscape.com/api/?c=3&e=UTF-8&k=test&o=psearch&u=test
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: Because they are far less expensive when used, impractical vehicles
|
9
|
+
sell well in the secondary market.
|
10
|
+
headers:
|
11
|
+
Accept-Encoding:
|
12
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
13
|
+
Accept:
|
14
|
+
- "*/*"
|
15
|
+
User-Agent:
|
16
|
+
- Ruby
|
17
|
+
response:
|
18
|
+
status:
|
19
|
+
code: 200
|
20
|
+
message: OK
|
21
|
+
headers:
|
22
|
+
Date:
|
23
|
+
- Wed, 26 Aug 2015 17:03:50 GMT
|
24
|
+
Server:
|
25
|
+
- Apache/2.2.15 (CentOS)
|
26
|
+
X-Powered-By:
|
27
|
+
- PHP/5.3.3
|
28
|
+
Set-Cookie:
|
29
|
+
- ck=A4D7XKCZ0AO0KGWG80G88KCS4; expires=Fri, 25-Aug-2017 17:03:50 GMT; path=/;
|
30
|
+
domain=.copyscape.com
|
31
|
+
Content-Length:
|
32
|
+
- '1081'
|
33
|
+
Connection:
|
34
|
+
- close
|
35
|
+
Content-Type:
|
36
|
+
- text/xml; charset=utf-8
|
37
|
+
body:
|
38
|
+
encoding: UTF-8
|
39
|
+
string: "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<response>\n\t<querywords>17</querywords>\n\t<count>1</count>\n\t<result>\n\t\t<index>1</index>\n\t\t<url></url>\n\t\t<id>88029</id>\n\t\t<handle>SIA_2_E00JOQ0A2W_OJLHS6GHNQ</handle>\n\t\t<articlewords>553</articlewords>\n\t\t<added>2015-08-26
|
40
|
+
17:06:42</added>\n\t\t<title>Content Manager Content Version for item: 22003</title>\n\t\t<textsnippet>
|
41
|
+
... are far less expensive when used, impractical vehicles sell well in the
|
42
|
+
secondary market ... </textsnippet>\n\t\t<htmlsnippet> ... are far less expensive
|
43
|
+
when used, impractical vehicles sell well in the secondary market ... </htmlsnippet>\n\t\t<minwordsmatched>14</minwordsmatched>\n\t\t<wordsmatched>16</wordsmatched>\n\t\t<textmatched>Because
|
44
|
+
they are far less expensive when used, impractical vehicles sell well in the
|
45
|
+
secondary market</textmatched>\n\t\t<percentmatched>94</percentmatched>\n\t</result>\n\t<allwordsmatched>16</allwordsmatched>\n\t<allpercentmatched>94</allpercentmatched>\n\t<alltextmatched>Because
|
46
|
+
they are far less expensive when used, impractical vehicles sell well in the
|
47
|
+
secondary market</alltextmatched>\n</response>\n"
|
48
|
+
http_version:
|
49
|
+
recorded_at: Wed, 26 Aug 2015 17:08:02 GMT
|
50
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestCopyscape < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@cs = begin_copyscape
|
6
|
+
|
7
|
+
VCR.use_cassette("api_balance") do
|
8
|
+
@credit_balance = @cs.credit_balance
|
9
|
+
end
|
10
|
+
VCR.use_cassette("api_add_to_private_index") do
|
11
|
+
@private_index = @cs.add_to_private_index(text: 'Putting some text in our private index. Fee Fi Fo Fum I smell the blood of an englishman')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_error
|
16
|
+
VCR.use_cassette("api_error") do
|
17
|
+
response = @cs.internet_matches! 'test'
|
18
|
+
error = 'At least 15 words are required to perform a search'
|
19
|
+
assert_equal(response.error, error)
|
20
|
+
end
|
21
|
+
|
22
|
+
VCR.use_cassette("api_internet_matches") do
|
23
|
+
response = @cs.internet_matches! 'A national website promotion company, Search Influence routinely delivers a 10:1 return on investment, or better, for our customers.'
|
24
|
+
assert_nil(response.error, "When no errors, error should return nil")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_credit_balance
|
29
|
+
assert_instance_of(SI::CopyScape::Balance, @credit_balance)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_credit_balance_value
|
33
|
+
assert(@credit_balance.value.is_a?(Float), "Credit Balance value must be a Float")
|
34
|
+
assert_equal(@credit_balance.value, 240.51)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_credit_balance_total
|
38
|
+
assert(@credit_balance.total.is_a?(Integer), "Credit Total must be an Int")
|
39
|
+
assert_equal(@credit_balance.total, 4810)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_credit_balance_today
|
43
|
+
assert(@credit_balance.today.is_a?(Integer), "Credit Total Today must be an Int")
|
44
|
+
assert_equal(@credit_balance.today, 4810)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_internet_matches
|
48
|
+
VCR.use_cassette("api_internet_matches") do
|
49
|
+
response = @cs.internet_matches! 'A national website promotion company, Search Influence routinely delivers a 10:1 return on investment, or better, for our customers.'
|
50
|
+
assert_instance_of(SI::CopyscapeMatches, response)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_private_matches
|
55
|
+
VCR.use_cassette("api_private_matches") do
|
56
|
+
response = @cs.private_matches! 'Because they are far less expensive when used, impractical vehicles sell well in the secondary market.'
|
57
|
+
assert_instance_of(SI::CopyscapeMatches, response)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_internet_and_private_matches
|
62
|
+
VCR.use_cassette("api_internet_and_private_matches") do
|
63
|
+
response = @cs.internet_and_private_matches! 'A national website promotion company, Search Influence routinely delivers a 10:1 return on investment, or better, for our customers.'
|
64
|
+
assert_instance_of SI::CopyscapeMatches, response
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_add_to_private_index
|
69
|
+
assert_instance_of SI::CopyScape::PrivateIndex, @private_index
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_private_index_words
|
73
|
+
assert(@private_index.words.is_a?(Integer), 'Private Index words must return an integer')
|
74
|
+
assert_equal(@private_index.words, 18)
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_private_index_handle
|
78
|
+
assert(@private_index.handle.is_a?(String), 'Private Index handle must return a string')
|
79
|
+
assert_equal(@private_index.handle, 'SIA_2_E00JOQ0A2W_F0N8GRC4GS')
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_private_index_id
|
83
|
+
assert_nil(@private_index.id)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_private_index_title
|
87
|
+
assert_nil(@private_index.title)
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestCopyscapeAPI < Minitest::Test
|
4
|
+
def test_request
|
5
|
+
api = SI::CopyscapeAPI.new(
|
6
|
+
username: 'test',
|
7
|
+
api_key: 'test',
|
8
|
+
api_url: 'http://www.copyscape.com/api/'
|
9
|
+
)
|
10
|
+
VCR.use_cassette("api_balance") do
|
11
|
+
response = api.request(operation: 'balance')
|
12
|
+
assert_instance_of SI::CopyscapeResponse, response
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestCopyscapeMatches < Minitest::Test
|
4
|
+
def setup
|
5
|
+
VCR.use_cassette("api_internet_matches") do
|
6
|
+
cs = begin_copyscape
|
7
|
+
@matches = cs.internet_matches! 'A national website promotion company, Search Influence routinely delivers a 10:1 return on investment, or better, for our customers.'
|
8
|
+
@match = @matches.first
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_matches_object
|
13
|
+
assert_instance_of(SI::CopyscapeMatches, @matches)
|
14
|
+
assert(@matches.is_a?(Enumerable), 'Expected matches to be enumerable')
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_matches_object_count
|
18
|
+
assert_equal(@matches.count, 2, 'What goes in should come out')
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_match_object
|
22
|
+
assert_instance_of(SI::CopyScape::Match, @match)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_match_html_snippet
|
26
|
+
snippet = '<font color="#777777">... Trusted, Scalable Search, Social and Online Advertising. </font><font color="#000000">A national website promotion company, Search Influence routinely delivers a 10:1 return on investment, or better, for our customers.</font>'
|
27
|
+
assert_equal(@match.html_snippet, snippet)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_match_test_snippet
|
31
|
+
snippet = '... Trusted, Scalable Search, Social and Online Advertising. A national website promotion company, Search Influence routinely delivers a 10:1 return on investment, or better, for our customers.'
|
32
|
+
assert_equal(@match.text_snippet, snippet)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_match_copyscape_url
|
36
|
+
url = 'http://view.copyscape.com/compare/6jq6k9utaz/1'
|
37
|
+
assert_equal(@match.copyscape_url, url)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_match_url
|
41
|
+
url = 'http://www.searchinfluence.com/'
|
42
|
+
assert_equal(@match.url, url)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_match_title
|
46
|
+
title = 'Search Influence | Website Promotion Company'
|
47
|
+
assert_equal(@match.title, title)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_match_percent_matched
|
51
|
+
assert_equal(@match.percent_matched, 100)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_match_words_matched
|
55
|
+
assert_equal(@match.words_matched, 20)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_all_text_snippets
|
59
|
+
snippet = '... Trusted, Scalable Search, Social and Online Advertising. A national website promotion company, Search Influence routinely delivers a 10:1 return on investment, or better, for our customers.'
|
60
|
+
snippets = @matches.all_text_snippets
|
61
|
+
assert_kind_of(Array, snippets)
|
62
|
+
assert_equal(snippets.first, snippet)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_all_html_snippets
|
66
|
+
snippet = '<font color="#777777">... Trusted, Scalable Search, Social and Online Advertising. </font><font color="#000000">A national website promotion company, Search Influence routinely delivers a 10:1 return on investment, or better, for our customers.</font>'
|
67
|
+
snippets = @matches.all_html_snippets
|
68
|
+
assert_kind_of(Array, snippets)
|
69
|
+
assert_equal(snippets.first, snippet)
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestCopyscapeResponse < Minitest::Test
|
4
|
+
def setup
|
5
|
+
api = SI::CopyscapeAPI.new(
|
6
|
+
username: 'test',
|
7
|
+
api_key: 'test',
|
8
|
+
api_url: 'http://www.copyscape.com/api/'
|
9
|
+
)
|
10
|
+
VCR.use_cassette("api_internet_matches") do
|
11
|
+
text = 'A national website promotion company, Search Influence routinely delivers a 10:1 return on investment, or better, for our customers.'
|
12
|
+
@response = api.request(operation: 'csearch', params: {c:3, e: 'UTF-8'}, postdata: text)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_raw_xml
|
17
|
+
assert_kind_of(String, @response.raw_xml, 'raw_xml should return an xml string')
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_raw_hash
|
21
|
+
assert(@response.raw_hash.is_a?(Hash), "raw_hash method must return a hash")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_remaining_on_normal_search
|
25
|
+
assert_nil(@response.remaining, 'remaining should be nil if this isnt a balance check')
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_remaining_on_balance_check
|
29
|
+
VCR.use_cassette("api_balance") do
|
30
|
+
api = SI::CopyscapeAPI.new(username: 'test', api_key: 'test', api_url: 'http://www.copyscape.com/api/')
|
31
|
+
balance_response = api.request(operation: 'balance')
|
32
|
+
assert_instance_of(SI::CopyscapeResponse, balance_response)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_response
|
37
|
+
assert(@response.response.is_a?(Hash), "response method must return a hash")
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_results
|
41
|
+
assert(@response.results.is_a?(Array), 'results method must return an array')
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_query_words
|
45
|
+
assert_equal(@response.query_words, 20)
|
46
|
+
end
|
47
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'copyscape_api'
|
3
|
+
require 'copyscape'
|
4
|
+
require 'copyscape_matches'
|
5
|
+
require 'copyscape_response'
|
6
|
+
require 'crack'
|
7
|
+
require 'vcr'
|
8
|
+
|
9
|
+
VCR.configure do |config|
|
10
|
+
config.cassette_library_dir = "test/cassettes"
|
11
|
+
config.hook_into :webmock # or :fakeweb
|
12
|
+
end
|
13
|
+
|
14
|
+
def begin_copyscape
|
15
|
+
SI::CopyScape.new(username: 'test', api_key: 'test')
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: si-copyscape
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shane Kretzmann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: guard
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: guard-minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: webmock
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: vcr
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: crack
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: Allow any ruby application to easily interact with copyscape premium
|
98
|
+
api
|
99
|
+
email:
|
100
|
+
- SKretzmann@searchinfluence.com
|
101
|
+
executables: []
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".gitignore"
|
106
|
+
- Gemfile
|
107
|
+
- Gemfile.lock
|
108
|
+
- Guardfile
|
109
|
+
- README.md
|
110
|
+
- lib/copyscape.rb
|
111
|
+
- lib/copyscape_api.rb
|
112
|
+
- lib/copyscape_matches.rb
|
113
|
+
- lib/copyscape_response.rb
|
114
|
+
- lib/si-copyscape.rb
|
115
|
+
- lib/version.rb
|
116
|
+
- si-copyscape.gemspec
|
117
|
+
- test/cassettes/api_add_to_private_index.yml
|
118
|
+
- test/cassettes/api_balance.yml
|
119
|
+
- test/cassettes/api_error.yml
|
120
|
+
- test/cassettes/api_internet_and_private_matches.yml
|
121
|
+
- test/cassettes/api_internet_matches.yml
|
122
|
+
- test/cassettes/api_private_matches.yml
|
123
|
+
- test/test_copyscape.rb
|
124
|
+
- test/test_copyscape_api.rb
|
125
|
+
- test/test_copyscape_matches.rb
|
126
|
+
- test/test_copyscape_response.rb
|
127
|
+
- test/test_helper.rb
|
128
|
+
homepage: https://github.com/searchinfluence/copyscape
|
129
|
+
licenses:
|
130
|
+
- Private Property (c) Search Influence
|
131
|
+
metadata: {}
|
132
|
+
post_install_message:
|
133
|
+
rdoc_options: []
|
134
|
+
require_paths:
|
135
|
+
- lib
|
136
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
requirements: []
|
147
|
+
rubyforge_project:
|
148
|
+
rubygems_version: 2.2.2
|
149
|
+
signing_key:
|
150
|
+
specification_version: 4
|
151
|
+
summary: Gem to interface with Copyscape api
|
152
|
+
test_files:
|
153
|
+
- test/cassettes/api_add_to_private_index.yml
|
154
|
+
- test/cassettes/api_balance.yml
|
155
|
+
- test/cassettes/api_error.yml
|
156
|
+
- test/cassettes/api_internet_and_private_matches.yml
|
157
|
+
- test/cassettes/api_internet_matches.yml
|
158
|
+
- test/cassettes/api_private_matches.yml
|
159
|
+
- test/test_copyscape.rb
|
160
|
+
- test/test_copyscape_api.rb
|
161
|
+
- test/test_copyscape_matches.rb
|
162
|
+
- test/test_copyscape_response.rb
|
163
|
+
- test/test_helper.rb
|