webgen 0.5.8 → 0.5.9

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 (142) hide show
  1. data/COPYING +4 -0
  2. data/ChangeLog +1037 -0
  3. data/Rakefile +5 -6
  4. data/THANKS +1 -0
  5. data/VERSION +1 -1
  6. data/bin/webgen +1 -1
  7. data/data/webgen/passive_sources/images/generated_by_webgen.png +0 -0
  8. data/data/webgen/passive_sources/images/webgen_logo.png +0 -0
  9. data/data/webgen/passive_sources/stylesheets/coderay-default.css +129 -0
  10. data/data/webgen/passive_sources/templates/atom_feed.template +38 -0
  11. data/data/webgen/passive_sources/templates/rss_feed.template +28 -0
  12. data/data/webgen/passive_sources/templates/sitemap.template +21 -0
  13. data/data/webgen/resources.yaml +2 -1
  14. data/data/webgen/website_skeleton/Rakefile +5 -1
  15. data/doc/contentprocessor/builder.page +2 -2
  16. data/doc/contentprocessor/erb.page +5 -2
  17. data/doc/contentprocessor/erubis.page +2 -2
  18. data/doc/contentprocessor/head.page +21 -0
  19. data/doc/contentprocessor/tidy.page +14 -0
  20. data/doc/extensions.page +1 -1
  21. data/doc/faq.page +2 -2
  22. data/doc/manual.page +108 -43
  23. data/doc/reference_configuration.page +83 -5
  24. data/doc/reference_metainfo.page +24 -4
  25. data/doc/reference_website_styles.page +2 -2
  26. data/doc/sourcehandler/feed.page +11 -13
  27. data/doc/sourcehandler/metainfo.page +10 -3
  28. data/doc/sourcehandler/page.page +4 -4
  29. data/doc/sourcehandler/sitemap.page +8 -7
  30. data/doc/tag/coderay.page +6 -2
  31. data/doc/tag/includefile.page +1 -1
  32. data/doc/tag/menu.page +3 -0
  33. data/lib/webgen/cli/apply_command.rb +1 -1
  34. data/lib/webgen/cli/utils.rb +2 -2
  35. data/lib/webgen/common.rb +0 -9
  36. data/lib/webgen/contentprocessor.rb +18 -3
  37. data/lib/webgen/contentprocessor/blocks.rb +67 -36
  38. data/lib/webgen/contentprocessor/builder.rb +5 -2
  39. data/lib/webgen/contentprocessor/erb.rb +4 -2
  40. data/lib/webgen/contentprocessor/erubis.rb +5 -2
  41. data/lib/webgen/contentprocessor/haml.rb +6 -2
  42. data/lib/webgen/contentprocessor/head.rb +64 -0
  43. data/lib/webgen/contentprocessor/maruku.rb +3 -1
  44. data/lib/webgen/contentprocessor/rdiscount.rb +2 -0
  45. data/lib/webgen/contentprocessor/rdoc.rb +2 -0
  46. data/lib/webgen/contentprocessor/redcloth.rb +2 -0
  47. data/lib/webgen/contentprocessor/sass.rb +5 -3
  48. data/lib/webgen/contentprocessor/tags.rb +40 -24
  49. data/lib/webgen/contentprocessor/tidy.rb +38 -0
  50. data/lib/webgen/context.rb +13 -4
  51. data/lib/webgen/context/render.rb +32 -0
  52. data/lib/webgen/context/tags.rb +20 -0
  53. data/lib/webgen/default_config.rb +15 -4
  54. data/lib/webgen/deprecated.rb +38 -4
  55. data/lib/webgen/error.rb +135 -0
  56. data/lib/webgen/node.rb +48 -40
  57. data/lib/webgen/output.rb +5 -3
  58. data/lib/webgen/output/filesystem.rb +4 -4
  59. data/lib/webgen/page.rb +4 -4
  60. data/lib/webgen/path.rb +161 -58
  61. data/lib/webgen/source.rb +9 -6
  62. data/lib/webgen/source/filesystem.rb +1 -1
  63. data/lib/webgen/source/stacked.rb +13 -5
  64. data/lib/webgen/source/tararchive.rb +6 -2
  65. data/lib/webgen/sourcehandler.rb +100 -54
  66. data/lib/webgen/sourcehandler/base.rb +58 -24
  67. data/lib/webgen/sourcehandler/copy.rb +6 -5
  68. data/lib/webgen/sourcehandler/directory.rb +3 -9
  69. data/lib/webgen/sourcehandler/feed.rb +25 -50
  70. data/lib/webgen/sourcehandler/fragment.rb +10 -8
  71. data/lib/webgen/sourcehandler/memory.rb +9 -10
  72. data/lib/webgen/sourcehandler/metainfo.rb +9 -9
  73. data/lib/webgen/sourcehandler/page.rb +6 -5
  74. data/lib/webgen/sourcehandler/sitemap.rb +22 -22
  75. data/lib/webgen/sourcehandler/template.rb +6 -6
  76. data/lib/webgen/sourcehandler/virtual.rb +19 -17
  77. data/lib/webgen/tag/base.rb +27 -27
  78. data/lib/webgen/tag/breadcrumbtrail.rb +3 -3
  79. data/lib/webgen/tag/coderay.rb +19 -8
  80. data/lib/webgen/tag/executecommand.rb +4 -3
  81. data/lib/webgen/tag/langbar.rb +2 -2
  82. data/lib/webgen/tag/link.rb +8 -7
  83. data/lib/webgen/tag/menu.rb +2 -2
  84. data/lib/webgen/tag/metainfo.rb +1 -1
  85. data/lib/webgen/tag/relocatable.rb +17 -21
  86. data/lib/webgen/tag/tikz.rb +7 -10
  87. data/lib/webgen/tree.rb +7 -7
  88. data/lib/webgen/version.rb +1 -1
  89. data/lib/webgen/website.rb +32 -2
  90. data/misc/default.css +8 -2
  91. data/misc/default.template +2 -2
  92. data/misc/logo.svg +313 -0
  93. data/misc/style.page +1 -1
  94. data/test/helper.rb +18 -2
  95. data/test/test_cli.rb +104 -0
  96. data/test/test_common_sitemap.rb +1 -1
  97. data/test/test_contentprocessor.rb +8 -2
  98. data/test/test_contentprocessor_blocks.rb +17 -8
  99. data/test/test_contentprocessor_builder.rb +13 -2
  100. data/test/test_contentprocessor_erb.rb +9 -3
  101. data/test/test_contentprocessor_erubis.rb +9 -3
  102. data/test/test_contentprocessor_fragments.rb +12 -11
  103. data/test/test_contentprocessor_haml.rb +11 -2
  104. data/test/test_contentprocessor_head.rb +44 -0
  105. data/test/test_contentprocessor_maruku.rb +5 -1
  106. data/test/test_contentprocessor_rdiscount.rb +4 -0
  107. data/test/test_contentprocessor_rdoc.rb +4 -0
  108. data/test/test_contentprocessor_redcloth.rb +5 -1
  109. data/test/test_contentprocessor_sass.rb +8 -2
  110. data/test/test_contentprocessor_tags.rb +22 -7
  111. data/test/test_contentprocessor_tidy.rb +34 -0
  112. data/test/test_context.rb +39 -0
  113. data/test/test_error.rb +85 -0
  114. data/test/test_node.rb +57 -21
  115. data/test/test_page.rb +23 -5
  116. data/test/test_path.rb +120 -64
  117. data/test/test_source_filesystem.rb +1 -1
  118. data/test/test_source_stacked.rb +19 -6
  119. data/test/test_sourcehandler_base.rb +63 -50
  120. data/test/test_sourcehandler_copy.rb +6 -6
  121. data/test/test_sourcehandler_directory.rb +8 -12
  122. data/test/test_sourcehandler_feed.rb +15 -7
  123. data/test/test_sourcehandler_fragment.rb +6 -5
  124. data/test/test_sourcehandler_main.rb +39 -0
  125. data/test/test_sourcehandler_memory.rb +4 -4
  126. data/test/test_sourcehandler_metainfo.rb +20 -11
  127. data/test/test_sourcehandler_page.rb +10 -10
  128. data/test/test_sourcehandler_sitemap.rb +24 -5
  129. data/test/test_sourcehandler_template.rb +18 -15
  130. data/test/test_sourcehandler_virtual.rb +9 -5
  131. data/test/test_tag_base.rb +6 -29
  132. data/test/test_tag_coderay.rb +16 -3
  133. data/test/test_tag_executecommand.rb +2 -2
  134. data/test/test_tag_link.rb +5 -4
  135. data/test/test_tag_menu.rb +15 -15
  136. data/test/test_tag_metainfo.rb +1 -0
  137. data/test/test_tag_relocatable.rb +3 -2
  138. data/test/test_tag_tikz.rb +5 -5
  139. data/test/test_tree.rb +8 -8
  140. data/test/test_website.rb +15 -0
  141. metadata +21 -14
  142. data/test/test_common.rb +0 -18
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'test/unit'
4
+ require 'helper'
5
+ require 'webgen/contentprocessor'
6
+
7
+ class TestContentProcessorTidy < Test::Unit::TestCase
8
+
9
+ include Test::WebsiteHelper
10
+
11
+ def test_call
12
+ obj = Webgen::ContentProcessor::Tidy.new
13
+ root = Webgen::Node.new(Webgen::Tree.new.dummy_root, '/', '/')
14
+ node = Webgen::Node.new(root, '/test', 'test')
15
+ context = Webgen::Context.new(:content => "testcontent", :chain => [node])
16
+
17
+ tmp, ENV['PATH'] = ENV['PATH'], '/sbin'
18
+ assert_raise(Webgen::CommandNotFoundError) { obj.call(context) }
19
+ ENV['PATH'] = tmp
20
+
21
+ output = StringIO.new('')
22
+ @website.logger = ::Logger.new(output)
23
+ @website.logger.level = Logger::WARN
24
+
25
+ assert_match(/html.*testcontent/im, obj.call(context).content)
26
+ output.rewind; assert_match(/inserting missing/, output.read)
27
+
28
+ output.string = ''
29
+ context.content = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"><html><head><title>t</title></head><body>b</body></html'
30
+ assert_match(/body.*b.*body/im, obj.call(context).content)
31
+ assert_equal(0, output.string.length)
32
+ end
33
+
34
+ end
@@ -6,14 +6,28 @@ require 'webgen/context'
6
6
 
