link-checker 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +5 -0
- data/README.md +6 -2
- data/VERSION +1 -1
- data/bin/check-links +2 -2
- data/lib/link_checker.rb +81 -40
- data/link-checker.gemspec +6 -3
- data/spec/link-checker_spec.rb +92 -43
- metadata +83 -22
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
anemone (0.7.2)
|
5
|
+
nokogiri (>= 1.3.0)
|
6
|
+
robotex (>= 1.0.0)
|
4
7
|
colorize (0.5.8)
|
5
8
|
columnize (0.3.6)
|
6
9
|
debugger (1.2.0)
|
@@ -25,6 +28,7 @@ GEM
|
|
25
28
|
rdoc (3.12)
|
26
29
|
json (~> 1.4)
|
27
30
|
redcarpet (2.1.1)
|
31
|
+
robotex (1.0.0)
|
28
32
|
rspec (2.11.0)
|
29
33
|
rspec-core (~> 2.11.0)
|
30
34
|
rspec-expectations (~> 2.11.0)
|
@@ -43,6 +47,7 @@ PLATFORMS
|
|
43
47
|
ruby
|
44
48
|
|
45
49
|
DEPENDENCIES
|
50
|
+
anemone (~> 0.7.2)
|
46
51
|
colorize (~> 0.5.8)
|
47
52
|
debugger
|
48
53
|
fakeweb (~> 1.3.0)
|
data/README.md
CHANGED
@@ -14,7 +14,7 @@ Then ```bundle install``` to install the gem.
|
|
14
14
|
|
15
15
|
## Usage
|
16
16
|
|
17
|
-
You can use the ```check-links``` command to specify any directory to scan for HTML files.
|
17
|
+
You can use the ```check-links [PATH]``` command to specify any directory to scan for HTML files. The default path is ```./```.
|
18
18
|
|
19
19
|
For example, to check the links for an Octopress site:
|
20
20
|
|
@@ -30,4 +30,8 @@ The ```link-checker``` gem uses [RSpec](http://rspec.info) for testing and has 1
|
|
30
30
|
|
31
31
|
Run the specs with:
|
32
32
|
|
33
|
-
rake spec
|
33
|
+
rake spec
|
34
|
+
|
35
|
+
## API Documentation
|
36
|
+
|
37
|
+
The Yardoc documenation is hosted on [RubyDoc.info](http://rubydoc.info/github/endymion/link-checker/frames).
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/bin/check-links
CHANGED
data/lib/link_checker.rb
CHANGED
@@ -4,29 +4,28 @@ require 'net/http'
|
|
4
4
|
require 'net/https'
|
5
5
|
require 'uri'
|
6
6
|
require 'colorize'
|
7
|
+
require 'anemone'
|
7
8
|
|
8
9
|
class LinkChecker
|
9
10
|
|
10
|
-
def initialize(
|
11
|
-
@
|
11
|
+
def initialize(target)
|
12
|
+
@target = target
|
12
13
|
end
|
13
14
|
|
14
|
-
def
|
15
|
-
Find.find(@
|
15
|
+
def html_file_paths
|
16
|
+
Find.find(@target).map {|path|
|
16
17
|
FileTest.file?(path) && (path =~ /\.html?$/) ? path : nil
|
17
18
|
}.reject{|path| path.nil?}
|
18
19
|
end
|
19
20
|
|
20
|
-
def self.
|
21
|
-
Nokogiri::HTML(
|
22
|
-
select do |link|
|
21
|
+
def self.external_link_uri_strings(source)
|
22
|
+
Nokogiri::HTML(source).css('a').select {|link|
|
23
23
|
!link.attribute('href').nil? &&
|
24
24
|
link.attribute('href').value =~ /^https?\:\/\//
|
25
|
-
|
25
|
+
}.map{|link| link.attributes['href'].value}
|
26
26
|
end
|
27
27
|
|
28
|
-
def self.
|
29
|
-
uri = URI.parse(uri)
|
28
|
+
def self.check_uri(uri, redirected=false)
|
30
29
|
http = Net::HTTP.new(uri.host, uri.port)
|
31
30
|
http.use_ssl = true if uri.scheme == "https"
|
32
31
|
http.start do
|
@@ -35,68 +34,110 @@ class LinkChecker
|
|
35
34
|
case response
|
36
35
|
when Net::HTTPSuccess then
|
37
36
|
if redirected
|
38
|
-
return Redirect.new(uri)
|
37
|
+
return Redirect.new(:final_destination_uri_string => uri.to_s)
|
39
38
|
else
|
40
|
-
return Good.new
|
39
|
+
return Good.new(:uri_string => uri.to_s)
|
41
40
|
end
|
42
41
|
when Net::HTTPRedirection then
|
43
|
-
return self.
|
42
|
+
return self.check_uri(URI(response['location']), true)
|
44
43
|
else
|
45
|
-
|
44
|
+
return Error.new(:uri_string => uri.to_s, :response => response)
|
46
45
|
end
|
47
46
|
end
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
50
|
+
def check_uris
|
51
|
+
if @target =~ /^https?\:\/\//
|
52
|
+
check_uris_by_crawling
|
53
|
+
else
|
54
|
+
check_uris_in_files
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def check_uris_by_crawling
|
59
|
+
threads = []
|
60
|
+
Anemone.crawl(@target) do |anemone|
|
61
|
+
anemone.storage = Anemone::Storage.PStore('link-checker-crawled-pages.pstore')
|
62
|
+
anemone.on_every_page do |crawled_page|
|
63
|
+
threads << start_link_check_thread(crawled_page.body, crawled_page.url.to_s)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
threads.each{|thread| thread.join }
|
67
|
+
end
|
68
|
+
|
69
|
+
def check_uris_in_files
|
70
|
+
threads = []
|
71
|
+
html_file_paths.each do |file|
|
72
|
+
threads << start_link_check_thread(open(file), file)
|
73
|
+
end
|
74
|
+
threads.each{|thread| thread.join }
|
75
|
+
end
|
76
|
+
|
77
|
+
def start_link_check_thread(source, source_name)
|
78
|
+
Thread.new do
|
79
|
+
results = self.class.external_link_uri_strings(source).map do |uri_string|
|
57
80
|
begin
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
81
|
+
uri = URI(uri_string)
|
82
|
+
response = self.class.check_uri(uri)
|
83
|
+
{ :uri_string => uri_string, :response => response }
|
62
84
|
rescue => error
|
63
|
-
|
85
|
+
{ :uri_string => uri_string, :response => Error.new(:error => error.to_s) }
|
64
86
|
end
|
65
87
|
end
|
88
|
+
report_results(source_name, results)
|
89
|
+
end
|
90
|
+
end
|
66
91
|
|
92
|
+
def report_results(file, results)
|
93
|
+
bad_checks = results.select{|result| result[:response].class.eql? Error}
|
94
|
+
warnings = results.select{|result| result[:response].class.eql? Redirect}
|
95
|
+
Thread.exclusive do
|
67
96
|
if bad_checks.empty?
|
97
|
+
message = "Checked: #{file}"
|
68
98
|
if warnings.empty?
|
69
|
-
puts
|
99
|
+
puts message.green
|
70
100
|
else
|
71
|
-
puts
|
101
|
+
puts message.yellow
|
72
102
|
end
|
73
103
|
warnings.each do |warning|
|
74
|
-
puts " Warning: #{warning[:
|
75
|
-
puts " Redirected to: #{warning[:response].
|
104
|
+
puts " Warning: #{warning[:uri_string]}".yellow
|
105
|
+
puts " Redirected to: #{warning[:response].final_destination_uri_string}".yellow
|
76
106
|
end
|
77
107
|
else
|
78
108
|
puts "Problem: #{file}".red
|
79
109
|
bad_checks.each do |check|
|
80
|
-
puts " Link: #{check[:
|
81
|
-
puts " Response: #{check[:response].
|
110
|
+
puts " Link: #{check[:uri_string]}".red
|
111
|
+
puts " Response: #{check[:response].error.to_s}".red
|
82
112
|
end
|
83
113
|
end
|
84
114
|
end
|
85
115
|
end
|
86
116
|
|
87
|
-
class
|
117
|
+
class Result
|
118
|
+
attr_reader :uri_string
|
119
|
+
def initialize(params)
|
120
|
+
@uri_string = params[:uri_string]
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
class Good < Result
|
125
|
+
end
|
88
126
|
|
89
|
-
class Redirect
|
90
|
-
attr_reader :
|
91
|
-
|
92
|
-
|
127
|
+
class Redirect < Result
|
128
|
+
attr_reader :good
|
129
|
+
attr_reader :final_destination_uri_string
|
130
|
+
def initialize(params)
|
131
|
+
@final_destination_uri_string = params[:final_destination_uri_string]
|
132
|
+
@good = params[:good]
|
133
|
+
super(params)
|
93
134
|
end
|
94
135
|
end
|
95
136
|
|
96
|
-
class Error <
|
97
|
-
|
98
|
-
def initialize(
|
99
|
-
@
|
137
|
+
class Error < Result
|
138
|
+
attr_reader :error
|
139
|
+
def initialize(params)
|
140
|
+
@error = params[:error]
|
100
141
|
end
|
101
142
|
end
|
102
143
|
|
data/link-checker.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "link-checker"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ryan Alyn Porter"]
|
12
|
-
s.date = "2012-10-
|
12
|
+
s.date = "2012-10-05"
|
13
13
|
s.description = "Check the links in a web site before deploying, using Nokogiri."
|
14
14
|
s.executables = ["check-links"]
|
15
15
|
s.extra_rdoc_files = [
|
@@ -368,7 +368,7 @@ Gem::Specification.new do |s|
|
|
368
368
|
s.homepage = "https://github.com/endymion/link-checker"
|
369
369
|
s.licenses = ["MIT"]
|
370
370
|
s.require_paths = ["lib"]
|
371
|
-
s.rubygems_version = "1.8.
|
371
|
+
s.rubygems_version = "1.8.24"
|
372
372
|
s.summary = "Check the links in a web site before deploying."
|
373
373
|
|
374
374
|
if s.respond_to? :specification_version then
|
@@ -377,6 +377,7 @@ Gem::Specification.new do |s|
|
|
377
377
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
378
378
|
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.5.5"])
|
379
379
|
s.add_runtime_dependency(%q<colorize>, ["~> 0.5.8"])
|
380
|
+
s.add_runtime_dependency(%q<anemone>, ["~> 0.7.2"])
|
380
381
|
s.add_development_dependency(%q<rspec>, ["~> 2.11.0"])
|
381
382
|
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
382
383
|
s.add_development_dependency(%q<simplecov>, ["~> 0.6.4"])
|
@@ -387,6 +388,7 @@ Gem::Specification.new do |s|
|
|
387
388
|
else
|
388
389
|
s.add_dependency(%q<nokogiri>, ["~> 1.5.5"])
|
389
390
|
s.add_dependency(%q<colorize>, ["~> 0.5.8"])
|
391
|
+
s.add_dependency(%q<anemone>, ["~> 0.7.2"])
|
390
392
|
s.add_dependency(%q<rspec>, ["~> 2.11.0"])
|
391
393
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
392
394
|
s.add_dependency(%q<simplecov>, ["~> 0.6.4"])
|
@@ -398,6 +400,7 @@ Gem::Specification.new do |s|
|
|
398
400
|
else
|
399
401
|
s.add_dependency(%q<nokogiri>, ["~> 1.5.5"])
|
400
402
|
s.add_dependency(%q<colorize>, ["~> 0.5.8"])
|
403
|
+
s.add_dependency(%q<anemone>, ["~> 0.7.2"])
|
401
404
|
s.add_dependency(%q<rspec>, ["~> 2.11.0"])
|
402
405
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
403
406
|
s.add_dependency(%q<simplecov>, ["~> 0.6.4"])
|
data/spec/link-checker_spec.rb
CHANGED
@@ -3,88 +3,137 @@ require 'link_checker'
|
|
3
3
|
|
4
4
|
describe LinkChecker do
|
5
5
|
|
6
|
-
|
7
|
-
@site_path = 'spec/test-site/public/'
|
8
|
-
end
|
6
|
+
describe "scans a file path and" do
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
before(:all) do
|
9
|
+
@site_path = 'spec/test-site/public/'
|
10
|
+
end
|
11
|
+
|
12
|
+
it "finds all of the HTML files in the target path." do
|
13
|
+
files = LinkChecker.new(@site_path).html_file_paths
|
14
|
+
files.size.should == 3
|
15
|
+
end
|
16
|
+
|
17
|
+
it "finds all of the external links in an HTML file." do
|
18
|
+
links = LinkChecker.external_link_uri_strings(
|
19
|
+
open('spec/test-site/public/blog/2012/10/02/a-list-of-links/index.html'))
|
20
|
+
links.size.should == 4
|
21
|
+
end
|
22
|
+
|
23
|
+
it "finds all of the external links in a string." do
|
24
|
+
links = LinkChecker.external_link_uri_strings(
|
25
|
+
open('spec/test-site/public/blog/2012/10/02/a-list-of-links/index.html').read)
|
26
|
+
links.size.should == 4
|
27
|
+
end
|
14
28
|
|
15
|
-
it "finds all of the external links in an HTML file." do
|
16
|
-
links = LinkChecker.find_external_links(
|
17
|
-
'spec/test-site/public/blog/2012/10/02/a-list-of-links/index.html')
|
18
|
-
links.size.should == 4
|
19
29
|
end
|
20
30
|
|
21
31
|
describe "checks links and" do
|
22
32
|
|
23
33
|
before(:all) do
|
24
|
-
@good_uri = 'http://goodlink.com'
|
25
|
-
FakeWeb.register_uri(:any, @good_uri, :body => "Yay it worked.")
|
34
|
+
@good_uri = URI('http://goodlink.com')
|
35
|
+
FakeWeb.register_uri(:any, @good_uri.to_s, :body => "Yay it worked.")
|
26
36
|
|
27
|
-
@bad_uri = 'http://brokenlink.com'
|
28
|
-
FakeWeb.register_uri(:get, @bad_uri,
|
37
|
+
@bad_uri = URI('http://brokenlink.com')
|
38
|
+
FakeWeb.register_uri(:get, @bad_uri.to_s,
|
29
39
|
:body => "File not found", :status => ["404", "Missing"])
|
30
40
|
|
31
|
-
@redirect_uri = 'http://redirect.com'
|
41
|
+
@redirect_uri = URI('http://redirect.com')
|
32
42
|
end
|
33
43
|
|
34
44
|
it "declares good links to be good." do
|
35
|
-
LinkChecker.
|
45
|
+
LinkChecker.check_uri(@good_uri).class.should be LinkChecker::Good
|
36
46
|
end
|
37
47
|
|
38
48
|
it "declares bad links to be bad." do
|
39
|
-
|
40
|
-
raise_error(LinkChecker::Error))
|
49
|
+
LinkChecker.check_uri(@bad_uri).class.should be LinkChecker::Error
|
41
50
|
end
|
42
51
|
|
43
52
|
describe "follows redirects to the destination and" do
|
44
53
|
|
45
54
|
it "declares good redirect targets to be good." do
|
46
|
-
FakeWeb.register_uri(:get, @redirect_uri,
|
47
|
-
:location => @good_uri, :status => ["302", "Moved"])
|
48
|
-
result = LinkChecker.
|
55
|
+
FakeWeb.register_uri(:get, @redirect_uri.to_s,
|
56
|
+
:location => @good_uri.to_s, :status => ["302", "Moved"])
|
57
|
+
result = LinkChecker.check_uri(@redirect_uri)
|
49
58
|
result.class.should be LinkChecker::Redirect
|
50
|
-
result.
|
59
|
+
result.final_destination_uri_string.should == @good_uri.to_s
|
51
60
|
end
|
52
61
|
|
53
62
|
it "declares bad redirect targets to be bad." do
|
54
|
-
FakeWeb.register_uri(:get, @redirect_uri,
|
55
|
-
:location => @bad_uri, :status => ["302", "Moved"])
|
56
|
-
|
57
|
-
|
63
|
+
FakeWeb.register_uri(:get, @redirect_uri.to_s,
|
64
|
+
:location => @bad_uri.to_s, :status => ["302", "Moved"])
|
65
|
+
result = LinkChecker.check_uri(@redirect_uri)
|
66
|
+
result.class.should be LinkChecker::Error
|
58
67
|
end
|
59
68
|
|
60
69
|
end
|
61
70
|
|
62
71
|
end
|
63
72
|
|
64
|
-
describe "prints output" do
|
73
|
+
describe "scans a file path and prints output" do
|
65
74
|
|
66
|
-
|
67
|
-
LinkChecker.stub(:
|
68
|
-
|
69
|
-
LinkChecker.
|
75
|
+
before(:each) do
|
76
|
+
LinkChecker.any_instance.stub(:html_file_paths) {
|
77
|
+
['spec/test-site/public/blog/2012/10/02/a-list-of-links/index.html'] }
|
78
|
+
LinkChecker.stub(:external_link_uri_strings).and_return(['http://something.com'])
|
70
79
|
end
|
71
80
|
|
72
|
-
it "prints
|
73
|
-
LinkChecker.stub(:
|
74
|
-
|
75
|
-
|
76
|
-
$stdout.should_receive(:puts).with(/
|
77
|
-
LinkChecker.new(@site_path).
|
81
|
+
it "prints green when the links are good." do
|
82
|
+
LinkChecker.stub(:check_uri) do
|
83
|
+
LinkChecker::Good.new(:uri_string => 'http://something.com')
|
84
|
+
end
|
85
|
+
$stdout.should_receive(:puts).with(/Checked/i).once
|
86
|
+
LinkChecker.new(@site_path).check_uris
|
87
|
+
end
|
88
|
+
|
89
|
+
it "prints red when the links are bad." do
|
90
|
+
LinkChecker.stub(:check_uri) do
|
91
|
+
LinkChecker::Error.new(
|
92
|
+
:uri_string => 'http://something.com',
|
93
|
+
:response => 'No.'
|
94
|
+
)
|
95
|
+
end
|
96
|
+
$stdout.should_receive(:puts).with(/Problem/i).once
|
97
|
+
$stdout.should_receive(:puts).with(/Link/i).once
|
98
|
+
$stdout.should_receive(:puts).with(/Response/i).once
|
99
|
+
LinkChecker.new(@site_path).check_uris
|
78
100
|
end
|
79
101
|
|
80
102
|
it "prints yellow warnings when the links redirect." do
|
81
|
-
LinkChecker.stub(:
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
103
|
+
LinkChecker.stub(:check_uri) do
|
104
|
+
LinkChecker::Redirect.new(
|
105
|
+
:uri_string => 'http://something.com',
|
106
|
+
:final_desination => 'http://something-else.com'
|
107
|
+
)
|
108
|
+
end
|
109
|
+
$stdout.should_receive(:puts).with(/Checked/i).once
|
110
|
+
$stdout.should_receive(:puts).with(/Warning/i).once
|
111
|
+
$stdout.should_receive(:puts).with(/Redirected/i).once
|
112
|
+
LinkChecker.new(@site_path).check_uris
|
86
113
|
end
|
87
114
|
|
88
115
|
end
|
89
116
|
|
117
|
+
describe "prints output for invalid links and" do
|
118
|
+
|
119
|
+
it "declares them to be bad." do
|
120
|
+
LinkChecker.stub(:external_link_uri_strings).and_return(['hQQp://!!!.com'])
|
121
|
+
$stdout.should_receive(:puts).with(/Problem/i).once
|
122
|
+
$stdout.should_receive(:puts).with(/Link/i).once
|
123
|
+
$stdout.should_receive(:puts).with(/Response/i).once
|
124
|
+
thread = LinkChecker.new(@site_path).start_link_check_thread('<html></html>', 'source.html')
|
125
|
+
thread.join
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
it "crawls a web site." do
|
131
|
+
LinkChecker.stub(:external_link_uri_strings).and_return(['http://something.com'])
|
132
|
+
LinkChecker.stub(:check_uri) do
|
133
|
+
LinkChecker::Good.new(:uri_string => 'http://something.com')
|
134
|
+
end
|
135
|
+
$stdout.should_receive(:puts).with(/Checked/i).once
|
136
|
+
LinkChecker.new('http://pretty-sure-this-is-not-real.com').check_uris
|
137
|
+
end
|
138
|
+
|
90
139
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: link-checker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,21 +21,47 @@ dependencies:
|
|
21
21
|
version: 1.5.5
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.5.5
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: colorize
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.5.8
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
41
|
none: false
|
29
42
|
requirements:
|
30
43
|
- - ~>
|
31
44
|
- !ruby/object:Gem::Version
|
32
45
|
version: 0.5.8
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: anemone
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.7.2
|
33
54
|
type: :runtime
|
34
55
|
prerelease: false
|
35
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.7.2
|
36
62
|
- !ruby/object:Gem::Dependency
|
37
63
|
name: rspec
|
38
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
39
65
|
none: false
|
40
66
|
requirements:
|
41
67
|
- - ~>
|
@@ -43,10 +69,15 @@ dependencies:
|
|
43
69
|
version: 2.11.0
|
44
70
|
type: :development
|
45
71
|
prerelease: false
|
46
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.11.0
|
47
78
|
- !ruby/object:Gem::Dependency
|
48
79
|
name: jeweler
|
49
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
50
81
|
none: false
|
51
82
|
requirements:
|
52
83
|
- - ~>
|
@@ -54,10 +85,15 @@ dependencies:
|
|
54
85
|
version: 1.8.4
|
55
86
|
type: :development
|
56
87
|
prerelease: false
|
57
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.8.4
|
58
94
|
- !ruby/object:Gem::Dependency
|
59
95
|
name: simplecov
|
60
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
61
97
|
none: false
|
62
98
|
requirements:
|
63
99
|
- - ~>
|
@@ -65,10 +101,15 @@ dependencies:
|
|
65
101
|
version: 0.6.4
|
66
102
|
type: :development
|
67
103
|
prerelease: false
|
68
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.6.4
|
69
110
|
- !ruby/object:Gem::Dependency
|
70
111
|
name: fakeweb
|
71
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
72
113
|
none: false
|
73
114
|
requirements:
|
74
115
|
- - ~>
|
@@ -76,10 +117,15 @@ dependencies:
|
|
76
117
|
version: 1.3.0
|
77
118
|
type: :development
|
78
119
|
prerelease: false
|
79
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.3.0
|
80
126
|
- !ruby/object:Gem::Dependency
|
81
127
|
name: yard
|
82
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
83
129
|
none: false
|
84
130
|
requirements:
|
85
131
|
- - ~>
|
@@ -87,10 +133,15 @@ dependencies:
|
|
87
133
|
version: 0.8.2.1
|
88
134
|
type: :development
|
89
135
|
prerelease: false
|
90
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.8.2.1
|
91
142
|
- !ruby/object:Gem::Dependency
|
92
143
|
name: redcarpet
|
93
|
-
requirement:
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
94
145
|
none: false
|
95
146
|
requirements:
|
96
147
|
- - ~>
|
@@ -98,10 +149,15 @@ dependencies:
|
|
98
149
|
version: 2.1.1
|
99
150
|
type: :development
|
100
151
|
prerelease: false
|
101
|
-
version_requirements:
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 2.1.1
|
102
158
|
- !ruby/object:Gem::Dependency
|
103
159
|
name: debugger
|
104
|
-
requirement:
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
105
161
|
none: false
|
106
162
|
requirements:
|
107
163
|
- - ! '>='
|
@@ -109,7 +165,12 @@ dependencies:
|
|
109
165
|
version: '0'
|
110
166
|
type: :development
|
111
167
|
prerelease: false
|
112
|
-
version_requirements:
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
113
174
|
description: Check the links in a web site before deploying, using Nokogiri.
|
114
175
|
email:
|
115
176
|
executables:
|
@@ -481,7 +542,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
481
542
|
version: '0'
|
482
543
|
segments:
|
483
544
|
- 0
|
484
|
-
hash:
|
545
|
+
hash: 2583548711827619291
|
485
546
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
486
547
|
none: false
|
487
548
|
requirements:
|
@@ -490,7 +551,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
490
551
|
version: '0'
|
491
552
|
requirements: []
|
492
553
|
rubyforge_project:
|
493
|
-
rubygems_version: 1.8.
|
554
|
+
rubygems_version: 1.8.24
|
494
555
|
signing_key:
|
495
556
|
specification_version: 3
|
496
557
|
summary: Check the links in a web site before deploying.
|