docubot 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/bin/docubot +125 -125
  2. data/lib/docubot.rb +43 -43
  3. data/lib/docubot/bundle.rb +182 -182
  4. data/lib/docubot/converter.rb +28 -28
  5. data/lib/docubot/converters/haml.rb +9 -9
  6. data/lib/docubot/converters/markdown.rb +14 -14
  7. data/lib/docubot/index.rb +67 -67
  8. data/lib/docubot/link_tree.rb +111 -111
  9. data/lib/docubot/metasection.rb +61 -61
  10. data/lib/docubot/page.rb +167 -167
  11. data/lib/docubot/shells/default/0_License.md +59 -59
  12. data/lib/docubot/shells/default/Appendix/Glossary.md +4 -4
  13. data/lib/docubot/shells/default/Appendix/Index_Page.md +8 -8
  14. data/lib/docubot/shells/default/Appendix/Table of Contents.md +4 -4
  15. data/lib/docubot/shells/docubot-help/0_License.md +20 -20
  16. data/lib/docubot/shells/docubot-help/1_Getting_Started.md +47 -47
  17. data/lib/docubot/shells/docubot-help/2_Basic_Concepts/4 Adding Images.md +1 -1
  18. data/lib/docubot/shells/docubot-help/2_Basic_Concepts/index.md +5 -5
  19. data/lib/docubot/shells/docubot-help/3_Advanced_Topics/Controlling Glossary.md +2 -2
  20. data/lib/docubot/shells/docubot-help/3_Advanced_Topics/Controlling Indexing.md +9 -9
  21. data/lib/docubot/shells/docubot-help/3_Advanced_Topics/Controlling the Table of Contents.md +5 -5
  22. data/lib/docubot/shells/docubot-help/4_Appendix/Glossary.md +4 -4
  23. data/lib/docubot/shells/docubot-help/4_Appendix/Index_Page.md +5 -5
  24. data/lib/docubot/shells/docubot-help/4_Appendix/Table of Contents.md +7 -7
  25. data/lib/docubot/shells/docubot-help/index.txt +7 -7
  26. data/lib/docubot/snippet.rb +19 -19
  27. data/lib/docubot/snippets/glossary.rb +7 -7
  28. data/lib/docubot/snippets/index_entries.rb +6 -6
  29. data/lib/docubot/templates/_root/glossary.css +3 -3
  30. data/lib/docubot/templates/_root/glossary.js +57 -57
  31. data/lib/docubot/templates/index.haml +14 -14
  32. data/lib/docubot/templates/toc.haml +2 -2
  33. data/lib/docubot/templates/top.haml +32 -32
  34. data/lib/docubot/writers/chm/hhc.erb +1 -1
  35. data/lib/docubot/writers/chm/hhk.erb +2 -2
  36. data/lib/docubot/writers/html.rb +87 -87
  37. data/spec/_all.rb +12 -12
  38. data/spec/_helper.rb +16 -16
  39. data/spec/bundle.rb +339 -339
  40. data/spec/command.rb +3 -3
  41. data/spec/converters.rb +2 -2
  42. data/spec/global.rb +27 -27
  43. data/spec/glossary.rb +94 -94
  44. data/spec/index.rb +2 -2
  45. data/spec/page.rb +80 -80
  46. data/spec/samples/attributes/defaults.haml +34 -34
  47. data/spec/samples/attributes/explicit1.haml +42 -42
  48. data/spec/samples/attributes/explicit2.haml +41 -41
  49. data/spec/samples/attributes/hidden.haml +39 -39
  50. data/spec/samples/attributes/index.md +8 -8
  51. data/spec/samples/collisions/page1.md +2 -2
  52. data/spec/samples/collisions/page1.textile +2 -2
  53. data/spec/samples/collisions/page2.haml +3 -3
  54. data/spec/samples/collisions/page2.html +2 -2
  55. data/spec/samples/collisions/page2.txt +2 -2
  56. data/spec/samples/collisions/page3.md +2 -2
  57. data/spec/samples/files/index.md +1 -1
  58. data/spec/samples/glossary/Glossary.txt +4 -4
  59. data/spec/samples/glossary/Some Page.md +2 -2
  60. data/spec/samples/glossary/_glossary/Simple Term.md +2 -2
  61. data/spec/samples/glossary/_glossary/complex.haml +8 -8
  62. data/spec/samples/glossary/_glossary/project_x.md +3 -3
  63. data/spec/samples/hierarchy/1/1.1/1.1.1/index.haml +1 -1
  64. data/spec/samples/hierarchy/1/1.1/1.1.1/page.haml +3 -3
  65. data/spec/samples/hierarchy/1/1.1/page.haml +3 -3
  66. data/spec/samples/hierarchy/1/page.haml +3 -3
  67. data/spec/samples/hierarchy/2/2.1/2.1.1/page.haml +3 -3
  68. data/spec/samples/hierarchy/2/2.1/index.haml +1 -1
  69. data/spec/samples/hierarchy/2/2.1/page.haml +3 -3
  70. data/spec/samples/hierarchy/2/page.haml +3 -3
  71. data/spec/samples/hierarchy/main.haml +1 -1
  72. data/spec/samples/hierarchy/toc.md +1 -1
  73. data/spec/samples/links/index.txt +11 -11
  74. data/spec/samples/links/root.md +13 -13
  75. data/spec/samples/links/sub1/inner1.md +11 -11
  76. data/spec/samples/links/sub2.md +4 -4
  77. data/spec/samples/links/sub2/inner2.md +7 -7
  78. data/spec/samples/simplest/HTML.html +9 -9
  79. data/spec/samples/simplest/Haml.haml +12 -12
  80. data/spec/samples/simplest/Markdown.md +9 -9
  81. data/spec/samples/simplest/Text.txt +9 -9
  82. data/spec/samples/simplest/Textile.textile +9 -9
  83. data/spec/samples/templates/_templates/doubler.haml +6 -6
  84. data/spec/samples/templates/_templates/page.haml +1 -1
  85. data/spec/samples/templates/goaway.txt +2 -2
  86. data/spec/samples/templates/onepara_html.html +2 -2
  87. data/spec/samples/templates/onepara_md.md +4 -4
  88. data/spec/samples/templates/twopara_haml.haml +6 -6
  89. data/spec/samples/templates/twopara_textile.textile +5 -5
  90. data/spec/samples/titles/3_renamed.txt +1 -1
  91. data/spec/samples/titles/index.txt +1 -1
  92. data/spec/templates.rb +43 -43
  93. data/spec/toc.rb +128 -128
  94. data/spec/writer/chm.rb +2 -2
  95. data/spec/writer/html.rb +2 -2
  96. metadata +56 -25
  97. data/bin/docubot.bat +0 -1