7
7
  class TestContext < Test::Unit::TestCase
8
8
 
9
+ include Test::WebsiteHelper
10
+
9
11
  def setup
12
+ super
10
13
  @context = Webgen::Context.new(:content => 'test', :key => :value, :chain => [:first, :last])
11
14
  end
12
15
 
13
16
  def test_initialize
14
17
  context = Webgen::Context.new
15
18
  assert_equal('', context.content)
19
+ assert_equal({}, context.persistent)
16
20
  assert_kind_of(Webgen::ContentProcessor::AccessHash, context[:processors])
21
+
22
+ context = Webgen::Context.new(:content => 'test', :key => :value)
23
+ assert_equal('test', context.content)
24
+ assert_equal(:value, context[:key])
25
+ assert_equal({}, context.persistent)
26
+
27
+ context = Webgen::Context.new({:content => 'test', :key => :value}, {:other => :val})
28
+ assert_equal('test', context.content)
29
+ assert_equal(:value, context[:key])
30
+ assert_equal({:other => :val}, context.persistent)
17
31
  end
18
32
 
19
33
  def test_clone
@@ -39,4 +53,29 @@ class TestContext < Test::Unit::TestCase
39
53
  assert_equal(:other, @context.dest_node)
40
54
  end
41
55
 
56
+ def test_tags_methods
57
+ @context[:chain] = [Webgen::Tree.new.dummy_root]
58
+
59
+ klass = Class.new do
60
+ def set_params(*args); end
61
+ def create_tag_params(*args); end
62
+ def create_params_hash(*args); end
63
+ def call(tag, body, context); 'mivalue'; end
64
+ end
65
+ (@website.cache.volatile[:classes] ||= {})['TestTag'] = klass.new
66
+ @website.config['contentprocessor.tags.map'].update(:default => 'TestTag')
67
+
68
+ assert_equal('mivalue', @context.tag('mivalue'))
69
+ end
70
+
71
+ def test_render_methods
72
+ root = Webgen::Node.new(Webgen::Tree.new.dummy_root, '/', '/')
73
+ node = Webgen::Node.new(root, 'test', 'test')
74
+ node.node_info[:page] = Webgen::Page.from_data("--- name:content\ndata\n--- name:other\nother")
75
+ @context[:chain] = [root, node]
76
+
77
+ assert_equal('data', @context.render_block('content'))
78
+ assert_equal('other', @context.render_block(:name => 'other'))
79
+ end
80
+
42
81
  end
