nanoc3 3.2.4 → 3.3.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 (211) hide show
  1. metadata +14 -313
  2. data/.gemtest +0 -0
  3. data/ChangeLog +0 -3
  4. data/Gemfile +0 -29
  5. data/LICENSE +0 -19
  6. data/NEWS.md +0 -449
  7. data/README.md +0 -108
  8. data/Rakefile +0 -14
  9. data/bin/nanoc3 +0 -12
  10. data/doc/yardoc_templates/default/layout/html/footer.erb +0 -10
  11. data/lib/nanoc3.rb +0 -28
  12. data/lib/nanoc3/base.rb +0 -49
  13. data/lib/nanoc3/base/compilation/checksum_store.rb +0 -57
  14. data/lib/nanoc3/base/compilation/compiled_content_cache.rb +0 -62
  15. data/lib/nanoc3/base/compilation/compiler.rb +0 -455
  16. data/lib/nanoc3/base/compilation/compiler_dsl.rb +0 -214
  17. data/lib/nanoc3/base/compilation/dependency_tracker.rb +0 -196
  18. data/lib/nanoc3/base/compilation/filter.rb +0 -165
  19. data/lib/nanoc3/base/compilation/item_rep_proxy.rb +0 -102
  20. data/lib/nanoc3/base/compilation/item_rep_recorder_proxy.rb +0 -88
  21. data/lib/nanoc3/base/compilation/outdatedness_checker.rb +0 -223
  22. data/lib/nanoc3/base/compilation/outdatedness_reasons.rb +0 -46
  23. data/lib/nanoc3/base/compilation/rule.rb +0 -73
  24. data/lib/nanoc3/base/compilation/rule_context.rb +0 -84
  25. data/lib/nanoc3/base/compilation/rule_memory_calculator.rb +0 -40
  26. data/lib/nanoc3/base/compilation/rule_memory_store.rb +0 -53
  27. data/lib/nanoc3/base/compilation/rules_collection.rb +0 -231
  28. data/lib/nanoc3/base/context.rb +0 -47
  29. data/lib/nanoc3/base/core_ext.rb +0 -6
  30. data/lib/nanoc3/base/core_ext/array.rb +0 -62
  31. data/lib/nanoc3/base/core_ext/hash.rb +0 -63
  32. data/lib/nanoc3/base/core_ext/pathname.rb +0 -26
  33. data/lib/nanoc3/base/core_ext/string.rb +0 -46
  34. data/lib/nanoc3/base/directed_graph.rb +0 -275
  35. data/lib/nanoc3/base/errors.rb +0 -174
  36. data/lib/nanoc3/base/memoization.rb +0 -67
  37. data/lib/nanoc3/base/notification_center.rb +0 -84
  38. data/lib/nanoc3/base/ordered_hash.rb +0 -200
  39. data/lib/nanoc3/base/plugin_registry.rb +0 -165
  40. data/lib/nanoc3/base/result_data/item_rep.rb +0 -488
  41. data/lib/nanoc3/base/source_data/code_snippet.rb +0 -58
  42. data/lib/nanoc3/base/source_data/configuration.rb +0 -24
  43. data/lib/nanoc3/base/source_data/data_source.rb +0 -234
  44. data/lib/nanoc3/base/source_data/item.rb +0 -301
  45. data/lib/nanoc3/base/source_data/layout.rb +0 -130
  46. data/lib/nanoc3/base/source_data/site.rb +0 -361
  47. data/lib/nanoc3/base/store.rb +0 -135
  48. data/lib/nanoc3/cli.rb +0 -133
  49. data/lib/nanoc3/cli/command.rb +0 -139
  50. data/lib/nanoc3/cli/commands/autocompile.rb +0 -60
  51. data/lib/nanoc3/cli/commands/compile.rb +0 -280
  52. data/lib/nanoc3/cli/commands/create_item.rb +0 -62
  53. data/lib/nanoc3/cli/commands/create_layout.rb +0 -75
  54. data/lib/nanoc3/cli/commands/create_site.rb +0 -410
  55. data/lib/nanoc3/cli/commands/debug.rb +0 -119
  56. data/lib/nanoc3/cli/commands/info.rb +0 -98
  57. data/lib/nanoc3/cli/commands/nanoc.rb +0 -37
  58. data/lib/nanoc3/cli/commands/update.rb +0 -72
  59. data/lib/nanoc3/cli/commands/view.rb +0 -84
  60. data/lib/nanoc3/cli/commands/watch.rb +0 -125
  61. data/lib/nanoc3/cli/error_handler.rb +0 -193
  62. data/lib/nanoc3/cli/logger.rb +0 -91
  63. data/lib/nanoc3/data_sources.rb +0 -29
  64. data/lib/nanoc3/data_sources/deprecated/delicious.rb +0 -42
  65. data/lib/nanoc3/data_sources/deprecated/last_fm.rb +0 -87
  66. data/lib/nanoc3/data_sources/deprecated/twitter.rb +0 -38
  67. data/lib/nanoc3/data_sources/filesystem.rb +0 -299
  68. data/lib/nanoc3/data_sources/filesystem_unified.rb +0 -116
  69. data/lib/nanoc3/data_sources/filesystem_verbose.rb +0 -86
  70. data/lib/nanoc3/extra.rb +0 -22
  71. data/lib/nanoc3/extra/auto_compiler.rb +0 -103
  72. data/lib/nanoc3/extra/chick.rb +0 -125
  73. data/lib/nanoc3/extra/core_ext.rb +0 -4
  74. data/lib/nanoc3/extra/core_ext/enumerable.rb +0 -33
  75. data/lib/nanoc3/extra/core_ext/time.rb +0 -19
  76. data/lib/nanoc3/extra/deployers.rb +0 -11
  77. data/lib/nanoc3/extra/deployers/rsync.rb +0 -114
  78. data/lib/nanoc3/extra/file_proxy.rb +0 -40
  79. data/lib/nanoc3/extra/validators.rb +0 -12
  80. data/lib/nanoc3/extra/validators/links.rb +0 -264
  81. data/lib/nanoc3/extra/validators/w3c.rb +0 -95
  82. data/lib/nanoc3/extra/vcs.rb +0 -66
  83. data/lib/nanoc3/extra/vcses.rb +0 -17
  84. data/lib/nanoc3/extra/vcses/bazaar.rb +0 -25
  85. data/lib/nanoc3/extra/vcses/dummy.rb +0 -24
  86. data/lib/nanoc3/extra/vcses/git.rb +0 -25
  87. data/lib/nanoc3/extra/vcses/mercurial.rb +0 -25
  88. data/lib/nanoc3/extra/vcses/subversion.rb +0 -25
  89. data/lib/nanoc3/filters.rb +0 -53
  90. data/lib/nanoc3/filters/asciidoc.rb +0 -38
  91. data/lib/nanoc3/filters/bluecloth.rb +0 -19
  92. data/lib/nanoc3/filters/coderay.rb +0 -21
  93. data/lib/nanoc3/filters/colorize_syntax.rb +0 -261
  94. data/lib/nanoc3/filters/erb.rb +0 -35
  95. data/lib/nanoc3/filters/erubis.rb +0 -27
  96. data/lib/nanoc3/filters/haml.rb +0 -27
  97. data/lib/nanoc3/filters/kramdown.rb +0 -20
  98. data/lib/nanoc3/filters/less.rb +0 -53
  99. data/lib/nanoc3/filters/markaby.rb +0 -20
  100. data/lib/nanoc3/filters/maruku.rb +0 -20
  101. data/lib/nanoc3/filters/mustache.rb +0 -24
  102. data/lib/nanoc3/filters/rainpress.rb +0 -19
  103. data/lib/nanoc3/filters/rdiscount.rb +0 -22
  104. data/lib/nanoc3/filters/rdoc.rb +0 -33
  105. data/lib/nanoc3/filters/redcarpet.rb +0 -27
  106. data/lib/nanoc3/filters/redcloth.rb +0 -47
  107. data/lib/nanoc3/filters/relativize_paths.rb +0 -45
  108. data/lib/nanoc3/filters/rubypants.rb +0 -20
  109. data/lib/nanoc3/filters/sass.rb +0 -66
  110. data/lib/nanoc3/filters/slim.rb +0 -25
  111. data/lib/nanoc3/filters/typogruby.rb +0 -23
  112. data/lib/nanoc3/filters/uglify_js.rb +0 -42
  113. data/lib/nanoc3/helpers.rb +0 -16
  114. data/lib/nanoc3/helpers/blogging.rb +0 -319
  115. data/lib/nanoc3/helpers/breadcrumbs.rb +0 -40
  116. data/lib/nanoc3/helpers/capturing.rb +0 -138
  117. data/lib/nanoc3/helpers/filtering.rb +0 -50
  118. data/lib/nanoc3/helpers/html_escape.rb +0 -55
  119. data/lib/nanoc3/helpers/link_to.rb +0 -151
  120. data/lib/nanoc3/helpers/rendering.rb +0 -140
  121. data/lib/nanoc3/helpers/tagging.rb +0 -71
  122. data/lib/nanoc3/helpers/text.rb +0 -44
  123. data/lib/nanoc3/helpers/xml_sitemap.rb +0 -76
  124. data/lib/nanoc3/tasks.rb +0 -10
  125. data/lib/nanoc3/tasks/clean.rake +0 -16
  126. data/lib/nanoc3/tasks/clean.rb +0 -29
  127. data/lib/nanoc3/tasks/deploy/rsync.rake +0 -14
  128. data/lib/nanoc3/tasks/validate.rake +0 -92
  129. data/nanoc3.gemspec +0 -49
  130. data/tasks/doc.rake +0 -16
  131. data/tasks/test.rake +0 -44
  132. data/test/base/core_ext/array_spec.rb +0 -73
  133. data/test/base/core_ext/hash_spec.rb +0 -98
  134. data/test/base/core_ext/pathname_spec.rb +0 -27
  135. data/test/base/core_ext/string_spec.rb +0 -37
  136. data/test/base/test_checksum_store.rb +0 -35
  137. data/test/base/test_code_snippet.rb +0 -31
  138. data/test/base/test_compiler.rb +0 -316
  139. data/test/base/test_compiler_dsl.rb +0 -161
  140. data/test/base/test_context.rb +0 -31
  141. data/test/base/test_data_source.rb +0 -46
  142. data/test/base/test_dependency_tracker.rb +0 -262
  143. data/test/base/test_directed_graph.rb +0 -283
  144. data/test/base/test_filter.rb +0 -83
  145. data/test/base/test_item.rb +0 -179
  146. data/test/base/test_item_rep.rb +0 -553
  147. data/test/base/test_layout.rb +0 -59
  148. data/test/base/test_memoization.rb +0 -90
  149. data/test/base/test_notification_center.rb +0 -34
  150. data/test/base/test_outdatedness_checker.rb +0 -394
  151. data/test/base/test_plugin.rb +0 -30
  152. data/test/base/test_rule.rb +0 -19
  153. data/test/base/test_rule_context.rb +0 -65
  154. data/test/base/test_site.rb +0 -190
  155. data/test/cli/commands/test_compile.rb +0 -33
  156. data/test/cli/commands/test_create_item.rb +0 -14
  157. data/test/cli/commands/test_create_layout.rb +0 -28
  158. data/test/cli/commands/test_create_site.rb +0 -24
  159. data/test/cli/commands/test_help.rb +0 -12
  160. data/test/cli/commands/test_info.rb +0 -11
  161. data/test/cli/commands/test_update.rb +0 -10
  162. data/test/cli/test_cli.rb +0 -102
  163. data/test/cli/test_error_handler.rb +0 -29
  164. data/test/cli/test_logger.rb +0 -10
  165. data/test/data_sources/test_filesystem.rb +0 -433
  166. data/test/data_sources/test_filesystem_unified.rb +0 -536
  167. data/test/data_sources/test_filesystem_verbose.rb +0 -357
  168. data/test/extra/core_ext/test_enumerable.rb +0 -30
  169. data/test/extra/core_ext/test_time.rb +0 -15
  170. data/test/extra/deployers/test_rsync.rb +0 -232
  171. data/test/extra/test_auto_compiler.rb +0 -417
  172. data/test/extra/test_file_proxy.rb +0 -19
  173. data/test/extra/test_vcs.rb +0 -22
  174. data/test/extra/validators/test_links.rb +0 -51
  175. data/test/extra/validators/test_w3c.rb +0 -47
  176. data/test/filters/test_asciidoc.rb +0 -22
  177. data/test/filters/test_bluecloth.rb +0 -18
  178. data/test/filters/test_coderay.rb +0 -44
  179. data/test/filters/test_colorize_syntax.rb +0 -283
  180. data/test/filters/test_erb.rb +0 -99
  181. data/test/filters/test_erubis.rb +0 -70
  182. data/test/filters/test_haml.rb +0 -96
  183. data/test/filters/test_kramdown.rb +0 -18
  184. data/test/filters/test_less.rb +0 -113
  185. data/test/filters/test_markaby.rb +0 -24
  186. data/test/filters/test_maruku.rb +0 -18
  187. data/test/filters/test_mustache.rb +0 -25
  188. data/test/filters/test_rainpress.rb +0 -29
  189. data/test/filters/test_rdiscount.rb +0 -31
  190. data/test/filters/test_rdoc.rb +0 -18
  191. data/test/filters/test_redcarpet.rb +0 -63
  192. data/test/filters/test_redcloth.rb +0 -33
  193. data/test/filters/test_relativize_paths.rb +0 -332
  194. data/test/filters/test_rubypants.rb +0 -18
  195. data/test/filters/test_sass.rb +0 -229
  196. data/test/filters/test_slim.rb +0 -35
  197. data/test/filters/test_typogruby.rb +0 -21
  198. data/test/filters/test_uglify_js.rb +0 -30
  199. data/test/gem_loader.rb +0 -11
  200. data/test/helper.rb +0 -179
  201. data/test/helpers/test_blogging.rb +0 -754
  202. data/test/helpers/test_breadcrumbs.rb +0 -81
  203. data/test/helpers/test_capturing.rb +0 -41
  204. data/test/helpers/test_filtering.rb +0 -106
  205. data/test/helpers/test_html_escape.rb +0 -32
  206. data/test/helpers/test_link_to.rb +0 -249
  207. data/test/helpers/test_rendering.rb +0 -89
  208. data/test/helpers/test_tagging.rb +0 -87
  209. data/test/helpers/test_text.rb +0 -24
  210. data/test/helpers/test_xml_sitemap.rb +0 -103
  211. data/test/tasks/test_clean.rb +0 -67
