nanoc 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 (230) hide show
  1. data/.gemtest +0 -0
  2. data/ChangeLog +3 -0
  3. data/Gemfile +32 -0
  4. data/LICENSE +19 -0
  5. data/NEWS.md +470 -0
  6. data/README.md +114 -0
  7. data/Rakefile +14 -0
  8. data/bin/nanoc +7 -27
  9. data/bin/nanoc3 +3 -0
  10. data/doc/yardoc_templates/default/layout/html/footer.erb +10 -0
  11. data/lib/nanoc.rb +41 -0
  12. data/lib/nanoc/base.rb +49 -0
  13. data/lib/nanoc/base/compilation/checksum_store.rb +57 -0
  14. data/lib/nanoc/base/compilation/compiled_content_cache.rb +62 -0
  15. data/lib/nanoc/base/compilation/compiler.rb +458 -0
  16. data/lib/nanoc/base/compilation/compiler_dsl.rb +214 -0
  17. data/lib/nanoc/base/compilation/dependency_tracker.rb +200 -0
  18. data/lib/nanoc/base/compilation/filter.rb +165 -0
  19. data/lib/nanoc/base/compilation/item_rep_proxy.rb +103 -0
  20. data/lib/nanoc/base/compilation/item_rep_recorder_proxy.rb +102 -0
  21. data/lib/nanoc/base/compilation/outdatedness_checker.rb +223 -0
  22. data/lib/nanoc/base/compilation/outdatedness_reasons.rb +46 -0
  23. data/lib/nanoc/base/compilation/rule.rb +73 -0
  24. data/lib/nanoc/base/compilation/rule_context.rb +84 -0
  25. data/lib/nanoc/base/compilation/rule_memory_calculator.rb +40 -0
  26. data/lib/nanoc/base/compilation/rule_memory_store.rb +53 -0
  27. data/lib/nanoc/base/compilation/rules_collection.rb +243 -0
  28. data/lib/nanoc/base/context.rb +47 -0
  29. data/lib/nanoc/base/core_ext.rb +6 -0
  30. data/lib/nanoc/base/core_ext/array.rb +62 -0
  31. data/lib/nanoc/base/core_ext/hash.rb +63 -0
  32. data/lib/nanoc/base/core_ext/pathname.rb +26 -0
  33. data/lib/nanoc/base/core_ext/string.rb +46 -0
  34. data/lib/nanoc/base/directed_graph.rb +275 -0
  35. data/lib/nanoc/base/errors.rb +211 -0
  36. data/lib/nanoc/base/memoization.rb +67 -0
  37. data/lib/nanoc/base/notification_center.rb +84 -0
  38. data/lib/nanoc/base/ordered_hash.rb +200 -0
  39. data/lib/nanoc/base/plugin_registry.rb +181 -0
  40. data/lib/nanoc/base/result_data/item_rep.rb +492 -0
  41. data/lib/nanoc/base/source_data/code_snippet.rb +58 -0
  42. data/lib/nanoc/base/source_data/configuration.rb +24 -0
  43. data/lib/nanoc/base/source_data/data_source.rb +234 -0
  44. data/lib/nanoc/base/source_data/item.rb +301 -0
  45. data/lib/nanoc/base/source_data/layout.rb +130 -0
  46. data/lib/nanoc/base/source_data/site.rb +361 -0
  47. data/lib/nanoc/base/store.rb +135 -0
  48. data/lib/nanoc/cli.rb +137 -0
  49. data/lib/nanoc/cli/command_runner.rb +104 -0
  50. data/lib/nanoc/cli/commands/autocompile.rb +58 -0
  51. data/lib/nanoc/cli/commands/compile.rb +297 -0
  52. data/lib/nanoc/cli/commands/create_item.rb +60 -0
  53. data/lib/nanoc/cli/commands/create_layout.rb +73 -0
  54. data/lib/nanoc/cli/commands/create_site.rb +411 -0
  55. data/lib/nanoc/cli/commands/debug.rb +117 -0
  56. data/lib/nanoc/cli/commands/deploy.rb +79 -0
  57. data/lib/nanoc/cli/commands/info.rb +98 -0
  58. data/lib/nanoc/cli/commands/nanoc.rb +38 -0
  59. data/lib/nanoc/cli/commands/prune.rb +50 -0
  60. data/lib/nanoc/cli/commands/update.rb +70 -0
  61. data/lib/nanoc/cli/commands/view.rb +82 -0
  62. data/lib/nanoc/cli/commands/watch.rb +124 -0
  63. data/lib/nanoc/cli/error_handler.rb +199 -0
  64. data/lib/nanoc/cli/logger.rb +92 -0
  65. data/lib/nanoc/data_sources.rb +29 -0
  66. data/lib/nanoc/data_sources/deprecated/delicious.rb +42 -0
  67. data/lib/nanoc/data_sources/deprecated/last_fm.rb +87 -0
  68. data/lib/nanoc/data_sources/deprecated/twitter.rb +38 -0
  69. data/lib/nanoc/data_sources/filesystem.rb +299 -0
  70. data/lib/nanoc/data_sources/filesystem_unified.rb +121 -0
  71. data/lib/nanoc/data_sources/filesystem_verbose.rb +91 -0
  72. data/lib/nanoc/extra.rb +24 -0
  73. data/lib/nanoc/extra/auto_compiler.rb +103 -0
  74. data/lib/nanoc/extra/chick.rb +125 -0
  75. data/lib/nanoc/extra/core_ext.rb +6 -0
  76. data/lib/nanoc/extra/core_ext/enumerable.rb +33 -0
  77. data/lib/nanoc/extra/core_ext/pathname.rb +30 -0
  78. data/lib/nanoc/extra/core_ext/time.rb +19 -0
  79. data/lib/nanoc/extra/deployer.rb +47 -0
  80. data/lib/nanoc/extra/deployers.rb +15 -0
  81. data/lib/nanoc/extra/deployers/fog.rb +98 -0
  82. data/lib/nanoc/extra/deployers/rsync.rb +70 -0
  83. data/lib/nanoc/extra/file_proxy.rb +40 -0
  84. data/lib/nanoc/extra/pruner.rb +86 -0
  85. data/lib/nanoc/extra/validators.rb +12 -0
  86. data/lib/nanoc/extra/validators/links.rb +268 -0
  87. data/lib/nanoc/extra/validators/w3c.rb +95 -0
  88. data/lib/nanoc/extra/vcs.rb +66 -0
  89. data/lib/nanoc/extra/vcses.rb +17 -0
  90. data/lib/nanoc/extra/vcses/bazaar.rb +25 -0
  91. data/lib/nanoc/extra/vcses/dummy.rb +24 -0
  92. data/lib/nanoc/extra/vcses/git.rb +25 -0
  93. data/lib/nanoc/extra/vcses/mercurial.rb +25 -0
  94. data/lib/nanoc/extra/vcses/subversion.rb +25 -0
  95. data/lib/nanoc/filters.rb +59 -0
  96. data/lib/nanoc/filters/asciidoc.rb +38 -0
  97. data/lib/nanoc/filters/bluecloth.rb +19 -0
  98. data/lib/nanoc/filters/coderay.rb +21 -0
  99. data/lib/nanoc/filters/coffeescript.rb +20 -0
  100. data/lib/nanoc/filters/colorize_syntax.rb +298 -0
  101. data/lib/nanoc/filters/erb.rb +38 -0
  102. data/lib/nanoc/filters/erubis.rb +34 -0
  103. data/lib/nanoc/filters/haml.rb +27 -0
  104. data/lib/nanoc/filters/kramdown.rb +20 -0
  105. data/lib/nanoc/filters/less.rb +53 -0
  106. data/lib/nanoc/filters/markaby.rb +20 -0
  107. data/lib/nanoc/filters/maruku.rb +20 -0
  108. data/lib/nanoc/filters/mustache.rb +24 -0
  109. data/lib/nanoc/filters/rainpress.rb +19 -0
  110. data/lib/nanoc/filters/rdiscount.rb +22 -0
  111. data/lib/nanoc/filters/rdoc.rb +33 -0
  112. data/lib/nanoc/filters/redcarpet.rb +62 -0
  113. data/lib/nanoc/filters/redcloth.rb +47 -0
  114. data/lib/nanoc/filters/relativize_paths.rb +94 -0
  115. data/lib/nanoc/filters/rubypants.rb +20 -0
  116. data/lib/nanoc/filters/sass.rb +74 -0
  117. data/lib/nanoc/filters/slim.rb +25 -0
  118. data/lib/nanoc/filters/typogruby.rb +23 -0
  119. data/lib/nanoc/filters/uglify_js.rb +42 -0
  120. data/lib/nanoc/filters/xsl.rb +46 -0
  121. data/lib/nanoc/filters/yui_compressor.rb +23 -0
  122. data/lib/nanoc/helpers.rb +16 -0
  123. data/lib/nanoc/helpers/blogging.rb +319 -0
  124. data/lib/nanoc/helpers/breadcrumbs.rb +40 -0
  125. data/lib/nanoc/helpers/capturing.rb +138 -0
  126. data/lib/nanoc/helpers/filtering.rb +50 -0
  127. data/lib/nanoc/helpers/html_escape.rb +55 -0
  128. data/lib/nanoc/helpers/link_to.rb +151 -0
  129. data/lib/nanoc/helpers/rendering.rb +140 -0
  130. data/lib/nanoc/helpers/tagging.rb +71 -0
  131. data/lib/nanoc/helpers/text.rb +44 -0
  132. data/lib/nanoc/helpers/xml_sitemap.rb +76 -0
  133. data/lib/nanoc/tasks.rb +10 -0
  134. data/lib/nanoc/tasks/clean.rake +16 -0
  135. data/lib/nanoc/tasks/clean.rb +29 -0
  136. data/lib/nanoc/tasks/deploy/rsync.rake +16 -0
  137. data/lib/nanoc/tasks/validate.rake +92 -0
  138. data/nanoc.gemspec +49 -0
  139. data/tasks/doc.rake +16 -0
  140. data/tasks/test.rake +46 -0
  141. data/test/base/core_ext/array_spec.rb +73 -0
  142. data/test/base/core_ext/hash_spec.rb +98 -0
  143. data/test/base/core_ext/pathname_spec.rb +27 -0
  144. data/test/base/core_ext/string_spec.rb +37 -0
  145. data/test/base/test_checksum_store.rb +35 -0
  146. data/test/base/test_code_snippet.rb +31 -0
  147. data/test/base/test_compiler.rb +403 -0
  148. data/test/base/test_compiler_dsl.rb +161 -0
  149. data/test/base/test_context.rb +31 -0
  150. data/test/base/test_data_source.rb +46 -0
  151. data/test/base/test_dependency_tracker.rb +262 -0
  152. data/test/base/test_directed_graph.rb +288 -0
  153. data/test/base/test_filter.rb +83 -0
  154. data/test/base/test_item.rb +179 -0
  155. data/test/base/test_item_rep.rb +579 -0
  156. data/test/base/test_layout.rb +59 -0
  157. data/test/base/test_memoization.rb +90 -0
  158. data/test/base/test_notification_center.rb +34 -0
  159. data/test/base/test_outdatedness_checker.rb +394 -0
  160. data/test/base/test_plugin.rb +30 -0
  161. data/test/base/test_rule.rb +19 -0
  162. data/test/base/test_rule_context.rb +65 -0
  163. data/test/base/test_site.rb +190 -0
  164. data/test/cli/commands/test_compile.rb +33 -0
  165. data/test/cli/commands/test_create_item.rb +14 -0
  166. data/test/cli/commands/test_create_layout.rb +28 -0
  167. data/test/cli/commands/test_create_site.rb +24 -0
  168. data/test/cli/commands/test_deploy.rb +74 -0
  169. data/test/cli/commands/test_help.rb +12 -0
  170. data/test/cli/commands/test_info.rb +11 -0
  171. data/test/cli/commands/test_prune.rb +98 -0
  172. data/test/cli/commands/test_update.rb +10 -0
  173. data/test/cli/test_cli.rb +102 -0
  174. data/test/cli/test_error_handler.rb +29 -0
  175. data/test/cli/test_logger.rb +10 -0
  176. data/test/data_sources/test_filesystem.rb +433 -0
  177. data/test/data_sources/test_filesystem_unified.rb +536 -0
  178. data/test/data_sources/test_filesystem_verbose.rb +357 -0
  179. data/test/extra/core_ext/test_enumerable.rb +30 -0
  180. data/test/extra/core_ext/test_pathname.rb +17 -0
  181. data/test/extra/core_ext/test_time.rb +15 -0
  182. data/test/extra/deployers/test_fog.rb +67 -0
  183. data/test/extra/deployers/test_rsync.rb +100 -0
  184. data/test/extra/test_auto_compiler.rb +417 -0
  185. data/test/extra/test_file_proxy.rb +19 -0
  186. data/test/extra/test_vcs.rb +22 -0
  187. data/test/extra/validators/test_links.rb +62 -0
  188. data/test/extra/validators/test_w3c.rb +47 -0
  189. data/test/filters/test_asciidoc.rb +22 -0
  190. data/test/filters/test_bluecloth.rb +18 -0
  191. data/test/filters/test_coderay.rb +44 -0
  192. data/test/filters/test_coffeescript.rb +18 -0
  193. data/test/filters/test_colorize_syntax.rb +379 -0
  194. data/test/filters/test_erb.rb +105 -0
  195. data/test/filters/test_erubis.rb +78 -0
  196. data/test/filters/test_haml.rb +96 -0
  197. data/test/filters/test_kramdown.rb +18 -0
  198. data/test/filters/test_less.rb +113 -0
  199. data/test/filters/test_markaby.rb +24 -0
  200. data/test/filters/test_maruku.rb +18 -0
  201. data/test/filters/test_mustache.rb +25 -0
  202. data/test/filters/test_rainpress.rb +29 -0
  203. data/test/filters/test_rdiscount.rb +31 -0
  204. data/test/filters/test_rdoc.rb +18 -0
  205. data/test/filters/test_redcarpet.rb +73 -0
  206. data/test/filters/test_redcloth.rb +33 -0
  207. data/test/filters/test_relativize_paths.rb +533 -0
  208. data/test/filters/test_rubypants.rb +18 -0
  209. data/test/filters/test_sass.rb +229 -0
  210. data/test/filters/test_slim.rb +35 -0
  211. data/test/filters/test_typogruby.rb +21 -0
  212. data/test/filters/test_uglify_js.rb +30 -0
  213. data/test/filters/test_xsl.rb +105 -0
  214. data/test/filters/test_yui_compressor.rb +44 -0
  215. data/test/gem_loader.rb +11 -0
  216. data/test/helper.rb +207 -0
  217. data/test/helpers/test_blogging.rb +754 -0
  218. data/test/helpers/test_breadcrumbs.rb +81 -0
  219. data/test/helpers/test_capturing.rb +41 -0
  220. data/test/helpers/test_filtering.rb +106 -0
  221. data/test/helpers/test_html_escape.rb +32 -0
  222. data/test/helpers/test_link_to.rb +249 -0
  223. data/test/helpers/test_rendering.rb +89 -0
  224. data/test/helpers/test_tagging.rb +87 -0
  225. data/test/helpers/test_text.rb +24 -0
  226. data/test/helpers/test_xml_sitemap.rb +103 -0
  227. data/test/tasks/test_clean.rb +67 -0
  228. metadata +327 -15
  229. data/bin/nanoc-select +0 -86
  230. data/lib/nanoc-select.rb +0 -11