@@ -0,0 +1,85 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'test/unit'
4
+ require 'webgen/error'
5
+
6
+ class TestError < Test::Unit::TestCase
7
+
8
+ def test_all
9
+ e = Webgen::Error.new("test")
10
+ assert_equal("test", e.plain_message)
11
+ assert_match(/Error while working:/, e.message)
12
+
13
+ e = Webgen::Error.new("test", 'KlassName')
14
+ assert_equal("test", e.plain_message)
15
+ assert_equal('KlassName', e.class_name)
16
+ assert_match(/Error while working with KlassName:/, e.message)
17
+
18
+ e = Webgen::Error.new("test", 'KlassName', '/path')
19
+ assert_equal("test", e.plain_message)
20
+ assert_equal('KlassName', e.class_name)
21
+ assert_equal('/path', e.alcn)
22
+ assert_match(/Error while working on <\/path> with KlassName:/, e.message)
23
+
24
+ e = Webgen::Error.new(Exception.new("test"))
25
+ assert_equal("test", e.plain_message)
26
+ assert_match(/Error while working:/, e.message)
27
+ end
28
+
29
+ end
30
+
31
+ class TestNodeCreationError < Test::Unit::TestCase
32
+
33
+ def test_all
34
+ e = Webgen::NodeCreationError.new("test")
35
+ assert_equal("test", e.plain_message)
36
+ assert_match(/Error while creating a node:/, e.message)
37
+ end
38
+
39
+ end
40
+
41
+ class TestRenderError < Test::Unit::TestCase
42
+
43
+ def test_all
44
+ e = Webgen::RenderError.new("test", 'KlassName', '/path', '/error')
45
+ assert_equal("/error", e.error_alcn)
46
+ assert_match(/Error in <\/error> while rendering <\/path>/, e.message)
47
+
48
+ e = Webgen::RenderError.new("test", 'KlassName', '/path', '/error', 5)
49
+ assert_equal("/error", e.error_alcn)
50
+ assert_match(/Error in <\/error:~5> while rendering <\/path>/, e.message)
51
+ end
52
+
53
+ end
54
+
55
+ class TestLoadError < Test::Unit::TestCase
56
+
57
+ def test_all
58
+ e = Webgen::LoadError.new(Exception.new("something"), 'KlassName', '/path')
59
+ assert_nil(e.library)
60
+ assert_nil(e.gem)
61
+ assert_match(/Error while working on <\/path> with KlassName:.*something/m, e.message)
62
+
63
+ e = Webgen::LoadError.new("test", 'KlassName', '/path')
64
+ assert_equal("test", e.library)
65
+ assert_nil(e.gem)
66
+ assert_match(/Error while working on <\/path> with KlassName:.*The needed library 'test' is missing/m, e.message)
67
+
68
+ e = Webgen::LoadError.new("test", 'KlassName', '/path', 'gem')
69
+ assert_equal("test", e.library)
70
+ assert_equal('gem', e.gem)
71
+ assert_match(/Error while working on <\/path> with KlassName:.*The needed library 'test' is missing.*gem install gem/m, e.message)
72
+ end
73
+
74
+ end
75
+
76
+
77
+ class TestCommandNotFoundError < Test::Unit::TestCase
78
+
79
+ def test_all
80
+ e = Webgen::CommandNotFoundError.new("test", 'KlassName', '/path')
81
+ assert_equal("test", e.cmd)
82
+ assert_match(/Error while working on <\/path> with KlassName:.*The needed command 'test' is missing/m, e.message)
83
+ end
84
+
85
+ end
@@ -11,7 +11,7 @@ class TestNode < Test::Unit::TestCase
11
11
 
12
12
  def setup
13
13
  super
14
- @tree = Webgen::Tree.new
14
+ @tree = @website.tree
15
15
  end
16
16
 
17
17
  def create_default_nodes
@@ -23,7 +23,7 @@ class TestNode < Test::Unit::TestCase
23
23
  :other_en => Webgen::Node.new(node, '/other1.html', 'other.page', {'lang' => 'en'}),
24
24
  :somename_en_frag => frag_en = Webgen::Node.new(child_en, '/somename.en.html#frag', '#othertest', {'title' => 'frag'}),
