nanoc 3.4.3 → 3.5.0b1
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/CONTRIBUTING.md +25 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +22 -13
- data/NEWS.md +27 -0
- data/README.md +3 -1
- data/lib/nanoc.rb +2 -2
- data/lib/nanoc/base/compilation/compiler_dsl.rb +19 -0
- data/lib/nanoc/base/core_ext/array.rb +18 -8
- data/lib/nanoc/base/core_ext/hash.rb +18 -8
- data/lib/nanoc/base/core_ext/pathname.rb +2 -8
- data/lib/nanoc/base/plugin_registry.rb +57 -19
- data/lib/nanoc/base/result_data/item_rep.rb +3 -15
- data/lib/nanoc/base/source_data/item.rb +1 -1
- data/lib/nanoc/base/source_data/layout.rb +1 -1
- data/lib/nanoc/base/source_data/site.rb +15 -19
- data/lib/nanoc/cli.rb +28 -23
- data/lib/nanoc/cli/command_runner.rb +4 -0
- data/lib/nanoc/cli/commands/autocompile.rb +15 -6
- data/lib/nanoc/cli/commands/check.rb +47 -0
- data/lib/nanoc/cli/commands/compile.rb +271 -195
- data/lib/nanoc/cli/commands/create-site.rb +5 -5
- data/lib/nanoc/cli/commands/deploy.rb +16 -4
- data/lib/nanoc/cli/commands/prune.rb +3 -3
- data/lib/nanoc/cli/commands/show-data.rb +73 -58
- data/lib/nanoc/cli/commands/show-rules.rb +1 -1
- data/lib/nanoc/cli/commands/validate-css.rb +2 -3
- data/lib/nanoc/cli/commands/validate-html.rb +2 -3
- data/lib/nanoc/cli/commands/validate-links.rb +5 -11
- data/lib/nanoc/cli/commands/view.rb +1 -1
- data/lib/nanoc/cli/commands/watch.rb +38 -20
- data/lib/nanoc/cli/error_handler.rb +122 -122
- data/lib/nanoc/data_sources.rb +2 -0
- data/lib/nanoc/data_sources/filesystem_unified.rb +1 -1
- data/lib/nanoc/data_sources/filesystem_verbose.rb +1 -1
- data/lib/nanoc/data_sources/static.rb +60 -0
- data/lib/nanoc/extra.rb +2 -0
- data/lib/nanoc/extra/checking.rb +16 -0
- data/lib/nanoc/extra/checking/check.rb +33 -0
- data/lib/nanoc/extra/checking/checks.rb +19 -0
- data/lib/nanoc/extra/checking/checks/css.rb +23 -0
- data/lib/nanoc/extra/checking/checks/external_links.rb +149 -0
- data/lib/nanoc/extra/checking/checks/html.rb +24 -0
- data/lib/nanoc/extra/checking/checks/internal_links.rb +57 -0
- data/lib/nanoc/extra/checking/checks/stale.rb +23 -0
- data/lib/nanoc/extra/checking/dsl.rb +31 -0
- data/lib/nanoc/extra/checking/issue.rb +19 -0
- data/lib/nanoc/extra/checking/runner.rb +130 -0
- data/lib/nanoc/extra/link_collector.rb +57 -0
- data/lib/nanoc/extra/pruner.rb +1 -1
- data/lib/nanoc/extra/validators/links.rb +5 -262
- data/lib/nanoc/extra/validators/w3c.rb +8 -76
- data/lib/nanoc/filters/colorize_syntax.rb +1 -1
- data/lib/nanoc/filters/handlebars.rb +2 -2
- data/lib/nanoc/filters/less.rb +1 -1
- data/lib/nanoc/filters/redcarpet.rb +1 -1
- data/lib/nanoc/filters/rubypants.rb +1 -1
- data/lib/nanoc/filters/slim.rb +1 -1
- data/lib/nanoc/helpers/blogging.rb +163 -104
- data/lib/nanoc/helpers/xml_sitemap.rb +9 -3
- data/tasks/doc.rake +2 -1
- data/test/base/core_ext/array_spec.rb +4 -4
- data/test/base/core_ext/hash_spec.rb +7 -7
- data/test/base/core_ext/pathname_spec.rb +12 -2
- data/test/base/test_compiler_dsl.rb +24 -0
- data/test/base/test_item_rep.rb +58 -26
- data/test/cli/commands/test_watch.rb +0 -8
- data/test/data_sources/test_static.rb +66 -0
- data/test/extra/checking/checks/test_css.rb +40 -0
- data/test/extra/checking/checks/test_external_links.rb +76 -0
- data/test/extra/checking/checks/test_html.rb +40 -0
- data/test/extra/checking/checks/test_internal_links.rb +46 -0
- data/test/extra/checking/checks/test_stale.rb +49 -0
- data/test/extra/checking/test_check.rb +16 -0
- data/test/extra/checking/test_dsl.rb +20 -0
- data/test/extra/checking/test_runner.rb +15 -0
- data/test/extra/test_link_collector.rb +93 -0
- data/test/extra/validators/test_links.rb +0 -64
- data/test/extra/validators/test_w3c.rb +20 -26
- data/test/filters/test_colorize_syntax.rb +15 -0
- data/test/filters/test_less.rb +14 -0
- data/test/filters/test_pandoc.rb +5 -1
- data/test/helpers/test_blogging.rb +52 -8
- data/test/helpers/test_xml_sitemap.rb +68 -0
- data/test/test_gem.rb +1 -1
- metadata +31 -6
@@ -35,12 +35,16 @@ module Nanoc::Helpers
|
|
35
35
|
#
|
36
36
|
# @option params [Array] :items A list of items to include in the sitemap
|
37
37
|
#
|
38
|
+
# @option params [Proc] :rep_select A proc to filter reps through. If the
|
39
|
+
# proc returns true, the rep will be included; otherwise, it will not.
|
40
|
+
#
|
38
41
|
# @return [String] The XML sitemap
|
39
42
|
def xml_sitemap(params={})
|
40
43
|
require 'builder'
|
41
44
|
|
42
45
|
# Extract parameters
|
43
|
-
items
|
46
|
+
items = params.fetch(:items) { @items.reject { |i| i[:is_hidden] } }
|
47
|
+
select_proc = params.fetch(:rep_select, nil)
|
44
48
|
|
45
49
|
# Create builder
|
46
50
|
buffer = ''
|
@@ -55,8 +59,10 @@ module Nanoc::Helpers
|
|
55
59
|
xml.instruct!
|
56
60
|
xml.urlset(:xmlns => 'http://www.sitemaps.org/schemas/sitemap/0.9') do
|
57
61
|
# Add item
|
58
|
-
items.each do |item|
|
59
|
-
item.reps.reject { |r| r.raw_path.nil? }
|
62
|
+
items.sort_by { |i| i.identifier }.each do |item|
|
63
|
+
reps = item.reps.reject { |r| r.raw_path.nil? }
|
64
|
+
reps.reject! { |r| !select_proc[r] } if select_proc
|
65
|
+
reps.sort_by { |r| r.name.to_s }.each do |rep|
|
60
66
|
xml.url do
|
61
67
|
xml.loc @site.config[:base_url] + rep.path
|
62
68
|
xml.lastmod item[:mtime].to_iso8601_date unless item[:mtime].nil?
|
data/tasks/doc.rake
CHANGED
@@ -11,6 +11,7 @@ YARD::Rake::YardocTask.new(:doc) do |yard|
|
|
11
11
|
'--readme', 'README.md',
|
12
12
|
'--files', 'NEWS.md,LICENSE',
|
13
13
|
'--output-dir', 'doc/yardoc',
|
14
|
-
'--template-path', 'doc/yardoc_templates'
|
14
|
+
'--template-path', 'doc/yardoc_templates',
|
15
|
+
'--load', 'doc/yardoc_handlers/identifier.rb'
|
15
16
|
]
|
16
17
|
end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
describe 'Array#
|
3
|
+
describe 'Array#symbolize_keys_recursively' do
|
4
4
|
|
5
5
|
it 'should convert keys to symbols' do
|
6
6
|
array_old = [ :abc, 'xyz', { 'foo' => 'bar', :baz => :qux } ]
|
7
7
|
array_new = [ :abc, 'xyz', { :foo => 'bar', :baz => :qux } ]
|
8
|
-
array_old.
|
8
|
+
array_old.symbolize_keys_recursively.must_equal array_new
|
9
9
|
end
|
10
10
|
|
11
11
|
end
|
12
12
|
|
13
|
-
describe 'Array#
|
13
|
+
describe 'Array#stringify_keys_recursively' do
|
14
14
|
|
15
15
|
it 'should convert keys to strings' do
|
16
16
|
array_old = [ :abc, 'xyz', { :foo => 'bar', 'baz' => :qux } ]
|
17
17
|
array_new = [ :abc, 'xyz', { 'foo' => 'bar', 'baz' => :qux } ]
|
18
|
-
array_old.
|
18
|
+
array_old.stringify_keys_recursively.must_equal array_new
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
@@ -1,39 +1,39 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
describe 'Hash#
|
3
|
+
describe 'Hash#symbolize_keys_recursively' do
|
4
4
|
|
5
5
|
it 'should convert keys to symbols' do
|
6
6
|
hash_old = { 'foo' => 'bar' }
|
7
7
|
hash_new = { :foo => 'bar' }
|
8
|
-
hash_old.
|
8
|
+
hash_old.symbolize_keys_recursively.must_equal hash_new
|
9
9
|
end
|
10
10
|
|
11
11
|
end
|
12
12
|
|
13
|
-
describe 'Hash#
|
13
|
+
describe 'Hash#stringify_keys_recursively' do
|
14
14
|
|
15
15
|
it 'should leave strings as strings' do
|
16
16
|
hash_old = { 'foo' => 'bar' }
|
17
17
|
hash_new = { 'foo' => 'bar' }
|
18
|
-
hash_old.
|
18
|
+
hash_old.stringify_keys_recursively.must_equal hash_new
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'should convert symbols to strings' do
|
22
22
|
hash_old = { :foo => 'bar' }
|
23
23
|
hash_new = { 'foo' => 'bar' }
|
24
|
-
hash_old.
|
24
|
+
hash_old.stringify_keys_recursively.must_equal hash_new
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'should convert integers to strings' do
|
28
28
|
hash_old = { 123 => 'bar' }
|
29
29
|
hash_new = { '123' => 'bar' }
|
30
|
-
hash_old.
|
30
|
+
hash_old.stringify_keys_recursively.must_equal hash_new
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'should convert nil to an empty string' do
|
34
34
|
hash_old = { nil => 'bar' }
|
35
35
|
hash_new = { '' => 'bar' }
|
36
|
-
hash_old.
|
36
|
+
hash_old.stringify_keys_recursively.must_equal hash_new
|
37
37
|
end
|
38
38
|
|
39
39
|
end
|
@@ -4,10 +4,15 @@ describe 'Pathname#checksum' do
|
|
4
4
|
|
5
5
|
it 'should work on empty files' do
|
6
6
|
begin
|
7
|
+
# Create file
|
7
8
|
FileUtils.mkdir_p('tmp')
|
8
9
|
File.open('tmp/myfile', 'w') { |io| io.write('') }
|
10
|
+
now = Time.now
|
11
|
+
File.utime(now, now, 'tmp/myfile')
|
12
|
+
|
13
|
+
# Create checksum
|
9
14
|
pathname = Pathname.new('tmp/myfile')
|
10
|
-
pathname.checksum.must_equal '
|
15
|
+
pathname.checksum.must_equal '0-' + now.to_s
|
11
16
|
ensure
|
12
17
|
FileUtils.rm_rf('tmp')
|
13
18
|
end
|
@@ -15,10 +20,15 @@ describe 'Pathname#checksum' do
|
|
15
20
|
|
16
21
|
it 'should work on all files' do
|
17
22
|
begin
|
23
|
+
# Create file
|
18
24
|
FileUtils.mkdir_p('tmp')
|
19
25
|
File.open('tmp/myfile', 'w') { |io| io.write('abc') }
|
26
|
+
now = Time.now
|
27
|
+
File.utime(now, now, 'tmp/myfile')
|
28
|
+
|
29
|
+
# Create checksum
|
20
30
|
pathname = Pathname.new('tmp/myfile')
|
21
|
-
pathname.checksum.must_equal '
|
31
|
+
pathname.checksum.must_equal '3-' + now.to_s
|
22
32
|
ensure
|
23
33
|
FileUtils.rm_rf('tmp')
|
24
34
|
end
|
@@ -16,6 +16,30 @@ class Nanoc::CompilerDSLTest < MiniTest::Unit::TestCase
|
|
16
16
|
# TODO implement
|
17
17
|
end
|
18
18
|
|
19
|
+
def test_include_rules
|
20
|
+
# Create site
|
21
|
+
Nanoc::CLI.run %w( create_site with_bonus_rules )
|
22
|
+
FileUtils.cd('with_bonus_rules') do
|
23
|
+
# Create rep
|
24
|
+
item = Nanoc::Item.new('foo', { :extension => 'bar' }, '/foo/')
|
25
|
+
rep = Nanoc::ItemRep.new(item, :default)
|
26
|
+
|
27
|
+
# Create a bonus rules file
|
28
|
+
File.open('more_rules.rb', 'w') { |io| io.write "passthrough '/foo/'" }
|
29
|
+
|
30
|
+
# Create other necessary stuff
|
31
|
+
site = Nanoc::Site.new('.')
|
32
|
+
site.items << item
|
33
|
+
dsl = site.compiler.rules_collection.dsl
|
34
|
+
|
35
|
+
# Include rules
|
36
|
+
dsl.include_rules 'more_rules'
|
37
|
+
|
38
|
+
# Check that the rule made it into the collection
|
39
|
+
refute_nil site.compiler.rules_collection.routing_rule_for(rep)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
19
43
|
def test_passthrough
|
20
44
|
with_site do
|
21
45
|
# Create rules
|
data/test/base/test_item_rep.rb
CHANGED
@@ -221,32 +221,6 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase
|
|
221
221
|
assert_equal a_long_time_ago.to_s, File.mtime(item_rep.raw_path).to_s
|
222
222
|
end
|
223
223
|
|
224
|
-
def test_write_should_not_touch_identical_binary_files
|
225
|
-
# Create temporary source file
|
226
|
-
File.open('blahblah', 'w') { |io| io.write("Blah blah…") }
|
227
|
-
full_file_path = File.expand_path('blahblah')
|
228
|
-
|
229
|
-
# Mock item
|
230
|
-
item = Nanoc::Item.new(
|
231
|
-
full_file_path, {}, '/',
|
232
|
-
:binary => true
|
233
|
-
)
|
234
|
-
|
235
|
-
# Create rep
|
236
|
-
item_rep = Nanoc::ItemRep.new(item, :foo)
|
237
|
-
item_rep.raw_path = 'foo/bar/baz/quux'
|
238
|
-
|
239
|
-
# Write once
|
240
|
-
item_rep.write
|
241
|
-
a_long_time_ago = Time.now-1_000_000
|
242
|
-
File.utime(a_long_time_ago, a_long_time_ago, item_rep.raw_path)
|
243
|
-
|
244
|
-
# Write again
|
245
|
-
assert_equal a_long_time_ago.to_s, File.mtime(item_rep.raw_path).to_s
|
246
|
-
item_rep.write
|
247
|
-
assert_equal a_long_time_ago.to_s, File.mtime(item_rep.raw_path).to_s
|
248
|
-
end
|
249
|
-
|
250
224
|
def test_write
|
251
225
|
# Mock item
|
252
226
|
item = Nanoc::Item.new(
|
@@ -536,6 +510,64 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase
|
|
536
510
|
end
|
537
511
|
end
|
538
512
|
|
513
|
+
def test_write_should_calculate_is_modified_correctly_for_binary_items_new
|
514
|
+
# Mock item
|
515
|
+
FileUtils.mkdir_p('content')
|
516
|
+
File.open('content/meow.dat', 'w') { |io| io.write('asdf') }
|
517
|
+
item = Nanoc::Item.new(
|
518
|
+
"content/meow.dat", {}, '/',
|
519
|
+
:binary => true
|
520
|
+
)
|
521
|
+
|
522
|
+
# Create rep
|
523
|
+
item_rep = Nanoc::ItemRep.new(item, :foo)
|
524
|
+
FileUtils.mkdir_p('tmp')
|
525
|
+
File.open('tmp/woof.dat', 'w') { |io| io.write('fdsa') }
|
526
|
+
item_rep.instance_eval { @temporary_filenames[:last] = 'tmp/woof.dat' }
|
527
|
+
item_rep.raw_path = 'output/woof.dat'
|
528
|
+
|
529
|
+
# Write
|
530
|
+
notified = false
|
531
|
+
Nanoc::NotificationCenter.on(:rep_written, self) do |rep, raw_path, is_created, is_modified|
|
532
|
+
notified = true
|
533
|
+
assert is_created
|
534
|
+
assert is_modified
|
535
|
+
end
|
536
|
+
item_rep.write
|
537
|
+
assert notified
|
538
|
+
Nanoc::NotificationCenter.remove(:rep_written, self)
|
539
|
+
end
|
540
|
+
|
541
|
+
def test_write_should_calculate_is_modified_correctly_for_binary_items_existing
|
542
|
+
# Mock item
|
543
|
+
FileUtils.mkdir_p('content')
|
544
|
+
File.open('content/meow.dat', 'w') { |io| io.write('asdf') }
|
545
|
+
item = Nanoc::Item.new(
|
546
|
+
"content/meow.dat", {}, '/',
|
547
|
+
:binary => true
|
548
|
+
)
|
549
|
+
|
550
|
+
# Create rep
|
551
|
+
item_rep = Nanoc::ItemRep.new(item, :foo)
|
552
|
+
FileUtils.mkdir_p('tmp')
|
553
|
+
File.open('tmp/woof.dat', 'w') { |io| io.write('fdsa') }
|
554
|
+
FileUtils.mkdir_p('output')
|
555
|
+
File.open('output/woof.dat', 'w') { |io| io.write('fdsa but different') }
|
556
|
+
item_rep.instance_eval { @temporary_filenames[:last] = 'tmp/woof.dat' }
|
557
|
+
item_rep.raw_path = 'output/woof.dat'
|
558
|
+
|
559
|
+
# Write
|
560
|
+
notified = false
|
561
|
+
Nanoc::NotificationCenter.on(:rep_written, self) do |rep, raw_path, is_created, is_modified|
|
562
|
+
notified = true
|
563
|
+
refute is_created
|
564
|
+
assert is_modified
|
565
|
+
end
|
566
|
+
item_rep.write
|
567
|
+
assert notified
|
568
|
+
Nanoc::NotificationCenter.remove(:rep_written, self)
|
569
|
+
end
|
570
|
+
|
539
571
|
private
|
540
572
|
|
541
573
|
def create_binary_item
|
@@ -4,14 +4,6 @@ class Nanoc::CLI::Commands::WatchTest < MiniTest::Unit::TestCase
|
|
4
4
|
|
5
5
|
include Nanoc::TestHelpers
|
6
6
|
|
7
|
-
def setup
|
8
|
-
super
|
9
|
-
@@warned ||= begin
|
10
|
-
STDERR.puts "\n(fssm deprecation warning can be ignored; master branch uses guard/listen)"
|
11
|
-
true
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
7
|
def test_run
|
16
8
|
with_site do |s|
|
17
9
|
watch_thread = Thread.new do
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class Nanoc::DataSources::StaticTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
include Nanoc::TestHelpers
|
6
|
+
|
7
|
+
def new_data_source(params=nil)
|
8
|
+
# Mock site
|
9
|
+
site = Nanoc::Site.new({})
|
10
|
+
|
11
|
+
# Create data source
|
12
|
+
data_source = Nanoc::DataSources::Static.new(site, nil, nil, params)
|
13
|
+
|
14
|
+
# Done
|
15
|
+
data_source
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_items
|
19
|
+
# Create data source
|
20
|
+
data_source = new_data_source(:prefix => 'foo')
|
21
|
+
|
22
|
+
# Create sample files
|
23
|
+
FileUtils.mkdir_p('foo')
|
24
|
+
FileUtils.mkdir_p('foo/a/b')
|
25
|
+
File.open('foo/bar.png', 'w') { |io| io.write("random binary data") }
|
26
|
+
File.open('foo/b.c.css', 'w') { |io| io.write("more binary data") }
|
27
|
+
File.open('foo/a/b/c.gif', 'w') { |io| io.write("yet more binary data") }
|
28
|
+
|
29
|
+
# Get expected and actual output
|
30
|
+
expected_out = [
|
31
|
+
Nanoc::Item.new(
|
32
|
+
'foo/bar.png',
|
33
|
+
{ :extension => 'png', :filename => 'foo/bar.png' },
|
34
|
+
'/bar.png/',
|
35
|
+
:binary => true,
|
36
|
+
:mtime => File.mtime('foo/bar.png'),
|
37
|
+
:checksum => Pathname.new('foo/bar.png').checksum
|
38
|
+
),
|
39
|
+
Nanoc::Item.new(
|
40
|
+
'foo/b.c.css',
|
41
|
+
{ :extension => 'css', :filename => 'foo/b.c.css' },
|
42
|
+
'/b.c.css/',
|
43
|
+
:binary => true,
|
44
|
+
:mtime => File.mtime('foo/b.c.css'),
|
45
|
+
:checksum => Pathname.new('foo/b.c.css').checksum
|
46
|
+
),
|
47
|
+
Nanoc::Item.new(
|
48
|
+
'foo/a/b/c.gif',
|
49
|
+
{ :extension => 'gif', :filename => 'foo/a/b/c.gif' },
|
50
|
+
'/a/b/c.gif/',
|
51
|
+
:binary => true,
|
52
|
+
:mtime => File.mtime('foo/a/b/c.gif'),
|
53
|
+
:checksum => Pathname.new('foo/a/b/c.gif').checksum
|
54
|
+
)
|
55
|
+
].sort_by { |i| i.identifier }
|
56
|
+
|
57
|
+
actual_out = data_source.send(:items).sort_by { |i| i.identifier }
|
58
|
+
|
59
|
+
(0..expected_out.size-1).each do |i|
|
60
|
+
assert_equal expected_out[i].raw_content, actual_out[i].raw_content, 'content must match'
|
61
|
+
assert_equal expected_out[i].identifier, actual_out[i].identifier, 'identifier must match'
|
62
|
+
assert_equal expected_out[i].mtime, actual_out[i].mtime, 'mtime must match'
|
63
|
+
assert_equal expected_out[i].raw_filename, actual_out[i].raw_filename, 'file paths must match'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class Nanoc::Extra::Checking::Checks::CSSTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
include Nanoc::TestHelpers
|
6
|
+
|
7
|
+
def test_run_ok
|
8
|
+
with_site do |site|
|
9
|
+
# Create files
|
10
|
+
FileUtils.mkdir_p('output')
|
11
|
+
File.open('output/blah.html', 'w') { |io| io.write('<h1>Hi!</h1>') }
|
12
|
+
File.open('output/style.css', 'w') { |io| io.write('h1 { color: red; }') }
|
13
|
+
|
14
|
+
# Run check
|
15
|
+
check = Nanoc::Extra::Checking::Checks::CSS.new(site)
|
16
|
+
check.run
|
17
|
+
|
18
|
+
# Check
|
19
|
+
assert check.issues.empty?
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_run_error
|
24
|
+
with_site do |site|
|
25
|
+
# Create files
|
26
|
+
FileUtils.mkdir_p('output')
|
27
|
+
File.open('output/blah.html', 'w') { |io| io.write('<h1>Hi!</h1>') }
|
28
|
+
File.open('output/style.css', 'w') { |io| io.write('h1 { coxlor: rxed; }') }
|
29
|
+
|
30
|
+
# Run check
|
31
|
+
check = Nanoc::Extra::Checking::Checks::CSS.new(site)
|
32
|
+
check.run
|
33
|
+
|
34
|
+
# Check
|
35
|
+
refute check.issues.empty?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class Nanoc::Extra::Checking::Checks::ExternalLinksTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
include Nanoc::TestHelpers
|
6
|
+
|
7
|
+
def setup
|
8
|
+
super
|
9
|
+
require 'timeout'
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_run
|
13
|
+
with_site do |site|
|
14
|
+
# Create files
|
15
|
+
FileUtils.mkdir_p('output')
|
16
|
+
FileUtils.mkdir_p('output/stuff')
|
17
|
+
File.open('output/foo.txt', 'w') { |io| io.write('<a href="http://example.com/404">broken</a>') }
|
18
|
+
File.open('output/bar.html', 'w') { |io| io.write('<a href="http://example.com/">not broken</a>') }
|
19
|
+
|
20
|
+
# Create check
|
21
|
+
check = Nanoc::Extra::Checking::Checks::InternalLinks.new(site)
|
22
|
+
check.run
|
23
|
+
|
24
|
+
# Test
|
25
|
+
assert check.issues.empty?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_valid?
|
30
|
+
with_site do |site|
|
31
|
+
# Create files
|
32
|
+
FileUtils.mkdir_p('output')
|
33
|
+
FileUtils.mkdir_p('output/stuff')
|
34
|
+
File.open('output/origin', 'w') { |io| io.write('hi') }
|
35
|
+
File.open('output/foo', 'w') { |io| io.write('hi') }
|
36
|
+
File.open('output/stuff/blah', 'w') { |io| io.write('hi') }
|
37
|
+
|
38
|
+
# Create check
|
39
|
+
check = Nanoc::Extra::Checking::Checks::ExternalLinks.new(site)
|
40
|
+
|
41
|
+
# Test
|
42
|
+
self.run_server_while do
|
43
|
+
assert ok?(check, 'http://127.0.0.1:9204/200')
|
44
|
+
assert ok?(check, 'foo://example.com/')
|
45
|
+
refute ok?(check, 'http://127.0.0.1:9204">')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def ok?(check, url)
|
51
|
+
Timeout.timeout(3) do
|
52
|
+
check.validate(url).nil?
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def run_server_while
|
57
|
+
@app = lambda { |env| [ env['REQUEST_PATH'][1..-1].to_i, {}, [ '... Useless body ...' ] ] }
|
58
|
+
@server = nil
|
59
|
+
|
60
|
+
@thread = Thread.new do
|
61
|
+
Rack::Handler::WEBrick.run(@app, :Host => @host='127.0.0.1', :Port => @port=9204) do |server|
|
62
|
+
@server = server
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
Timeout::timeout(5) do
|
67
|
+
Thread.pass until @server
|
68
|
+
end
|
69
|
+
|
70
|
+
yield
|
71
|
+
|
72
|
+
@server.stop
|
73
|
+
@thread.kill
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|