nanoc3 3.1.7 → 3.1.8

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 (91) hide show
  1. data/.gemtest +0 -0
  2. data/LICENSE +1 -1
  3. data/NEWS.md +9 -0
  4. data/doc/yardoc_templates/default/layout/html/footer.erb +10 -0
  5. data/lib/nanoc3/base/item.rb +1 -1
  6. data/lib/nanoc3/base/item_rep.rb +1 -0
  7. data/lib/nanoc3/base/layout.rb +1 -1
  8. data/lib/nanoc3/cli/base.rb +4 -2
  9. data/lib/nanoc3/cli/commands/view.rb +1 -0
  10. data/lib/nanoc3/data_sources/filesystem.rb +25 -6
  11. data/lib/nanoc3/data_sources/filesystem_unified.rb +5 -5
  12. data/lib/nanoc3/extra/validators/links.rb +1 -1
  13. data/lib/nanoc3/filters/rdiscount.rb +2 -1
  14. data/lib/nanoc3/filters/sass.rb +20 -8
  15. data/lib/nanoc3/filters/sass.rb.orig +75 -0
  16. data/lib/nanoc3.rb +1 -1
  17. data/nanoc3.gemspec +41 -0
  18. data/tasks/clean.rake +11 -0
  19. data/tasks/doc.rake +14 -0
  20. data/tasks/gem.rake +13 -0
  21. data/tasks/test.rake +38 -0
  22. data/test/base/core_ext/array_spec.rb +23 -0
  23. data/test/base/core_ext/hash_spec.rb +41 -0
  24. data/test/base/core_ext/string_spec.rb +27 -0
  25. data/test/base/test_code_snippet.rb +33 -0
  26. data/test/base/test_compiler.rb +410 -0
  27. data/test/base/test_compiler_dsl.rb +121 -0
  28. data/test/base/test_context.rb +33 -0
  29. data/test/base/test_data_source.rb +48 -0
  30. data/test/base/test_dependency_tracker.rb +510 -0
  31. data/test/base/test_directed_graph.rb +91 -0
  32. data/test/base/test_filter.rb +85 -0
  33. data/test/base/test_item.rb +141 -0
  34. data/test/base/test_item_rep.rb +953 -0
  35. data/test/base/test_layout.rb +44 -0
  36. data/test/base/test_notification_center.rb +36 -0
  37. data/test/base/test_plugin.rb +32 -0
  38. data/test/base/test_rule.rb +21 -0
  39. data/test/base/test_rule_context.rb +63 -0
  40. data/test/base/test_site.rb +366 -0
  41. data/test/cli/commands/test_compile.rb +12 -0
  42. data/test/cli/commands/test_create_item.rb +12 -0
  43. data/test/cli/commands/test_create_layout.rb +28 -0
  44. data/test/cli/commands/test_create_site.rb +24 -0
  45. data/test/cli/commands/test_help.rb +12 -0
  46. data/test/cli/commands/test_info.rb +12 -0
  47. data/test/cli/commands/test_update.rb +12 -0
  48. data/test/cli/test_logger.rb +12 -0
  49. data/test/data_sources/test_filesystem.rb +420 -0
  50. data/test/data_sources/test_filesystem_unified.rb +538 -0
  51. data/test/data_sources/test_filesystem_verbose.rb +359 -0
  52. data/test/extra/core_ext/test_enumerable.rb +32 -0
  53. data/test/extra/core_ext/test_time.rb +17 -0
  54. data/test/extra/deployers/test_rsync.rb +234 -0
  55. data/test/extra/test_auto_compiler.rb +482 -0
  56. data/test/extra/test_file_proxy.rb +21 -0
  57. data/test/extra/test_vcs.rb +24 -0
  58. data/test/extra/validators/test_links.rb +53 -0
  59. data/test/extra/validators/test_w3c.rb +49 -0
  60. data/test/filters/test_bluecloth.rb +20 -0
  61. data/test/filters/test_coderay.rb +46 -0
  62. data/test/filters/test_colorize_syntax.rb +56 -0
  63. data/test/filters/test_erb.rb +72 -0
  64. data/test/filters/test_erubis.rb +72 -0
  65. data/test/filters/test_haml.rb +98 -0
  66. data/test/filters/test_kramdown.rb +20 -0
  67. data/test/filters/test_less.rb +59 -0
  68. data/test/filters/test_markaby.rb +26 -0
  69. data/test/filters/test_maruku.rb +20 -0
  70. data/test/filters/test_rainpress.rb +31 -0
  71. data/test/filters/test_rdiscount.rb +33 -0
  72. data/test/filters/test_rdoc.rb +18 -0
  73. data/test/filters/test_redcloth.rb +20 -0
  74. data/test/filters/test_relativize_paths.rb +231 -0
  75. data/test/filters/test_rubypants.rb +20 -0
  76. data/test/filters/test_sass.rb +170 -0
  77. data/test/filters/test_sass.rb.orig +103 -0
  78. data/test/gem_loader.rb +11 -0
  79. data/test/helper.rb +99 -0
  80. data/test/helpers/test_blogging.rb +808 -0
  81. data/test/helpers/test_breadcrumbs.rb +83 -0
  82. data/test/helpers/test_capturing.rb +42 -0
  83. data/test/helpers/test_filtering.rb +108 -0
  84. data/test/helpers/test_html_escape.rb +18 -0
  85. data/test/helpers/test_link_to.rb +251 -0
  86. data/test/helpers/test_rendering.rb +109 -0
  87. data/test/helpers/test_tagging.rb +89 -0
  88. data/test/helpers/test_text.rb +26 -0
  89. data/test/helpers/test_xml_sitemap.rb +69 -0
  90. data/test/tasks/test_clean.rb +71 -0
  91. metadata +83 -8