25
25
  :somename_de_frag => Webgen::Node.new(child_de, '/somename.de.html#frag', '#othertest'),
26
- :somename_en_fragnest => Webgen::Node.new(frag_en, '/somename.en.html#fragnest', '#nestedpath'),
26
+ :somename_en_fragnest => Webgen::Node.new(frag_en, '/somename.en.html#fragnest/', '#nestedpath'),
27
27
  :dir => dir = Webgen::Node.new(node, '/dir/', 'dir/'),
28
28
  :dir_file => dir_file = Webgen::Node.new(dir, '/dir/file.html', 'file.html'),
29
29
  :dir_file_frag => Webgen::Node.new(dir_file, '/dir/file.html#frag', '#frag'),
@@ -39,7 +39,7 @@ class TestNode < Test::Unit::TestCase
39
39
  assert_equal(path, node.path)
40
40
  assert_equal(cn, node.cn)
41
41
  assert_equal(lcn, node.lcn)
42
- assert_equal(alcn, node.absolute_lcn)
42
+ assert_equal(alcn, node.alcn)
43
43
  assert_equal(lang, node.lang)
44
44
  assert_kind_of(Webgen::Language, node.lang) if node.lang
45
45
  assert(node.flagged?(:dirty))
@@ -49,22 +49,22 @@ class TestNode < Test::Unit::TestCase
49
49
  mi.each {|k,v| assert_equal(v, node[k])}
50
50
  end
51
51
 
52
- node = Webgen::Node.new(@tree.dummy_root, 'test/', 'test', {'lang' => 'de', :test => :value})
53
- check_proc.call(node, @tree.dummy_root, 'test/', 'test', 'test', '/test', nil, {:test => :value})
52
+ node = Webgen::Node.new(@tree.dummy_root, '/', '/', {'lang' => 'de', :test => :value})
53
+ check_proc.call(node, @tree.dummy_root, '/', '/', '/', '/', nil, {:test => :value})
54
54
 
55
55
  child = Webgen::Node.new(node, 'somename.html', 'somename.page', {'lang' => 'de'})
56
56
  check_proc.call(child, node, 'somename.html', 'somename.page', 'somename.de.page',
57
- '/test/somename.de.page', 'de', {})
57
+ '/somename.de.page', 'de', {})
58
58
 
59
59
  ['http://webgen.rubyforge.org', 'c:\\test'].each_with_index do |abspath, index|
60
60
  cn = 'test' + index.to_s + '.html'
61
61
  c = Webgen::Node.new(node, abspath, cn)
62
- check_proc.call(c, node, abspath, cn, cn, '/test/' + cn, nil, {})
62
+ check_proc.call(c, node, abspath, cn, cn, '/' + cn, nil, {})
63
63
  end
64
64
 
65
65
  child.reinit('somename.en.html', {'lang' => 'de', 'title' => 'test'})
66
66
  check_proc.call(child, node, 'somename.en.html', 'somename.page', 'somename.de.page',
67
- '/test/somename.de.page', 'de', {'title' => 'test'})
67
+ '/somename.de.page', 'de', {'title' => 'test'})
68
68
  end
69
69
 
70
70
  def test_type_checkers
@@ -74,6 +74,8 @@ class TestNode < Test::Unit::TestCase
74
74
  assert(nodes[:somename_en_frag].is_fragment?)
75
75
  assert(nodes[:root].is_root?)
76
76
  assert(!nodes[:somename_en].is_root?)
77
+ assert(nodes[:somename_en_fragnest].is_fragment?)
78
+ assert(!nodes[:somename_en_fragnest].is_directory?)
77
79
  end
78
80
 
79
81
  def test_meta_info_assignment
@@ -156,12 +158,26 @@ class TestNode < Test::Unit::TestCase
156
158
  assert_equal(nodes[:dir2_index_en], nodes[:dir2].resolve('index.html', 'en'))
157
159
 
158
160
  assert_equal(nodes[:dir], nodes[:somename_en].resolve('/dir/'))
161
+ assert_equal(nodes[:dir], nodes[:somename_en].resolve('/dir'))
159
162
  assert_equal(nodes[:root], nodes[:somename_en].resolve('/'))
160
163
  end
161
164
 
165
+ def test_resolve_passive_nodes
166
+ nodes = create_default_nodes
167
+
168
+ assert_nil(nodes[:root].resolve('/images/webgen_logo.png'))
169
+
170
+ shm = Webgen::SourceHandler::Main.new
171
+ @website.config['passive_sources'] << ['/', "Webgen::Source::Resource", "webgen-passive-sources"]
172
+ node = nodes[:root].resolve('/images/webgen_logo.png')
173
+ assert_not_nil(node)
174
+ assert_equal('/images/webgen_logo.png', node.alcn)
175
+ assert_equal(['/images/', '/images/webgen_logo.png'].to_set, node.node_info[:used_meta_info_nodes])
176
+ end
177
+
162
178
  def test_introspection
