nanoc 3.5.0 → 3.6.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.
Files changed (107) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +20 -12
  3. data/NEWS.md +23 -0
  4. data/README.md +6 -3
  5. data/doc/yardoc_templates/default/layout/html/footer.erb +16 -7
  6. data/lib/nanoc.rb +1 -1
  7. data/lib/nanoc/base.rb +1 -0
  8. data/lib/nanoc/base/compilation/compiler_dsl.rb +31 -0
  9. data/lib/nanoc/base/compilation/filter.rb +34 -0
  10. data/lib/nanoc/base/result_data/item_rep.rb +3 -3
  11. data/lib/nanoc/base/source_data/code_snippet.rb +1 -1
  12. data/lib/nanoc/base/source_data/data_source.rb +12 -0
  13. data/lib/nanoc/base/source_data/item.rb +1 -1
  14. data/lib/nanoc/base/source_data/item_array.rb +62 -0
  15. data/lib/nanoc/base/source_data/layout.rb +1 -1
  16. data/lib/nanoc/base/source_data/site.rb +24 -3
  17. data/lib/nanoc/cli/cleaning_stream.rb +10 -0
  18. data/lib/nanoc/cli/command_runner.rb +25 -12
  19. data/lib/nanoc/cli/commands/autocompile.rb +5 -3
  20. data/lib/nanoc/cli/commands/check.rb +9 -1
  21. data/lib/nanoc/cli/commands/compile.rb +1 -1
  22. data/lib/nanoc/cli/commands/create-site.rb +5 -5
  23. data/lib/nanoc/cli/commands/prune.rb +1 -1
  24. data/lib/nanoc/cli/commands/shell.rb +37 -0
  25. data/lib/nanoc/cli/commands/show-data.rb +1 -1
  26. data/lib/nanoc/cli/commands/sync.rb +34 -0
  27. data/lib/nanoc/cli/error_handler.rb +11 -2
  28. data/lib/nanoc/extra/checking/checks/stale.rb +10 -2
  29. data/lib/nanoc/extra/pruner.rb +14 -11
  30. data/lib/nanoc/filters/asciidoc.rb +2 -2
  31. data/lib/nanoc/filters/bluecloth.rb +2 -2
  32. data/lib/nanoc/filters/coderay.rb +2 -2
  33. data/lib/nanoc/filters/coffeescript.rb +2 -2
  34. data/lib/nanoc/filters/colorize_syntax.rb +2 -4
  35. data/lib/nanoc/filters/erb.rb +2 -2
  36. data/lib/nanoc/filters/erubis.rb +2 -2
  37. data/lib/nanoc/filters/haml.rb +2 -2
  38. data/lib/nanoc/filters/handlebars.rb +2 -2
  39. data/lib/nanoc/filters/kramdown.rb +2 -2
  40. data/lib/nanoc/filters/less.rb +2 -2
  41. data/lib/nanoc/filters/markaby.rb +2 -2
  42. data/lib/nanoc/filters/maruku.rb +2 -2
  43. data/lib/nanoc/filters/mustache.rb +2 -2
  44. data/lib/nanoc/filters/pandoc.rb +2 -2
  45. data/lib/nanoc/filters/rainpress.rb +2 -2
  46. data/lib/nanoc/filters/rdiscount.rb +2 -2
  47. data/lib/nanoc/filters/rdoc.rb +3 -17
  48. data/lib/nanoc/filters/redcarpet.rb +7 -3
  49. data/lib/nanoc/filters/redcloth.rb +2 -2
  50. data/lib/nanoc/filters/rubypants.rb +2 -2
  51. data/lib/nanoc/filters/sass.rb +2 -3
  52. data/lib/nanoc/filters/slim.rb +2 -2
  53. data/lib/nanoc/filters/typogruby.rb +2 -2
  54. data/lib/nanoc/filters/uglify_js.rb +2 -2
  55. data/lib/nanoc/filters/xsl.rb +2 -1
  56. data/lib/nanoc/filters/yui_compressor.rb +2 -2
  57. data/lib/nanoc/helpers/blogging.rb +1 -1
  58. data/lib/nanoc/helpers/filtering.rb +1 -1
  59. data/lib/nanoc/helpers/rendering.rb +1 -1
  60. data/nanoc.gemspec +2 -2
  61. data/test/base/core_ext/array_spec.rb +4 -12
  62. data/test/base/core_ext/hash_spec.rb +4 -12
  63. data/test/base/test_compiler_dsl.rb +63 -0
  64. data/test/base/test_item.rb +3 -18
  65. data/test/base/test_item_array.rb +336 -0
  66. data/test/base/test_item_rep.rb +2 -12
  67. data/test/base/test_layout.rb +1 -6
  68. data/test/base/test_outdatedness_checker.rb +1 -1
  69. data/test/base/test_site.rb +9 -3
  70. data/test/cli/commands/test_check.rb +22 -0
  71. data/test/cli/commands/test_compile.rb +2 -2
  72. data/test/cli/commands/test_deploy.rb +6 -6
  73. data/test/cli/commands/test_prune.rb +23 -4
  74. data/test/cli/commands/test_sync.rb +31 -0
  75. data/test/cli/test_error_handler.rb +16 -11
  76. data/test/extra/checking/checks/test_stale.rb +24 -1
  77. data/test/extra/test_auto_compiler.rb +4 -4
  78. data/test/filters/test_asciidoc.rb +1 -1
  79. data/test/filters/test_bluecloth.rb +1 -1
  80. data/test/filters/test_coderay.rb +3 -3
  81. data/test/filters/test_coffeescript.rb +1 -1
  82. data/test/filters/test_colorize_syntax.rb +20 -20
  83. data/test/filters/test_erb.rb +10 -10
  84. data/test/filters/test_erubis.rb +6 -6
  85. data/test/filters/test_haml.rb +10 -10
  86. data/test/filters/test_handlebars.rb +3 -3
  87. data/test/filters/test_kramdown.rb +1 -1
  88. data/test/filters/test_less.rb +4 -4
  89. data/test/filters/test_markaby.rb +1 -1
  90. data/test/filters/test_maruku.rb +1 -1
  91. data/test/filters/test_mustache.rb +2 -2
  92. data/test/filters/test_pandoc.rb +1 -1
  93. data/test/filters/test_rainpress.rb +2 -2
  94. data/test/filters/test_rdiscount.rb +2 -2
  95. data/test/filters/test_rdoc.rb +1 -1
  96. data/test/filters/test_redcarpet.rb +21 -6
  97. data/test/filters/test_redcloth.rb +3 -3
  98. data/test/filters/test_relativize_paths.rb +27 -27
  99. data/test/filters/test_rubypants.rb +1 -1
  100. data/test/filters/test_sass.rb +8 -8
  101. data/test/filters/test_slim.rb +4 -4
  102. data/test/filters/test_typogruby.rb +1 -1
  103. data/test/filters/test_uglify_js.rb +2 -2
  104. data/test/filters/test_xsl.rb +2 -2
  105. data/test/filters/test_yui_compressor.rb +3 -3
  106. data/test/helper.rb +6 -1
  107. metadata +12 -6
