site_checker 0.3.0 → 0.4.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/History.md +5 -0
- data/README.md +6 -1
- data/lib/site_checker/io/content_from_web.rb +8 -5
- data/lib/site_checker/parse/page.rb +72 -72
- data/lib/site_checker/version.rb +1 -1
- data/site_checker.gemspec +6 -2
- data/spec/integration_spec.rb +12 -4
- data/spec/site_checker/cli/cli_spec_helper.rb +16 -16
- data/spec/site_checker/io/content_from_web_spec.rb +30 -29
- data/spec/site_checker/io/io_spec_helper.rb +2 -2
- data/spec/site_checker/link_collector_spec.rb +9 -9
- data/spec/site_checker/link_spec.rb +90 -90
- data/spec/spec_helper.rb +4 -0
- metadata +9 -9
data/History.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## [v0.4.0](https://github.com/ZsoltFabok/site_checker/compare/v0.3.0...v0.4.0)
|
2
|
+
### Fixes
|
3
|
+
* consider non-html content-type as an error (Zsolt Fabok, [issue 14](https://github.com/ZsoltFabok/site_checker/issues/14)})
|
4
|
+
* nokogiri 1.5.6 is out-dated, but in order to be compatible with ruby 1.8, I need it (Zsolt Fabok, [issue 15](https://github.com/ZsoltFabok/site_checker/issues/15))
|
5
|
+
|
1
6
|
## [v0.3.0](https://github.com/ZsoltFabok/site_checker/compare/v0.2.1...v0.3.0)
|
2
7
|
### Notes
|
3
8
|
* the root argument is no longer mandatory (Zsolt Fabok)
|
data/README.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
-
###Site Checker
|
1
|
+
###Site Checker
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/site_checker)
|
4
|
+
[](https://travis-ci.org/ZsoltFabok/site_checker)
|
5
|
+
[](https://gemnasium.com/ZsoltFabok/site_checker)
|
6
|
+
[](https://codeclimate.com/github/ZsoltFabok/site_checker)
|
7
|
+
[](https://coveralls.io/r/ZsoltFabok/site_checker)
|
3
8
|
|
4
9
|
Site Checker is a simple ruby gem, which helps you check the integrity of your website by recursively visiting the referenced pages and images. I use it in my test environments to make sure that my websites don't have any dead links.
|
5
10
|
|
@@ -2,16 +2,19 @@ module SiteChecker
|
|
2
2
|
module IO
|
3
3
|
class ContentFromWeb
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def initialize(visit_references, root)
|
6
|
+
@visit_references = visit_references
|
7
|
+
@root = root
|
8
|
+
end
|
9
9
|
|
10
|
-
|
10
|
+
def get(link)
|
11
11
|
begin
|
12
12
|
uri = create_absolute_reference(link.url)
|
13
13
|
if link.local_page?
|
14
14
|
content = open(uri)
|
15
|
+
if !content.meta['content-type'].start_with?('text/html')
|
16
|
+
raise "not a text/html content-type"
|
17
|
+
end
|
15
18
|
elsif link.local_image?
|
16
19
|
open(uri)
|
17
20
|
elsif @visit_references
|
@@ -1,82 +1,82 @@
|
|
1
1
|
module SiteChecker
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
module Parse
|
3
|
+
class Page
|
4
|
+
def self.parse(content, ignore_list, root)
|
5
|
+
links = []
|
6
|
+
page = Nokogiri(content)
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
links.concat(get_links(page, ignore_list, root))
|
9
|
+
links.concat(get_images(page, ignore_list, root))
|
10
|
+
links.concat(get_anchors(page))
|
11
|
+
links.concat(local_pages_which_has_anchor_references(links, root))
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
links.uniq
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
16
|
+
private
|
17
|
+
def self.get_links(page, ignore_list, root)
|
18
|
+
links = []
|
19
|
+
page.xpath("//a").reject {|a| ignored?(ignore_list, a['href'])}.each do |a|
|
20
|
+
if a['href'].match(/(.*)#.+/) && !URI($1).absolute?
|
21
|
+
kind = :anchor_ref
|
22
|
+
else
|
23
|
+
kind = :page
|
24
|
+
end
|
25
|
+
links << Link.create({:url => a['href'], :kind => kind})
|
26
|
+
end
|
27
|
+
set_location(links, root)
|
28
|
+
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
def self.get_images(page, ignore_list, root)
|
31
|
+
links = []
|
32
|
+
page.xpath("//img").reject {|img| ignored?(ignore_list, img['src'])}.each do |img|
|
33
|
+
links << Link.create({:url => img['src'], :kind => :image})
|
34
|
+
end
|
35
|
+
set_location(links, root)
|
36
|
+
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
38
|
+
def self.set_location(links, root)
|
39
|
+
links.each do |link|
|
40
|
+
uri = URI(link.url)
|
41
|
+
if uri.to_s.start_with?(root)
|
42
|
+
link.problem = "(absolute path)"
|
43
|
+
link.location = :local
|
44
|
+
else
|
45
|
+
if uri.absolute?
|
46
|
+
link.location = :remote
|
47
|
+
else
|
48
|
+
link.location = :local
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
54
|
+
def self.ignored?(ignore_list, link)
|
55
|
+
if link
|
56
|
+
ignore_list.include? link
|
57
|
+
else
|
58
|
+
true
|
59
|
+
end
|
60
|
+
end
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
62
|
+
def self.get_anchors(page)
|
63
|
+
anchors = []
|
64
|
+
page.xpath("//a").reject {|a| !a['id']}.each do |a|
|
65
|
+
anchors << Link.create({:url => a['id'], :kind => :anchor})
|
66
|
+
end
|
67
|
+
anchors
|
68
|
+
end
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
70
|
+
def self.local_pages_which_has_anchor_references(links, root)
|
71
|
+
new_links = []
|
72
|
+
links.find_all {|link| link.anchor_ref?}.each do |link|
|
73
|
+
uri = URI(link.url)
|
74
|
+
if link.url.match(/(.+)#/)
|
75
|
+
new_links << Link.create({:url => $1, :kind => :page})
|
76
|
+
end
|
77
|
+
end
|
78
|
+
set_location(new_links, root)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
82
|
end
|
data/lib/site_checker/version.rb
CHANGED
data/site_checker.gemspec
CHANGED
@@ -8,7 +8,7 @@ require 'site_checker/version'
|
|
8
8
|
Gem::Specification.new do |s|
|
9
9
|
s.name = 'site_checker'
|
10
10
|
s.version = SiteChecker::VERSION
|
11
|
-
s.date = '
|
11
|
+
s.date = '2013-08-31'
|
12
12
|
s.summary = "site_checker-#{s.version}"
|
13
13
|
s.description = "A simple tool for checking references on your website"
|
14
14
|
s.authors = ["Zsolt Fabok"]
|
@@ -26,5 +26,9 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_development_dependency('rake' , '>= 10.0.3')
|
27
27
|
s.add_development_dependency('yard' , '~> 0.8')
|
28
28
|
|
29
|
-
|
29
|
+
if RUBY_VERSION >= "1.9"
|
30
|
+
s.add_runtime_dependency('nokogiri', '~> 1.6.0')
|
31
|
+
else
|
32
|
+
s.add_runtime_dependency('nokogiri', '~> 1.5.6')
|
33
|
+
end
|
30
34
|
end
|
data/spec/integration_spec.rb
CHANGED
@@ -29,7 +29,7 @@ describe "Integration" do
|
|
29
29
|
webmock(@test_url, 200, content)
|
30
30
|
webmock("http://external.org", 200, "")
|
31
31
|
SiteChecker.check(@test_url, @root)
|
32
|
-
SiteChecker.remote_pages.should eql(["http://external.org/" ])
|
32
|
+
SiteChecker.remote_pages.sort.should eql(["http://external.org/" ])
|
33
33
|
SiteChecker.problems.should be_empty
|
34
34
|
end
|
35
35
|
|
@@ -138,6 +138,14 @@ describe "Integration" do
|
|
138
138
|
SiteChecker.check(@test_url, @root)
|
139
139
|
SiteChecker.problems.should eql({@test_url => ["/one-level-down (404)"]})
|
140
140
|
end
|
141
|
+
|
142
|
+
it "should report a problem when the content type is not an html" do
|
143
|
+
content = "<html>text<a href=\"/one-level-down\"/></html>"
|
144
|
+
webmock(@test_url, 200, content)
|
145
|
+
webmock("#{@root}/one-level-down", 200, "<html></html>", {"Content-Type"=>"text/plain; charset=UTF-8"})
|
146
|
+
SiteChecker.check(@test_url, @root)
|
147
|
+
SiteChecker.problems.should eql({@test_url => ["/one-level-down (not a text/html content-type)"]})
|
148
|
+
end
|
141
149
|
end
|
142
150
|
|
143
151
|
describe "file system based checking" do
|
@@ -152,7 +160,7 @@ describe "Integration" do
|
|
152
160
|
filesystemmock("index.html", content)
|
153
161
|
filesystemmock("/one-level-down/index.html", content)
|
154
162
|
SiteChecker.check(fs_test_path, @root)
|
155
|
-
SiteChecker.local_pages.should eql([
|
163
|
+
SiteChecker.local_pages.sort.should eql(["/one-level-down", fs_test_path])
|
156
164
|
SiteChecker.problems.should be_empty
|
157
165
|
end
|
158
166
|
|
@@ -168,7 +176,7 @@ describe "Integration" do
|
|
168
176
|
filesystemmock("index.html", content)
|
169
177
|
filesystemmock("a.png", "")
|
170
178
|
SiteChecker.check(fs_test_path, @root)
|
171
|
-
SiteChecker.local_images.should eql(["/a.png"])
|
179
|
+
SiteChecker.local_images.sort.should eql(["/a.png"])
|
172
180
|
SiteChecker.problems.should be_empty
|
173
181
|
end
|
174
182
|
|
@@ -199,7 +207,7 @@ describe "Integration" do
|
|
199
207
|
webmock(@test_url, 200, content)
|
200
208
|
webmock("http://external.org", 200, "")
|
201
209
|
SiteChecker.check(@test_url)
|
202
|
-
SiteChecker.remote_pages.should eql(["http://external.org/" ])
|
210
|
+
SiteChecker.remote_pages.sort.should eql(["http://external.org/" ])
|
203
211
|
SiteChecker.problems.should be_empty
|
204
212
|
end
|
205
213
|
|
@@ -5,21 +5,21 @@ module CliSpecHelper
|
|
5
5
|
include IoSpecHelper
|
6
6
|
|
7
7
|
def exec(command, arguments)
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
stdin, stdout, stderr = Open3.popen3("#{command} #{arguments}")
|
9
|
+
stdout.readlines.map {|line| line.chomp}.join("\n")
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
12
|
+
def option_list
|
13
|
+
"Usage: site_checker [options] <site_url>\n" +
|
14
|
+
" -e, --visit-external-references Visit external references (may take a bit longer)\n" +
|
15
|
+
" -m, --max-recursion-depth N Set the depth of the recursion\n" +
|
16
|
+
" -r, --root URL The root URL of the path\n" +
|
17
|
+
" -i, --ignore URL Ignore the provided URL (can be applied several times)\n" +
|
18
|
+
" -p, --print-local-pages Prints the list of the URLs of the collected local pages\n" +
|
19
|
+
" -x, --print-remote-pages Prints the list of the URLs of the collected remote pages\n" +
|
20
|
+
" -y, --print-local-images Prints the list of the URLs of the collected local images\n" +
|
21
|
+
" -z, --print-remote-images Prints the list of the URLs of the collected remote images\n" +
|
22
|
+
" -h, --help Show a short description and this message\n" +
|
23
|
+
" -v, --version Show version\n"
|
24
|
+
end
|
25
25
|
end
|
@@ -2,45 +2,46 @@ require 'spec_helper'
|
|
2
2
|
require_relative 'io_spec_helper'
|
3
3
|
|
4
4
|
describe SiteChecker::IO::ContentFromWeb do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
5
|
+
include IoSpecHelper
|
6
|
+
context "#get" do
|
7
|
+
before(:each) do
|
8
|
+
@root = "http://localhost:4000"
|
9
|
+
@link = SiteChecker::Link.create({:url => "link", :kind => :page, :location => :local})
|
10
|
+
@content = mock()
|
11
|
+
@content_reader = SiteChecker::IO::ContentFromWeb.new(false, @root)
|
12
|
+
end
|
13
13
|
|
14
|
-
|
14
|
+
it "should return the content of a link" do
|
15
|
+
@content.should_receive(:meta).and_return({"content-type"=>"text/html; charset=UTF-8"})
|
15
16
|
@content_reader.should_receive(:open).with(URI("#{@root}/#{@link.url}")).and_return(@content)
|
16
17
|
@content_reader.get(@link).should eql(@content)
|
17
|
-
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
it "should raise error if the link is broken" do
|
21
|
+
@content_reader.should_receive(:open).with(URI("#{@root}/#{@link.url}")).
|
22
|
+
and_raise(OpenURI::HTTPError.new("404 Not Found", nil))
|
22
23
|
expect {@content_reader.get(@link)}.to raise_error(RuntimeError, "(404 Not Found)")
|
23
|
-
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
it "should check the existence of an image" do
|
27
|
+
@link.kind = :image
|
28
|
+
@link.url = "img/image1"
|
29
|
+
@content_reader.should_receive(:open).with(URI("#{@root}/#{@link.url}"))
|
30
|
+
@content_reader.get(@link)
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
-
|
33
|
+
it "should not open a remote reference if opt-out" do
|
34
|
+
@link.location = :remote
|
34
35
|
@content_reader.should_not_receive(:open).with(URI("#{@root}/#{@link.url}"))
|
35
36
|
@content_reader.get(@link)
|
36
|
-
|
37
|
+
end
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
it "should open a remote reference if opt-in" do
|
40
|
+
@content_reader = SiteChecker::IO::ContentFromWeb.new(true, @root)
|
41
|
+
@link.location = :remote
|
42
|
+
@link.url = "http://example.org"
|
42
43
|
@content_reader.should_receive(:open).with(URI(@link.url))
|
43
44
|
@content_reader.get(@link)
|
44
|
-
|
45
|
-
|
45
|
+
end
|
46
|
+
end
|
46
47
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module IoSpecHelper
|
2
|
-
def webmock(uri, status, content)
|
2
|
+
def webmock(uri, status, content, headers = {"Content-Type"=>"text/html; charset=UTF-8"})
|
3
3
|
stub_request(:get, uri).
|
4
4
|
with(:headers => {'Accept'=>'*/*'}).\
|
5
|
-
to_return(:status => status, :body => content)
|
5
|
+
to_return(:status => status, :body => content, :headers => headers)
|
6
6
|
end
|
7
7
|
|
8
8
|
def filesystemmock(uri, content)
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe SiteChecker::LinkCollector do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
context "#check" do
|
5
|
+
before(:each) do
|
6
|
+
@test_url = "http://localhost:4000"
|
7
|
+
@root = "http://localhost:4000"
|
8
|
+
@collector = SiteChecker::LinkCollector.new do |config|
|
9
|
+
config.visit_references = true
|
10
|
+
end
|
11
|
+
end
|
12
12
|
|
13
13
|
it "should check a link only once" do
|
14
14
|
content = "<html>text<a href=\"http://external.org/\"/><a href=\"http://external.org/\"/></html>"
|
@@ -37,5 +37,5 @@ describe SiteChecker::LinkCollector do
|
|
37
37
|
@collector.check(@test_url, @root)
|
38
38
|
@collector.problems.should be_empty
|
39
39
|
end
|
40
|
-
|
40
|
+
end
|
41
41
|
end
|
@@ -1,94 +1,94 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe SiteChecker::Link do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
4
|
+
context "#create" do
|
5
|
+
it "should create a link with attribute list" do
|
6
|
+
link = SiteChecker::Link.create({:kind => :page, :location => "location"})
|
7
|
+
link.kind.should eql(:page)
|
8
|
+
link.location.should eql("location")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "#has_problem?" do
|
13
|
+
it "should return true if there are no problem with the link" do
|
14
|
+
SiteChecker::Link.create({}).has_problem?.should be_false
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return false if there are problems with the link" do
|
18
|
+
SiteChecker::Link.create({:problem => "grr"}).has_problem?.should be_true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "#anchor?" do
|
23
|
+
it "should return true for an anchor" do
|
24
|
+
SiteChecker::Link.create({:kind => :anchor}).anchor?.should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should return false for non anchor" do
|
28
|
+
SiteChecker::Link.create({:kind => :page}).anchor?.should be_false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "#anchor_ref?" do
|
33
|
+
it "should return true for an anchor_ref" do
|
34
|
+
SiteChecker::Link.create({:kind => :anchor_ref}).anchor_ref?.should be_true
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return false for non anchor ref" do
|
38
|
+
SiteChecker::Link.create({:kind => :page}).anchor_ref?.should be_false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "#anchor_related?" do
|
43
|
+
it "should return true for an anchor_ref" do
|
44
|
+
SiteChecker::Link.create({:kind => :anchor_ref}).anchor_related?.should be_true
|
45
|
+
SiteChecker::Link.create({:kind => :anchor}).anchor_related?.should be_true
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return false for non anchor ref" do
|
49
|
+
SiteChecker::Link.create({:kind => :page}).anchor_related?.should be_false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "#local_page?" do
|
54
|
+
it "should return true if the page is local" do
|
55
|
+
SiteChecker::Link.create({:kind => :page, :location => :local}).local_page?.should be_true
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should return false if the page is local or not a page at all" do
|
59
|
+
SiteChecker::Link.create({:kind => :page, :location => :remote}).local_page?.should be_false
|
60
|
+
SiteChecker::Link.create({:kind => :image, :location => :local}).local_page?.should be_false
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "#local_image?" do
|
65
|
+
it "should return true if the image is local" do
|
66
|
+
SiteChecker::Link.create({:kind => :image, :location => :local}).local_image?.should be_true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should return false if the image is local or not an image at all" do
|
70
|
+
SiteChecker::Link.create({:kind => :image, :location => :remote}).local_image?.should be_false
|
71
|
+
SiteChecker::Link.create({:kind => :page, :location => :local}).local_image?.should be_false
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "#eql" do
|
76
|
+
it "should return true if the urls are equal" do
|
77
|
+
link1 = SiteChecker::Link.create({:url => "url"})
|
78
|
+
link2 = SiteChecker::Link.create({:url => "url"})
|
79
|
+
link1.should eql(link2)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should find the link in a collection" do
|
83
|
+
link1 = SiteChecker::Link.create({:url => "url"})
|
84
|
+
link2 = SiteChecker::Link.create({:url => "url"})
|
85
|
+
[link1, link2].should include(link1)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should ignore trailing '/'" do
|
89
|
+
link1 = SiteChecker::Link.create({:url => "/url"})
|
90
|
+
link2 = SiteChecker::Link.create({:url => "url"})
|
91
|
+
link1.should eql(link2)
|
92
|
+
end
|
93
|
+
end
|
94
94
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: site_checker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-08-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -80,17 +80,17 @@ dependencies:
|
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
|
-
- -
|
83
|
+
- - ~>
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version: 1.
|
85
|
+
version: 1.6.0
|
86
86
|
type: :runtime
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
89
|
none: false
|
90
90
|
requirements:
|
91
|
-
- -
|
91
|
+
- - ~>
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version: 1.
|
93
|
+
version: 1.6.0
|
94
94
|
description: A simple tool for checking references on your website
|
95
95
|
email: me@zsoltfabok.com
|
96
96
|
executables:
|
@@ -144,7 +144,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
144
|
version: '0'
|
145
145
|
segments:
|
146
146
|
- 0
|
147
|
-
hash:
|
147
|
+
hash: 4215442512884695104
|
148
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
149
|
none: false
|
150
150
|
requirements:
|
@@ -153,13 +153,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
153
|
version: '0'
|
154
154
|
segments:
|
155
155
|
- 0
|
156
|
-
hash:
|
156
|
+
hash: 4215442512884695104
|
157
157
|
requirements: []
|
158
158
|
rubyforge_project:
|
159
159
|
rubygems_version: 1.8.23
|
160
160
|
signing_key:
|
161
161
|
specification_version: 3
|
162
|
-
summary: site_checker-0.
|
162
|
+
summary: site_checker-0.4.0
|
163
163
|
test_files:
|
164
164
|
- spec/dsl_spec.rb
|
165
165
|
- spec/integration_spec.rb
|