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 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.