163
- node = Webgen::Node.new(@tree.dummy_root, 'test/', 'test', {'lang' => 'de', :test => :value})
164
- assert(node.inspect =~ /alcn=\/test/)
179
+ node = Webgen::Node.new(@tree.dummy_root, '/', '/', {'lang' => 'de', :test => :value})
180
+ assert(node.inspect =~ /alcn=\//)
165
181
  end
166
182
 
167
183
  def test_changed
@@ -177,16 +193,16 @@ class TestNode < Test::Unit::TestCase
177
193
 
178
194
  # Test :used_nodes array checking
179
195
  node.unflag(:dirty)
180
- node.node_info[:used_nodes] << node.absolute_lcn
196
+ node.node_info[:used_nodes] << node.alcn
181
197
  node.node_info[:used_nodes] << 'unknown alcn'
182
- node.node_info[:used_nodes] << @tree.dummy_root.absolute_lcn
198
+ node.node_info[:used_nodes] << @tree.dummy_root.alcn
183
199
  assert(node.changed?)
184
200
  assert_equal(1, calls)
185
201
 
186
202
  # Test :used_nodes array checking
187
203
  node.unflag(:dirty)
188
204
  node.node_info[:used_nodes] = Set.new
189
- node.node_info[:used_meta_info_nodes] << node.absolute_lcn
205
+ node.node_info[:used_meta_info_nodes] << node.alcn
190
206
  assert(node.changed?)
191
207
  assert_equal(2, calls)
192
208
  node.unflag(:dirty)
@@ -198,11 +214,25 @@ class TestNode < Test::Unit::TestCase
198
214
  other_node = Webgen::Node.new(@tree.dummy_root, '/other', 'test.l', {'lang' => 'de', :test => :value})
199
215
  other_node.flag(:dirty, :created)
200
216
  node.flag(:dirty)
201
- other_node.node_info[:used_nodes] = [node.absolute_lcn]
202
- node.node_info[:used_nodes] = [other_node.absolute_lcn]
217
+ other_node.node_info[:used_nodes] = [node.alcn]
218
+ node.node_info[:used_nodes] = [other_node.alcn]
203
219
  node.changed?
204
220
  end
205
221
 
222
+ def test_user_nodes_changed?
223
+ nodes = create_default_nodes
224
+
225
+ assert(!nodes[:dir2_index_en].send(:user_nodes_changed?))
226
+ nodes[:dir2_index_en]['used_nodes'] = '/some*.page'
227
+ assert(nodes[:dir2_index_en].send(:user_nodes_changed?))
228
+ nodes[:dir2_index_en]['used_nodes'] = '../some*.page'
229
+ assert(nodes[:dir2_index_en].send(:user_nodes_changed?))
230
+ nodes[:dir2_index_en]['used_nodes'] = '/someAA*.page'
231
+ assert(!nodes[:dir2_index_en].send(:user_nodes_changed?))
232
+ nodes[:dir2_index_en]['used_nodes'] = 'index.de.html'
233
+ assert(nodes[:dir2_index_en].send(:user_nodes_changed?))
234
+ end
235
+
206
236
  def test_meta_info_changed
207
237
  node = Webgen::Node.new(@tree.dummy_root, '/', '/')
208
238
  node.unflag(:dirty, :created)
@@ -234,12 +264,6 @@ class TestNode < Test::Unit::TestCase
234
264
  assert(node !~ '**/*.test')
235
265
  end
236
266
 
237
- def test_absolute_name
238
- root = Webgen::Node.new(@tree.dummy_root, '/', '/')
239
- node = Webgen::Node.new(root, 'somepath', 'somefile.html', {'lang' => 'de'})
240
- assert_equal('/somefile.de.html', node.absolute_lcn)
241
- end
242
-
243
267
  def test_route_to
244
268
  nodes = create_default_nodes
245
269
 
@@ -363,5 +387,17 @@ class TestNode < Test::Unit::TestCase
363
387
  nodes[:somename_en_frag].link_to(nodes[:somename_en_frag]))
364
388
  end
365
389
 
390
+ def test_url
391
+ assert_equal("webgen://webgen.localhost/hallo", Webgen::Node.url("hallo").to_s)
392
+ assert_equal("webgen://webgen.localhost/hallo%20du", Webgen::Node.url("hallo du").to_s)
393
+ assert_equal("webgen://webgen.localhost/hall%C3%B6chen", Webgen::Node.url("hallöchen").to_s)
394
+ assert_equal("webgen://webgen.localhost/hallo#du", Webgen::Node.url("hallo#du").to_s)
395
+
396
+ assert_equal("webgen://webgen.localhost/test", Webgen::Node.url("/test").to_s)
397
+ assert_equal("http://example.com/test", Webgen::Node.url("http://example.com/test").to_s)
398
+
399
+ assert_equal("test", Webgen::Node.url("test", false).to_s)
400
+ assert_equal("http://example.com/test", Webgen::Node.url("http://example.com/test", false).to_s)
401
+ end
366
402
 
367
403
  end
@@ -34,11 +34,11 @@ class TestPage < Test::Unit::TestCase
34
34
  - name: content
35
35
  content: "block1"
36
36
  - name: block2
37
- content: "block2"
37
+ content: " block2 "
38
38
  - name: block3
39
39
  content: ''
40
40
  - name: block4
41
- content: 'yes'
41
+ content: "yes\\n"
42
42
 
43
43
  # empty file
44
44
  - in: ""
@@ -84,7 +84,7 @@ class TestPage < Test::Unit::TestCase
84
84
  meta_info: {}
85
85
  blocks:
86
86
  - name: content
87
- content: "before\\n--- in\\nafter"
87
+ content: "before\\n--- in\\nafter\\n"
88
88
 
89
89
  # no meta info, starting with block with name
90
90
  - in: |
@@ -99,11 +99,12 @@ class TestPage < Test::Unit::TestCase
99
99
  --- name:block
100
100
  content doing -
101
101
  with?: with some things
102
+
102
103
  --- other:options test1:true test2:false test3:542 pipeline:
103
104
  meta_info: {}
104
105
  blocks:
105
106
  - name: block
106
- content: "content doing -\\nwith?: with some things"
107
+ content: "content doing -\\nwith?: with some things\\n"
107
108
  - name: block2
108
109
  content: ''
109
110
  options: {other: options, test1: true, test2: false, test3: 542, pipeline: ~}
@@ -117,7 +118,24 @@ class TestPage < Test::Unit::TestCase
117
118
  meta_info: {}
118
119
  blocks:
119
120
  - name: block