@@ -0,0 +1,357 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::DataSources::FilesystemVerboseTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def new_data_source(params=nil)
8
+ # Mock site
9
+ site = Nanoc::Site.new({})
10
+
11
+ # Create data source
12
+ data_source = Nanoc::DataSources::FilesystemVerbose.new(site, nil, nil, params)
13
+
14
+ # Done
15
+ data_source
16
+ end
17
+
18
+ def test_items
19
+ # Create data source
20
+ data_source = new_data_source
21
+
22
+ # Create foo item
23
+ FileUtils.mkdir_p('content/foo')
24
+ File.open('content/foo/foo.yaml', 'w') do |io|
25
+ io.write("---\n")
26
+ io.write("title: Foo\n")
27
+ end
28
+ File.open('content/foo/foo.html', 'w') do |io|
29
+ io.write('Lorem ipsum dolor sit amet...')
30
+ end
31
+
32
+ # Create bar item
33
+ FileUtils.mkdir_p('content/bar')
34
+ File.open('content/bar/bar.yaml', 'w') do |io|
35
+ io.write("---\n")
36
+ io.write("title: Bar\n")
37
+ end
38
+ File.open('content/bar/bar.xml', 'w') do |io|
39
+ io.write("Lorem ipsum dolor sit amet...")
40
+ end
41
+
42
+ # Load items
43
+ items = data_source.items
44
+
45
+ # Check items
46
+ assert_equal(2, items.size)
47
+ assert(items.any? { |a|
48
+ a[:title] == 'Foo' &&
49
+ a[:extension] == 'html' &&
50
+ a[:content_filename] == 'content/foo/foo.html' &&
51
+ a[:meta_filename] == 'content/foo/foo.yaml'
52
+ })
53
+ assert(items.any? { |a|
54
+ a[:title] == 'Bar' &&
55
+ a[:extension] == 'xml' &&
56
+ a[:content_filename] == 'content/bar/bar.xml' &&
57
+ a[:meta_filename] == 'content/bar/bar.yaml'
58
+ })
59
+ end
60
+
61
+ def test_items_with_period_in_name
62
+ data_source = new_data_source(:allow_periods_in_identifiers => true)
63
+
64
+ # Create foo.css
65
+ FileUtils.mkdir_p('content/foo')
66
+ File.open('content/foo/foo.yaml', 'w') do |io|
67
+ io.write(YAML.dump({ 'title' => 'Foo' }))
68
+ end
69
+ File.open('content/foo/foo.css', 'w') do |io|
70
+ io.write('body.foo {}')
71
+ end
72
+
73
+ # Create foo.bar.css
74
+ FileUtils.mkdir_p('content/foo.bar')
75
+ File.open('content/foo.bar/foo.bar.yaml', 'w') do |io|
76
+ io.write(YAML.dump({ 'title' => 'Foo Bar' }))
77
+ end
78
+ File.open('content/foo.bar/foo.bar.css', 'w') do |io|
79
+ io.write('body.foobar {}')
80
+ end
81
+
82
+ # Load
83
+ items = data_source.items
84
+
85
+ # Check
86
+ assert_equal 2, items.size
87
+ assert_equal '/foo/', items[0].identifier
88
+ assert_equal 'Foo', items[0][:title]
89
+ assert_equal 'content/foo/foo.css', items[0][:content_filename]
90
+ assert_equal 'content/foo/foo.yaml', items[0][:meta_filename]
91
+ assert_equal '/foo.bar/', items[1].identifier
92
+ assert_equal 'Foo Bar', items[1][:title]
93
+ assert_equal 'content/foo.bar/foo.bar.css', items[1][:content_filename]
94
+ assert_equal 'content/foo.bar/foo.bar.yaml', items[1][:meta_filename]
95
+ end
96
+
97
+ def test_items_with_optional_meta_file
98
+ # Create data source
99
+ data_source = new_data_source
100
+
101
+ # Create foo item
102
+ FileUtils.mkdir_p('content/foo')
103
+ File.open('content/foo/foo.html', 'w') do |io|
104
+ io.write('Lorem ipsum dolor sit amet...')
105
+ end
106
+
107
+ # Create bar item
108
+ FileUtils.mkdir_p('content/bar')
109
+ File.open('content/bar/bar.yaml', 'w') do |io|
110
+ io.write("---\n")
111
+ io.write("title: Bar\n")
112
+ end
113
+
114
+ # Load items
115
+ items = data_source.items
116
+
117
+ # Check items
118
+ assert_equal(2, items.size)
119
+ assert(items.any? { |a|
120
+ a[:title] == nil &&
121
+ a[:extension] == 'html' &&
122
+ a[:content_filename] == 'content/foo/foo.html' &&
123
+ a[:meta_filename] == nil
124
+ })
125
+ assert(items.any? { |a|
126
+ a[:title] == 'Bar' &&
127
+ a[:extension] == nil &&
128
+ a[:content_filename] == nil &&
129
+ a[:meta_filename] == 'content/bar/bar.yaml'
130
+ })
131
+ end
132
+
133
+ def test_layouts
134
+ # Create data source
135
+ data_source = new_data_source
136
+
137
+ # Create layout
138
+ FileUtils.mkdir_p('layouts/foo')
139
+ File.open('layouts/foo/foo.yaml', 'w') do |io|
140
+ io.write("---\n")
141
+ io.write("filter: erb\n")
142
+ end
143
+ File.open('layouts/foo/foo.rhtml', 'w') do |io|
144
+ io.write('Lorem ipsum dolor sit amet...')
145
+ end
146
+
147
+ # Load layouts
148
+ layouts = data_source.layouts
149
+
150
+ # Check layouts
151
+ assert_equal(1, layouts.size)
152
+ assert_equal('erb', layouts[0][:filter])
153
+ assert_equal('rhtml', layouts[0][:extension])
154
+ assert_equal('layouts/foo/foo.rhtml', layouts[0][:content_filename])
155
+ assert_equal('layouts/foo/foo.yaml', layouts[0][:meta_filename])
156
+ end
157
+
158
+ def test_layouts_with_period_in_name_disallowing_periods_in_identifiers
159
+ data_source = new_data_source
160
+
161
+ # Create foo.html
162
+ FileUtils.mkdir_p('layouts/foo')
163
+ File.open('layouts/foo/foo.yaml', 'w') do |io|
164
+ io.write(YAML.dump({ 'dog' => 'woof' }))
165
+ end
166
+ File.open('layouts/foo/foo.html', 'w') do |io|
167
+ io.write('body.foo {}')
168
+ end
169
+
170
+ # Create bar.html.erb
171
+ FileUtils.mkdir_p('layouts/bar')
172
+ File.open('layouts/bar/bar.yaml', 'w') do |io|
173
+ io.write(YAML.dump({ 'cat' => 'meow' }))
174
+ end
175
+ File.open('layouts/bar/bar.html.erb', 'w') do |io|
176
+ io.write('body.foobar {}')
177
+ end
178
+
179
+ # Load
180
+ layouts = data_source.layouts.sort_by { |i| i.identifier }
181
+
182
+ # Check
183
+ assert_equal 2, layouts.size
184
+ assert_equal '/bar/', layouts[0].identifier
185
+ assert_equal 'meow', layouts[0][:cat]
186
+ assert_equal '/foo/', layouts[1].identifier
187
+ assert_equal 'woof', layouts[1][:dog]
188
+ end
189
+
190
+ def test_layouts_with_period_in_name_allowing_periods_in_identifiers
191
+ data_source = new_data_source(:allow_periods_in_identifiers => true)
192
+
193
+ # Create foo.html
194
+ FileUtils.mkdir_p('layouts/foo')
195
+ File.open('layouts/foo/foo.yaml', 'w') do |io|
196
+ io.write(YAML.dump({ 'dog' => 'woof' }))
197
+ end
198
+ File.open('layouts/foo/foo.html', 'w') do |io|
199
+ io.write('body.foo {}')
200
+ end
201
+
202
+ # Create bar.html.erb
203
+ FileUtils.mkdir_p('layouts/bar.xyz')
204
+ File.open('layouts/bar.xyz/bar.xyz.yaml', 'w') do |io|
205
+ io.write(YAML.dump({ 'cat' => 'meow' }))
206
+ end
207
+ File.open('layouts/bar.xyz/bar.xyz.html', 'w') do |io|
208
+ io.write('body.foobar {}')
209
+ end
210
+
211
+ # Load
212
+ layouts = data_source.layouts.sort_by { |i| i.identifier }
213
+
214
+ # Check
215
+ assert_equal 2, layouts.size
216
+ assert_equal '/bar.xyz/', layouts[0].identifier
217
+ assert_equal 'meow', layouts[0][:cat]
218
+ assert_equal '/foo/', layouts[1].identifier
219
+ assert_equal 'woof', layouts[1][:dog]
220
+ end
221
+
222
+ def test_create_item_at_root
223
+ # Create item
224
+ data_source = new_data_source
225
+ data_source.create_item('content here', { :foo => 'bar' }, '/')
226
+
227
+ # Check file existance
228
+ assert File.directory?('content')
229
+ assert File.file?('content/content.html')
230
+ assert File.file?('content/content.yaml')
231
+
232
+ # Check file content
233
+ assert_equal 'content here', File.read('content/content.html')
234
+ assert_match 'foo: bar', File.read('content/content.yaml')
235
+ end
236
+
237
+ def test_create_item_not_at_root
238
+ # Create item
239
+ data_source = new_data_source
240
+ data_source.create_item('content here', { :foo => 'bar' }, '/moo/')
241
+
242
+ # Check file existance
243
+ assert File.directory?('content/moo')
244
+ assert File.file?('content/moo/moo.html')
245
+ assert File.file?('content/moo/moo.yaml')
246
+
247
+ # Check file content
248
+ assert_equal 'content here', File.read('content/moo/moo.html')
249
+ assert_match 'foo: bar', File.read('content/moo/moo.yaml')
250
+ end
251
+
252
+ def test_create_layout
253
+ # Create layout
254
+ data_source = new_data_source
255
+ data_source.create_layout('content here', { :foo => 'bar' }, '/moo/')
256
+
257
+ # Check file existance
258
+ assert File.directory?('layouts/moo')
259
+ assert File.file?('layouts/moo/moo.html')
260
+ assert File.file?('layouts/moo/moo.yaml')
261
+
262
+ # Check file content
263
+ assert_equal 'content here', File.read('layouts/moo/moo.html')
264
+ assert_match 'foo: bar', File.read('layouts/moo/moo.yaml')
265
+ end
266
+
267
+ def test_load_binary_objects
268
+ # Create data source
269
+ data_source = new_data_source
270
+
271
+ # Create sample files
272
+ FileUtils.mkdir_p('foo')
273
+ File.open('foo/stuff.dat', 'w') { |io| io.write("random binary data") }
274
+
275
+ # Load
276
+ items = data_source.send(:load_objects, 'foo', 'item', Nanoc::Item)
277
+
278
+ # Check
279
+ assert_equal 1, items.size
280
+ assert items[0].binary?
281
+ assert_equal 'foo/stuff.dat', items[0].raw_filename
282
+ assert_nil items[0].raw_content
283
+ end
284
+
285
+ def test_filename_for_with_single
286
+ data_source = new_data_source
287
+
288
+ FileUtils.mkdir_p('foo/bar')
289
+ File.open('foo/bar.ext', 'w') { |io| io.write('o hai') }
290
+ assert_equal 'foo/bar.ext', data_source.send(:filename_for, 'foo/bar', 'ext')
291
+ end
292
+
293
+ def test_filename_for_with_double
294
+ data_source = new_data_source
295
+
296
+ FileUtils.mkdir_p('foo/bar')
297
+ File.open('foo/bar/bar.ext', 'w') { |io| io.write('o hai') }
298
+ assert_equal 'foo/bar/bar.ext', data_source.send(:filename_for, 'foo/bar', 'ext')
299
+ end
300
+
301
+ def test_filename_for_with_index
302
+ data_source = new_data_source
303
+
304
+ FileUtils.mkdir_p('foo/bar')
305
+ File.open('foo/bar/index.ext', 'w') { |io| io.write('o hai') }
306
+ assert_equal 'foo/bar/index.ext', data_source.send(:filename_for, 'foo/bar', 'ext')
307
+ end
308
+
309
+ def test_filename_for_with_nil
310
+ data_source = new_data_source
311
+
312
+ assert_equal nil, data_source.send(:filename_for, 'foo/bar', nil)
313
+ end
314
+
315
+ def test_filename_for_with_single_and_empty_ext
316
+ data_source = new_data_source
317
+
318
+ FileUtils.mkdir_p('foo')
319
+ File.open('foo/bar', 'w') { |io| io.write('o hai') }
320
+ assert_equal 'foo/bar', data_source.send(:filename_for, 'foo/bar', '')
321
+ end
322
+
323
+ def test_filename_for_with_double_and_empty_ext
324
+ data_source = new_data_source
325
+
326
+ FileUtils.mkdir_p('foo/bar')
327
+ File.open('foo/bar/bar', 'w') { |io| io.write('o hai') }
328
+ assert_equal 'foo/bar/bar', data_source.send(:filename_for, 'foo/bar', '')
329
+ end
330
+
331
+ def test_filename_for_with_index_and_empty_ext
332
+ data_source = new_data_source
333
+
334
+ FileUtils.mkdir_p('foo/bar')
335
+ File.open('foo/bar/index', 'w') { |io| io.write('o hai') }
336
+ assert_equal 'foo/bar/index', data_source.send(:filename_for, 'foo/bar', '')
337
+ end
338
+
339
+ def test_compile_huge_site
340
+ if_implemented do
341
+ # Create data source
342
+ data_source = new_data_source
343
+
344
+ # Create a lot of items
345
+ count = Process.getrlimit(Process::RLIMIT_NOFILE)[0] + 5
346
+ count.times do |i|
347
+ FileUtils.mkdir_p("content/#{i}")
348
+ File.open("content/#{i}/#{i}.html", 'w') { |io| io << "This is item #{i}." }
349
+ File.open("content/#{i}/#{i}.yaml", 'w') { |io| io << "title: Item #{i}" }
350
+ end
351
+
352
+ # Read all items
353
+ data_source.items
354
+ end
355
+ end
356
+
357
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::ExtraCoreExtEnumerableTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ class MyCollection
8
+
9
+ include Enumerable
10
+
11
+ def initialize(array)
12
+ @array = array
13
+ end
14
+
15
+ def each(&block)
16
+ @array.each { |i| block.call(i) }
17
+ end
18
+
19
+ end
20
+
21
+ def test_group_by
22
+ input = MyCollection.new([ 'foo', 'bar', 'baz' ])
23
+
24
+ output_expected = { ?f => [ 'foo' ], ?b => [ 'bar', 'baz' ] }
25
+ output_actual = input.group_by { |i| i[0] }
26
+
27
+ assert_equal output_expected, output_actual
28
+ end
29
+
30
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Extra::CoreExtPathnameTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def test_components
8
+ assert_equal %w( / a bb ccc dd e ), Pathname.new('/a/bb/ccc/dd/e').components
9
+ end
10
+
11
+ def test_include_component
12
+ assert Pathname.new('/home/ddfreyne/').include_component?('ddfreyne')
13
+ refute Pathname.new('/home/ddfreyne/').include_component?('acid')
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::ExtraCoreExtTimeTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def test_to_iso8601_date
8
+ assert_equal('2008-05-19', Time.utc(2008, 5, 19, 14, 20, 0, 0).to_iso8601_date)
9
+ end
10
+
11
+ def test_to_iso8601_time
12
+ assert_equal('2008-05-19T14:20:00Z', Time.utc(2008, 5, 19, 14, 20, 0, 0).to_iso8601_time)
13
+ end
14
+
15
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Extra::Deployers::FogTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def test_run
8
+ if_have 'fog' do
9
+ # Create deployer
10
+ fog = Nanoc::Extra::Deployers::Fog.new(
11
+ 'output/',
12
+ {
13
+ :bucket => 'mybucket',
14
+ :provider => 'local',
15
+ :local_root => 'mylocalcloud'})
16
+
17
+ # Create site
18
+ FileUtils.mkdir_p('output')
19
+ File.open('output/meow', 'w') { |io| io.write "I am a cat!" }
20
+ File.open('output/bark', 'w') { |io| io.write "I am a dog!" }
21
+
22
+ # Create local cloud (but not bucket)
23
+ FileUtils.mkdir_p('mylocalcloud')
24
+
25
+ # Run
26
+ fog.run
27
+
28
+ # Check
29
+ assert File.file?('mylocalcloud/mybucket/meow')
30
+ assert File.file?('mylocalcloud/mybucket/bark')
31
+ assert_equal "I am a cat!", File.read('mylocalcloud/mybucket/meow')
32
+ assert_equal "I am a dog!", File.read('mylocalcloud/mybucket/bark')
33
+ end
34
+ end
35
+
36
+ def test_run_with_dry_run
37
+ if_have 'fog' do
38
+ begin
39
+ # Create deployer
40
+ fog = Nanoc::Extra::Deployers::Fog.new(
41
+ 'output/',
42
+ {
43
+ :provider => 'aws',
44
+ # FIXME bucket is necessary for deployer but fog doesn't like it
45
+ :bucket_name => 'doesntmatter',
46
+ :aws_access_key_id => 'meh',
47
+ :aws_secret_access_key => 'dontcare'},
48
+ :dry_run => true)
49
+
50
+ # Create site
51
+ FileUtils.mkdir_p('output')
52
+ File.open('output/meow', 'w') { |io| io.write "I am a cat!" }
53
+ File.open('output/bark', 'w') { |io| io.write "I am a dog!" }
54
+
55
+ # Create local cloud (but not bucket)
56
+ FileUtils.mkdir_p('mylocalcloud')
57
+
58
+ # Run
59
+ fog.run
60
+ ensure
61
+ # Hack :(
62
+ ::Fog.instance_eval { @mocking = false }
63
+ end
64
+ end
65
+ end
66
+
67
+ end