nanoc 3.4.2 → 3.4.3

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
@@ -9,6 +9,7 @@ gem 'coderay'
9
9
  gem 'coffee-script'
10
10
  gem 'erubis'
11
11
  gem 'fog'
12
+ gem 'fssm'
12
13
  gem 'haml'
13
14
  gem 'kramdown'
14
15
  gem 'less', '~> 2.0'
@@ -26,7 +27,7 @@ gem 'rdoc'
26
27
  gem 'redcarpet'
27
28
  gem 'RedCloth'
28
29
  gem 'rubypants'
29
- gem 'sass', '~> 3.1'
30
+ gem 'sass', '~> 3.2.2'
30
31
  gem 'slim'
31
32
  gem 'systemu'
32
33
  gem 'typogruby'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nanoc (3.4.1)
4
+ nanoc (3.4.2)
5
5
  cri (~> 2.2)
6
6
 
7
7
  GEM
@@ -16,16 +16,16 @@ GEM
16
16
  coffee-script (2.2.0)
17
17
  coffee-script-source
18
18
  execjs
19
- coffee-script-source (1.3.3)
19
+ coffee-script-source (1.4.0)
20
20
  colored (1.2)
21
21
  commonjs (0.2.6)
22
22
  cri (2.3.0)
23
23
  colored (>= 1.2)
24
24
  erubis (2.7.0)
25
- excon (0.16.7)
25
+ excon (0.16.10)
26
26
  execjs (1.4.0)
27
27
  multi_json (~> 1.0)
28
- fog (1.6.0)
28
+ fog (1.7.0)
29
29
  builder
30
30
  excon (~> 0.14)
31
31
  formatador (~> 0.2.0)
@@ -35,7 +35,8 @@ GEM
35
35
  net-ssh (>= 2.1.3)
36
36
  nokogiri (~> 1.5.0)
37
37
  ruby-hmac
38
- formatador (0.2.3)
38
+ formatador (0.2.4)
39
+ fssm (0.2.9)
39
40
  haml (3.1.7)
40
41
  json (1.7.5)
41
42
  kramdown (0.14.0)
@@ -47,14 +48,14 @@ GEM
47
48
  syntax (>= 1.0.0)
48
49
  metaclass (0.0.1)
49
50
  mime-types (1.19)
50
- minitest (4.1.0)
51
- mocha (0.12.7)
51
+ minitest (4.3.1)
52
+ mocha (0.13.0)
52
53
  metaclass (~> 0.0.1)
53
- multi_json (1.3.6)
54
+ multi_json (1.3.7)
54
55
  mustache (0.99.4)
55
56
  net-scp (1.0.4)
56
57
  net-ssh (>= 1.99.1)
57
- net-ssh (2.6.1)
58
+ net-ssh (2.6.2)
58
59
  nokogiri (1.5.5)
59
60
  posix-spawn (0.3.6)
60
61
  pygments.rb (0.3.2)
@@ -62,15 +63,15 @@ GEM
62
63
  yajl-ruby (~> 1.1.0)
63
64
  rack (1.4.1)
64
65
  rainpress (1.0)
65
- rake (0.9.2.2)
66
+ rake (10.0.2)
66
67
  rdiscount (1.6.8)
67
68
  rdoc (3.12)
68
69
  json (~> 1.4)
69
70
  redcarpet (2.2.2)
70
71
  ruby-hmac (0.4.0)
71
72
  rubypants (0.2.0)
72
- sass (3.2.1)
73
- slim (1.3.3)
73
+ sass (3.2.3)
74
+ slim (1.3.4)
74
75
  temple (~> 0.5.5)
75
76
  tilt (~> 1.3.3)
76
77
  syntax (1.0.0)
@@ -101,6 +102,7 @@ DEPENDENCIES
101
102
  coffee-script
102
103
  erubis
103
104
  fog
105
+ fssm
104
106
  haml
105
107
  kramdown
106
108
  less (~> 2.0)
@@ -120,7 +122,7 @@ DEPENDENCIES
120
122
  rdoc
121
123
  redcarpet
122
124
  rubypants
123
- sass (~> 3.1)
125
+ sass (~> 3.2.2)
124
126
  slim
125
127
  systemu
126
128
  typogruby
data/NEWS.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # nanoc news
2
2
 
3
+ ## 3.4.3 (2012-12-09)
4
+
5
+ Improvements:
6
+
7
+ * Item reps are now accessible in a consistent way: in Rules and during
8
+ compilation, they can be accessed using both `@rep` and `@item_rep`
9
+
10
+ Fixes:
11
+
12
+ * Made cleaning streams (stdout/stderr as used by nanoc) compatible with
13
+ Ruby’s built-in Logger
14
+ * Made prune work when the output directory is a symlink
15
+ * Made Handlebars filter compatible with the latest version
16
+ * Made `show-data` command show more accurate dependencies [Stefan Bühler]
17
+ * Restored compatibility with Sass 3.2.2
18
+
3
19
  ## 3.4.2 (2012-11-01)
4
20
 
5
21
  Fixes:
data/README.md CHANGED
@@ -96,14 +96,18 @@ may be interested in the development dependencies:
96
96
  * Starr Horne
97
97
  * Daniel Hofstetter
98
98
  * Tuomas Kareinen
99
+ * Greg Karékinian
99
100
  * Matt Keveney
100
101
  * Kevin Lynagh
102
+ * Go Maeda
101
103
  * Nikhil Marathe
102
104
  * Daniel Mendler
103
105
  * Ale Muñoz
104
106
  * John Nishinaga
107
+ * Gregory Pakosz
105
108
  * Nicky Peeters
106
109
  * Christian Plessl
110
+ * Damien Pollet
107
111
  * Šime Ramov
108
112
  * Xavier Shay
109
113
  * Arnau Siches
@@ -3,7 +3,7 @@
3
3
  module Nanoc
4
4
 
5
5
  # The current nanoc version.
6
- VERSION = '3.4.2'
6
+ VERSION = '3.4.3'
7
7
 
8
8
  # @return [String] A string containing information about this nanoc version
9
9
  # and its environment (Ruby engine and version, Rubygems version if any).
@@ -81,6 +81,10 @@ module Nanoc
81
81
  # Compile reps
82
82
  load
83
83
  @site.freeze
84
+
85
+ # Determine which reps need to be recompiled
86
+ forget_dependencies_if_outdated(items)
87
+
84
88
  dependency_tracker.start
85
89
  compile_reps(reps)
86
90
  dependency_tracker.stop