@@ -1,13 +1,13 @@
1
- #encoding: UTF-8
2
- $: << '..'
3
- require 'spec/global'
4
- require 'spec/bundle'
5
- require 'spec/toc'
6
- require 'spec/converters'
7
- require 'spec/page'
8
- require 'spec/glossary'
9
- require 'spec/index'
10
- require 'spec/templates'
11
- require 'spec/command'
12
- require 'spec/writer/html'
1
+ #encoding: UTF-8
2
+ $: << '..'
3
+ require 'spec/global'
4
+ require 'spec/bundle'
5
+ require 'spec/toc'
6
+ require 'spec/converters'
7
+ require 'spec/page'
8
+ require 'spec/glossary'
9
+ require 'spec/index'
10
+ require 'spec/templates'
11
+ require 'spec/command'
12
+ require 'spec/writer/html'
13
13
  require 'spec/writer/chm'
@@ -1,17 +1,17 @@
1
- $: << File.join( File.dirname(__FILE__), '..' )
2
- $: << File.join( File.dirname(__FILE__), '..', 'lib' )
3
- require 'rubygems'
4
- require 'minitest/spec'
5
- require 'docubot'
6
- SAMPLES = File.dirname(__FILE__)/'samples'
7
- MiniTest::Unit.autorun
8
-
9
- class MiniTest::Spec
10
- class << self
11
- alias_method :__it__, :it
12
- end
13
- def self.it desc, &block
14
- block ||= proc{ skip "(no tests defined)" }
15
- __it__( desc, &block )
16
- end
1
+ $: << File.join( File.dirname(__FILE__), '..' )
2
+ $: << File.join( File.dirname(__FILE__), '..', 'lib' )
3
+ require 'rubygems'
4
+ require 'minitest/spec'
5
+ require 'docubot'
6
+ SAMPLES = File.dirname(__FILE__)/'samples'
7
+ MiniTest::Unit.autorun
8
+
9
+ class MiniTest::Spec
10
+ class << self
11
+ alias_method :__it__, :it
12
+ end
13
+ def self.it desc, &block
14
+ block ||= proc{ skip "(no tests defined)" }
15
+ __it__( desc, &block )
16
+ end
17
17
  end
