nanoc3 3.1.7 → 3.1.8

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