webby 0.9.3-x86-mswin32

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 (229) hide show
  1. data/History.txt +206 -0
  2. data/Manifest.txt +228 -0
  3. data/README.txt +92 -0
  4. data/Rakefile +49 -0
  5. data/bin/webby +41 -0
  6. data/bin/webby-gen +41 -0
  7. data/examples/blog/Sitefile +7 -0
  8. data/examples/blog/tasks/blog.rake +72 -0
  9. data/examples/blog/templates/atom_feed.erb +40 -0
  10. data/examples/blog/templates/blog/month.erb +22 -0
  11. data/examples/blog/templates/blog/post.erb +16 -0
  12. data/examples/blog/templates/blog/year.erb +22 -0
  13. data/examples/presentation/Sitefile +10 -0
  14. data/examples/presentation/content/css/uv/twilight.css +137 -0
  15. data/examples/presentation/content/presentation/_sample_code.txt +10 -0
  16. data/examples/presentation/content/presentation/index.txt +63 -0
  17. data/examples/presentation/content/presentation/s5/blank.gif +0 -0
  18. data/examples/presentation/content/presentation/s5/bodybg.gif +0 -0
  19. data/examples/presentation/content/presentation/s5/framing.css +23 -0
  20. data/examples/presentation/content/presentation/s5/iepngfix.htc +42 -0
  21. data/examples/presentation/content/presentation/s5/opera.css +7 -0
  22. data/examples/presentation/content/presentation/s5/outline.css +15 -0
  23. data/examples/presentation/content/presentation/s5/pretty.css +86 -0
  24. data/examples/presentation/content/presentation/s5/print.css +25 -0
  25. data/examples/presentation/content/presentation/s5/s5-core.css +9 -0
  26. data/examples/presentation/content/presentation/s5/slides.css +3 -0
  27. data/examples/presentation/content/presentation/s5/slides.js +553 -0
  28. data/examples/presentation/layouts/presentation.txt +43 -0
  29. data/examples/presentation/templates/_code_partial.erb +13 -0
  30. data/examples/presentation/templates/presentation.erb +40 -0
  31. data/examples/tumblog/Sitefile +9 -0
  32. data/examples/tumblog/content/css/tumblog.css +308 -0
  33. data/examples/tumblog/content/images/tumblog/permalink.gif +0 -0
  34. data/examples/tumblog/content/images/tumblog/rss.gif +0 -0
  35. data/examples/tumblog/content/tumblog/200806/the-noble-chicken/index.txt +12 -0
  36. data/examples/tumblog/content/tumblog/200807/historical-perspectives-on-the-classic-chicken-joke/index.txt +12 -0
  37. data/examples/tumblog/content/tumblog/200807/mad-city-chickens/index.txt +10 -0
  38. data/examples/tumblog/content/tumblog/200807/the-wisdom-of-the-dutch/index.txt +11 -0
  39. data/examples/tumblog/content/tumblog/200807/up-a-tree/index.txt +13 -0
  40. data/examples/tumblog/content/tumblog/index.txt +37 -0
  41. data/examples/tumblog/content/tumblog/rss.txt +37 -0
  42. data/examples/tumblog/layouts/tumblog/default.txt +44 -0
  43. data/examples/tumblog/layouts/tumblog/post.txt +15 -0
  44. data/examples/tumblog/lib/tumblog_helper.rb +32 -0
  45. data/examples/tumblog/tasks/tumblog.rake +30 -0
  46. data/examples/tumblog/templates/atom_feed.erb +40 -0
  47. data/examples/tumblog/templates/tumblog/conversation.erb +12 -0
  48. data/examples/tumblog/templates/tumblog/link.erb +10 -0
  49. data/examples/tumblog/templates/tumblog/photo.erb +13 -0
  50. data/examples/tumblog/templates/tumblog/post.erb +12 -0
  51. data/examples/tumblog/templates/tumblog/quote.erb +11 -0
  52. data/examples/webby/Sitefile +19 -0
  53. data/examples/webby/content/communicate/index.txt +28 -0
  54. data/examples/webby/content/css/background.gif +0 -0
  55. data/examples/webby/content/css/blueprint/print.css +76 -0
  56. data/examples/webby/content/css/blueprint/screen.css +696 -0
  57. data/examples/webby/content/css/coderay.css +96 -0
  58. data/examples/webby/content/css/site.css +196 -0
  59. data/examples/webby/content/css/uv/twilight.css +137 -0
  60. data/examples/webby/content/index.txt +37 -0
  61. data/examples/webby/content/learn/index.txt +28 -0
  62. data/examples/webby/content/reference/index.txt +204 -0
  63. data/examples/webby/content/release-notes/index.txt +21 -0
  64. data/examples/webby/content/release-notes/rel-0-9-0/index.txt +74 -0
  65. data/examples/webby/content/release-notes/rel-0-9-1/index.txt +93 -0
  66. data/examples/webby/content/release-notes/rel-0-9-2/index.txt +14 -0
  67. data/examples/webby/content/release-notes/rel-0-9-3/index.txt +49 -0
  68. data/examples/webby/content/robots.txt +6 -0
  69. data/examples/webby/content/script/jquery.corner.js +152 -0
  70. data/examples/webby/content/script/jquery.js +31 -0
  71. data/examples/webby/content/sitemap.txt +31 -0
  72. data/examples/webby/content/tips_and_tricks/index.txt +97 -0
  73. data/examples/webby/content/tutorial/index.txt +135 -0
  74. data/examples/webby/content/user-manual/index.txt +419 -0
  75. data/examples/webby/layouts/default.txt +49 -0
  76. data/examples/webby/templates/page.erb +10 -0
  77. data/examples/website/Sitefile +7 -0
  78. data/examples/website/content/css/blueprint/License.txt +21 -0
  79. data/examples/website/content/css/blueprint/Readme.txt +100 -0
  80. data/examples/website/content/css/blueprint/compressed/print.css +76 -0
  81. data/examples/website/content/css/blueprint/compressed/screen.css +696 -0
  82. data/examples/website/content/css/blueprint/lib/forms.css +45 -0
  83. data/examples/website/content/css/blueprint/lib/grid.css +193 -0
  84. data/examples/website/content/css/blueprint/lib/grid.png +0 -0
  85. data/examples/website/content/css/blueprint/lib/ie.css +30 -0
  86. data/examples/website/content/css/blueprint/lib/reset.css +39 -0
  87. data/examples/website/content/css/blueprint/lib/typography.css +116 -0
  88. data/examples/website/content/css/blueprint/plugins/buttons/Readme +31 -0
  89. data/examples/website/content/css/blueprint/plugins/buttons/buttons.css +97 -0
  90. data/examples/website/content/css/blueprint/plugins/buttons/icons/cross.png +0 -0
  91. data/examples/website/content/css/blueprint/plugins/buttons/icons/key.png +0 -0
  92. data/examples/website/content/css/blueprint/plugins/buttons/icons/tick.png +0 -0
  93. data/examples/website/content/css/blueprint/plugins/css-classes/Readme +14 -0
  94. data/examples/website/content/css/blueprint/plugins/css-classes/css-classes.css +24 -0
  95. data/examples/website/content/css/blueprint/plugins/fancy-type/Readme +22 -0
  96. data/examples/website/content/css/blueprint/plugins/fancy-type/fancy-type-compressed.css +5 -0
  97. data/examples/website/content/css/blueprint/plugins/fancy-type/fancy-type.css +74 -0
  98. data/examples/website/content/css/blueprint/print.css +68 -0
  99. data/examples/website/content/css/blueprint/screen.css +22 -0
  100. data/examples/website/content/css/coderay.css +111 -0
  101. data/examples/website/content/css/site.css +67 -0
  102. data/examples/website/content/index.txt +19 -0
  103. data/examples/website/layouts/default.txt +58 -0
  104. data/examples/website/lib/breadcrumbs.rb +28 -0
  105. data/examples/website/templates/_partial.erb +10 -0
  106. data/examples/website/templates/page.erb +18 -0
  107. data/lib/webby.rb +221 -0
  108. data/lib/webby/apps.rb +12 -0
  109. data/lib/webby/apps/generator.rb +276 -0
  110. data/lib/webby/apps/main.rb +255 -0
  111. data/lib/webby/auto_builder.rb +157 -0
  112. data/lib/webby/builder.rb +180 -0
  113. data/lib/webby/core_ext/enumerable.rb +11 -0
  114. data/lib/webby/core_ext/hash.rb +28 -0
  115. data/lib/webby/core_ext/kernel.rb +26 -0
  116. data/lib/webby/core_ext/string.rb +163 -0
  117. data/lib/webby/core_ext/time.rb +9 -0
  118. data/lib/webby/filters.rb +83 -0
  119. data/lib/webby/filters/basepath.rb +97 -0
  120. data/lib/webby/filters/erb.rb +9 -0
  121. data/lib/webby/filters/haml.rb +18 -0
  122. data/lib/webby/filters/markdown.rb +16 -0
  123. data/lib/webby/filters/outline.rb +309 -0
  124. data/lib/webby/filters/sass.rb +17 -0
  125. data/lib/webby/filters/slides.rb +56 -0
  126. data/lib/webby/filters/textile.rb +16 -0
  127. data/lib/webby/filters/tidy.rb +76 -0
  128. data/lib/webby/filters/wiki_words.rb +14 -0
  129. data/lib/webby/helpers.rb +30 -0
  130. data/lib/webby/helpers/capture_helper.rb +141 -0
  131. data/lib/webby/helpers/coderay_helper.rb +69 -0
  132. data/lib/webby/helpers/graphviz_helper.rb +136 -0
  133. data/lib/webby/helpers/tag_helper.rb +65 -0
  134. data/lib/webby/helpers/tex_img_helper.rb +133 -0
  135. data/lib/webby/helpers/ultraviolet_helper.rb +63 -0
  136. data/lib/webby/helpers/url_helper.rb +241 -0
  137. data/lib/webby/journal.rb +126 -0
  138. data/lib/webby/link_validator.rb +152 -0
  139. data/lib/webby/renderer.rb +386 -0
  140. data/lib/webby/resources.rb +136 -0
  141. data/lib/webby/resources/db.rb +251 -0
  142. data/lib/webby/resources/layout.rb +54 -0
  143. data/lib/webby/resources/meta_file.rb +211 -0
  144. data/lib/webby/resources/page.rb +81 -0
  145. data/lib/webby/resources/partial.rb +85 -0
  146. data/lib/webby/resources/resource.rb +201 -0
  147. data/lib/webby/resources/static.rb +36 -0
  148. data/lib/webby/stelan/mktemp.rb +135 -0
  149. data/lib/webby/stelan/paginator.rb +165 -0
  150. data/lib/webby/stelan/spawner.rb +339 -0
  151. data/lib/webby/tasks/build.rake +27 -0
  152. data/lib/webby/tasks/create.rake +22 -0
  153. data/lib/webby/tasks/deploy.rake +22 -0
  154. data/lib/webby/tasks/growl.rake +16 -0
  155. data/lib/webby/tasks/validate.rake +19 -0
  156. data/spec/core_ext/hash_spec.rb +47 -0
  157. data/spec/core_ext/string_spec.rb +110 -0
  158. data/spec/core_ext/time_spec.rb +19 -0
  159. data/spec/data/hooligans/bad_meta_data_1.txt +34 -0
  160. data/spec/data/hooligans/bad_meta_data_2.txt +34 -0
  161. data/spec/data/outline/basic.out +81 -0
  162. data/spec/data/outline/basic.txt +25 -0
  163. data/spec/data/outline/no_clobber.out +86 -0
  164. data/spec/data/outline/numbering.out +81 -0
  165. data/spec/data/outline/numbering_only.out +21 -0
  166. data/spec/data/outline/toc_range_1.out +66 -0
  167. data/spec/data/outline/toc_range_2.out +55 -0
  168. data/spec/data/outline/toc_style.out +81 -0
  169. data/spec/data/site/Sitefile +9 -0
  170. data/spec/data/site/content/_partial.txt +10 -0
  171. data/spec/data/site/content/css/coderay.css +111 -0
  172. data/spec/data/site/content/css/site.css +67 -0
  173. data/spec/data/site/content/css/tumblog.css +308 -0
  174. data/spec/data/site/content/images/tumblog/permalink.gif +0 -0
  175. data/spec/data/site/content/images/tumblog/rss.gif +0 -0
  176. data/spec/data/site/content/index.txt +19 -0
  177. data/spec/data/site/content/photos.txt +21 -0
  178. data/spec/data/site/content/tumblog/200806/the-noble-chicken/index.txt +12 -0
  179. data/spec/data/site/content/tumblog/200807/historical-perspectives-on-the-classic-chicken-joke/index.txt +12 -0
  180. data/spec/data/site/content/tumblog/200807/mad-city-chickens/index.txt +10 -0
  181. data/spec/data/site/content/tumblog/200807/the-wisdom-of-the-dutch/index.txt +11 -0
  182. data/spec/data/site/content/tumblog/200807/up-a-tree/index.txt +13 -0
  183. data/spec/data/site/content/tumblog/index.txt +37 -0
  184. data/spec/data/site/content/tumblog/rss.txt +37 -0
  185. data/spec/data/site/layouts/default.txt +58 -0
  186. data/spec/data/site/layouts/tumblog/default.txt +44 -0
  187. data/spec/data/site/layouts/tumblog/post.txt +15 -0
  188. data/spec/data/site/lib/breadcrumbs.rb +28 -0
  189. data/spec/data/site/lib/tumblog_helper.rb +32 -0
  190. data/spec/data/site/tasks/tumblog.rake +30 -0
  191. data/spec/data/site/templates/_partial.erb +10 -0
  192. data/spec/data/site/templates/atom_feed.erb +40 -0
  193. data/spec/data/site/templates/page.erb +18 -0
  194. data/spec/data/site/templates/presentation.erb +40 -0
  195. data/spec/data/site/templates/tumblog/conversation.erb +12 -0
  196. data/spec/data/site/templates/tumblog/link.erb +10 -0
  197. data/spec/data/site/templates/tumblog/photo.erb +13 -0
  198. data/spec/data/site/templates/tumblog/post.erb +12 -0
  199. data/spec/data/site/templates/tumblog/quote.erb +11 -0
  200. data/spec/spec.opts +1 -0
  201. data/spec/spec_helper.rb +51 -0
  202. data/spec/webby/apps/generator_spec.rb +116 -0
  203. data/spec/webby/apps/main_spec.rb +88 -0
  204. data/spec/webby/filters/basepath_spec.rb +167 -0
  205. data/spec/webby/filters/outline_spec.rb +92 -0
  206. data/spec/webby/filters/textile_spec.rb +20 -0
  207. data/spec/webby/helpers/capture_helper_spec.rb +56 -0
  208. data/spec/webby/renderer_spec.rb +139 -0
  209. data/spec/webby/resources/db_spec.rb +250 -0
  210. data/spec/webby/resources/layout_spec.rb +83 -0
  211. data/spec/webby/resources/meta_file_spec.rb +171 -0
  212. data/spec/webby/resources/page_spec.rb +111 -0
  213. data/spec/webby/resources/partial_spec.rb +58 -0
  214. data/spec/webby/resources/resource_spec.rb +219 -0
  215. data/spec/webby/resources/static_spec.rb +49 -0
  216. data/spec/webby/resources_spec.rb +69 -0
  217. data/tasks/ann.rake +81 -0
  218. data/tasks/bones.rake +21 -0
  219. data/tasks/gem.rake +187 -0
  220. data/tasks/git.rake +41 -0
  221. data/tasks/manifest.rake +48 -0
  222. data/tasks/notes.rake +28 -0
  223. data/tasks/post_load.rake +39 -0
  224. data/tasks/rdoc.rake +51 -0
  225. data/tasks/rubyforge.rake +55 -0
  226. data/tasks/setup.rb +268 -0
  227. data/tasks/spec.rake +55 -0
  228. data/tasks/website.rake +38 -0
  229. metadata +365 -0
