webgen 0.5.8 → 0.5.9

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