@@ -124,6 +124,69 @@ EOS
124
124
  end
125
125
  end
126
126
 
127
+ def test_ignore
128
+ with_site do
129
+ # Create rules
130
+ File.open('Rules', 'w') do |io|
131
+ io.write <<EOS
132
+ ignore '/lame/'
133
+
134
+ passthrough '*'
135
+ EOS
136
+ end
137
+
138
+ # Create items
139
+ assert Dir['content/*'].empty?
140
+ File.open('content/lame.txt', 'w') do |io|
141
+ io.write "Hello I am lame"
142
+ end
143
+
144
+ File.open('content/notlame.txt', 'w') do |io|
145
+ io.write "Hello I am not lame"
146
+ end
147
+
148
+ # Compile
149
+ site = Nanoc::Site.new('.')
150
+ site.compile
151
+
152
+ # Check paths
153
+ assert_equal [ 'output/notlame.txt'], Dir['output/*']
154
+ end
155
+ end
156
+
157
+ def test_ignore_priority
158
+ with_site do
159
+ # Create rules
160
+ File.open('Rules', 'w') do |io|
161
+ io.write <<EOS
162
+ compile '*' do
163
+ filter :erb
164
+ end
165
+
166
+ route '*' do
167
+ item.identifier + 'index.html'
168
+ end
169
+
170
+ ignore "/foo/"
171
+ EOS
172
+ end
173
+
174
+ # Create items
175
+ assert Dir['content/*'].empty?
176
+ File.open('content/foo.txt', 'w') do |io|
177
+ io.write "Hello I am <%= 'foo' %>"
178
+ end
179
+
180
+ # Compile
181
+ site = Nanoc::Site.new('.')
182
+ site.compile
183
+
184
+ # Check paths
185
+ assert_equal [ 'output/foo' ], Dir['output/*']
186
+ assert_equal [ 'output/foo/index.html' ], Dir['output/foo/*']
187
+ end
188
+ end
189
+
127
190
  def test_identifier_to_regex_without_wildcards
