nanoc3 3.2.4 → 3.3.0

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