@@ -0,0 +1,420 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/helper'
4
+
5
+ class Nanoc3::DataSources::FilesystemTest < MiniTest::Unit::TestCase
6
+
7
+ include Nanoc3::TestHelpers
8
+
9
+ class SampleFilesystemDataSource < Nanoc3::DataSource
10
+ include Nanoc3::DataSources::Filesystem
11
+ end
12
+
13
+ def test_setup
14
+ # Create data source
15
+ data_source = SampleFilesystemDataSource.new(nil, nil, nil, nil)
16
+
17
+ # Remove files to make sure they are recreated
18
+ FileUtils.rm_rf('content')
19
+ FileUtils.rm_rf('layouts/default')
20
+ FileUtils.rm_rf('lib/default.rb')
21
+
22
+ # Mock VCS
23
+ vcs = mock
24
+ vcs.expects(:add).times(3) # One time for each directory
25
+ data_source.vcs = vcs
26
+
27
+ # Recreate files
28
+ data_source.setup
29
+
30
+ # Ensure essential files have been recreated
31
+ assert(File.directory?('content/'))
32
+ assert(File.directory?('layouts/'))
33
+ assert(File.directory?('lib/'))
34
+
35
+ # Ensure no non-essential files have been recreated
36
+ assert(!File.file?('content/index.html'))
37
+ assert(!File.file?('layouts/default.html'))
38
+ assert(!File.file?('lib/default.rb'))
39
+ end
40
+
41
+ def test_items
42
+ # Create data source
43
+ data_source = SampleFilesystemDataSource.new(nil, nil, nil, nil)
44
+
45
+ # Check
46
+ data_source.expects(:load_objects).with('content', 'item', Nanoc3::Item)
47
+ data_source.items
48
+ end
49
+
50
+ def test_layouts
51
+ # Create data source
52
+ data_source = SampleFilesystemDataSource.new(nil, nil, nil, nil)
53
+
54
+ # Check
55
+ data_source.expects(:load_objects).with('layouts', 'layout', Nanoc3::Layout)
56
+ data_source.layouts
57
+ end
58
+
59
+ def test_create_item
60
+ # Create data source
61
+ data_source = SampleFilesystemDataSource.new(nil, nil, nil, nil)
62
+
63
+ # Check
64
+ data_source.expects(:create_object).with('content', 'the content', 'the attributes', 'the identifier', {})
65
+ data_source.create_item('the content', 'the attributes', 'the identifier')
66
+ end
67
+
68
+ def test_create_layout
69
+ # Create data source
70
+ data_source = SampleFilesystemDataSource.new(nil, nil, nil, nil)
71
+
72
+ # Check
73
+ data_source.expects(:create_object).with('layouts', 'the content', 'the attributes', 'the identifier', {})
74
+ data_source.create_layout('the content', 'the attributes', 'the identifier')
75
+ end
76
+
77
+ def test_all_split_files_in_allowing_periods_in_identifiers
78
+ # Create data source
79
+ data_source = Nanoc3::DataSources::FilesystemCompact.new(nil, nil, nil, { :allow_periods_in_identifiers => true })
80
+
81
+ # Write sample files
82
+ FileUtils.mkdir_p('foo')
83
+ %w( foo.html foo.yaml bar.entry.html foo/qux.yaml ).each do |filename|
84
+ File.open(filename, 'w') { |io| io.write('test') }
85
+ end
86
+
87
+ # Write stray files
88
+ %w( foo.html~ foo.yaml.orig bar.entry.html.bak ).each do |filename|
89
+ File.open(filename, 'w') { |io| io.write('test') }
90
+ end
91
+
92
+ # Get all files
93
+ output_expected = {
94
+ './foo' => [ 'yaml', 'html' ],
95
+ './bar.entry' => [ nil, 'html' ],
96
+ './foo/qux' => [ 'yaml', nil ]
97
+ }
98
+ output_actual = data_source.send :all_split_files_in, '.'
99
+
100
+ # Check
101
+ assert_equal output_expected, output_actual
102
+ end
103
+
104
+ def test_all_split_files_in_disallowing_periods_in_identifiers
105
+ # Create data source
106
+ data_source = Nanoc3::DataSources::FilesystemCompact.new(nil, nil, nil, nil)
107
+
108
+ # Write sample files
109
+ FileUtils.mkdir_p('foo')
110
+ %w( foo.html foo.yaml bar.html.erb foo/qux.yaml ).each do |filename|
111
+ File.open(filename, 'w') { |io| io.write('test') }
112
+ end
113
+
114
+ # Write stray files
115
+ %w( foo.html~ foo.yaml.orig bar.entry.html.bak ).each do |filename|
116
+ File.open(filename, 'w') { |io| io.write('test') }
117
+ end
118
+
119
+ # Get all files
120
+ output_expected = {
121
+ './foo' => [ 'yaml', 'html' ],
122
+ './bar' => [ nil, 'html.erb' ],
123
+ './foo/qux' => [ 'yaml', nil ]
124
+ }
125
+ output_actual = data_source.send :all_split_files_in, '.'
126
+
127
+ # Check
128
+ assert_equal output_expected, output_actual
129
+ end
130
+
131
+ def test_all_split_files_in_with_multiple_dirs
132
+ # Create data source
133
+ data_source = Nanoc3::DataSources::FilesystemCompact.new(nil, nil, nil, nil)
134
+
135
+ # Write sample files
136
+ %w( aaa/foo.html bbb/foo.html ccc/foo.html ).each do |filename|
137
+ FileUtils.mkdir_p(File.dirname(filename))
138
+ File.open(filename, 'w') { |io| io.write('test') }
139
+ end
140
+
141
+ # Check
142
+ expected = {
143
+ './aaa/foo' => [ nil, 'html' ],
144
+ './bbb/foo' => [ nil, 'html' ],
145
+ './ccc/foo' => [ nil, 'html' ]
146
+ }
147
+ assert_equal expected, data_source.send(:all_split_files_in, '.')
148
+ end
149
+
150
+ def test_all_split_files_in_with_multiple_content_files
151
+ # Create data source
152
+ data_source = Nanoc3::DataSources::FilesystemCompact.new(nil, nil, nil, nil)
153
+
154
+ # Write sample files
155
+ %w( foo.html foo.xhtml foo.txt foo.yaml bar.html qux.yaml ).each do |filename|
156
+ File.open(filename, 'w') { |io| io.write('test') }
157
+ end
158
+
159
+ # Check
160
+ assert_raises RuntimeError do
161
+ data_source.send(:all_split_files_in, '.')
162
+ end
163
+ end
164
+
165
+ def test_basename_of_allowing_periods_in_identifiers
166
+ # Create data source
167
+ data_source = Nanoc3::DataSources::FilesystemCompact.new(nil, nil, nil, { :allow_periods_in_identifiers => true })
168
+
169
+ # Get input and expected output
170
+ expected = {
171
+ '/' => '/',
172
+ '/foo' => '/foo',
173
+ '/foo.html' => '/foo',
174
+ '/foo.xyz.html' => '/foo.xyz',
175
+ '/foo/' => '/foo/',
176
+ '/foo.xyz/' => '/foo.xyz/',
177
+ '/foo/bar' => '/foo/bar',
178
+ '/foo/bar.html' => '/foo/bar',
179
+ '/foo/bar.xyz.html' => '/foo/bar.xyz',
180
+ '/foo/bar/' => '/foo/bar/',
181
+ '/foo/bar.xyz/' => '/foo/bar.xyz/',
182
+ '/foo.xyz/bar.xyz/' => '/foo.xyz/bar.xyz/'
183
+ }
184
+
185
+ # Check
186
+ expected.each_pair do |input, expected_output|
187
+ actual_output = data_source.send(:basename_of, input)
188
+ assert_equal(
189
+ expected_output, actual_output,
190
+ "basename_of(#{input.inspect}) should equal #{expected_output.inspect}, not #{actual_output.inspect}"
191
+ )
192
+ end
193
+ end
194
+
195
+ def test_basename_of_disallowing_periods_in_identifiers
196
+ # Create data source
197
+ data_source = Nanoc3::DataSources::FilesystemCompact.new(nil, nil, nil, nil)
198
+
199
+ # Get input and expected output
200
+ expected = {
201
+ '/' => '/',
202
+ '/foo' => '/foo',
203
+ '/foo.html' => '/foo',
204
+ '/foo.xyz.html' => '/foo',
205
+ '/foo/' => '/foo/',
206
+ '/foo.xyz/' => '/foo.xyz/',
207
+ '/foo/bar' => '/foo/bar',
208
+ '/foo/bar.html' => '/foo/bar',
209
+ '/foo/bar.xyz.html' => '/foo/bar',
210
+ '/foo/bar/' => '/foo/bar/',
211
+ '/foo/bar.xyz/' => '/foo/bar.xyz/',
212
+ '/foo.xyz/bar.xyz/' => '/foo.xyz/bar.xyz/'
213
+ }
214
+
215
+ # Check
216
+ expected.each_pair do |input, expected_output|
217
+ actual_output = data_source.send(:basename_of, input)
218
+ assert_equal(
219
+ expected_output, actual_output,
220
+ "basename_of(#{input.inspect}) should equal #{expected_output.inspect}, not #{actual_output.inspect}"
221
+ )
222
+ end
223
+ end
224
+
225
+ def test_ext_of_allowing_periods_in_identifiers
226
+ # Create data source
227
+ data_source = Nanoc3::DataSources::FilesystemCompact.new(nil, nil, nil, { :allow_periods_in_identifiers => true })
228
+
229
+ # Get input and expected output
230
+ expected = {
231
+ '/' => '',
232
+ '/foo' => '',
233
+ '/foo.html' => '.html',
234
+ '/foo.xyz.html' => '.html',
235
+ '/foo/' => '',
236
+ '/foo.xyz/' => '',
237
+ '/foo/bar' => '',
238
+ '/foo/bar.html' => '.html',
239
+ '/foo/bar.xyz.html' => '.html',
240
+ '/foo/bar/' => '',
241
+ '/foo/bar.xyz/' => '',
242
+ '/foo.xyz/bar.xyz/' => ''
243
+ }
244
+
245
+ # Check
246
+ expected.each_pair do |input, expected_output|
247
+ actual_output = data_source.send(:ext_of, input)
248
+ assert_equal(
249
+ expected_output, actual_output,
250
+ "basename_of(#{input.inspect}) should equal #{expected_output.inspect}, not #{actual_output.inspect}"
251
+ )
252
+ end
253
+ end
254
+
255
+ def test_ext_of_disallowing_periods_in_identifiers
256
+ # Create data source
257
+ data_source = Nanoc3::DataSources::FilesystemCompact.new(nil, nil, nil, nil)
258
+
259
+ # Get input and expected output
260
+ expected = {
261
+ '/' => '',
262
+ '/foo' => '',
263
+ '/foo.html' => '.html',
264
+ '/foo.xyz.html' => '.xyz.html',
265
+ '/foo/' => '',
266
+ '/foo.xyz/' => '',
267
+ '/foo/bar' => '',
268
+ '/foo/bar.html' => '.html',
269
+ '/foo/bar.xyz.html' => '.xyz.html',
270
+ '/foo/bar/' => '',
271
+ '/foo/bar.xyz/' => '',
272
+ '/foo.xyz/bar.xyz/' => ''
273
+ }
274
+
275
+ # Check
276
+ expected.each_pair do |input, expected_output|
277
+ actual_output = data_source.send(:ext_of, input)
278
+ assert_equal(
279
+ expected_output, actual_output,
280
+ "basename_of(#{input.inspect}) should equal #{expected_output.inspect}, not #{actual_output.inspect}"
281
+ )
282
+ end
283
+ end
284
+
285
+ def test_parse_embedded_invalid_2
286
+ # Create a file
287
+ File.open('test.html', 'w') do |io|
288
+ io.write "-----\n"
289
+ io.write "blah blah\n"
290
+ end
291
+
292
+ # Create data source
293
+ data_source = Nanoc3::DataSources::FilesystemCombined.new(nil, nil, nil, nil)
294
+
295
+ # Parse it
296
+ assert_raises(RuntimeError) do
297
+ data_source.instance_eval { parse('test.html', nil, 'foobar') }
298
+ end
299
+ end
300
+
301
+ def test_parse_embedded_separators_but_not_metadata
302
+ # Create a file
303
+ File.open('test.html', 'w') do |io|
304
+ io.write "blah blah\n"
305
+ io.write "-----\n"
306
+ io.write "blah blah\n"
307
+ end
308
+
309
+ # Create data source
310
+ data_source = Nanoc3::DataSources::FilesystemCombined.new(nil, nil, nil, nil)
311
+
312
+ # Parse it
313
+ result = data_source.instance_eval { parse('test.html', nil, 'foobar') }
314
+ assert_equal(File.read('test.html'), result[1])
315
+ assert_equal({}, result[0])
316
+ end
317
+
318
+ def test_parse_embedded_full_meta
319
+ # Create a file
320
+ File.open('test.html', 'w') do |io|
321
+ io.write "-----\n"
322
+ io.write "foo: bar\n"
323
+ io.write "-----\n"
324
+ io.write "blah blah\n"
325
+ end
326
+
327
+ # Create data source
328
+ data_source = Nanoc3::DataSources::FilesystemCombined.new(nil, nil, nil, nil)
329
+
330
+ # Parse it
331
+ result = data_source.instance_eval { parse('test.html', nil, 'foobar') }
332
+ assert_equal({ 'foo' => 'bar' }, result[0])
333
+ assert_equal('blah blah', result[1])
334
+ end
335
+
336
+ def test_parse_embedded_with_extra_spaces
337
+ # Create a file
338
+ File.open('test.html', 'w') do |io|
339
+ io.write "----- \n"
340
+ io.write "foo: bar\n"
341
+ io.write "-----\t\t\t\t\t\n"
342
+ io.write "blah blah\n"
343
+ end
344
+
345
+ # Create data source
346
+ data_source = Nanoc3::DataSources::FilesystemCombined.new(nil, nil, nil, nil)
347
+
348
+ # Parse it
349
+ result = data_source.instance_eval { parse('test.html', nil, 'foobar') }
350
+ assert_equal({ 'foo' => 'bar' }, result[0])
351
+ assert_equal('blah blah', result[1])
352
+ end
353
+
354
+ def test_parse_embedded_empty_meta
355
+ # Create a file
356
+ File.open('test.html', 'w') do |io|
357
+ io.write "-----\n"
358
+ io.write "-----\n"
359
+ io.write "blah blah\n"
360
+ end
361
+
362
+ # Create data source
363
+ data_source = Nanoc3::DataSources::FilesystemCombined.new(nil, nil, nil, nil)
364
+
365
+ # Parse it
366
+ result = data_source.instance_eval { parse('test.html', nil, 'foobar') }
367
+ assert_equal({}, result[0])
368
+ assert_equal('blah blah', result[1])
369
+ end
370
+
371
+ def test_parse_embedded_no_meta
372
+ content = "blah\n" \
373
+ "blah blah blah\n" \
374
+ "blah blah\n"
375
+
376
+ # Create a file
377
+ File.open('test.html', 'w') { |io| io.write(content) }
378
+
379
+ # Create data source
380
+ data_source = Nanoc3::DataSources::FilesystemCombined.new(nil, nil, nil, nil)
381
+
382
+ # Parse it
383
+ result = data_source.instance_eval { parse('test.html', nil, 'foobar') }
384
+ assert_equal({}, result[0])
385
+ assert_equal(content, result[1])
386
+ end
387
+
388
+ def test_parse_embedded_diff
389
+ content = \
390
+ "--- a/foo\n" \
391
+ "+++ b/foo\n" \
392
+ "blah blah\n"
393
+
394
+ # Create a file
395
+ File.open('test.html', 'w') { |io| io.write(content) }
396
+
397
+ # Create data source
398
+ data_source = Nanoc3::DataSources::FilesystemCombined.new(nil, nil, nil, nil)
399
+
400
+ # Parse it
401
+ result = data_source.instance_eval { parse('test.html', nil, 'foobar') }
402
+ assert_equal({}, result[0])
403
+ assert_equal(content, result[1])
404
+ end
405
+
406
+ def test_parse_external
407
+ # Create a file
408
+ File.open('test.html', 'w') { |io| io.write("blah blah") }
409
+ File.open('test.yaml', 'w') { |io| io.write("foo: bar") }
410
+
411
+ # Create data source
412
+ data_source = Nanoc3::DataSources::FilesystemCombined.new(nil, nil, nil, nil)
413
+
414
+ # Parse it
415
+ result = data_source.instance_eval { parse('test.html', 'test.yaml', 'foobar') }
416
+ assert_equal({ "foo" => "bar"}, result[0])
417
+ assert_equal("blah blah", result[1])
418
+ end
419
+
420
+ end