nanoc3 3.1.9 → 3.2.0a1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. data/LICENSE +1 -1
  2. data/NEWS.md +0 -50
  3. data/README.md +3 -15
  4. data/bin/nanoc3 +2 -0
  5. data/lib/nanoc3/base/checksummer.rb +40 -0
  6. data/lib/nanoc3/base/code_snippet.rb +30 -12
  7. data/lib/nanoc3/base/compiled_content_cache.rb +86 -0
  8. data/lib/nanoc3/base/compiler.rb +134 -95
  9. data/lib/nanoc3/base/compiler_dsl.rb +12 -11
  10. data/lib/nanoc3/base/core_ext/string.rb +2 -2
  11. data/lib/nanoc3/base/data_source.rb +17 -16
  12. data/lib/nanoc3/base/dependency_tracker.rb +102 -121
  13. data/lib/nanoc3/base/directed_graph.rb +65 -3
  14. data/lib/nanoc3/base/errors.rb +20 -16
  15. data/lib/nanoc3/base/item.rb +58 -50
  16. data/lib/nanoc3/base/item_rep.rb +177 -150
  17. data/lib/nanoc3/base/layout.rb +51 -18
  18. data/lib/nanoc3/base/notification_center.rb +8 -8
  19. data/lib/nanoc3/base/plugin_registry.rb +9 -9
  20. data/lib/nanoc3/base/rule.rb +18 -9
  21. data/lib/nanoc3/base/rule_context.rb +5 -5
  22. data/lib/nanoc3/base/site.rb +135 -47
  23. data/lib/nanoc3/base.rb +21 -19
  24. data/lib/nanoc3/cli/base.rb +51 -74
  25. data/lib/nanoc3/cli/commands/autocompile.rb +3 -0
  26. data/lib/nanoc3/cli/commands/compile.rb +35 -74
  27. data/lib/nanoc3/cli/commands/create_site.rb +17 -5
  28. data/lib/nanoc3/cli/commands/debug.rb +11 -4
  29. data/lib/nanoc3/cli/commands/view.rb +0 -1
  30. data/lib/nanoc3/cli/commands/watch.rb +148 -0
  31. data/lib/nanoc3/cli/commands.rb +1 -0
  32. data/lib/nanoc3/cli/logger.rb +15 -21
  33. data/lib/nanoc3/data_sources/deprecated/twitter.rb +0 -1
  34. data/lib/nanoc3/data_sources/filesystem.rb +11 -40
  35. data/lib/nanoc3/data_sources/filesystem_unified.rb +22 -22
  36. data/lib/nanoc3/extra/auto_compiler.rb +1 -1
  37. data/lib/nanoc3/extra/chick.rb +8 -8
  38. data/lib/nanoc3/extra/deployers/rsync.rb +2 -3
  39. data/lib/nanoc3/extra/validators/links.rb +32 -51
  40. data/lib/nanoc3/extra/validators/w3c.rb +2 -2
  41. data/lib/nanoc3/extra/vcs.rb +1 -1
  42. data/lib/nanoc3/filters/colorize_syntax.rb +15 -19
  43. data/lib/nanoc3/filters/erb.rb +1 -5
  44. data/lib/nanoc3/filters/erubis.rb +1 -5
  45. data/lib/nanoc3/filters/haml.rb +1 -2
  46. data/lib/nanoc3/filters/less.rb +2 -51
  47. data/lib/nanoc3/filters/mustache.rb +21 -0
  48. data/lib/nanoc3/filters/rdiscount.rb +1 -2
  49. data/lib/nanoc3/filters/relativize_paths.rb +3 -2
  50. data/lib/nanoc3/filters/sass.rb +50 -56
  51. data/lib/nanoc3/filters.rb +2 -0
  52. data/lib/nanoc3/helpers/blogging.rb +22 -29
  53. data/lib/nanoc3/helpers/breadcrumbs.rb +1 -1
  54. data/lib/nanoc3/helpers/capturing.rb +1 -1
  55. data/lib/nanoc3/helpers/filtering.rb +1 -1
  56. data/lib/nanoc3/helpers/link_to.rb +10 -21
  57. data/lib/nanoc3/helpers/rendering.rb +5 -24
  58. data/lib/nanoc3/helpers/tagging.rb +6 -6
  59. data/lib/nanoc3/helpers/text.rb +2 -2
  60. data/lib/nanoc3.rb +1 -1
  61. metadata +35 -93
  62. data/.gemtest +0 -0
  63. data/doc/yardoc_templates/default/layout/html/footer.erb +0 -10
  64. data/nanoc3.gemspec +0 -41
  65. data/tasks/clean.rake +0 -11
  66. data/tasks/doc.rake +0 -14
  67. data/tasks/gem.rake +0 -13
  68. data/tasks/test.rake +0 -38
  69. data/test/base/core_ext/array_spec.rb +0 -23
  70. data/test/base/core_ext/hash_spec.rb +0 -41
  71. data/test/base/core_ext/string_spec.rb +0 -27
  72. data/test/base/test_code_snippet.rb +0 -33
  73. data/test/base/test_compiler.rb +0 -410
  74. data/test/base/test_compiler_dsl.rb +0 -121
  75. data/test/base/test_context.rb +0 -33
  76. data/test/base/test_data_source.rb +0 -48
  77. data/test/base/test_dependency_tracker.rb +0 -510
  78. data/test/base/test_directed_graph.rb +0 -91
  79. data/test/base/test_filter.rb +0 -85
  80. data/test/base/test_item.rb +0 -141
  81. data/test/base/test_item_rep.rb +0 -953
  82. data/test/base/test_layout.rb +0 -44
  83. data/test/base/test_notification_center.rb +0 -36
  84. data/test/base/test_plugin.rb +0 -32
  85. data/test/base/test_rule.rb +0 -21
  86. data/test/base/test_rule_context.rb +0 -63
  87. data/test/base/test_site.rb +0 -366
  88. data/test/cli/commands/test_compile.rb +0 -12
  89. data/test/cli/commands/test_create_item.rb +0 -12
  90. data/test/cli/commands/test_create_layout.rb +0 -28
  91. data/test/cli/commands/test_create_site.rb +0 -24
  92. data/test/cli/commands/test_help.rb +0 -12
  93. data/test/cli/commands/test_info.rb +0 -12
  94. data/test/cli/commands/test_update.rb +0 -12
  95. data/test/cli/test_logger.rb +0 -12
  96. data/test/data_sources/test_filesystem.rb +0 -420
  97. data/test/data_sources/test_filesystem_unified.rb +0 -538
  98. data/test/data_sources/test_filesystem_verbose.rb +0 -359
  99. data/test/extra/core_ext/test_enumerable.rb +0 -32
  100. data/test/extra/core_ext/test_time.rb +0 -17
  101. data/test/extra/deployers/test_rsync.rb +0 -234
  102. data/test/extra/test_auto_compiler.rb +0 -482
  103. data/test/extra/test_file_proxy.rb +0 -21
  104. data/test/extra/test_vcs.rb +0 -24
  105. data/test/extra/validators/test_links.rb +0 -53
  106. data/test/extra/validators/test_w3c.rb +0 -49
  107. data/test/filters/test_bluecloth.rb +0 -20
  108. data/test/filters/test_coderay.rb +0 -46
  109. data/test/filters/test_colorize_syntax.rb +0 -84
  110. data/test/filters/test_erb.rb +0 -72
  111. data/test/filters/test_erubis.rb +0 -72
  112. data/test/filters/test_haml.rb +0 -98
  113. data/test/filters/test_kramdown.rb +0 -20
  114. data/test/filters/test_less.rb +0 -118
  115. data/test/filters/test_markaby.rb +0 -26
  116. data/test/filters/test_maruku.rb +0 -20
  117. data/test/filters/test_rainpress.rb +0 -31
  118. data/test/filters/test_rdiscount.rb +0 -33
  119. data/test/filters/test_rdoc.rb +0 -18
  120. data/test/filters/test_redcloth.rb +0 -20
  121. data/test/filters/test_relativize_paths.rb +0 -231
  122. data/test/filters/test_rubypants.rb +0 -20
  123. data/test/filters/test_sass.rb +0 -235
  124. data/test/gem_loader.rb +0 -11
  125. data/test/helper.rb +0 -99
  126. data/test/helpers/test_blogging.rb +0 -808
  127. data/test/helpers/test_breadcrumbs.rb +0 -83
  128. data/test/helpers/test_capturing.rb +0 -42
  129. data/test/helpers/test_filtering.rb +0 -108
  130. data/test/helpers/test_html_escape.rb +0 -18
  131. data/test/helpers/test_link_to.rb +0 -251
  132. data/test/helpers/test_rendering.rb +0 -109
  133. data/test/helpers/test_tagging.rb +0 -89
  134. data/test/helpers/test_text.rb +0 -26
  135. data/test/helpers/test_xml_sitemap.rb +0 -69
  136. data/test/tasks/test_clean.rb +0 -71
@@ -1,420 +0,0 @@
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