120
- content: "content\\n----------- some block start???\\nthings"
121
+ content: "content\\n----------- some block start???\\nthings\\n"
122
+
123
+ # last block ending with no whitespace at tend
124
+ - in: "--- name:block\\nblock\\n\\n--- name:block1\\ncontent"
125
+ meta_info: {}
126
+ blocks:
127
+ - name: block
128
+ content: "block\\n"
129
+ - name: block1
130
+ content: "content"
131
+
132
+ # last block ending with empty line
133
+ - in: "content\\n\\n"
134
+ meta_info: {}
135
+ blocks:
136
+ - name: content
137
+ content: "content\\n\\n"
138
+
121
139
  EOF
122
140
 
123
141
  INVALID_MI=<<EOF
@@ -3,78 +3,109 @@
3
3
  require 'test/unit'
4
4
  require 'webgen/path'
5
5
  require 'stringio'
6
+ require 'tmpdir'
6
7
 
7
8
  class TestPath < Test::Unit::TestCase
8
9
 
9
- def test_initialize
10
- check_proc = proc do |o, path, dir, bn, lang, ext, cn, oi, title|
11
- assert_equal(path, o.path)
12
- assert_equal(path, o.source_path)
13
- assert_equal(dir, o.directory)
14
- assert_equal(bn, o.cnbase)
10
+ def test_initialize_and_accessors
11
+ check_proc = proc do |o, ppath, bn, lang, ext, cn, lcn, acn, alcn, oi, title|
12
+ assert_kind_of(String, o.path)
13
+ assert_equal(o.path, o.source_path)
14
+ assert_equal(ppath, o.parent_path)
15
+ assert_equal(bn, o.basename)
15
16
  assert_equal(lang, o.meta_info['lang'])
16
17
  assert_equal(ext, o.ext)
17
18
  assert_equal(cn, o.cn)
19
+ assert_equal(lcn, o.lcn)
20
+ assert_equal(acn, o.acn)
21
+ assert_equal(alcn, o.alcn)
18
22
  assert_equal(oi, o.meta_info['sort_info'])
19
23
  assert_equal(title, o.meta_info['title'])
20
24
  end
21
- check_proc.call(Webgen::Path.new('5.base_name-one.de.page'),
22
- '5.base_name-one.de.page', './', 'base_name-one', 'de', 'page', 'base_name-one.page', 5, 'Base name one')
23
- check_proc.call(Webgen::Path.new('dir/default.png'),
24
- 'dir/default.png', 'dir/', 'default', nil, 'png', 'default.png', nil, 'Default')
25
- check_proc.call(Webgen::Path.new('default.en.png'),
26
- 'default.en.png', './', 'default', 'en', 'png', 'default.png', nil, 'Default')
27
- check_proc.call(Webgen::Path.new('default.deu.png'),
28
- 'default.deu.png', './', 'default', 'de', 'png', 'default.png', nil, 'Default')
29
- check_proc.call(Webgen::Path.new('default.template'),
30
- 'default.template', './', 'default', nil, 'template', 'default.template', nil, 'Default')
31
- check_proc.call(Webgen::Path.new('default.en.tar.bz2'),
32
- 'default.en.tar.bz2', './', 'default', 'en', 'tar.bz2', 'default.tar.bz2', nil, 'Default')
33
- check_proc.call(Webgen::Path.new('default.tar.bz2'),
34
- 'default.tar.bz2', './', 'default', nil, 'tar.bz2', 'default.tar.bz2', nil, 'Default')
35
- check_proc.call(Webgen::Path.new('default'),
36
- 'default', './', 'default', nil, '', 'default', nil, 'Default')
37
- check_proc.call(Webgen::Path.new('.htaccess'),
38
- '.htaccess', './', '', nil, 'htaccess', '.htaccess', nil, '')
39
25
 
