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 CHANGED
@@ -2,6 +2,7 @@ source :rubygems
2
2
 
3
3
  gem "nokogiri", "~> 1.5.5"
4
4
  gem "colorize", "~> 0.5.8"
5
+ gem "anemone", "~> 0.7.2"
5
6
 
6
7
  group(:test, :development) do
7
8
  gem "rspec", "~> 2.11.0"
@@ -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.2.0
1
+ 0.3.0
@@ -3,6 +3,6 @@
3
3
  require 'link_checker'
4
4
 
5
5
  # Assume the 'public' directory is the site unless otherwise specified.
6
- site_path = ARGV[0] || './'
6
+ target = ARGV[0] || './'
7
7
 
8
- LinkChecker.new(site_path).check_links
8
+ LinkChecker.new(target).check_uris
@@ -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(target_path)
11
- @target_path = target_path
11
+ def initialize(target)
12
+ @target = target
12
13
  end
13
14
 
14
- def find_html_files
15
- Find.find(@target_path).map {|path|
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.find_external_links(file_path)
21
- Nokogiri::HTML(open(file_path)).css('a').
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
- end
25
+ }.map{|link| link.attributes['href'].value}
26
26
  end
27
27
 
28
- def self.check_link(uri, redirected=false)
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.check_link(response['location'], true)
42
+ return self.check_uri(URI(response['location']), true)
44
43
  else
45
- raise Error.new(response)
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 check_links
52
- find_html_files.each do |file|
53
- bad_checks = []
54
- warnings = []
55
- self.class.find_external_links(file).each do |link|
56
- uri = link.attribute('href').value
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
- response = self.class.check_link(uri)
59
- if response.class.eql? Redirect
60
- warnings << { :link => link, :response => response }
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
- bad_checks << { :link => link, :response => error }
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 "Checked: #{file}".green
99
+ puts message.green
70
100
  else
71
- puts "Checked: #{file}".yellow
101
+ puts message.yellow
72
102
  end
73
103
  warnings.each do |warning|
74
- puts " Warning: #{warning[:link].attribute('href').value}".yellow
75
- puts " Redirected to: #{warning[:response].final_destination.to_s}".yellow
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[:link].attribute('href').value}".red
81
- puts " Response: #{check[:response].response.inspect}".red
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 Good; end
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 :final_destination
91
- def initialize(final_destination)
92
- @final_destination = final_destination
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 < StandardError
97
- attr_accessor :response
98
- def initialize(response)
99
- @response = response
137
+ class Error < Result
138
+ attr_reader :error
139
+ def initialize(params)
140
+ @error = params[:error]
100
141
  end
101
142
  end
102
143
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "link-checker"
8
- s.version = "0.2.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-04"
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.15"
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"])
@@ -3,88 +3,137 @@ require 'link_checker'
3
3
 
4
4
  describe LinkChecker do
5
5
 
6
- before(:all) do
7
- @site_path = 'spec/test-site/public/'
8
- end
6
+ describe "scans a file path and" do
9
7
 
10
- it "finds all of the HTML files in the target path." do
11
- files = LinkChecker.new(@site_path).find_html_files
12
- files.size.should == 3
13
- end
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.check_link(@good_uri).class.should be LinkChecker::Good
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
- expect { LinkChecker.check_link(@bad_uri) }.to(
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.check_link(@redirect_uri)
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.final_destination.to_s.should == @good_uri
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
- expect { LinkChecker.check_link(@redirect_uri) }.to(
57
- raise_error(LinkChecker::Error))
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
- it "prints green when the links are all good." do
67
- LinkChecker.stub(:check_link) { LinkChecker::Good.new }
68
- $stdout.should_receive(:puts).with(/Checked/i).exactly(3).times
69
- LinkChecker.new(@site_path).check_links
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 red when the links are all bad." do
73
- LinkChecker.stub(:check_link).and_raise LinkChecker::Error.new('blah')
74
- $stdout.should_receive(:puts).with(/Problem/i).exactly(3).times
75
- $stdout.should_receive(:puts).with(/Link/i).at_least(3).times
76
- $stdout.should_receive(:puts).with(/Response/i).at_least(3).times
77
- LinkChecker.new(@site_path).check_links
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(:check_link) { LinkChecker::Redirect.new('http://somewhere') }
82
- $stdout.should_receive(:puts).with(/Checked/i).exactly(3).times
83
- $stdout.should_receive(:puts).with(/Warning/i).at_least(3).times
84
- $stdout.should_receive(:puts).with(/Redirected/i).at_least(3).times
85
- LinkChecker.new(@site_path).check_links
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.2.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-04 00:00:00.000000000 Z
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: &70123915371780 !ruby/object:Gem::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: *70123915371780
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: &70123915371000 !ruby/object:Gem::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: *70123915371000
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: &70123915370260 !ruby/object:Gem::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: *70123915370260
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: &70123915386020 !ruby/object:Gem::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: *70123915386020
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: &70123915385300 !ruby/object:Gem::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: *70123915385300
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: &70123915384680 !ruby/object:Gem::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: *70123915384680
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: &70123915384020 !ruby/object:Gem::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: *70123915384020
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: &70123915383280 !ruby/object:Gem::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: *70123915383280
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: &70123915382660 !ruby/object:Gem::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: *70123915382660
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: 4067428474501451879
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.15
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.