@@ -1,340 +1,340 @@
1
- #encoding: UTF-8
2
- require File.join(File.dirname(__FILE__), "_helper")
3
-
4
- describe "AbusedBundle" do
5
- it 'requires a valid path' do
6
- proc{ DocuBot::Bundle.new }.must_raise(ArgumentError)
7
- proc{ DocuBot::Bundle.new "does not exist" }.must_raise(RuntimeError)
8
- DocuBot::Bundle.new(SAMPLES/'empty').wont_be_nil
9
- end
10
- end
11
-
12
- describe "Bundle from empty directory" do
13
- before do
14
- @out, @err = capture_io do
15
- @bundle = DocuBot::Bundle.new SAMPLES/'empty'
16
- end
17
- end
18
-
19
- it "should have an empty TOC" do
20
- @bundle.toc.wont_be_nil
21
- @bundle.toc.descendants.must_be_empty
22
- end
23
-
24
- it "should have an empty index" do
25
- @bundle.index.wont_be_nil
26
- @bundle.index.entries.must_be_empty
27
- end
28
-
29
- it "should have an empty glossary" do
30
- @bundle.glossary.wont_be_nil
31
- @bundle.glossary.entries.must_be_empty
32
- end
33
-
34
- it "should have an empty external link list" do
35
- @bundle.external_links.wont_be_nil
36
- @bundle.external_links.must_be_empty
37
- end
38
-
39
- it "should have an empty internal link list" do
40
- @bundle.internal_links.wont_be_nil
41
- @bundle.internal_links.must_be_empty
42
- end
43
-
44
- it "should have an empty file link list" do
45
- @bundle.file_links.wont_be_nil
46
- @bundle.file_links.must_be_empty
47
- end
48
-
49
- it "should have an empty broken link list" do
50
- @bundle.broken_links.wont_be_nil
51
- @bundle.broken_links.must_be_empty
52
- end
53
-
54
- it "should produce no warnings" do
55
- @err.must_be_empty
56
- end
57
-
58
- end
59
-
60
-
61
- describe "Gathering links" do
62
- before do
63
- @out, @err = capture_io do
64
- @bundle = DocuBot::Bundle.new SAMPLES/'links'
65
- end
66
- end
67
-
68
- it "should have link collections be pages hashed to arrays of strings" do
69
- %w[ external_links internal_links file_links broken_links ].each do |method|
70
- collection = @bundle.send(method)
71
- collection.must_be_kind_of Hash
72
- collection.keys.each do |key|
73
- key.must_be_kind_of DocuBot::Page
74
- end
75
- collection.values.each do |value|
76
- value.must_be_kind_of Array
77
- value.each do |item|
78
- item.must_be_kind_of String
79
- end
80
- end
81
- end
82
- end
83
-
84
- it "should identify (but not validate) external links" do
85
- known_external = %w[ http://www.google.com/ http://phrogz.net http://phrogz.net/tmp/gkhead.jpg HTTP://NONEXISTENT.SITE ]
86
- all_external = @bundle.external_links.values.flatten
87
- known_external.each do |link|
88
- all_external.must_include link
89
- end
90
- end
91
-
92
- it "should identify and warn about broken internal links" do
93
- known_broken = %w[
94
- fork.html sub1.html root.md sub1/inner1.md
95
- inner2.html ../sub1 sub1/inner1.md
96
- ../index.html ../sub1 ../index.md
97
- sub2/GORKBO.bin
98
- ]
99
- all_broken = @bundle.broken_links.values.flatten
100
- known_broken.each do |link|
101
- all_broken.must_include link
102
- @err.must_include link
103
- end
104
- end
105
-
106
- it "should identify valid links to pages or sections" do
107
- known_internal = %w[
108
- sub1/inner1.html sub2.html sub2/inner2.html sub1/../sub2/inner2.html
109
- ../root.html inner1.html ../sub2.html ../sub2/inner2.html
110
- ../sub1/index.html index.html
111
- ]
112
- known_internal << "one two three.html"
113
- all_internal = @bundle.internal_links.values.flatten
114
- known_internal.each do |link|
115
- all_internal.must_include link
116
- end
117
- end
118
-
119
- it "should identify valid links to internal files" do
120
- known_file_links = %w[ ../sub2/bozo.bin bozo.bin sub2/bozo.bin ]
121
- all_file_links = @bundle.file_links.values.flatten
122
- known_file_links.each do |link|
123
- all_file_links.must_include link
124
- end
125
- end
126
-
127
- it "should identify valid links to internal files at the root" do
128
- @bundle = DocuBot::Bundle.new SAMPLES/'hierarchy'
129
- known_file_links = %w[ main.css ../main.css ../../main.css ../../../main.css ]
130
- all_file_links = @bundle.file_links.values.flatten
131
- known_file_links.each do |link|
132
- all_file_links.must_include link
133
- end
134
- end
135
-
136
- it "should identify and warn about invalid sub-page anchors" do
137
- known_broken = %w[ #GORKBO ../root.html#GORKBO ]
138
- all_broken = @bundle.broken_links.values.flatten
139
- known_broken.each do |link|
140
- all_broken.must_include link
141
- @err.must_include link
142
- end
143
- end
144
-
145
- it "should identify valid sub-page anchors" do
146
- known_internal = %w[ #sub-id root.html#sub-id ../root.html#sub-id ]
147
- all_internal = @bundle.internal_links.values.flatten
148
- known_internal.each do |link|
149
- all_internal.must_include link
150
- end
151
- end
152
- end
153
-
154
- describe "Identifying Conflicts" do
155
- it "should raise when multiple pages will write to the same html" do
156
- proc{
157
- @bundle = DocuBot::Bundle.new( SAMPLES/'collisions' )
158
- }.must_raise(DocuBot::Bundle::PageCollision)
159
- end
160
-
161
- it "should include the title and filename of every conflicting page" do
162
- begin
163
- @bundle = DocuBot::Bundle.new( SAMPLES/'collisions' )
164
- rescue DocuBot::Bundle::PageCollision => e
165
- e.message.must_include "page1.md"
166
- e.message.must_include "page1.textile"
167
- e.message.must_include "Page 1 (from Markdown)"
168
- e.message.must_include "Page 1 (from Textile)"
169
- e.message.must_include "page2.html"
170
- e.message.must_include "page2.txt"
171
- e.message.must_include "page2.haml"
172
- e.message.must_include "Page 2 (from html)"
173
- e.message.must_include "Page 2 (from text)"
174
- e.message.must_include "Page 2 (from haml)"
175
- e.message.wont_include "page3.md"
176
- e.message.wont_include "page3.bin"
177
- e.message.wont_include "Page 3"
178
- end
179
- end
180
-
181
- end
182
-
183
- describe "Bundle with Extra Files" do
184
- before do
185
- @out, @err = capture_io do
186
- @bundle = DocuBot::Bundle.new( SAMPLES/'files' )
187
- end
188
- end
189
-
190
- it "should keep track of extra files seen" do
191
- @bundle.extras.wont_be_nil
192
- static_files = %w[ common.css _static/foo.png section/foo.jpg ]
193
- static_files << "section/sub section/foo.gif"
194
- static_files.each do |path|
195
- @bundle.extras.must_include path
196
- end
197
- end
198
-
199
- it "should not count page sources as extra files" do
200
- page_files = %w[ index.md another.md first.textile section/page.haml ]
201
- page_files << "section/sub section/page.txt"
202
- page_files.each do |path|
203
- @bundle.extras.wont_include path
204
- end
205
- end
206
-
207
- it "should skip files specified by global glob matches" do
208
- @bundle.global.ignore.as_list.must_equal %w[ **/*.psd **/*.ai **/Thumbs.db BUILDING.txt ]
209
- bad_files = %w[ _static/foo.ai _static/foo.psd _static/Thumbs.db ]
210
- bad_files << "section/sub section/Thumbs.db"
211
- bad_files.each do |path|
212
- @bundle.extras.wont_include path
213
- end
214
- end
215
-
216
- it "should not count ignored files as the source for pages" do
217
- @bundle.pages.find{ |page| page.file == 'BUILDING.txt' }.must_be_nil
218
- @bundle.page_by_file_path['BUILDING.txt'].must_be_nil
219
- end
220
- end
221
-
222
- describe "Pages in bundles" do
223
- before do
224
- @titles = [ 'First One', 'Second One', 'Third One', 'Fourth One', 'Fifth One', '911' ]
225
- Dir.chdir SAMPLES/'links' do
226
- @files = Dir['**/*'] - %w[ index.txt sub2/bozo.bin ]
227
- @htmls = @files.map{ |path|
228
- path[/\.[^.]+$/] ? path.gsub(/\.[^.]+$/,'.html') : path/'index.html'
229
- }
230
- end
231
- @out, @err = capture_io do
232
- @titles_bundle = DocuBot::Bundle.new SAMPLES/'titles'
233
- @links_bundle = DocuBot::Bundle.new SAMPLES/'links'
234
- end
235
- end
236
-
237
- it "should allow you to find arrays of pages by title" do
238
- @titles_bundle.pages_by_title.wont_be_nil
239
- @titles.each do |page_title|
240
- pages = @titles_bundle.pages_by_title[page_title]
241
- pages.must_be_kind_of Array
242
- pages.length.must_equal 1
243
- pages.first.must_be_kind_of DocuBot::Page
244
- end
245
- end
246
-
247
- it "should return an empty array for a non-existent page" do
248
- pages = @titles_bundle.pages_by_title['NONE SUCH']
249
- pages.must_be_kind_of Array
250
- pages.length.must_equal 0
251
- end
252
-
253
- it "should not include the main index file in the titles" do
254
- pages = @titles_bundle.pages_by_title["Title Changin'"]
255
- pages.must_be_kind_of Array
256
- pages.length.must_equal 0
257
- end
258
-
259
- it "should give access to pages by source file path" do
260
- @links_bundle.page_by_file_path.wont_be_nil
261
- @files.each do |path|
262
- @links_bundle.page_by_file_path[path].must_be_kind_of DocuBot::Page
263
- end
264
- end
265
-
266
- it "should return nil for an unfound file path" do
267
- @links_bundle.page_by_file_path['NONE SUCH'].must_be_nil
268
- end
269
-
270
- it "should not include raw files in the file paths" do
271
- @links_bundle.page_by_file_path['sub2/bozo.bin'].must_be_nil
272
- end
273
-
274
- it "should give access to pages by html file path" do
275
- @links_bundle.page_by_html_path.wont_be_nil
276
- @htmls.each do |path|
277
- p path unless @links_bundle.page_by_html_path[path]
278
- @links_bundle.page_by_html_path[path].wont_be_nil
279
- @links_bundle.page_by_html_path[path].must_be_kind_of DocuBot::Page
280
- end
281
- end
282
-
283
- it "should return nil for an unfound html path" do
284
- @links_bundle.page_by_html_path['NONE SUCH'].must_be_nil
285
- end
286
-
287
- it "should not include raw files in the html paths" do
288
- @links_bundle.page_by_html_path['sub2/bozo.bin'].must_be_nil
289
- end
290
- end
291
-
292
- describe "Global bundle attributes" do
293
- before do
294
- @out, @err = capture_io do
295
- @bundle = DocuBot::Bundle.new SAMPLES/'attributes'
296
- end
297
- end
298
-
299
- it "should have a global object" do
300
- @bundle.global.wont_be_nil
301
- end
302
-
303
- it "should be indexable by method and return strings" do
304
- @bundle.global.author.must_equal "Gavin Kistner"
305
- @bundle.global.default.must_equal "All About Mr. Friggles"
306
- @bundle.global.quotes.must_equal %q{"It's all about Mr. Benjamin", "I have never seen this cat before in my life!"}
307
- @bundle.global.awesome.must_equal "true"
308
- end
309
-
310
- it "should be indexable by string" do
311
- @bundle.global['author.email'].must_equal "!@phrogz.net"
312
- @bundle.global['author website'].must_equal "http://phrogz.net"
313
- end
314
-
315
- it "should use utf8 for the strings" do
316
- if Object.const_defined? :Encoding
317
- Encoding.compatible?( @bundle.global.title, "UTF-8™")
318
- end
319
- @bundle.global.title.must_equal "Friggles® The Cat, ©2009"
320
- end
321
-
322
- it "should allow casting values to boolean" do
323
- @bundle.global.awesome.as_boolean.must_equal true
324
- end
325
-
326
- it "should allow casting values to arrays of strings" do
327
- quotes = @bundle.global.quotes.as_list
328
- quotes.must_be_kind_of Array
329
- quotes.must_equal [ "It's all about Mr. Benjamin", "I have never seen this cat before in my life!" ]
330
- end
331
- end
332
-
333
- describe "Page attributes" do
334
- before do
335
- @out, @err = capture_io do
336
- @bundle = DocuBot::Bundle.new SAMPLES/'attributes'
337
- end
338
- end
339
-
1
+ #encoding: UTF-8
2
+ require File.join(File.dirname(__FILE__), "_helper")
3
+
4
+ describe "AbusedBundle" do
5
+ it 'requires a valid path' do
6
+ proc{ DocuBot::Bundle.new }.must_raise(ArgumentError)
7
+ proc{ DocuBot::Bundle.new "does not exist" }.must_raise(RuntimeError)
8
+ DocuBot::Bundle.new(SAMPLES/'empty').wont_be_nil
9
+ end
10
+ end
11
+
12
+ describe "Bundle from empty directory" do
13
+ before do
14
+ @out, @err = capture_io do
15
+ @bundle = DocuBot::Bundle.new SAMPLES/'empty'
16
+ end
17
+ end
18
+
19
+ it "should have an empty TOC" do
20
+ @bundle.toc.wont_be_nil
21
+ @bundle.toc.descendants.must_be_empty
22
+ end
23
+
24
+ it "should have an empty index" do
25
+ @bundle.index.wont_be_nil
26
+ @bundle.index.entries.must_be_empty
27
+ end
28
+
29
+ it "should have an empty glossary" do
30
+ @bundle.glossary.wont_be_nil
31
+ @bundle.glossary.entries.must_be_empty
32
+ end
33
+
34
+ it "should have an empty external link list" do
35
+ @bundle.external_links.wont_be_nil
36
+ @bundle.external_links.must_be_empty
37
+ end
38
+
39
+ it "should have an empty internal link list" do
40
+ @bundle.internal_links.wont_be_nil
41
+ @bundle.internal_links.must_be_empty
42
+ end
43
+
44
+ it "should have an empty file link list" do
45
+ @bundle.file_links.wont_be_nil
46
+ @bundle.file_links.must_be_empty
47
+ end
48
+
49
+ it "should have an empty broken link list" do
50
+ @bundle.broken_links.wont_be_nil
51
+ @bundle.broken_links.must_be_empty
52
+ end
53
+
54
+ it "should produce no warnings" do
55
+ @err.must_be_empty
56
+ end
57
+
58
+ end
59
+
60
+
61
+ describe "Gathering links" do
62
+ before do
63
+ @out, @err = capture_io do
64
+ @bundle = DocuBot::Bundle.new SAMPLES/'links'
65
+ end
66
+ end
67
+
68
+ it "should have link collections be pages hashed to arrays of strings" do
69
+ %w[ external_links internal_links file_links broken_links ].each do |method|
70
+ collection = @bundle.send(method)
71
+ collection.must_be_kind_of Hash
72
+ collection.keys.each do |key|
73
+ key.must_be_kind_of DocuBot::Page
74
+ end
75
+ collection.values.each do |value|
76
+ value.must_be_kind_of Array
77
+ value.each do |item|
78
+ item.must_be_kind_of String
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ it "should identify (but not validate) external links" do
85
+ known_external = %w[ http://www.google.com/ http://phrogz.net http://phrogz.net/tmp/gkhead.jpg HTTP://NONEXISTENT.SITE ]
86
+ all_external = @bundle.external_links.values.flatten
87
+ known_external.each do |link|
88
+ all_external.must_include link
89
+ end
90
+ end
91
+
92
+ it "should identify and warn about broken internal links" do
93
+ known_broken = %w[
94
+ fork.html sub1.html root.md sub1/inner1.md
95
+ inner2.html ../sub1 sub1/inner1.md
96
+ ../index.html ../sub1 ../index.md
97
+ sub2/GORKBO.bin
98
+ ]
99
+ all_broken = @bundle.broken_links.values.flatten
100
+ known_broken.each do |link|
101
+ all_broken.must_include link
102
+ @err.must_include link
103
+ end
104
+ end
105
+
106
+ it "should identify valid links to pages or sections" do
107
+ known_internal = %w[
108
+ sub1/inner1.html sub2.html sub2/inner2.html sub1/../sub2/inner2.html
109
+ ../root.html inner1.html ../sub2.html ../sub2/inner2.html
110
+ ../sub1/index.html index.html
111
+ ]
112
+ known_internal << "one two three.html"
113
+ all_internal = @bundle.internal_links.values.flatten
114
+ known_internal.each do |link|
115
+ all_internal.must_include link
116
+ end
117
+ end
118
+
119
+ it "should identify valid links to internal files" do
120
+ known_file_links = %w[ ../sub2/bozo.bin bozo.bin sub2/bozo.bin ]
121
+ all_file_links = @bundle.file_links.values.flatten
122
+ known_file_links.each do |link|
123
+ all_file_links.must_include link
124
+ end
125
+ end
126
+
127
+ it "should identify valid links to internal files at the root" do
128
+ @bundle = DocuBot::Bundle.new SAMPLES/'hierarchy'
129
+ known_file_links = %w[ main.css ../main.css ../../main.css ../../../main.css ]
130
+ all_file_links = @bundle.file_links.values.flatten
131
+ known_file_links.each do |link|
132
+ all_file_links.must_include link
133
+ end
134
+ end
135
+
136
+ it "should identify and warn about invalid sub-page anchors" do
137
+ known_broken = %w[ #GORKBO ../root.html#GORKBO ]
138
+ all_broken = @bundle.broken_links.values.flatten
139
+ known_broken.each do |link|
140
+ all_broken.must_include link
141
+ @err.must_include link
142
+ end
143
+ end
144
+
145
+ it "should identify valid sub-page anchors" do
146
+ known_internal = %w[ #sub-id root.html#sub-id ../root.html#sub-id ]
147
+ all_internal = @bundle.internal_links.values.flatten
148
+ known_internal.each do |link|
149
+ all_internal.must_include link
150
+ end
151
+ end
152
+ end
153
+
154
+ describe "Identifying Conflicts" do
155
+ it "should raise when multiple pages will write to the same html" do
156
+ proc{
157
+ @bundle = DocuBot::Bundle.new( SAMPLES/'collisions' )
158
+ }.must_raise(DocuBot::Bundle::PageCollision)
159
+ end
160
+
161
+ it "should include the title and filename of every conflicting page" do
162
+ begin
163
+ @bundle = DocuBot::Bundle.new( SAMPLES/'collisions' )
164
+ rescue DocuBot::Bundle::PageCollision => e
165
+ e.message.must_include "page1.md"
166
+ e.message.must_include "page1.textile"
167
+ e.message.must_include "Page 1 (from Markdown)"
168
+ e.message.must_include "Page 1 (from Textile)"
169
+ e.message.must_include "page2.html"
170
+ e.message.must_include "page2.txt"
171
+ e.message.must_include "page2.haml"
172
+ e.message.must_include "Page 2 (from html)"
173
+ e.message.must_include "Page 2 (from text)"
174
+ e.message.must_include "Page 2 (from haml)"
175
+ e.message.wont_include "page3.md"
176
+ e.message.wont_include "page3.bin"
177
+ e.message.wont_include "Page 3"
178
+ end
179
+ end
180
+
181
+ end
182
+
183
+ describe "Bundle with Extra Files" do
184
+ before do
185
+ @out, @err = capture_io do
186
+ @bundle = DocuBot::Bundle.new( SAMPLES/'files' )
187
+ end
188
+ end
189
+
190
+ it "should keep track of extra files seen" do
191
+ @bundle.extras.wont_be_nil
192
+ static_files = %w[ common.css _static/foo.png section/foo.jpg ]
193
+ static_files << "section/sub section/foo.gif"
194
+ static_files.each do |path|
195
+ @bundle.extras.must_include path
196
+ end
197
+ end
198
+
199
+ it "should not count page sources as extra files" do
200
+ page_files = %w[ index.md another.md first.textile section/page.haml ]
201
+ page_files << "section/sub section/page.txt"
202
+ page_files.each do |path|
203
+ @bundle.extras.wont_include path
204
+ end
205
+ end
206
+
207
+ it "should skip files specified by global glob matches" do
208
+ @bundle.global.ignore.as_list.must_equal %w[ **/*.psd **/*.ai **/Thumbs.db BUILDING.txt ]
209
+ bad_files = %w[ _static/foo.ai _static/foo.psd _static/Thumbs.db ]
210
+ bad_files << "section/sub section/Thumbs.db"
211
+ bad_files.each do |path|
212
+ @bundle.extras.wont_include path
213
+ end
214
+ end
215
+
216
+ it "should not count ignored files as the source for pages" do
217
+ @bundle.pages.find{ |page| page.file == 'BUILDING.txt' }.must_be_nil
218
+ @bundle.page_by_file_path['BUILDING.txt'].must_be_nil
219
+ end
220
+ end
221
+
222
+ describe "Pages in bundles" do
223
+ before do
224
+ @titles = [ 'First One', 'Second One', 'Third One', 'Fourth One', 'Fifth One', '911' ]
225
+ Dir.chdir SAMPLES/'links' do
226
+ @files = Dir['**/*'] - %w[ index.txt sub2/bozo.bin ]
227
+ @htmls = @files.map{ |path|
228
+ path[/\.[^.]+$/] ? path.gsub(/\.[^.]+$/,'.html') : path/'index.html'
229
+ }
230
+ end
231
+ @out, @err = capture_io do
232
+ @titles_bundle = DocuBot::Bundle.new SAMPLES/'titles'
233
+ @links_bundle = DocuBot::Bundle.new SAMPLES/'links'
234
+ end
235
+ end
236
+
237
+ it "should allow you to find arrays of pages by title" do
238
+ @titles_bundle.pages_by_title.wont_be_nil
239
+ @titles.each do |page_title|
240
+ pages = @titles_bundle.pages_by_title[page_title]
241
+ pages.must_be_kind_of Array
242
+ pages.length.must_equal 1
243
+ pages.first.must_be_kind_of DocuBot::Page
244
+ end
245
+ end
246
+
247
+ it "should return an empty array for a non-existent page" do
248
+ pages = @titles_bundle.pages_by_title['NONE SUCH']
249
+ pages.must_be_kind_of Array
250
+ pages.length.must_equal 0
251
+ end
252
+
253
+ it "should not include the main index file in the titles" do
254
+ pages = @titles_bundle.pages_by_title["Title Changin'"]
255
+ pages.must_be_kind_of Array
256
+ pages.length.must_equal 0
257
+ end
258
+
259
+ it "should give access to pages by source file path" do
260
+ @links_bundle.page_by_file_path.wont_be_nil
261
+ @files.each do |path|
262
+ @links_bundle.page_by_file_path[path].must_be_kind_of DocuBot::Page
263
+ end
264
+ end
265
+
266
+ it "should return nil for an unfound file path" do
267
+ @links_bundle.page_by_file_path['NONE SUCH'].must_be_nil
268
+ end
269
+
270
+ it "should not include raw files in the file paths" do
271
+ @links_bundle.page_by_file_path['sub2/bozo.bin'].must_be_nil
272
+ end
273
+
274
+ it "should give access to pages by html file path" do
275
+ @links_bundle.page_by_html_path.wont_be_nil
276
+ @htmls.each do |path|
277
+ p path unless @links_bundle.page_by_html_path[path]
278
+ @links_bundle.page_by_html_path[path].wont_be_nil
279
+ @links_bundle.page_by_html_path[path].must_be_kind_of DocuBot::Page
280
+ end
281
+ end
282
+
283
+ it "should return nil for an unfound html path" do
284
+ @links_bundle.page_by_html_path['NONE SUCH'].must_be_nil
285
+ end
286
+
287
+ it "should not include raw files in the html paths" do
288
+ @links_bundle.page_by_html_path['sub2/bozo.bin'].must_be_nil
289
+ end
290
+ end
291
+
292
+ describe "Global bundle attributes" do
293
+ before do
294
+ @out, @err = capture_io do
295
+ @bundle = DocuBot::Bundle.new SAMPLES/'attributes'
296
+ end
297
+ end
298
+
299
+ it "should have a global object" do
300
+ @bundle.global.wont_be_nil
301
+ end
302
+
303
+ it "should be indexable by method and return strings" do
304
+ @bundle.global.author.must_equal "Gavin Kistner"
305
+ @bundle.global.default.must_equal "All About Mr. Friggles"
306
+ @bundle.global.quotes.must_equal %q{"It's all about Mr. Benjamin", "I have never seen this cat before in my life!"}
307
+ @bundle.global.awesome.must_equal "true"
308
+ end
309
+
310
+ it "should be indexable by string" do
311
+ @bundle.global['author.email'].must_equal "!@phrogz.net"
312
+ @bundle.global['author website'].must_equal "http://phrogz.net"
313
+ end
314
+
315
+ it "should use utf8 for the strings" do
316
+ if Object.const_defined? :Encoding
317
+ Encoding.compatible?( @bundle.global.title, "UTF-8™")
318
+ end
319
+ @bundle.global.title.must_equal "Friggles® The Cat, ©2009"
320
+ end
321
+
322
+ it "should allow casting values to boolean" do
323
+ @bundle.global.awesome.as_boolean.must_equal true
324
+ end
325
+
326
+ it "should allow casting values to arrays of strings" do
327
+ quotes = @bundle.global.quotes.as_list
328
+ quotes.must_be_kind_of Array
329
+ quotes.must_equal [ "It's all about Mr. Benjamin", "I have never seen this cat before in my life!" ]
330
+ end
331
+ end
332
+
333
+ describe "Page attributes" do
334
+ before do
335
+ @out, @err = capture_io do
336
+ @bundle = DocuBot::Bundle.new SAMPLES/'attributes'
337
+ end
338
+ end
339
+
340
340
  end