26
+ # Check directory paths
40
27
  check_proc.call(Webgen::Path.new('/'),
41
- '/', '/', '/', nil, '', '/', nil, '/')
42
- check_proc.call(Webgen::Path.new('/dir/'),
43
- '/dir/', '/', 'dir', nil, '', 'dir', nil, 'Dir')
28
+ '', '/', nil, '', '/', '/', '/', '/', nil, '/')
29
+ check_proc.call(Webgen::Path.new('/directory/'),
30
+ '/', 'directory', nil, '', 'directory/', 'directory/', '/directory/', '/directory/', nil, 'Directory')
31
+ check_proc.call(Webgen::Path.new('/dir1/dir2.ext/'),
32
+ '/dir1/', 'dir2.ext', nil, '', 'dir2.ext/', 'dir2.ext/', '/dir1/dir2.ext/', '/dir1/dir2.ext/', nil, 'Dir2.ext')
33
+
34
+ # Check file paths
35
+ check_proc.call(Webgen::Path.new('/5.b_n-one.de.page'),
36
+ '/', 'b_n-one', 'de', 'page', 'b_n-one.page', 'b_n-one.de.page', '/b_n-one.page', '/b_n-one.de.page', 5, 'B n one')
37
+ check_proc.call(Webgen::Path.new('/dir/default.png'),
38
+ '/dir/', 'default', nil, 'png', 'default.png', 'default.png', '/dir/default.png', '/dir/default.png', nil, 'Default')
39
+ check_proc.call(Webgen::Path.new('/default.deu.png'),
40
+ '/', 'default', 'de', 'png', 'default.png', 'default.de.png', '/default.png', '/default.de.png', nil, 'Default')
41
+ check_proc.call(Webgen::Path.new('/default.en.tar.bz2'),
42
+ '/', 'default', 'en', 'tar.bz2', 'default.tar.bz2', 'default.en.tar.bz2', '/default.tar.bz2', '/default.en.tar.bz2', nil, 'Default')
43
+ check_proc.call(Webgen::Path.new('/default.deu.'),
44
+ '/', 'default', 'de', '', 'default', 'default.de', '/default', '/default.de', nil, 'Default')
45
+ check_proc.call(Webgen::Path.new('/default'),
46
+ '/', 'default', nil, '', 'default', 'default', '/default', '/default', nil, 'Default')
47
+ check_proc.call(Webgen::Path.new('/.htaccess'),
48
+ '/', '.htaccess', nil, '', '.htaccess', '.htaccess', '/.htaccess', '/.htaccess', nil, '.htaccess')
49
+ check_proc.call(Webgen::Path.new('/.htaccess.page'),
50
+ '/', '.htaccess', nil, 'page', '.htaccess.page', '.htaccess.page', '/.htaccess.page', '/.htaccess.page', nil, '.htaccess')
51
+ check_proc.call(Webgen::Path.new('/.htaccess.en.'),
52
+ '/', '.htaccess', 'en', '', '.htaccess', '.htaccess.en', '/.htaccess', '/.htaccess.en', nil, '.htaccess')
53
+ check_proc.call(Webgen::Path.new('/.htaccess.en.page'),
54
+ '/', '.htaccess', 'en', 'page', '.htaccess.page', '.htaccess.en.page', '/.htaccess.page', '/.htaccess.en.page', nil, '.htaccess')
55
+
56
+ # Check fragment paths
57
+ assert_raises(RuntimeError) { Webgen::Path.new("/#hallo")}
58
+ assert_raises(RuntimeError) { Webgen::Path.new("/#hallo#done")}
59
+ check_proc.call(Webgen::Path.new('/file#hallo'),
60
+ '/file', '#hallo', nil, '', '#hallo', '#hallo', '/file#hallo', '/file#hallo', nil, '#hallo')
61
+ check_proc.call(Webgen::Path.new('/file.en.page#hallo'),
62
+ '/file.en.page', '#hallo', nil, '', '#hallo', '#hallo', '/file.page#hallo', '/file.en.page#hallo', nil, '#hallo')
63
+
64
+ # Check general exceptions
65
+ assert_raise(RuntimeError) { Webgen::Path.new('/no_basename#') }
66
+ assert_raise(RuntimeError) { Webgen::Path.new('relative.page') }
44
67
 
45
68
  path = Webgen::Path.new('/test/', '/other.path')
46
69
  assert_equal('/other.path', path.source_path)
47
70
  assert_equal('/test/', path.path)
71
+ assert_equal(false, path.passive?)
48
72
  end
49
73
 
50
74
  def test_mount_at
51
- p = Webgen::Path.new('test.de.page')
52
- p = p.mount_at('/somedir')
75
+ p = Webgen::Path.new('/test.de.page')
76
+ assert_raise(ArgumentError) { p.mount_at('no_start_slash/') }
77
+ assert_raise(ArgumentError) { p.mount_at('/no_end_slash') }
78
+ assert_raise(ArgumentError) { p.mount_at('/no_with_hash#_char/') }
79
+ assert_raise(ArgumentError) { p.mount_at('/', 'no_start_slash/') }
80
+ assert_raise(ArgumentError) { p.mount_at('/', '/no_end_slash') }
81
+ assert_raise(ArgumentError) { p.mount_at('/', '/no_with_hash#_char/') }
82
+
83
+ p = p.mount_at('/somedir/')
53
84
  assert_equal('/somedir/test.de.page', p.path)
54
85
  assert_equal('/somedir/test.de.page', p.source_path)
55
- assert_equal('/somedir/', p.directory)
86
+ assert_equal('/somedir/', p.parent_path)
56
87
 
57
88
  p = Webgen::Path.new('/')
58
- p = p.mount_at('/somedir')
89
+ p = p.mount_at('/somedir/')
59
90
  assert_equal('/somedir/', p.path)
60
91
  assert_equal('/somedir/', p.source_path)
61
- assert_equal('/', p.directory)
62
- assert_equal('somedir', p.cn)
92
+ assert_equal('/', p.parent_path)
93
+ assert_equal('somedir/', p.cn)
63
94
  assert_equal('Somedir', p.meta_info['title'])
64
95
 
65
96
  p = Webgen::Path.new('/source/test.rb')
66
97
  p = p.mount_at('/', '/source/')
67
98
  assert_equal('/test.rb', p.path)
68
99
  assert_equal('/test.rb', p.source_path)
69
- assert_equal('/', p.directory)
100
+ assert_equal('/', p.parent_path)
70
101
  assert_equal('test.rb', p.cn)
71
102
  assert_equal('Test', p.meta_info['title'])
72
103
 
73
104
  p = Webgen::Path.new('/source/')
74
- p = p.mount_at('/', '/source')
105
+ p = p.mount_at('/', '/source/')
75
106
  assert_equal('/', p.path)
76
107
  assert_equal('/', p.source_path)
77
- assert_equal('/', p.directory)
108
+ assert_equal('', p.parent_path)
78
109
  assert_equal('/', p.cn)
79
110
  assert_equal('/', p.meta_info['title'])
80
111
 
@@ -82,53 +113,66 @@ class TestPath < Test::Unit::TestCase
82
113
  p = p.mount_at('/source/')
83
114
  assert_equal('/source/test.rb', p.path)
84
115
  assert_equal('/other.rb', p.source_path)
85
- assert_equal('/source/', p.directory)
116
+ assert_equal('/source/', p.parent_path)
86
117
  assert_equal('test.rb', p.cn)
87
118
  assert_equal('Test', p.meta_info['title'])
88
119
  end
89
120
 
90
121
  def test_dup
91
- p = Webgen::Path.new('test.de.page')
122
+ p = Webgen::Path.new('/test.de.page')
92
123
  dupped = p.dup