@@ -1,536 +0,0 @@
1
- # encoding: utf-8
2
-
3
- class Nanoc3::DataSources::FilesystemUnifiedTest < MiniTest::Unit::TestCase
4
-
5
- include Nanoc3::TestHelpers
6
-
7
- def new_data_source(params=nil)
8
- # Mock site
9
- site = Nanoc3::Site.new({})
10
-
11
- # Create data source
12
- data_source = Nanoc3::DataSources::FilesystemUnified.new(site, nil, nil, params)
13
-
14
- # Done
15
- data_source
16
- end
17
-
18
- def test_create_object_not_at_root
19
- # Create item
20
- data_source = new_data_source
21
- data_source.send(:create_object, 'foobar', 'content here', { :foo => 'bar' }, '/asdf/')
22
-
23
- # Check file existance
24
- assert File.directory?('foobar')
25
- assert !File.directory?('foobar/content')
26
- assert !File.directory?('foobar/asdf')
27
- assert File.file?('foobar/asdf.html')
28
-
29
- # Check file content
30
- expected = /^--- ?\nfoo: bar\n---\n\ncontent here$/
31
- assert_match expected, File.read('foobar/asdf.html')
32
- end
33
-
34
- def test_create_object_at_root
35
- # Create item
36
- data_source = new_data_source
37
- data_source.send(:create_object, 'foobar', 'content here', { :foo => 'bar' }, '/')
38
-
39
- # Check file existance
40
- assert File.directory?('foobar')
41
- assert !File.directory?('foobar/index')
42
- assert !File.directory?('foobar/foobar')
43
- assert File.file?('foobar/index.html')
44
-
45
- # Check file content
46
- expected = /^--- ?\nfoo: bar\n---\n\ncontent here$/
47
- assert_match expected, File.read('foobar/index.html')
48
- end
49
-
50
- def test_load_objects
51
- # Create data source
52
- data_source = new_data_source
53
-
54
- # Create a fake class
55
- klass = Class.new do
56
- attr_reader :stuff
57
- def initialize(*stuff)
58
- @stuff = stuff
59
- end
60
- def ==(other)
61
- @stuff == other.stuff
62
- end
63
- end
64
-
65
- # Create sample files
66
- FileUtils.mkdir_p('foo')
67
- FileUtils.mkdir_p('foo/a/b')
68
- File.open('foo/bar.html', 'w') { |io| io.write("---\nnum: 1\n---\ntest 1") }
69
- File.open('foo/b.c.html', 'w') { |io| io.write("---\nnum: 2\n---\ntest 2") }
70
- File.open('foo/a/b/c.html', 'w') { |io| io.write("---\nnum: 3\n---\ntest 3") }
71
- File.open('foo/ugly.html~', 'w') { |io| io.write("---\nnum: 4\n---\ntest 4") }
72
- File.open('foo/ugly.html.orig', 'w') { |io| io.write("---\nnum: 5\n---\ntest 5") }
73
- File.open('foo/ugly.html.rej', 'w') { |io| io.write("---\nnum: 6\n---\ntest 6") }
74
- File.open('foo/ugly.html.bak', 'w') { |io| io.write("---\nnum: 7\n---\ntest 7") }
75
-
76
- # Get expected and actual output
77
- expected_out = [
78
- klass.new(
79
- 'test 1',
80
- { 'num' => 1, :filename => 'foo/bar.html', :extension => 'html', :file => File.open('foo/bar.html') },
81
- '/bar/',
82
- :binary => false, :mtime => File.mtime('foo/bar.html')
83
- ),
84
- klass.new(
85
- 'test 2',
86
- { 'num' => 2, :filename => 'foo/b.c.html', :extension => 'c.html', :file => File.open('foo/b.c.html') },
87
- '/b/',
88
- :binary => false, :mtime => File.mtime('foo/b.c.html')
89
- ),
90
- klass.new(
91
- 'test 3',
92
- { 'num' => 3, :filename => 'foo/a/b/c.html', :extension => 'html', :file => File.open('foo/a/b/c.html') },
93
- '/a/b/c/',
94
- :binary => false, :mtime => File.mtime('foo/a/b/c.html')
95
- )
96
- ]
97
- actual_out = data_source.send(:load_objects, 'foo', 'The Foo', klass).sort_by { |i| i.stuff[0] }
98
-
99
- # Check
100
- (0..expected_out.size-1).each do |i|
101
- assert_equal expected_out[i].stuff[0], actual_out[i].stuff[0], 'content must match'
102
- assert_equal expected_out[i].stuff[2], actual_out[i].stuff[2], 'identifier must match'
103
- assert_equal expected_out[i].stuff[3][:mtime], actual_out[i].stuff[3][:mtime], 'mtime must match'
104
- assert_equal expected_out[i].stuff[1][:file].path, actual_out[i].stuff[1][:file].path, 'file paths must match'
105
- expected_out[i].stuff[1][:file].close;
106
- actual_out[i].stuff[1][:file].close
107
- [ 'num', :filename, :extension ].each do |key|
108
- assert_equal expected_out[i].stuff[1][key], actual_out[i].stuff[1][key], "attribute key #{key} must match"
109
- end
110
- end
111
- end
112
-
113
- def test_load_binary_objects
114
- # Create data source
115
- data_source = new_data_source
116
-
117
- # Create sample files
118
- FileUtils.mkdir_p('foo')
119
- File.open('foo/stuff.dat', 'w') { |io| io.write("random binary data") }
120
-
121
- # Load
122
- items = data_source.send(:load_objects, 'foo', 'item', Nanoc3::Item)
123
-
124
- # Check
125
- assert_equal 1, items.size
126
- assert items[0].binary?
127
- assert_equal 'foo/stuff.dat', items[0].raw_filename
128
- assert_nil items[0].raw_content
129
- end
130
-
131
- def test_load_binary_layouts
132
- # Create data source
133
- data_source = new_data_source
134
-
135
- # Create sample files
136
- FileUtils.mkdir_p('foo')
137
- File.open('foo/stuff.dat', 'w') { |io| io.write("random binary data") }
138
-
139
- # Load
140
- items = data_source.send(:load_objects, 'foo', 'item', Nanoc3::Layout)
141
-
142
- # Check
143
- assert_equal 1, items.size
144
- assert_equal 'random binary data', items[0].raw_content
145
- end
146
-
147
- def test_identifier_for_filename_allowing_periods_in_identifiers
148
- # Create data source
149
- data_source = new_data_source(:allow_periods_in_identifiers => true)
150
-
151
- # Get input and expected output
152
- expected = {
153
- '/foo' => '/foo/',
154
- '/foo.html' => '/foo/',
155
- '/foo/index.html' => '/foo/',
156
- '/foo.entry.html' => '/foo.entry/'
157
- }
158
-
159
- # Check
160
- expected.each_pair do |input, expected_output|
161
- actual_output = data_source.send(:identifier_for_filename, input)
162
- assert_equal(
163
- expected_output, actual_output,
164
- "identifier_for_filename(#{input.inspect}) should equal #{expected_output.inspect}, not #{actual_output.inspect}"
165
- )
166
- end
167
- end
168
-
169
- def test_identifier_for_filename_disallowing_periods_in_identifiers
170
- # Create data source
171
- data_source = new_data_source
172
-
173
- # Get input and expected output
174
- expected = {
175
- '/foo' => '/foo/',
176
- '/foo.html' => '/foo/',
177
- '/foo/index.html' => '/foo/',
178
- '/foo.html.erb' => '/foo/'
179
- }
180
-
181
- # Check
182
- expected.each_pair do |input, expected_output|
183
- actual_output = data_source.send(:identifier_for_filename, input)
184
- assert_equal(
185
- expected_output, actual_output,
186
- "identifier_for_filename(#{input.inspect}) should equal #{expected_output.inspect}, not #{actual_output.inspect}"
187
- )
188
- end
189
- end
190
-
191
- def test_identifier_for_filename_with_subfilename_allowing_periods_in_identifiers
192
- expectations = {
193
- 'foo/bar.yaml' => '/foo/bar/',
194
- 'foo/quxbar.yaml' => '/foo/quxbar/',
195
- 'foo/barqux.yaml' => '/foo/barqux/',
196
- 'foo/quxbarqux.yaml' => '/foo/quxbarqux/',
197
- 'foo/qux.bar.yaml' => '/foo/qux.bar/',
198
- 'foo/bar.qux.yaml' => '/foo/bar.qux/',
199
- 'foo/qux.bar.qux.yaml' => '/foo/qux.bar.qux/',
200
- 'foo/index.yaml' => '/foo/',
201
- 'index.yaml' => '/',
202
- 'foo/blah_index.yaml' => '/foo/blah_index/'
203
- }
204
-
205
- data_source = new_data_source(:allow_periods_in_identifiers => true)
206
- expectations.each_pair do |meta_filename, expected_identifier|
207
- content_filename = meta_filename.sub(/yaml$/, 'html')
208
- [ meta_filename, content_filename ].each do |filename|
209
- assert_equal(
210
- expected_identifier,
211
- data_source.instance_eval { identifier_for_filename(filename) }
212
- )
213
- end
214
- end
215
- end
216
-
217
- def test_identifier_for_filename_with_subfilename_disallowing_periods_in_identifiers
218
- expectations = {
219
- 'foo/bar.yaml' => '/foo/bar/',
220
- 'foo/quxbar.yaml' => '/foo/quxbar/',
221
- 'foo/barqux.yaml' => '/foo/barqux/',
222
- 'foo/quxbarqux.yaml' => '/foo/quxbarqux/',
223
- 'foo/qux.bar.yaml' => '/foo/qux/',
224
- 'foo/bar.qux.yaml' => '/foo/bar/',
225
- 'foo/qux.bar.qux.yaml' => '/foo/qux/',
226
- 'foo/index.yaml' => '/foo/',
227
- 'index.yaml' => '/',
228
- 'foo/blah_index.yaml' => '/foo/blah_index/'
229
- }
230
-
231
- data_source = new_data_source
232
- expectations.each_pair do |meta_filename, expected_identifier|
233
- content_filename = meta_filename.sub(/yaml$/, 'html')
234
- [ meta_filename, content_filename ].each do |filename|
235
- assert_equal(
236
- expected_identifier,
237
- data_source.instance_eval { identifier_for_filename(filename) }
238
- )
239
- end
240
- end
241
- end
242
-
243
- def test_load_objects_allowing_periods_in_identifiers
244
- # Create data source
245
- data_source = new_data_source(:allow_periods_in_identifiers => true)
246
-
247
- # Create a fake class
248
- klass = Class.new do
249
- attr_reader :stuff
250
- def initialize(*stuff)
251
- @stuff = stuff
252
- end
253
- def ==(other)
254
- @stuff == other.stuff
255
- end
256
- end
257
-
258
- # Create sample files
259
- FileUtils.mkdir_p('foo')
260
- FileUtils.mkdir_p('foo/a/b')
261
- File.open('foo/a/b/c.yaml', 'w') { |io| io.write("---\nnum: 1\n") }
262
- File.open('foo/b.c.yaml', 'w') { |io| io.write("---\nnum: 2\n") }
263
- File.open('foo/b.c.html', 'w') { |io| io.write("test 2") }
264
- File.open('foo/car.html', 'w') { |io| io.write("test 3") }
265
- File.open('foo/ugly.yaml~', 'w') { |io| io.write("blah") }
266
- File.open('foo/ugly.html~', 'w') { |io| io.write("blah") }
267
- File.open('foo/ugly.html.orig', 'w') { |io| io.write("blah") }
268
- File.open('foo/ugly.html.rej', 'w') { |io| io.write("blah") }
269
- File.open('foo/ugly.html.bak', 'w') { |io| io.write("blah") }
270
-
271
- # Get expected output
272
- expected_out = [
273
- klass.new(
274
- '',
275
- {
276
- 'num' => 1,
277
- :content_filename => nil,
278
- :meta_filename => 'foo/a/b/c.yaml',
279
- :extension => nil,
280
- :file => nil
281
- },
282
- '/a/b/c/',
283
- :binary => false, :mtime => File.mtime('foo/a/b/c.yaml')
284
- ),
285
- klass.new(
286
- 'test 2',
287
- {
288
- 'num' => 2,
289
- :content_filename => 'foo/b.c.html',
290
- :meta_filename => 'foo/b.c.yaml',
291
- :extension => 'html',
292
- :file => File.open('foo/b.c.html')
293
- },
294
- '/b.c/',
295
- :binary => false, :mtime => File.mtime('foo/b.c.html') > File.mtime('foo/b.c.yaml') ? File.mtime('foo/b.c.html') : File.mtime('foo/b.c.yaml')
296
- ),
297
- klass.new(
298
- 'test 3',
299
- {
300
- :content_filename => 'foo/car.html',
301
- :meta_filename => nil,
302
- :extension => 'html',
303
- :file => File.open('foo/car.html')
304
- },
305
- '/car/',
306
- :binary => false, :mtime => File.mtime('foo/car.html')
307
- )
308
- ]
309
-
310
- # Get actual output ordered by identifier
311
- actual_out = data_source.send(:load_objects, 'foo', 'The Foo', klass).sort_by { |i| i.stuff[2] }
312
-
313
- # Check
314
- (0..expected_out.size-1).each do |i|
315
- assert_equal expected_out[i].stuff[0], actual_out[i].stuff[0], 'content must match'
316
- assert_equal expected_out[i].stuff[2], actual_out[i].stuff[2], 'identifier must match'
317
- assert_equal expected_out[i].stuff[3][:mtime], actual_out[i].stuff[3][:mtime], 'mtime must match'
318
-
319
- actual_file = actual_out[i].stuff[1][:file]
320
- expected_file = expected_out[i].stuff[1][:file]
321
- assert(actual_file == expected_file || actual_file.path == expected_file.path, 'file paths must match')
322
- actual_file.close unless actual_file.nil?
323
- expected_file.close unless expected_file.nil?
324
-
325
- [ 'num', :content_filename, :meta_filename, :extension ].each do |key|
326
- assert_equal expected_out[i].stuff[1][key], actual_out[i].stuff[1][key], "attribute key #{key} must match"
327
- end
328
- end
329
- end
330
-
331
- def test_load_objects_disallowing_periods_in_identifiers
332
- # Create data source
333
- data_source = new_data_source
334
-
335
- # Create a fake class
336
- klass = Class.new do
337
- attr_reader :stuff
338
- def initialize(*stuff)
339
- @stuff = stuff
340
- end
341
- def ==(other)
342
- @stuff == other.stuff
343
- end
344
- end
345
-
346
- # Create sample files
347
- FileUtils.mkdir_p('foo')
348
- FileUtils.mkdir_p('foo/a/b')
349
- File.open('foo/a/b/c.yaml', 'w') { |io| io.write("---\nnum: 1\n") }
350
- File.open('foo/b.yaml', 'w') { |io| io.write("---\nnum: 2\n") }
351
- File.open('foo/b.html.erb', 'w') { |io| io.write("test 2") }
352
- File.open('foo/car.html', 'w') { |io| io.write("test 3") }
353
- File.open('foo/ugly.yaml~', 'w') { |io| io.write("blah") }
354
- File.open('foo/ugly.html~', 'w') { |io| io.write("blah") }
355
- File.open('foo/ugly.html.orig', 'w') { |io| io.write("blah") }
356
- File.open('foo/ugly.html.rej', 'w') { |io| io.write("blah") }
357
- File.open('foo/ugly.html.bak', 'w') { |io| io.write("blah") }
358
-
359
- # Get expected output
360
- expected_out = [
361
- klass.new(
362
- '',
363
- {
364
- 'num' => 1,
365
- :content_filename => nil,
366
- :meta_filename => 'foo/a/b/c.yaml',
367
- :extension => nil,
368
- :file => nil
369
- },
370
- '/a/b/c/',
371
- :binary => false, :mtime => File.mtime('foo/a/b/c.yaml')
372
- ),
373
- klass.new(
374
- 'test 2',
375
- {
376
- 'num' => 2,
377
- :content_filename => 'foo/b.html.erb',
378
- :meta_filename => 'foo/b.yaml',
379
- :extension => 'html.erb',
380
- :file => File.open('foo/b.html.erb')
381
- },
382
- '/b/',
383
- :binary => false, :mtime => File.mtime('foo/b.html.erb') > File.mtime('foo/b.yaml') ? File.mtime('foo/b.html.erb') : File.mtime('foo/b.yaml')
384
- ),
385
- klass.new(
386
- 'test 3',
387
- {
388
- :content_filename => 'foo/car.html',
389
- :meta_filename => nil,
390
- :extension => 'html',
391
- :file => File.open('foo/car.html')
392
- },
393
- '/car/',
394
- :binary => false, :mtime => File.mtime('foo/car.html')
395
- )
396
- ]
397
-
398
- # Get actual output ordered by identifier
399
- actual_out = data_source.send(:load_objects, 'foo', 'The Foo', klass).sort_by { |i| i.stuff[2] }
400
-
401
- # Check
402
- (0..expected_out.size-1).each do |i|
403
- assert_equal expected_out[i].stuff[0], actual_out[i].stuff[0], 'content must match'
404
- assert_equal expected_out[i].stuff[2], actual_out[i].stuff[2], 'identifier must match'
405
- assert_equal expected_out[i].stuff[3][:mtime], actual_out[i].stuff[3][:mtime], 'mtime must match'
406
-
407
- actual_file = actual_out[i].stuff[1][:file]
408
- expected_file = expected_out[i].stuff[1][:file]
409
- assert(actual_file == expected_file || actual_file.path == expected_file.path, 'file paths must match')
410
- actual_file.close unless actual_file.nil?
411
- expected_file.close unless expected_file.nil?
412
-
413
- [ 'num', :content_filename, :meta_filename, :extension ].each do |key|
414
- assert_equal expected_out[i].stuff[1][key], actual_out[i].stuff[1][key], "attribute key #{key} must match"
415
- end
416
- end
417
- end
418
-
419
- def test_create_object_allowing_periods_in_identifiers
420
- # Create data source
421
- data_source = new_data_source(:allow_periods_in_identifiers => true)
422
-
423
- # Create object without period
424
- data_source.send(:create_object, 'foo', 'some content', { :some => 'attributes' }, '/asdf/')
425
- assert File.file?('foo/asdf.html')
426
- data = data_source.send(:parse, 'foo/asdf.html', nil, 'moo')
427
- assert_equal({ 'some' => 'attributes' }, data[0])
428
- assert_equal('some content', data[1])
429
-
430
- # Create object with period
431
- data_source.send(:create_object, 'foo', 'some content', { :some => 'attributes' }, '/as.df/')
432
- assert File.file?('foo/as.df.html')
433
- data = data_source.send(:parse, 'foo/as.df.html', nil, 'moo')
434
- assert_equal({ 'some' => 'attributes' }, data[0])
435
- assert_equal('some content', data[1])
436
- end
437
-
438
- def test_create_object_disallowing_periods_in_identifiers
439
- # Create data source
440
- data_source = new_data_source
441
-
442
- # Create object without period
443
- data_source.send(:create_object, 'foo', 'some content', { :some => 'attributes' }, '/asdf/')
444
- assert File.file?('foo/asdf.html')
445
- data = data_source.send(:parse, 'foo/asdf.html', nil, 'moo')
446
- assert_equal({ 'some' => 'attributes' }, data[0])
447
- assert_equal('some content', data[1])
448
-
449
- # Create object with period
450
- assert_raises(RuntimeError) do
451
- data_source.send(:create_object, 'foo', 'some content', { :some => 'attributes' }, '/as.df/')
452
- end
453
- end
454
-
455
- def test_filename_for
456
- data_source = new_data_source
457
-
458
- assert_equal '/foo.bar', data_source.send(:filename_for, '/foo', 'bar')
459
- assert_equal '/foo.bar.baz', data_source.send(:filename_for, '/foo', 'bar.baz')
460
- assert_equal '/foo', data_source.send(:filename_for, '/foo', '')
461
- assert_equal nil, data_source.send(:filename_for, '/foo', nil)
462
- end
463
-
464
- def test_compile_huge_site
465
- if_implemented do
466
- # Create data source
467
- data_source = new_data_source
468
-
469
- # Create a lot of items
470
- count = Process.getrlimit(Process::RLIMIT_NOFILE)[0] + 5
471
- count.times do |i|
472
- FileUtils.mkdir_p("content/#{i}")
473
- File.open("content/#{i}/#{i}.html", 'w') { |io| io << "This is item #{i}." }
474
- File.open("content/#{i}/#{i}.yaml", 'w') { |io| io << "title: Item #{i}" }
475
- end
476
-
477
- # Read all items
478
- data_source.items
479
- end
480
- end
481
-
482
- def test_compile_iso_8859_1_site
483
- # Check encoding
484
- if !''.respond_to?(:encode)
485
- skip "Test only works on 1.9.x"
486
- return
487
- end
488
-
489
- # Create data source
490
- data_source = new_data_source
491
-
492
- # Create item
493
- data_source.create_item("Hëllö", {}, '/foo/')
494
-
495
- # Parse
496
- begin
497
- original_default_external_encoding = Encoding.default_external
498
- Encoding.default_external = 'ISO-8859-1'
499
-
500
- items = data_source.items
501
-
502
- assert_equal 1, items.size
503
- assert_equal Encoding.find("UTF-8"), items[0].raw_content.encoding
504
- ensure
505
- Encoding.default_external = original_default_external_encoding
506
- end
507
- end
508
-
509
- def test_compile_iso_8859_1_site_with_explicit_encoding
510
- # Check encoding
511
- if !''.respond_to?(:encode)
512
- skip "Test only works on 1.9.x"
513
- return
514
- end
515
-
516
- # Create data source
517
- data_source = new_data_source({})
518
- data_source.config[:encoding] = 'ISO-8859-1'
519
-
520
- # Create item
521
- begin
522
- original_default_external_encoding = Encoding.default_external
523
- Encoding.default_external = 'ISO-8859-1'
524
-
525
- data_source.create_item("Hëllö", {}, '/foo/')
526
- ensure
527
- Encoding.default_external = original_default_external_encoding
528
- end
529
-
530
- # Parse
531
- items = data_source.items
532
- assert_equal 1, items.size
533
- assert_equal Encoding.find("UTF-8"), items[0].raw_content.encoding
534
- end
535
-
536
- end