link-checker 0.2.0 → 0.3.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/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.
|