93
124
  dupped.meta_info['title'] = 'changed'
94
125
  assert_equal('Test', p.meta_info['title'])
95
126
  end
96
127
 
97
128
  def test_io
98
- p = Webgen::Path.new('test.de.page')
129
+ p = Webgen::Path.new('/test.de.page')
99
130
  assert_raise(RuntimeError) { p.io }
100
- p = Webgen::Path.new('test.de.page') { StringIO.new('hallo') }
131
+ p = Webgen::Path.new('/test.de.page') { StringIO.new('hallo') }
101
132
  assert_equal('hallo', p.io.data)
102
133
  assert_equal('hallo', p.io.stream {|f| f.read })
103
- end
104
134
 
105
- def test_lcn
106
- p = Webgen::Path.new('test.de.page')
107
- assert_equal('test.page', p.cn)
108
- assert_equal('test.de.page', p.lcn)
109
- p = Webgen::Path.new('test.page')
110
- assert_equal('test.page', p.cn)
111
- assert_equal('test.page', p.lcn)
135
+ if RUBY_VERSION >= '1.9'
136
+ begin
137
+ dir = File.join(Dir.tmpdir, 'webgen-' + Process.pid.to_s)
138
+ FileUtils.mkdir_p(dir)
139
+ File.open(File.join(dir, 'src'), 'wb+') {|f| f.write("\303\274")}
140
+ sio = Webgen::Path::SourceIO.new {|mode| File.open(File.join(dir, 'src'), mode) }
141
+ assert_equal(1, sio.data('r:UTF-8').length)
142
+ assert_equal(2, sio.data('rb').length)
143
+ ensure
144
+ FileUtils.rm_rf(dir) if dir
145
+ end
146
+ end
112
147
  end
113
148
 
114
149
  def test_equality
115
- p = Webgen::Path.new('test.de.page')
116
- assert_equal('test.de.page', p)
117
- assert_equal(Webgen::Path.new('test.de.page'), p)
150
+ p = Webgen::Path.new('/test.de.page')
151
+ assert_equal('/test.de.page', p)
152
+ assert_equal(Webgen::Path.new('/test.de.page'), p)
118
153
  assert_not_equal(5, p)
119
154
  end
120
155
 
121
- def test_hashing
122
- path = Webgen::Path.new('test.de.page')
123
- h = { 'test.de.page' => :value }
124
- assert_equal(:value, h['test.de.page'])
125
- assert_equal(:value, h[path])
126
- assert(path <=> 'test.de.page')
127
- h = { p => :newvalue}
128
- assert_nil(h['test.de.page'])
156
+ def test_comparison
157
+ p1 = Webgen::Path.new('/test.de.page')
158
+ p2 = Webgen::Path.new('/test.en.page')
159
+ assert_equal(0, p1 <=> p1)
160
+ assert_equal(-1, p1 <=> p2)
161
+ assert_equal(1, p2 <=> p1)
129
162
  end
130
163
 
131
- def test_matching
164
+ # Problem with hashing under 1.8.6 when changing from 'test.de.page' to '/test.de.page'...
165
+ # def test_hashing
166
+ # path = Webgen::Path.new('test.de.page')
167
+ # h = { 'test.de.page' => :value }
168
+ # assert_equal(:value, h['test.de.page'])
169
+ # assert_equal(:value, h[path])
170
+ # assert(path <=> 'test.de.page')
171
+ # h = { p => :newvalue}
172
+ # assert_nil(h['test.de.page'])
173
+ # end
174
+
175
+ def test_match
132
176
  path = '/dir/to/file.de.page'
133
177
  assert(Webgen::Path.match(path, '**/*'))
134
178
  assert(Webgen::Path.match(path, '**/file.de.PAGE'))
@@ -138,6 +182,7 @@ class TestPath < Test::Unit::TestCase
138
182
  path = '/dir/'
139
183
  assert(Webgen::Path.match(path, '/dir/'))
140
184
  assert(Webgen::Path.match(path, '/dir'))
185
+ assert(Webgen::Path.match(path, '/*/'))
141
186
 
142
187
  path = '/dir'
143
188
  assert(Webgen::Path.match(path, '/dir/'))
@@ -151,14 +196,25 @@ class TestPath < Test::Unit::TestCase
151
196
  assert(!Webgen::Path.match(path, '/'))
152
197
  end
153
198
 
199
+ def test_apath
200
+ assert_raise(ArgumentError) { Webgen::Path.make_absolute('test', 'test') }
201
+ assert_equal('/', Webgen::Path.make_absolute('/', '/'))
202
+ assert_equal('/dir', Webgen::Path.make_absolute('/other', '/dir'))
203
+ assert_equal('/other/dir', Webgen::Path.make_absolute('/other', 'dir'))
204
+ assert_equal('/test/dir', Webgen::Path.make_absolute('/other', '../test/dir'))
205
+ assert_equal('/', Webgen::Path.make_absolute('/', '/..'))
206
+ assert_equal('/dir', Webgen::Path.make_absolute('/', '/../dir/.'))
207
+ end
208
+
209
+
154
210
  def test_introspection
155
- p = Webgen::Path.new('test.de.page')
156
- assert_equal('test.de.page', p.to_s)
157
- assert(p.inspect.include?('test.de.page'))
211
+ p = Webgen::Path.new('/test.de.page')
212
+ assert_equal('/test.de.page', p.to_s)
213
+ assert(p.inspect.include?('/test.de.page'))
158
214
  end
159
215
 
160
216
  def test_changed?
161
- p = Webgen::Path.new('test.de.page')
217
+ p = Webgen::Path.new('/test.de.page')
162
218
  assert(p.changed?)
163
219
  end
164
220