nanoc 3.5.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
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