128
191
  # Create compiler DSL
129
192
  compiler_dsl = Nanoc::CompilerDSL.new(nil, {})
@@ -20,14 +20,9 @@ class Nanoc::ItemTest < MiniTest::Unit::TestCase
20
20
  def test_frozen_identifier
21
21
  item = Nanoc::Item.new("foo", {}, '/foo')
22
22
 
23
- raised = false
24
- begin
23
+ assert_raises_frozen_error do
25
24
  item.identifier.chop!
26
- rescue => error
27
- raised = true
28
- assert_match(/(^can't modify frozen [Ss]tring|^unable to modify frozen object$)/, error.message)
29
25
  end
30
- assert raised, 'Should have raised when trying to modify a frozen string'
31
26
  end
32
27
 
33
28
  def test_lookup
@@ -144,23 +139,13 @@ class Nanoc::ItemTest < MiniTest::Unit::TestCase
144
139
  item = Nanoc::Item.new("foo", { :a => { :b => 123 }}, '/foo/')
145
140
  item.freeze
146
141
 
147
- raised = false
148
- begin
142
+ assert_raises_frozen_error do
149
143
  item[:abc] = '123'
150
- rescue => e
151
- raised = true
152
- assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
153
144
  end
154
- assert raised
155
145
 
156
- raised = false
157
- begin
146
+ assert_raises_frozen_error do
158
147
  item[:a][:b] = '456'
159
- rescue => e
160
- raised = true
161
- assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
162
148
  end
163
- assert raised
164
149
  end
165
150
 
166
151
  def test_dump_and_load
@@ -0,0 +1,336 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::ItemArrayTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def setup
8
+ super
9
+
10
+ @one = Nanoc::Item.new('Item One', {}, '/one/')
11
+ @two = Nanoc::Item.new('Item Two', {}, '/two/')
12
+
13
+ @items = Nanoc::ItemArray.new
14
+ @items << @one
15
+ @items << @two
16
+ end
17
+
18
+ def test_change_item_identifier
19
+ assert_equal @one, @items['/one/']
20
+ assert_nil @items['/foo/']
21
+
22
+ @one.identifier = '/foo/'
23
+
24
+ assert_nil @items['/one/']
25
+ assert_equal @one, @items['/foo/']
26
+ end
27
+
28
+ def test_enumerable
29
+ assert_equal @one, @items.find { |i| i.identifier == '/one/' }
30
+ end
31
+
32
+ def test_brackets_and_slice_and_at_with_index
33
+ assert_equal @one, @items[0]
34
+ assert_equal @one, @items.slice(0)
35
+ assert_equal @one, @items.at(0)
36
+
37
+ assert_equal @two, @items[1]
38
+ assert_equal @two, @items.slice(1)
39
+ assert_equal @two, @items.at(1)
40
+
41
+ assert_nil @items[2]
42
+ assert_nil @items.slice(2)
43
+ assert_nil @items.at(2)
44
+
45
+ assert_equal @two, @items[-1]
46
+ assert_equal @two, @items.slice(-1)
47
+ assert_equal @two, @items.at(-1)
48
+ end
49
+
50
+ def test_brackets_and_slice_with_range
51
+ assert_equal [ @one, @two ], @items[0..1]
52
+ assert_equal [ @one, @two ], @items[0, 2]
53
+
54
+ assert_equal [ @one, @two ], @items.slice(0..1)
55
+ assert_equal [ @one, @two ], @items.slice(0, 2)
56
+ end
57
+
58
+ def test_brackets_and_slice_and_at_with_identifier
59
+ assert_equal @one, @items['/one/']
60
+ assert_equal @one, @items.slice('/one/')
61
+ assert_equal @one, @items.at('/one/')
62
+
63
+ assert_equal @two, @items['/two/']
64
+ assert_equal @two, @items.slice('/two/')
65
+ assert_equal @two, @items.at('/two/')
66
+
67
+ assert_nil @items['/max-payne/']
68
+ assert_nil @items.slice('/max-payne/')
69
+ assert_nil @items.at('/max-payne/')
70
+ end
71
+
72
+ def test_brackets_and_slice_and_at_with_malformed_identifier
73
+ assert_nil @items['one/']
74
+ assert_nil @items.slice('one/')
75
+ assert_nil @items.at('one/')
76
+
77
+ assert_nil @items['/one']
78
+ assert_nil @items.slice('/one')
79
+ assert_nil @items.at('/one')
80
+
81
+ assert_nil @items['one']
82
+ assert_nil @items.slice('one')
83
+ assert_nil @items.at('one')
84
+
85
+ assert_nil @items['//one/']
86
+ assert_nil @items.slice('//one/')
87
+ assert_nil @items.at('//one/')
88
+ end
89
+
90
+ def test_brackets_and_slice_and_at_frozen
91
+ @items.freeze
92
+
93
+ assert_equal @one, @items['/one/']
94
+ assert_equal @one, @items.slice('/one/')
95
+ assert_equal @one, @items.at('/one/')
96
+
97
+ assert_nil @items['/tenthousand/']
98
+ assert_nil @items.slice('/tenthousand/')
99
+ assert_nil @items.at('/tenthousand/')
100
+ end
101
+
102
+ def test_less_than_less_than
103
+ assert_nil @items[2]
104
+ assert_nil @items['/foo/']
105
+
106
+ foo = Nanoc::Item.new('Item Foo', {}, '/foo/')
107
+ @items << foo
108
+
109
+ assert_equal foo, @items[2]
110
+ assert_equal foo, @items['/foo/']
111
+ end
112
+
113
+ def test_assign
114
+ assert_raises(TypeError) do
115
+ @items['/blah/'] = Nanoc::Item.new('Item blah', {}, '/blah/')
116
+ end
117
+
118
+ new_item = Nanoc::Item.new('New Item One', {}, '/one-new/')
119
+ @items[0] = new_item
120
+
121
+ assert_equal new_item, @items[0]
122
+ assert_equal new_item, @items['/one-new/']
123
+ assert_nil @items['/one/']
124
+ end
125
+
126
+ def test_assign_frozen
127
+ @items.freeze
128
+
129
+ new_item = Nanoc::Item.new('New Item One', {}, '/one-new/')
130
+
131
+ assert_raises_frozen_error do
132
+ @items[0] = new_item
133
+ end
134
+ end
135
+
136
+ def test_clear
137
+ @items.clear
138
+
139
+ assert_nil @items[0]
140
+ assert_nil @items[1]
141
+ assert_nil @items[2]
142
+
143
+ assert_nil @items['/one/']
144
+ assert_nil @items['/two/']
145
+ end
146
+
147
+ def test_collect_bang
148
+ @items.collect! do |i|
149
+ Nanoc::Item.new("New #{i.raw_content}", {}, "/new#{i.identifier}")
150
+ end
151
+
152
+ assert_nil @items['/one/']
153
+ assert_nil @items['/two/']
154
+
155
+ assert_equal "New Item One", @items[0].raw_content
156
+ assert_equal "New Item One", @items['/new/one/'].raw_content
157
+
158
+ assert_equal "New Item Two", @items[1].raw_content
159
+ assert_equal "New Item Two", @items['/new/two/'].raw_content
160
+ end
161
+
162
+ def test_collect_bang_frozen
163
+ @items.freeze
164
+
165
+ assert_raises_frozen_error do
166
+ @items.collect! do |i|
167
+ Nanoc::Item.new("New #{i.raw_content}", {}, "/new#{i.identifier}")
168
+ end
169
+ end
170
+ end
171
+
172
+ def test_concat
173
+ new_item = Nanoc::Item.new('New item', {}, '/new/')
174
+ @items.concat([ new_item ])
175
+
176
+ assert_equal new_item, @items[2]
177
+ assert_equal new_item, @items['/new/']
178
+ end
179
+
180
+ def test_delete
181
+ assert_equal @two, @items[1]
182
+ assert_equal @two, @items['/two/']
183
+
184
+ @items.delete(@two)
185
+
186
+ assert_nil @items[1]
187
+ assert_nil @items['/two/']
188
+ end
189
+
190
+ def test_delete_at
191
+ assert_equal @two, @items[1]
192
+ assert_equal @two, @items['/two/']
193
+
194
+ @items.delete_at(1)
195
+
196
+ assert_nil @items[1]
197
+ assert_nil @items['/two/']
198
+ end
199
+
200
+ def test_delete_if
201
+ assert_equal @two, @items[1]
202
+ assert_equal @two, @items['/two/']
203
+
204
+ @items.delete_if { |i| i.identifier == '/two/' }
205
+
206
+ assert_nil @items[1]
207
+ assert_nil @items['/two/']
208
+ end
209
+
210
+ def test_fill_all
211
+ @items.fill { |i| Nanoc::Item.new("Item #{i}", {}, "/new/#{i}/") }
212
+
213
+ assert_nil @items['/one/']
214
+ assert_nil @items['/two/']
215
+
216
+ assert_equal "Item 0", @items[0].raw_content
217
+ assert_equal "Item 0", @items['/new/0/'].raw_content
218
+ assert_equal "Item 1", @items[1].raw_content
219
+ assert_equal "Item 1", @items['/new/1/'].raw_content
220
+ end
221
+
222
+ def test_fill_range
223
+ @items.fill(1..-1) { |i| Nanoc::Item.new("Item #{i}", {}, "/new/#{i}/") }
224
+
225
+ assert_equal @one, @items['/one/']
226
+ assert_nil @items['/two/']
227
+
228
+ assert_equal @one, @items[0]
229
+ assert_equal @one, @items['/one/']
230
+ assert_equal "Item 1", @items[1].raw_content
231
+ assert_equal "Item 1", @items['/new/1/'].raw_content
232
+ end
233
+
234
+ if Array.new.respond_to?(:keep_if)
235
+ def test_keep_if
236
+ assert_equal @two, @items[1]
237
+ assert_equal @two, @items['/two/']
238
+
239
+ @items.keep_if { |i| i.identifier == '/one/' }
240
+
241
+ assert_equal @one, @items[0]
242
+ assert_equal @one, @items['/one/']
243
+ assert_nil @items[1]
244
+ assert_nil @items['/two/']
245
+ end
246
+ end
247
+
248
+ def test_pop
249
+ @items.pop
250
+
251
+ assert_equal @one, @items[0]
252
+ assert_equal @one, @items['/one/']
253
+ assert_nil @items[1]
254
+ assert_nil @items['/two/']
255
+ end
256
+
257
+ def test_push
258
+ pushy = Nanoc::Item.new("Pushy", {}, '/pushy/')
259
+ @items.push(pushy)
260
+
261
+ assert_equal @one, @items[0]
262
+ assert_equal @one, @items['/one/']
263
+ assert_equal @two, @items[1]
264
+ assert_equal @two, @items['/two/']
265
+ assert_equal pushy, @items[2]
266
+ assert_equal pushy, @items['/pushy/']
267
+ end
268
+
269
+ def test_reject_bang
270
+ assert_equal @two, @items[1]
271
+ assert_equal @two, @items['/two/']
272
+
273
+ @items.reject! { |i| i.identifier == '/two/' }
274
+
275
+ assert_nil @items[1]
276
+ assert_nil @items['/two/']
277
+ end
278
+
279
+ def test_replace
280
+ max = Nanoc::Item.new("Max", {}, '/max/')
281
+ mona = Nanoc::Item.new('Mona', {}, '/mona/')
282
+
283
+ @items.replace([ max, mona ])
284
+
285
+ assert_nil @items['/one/']
286
+ assert_nil @items['/two/']
287
+
288
+ assert_equal max, @items[0]
289
+ assert_equal max, @items['/max/']
290
+ assert_equal mona, @items[1]
291
+ assert_equal mona, @items['/mona/']
292
+ end
293
+
294
+ if Array.new.respond_to?(:select!)
295
+ def test_select_bang
296
+ assert_equal @two, @items[1]
297
+ assert_equal @two, @items['/two/']
298
+
299
+ @items.select! { |i| i.identifier == '/two/' }
300
+
301
+ assert_nil @items[1]
302
+ assert_nil @items['/one/']
303
+ end
304
+ end
305
+
306
+ def test_shift
307
+ @items.shift
308
+
309
+ assert_equal @two, @items[0]
310
+ assert_equal @two, @items['/two/']
311
+ assert_nil @items['/one/']
312
+ assert_nil @items[1]
313
+ end
314
+
315
+ def test_slice_bang
316
+ @items.slice!(1)
317
+
318
+ assert_equal @one, @items[0]
319
+ assert_equal @one, @items['/one/']
320
+ assert_nil @items[1]
321
+ assert_nil @items['/two/']
322
+ end
323
+
324
+ def test_unshift
325
+ unshifty = Nanoc::Item.new("Unshifty", {}, '/unshifty/')
326
+ @items.unshift(unshifty)
327
+
328
+ assert_equal unshifty, @items[0]
329
+ assert_equal unshifty, @items['/unshifty/']
330
+ assert_equal @one, @items[1]
331
+ assert_equal @one, @items['/one/']
332
+ assert_equal @two, @items[2]
333
+ assert_equal @two, @items['/two/']
334
+ end
335
+
336
+ end
@@ -428,14 +428,9 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase
428
428
  rep.instance_eval { @filter_class = filter_class }
429
429
  def rep.filter_named(name) ; @filter_class ; end
430
430
 
431
- raised = false
432
- begin
431
+ assert_raises_frozen_error do
433
432
  rep.filter(:whatever)
434
- rescue => e
435
- raised = true
436
- assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
437
433
  end
438
- assert raised
439
434
  end
440
435
 
441
436
  def test_filter_should_freeze_content
@@ -451,15 +446,10 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase
451
446
  rep.instance_eval { @filter_class = filter_class }
452
447
  def rep.filter_named(name) ; @filter_class ; end
453
448
 
454
- raised = false
455
- begin
449
+ assert_raises_frozen_error do
456
450
  rep.filter(:erb)
457
451
  rep.filter(:whatever)
458
- rescue => e
459
- raised = true
460
- assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, e.message)
461
452
  end
462
- assert raised
463
453
  end
464
454
 
465
455
  def test_raw_path_should_generate_dependency