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,81 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Helpers::BreadcrumbsTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ include Nanoc::Helpers::Breadcrumbs
8
+
9
+ def test_breadcrumbs_trail_at_root
10
+ # Mock item
11
+ @item = mock
12
+ @item.stubs(:identifier).returns('/')
13
+ @items = [ @item ]
14
+
15
+ # Build trail
16
+ trail = breadcrumbs_trail
17
+
18
+ # Check
19
+ assert_equal(
20
+ [ @item ],
21
+ trail
22
+ )
23
+ end
24
+
25
+ def test_breadcrumbs_trail_with_1_parent
26
+ # Mock item
27
+ parent = mock
28
+ parent.stubs(:identifier).returns('/')
29
+ @item = mock
30
+ @item.stubs(:identifier).returns('/foo/')
31
+ @items = [ parent, @item ]
32
+
33
+ # Build trail
34
+ trail = breadcrumbs_trail
35
+
36
+ # Check
37
+ assert_equal(
38
+ [ parent, @item ],
39
+ trail
40
+ )
41
+ end
42
+
43
+ def test_breadcrumbs_trail_with_many_parents
44
+ # Mock item
45
+ grandparent = mock
46
+ grandparent.stubs(:identifier).returns('/')
47
+ parent = mock
48
+ parent.stubs(:identifier).returns('/foo/')
49
+ @item = mock
50
+ @item.stubs(:identifier).returns('/foo/bar/')
51
+ @items = [ grandparent, parent, @item ]
52
+
53
+ # Build trail
54
+ trail = breadcrumbs_trail
55
+
56
+ # Check
57
+ assert_equal(
58
+ [ grandparent, parent, @item ],
59
+ trail
60
+ )
61
+ end
62
+
63
+ def test_breadcrumbs_trail_with_nils
64
+ # Mock item
65
+ grandparent = mock
66
+ grandparent.stubs(:identifier).returns('/')
67
+ @item = mock
68
+ @item.stubs(:identifier).returns('/foo/bar/')
69
+ @items = [ grandparent, @item ]
70
+
71
+ # Build trail
72
+ trail = breadcrumbs_trail
73
+
74
+ # Check
75
+ assert_equal(
76
+ [ grandparent, nil, @item ],
77
+ trail
78
+ )
79
+ end
80
+
81
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Helpers::CapturingTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ include Nanoc::Helpers::Capturing
8
+
9
+ def test_content_for
10
+ require 'erb'
11
+
12
+ # Build content to be evaluated
13
+ content = "head <% content_for :sidebar do %>\n" +
14
+ " <%= 1+2 %>\n" +
15
+ "<% end %> foot"
16
+
17
+ # Evaluate content
18
+ @item = Nanoc::Item.new('moo', {}, '/blah/')
19
+ result = ::ERB.new(content).result(binding)
20
+
21
+ # Check
22
+ assert_equal '3', content_for(@item, :sidebar).strip
23
+ assert_equal '3', @item[:content_for_sidebar].strip
24
+ assert_match(/^head\s+foot$/, result)
25
+ end
26
+
27
+ def test_capture
28
+ require 'erb'
29
+
30
+ # Capture
31
+ _erbout = 'foo'
32
+ captured_content = capture do
33
+ _erbout << 'bar'
34
+ end
35
+
36
+ # Check
37
+ assert_equal 'foo', _erbout
38
+ assert_equal 'bar', captured_content
39
+ end
40
+
41
+ end
@@ -0,0 +1,106 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Helpers::FilteringTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ include Nanoc::Helpers::Filtering
8
+
9
+ def test_filter_simple
10
+ if_have 'rubypants' do
11
+ # Build content to be evaluated
12
+ content = "<p>Foo...</p>\n" +
13
+ "<% filter :rubypants do %>\n" +
14
+ " <p>Bar...</p>\n" +
15
+ "<% end %>\n"
16
+
17
+ # Mock item and rep
18
+ @item_rep = mock
19
+ @item_rep.expects(:assigns).returns({})
20
+
21
+ # Evaluate content
22
+ result = ::ERB.new(content).result(binding)
23
+
24
+ # Check
25
+ assert_match('<p>Foo...</p>', result)
26
+ assert_match('<p>Bar&#8230;</p>', result)
27
+ end
28
+ end
29
+
30
+ def test_filter_with_assigns
31
+ if_have 'rubypants' do
32
+ # Build content to be evaluated
33
+ content = "<p>Foo...</p>\n" +
34
+ "<% filter :erb do %>\n" +
35
+ " <p><%%= @item[:title] %></p>\n" +
36
+ "<% end %>\n"
37
+
38
+ # Mock item and rep
39
+ @item = mock
40
+ @item.expects(:[]).with(:title).returns('Bar...')
41
+ @item.expects(:identifier).returns('/blah/')
42
+ @item_rep = mock
43
+ @item_rep.expects(:name).returns('default')
44
+ @item_rep.expects(:assigns).returns({
45
+ :item => @item,
46
+ :item_rep => @item_rep
47
+ })
48
+
49
+ # Evaluate content
50
+ result = ::ERB.new(content).result(binding)
51
+
52
+ # Check
53
+ assert_match('<p>Foo...</p>', result)
54
+ assert_match('<p>Bar...</p>', result)
55
+ end
56
+ end
57
+
58
+ def test_filter_with_unknown_filter_name
59
+ # Build content to be evaluated
60
+ content = "<p>Foo...</p>\n" +
61
+ "<% filter :askjdflkawgjlkwaheflnvz do %>\n" +
62
+ " <p>Blah blah blah.</p>\n" +
63
+ "<% end %>\n"
64
+
65
+ # Evaluate content
66
+ error = assert_raises(Nanoc::Errors::UnknownFilter) do
67
+ ::ERB.new(content).result(binding)
68
+ end
69
+ end
70
+
71
+ def test_filter_with_arguments
72
+ if_have 'coderay' do
73
+ # Build content to be evaluated
74
+ content = "<% filter :coderay, :language => 'ruby' do %>\n" +
75
+ " def some_function ; x = blah.foo ; x.bar 'xyzzy' ; end\n" +
76
+ "<% end %>\n"
77
+
78
+ # Mock item and rep
79
+ @item_rep = mock
80
+ @item_rep.expects(:assigns).returns({})
81
+
82
+ # Evaluate content
83
+ result = ::ERB.new(content).result(binding)
84
+ assert_match(%r{<span class="keyword">def</span> <span class="function">some_function</span>}, result)
85
+ end
86
+ end
87
+
88
+ def test_with_haml
89
+ if_have 'haml' do
90
+ # Build content to be evaluated
91
+ content = "%p Foo.\n" +
92
+ "- filter(:erb) do\n" +
93
+ " <%= 'abc' + 'xyz' %>\n" +
94
+ "%p Bar.\n"
95
+
96
+ # Mock item and rep
97
+ @item_rep = mock
98
+ @item_rep.expects(:assigns).returns({})
99
+
100
+ # Evaluate content
101
+ result = ::Haml::Engine.new(content).render(binding)
102
+ assert_match(%r{^<p>Foo.</p>\s*abcxyz\s*<p>Bar.</p>$}, result)
103
+ end
104
+ end
105
+
106
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Helpers::HTMLEscapeTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ include Nanoc::Helpers::HTMLEscape
8
+
9
+ def test_html_escape_with_string
10
+ assert_equal('&lt;', html_escape('<'))
11
+ assert_equal('&gt;', html_escape('>'))
12
+ assert_equal('&amp;', html_escape('&'))
13
+ assert_equal('&quot;', html_escape('"'))
14
+ end
15
+
16
+ def test_html_escape_with_block
17
+ _erbout = 'moo'
18
+
19
+ html_escape do
20
+ _erbout << '<h1>Looks like a header</h1>'
21
+ end
22
+
23
+ assert_equal 'moo&lt;h1&gt;Looks like a header&lt;/h1&gt;', _erbout
24
+ end
25
+
26
+ def test_html_escape_without_string_or_block
27
+ assert_raises RuntimeError do
28
+ h
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,249 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Helpers::LinkToTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ include Nanoc::Helpers::LinkTo
8
+
9
+ def test_link_to_with_path
10
+ # Check
11
+ assert_equal(
12
+ '<a href="/foo/">Foo</a>',
13
+ link_to('Foo', '/foo/')
14
+ )
15
+ end
16
+
17
+ def test_link_to_with_rep
18
+ # Create rep
19
+ rep = mock
20
+ rep.stubs(:path).returns('/bar/')
21
+
22
+ # Check
23
+ assert_equal(
24
+ '<a href="/bar/">Bar</a>',
25
+ link_to('Bar', rep)
26
+ )
27
+ end
28
+
29
+ def test_link_to_with_item
30
+ # Create rep
31
+ item = mock
32
+ item.stubs(:path).returns('/bar/')
33
+
34
+ # Check
35
+ assert_equal(
36
+ '<a href="/bar/">Bar</a>',
37
+ link_to('Bar', item)
38
+ )
39
+ end
40
+
41
+ def test_link_to_with_attributes
42
+ # Check
43
+ assert_equal(
44
+ '<a title="Dis mai foo!" href="/foo/">Foo</a>',
45
+ link_to('Foo', '/foo/', :title => 'Dis mai foo!')
46
+ )
47
+ end
48
+
49
+ def test_link_to_escape
50
+ # Check
51
+ assert_equal(
52
+ '<a title="Foo &amp; Bar" href="/foo&amp;bar/">Foo &amp; Bar</a>',
53
+ link_to('Foo &amp; Bar', '/foo&bar/', :title => 'Foo & Bar')
54
+ )
55
+ end
56
+
57
+ def test_link_to_to_nil_item_or_item_rep
58
+ obj = Object.new
59
+ def obj.path ; nil ; end
60
+
61
+ assert_raises RuntimeError do
62
+ link_to("Some Text", obj)
63
+ end
64
+ end
65
+
66
+ def test_link_to_unless_current_current
67
+ # Create item
68
+ @item_rep = mock
69
+ @item_rep.stubs(:path).returns('/foo/')
70
+
71
+ # Check
72
+ assert_equal(
73
+ '<span class="active" title="You\'re here.">Bar</span>',
74
+ link_to_unless_current('Bar', @item_rep)
75
+ )
76
+ ensure
77
+ @item = nil
78
+ end
79
+
80
+ def test_link_to_unless_current_not_current
81
+ # Create item
82
+ @item_rep = mock
83
+ @item_rep.stubs(:path).returns('/foo/')
84
+
85
+ # Check
86
+ assert_equal(
87
+ '<a href="/abc/xyz/">Bar</a>',
88
+ link_to_unless_current('Bar', '/abc/xyz/')
89
+ )
90
+ end
91
+
92
+ def test_relative_path_to_with_self
93
+ # Mock item
94
+ @item_rep = mock
95
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
96
+
97
+ # Test
98
+ assert_equal(
99
+ './',
100
+ relative_path_to('/foo/bar/baz/')
101
+ )
102
+ end
103
+
104
+ def test_relative_path_to_with_root
105
+ # Mock item
106
+ @item_rep = mock
107
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
108
+
109
+ # Test
110
+ assert_equal(
111
+ '../../../',
112
+ relative_path_to('/')
113
+ )
114
+ end
115
+
116
+ def test_relative_path_to_file
117
+ # Mock item
118
+ @item_rep = mock
119
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
120
+
121
+ # Test
122
+ assert_equal(
123
+ '../../quux',
124
+ relative_path_to('/foo/quux')
125
+ )
126
+ end
127
+
128
+ def test_relative_path_to_dir
129
+ # Mock item
130
+ @item_rep = mock
131
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
132
+
133
+ # Test
134
+ assert_equal(
135
+ '../../quux/',
136
+ relative_path_to('/foo/quux/')
137
+ )
138
+ end
139
+
140
+ def test_relative_path_to_rep
141
+ # Mock self
142
+ @item_rep = mock
143
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
144
+
145
+ # Mock other
146
+ other_item_rep = mock
147
+ other_item_rep.stubs(:path).returns('/foo/quux/')
148
+
149
+ # Test
150
+ assert_equal(
151
+ '../../quux/',
152
+ relative_path_to(other_item_rep)
153
+ )
154
+ end
155
+
156
+
157
+ def test_relative_path_to_item
158
+ # Mock self
159
+ @item_rep = mock
160
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
161
+
162
+ # Mock other
163
+ other_item = mock
164
+ other_item.stubs(:path).returns('/foo/quux/')
165
+
166
+ # Test
167
+ assert_equal(
168
+ '../../quux/',
169
+ relative_path_to(other_item)
170
+ )
171
+ end
172
+
173
+ def test_relative_path_to_to_nil
174
+ # Mock self
175
+ @item_rep = mock
176
+ @item_rep.stubs(:path).returns(nil)
177
+
178
+ # Mock other
179
+ other_item_rep = mock
180
+ other_item_rep.stubs(:path).returns('/foo/quux/')
181
+
182
+ # Test
183
+ assert_raises RuntimeError do
184
+ relative_path_to(other_item_rep)
185
+ end
186
+ end
187
+
188
+ def test_relative_path_to_from_nil
189
+ # Mock self
190
+ @item_rep = mock
191
+ @item_rep.stubs(:path).returns('/foo/quux/')
192
+
193
+ # Mock other
194
+ other_item_rep = mock
195
+ other_item_rep.stubs(:path).returns(nil)
196
+
197
+ # Test
198
+ assert_raises RuntimeError do
199
+ relative_path_to(other_item_rep)
200
+ end
201
+ end
202
+
203
+ def test_examples_link_to
204
+ # Parse
205
+ YARD.parse('../lib/nanoc/helpers/link_to.rb')
206
+
207
+ # Mock
208
+ @items = [ mock, mock, mock ]
209
+ @items[0].stubs(:identifier).returns('/about/')
210
+ @items[0].stubs(:path).returns('/about.html')
211
+ @items[1].stubs(:identifier).returns('/software/')
212
+ @items[1].stubs(:path).returns('/software.html')
213
+ @items[2].stubs(:identifier).returns('/software/nanoc/')
214
+ @items[2].stubs(:path).returns('/software/nanoc.html')
215
+ about_rep_vcard = mock
216
+ about_rep_vcard.stubs(:path).returns('/about.vcf')
217
+ @items[0].stubs(:rep).with(:vcard).returns(about_rep_vcard)
218
+
219
+ # Run
220
+ assert_examples_correct 'Nanoc::Helpers::LinkTo#link_to'
221
+ end
222
+
223
+ def test_examples_link_to_unless_current
224
+ # Parse
225
+ YARD.parse('../lib/nanoc/helpers/link_to.rb')
226
+
227
+ # Mock
228
+ @item_rep = mock
229
+ @item_rep.stubs(:path).returns('/about/')
230
+ @item = mock
231
+ @item.stubs(:path).returns(@item_rep.path)
232
+
233
+ # Run
234
+ assert_examples_correct 'Nanoc::Helpers::LinkTo#link_to_unless_current'
235
+ end
236
+
237
+ def test_examples_relative_path_to
238
+ # Parse
239
+ YARD.parse('../lib/nanoc/helpers/link_to.rb')
240
+
241
+ # Mock
242
+ @item_rep = mock
243
+ @item_rep.stubs(:path).returns('/foo/bar/')
244
+
245
+ # Run
246
+ assert_examples_correct 'Nanoc::Helpers::LinkTo#relative_path_to'
247
+ end
248
+
249
+ end