@@ -121,9 +125,6 @@ module Nanoc
121
125
  # Load auxiliary stores
122
126
  stores.each { |s| s.load }
123
127
 
124
- # Determine which reps need to be recompiled
125
- forget_dependencies_if_outdated(items)
126
-
127
128
  @loaded = true
128
129
  rescue => e
129
130
  unload
@@ -272,6 +273,7 @@ module Nanoc
272
273
 
273
274
  content_or_filename_assigns.merge({
274
275
  :item => rep.item,
276
+ :rep => rep,
275
277
  :item_rep => rep,
276
278
  :items => site.items,
277
279
  :layouts => site.layouts,
@@ -29,12 +29,13 @@ module Nanoc
29
29
  compiler = params[:compiler] or raise ArgumentError, "Required :compiler option is missing"
30
30
 
31
31
  super({
32
- :rep => rep,
33
- :item => rep.item,
34
- :site => compiler.site,
35
- :config => compiler.site.config,
36
- :items => compiler.site.items,
37
- :layouts => compiler.site.layouts
32
+ :rep => rep,
33
+ :item_rep => rep,
34
+ :item => rep.item,
35
+ :site => compiler.site,
36
+ :config => compiler.site.config,
37
+ :items => compiler.site.items,
38
+ :layouts => compiler.site.layouts
38
39
  })
39
40
  end
40
41
 
@@ -84,6 +84,11 @@ module Nanoc::CLI
84
84
  @stream.reopen(*a)
85
85
  end
86
86
 
87
+ # @see IO#close
88
+ def close
89
+ @stream.close
90
+ end
91
+
87
92
  # @see File#exist?
88
93
  def exist?
89
94
  @stream.exist?
@@ -35,7 +35,7 @@ module Nanoc::Extra
35
35
 
36
36
  # Get present files and dirs
37
37
  present_files_and_dirs = Set.new
38
- Find.find(self.site.config[:output_dir]) do |f|
38
+ Find.find(self.site.config[:output_dir] + '/') do |f|
39
39
  present_files_and_dirs << f
40
40
  end
41
41
  present_files = present_files_and_dirs.select { |f| File.file?(f) }
@@ -22,7 +22,9 @@ module Nanoc::Filters
22
22
  context[:config] = assigns[:config]
23
23
  context[:yield] = assigns[:content]
24
24
 
25
- ::Handlebars.compile(content).call(context)
25
+ handlebars = ::Handlebars::Context.new
26
+ template = handlebars.compile(content)
27
+ template.call(context)
26
28
  end
27
29
 
28
30
  end
@@ -19,10 +19,10 @@ module Nanoc::Filters
19
19
  private
20
20
 
21
21
  def _find(dir, name, options)
22
- full_filename, syntax = find_real_file(dir, name)
22
+ full_filename, syntax = ::Sass::Util.destructure(find_real_file(dir, name, options))
23
23
  return unless full_filename && File.readable?(full_filename)
24
24
 
25
- filter = Nanoc::Filters::Sass.current
25
+ filter = Nanoc::Filters::Sass.current # FIXME ew global
26
26
  item = filter.imported_filename_to_item(full_filename)
27
27
  filter.depend_on([ item ]) unless item.nil?
28
28
 
@@ -40,7 +40,7 @@ module Nanoc::Helpers
40
40
  require 'builder'
41
41
 
42
42
  # Extract parameters
43
- items = params[:items] || @items.reject { |i| i[:is_hidden] }
43
+ items = params.fetch(:items) { @items.reject { |i| i[:is_hidden] } }
44
44
 
45
45
  # Create builder
46
46
  buffer = ''
@@ -59,7 +59,7 @@ module Nanoc::Helpers
59
59
  item.reps.reject { |r| r.raw_path.nil? }.each do |rep|
60
60
  xml.url do
61
61
  xml.loc @site.config[:base_url] + rep.path
62
- xml.lastmod item.mtime.to_iso8601_date unless item.mtime.nil?
62
+ xml.lastmod item[:mtime].to_iso8601_date unless item[:mtime].nil?
63
63
  xml.changefreq item[:changefreq] unless item[:changefreq].nil?
64
64
  xml.priority item[:priority] unless item[:priority].nil?
65
65
  end
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.files = Dir['[A-Z]*'] +
17
17
  Dir['doc/yardoc_templates/**/*'] +
18
18
  Dir['{bin,lib,tasks,test}/**/*'] +
19
- [ 'nanoc.gemspec', '.gemtest' ]
19
+ [ 'nanoc.gemspec' ]
20
20
  s.executables = [ 'nanoc' ]
21
21
  s.require_paths = [ 'lib' ]
22
22
 
@@ -31,7 +31,7 @@ describe 'Array#freeze_recursively' do
31
31
  array[0] = 123
32
32
  rescue => e
33
33
  raised = true
34
- assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
34
+ assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
35
35
  end
36
36
  assert raised
37
37
  end
@@ -45,7 +45,7 @@ describe 'Array#freeze_recursively' do
45
45
  array[1][0] = 123
46
46
  rescue => e
47
47
  raised = true
48
- assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
48
+ assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
49
49
  end
50
50
  assert raised
51
51
  end
@@ -49,7 +49,7 @@ describe 'Hash#freeze_recursively' do
49
49
  hash[:a] = 123
50
50
  rescue => e
51
51
  raised = true
52
- assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
52
+ assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
53
53
  end
54
54
  assert raised
55
55
  end
@@ -63,7 +63,7 @@ describe 'Hash#freeze_recursively' do
63
63
  hash[:a][:b] = 123
64
64
  rescue => e
65
65
  raised = true
66
- assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
66
+ assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
67
67
  end
68
68
  assert raised
69
69
  end
@@ -28,7 +28,6 @@ class Nanoc::ChecksumStoreTest < MiniTest::Unit::TestCase
28
28
 
29
29
  # Check
30
30
  obj = Nanoc::Item.new('Moo?', {}, '/animals/cow/')
31
- new_checksum = 'Moo?'.checksum + '-' + {}.checksum
32
31
  assert_equal nil, store[obj]
33
32
  end
34
33
 
@@ -275,7 +275,7 @@ class Nanoc::CompilerTest < MiniTest::Unit::TestCase
275
275
  error = assert_raises(RuntimeError) do
276
276
  site.compile
277
277
  end
278
- assert_match /^The path returned for the.*does not start with a slash. Please ensure that all routing rules return a path that starts with a slash./, error.message
278
+ assert_match(/^The path returned for the.*does not start with a slash. Please ensure that all routing rules return a path that starts with a slash./, error.message)
279
279
  end
280
280
  end
281
281
 
@@ -488,4 +488,35 @@ class Nanoc::CompilerTest < MiniTest::Unit::TestCase
488
488
  end
489
489
  end
490
490
 
491
+ def test_rep_assigns
492
+ with_site do |site|
493
+ # Create item
494
+ File.open('content/index.html', 'w') do |io|
495
+ io.write('@rep.name = <%= @rep.name %> - @item_rep.name = <%= @item_rep.name %>')
496
+ end
497
+
498
+ # Create routes
499
+ File.open('Rules', 'w') do |io|
500
+ io.write "compile '*' do\n"
501
+ io.write " if @rep.name == :default && @item_rep.name == :default\n"
502
+ io.write " filter :erb\n"
503
+ io.write " end\n"
504
+ io.write "end\n"
505
+ io.write "\n"
506
+ io.write "route '*' do\n"
507
+ io.write " '/index.html'\n"
508
+ io.write "end\n"
509
+ io.write "\n"
510
+ io.write "layout '*', :erb\n"
511
+ end
512
+
513
+ # Compile
514
+ site = Nanoc::Site.new('.')
515
+ site.compile
516
+
517
+ # Check
518
+ assert_equal '@rep.name = default - @item_rep.name = default', File.read('output/index.html')
519
+ end
520
+ end
521
+
491
522
  end
@@ -25,7 +25,7 @@ class Nanoc::ItemTest < MiniTest::Unit::TestCase
25
25
  item.identifier.chop!
26
26
  rescue => error
27
27
  raised = true
28
- assert_match /(^can't modify frozen [Ss]tring|^unable to modify frozen object$)/, error.message
28
+ assert_match(/(^can't modify frozen [Ss]tring|^unable to modify frozen object$)/, error.message)
29
29
  end
30
30
  assert raised, 'Should have raised when trying to modify a frozen string'
31
31
  end
@@ -149,7 +149,7 @@ class Nanoc::ItemTest < MiniTest::Unit::TestCase
149
149
  item[:abc] = '123'
150
150
  rescue => e
151
151
  raised = true
152
- assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
152
+ assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
153
153
  end
154
154
  assert raised
155
155
 
@@ -158,7 +158,7 @@ class Nanoc::ItemTest < MiniTest::Unit::TestCase
158
158
  item[:a][:b] = '456'
159
159
  rescue => e
160
160
  raised = true
161
- assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
161
+ assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
162
162
  end
163
163
  assert raised
164
164
  end
@@ -459,7 +459,7 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase
459
459
  rep.filter(:whatever)
460
460
  rescue => e
461
461
  raised = true
462
- assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
462
+ assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
463
463
  end
464
464
  assert raised
465
465
  end
@@ -483,7 +483,7 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase
483
483
  rep.filter(:whatever)
484
484
  rescue => e
485
485
  raised = true
486
- assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
486
+ assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
487
487
  end
488
488
  assert raised
489
489
  end
@@ -22,7 +22,7 @@ class Nanoc::LayoutTest < MiniTest::Unit::TestCase
22
22
  layout.identifier.chop!
23
23
  rescue => error
24
24
  raised = true
25
- assert_match /(^can't modify frozen [Ss]tring|^unable to modify frozen object$)/, error.message
25
+ assert_match(/(^can't modify frozen [Ss]tring|^unable to modify frozen object$)/, error.message)
26
26
  end
27
27
  assert raised, 'Should have raised when trying to modify a frozen string'
28
28
  end
@@ -68,10 +68,10 @@ class Nanoc::MemoizationTest < MiniTest::Unit::TestCase
68
68
  sample2b = Sample2.new(25)
69
69
 
70
70
  3.times do
71
- assert_equal (10*10+5), sample1a.run(5)
72
- assert_equal (10*15+7), sample1b.run(7)
73
- assert_equal (100*20+5), sample2a.run(5)
74
- assert_equal (100*25+7), sample2b.run(7)
71
+ assert_equal 10*10+5, sample1a.run(5)
72
+ assert_equal 10*15+7, sample1b.run(7)
73
+ assert_equal 100*20+5, sample2a.run(5)
74
+ assert_equal 100*25+7, sample2b.run(7)
75
75
  end
76
76
  end
77
77
 
@@ -80,10 +80,10 @@ class Nanoc::MemoizationTest < MiniTest::Unit::TestCase
80
80
  sample2 = EqualSample.new(3)
81
81
 
82
82
  3.times do
83
- assert_equal (2*10+5), sample1.run(5)
84
- assert_equal (2*10+3), sample1.run(3)
85
- assert_equal (3*10+5), sample2.run(5)
86
- assert_equal (3*10+3), sample2.run(3)
83
+ assert_equal 2*10+5, sample1.run(5)
84
+ assert_equal 2*10+3, sample1.run(3)
85
+ assert_equal 3*10+5, sample2.run(5)
86
+ assert_equal 3*10+3, sample2.run(3)
87
87
  end
88
88
  end
89
89
 
@@ -6,7 +6,7 @@ class Nanoc::SiteTest < MiniTest::Unit::TestCase
6
6
 
7
7
  def test_initialize_with_dir_without_config_yaml
8
8
  assert_raises(Errno::ENOENT) do
9
- site = Nanoc::Site.new('.')
9
+ Nanoc::Site.new('.')
10
10
  end
11
11
  end
12
12
 
@@ -107,18 +107,17 @@ class Nanoc::CLI::Commands::DeployTest < MiniTest::Unit::TestCase
107
107
  FileUtils.mkdir_p('output')
108
108
  File.open('output/blah.html', 'w') { |io| io.write 'moo' }
109
109
 
110
- ios = capturing_stdio do
111
- assert_raises SystemExit do
110
+ capturing_stdio do
111
+ err = assert_raises Nanoc::Errors::GenericTrivial do
112
112
  Nanoc::CLI.run %w( deploy )
113
113
  end
114
+ assert_equal 'The site configuration has no deploy configuration for default.', err.message
114
115
  end
115
-
116
- assert ios[:stderr].include?('The site configuration has no deploy configuration for default.')
117
116
  end
118
117
  end
119
118
  end
120
119
 
121
- def test_deploy_without_target_without_default
120
+ def test_deploy_without_target_with_default
122
121
  if_have 'systemu' do
123
122
  with_site do |site|
124
123
  File.open('config.yaml', 'w') do |io|
@@ -130,7 +129,7 @@ class Nanoc::CLI::Commands::DeployTest < MiniTest::Unit::TestCase
130
129
  FileUtils.mkdir_p('output')
131
130
  File.open('output/blah.html', 'w') { |io| io.write 'moo' }
132
131
 
133
- ios = capturing_stdio do
132
+ capturing_stdio do
134
133
  Nanoc::CLI.run %w( deploy )
135
134
  end
136
135
 
@@ -94,5 +94,27 @@ class Nanoc::CLI::Commands::PruneTest < MiniTest::Unit::TestCase
94
94
  end
95
95
  end
96
96
 
97
- end
97
+ def test_run_with_symlink_to_output_dir
98
+ with_site do |site|
99
+ # Set output dir
100
+ FileUtils.rm_rf('output')
101
+ FileUtils.mkdir_p('output-real')
102
+ File.symlink('output-real', 'output')
103
+
104
+ # Create source files
105
+ File.open('content/index.html', 'w') { |io| io.write 'stuff' }
106
+
107
+ # Create output files
108
+ FileUtils.mkdir_p('output-real/some-dir')
109
+ File.open('output-real/some-file.html', 'w') { |io| io.write 'stuff' }
110
+ File.open('output-real/index.html', 'w') { |io| io.write 'stuff' }
111
+
112
+ Nanoc::CLI.run %w( prune --yes )
98
113
 
114
+ assert File.file?('output-real/index.html')
115
+ assert !File.directory?('output-real/some-dir')
116
+ assert !File.file?('output-real/some-file.html')
117
+ end
118
+ end
119
+
120
+ end
@@ -17,15 +17,12 @@ class Nanoc::CLI::Commands::WatchTest < MiniTest::Unit::TestCase
17
17
  watch_thread = Thread.new do
18
18
  Nanoc::CLI.run %w( watch )
19
19
  end
20
- sleep 1
21
20
 
22
21
  File.open('content/index.html', 'w') { |io| io.write('Hello there!') }
23
- sleep 1
24
- assert_equal 'Hello there!', File.read('output/index.html')
22
+ self.wait_until_content_equals('content/index.html', 'Hello there!')
25
23
 
26
24
  File.open('content/index.html', 'w') { |io| io.write('Hello there again!') }
27
- sleep 1
28
- assert_equal 'Hello there again!', File.read('output/index.html')
25
+ self.wait_until_content_equals('content/index.html', 'Hello there again!')
29
26
 
30
27
  watch_thread.kill
31
28
  end
@@ -37,15 +34,38 @@ class Nanoc::CLI::Commands::WatchTest < MiniTest::Unit::TestCase
37
34
  watch_thread = Thread.new do
38
35
  Nanoc::CLI.run %w( watch )
39
36
  end
40
- sleep 1
41
37
 
42
38
  ENV['PATH'] = '.' # so that neither which nor where can be found
43
39
  File.open('content/index.html', 'w') { |io| io.write('Hello there!') }
44
- sleep 1
40
+ self.wait_until_exists('output/index.html')
45
41
  assert_equal 'Hello there!', File.read('output/index.html')
42
+
43
+ watch_thread.kill
46
44
  end
47
45
  ensure
48
46
  ENV['PATH'] = old_path
49
47
  end
50
48
 
49
+ def wait_until_exists(filename)
50
+ 20.times do
51
+ break if File.file?(filename)
52
+ sleep 0.5
53
+ end
54
+ if !File.file?(filename)
55
+ raise RuntimeError, "Expected #{filename} to appear but it didn't :("
56
+ end
57
+ end
58
+
59
+ def wait_until_content_equals(filename, content)
60
+ self.wait_until_exists(filename)
61
+
62
+ 20.times do
63
+ break if File.read(filename) == content
64
+ sleep 0.5
65
+ end
66
+ if File.read(filename) != content
67
+ raise RuntimeError, "Expected #{filename} to have content #{content} but it doesn't :("
68
+ end
69
+ end
70
+
51
71
  end
@@ -19,7 +19,7 @@ class Nanoc::CLI::CleaningStreamTest < MiniTest::Unit::TestCase
19
19
  end
20
20
 
21
21
  def test_forward
22
- methods = [ :write, :<<, :tty?, :flush, :tell, :print, :puts, :string, :reopen, :exist?, :exists? ]
22
+ methods = [ :write, :<<, :tty?, :flush, :tell, :print, :puts, :string, :reopen, :exist?, :exists?, :close ]
23
23
 
24
24
  s = Stream.new
25
25
  cs = Nanoc::CLI::CleaningStream.new(s)
@@ -35,11 +35,20 @@ class Nanoc::CLI::CleaningStreamTest < MiniTest::Unit::TestCase
35
35
  cs.reopen('/dev/null', 'r')
36
36
  cs.exist?
37
37
  cs.exists?
38
+ cs.close
38
39
 
39
40
  methods.each do |m|
40
41
  assert s.called_methods.include?(m), "expected #{m} to be called"
41
42
  end
42
43
  end
43
44
 
44
- end
45
+ def test_works_with_logger
46
+ require 'logger'
47
+ stream = StringIO.new
48
+ cleaning_stream = Nanoc::CLI::CleaningStream.new(stream)
49
+ logger = Logger.new(cleaning_stream)
50
+ logger.info("Some info")
51
+ logger.warn("Something could start going wrong!")
52
+ end
45
53
 
54
+ end
@@ -12,7 +12,7 @@ class Nanoc::CLI::ErrorHandlerTest < MiniTest::Unit::TestCase
12
12
  def test_resolution_for_with_known_gem
13
13
  $loud = true
14
14
  error = LoadError.new('no such file to load -- kramdown')
15
- assert_match /^Try installing /, handler.send(:resolution_for, error)
15
+ assert_match(/^Try installing /, handler.send(:resolution_for, error))
16
16
  ensure
17
17
  $loud = false
18
18
  end
@@ -59,7 +59,7 @@ class Nanoc::Extra::AutoCompilerTest < MiniTest::Unit::TestCase
59
59
  autocompiler.stubs(:site).returns(site)
60
60
 
61
61
  # Serve
62
- status, headers, body = autocompiler.instance_eval { call('REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/afjwiagoawf.html') }
62
+ status, _, _ = autocompiler.instance_eval { call('REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/afjwiagoawf.html') }
63
63
 
64
64
  # Check response
65
65
  assert_equal(404, status)
@@ -377,7 +377,7 @@ class Nanoc::Extra::AutoCompilerTest < MiniTest::Unit::TestCase
377
377
  # Check
378
378
  status, headers, body = autocompiler.call('REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/')
379
379
  body.each do |b|
380
- assert_match /The Grand Value of Configuration is Foo!/, b
380
+ assert_match(/The Grand Value of Configuration is Foo!/, b)
381
381
  end
382
382
 
383
383
  # Set config to 2nd value
@@ -389,7 +389,7 @@ class Nanoc::Extra::AutoCompilerTest < MiniTest::Unit::TestCase
389
389
  # Check
390
390
  status, headers, body = autocompiler.call('REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/')
391
391
  body.each do |b|
392
- assert_match /The Grand Value of Configuration is Bar!/, b
392
+ assert_match(/The Grand Value of Configuration is Bar!/, b)
393
393
  end
394
394
  end
395
395
  end
@@ -410,7 +410,7 @@ class Nanoc::Extra::AutoCompilerTest < MiniTest::Unit::TestCase
410
410
  # Test
411
411
  result = autocompiler.call('REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/%73oftware')
412
412
  assert_equal 404, result[0]
413
- assert_match "File not found: /software\n", result[2][0]
413
+ assert_match("File not found: /software\n", result[2][0])
414
414
  end
415
415
  end
416
416
 
@@ -249,11 +249,11 @@ EOS
249
249
  [ :albino, :pygmentize, :simon_highlight ].each do |colorizer|
250
250
  begin
251
251
  input = '<pre><code class="language-ruby">puts "foo"</code></pre>'
252
- actual_output = filter.run(
252
+ filter.run(
253
253
  input,
254
254
  :colorizers => { :ruby => colorizer })
255
255
  flunk "expected colorizer to raise if no executable is available"
256
- rescue => e
256
+ rescue
257
257
  end
258
258
  end
259
259
  ensure
@@ -24,7 +24,6 @@ class Nanoc::Filters::HandlebarsTest < MiniTest::Unit::TestCase
24
24
  :config => config,
25
25
  :content => 'No Payne No Gayne'
26
26
  }
27
- Handlebars.register_helper(:upcase) { |b| b.call.upcase }
28
27
  filter = ::Nanoc::Filters::Handlebars.new(assigns)
29
28
 
30
29
  # Run filter
@@ -34,8 +33,6 @@ class Nanoc::Filters::HandlebarsTest < MiniTest::Unit::TestCase
34
33
  assert_equal('We can’t stop here! This is the Max Payne layout!', result)
35
34
  result = filter.run('It’s raining {{config.animals}} here!')
36
35
  assert_equal('It’s raining cats and dogs here!', result)
37
- result = filter.run('I am {{#upcase}}shouting{{/upcase}}!')
38
- assert_equal('I am SHOUTING!', result)
39
36
  end
40
37
  end
41
38
 
@@ -14,7 +14,7 @@ class Nanoc::Filters::LessTest < MiniTest::Unit::TestCase
14
14
 
15
15
  # Run filter
16
16
  result = filter.run('.foo { bar: 1 + 1 }')
17
- assert_match /\.foo\s*\{\s*bar:\s*2;?\s*\}/, result
17
+ assert_match(/\.foo\s*\{\s*bar:\s*2;?\s*\}/, result)
18
18
  end
19
19
  end
20
20
 
@@ -32,7 +32,7 @@ class Nanoc::Filters::LessTest < MiniTest::Unit::TestCase
32
32
 
33
33
  # Run filter
34
34
  result = filter.run('@import "content/foo/bar/imported_file.less";')
35
- assert_match /p\s*\{\s*color:\s*red;?\s*\}/, result
35
+ assert_match(/p\s*\{\s*color:\s*red;?\s*\}/, result)
36
36
  end
37
37
  end
38
38
 
@@ -51,7 +51,7 @@ class Nanoc::Filters::LessTest < MiniTest::Unit::TestCase
51
51
 
52
52
  # Run filter
53
53
  result = filter.run('@import "bar/imported_file.less";')
54
- assert_match /p\s*\{\s*color:\s*red;?\s*\}/, result
54
+ assert_match(/p\s*\{\s*color:\s*red;?\s*\}/, result)
55
55
  end
56
56
  end
57
57
 
@@ -90,7 +90,7 @@ class Nanoc::Filters::LessTest < MiniTest::Unit::TestCase
90
90
  assert Dir['output/*'].size == 1
91
91
  assert File.file?('output/a.css')
92
92
  refute File.file?('output/b.css')
93
- assert_match /^p\s*\{\s*color:\s*red;?\s*\}/, File.read('output/a.css')
93
+ assert_match(/^p\s*\{\s*color:\s*red;?\s*\}/, File.read('output/a.css'))
94
94
 
95
95
  # Update included file
96
96
  File.open('content/b.less', 'w') do |io|
@@ -105,7 +105,7 @@ class Nanoc::Filters::LessTest < MiniTest::Unit::TestCase
105
105
  assert Dir['output/*'].size == 1
106
106
  assert File.file?('output/a.css')
107
107
  refute File.file?('output/b.css')
108
- assert_match /^p\s*\{\s*color:\s*blue;?\s*\}/, File.read('output/a.css')
108
+ assert_match(/^p\s*\{\s*color:\s*blue;?\s*\}/, File.read('output/a.css'))
109
109
  end
110
110
  end
111
111
  end
@@ -22,11 +22,11 @@ class Nanoc::Filters::SassTest < MiniTest::Unit::TestCase
22
22
 
23
23
  # Check with compact
24
24
  result = filter.run(".foo #bar\n color: #f00", :style => 'compact')
25
- assert_match(/^\.foo #bar[\s\n]*\{[\s\n]*color:\s*(red|#f00);?[\s\n]*\}/m, result)
25
+ assert_match(/^\.foo #bar[\s]*\{[\s]*color:\s*(red|#f00);?[\s]*\}/m, result)
26
26
 
27
27
  # Check with compressed
28
28
  result = filter.run(".foo #bar\n color: #f00", :style => 'compressed')
29
- assert_match(/^\.foo #bar[\s\n]*\{[\s\n]*color:\s*(red|#f00);?[\s\n]*\}/m, result)
29
+ assert_match(/^\.foo #bar[\s]*\{[\s]*color:\s*(red|#f00);?[\s]*\}/m, result)
30
30
  end
31
31
  end
32
32
 
@@ -133,8 +133,7 @@ class Nanoc::Filters::SassTest < MiniTest::Unit::TestCase
133
133
  assert Dir['output/*'].size == 1
134
134
  assert File.file?('output/a.css')
135
135
  refute File.file?('output/b.css')
136
- assert_match /^p\s*\{\s*color:\s*red;?\s*\}/,
137
- File.read('output/a.css')
136
+ assert_match(/^p\s*\{\s*color:\s*red;?\s*\}/, File.read('output/a.css'))
138
137
 
139
138
  # Update included file
140
139
  File.open('content/b.sass', 'w') do |io|
@@ -149,8 +148,7 @@ class Nanoc::Filters::SassTest < MiniTest::Unit::TestCase
149
148
  assert Dir['output/*'].size == 1
150
149
  assert File.file?('output/a.css')
151
150
  refute File.file?('output/b.css')
152
- assert_match /^p\s*\{\s*color:\s*blue;?\s*\}/,
153
- File.read('output/a.css')
151
+ assert_match(/^p\s*\{\s*color:\s*blue;?\s*\}/, File.read('output/a.css'))
154
152
  end
155
153
  end
156
154
  end
@@ -190,8 +188,7 @@ class Nanoc::Filters::SassTest < MiniTest::Unit::TestCase
190
188
  assert Dir['output/*'].size == 1
191
189
  assert File.file?('output/a.css')
192
190
  refute File.file?('output/b.css')
193
- assert_match /^p\s*\{\s*color:\s*red;?\s*\}/,
194
- File.read('output/a.css')
191
+ assert_match(/^p\s*\{\s*color:\s*red;?\s*\}/, File.read('output/a.css'))
195
192
 
196
193
  # Update included file
197
194
  File.open('content/_b.sass', 'w') do |io|
@@ -206,8 +203,7 @@ class Nanoc::Filters::SassTest < MiniTest::Unit::TestCase
206
203
  assert Dir['output/*'].size == 1
207
204
  assert File.file?('output/a.css')
208
205
  refute File.file?('output/b.css')
209
- assert_match /^p\s*\{\s*color:\s*blue;?\s*\}/,
210
- File.read('output/a.css')
206
+ assert_match(/^p\s*\{\s*color:\s*blue;?\s*\}/, File.read('output/a.css'))
211
207
  end
212
208
  end
213
209
  end
@@ -8,7 +8,7 @@ begin
8
8
  require 'minitest/unit'
9
9
  require 'minitest/spec'
10
10
  require 'minitest/mock'
11
- require 'mocha'
11
+ require 'mocha/setup'
12
12
  rescue => e
13
13
  $stderr.puts "To run the nanoc unit tests, you need minitest and mocha."
14
14
  raise e
@@ -119,6 +119,7 @@ EOS
119
119
 
120
120
  # Enter tmp
121
121
  FileUtils.mkdir_p('tmp')
122
+ @orig_wd = FileUtils.pwd
122
123
  FileUtils.cd('tmp')
123
124
 
124
125
  # Let us get to the raw errors
@@ -130,7 +131,7 @@ EOS
130
131
  Nanoc::CLI::ErrorHandler.enable
131
132
 
132
133
  # Exit tmp
133
- FileUtils.cd('..')
134
+ FileUtils.cd(@orig_wd)
134
135
  FileUtils.rm_rf('tmp')
135
136
 
136
137
  # Go unquiet
@@ -63,7 +63,7 @@ class Nanoc::Helpers::FilteringTest < MiniTest::Unit::TestCase
63
63
  "<% end %>\n"
64
64
 
65
65
  # Evaluate content
66
- error = assert_raises(Nanoc::Errors::UnknownFilter) do
66
+ assert_raises(Nanoc::Errors::UnknownFilter) do
67
67
  ::ERB.new(content).result(binding)
68
68
  end
69
69
  end
@@ -6,98 +6,114 @@ class Nanoc::Helpers::XMLSitemapTest < MiniTest::Unit::TestCase
6
6
 
7
7
  include Nanoc::Helpers::XMLSitemap
8
8
 
9
+ def teardown
10
+ @items = nil
11
+ @item = nil
12
+ @site = nil
13
+ super
14
+ end
15
+
9
16
  def test_xml_sitemap
10
- if_have 'builder' do
17
+ if_have 'builder', 'nokogiri' do
11
18
  # Create items
12
- @items = [ mock, mock, mock, mock ]
13
-
14
- # Create item 0
15
- @items[0].expects(:[]).with(:is_hidden).returns(false)
16
- @items[0].expects(:mtime).times(2).returns(nil)
17
- @items[0].expects(:[]).times(2).with(:changefreq).returns(nil)
18
- @items[0].expects(:[]).times(2).with(:priority).returns(nil)
19
- item_reps = [ mock, mock ]
20
- item_reps[0].expects(:path).returns('/kkk/')
21
- item_reps[0].expects(:raw_path).returns('output/kkk/index.html')
22
- item_reps[1].expects(:path).returns('/lll/')
23
- item_reps[1].expects(:raw_path).returns('output/lll/index.html')
24
- @items[0].expects(:reps).returns(item_reps)
19
+ @items = []
25
20
 
26
21
  # Create item 1
27
- @items[1].expects(:[]).with(:is_hidden).returns(true)
22
+ @items << Nanoc::Item.new('some content 1', {}, '/item-one/')
23
+ self.create_item_rep(@items.last, :one_a, '/item-one/a/')
24
+ self.create_item_rep(@items.last, :one_b, '/item-one/b/')
28
25
 
29
26
  # Create item 2
30
- @items[2].expects(:[]).with(:is_hidden).returns(false)
31
- @items[2].expects(:mtime).times(4).returns(Time.parse('12/07/2004'))
32
- @items[2].expects(:[]).with(:changefreq).times(4).returns('daily')
33
- @items[2].expects(:[]).with(:priority).times(4).returns(0.5)
34
- item_reps = [ mock, mock ]
35
- item_reps[0].expects(:path).returns('/aaa/')
36
- item_reps[0].expects(:raw_path).returns('output/aaa/index.html')
37
- item_reps[1].expects(:path).returns('/bbb/')
38
- item_reps[1].expects(:raw_path).returns('output/bbb/index.html')
39
- @items[2].expects(:reps).returns(item_reps)
27
+ @items << Nanoc::Item.new('some content 2', { :is_hidden => true }, '/item-two/')
40
28
 
41
29
  # Create item 3
42
- @items[3].expects(:[]).with(:is_hidden).returns(false)
43
- item_rep = mock
44
- item_rep.expects(:raw_path).returns(nil)
45
- @items[3].expects(:reps).returns([ item_rep ])
30
+ attrs = { :mtime => Time.parse('2004-07-12'), :changefreq => 'daily', :priority => 0.5 }
31
+ @items << Nanoc::Item.new('some content 3', attrs, '/item-three/')
32
+ self.create_item_rep(@items.last, :three_a, '/item-three/a/')
33
+ self.create_item_rep(@items.last, :three_b, '/item-three/b/')
34
+
35
+ # Create item 4
36
+ @items << Nanoc::Item.new('some content 4', {}, '/item-four/')
37
+ self.create_item_rep(@items.last, :four_a, nil)
46
38
 
47
39
  # Create sitemap item
48
- @item = mock
40
+ @item = Nanoc::Item.new('sitemap content', {}, '/sitemap/')
49
41
 
50
42
  # Create site
51
- config = mock
52
- config.expects(:[]).with(:base_url).at_least_once.returns('http://example.com')
53
- @site = mock
54
- @site.expects(:config).at_least_once.returns(config)
43
+ @site = Nanoc::Site.new({ :base_url => 'http://example.com' })
44
+
45
+ # Build sitemap
46
+ res = xml_sitemap
55
47
 
56
48
  # Check
57
- xml_sitemap
49
+ doc = Nokogiri::XML(res)
50
+ urlsets = doc.css('> urlset')
51
+ assert_equal 1, urlsets.size
52
+ urls = urlsets.css('> url')
53
+ assert_equal 4, urls.size
54
+ assert_equal 'http://example.com/item-one/a/', urls[0].css('> loc').inner_text
55
+ assert_equal 'http://example.com/item-one/b/', urls[1].css('> loc').inner_text
56
+ assert_equal 'http://example.com/item-three/a/', urls[2].css('> loc').inner_text
57
+ assert_equal 'http://example.com/item-three/b/', urls[3].css('> loc').inner_text
58
+ assert_equal '', urls[0].css('> changefreq').inner_text
59
+ assert_equal '', urls[1].css('> changefreq').inner_text
60
+ assert_equal 'daily', urls[2].css('> changefreq').inner_text
61
+ assert_equal 'daily', urls[3].css('> changefreq').inner_text
62
+ assert_equal '', urls[0].css('> priority').inner_text
63
+ assert_equal '', urls[1].css('> priority').inner_text
64
+ assert_equal '0.5', urls[2].css('> priority').inner_text
65
+ assert_equal '0.5', urls[3].css('> priority').inner_text
66
+ assert_equal '', urls[0].css('> lastmod').inner_text
67
+ assert_equal '', urls[1].css('> lastmod').inner_text
68
+ assert_equal '2004-07-12', urls[2].css('> lastmod').inner_text
69
+ assert_equal '2004-07-12', urls[3].css('> lastmod').inner_text
58
70
  end
59
- ensure
60
- @items = nil
61
- @item = nil
62
- @site = nil
63
71
  end
64
72
 
65
73
  def test_sitemap_with_items_as_param
66
- if_have 'builder' do
74
+ if_have 'builder', 'nokogiri' do
67
75
  # Create items
68
- @items = [ mock, mock, mock ]
69
-
70
- # Create item 0
71
- @items[0].expects(:[]).never
72
-
73
- # Create item 1
74
- @items[1].expects(:[]).never
75
-
76
- # Create item 2
77
- @items[2].expects(:mtime).times(2).returns(nil)
78
- @items[2].expects(:[]).times(2).with(:changefreq).returns(nil)
79
- @items[2].expects(:[]).times(2).with(:priority).returns(nil)
80
- item_reps = [ mock, mock ]
81
- item_reps[0].expects(:path).returns('/kkk/')
82
- item_reps[0].expects(:raw_path).returns('output/kkk/index.html')
83
- item_reps[1].expects(:path).returns('/lll/')
84
- item_reps[1].expects(:raw_path).returns('output/lll/index.html')
85
- @items[2].expects(:reps).returns(item_reps)
76
+ @items = []
77
+ @items << nil
78
+ @items << Nanoc::Item.new('some content 1', {}, '/item-one/')
79
+ self.create_item_rep(@items.last, :one_a, '/item-one/a/')
80
+ self.create_item_rep(@items.last, :one_b, '/item-one/b/')
81
+ @items << nil
86
82
 
87
83
  # Create sitemap item
88
- @item = mock
84
+ @item = Nanoc::Item.new('sitemap content', {}, '/sitemap/')
89
85
 
90
86
  # Create site
91
- config = mock
92
- config.expects(:[]).with(:base_url).at_least_once.returns('http://example.com')
93
- @site = mock
94
- @site.expects(:config).at_least_once.returns(config)
87
+ @site = Nanoc::Site.new({ :base_url => 'http://example.com' })
88
+
89
+ # Build sitemap
90
+ res = xml_sitemap(:items => [ @items[1] ])
95
91
 
96
92
  # Check
97
- xml_sitemap(
98
- :items => [@items[2]]
99
- )
93
+ doc = Nokogiri::XML(res)
94
+ urlsets = doc.css('> urlset')
95
+ assert_equal 1, urlsets.size
96
+ urls = urlsets.css('> url')
97
+ assert_equal 2, urls.size
98
+ assert_equal 'http://example.com/item-one/a/', urls[0].css('> loc').inner_text
99
+ assert_equal 'http://example.com/item-one/b/', urls[1].css('> loc').inner_text
100
+ assert_equal '', urls[0].css('> changefreq').inner_text
101
+ assert_equal '', urls[1].css('> changefreq').inner_text
102
+ assert_equal '', urls[0].css('> priority').inner_text
103
+ assert_equal '', urls[1].css('> priority').inner_text
104
+ assert_equal '', urls[0].css('> lastmod').inner_text
105
+ assert_equal '', urls[1].css('> lastmod').inner_text
100
106
  end
101
107
  end
102
108
 
109
+ protected
110
+
111
+ def create_item_rep(item, name, path)
112
+ rep = Nanoc::ItemRep.new(item, name)
113
+ rep.paths = { :last => path }
114
+ rep.raw_paths = { :last => path }
115
+ item.reps << rep
116
+ rep
117
+ end
118
+
103
119
  end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::GemTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def setup
8
+ super
9
+ FileUtils.cd(@orig_wd)
10
+ end
11
+
12
+ def test_build
13
+ require 'systemu'
14
+
15
+ # Require clean environment
16
+ assert_empty Dir['nanoc-*.gem'], "Ensure no nanoc-*.gem files exist"
17
+
18
+ # Build
19
+ files_before = Set.new Dir['**/*']
20
+ stdout = ''
21
+ stderr = ''
22
+ status = systemu(
23
+ [ 'gem', 'build', 'nanoc.gemspec' ],
24
+ 'stdin' => '',
25
+ 'stdout' => stdout,
26
+ 'stderr' => stderr)
27
+ assert status.success?
28
+ files_after = Set.new Dir['**/*']
29
+
30
+ # Check new files
31
+ diff = files_after - files_before
32
+ assert_equal 1, diff.size
33
+ assert_match(/^nanoc-.*\.gem$/, diff.to_a[0])
34
+
35
+ # Check output
36
+ assert_match(/Successfully built RubyGem\n Name: nanoc\n Version: .*\n File: nanoc-.*\.gem\n/, stdout)
37
+ assert_equal '', stderr
38
+ ensure
39
+ Dir['nanoc-*.gem'].each { |f| FileUtils.rm(f) }
40
+ end
41
+
42
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.2
4
+ version: 3.4.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-01 00:00:00.000000000 Z
12
+ date: 2012-12-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cri
@@ -202,7 +202,6 @@ files:
202
202
  - lib/nanoc/data_sources/filesystem_verbose.rb
203
203
  - lib/nanoc/data_sources.rb
204
204
  - lib/nanoc/extra/auto_compiler.rb
205
- - lib/nanoc/extra/checking/checker_cli.rb
206
205
  - lib/nanoc/extra/chick.rb
207
206
  - lib/nanoc/extra/core_ext/enumerable.rb
208
207
  - lib/nanoc/extra/core_ext/pathname.rb
@@ -368,8 +367,8 @@ files:
368
367
  - test/helpers/test_text.rb
369
368
  - test/helpers/test_xml_sitemap.rb
370
369
  - test/tasks/test_clean.rb
370
+ - test/test_gem.rb
371
371
  - nanoc.gemspec
372
- - .gemtest
373
372
  homepage: http://nanoc.stoneship.org/
374
373
  licenses: []
375
374
  post_install_message:
data/.gemtest DELETED
File without changes
@@ -1,151 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc::Extra::Checking
4
-
5
- class CheckerCLI
6
-
7
- def list_all_checkers
8
- puts "Available checkers:"
9
- puts
10
- puts all_checker_classes.map { |i| " " + i.identifier.to_s }.sort.join("\n")
11
- end
12
-
13
- def run_all
14
- end
15
-
16
- def run(identifiers)
17
- end
18
-
19
- def run_for_deploy
20
- end
21
-
22
- protected
23
-
24
- def all_checker_classes
25
- Nanoc::Extra::Checking::Checker.all.map { |p| p.last }.uniq
26
- end
27
-
28
- end
29
-
30
- end
31
-
32
- usage 'check [options] [names]'
33
- summary 'run issue checks'
34
- description <<-EOS
35
- Run the given issue checks (or all, if none are given) on the current site.
36
- EOS
37
-
38
- flag :a, :all, 'run all checkers'
39
- flag :l, :list, 'list all checkers'
40
- flag :d, :deploy, 'run checkers for deployment'
41
-
42
- module Nanoc::CLI::Commands
43
-
44
- class Check < ::Nanoc::CLI::CommandRunner
45
-
46
- def run
47
- validate_options_and_arguments
48
-
49
- # Load DSL
50
- if File.exist?('Checkers')
51
- dsl = Nanoc::Extra::Checking::DSL.from_file('Checkers')
52
- end
53
-
54
- # List
55
- if options[:list]
56
- self.list_checkers
57
- return
58
- end
59
-
60
- # Make sure we are in a nanoc site directory
61
- self.require_site
62
-
63
- # Find and run
64
- classes = self.find_checker_classes(dsl)
65
- issues = self.run_checkers(classes)
66
- self.print_issues(issues)
67
- end
68
-
69
- protected
70
-
71
- def validate_options_and_arguments
72
- if arguments.empty? && !options[:all] && !options[:deploy] && !options[:list]
73
- raise Nanoc::Errors::GenericTrivial,
74
- "nothing to do (pass either --all, --deploy or --list or a list of checkers)"
75
- end
76
- end
77
-
78
- def all_checker_classes
79
- Nanoc::Extra::Checking::Checker.all.map { |p| p.last }.uniq
80
- end
81
-
82
- def list_checkers
83
- puts "Available checkers:"
84
- puts
85
- puts all_checker_classes.map { |i| " " + i.identifier.to_s }.sort.join("\n")
86
- end
87
-
88
- def checker_classes_named(n)
89
- classes = n.map do |a|
90
- klass = Nanoc::Extra::Checking::Checker.named(a)
91
- raise Nanoc::Errors::GenericTrivial, "Unknown checker: #{a}" if klass.nil?
92
- klass
93
- end
94
- end
95
-
96
- def find_checker_classes(dsl)
97
- if options[:all]
98
- return self.all_checker_classes
99
- elsif options[:deploy]
100
- if dsl
101
- return self.checker_classes_named(dsl.deploy_checks)
102
- end
103
- else
104
- return self.checker_classes_named(arguments)
105
- end
106
-
107
- raise Nanoc::Errors::GenericTrivial, "No checkers to run"
108
- end
109
-
110
- def run_checkers(classes)
111
- puts
112
- checkers = []
113
- issues = Set.new
114
- length = classes.map { |c| c.identifier.to_s.length }.max + 20
115
- classes.each do |klass|
116
- print format("%-#{length}s", "Running #{klass.identifier} checker… ")
117
-
118
- checker = klass.new(site)
119
- checkers << checker
120
- checker.run
121
- issues.merge checker.issues
122
-
123
- # TODO report progress
124
-
125
- puts issues.empty? ? 'ok'.green : 'error'.red
126
- end
127
- issues
128
- end
129
-
130
- def print_issues(issues)
131
- require 'colored'
132
-
133
- have_issues = false
134
- issues.group_by { |i| i.subject }.each_pair do |subject, issues|
135
- unless issues.empty?
136
- puts unless have_issues
137
- have_issues = true
138
- puts "#{subject}:"
139
- issues.each do |i|
140
- puts " [ #{'ERROR'.red} ] #{i.checker_class.identifier} - #{i.description}"
141
- end
142
- end
143
- end
144
- end
145
-
146
- end
147
-
148
- end
149
-
150
- runner Nanoc::CLI::Commands::Check
151
-