@@ -0,0 +1,83 @@
1
+
2
+ require File.expand_path(
3
+ File.join(File.dirname(__FILE__), %w[.. .. spec_helper]))
4
+
5
+ # -------------------------------------------------------------------------
6
+ describe Webby::Resources::Layout do
7
+ before :each do
8
+ layout = Webby::Resources::Layout.
9
+ new(Webby.datapath %w[site layouts tumblog default.txt])
10
+ Webby::Resources.stub!(:find_layout).and_return(layout)
11
+
12
+ @default = File.join %w[layouts tumblog default.txt]
13
+ @post = File.join %w[layouts tumblog post.txt]
14
+ @layout = Webby::Resources::Layout.new(@default)
15
+ end
16
+
17
+ it 'parses meta-data on initialization' do
18
+ h = @layout._meta_data
19
+
20
+ h.should_not be_empty
21
+ h.should == {
22
+ 'extension' => 'html',
23
+ 'filter' => 'erb'
24
+ }
25
+ end
26
+
27
+ it 'uses the cairn file as the destination' do
28
+ @layout.destination.should == ::Webby.cairn
29
+ end
30
+
31
+ it 'always returns nil as the url' do
32
+ @layout.url.should be_nil
33
+ end
34
+
35
+ it 'reads the contents of the file' do
36
+ layout = Webby::Resources::Layout.new(@post)
37
+ str = layout._read
38
+ str.split($/).first.should == '<div class="post">'
39
+ end
40
+
41
+ # -----------------------------------------------------------------------
42
+ describe '.extension' do
43
+ it 'uses the extension from the meta-data if present' do
44
+ @layout.extension.should == 'html'
45
+ end
46
+
47
+ it "returns nil if no extension is found in the meta-data" do
48
+ @layout._meta_data.delete('extension')
49
+ @layout.extension.should be_nil
50
+ end
51
+
52
+ it "uses the parent layout's extension if a parent layout is present" do
53
+ layout = Webby::Resources::Layout.new(@post)
54
+ layout.extension.should == 'html'
55
+
56
+ layout._meta_data.delete('layout')
57
+ layout.extension.should be_nil
58
+ end
59
+ end
60
+
61
+ # -----------------------------------------------------------------------
62
+ describe '.dirty?' do
63
+ it 'overrides the dirty state based on the meta-data value' do
64
+ @layout['dirty'] = true
65
+ @layout.dirty?.should == true
66
+
67
+ @layout['dirty'] = false
68
+ @layout.dirty?.should == false
69
+ end
70
+
71
+ it 'returns true if the output file is missing' do
72
+ @layout.dirty?.should == true
73
+ end
74
+
75
+ it 'returns false if the cairn file is present' do
76
+ FileUtils.touch Webby.cairn
77
+ @layout.dirty?.should == false
78
+ end
79
+ end
80
+
81
+ end # describe Webby::Resources::Layout
82
+
83
+ # EOF
@@ -0,0 +1,171 @@
1
+
2
+ require File.expand_path(
3
+ File.join(File.dirname(__FILE__), %w[.. .. spec_helper]))
4
+
5
+ # -------------------------------------------------------------------------
6
+ describe Webby::Resources::MetaFile do
7
+
8
+ it 'raises an error when created without an IO object' do
9
+ lambda {Webby::Resources::MetaFile.new('string')}.should raise_error(
10
+ ArgumentError, 'expecting an IO stream')
11
+ end
12
+
13
+ it 'returns the number of meta-data blocks at the top of a file' do
14
+ fn = Webby.datapath %w[site content css coderay.css]
15
+ File.open(fn, 'r') do |fd|
16
+ mf = Webby::Resources::MetaFile.new(fd)
17
+ mf.meta_count.should == 0
18
+ end
19
+
20
+ fn = Webby.datapath %w[site content index.txt]
21
+ File.open(fn, 'r') do |fd|
22
+ mf = Webby::Resources::MetaFile.new(fd)
23
+ mf.meta_count.should == 1
24
+ end
25
+
26
+ fn = Webby.datapath %w[site content photos.txt]
27
+ File.open(fn, 'r') do |fd|
28
+ mf = Webby::Resources::MetaFile.new(fd)
29
+ mf.meta_count.should == 3
30
+ end
31
+ end
32
+
33
+ it 'determines the end of the final meta-data block' do
34
+ fn = Webby.datapath %w[site content index.txt]
35
+ File.open(fn, 'r') do |fd|
36
+ mf = Webby::Resources::MetaFile.new(fd)
37
+ mf.meta_end.should == 7
38
+ end
39
+
40
+ fn = Webby.datapath %w[site content photos.txt]
41
+ File.open(fn, 'r') do |fd|
42
+ mf = Webby::Resources::MetaFile.new(fd)
43
+ mf.meta_end.should == 18
44
+ end
45
+ end
46
+
47
+ # -----------------------------------------------------------------------
48
+ describe '.each' do
49
+ it 'yields each meta-data block' do
50
+ fn = Webby.datapath %w[site content photos.txt]
51
+ output = []
52
+ File.open(fn, 'r') do |fd|
53
+ mf = Webby::Resources::MetaFile.new(fd)
54
+ mf.each {|h| output << h}
55
+ end
56
+ output.length.should == 3
57
+ output.map {|h| h['title']}.should == [
58
+ 'First Photo',
59
+ 'Second Photo',
60
+ 'Third Photo'
61
+ ]
62
+ output.map {|h| h['directory']}.should == ['photos']*3
63
+ output.map {|h| h['filename']}.should == %w[image1 image2 image3]
64
+
65
+ end
66
+
67
+ it 'yields a single meta-data block' do
68
+ fn = Webby.datapath %w[site content index.txt]
69
+ output = []
70
+ File.open(fn, 'r') do |fd|
71
+ mf = Webby::Resources::MetaFile.new(fd)
72
+ mf.each {|h| output << h}
73
+ end
74
+ output.length.should == 1
75
+ h = output.first
76
+ h['title'].should == 'Home Page'
77
+ h['filter'].should == %w[erb textile]
78
+ end
79
+
80
+ it 'raises an error if the meta-data is not a hash' do
81
+ fn = Webby.datapath %w[hooligans bad_meta_data_1.txt]
82
+ output = []
83
+ File.open(fn, 'r') do |fd|
84
+ mf = Webby::Resources::MetaFile.new(fd)
85
+ lambda {
86
+ mf.each {|h| output << h}
87
+ }.should raise_error(Webby::Resources::MetaFile::Error)
88
+ end
89
+ output.length.should == 1
90
+ end
91
+
92
+ it "really doesn't like YAML syntax errors" do
93
+ fn = Webby.datapath %w[hooligans bad_meta_data_2.txt]
94
+ output = []
95
+ File.open(fn, 'r') do |fd|
96
+ mf = Webby::Resources::MetaFile.new(fd)
97
+ lambda {
98
+ mf.each {|h| output << h}
99
+ }.should raise_error(Webby::Resources::MetaFile::Error)
100
+ end
101
+ output.length.should == 1
102
+ end
103
+ end
104
+
105
+ # -----------------------------------------------------------------------
106
+ describe '#meta_data' do
107
+ it 'returns nil for regular files' do
108
+ fn = Webby.datapath %w[site content css coderay.css]
109
+ Webby::Resources::MetaFile.meta_data(fn).should be_nil
110
+ end
111
+
112
+ it 'returns a hash for pages' do
113
+ fn = Webby.datapath %w[site content index.txt]
114
+ h = Webby::Resources::MetaFile.meta_data(fn)
115
+
116
+ h.should be_instance_of(Hash)
117
+ h['created_at'].should be_instance_of(Time)
118
+ end
119
+
120
+ it 'returns a hash for layouts' do
121
+ fn = Webby.datapath %w[site layouts default.txt]
122
+ h = Webby::Resources::MetaFile.meta_data(fn)
123
+
124
+ h.should be_instance_of(Hash)
125
+ h.should == {
126
+ 'extension' => 'html',
127
+ 'filter' => 'erb'
128
+ }
129
+ end
130
+ end
131
+
132
+ # -----------------------------------------------------------------------
133
+ describe "#meta_data?" do
134
+ it 'returns true for files with meta-data' do
135
+ fn = Webby.datapath %w[site content index.txt]
136
+ Webby::Resources::MetaFile.meta_data?(fn).should == true
137
+ end
138
+
139
+ it 'returns false for files without meta-data' do
140
+ fn = Webby.datapath %w[site content css coderay.css]
141
+ Webby::Resources::MetaFile.meta_data?(fn).should == false
142
+ end
143
+ end
144
+
145
+ # -----------------------------------------------------------------------
146
+ describe "#read" do
147
+ it 'behaves the same as File#read for regular files' do
148
+ fn = Webby.datapath %w[site content css coderay.css]
149
+ Webby::Resources::MetaFile.read(fn).should == ::File.read(fn)
150
+ end
151
+
152
+ it 'returns only the content for pages' do
153
+ fn = Webby.datapath %w[site content index.txt]
154
+ lines = File.readlines(fn)
155
+ lines = lines[7..-1].join
156
+
157
+ Webby::Resources::MetaFile.read(fn).should == lines
158
+ end
159
+
160
+ it 'returns only the content for layouts' do
161
+ fn = Webby.datapath %w[site layouts default.txt]
162
+ lines = File.readlines(fn)
163
+ lines = lines[4..-1].join
164
+
165
+ Webby::Resources::MetaFile.read(fn).should == lines
166
+ end
167
+ end
168
+
169
+ end # describe Webby::Resources::MetaFile
170
+
171
+ # EOF
@@ -0,0 +1,111 @@
1
+
2
+ require File.expand_path(
3
+ File.join(File.dirname(__FILE__), %w[.. .. spec_helper]))
4
+
5
+ # -------------------------------------------------------------------------
6
+ describe Webby::Resources::Page do
7
+ before :each do
8
+ layout = Webby::Resources::Layout.
9
+ new(Webby.datapath %w[site layouts default.txt])
10
+ Webby::Resources.stub!(:find_layout).and_return(layout)
11
+
12
+ @filename = File.join %w[content index.txt]
13
+ @page = Webby::Resources::Page.new(@filename)
14
+ end
15
+
16
+ it 'parses meta-data on initialization' do
17
+ h = @page._meta_data
18
+
19
+ h.should_not be_empty
20
+ h['title'].should == 'Home Page'
21
+ h['filter'].should == ['erb', 'textile']
22
+ h['layout'].should == 'default'
23
+ end
24
+
25
+ it 'can be given a hash of meta-data on initialization' do
26
+ page = Webby::Resources::Page.new(
27
+ @filename,
28
+ 'title' => 'Not Your Average Title'
29
+ )
30
+
31
+ h = page._meta_data
32
+ h.should_not be_empty
33
+ h['title'].should == 'Not Your Average Title'
34
+ h['layout'].should == 'default'
35
+ h['created_at'].should be_nil
36
+ h['filter'].should be_nil
37
+ end
38
+
39
+ it 'reads the contents of the file' do
40
+ str = @page._read
41
+ str.split($/).first.should == "p(title). <%= @page.title %>"
42
+ end
43
+
44
+ # -----------------------------------------------------------------------
45
+ describe '.url' do
46
+ before :each do
47
+ @filename = File.join %w[content tumblog rss.txt]
48
+ @page = Webby::Resources::Page.new(@filename)
49
+ end
50
+
51
+ it 'computes the url from the destination' do
52
+ @page.url.should == '/tumblog/rss.xml'
53
+ end
54
+
55
+ it "uses only the directory name for 'index' files" do
56
+ filename = File.join %w[content tumblog index.txt]
57
+ resource = Webby::Resources::Page.new(filename)
58
+ resource.url.should == '/tumblog'
59
+ end
60
+ end
61
+
62
+ # -----------------------------------------------------------------------
63
+ describe '.extension' do
64
+ it 'uses the extension from the meta-data if present' do
65
+ @page['extension'] = 'foo'
66
+ @page.extension.should == 'foo'
67
+ end
68
+
69
+ it "uses the layout's extension if a layout is present" do
70
+ @page.extension.should == 'html'
71
+ end
72
+
73
+ it "uses the file's extension as a last ditch effort" do
74
+ @page._meta_data.delete('layout')
75
+ @page.extension.should == 'txt'
76
+ end
77
+ end
78
+
79
+ # -----------------------------------------------------------------------
80
+ describe '.dirty?' do
81
+ it 'overrides the dirty state based on the meta-data value' do
82
+ @page['dirty'] = true
83
+ @page.dirty?.should == true
84
+
85
+ @page['dirty'] = false
86
+ @page.dirty?.should == false
87
+ end
88
+
89
+ it 'returns true if the output file is missing' do
90
+ @page.dirty?.should == true
91
+ end
92
+
93
+ it 'returns true if the layout is dirty' do
94
+ dest = @page.destination
95
+ FileUtils.touch dest
96
+
97
+ @page.dirty?.should == true
98
+ end
99
+
100
+ it 'returns false if everything is up to date' do
101
+ dest = @page.destination
102
+ FileUtils.touch dest
103
+ FileUtils.touch ::Webby.cairn
104
+
105
+ @page.dirty?.should == false
106
+ end
107
+ end
108
+
109
+ end # describe Webby::Resources::Page
110
+
111
+ # EOF
@@ -0,0 +1,58 @@
1
+
2
+ require File.expand_path(
3
+ File.join(File.dirname(__FILE__), %w[.. .. spec_helper]))
4
+
5
+ # -------------------------------------------------------------------------
6
+ describe Webby::Resources::Partial do
7
+ before :each do
8
+ @filename = File.join %w[content _partial.txt]
9
+ @partial = Webby::Resources::Partial.new(@filename)
10
+ end
11
+
12
+ it 'parses meta-data on initialization' do
13
+ h = @partial._meta_data
14
+
15
+ h.should_not be_empty
16
+ h.should == {'filter' => 'erb'}
17
+ end
18
+
19
+ it 'uses the cairn file as the destination' do
20
+ @partial.destination.should == ::Webby.cairn
21
+ end
22
+
23
+ it 'always returns nil as the url' do
24
+ @partial.url.should be_nil
25
+ end
26
+
27
+ it 'reads the contents of the file' do
28
+ str = @partial._read
29
+ str.split($/).first.should == 'A partial has access to the page from which it was called. The title below will be the title of the page in which this partial is rendered.'
30
+ end
31
+
32
+ it 'uses the files extension as the extension' do
33
+ @partial.extension.should equal(@partial.ext)
34
+ end
35
+
36
+ # -----------------------------------------------------------------------
37
+ describe '.dirty?' do
38
+ it 'overrides the dirty state based on the meta-data value' do
39
+ @partial['dirty'] = true
40
+ @partial.dirty?.should == true
41
+
42
+ @partial['dirty'] = false
43
+ @partial.dirty?.should == false
44
+ end
45
+
46
+ it 'returns true if the cairn file is missing' do
47
+ @partial.dirty?.should == true
48
+ end
49
+
50
+ it 'returns false if the cairn file is present' do
51
+ FileUtils.touch Webby.cairn
52
+ @partial.dirty?.should == false
53
+ end
54
+ end
55
+
56
+ end # describe Webby::Resources::Partial
57
+
58
+ # EOF
@@ -0,0 +1,219 @@
1
+
2
+ require File.expand_path(
3
+ File.join(File.dirname(__FILE__), %w[.. .. spec_helper]))
4
+
5
+ # -------------------------------------------------------------------------
6
+ describe Webby::Resources::Resource do
7
+
8
+ before :each do
9
+ layout = Webby::Resources::Layout.
10
+ new(Webby.datapath %w[site layouts default.txt])
11
+ Webby::Resources.stub!(:find_layout).and_return(layout)
12
+
13
+ @filename = File.join %w[content index.txt]
14
+ @resource = Webby::Resources::Resource.new(@filename)
15
+ end
16
+
17
+ it 'does not parse meta-data by default' do
18
+ @resource._meta_data.should be_empty
19
+ end
20
+
21
+ it 'provides the path to the file' do
22
+ @resource.path.should == @filename
23
+ end
24
+
25
+ it 'returns the bare filename' do
26
+ @resource.name.should == 'index'
27
+
28
+ resource = Webby::Resources::Resource.
29
+ new(File.join(%w[content tumblog rss.txt]))
30
+ resource.name.should == 'rss'
31
+ end
32
+
33
+ it 'returns the path-based extension' do
34
+ @resource.ext.should == 'txt'
35
+ end
36
+
37
+ it 'computes the directory of the file with the content folder removed' do
38
+ @resource.dir.should == ''
39
+
40
+ resource = Webby::Resources::Resource.
41
+ new(File.join(%w[content tumblog index.txt]))
42
+ resource.dir.should == 'tumblog'
43
+ end
44
+
45
+ it 'returns the modification time of the file' do
46
+ @resource.mtime.should be_instance_of(Time)
47
+ end
48
+
49
+ it 'determines equality from the full path' do
50
+ a = Webby::Resources::Resource.new(File.join(%w[content tumblog index.txt]))
51
+ b = Webby::Resources::Resource.new(File.join(%w[content tumblog rss.txt]))
52
+ c = Webby::Resources::Resource.new(File.join(%w[content tumblog index.txt]))
53
+
54
+ (a == b).should == false
55
+ (a == c).should == true
56
+ (b == c).should == false
57
+ (a == nil).should == false
58
+ (a == a.path).should == false
59
+
60
+ b['filename'] = 'index'
61
+ b._reset
62
+ b.destination.should == a.destination
63
+ (a == b).should == false
64
+ end
65
+
66
+ it 'compares two resources by path' do
67
+ a = Webby::Resources::Resource.new(File.join(%w[content tumblog index.txt]))
68
+ b = Webby::Resources::Resource.new(File.join(%w[content tumblog rss.txt]))
69
+ c = Webby::Resources::Resource.new(File.join(%w[content tumblog index.txt]))
70
+
71
+ (a <=> b).should == -1
72
+ (b <=> a).should == 1
73
+ (a <=> c).should == 0
74
+ (a <=> a).should == 0
75
+ (a <=> nil).should be_nil
76
+ (a <=> a.path).should be_nil
77
+ end
78
+
79
+ it 'can alter meta-data' do
80
+ @resource['title'].should be_nil
81
+ @resource[:title] = 'Home Page'
82
+
83
+ @resource['title'].should == 'Home Page'
84
+ @resource[:title].should == 'Home Page'
85
+ @resource[:title].should equal(@resource['title'])
86
+ end
87
+
88
+ it 'overrides the dirty state based on the meta-data value' do
89
+ @resource['dirty'] = true
90
+ @resource.dirty?.should == true
91
+
92
+ @resource['dirty'] = false
93
+ @resource.dirty?.should == false
94
+ end
95
+
96
+ it 'reads the contents of the file' do
97
+ str = @resource._read
98
+ str.split($/).first.should == "p(title). <%= @page.title %>"
99
+ end
100
+
101
+ it 'repleces the meta-data hash when reset' do
102
+ @resource._meta_data.should be_empty
103
+ oid = @resource._meta_data.object_id
104
+
105
+ @resource._reset('foo' => 'bar')
106
+ @resource._meta_data.should_not be_empty
107
+ @resource._meta_data.object_id.should == oid
108
+ @resource._meta_data['foo'].should == 'bar'
109
+ end
110
+
111
+ # -----------------------------------------------------------------------
112
+ describe '.filename' do
113
+ it 'uses the filename from the meta-data if present' do
114
+ @resource['filename'] = 'bozo'
115
+ @resource.filename.should == 'bozo'
116
+ end
117
+
118
+ it "uses the file's filename as a last ditch effort" do
119
+ @resource.filename.should == 'index'
120
+ end
121
+ end
122
+
123
+ # -----------------------------------------------------------------------
124
+ describe '.extension' do
125
+ it 'uses the extension from the meta-data if present' do
126
+ @resource['extension'] = 'foo'
127
+ @resource.extension.should == 'foo'
128
+ end
129
+
130
+ it "uses the file's extension as a last ditch effort" do
131
+ @resource.extension.should == 'txt'
132
+ end
133
+ end
134
+
135
+ # -----------------------------------------------------------------------
136
+ describe '.directory' do
137
+ it 'uses the directory from the meta-data if present' do
138
+ @resource['directory'] = 'foo'
139
+ @resource.directory.should == 'foo'
140
+ end
141
+
142
+ it "uses the file's directory as a last ditch effort" do
143
+ @resource.directory.should == ''
144
+ end
145
+ end
146
+
147
+ # -----------------------------------------------------------------------
148
+ describe '.url' do
149
+ it 'computes the url from the filename and directory' do
150
+ @resource.url.should == '/index.txt'
151
+ end
152
+
153
+ it 'caches the url' do
154
+ @resource.url.should == '/index.txt'
155
+
156
+ @resource['directory'] = 'foo/bar/baz'
157
+ @resource.url.should == '/index.txt'
158
+ end
159
+
160
+ it 'clears the cached url on reset' do
161
+ @resource.url.should == '/index.txt'
162
+
163
+ @resource['directory'] = 'foo/bar/baz'
164
+ @resource.url.should == '/index.txt'
165
+
166
+ @resource._reset
167
+ @resource.url.should == '/foo/bar/baz/index.txt'
168
+ end
169
+ end
170
+
171
+ # -----------------------------------------------------------------------
172
+ describe '.destination' do
173
+ it 'computes the destination from the filename and directory' do
174
+ @resource.destination.should == 'output/index.txt'
175
+ end
176
+
177
+ it 'caches the destination' do
178
+ @resource.destination.should == 'output/index.txt'
179
+
180
+ @resource['directory'] = 'foo/bar/baz'
181
+ @resource.destination.should == 'output/index.txt'
182
+ end
183
+
184
+ it 'clears the cached destination on reset' do
185
+ @resource.destination.should == 'output/index.txt'
186
+
187
+ @resource['directory'] = 'foo/bar/baz'
188
+ @resource.destination.should == 'output/index.txt'
189
+
190
+ @resource._reset
191
+ @resource.destination.should == 'output/foo/bar/baz/index.txt'
192
+ end
193
+ end
194
+
195
+ # -----------------------------------------------------------------------
196
+ describe '.dirty?' do
197
+ it 'overrides the dirty state based on the meta-data value' do
198
+ @resource['dirty'] = true
199
+ @resource.dirty?.should == true
200
+
201
+ @resource['dirty'] = false
202
+ @resource.dirty?.should == false
203
+ end
204
+
205
+ it 'returns true if the output file is missing' do
206
+ @resource.dirty?.should == true
207
+ end
208
+
209
+ it 'returns false if everything is up to date' do
210
+ dest = @resource.destination
211
+ FileUtils.touch dest
212
+
213
+ @resource.dirty?.should == false
214
+ end
215
+ end
216
+
217
+ end # describe Webby::Resources::Resource
218
+
219
+ # EOF