webby 0.8.4 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. data/History.txt +19 -0
  2. data/Manifest.txt +104 -91
  3. data/README.txt +27 -45
  4. data/Rakefile +4 -5
  5. data/bin/webby +2 -1
  6. data/bin/webby-gen +8 -0
  7. data/{data/Rakefile → examples/blog/Sitefile} +0 -2
  8. data/examples/{webby → blog}/tasks/blog.rake +5 -4
  9. data/{data → examples/blog}/templates/atom_feed.erb +10 -11
  10. data/{data → examples/blog}/templates/blog/month.erb +1 -1
  11. data/{data → examples/blog}/templates/blog/post.erb +1 -0
  12. data/{data → examples/blog}/templates/blog/year.erb +1 -1
  13. data/examples/presentation/{Rakefile → Sitefile} +0 -4
  14. data/examples/presentation/content/{_sample_code.txt → presentation/_sample_code.txt} +0 -0
  15. data/examples/presentation/content/{index.txt → presentation/index.txt} +0 -0
  16. data/{data/content → examples/presentation/content/presentation}/s5/blank.gif +0 -0
  17. data/{data/content → examples/presentation/content/presentation}/s5/bodybg.gif +0 -0
  18. data/{data/content → examples/presentation/content/presentation}/s5/framing.css +0 -0
  19. data/{data/content → examples/presentation/content/presentation}/s5/iepngfix.htc +0 -0
  20. data/{data/content → examples/presentation/content/presentation}/s5/opera.css +0 -0
  21. data/{data/content → examples/presentation/content/presentation}/s5/outline.css +0 -0
  22. data/{data/content → examples/presentation/content/presentation}/s5/pretty.css +0 -0
  23. data/{data/content → examples/presentation/content/presentation}/s5/print.css +0 -0
  24. data/{data/content → examples/presentation/content/presentation}/s5/s5-core.css +0 -0
  25. data/{data/content → examples/presentation/content/presentation}/s5/slides.css +0 -0
  26. data/{data/content → examples/presentation/content/presentation}/s5/slides.js +0 -0
  27. data/examples/presentation/layouts/{presentation.rhtml → presentation.txt} +3 -3
  28. data/examples/presentation/templates/{_partial.erb → _code_partial.erb} +0 -0
  29. data/examples/tumblog/Sitefile +9 -0
  30. data/examples/tumblog/content/css/tumblog.css +308 -0
  31. data/examples/tumblog/content/images/tumblog/permalink.gif +0 -0
  32. data/examples/tumblog/content/images/tumblog/rss.gif +0 -0
  33. data/examples/tumblog/content/tumblog/200806/the-noble-chicken/index.txt +12 -0
  34. data/examples/tumblog/content/tumblog/200807/historical-perspectives-on-the-classic-chicken-joke/index.txt +12 -0
  35. data/examples/tumblog/content/tumblog/200807/mad-city-chickens/index.txt +10 -0
  36. data/examples/tumblog/content/tumblog/200807/the-wisdom-of-the-dutch/index.txt +11 -0
  37. data/examples/tumblog/content/tumblog/200807/up-a-tree/index.txt +13 -0
  38. data/examples/tumblog/content/tumblog/index.txt +37 -0
  39. data/examples/tumblog/content/tumblog/rss.txt +37 -0
  40. data/examples/tumblog/layouts/tumblog/default.txt +44 -0
  41. data/examples/tumblog/layouts/tumblog/post.txt +15 -0
  42. data/examples/tumblog/lib/tumblog_helper.rb +32 -0
  43. data/examples/tumblog/tasks/tumblog.rake +30 -0
  44. data/examples/tumblog/templates/atom_feed.erb +40 -0
  45. data/examples/tumblog/templates/tumblog/conversation.erb +12 -0
  46. data/examples/tumblog/templates/tumblog/link.erb +10 -0
  47. data/examples/tumblog/templates/tumblog/photo.erb +13 -0
  48. data/examples/tumblog/templates/tumblog/post.erb +12 -0
  49. data/examples/tumblog/templates/tumblog/quote.erb +11 -0
  50. data/examples/webby/{Rakefile → Sitefile} +2 -2
  51. data/examples/webby/content/communicate/index.txt +28 -0
  52. data/examples/webby/content/css/background.gif +0 -0
  53. data/examples/webby/content/css/site.css +52 -20
  54. data/examples/webby/content/index.txt +7 -8
  55. data/examples/webby/content/learn/index.txt +28 -0
  56. data/examples/webby/content/reference/index.txt +3 -1
  57. data/examples/webby/content/release-notes/rel-0-9-0/index.txt +73 -0
  58. data/examples/webby/content/sitemap.txt +31 -0
  59. data/examples/webby/content/tips_and_tricks/index.txt +1 -1
  60. data/examples/webby/content/tutorial/index.txt +17 -17
  61. data/examples/webby/content/{manual → user-manual}/index.txt +53 -50
  62. data/examples/webby/layouts/{default.rhtml → default.txt} +8 -15
  63. data/examples/webby/templates/page.erb +1 -1
  64. data/examples/website/Sitefile +7 -0
  65. data/{data → examples/website}/content/css/blueprint/License.txt +0 -0
  66. data/{data → examples/website}/content/css/blueprint/Readme.txt +0 -0
  67. data/{data → examples/website}/content/css/blueprint/compressed/print.css +0 -0
  68. data/{data → examples/website}/content/css/blueprint/compressed/screen.css +0 -0
  69. data/{data → examples/website}/content/css/blueprint/lib/forms.css +0 -0
  70. data/{data → examples/website}/content/css/blueprint/lib/grid.css +0 -0
  71. data/{data → examples/website}/content/css/blueprint/lib/grid.png +0 -0
  72. data/{data → examples/website}/content/css/blueprint/lib/ie.css +0 -0
  73. data/{data → examples/website}/content/css/blueprint/lib/reset.css +0 -0
  74. data/{data → examples/website}/content/css/blueprint/lib/typography.css +0 -0
  75. data/{data → examples/website}/content/css/blueprint/plugins/buttons/Readme +0 -0
  76. data/{data → examples/website}/content/css/blueprint/plugins/buttons/buttons.css +0 -0
  77. data/{data → examples/website}/content/css/blueprint/plugins/buttons/icons/cross.png +0 -0
  78. data/{data → examples/website}/content/css/blueprint/plugins/buttons/icons/key.png +0 -0
  79. data/{data → examples/website}/content/css/blueprint/plugins/buttons/icons/tick.png +0 -0
  80. data/{data → examples/website}/content/css/blueprint/plugins/css-classes/Readme +0 -0
  81. data/{data → examples/website}/content/css/blueprint/plugins/css-classes/css-classes.css +0 -0
  82. data/{data → examples/website}/content/css/blueprint/plugins/fancy-type/Readme +0 -0
  83. data/{data → examples/website}/content/css/blueprint/plugins/fancy-type/fancy-type-compressed.css +0 -0
  84. data/{data → examples/website}/content/css/blueprint/plugins/fancy-type/fancy-type.css +0 -0
  85. data/{data → examples/website}/content/css/blueprint/print.css +0 -0
  86. data/{data → examples/website}/content/css/blueprint/screen.css +0 -0
  87. data/{data → examples/website}/content/css/coderay.css +0 -0
  88. data/{data → examples/website}/content/css/site.css +0 -0
  89. data/{data → examples/website}/content/index.txt +2 -1
  90. data/{data/layouts/default.rhtml → examples/website/layouts/default.txt} +1 -1
  91. data/{data → examples/website}/lib/breadcrumbs.rb +0 -0
  92. data/{data → examples/website}/templates/_partial.erb +0 -0
  93. data/{data → examples/website}/templates/page.erb +0 -0
  94. data/{data → examples/website}/templates/presentation.erb +0 -0
  95. data/lib/webby/apps/generator.rb +283 -0
  96. data/lib/webby/apps/main.rb +221 -0
  97. data/lib/webby/apps.rb +12 -0
  98. data/lib/webby/builder.rb +8 -10
  99. data/lib/webby/core_ext/enumerable.rb +11 -0
  100. data/lib/webby/{utils.rb → core_ext/hash.rb} +2 -26
  101. data/lib/webby/core_ext/kernel.rb +21 -0
  102. data/lib/webby/core_ext/string.rb +163 -0
  103. data/lib/webby/core_ext/time.rb +9 -0
  104. data/lib/webby/filters/haml.rb +13 -5
  105. data/lib/webby/filters/markdown.rb +12 -4
  106. data/lib/webby/filters/outline.rb +3 -2
  107. data/lib/webby/filters/sass.rb +12 -4
  108. data/lib/webby/filters/textile.rb +12 -4
  109. data/lib/webby/filters/tidy.rb +10 -8
  110. data/lib/webby/filters.rb +2 -0
  111. data/lib/webby/helpers/graphviz_helper.rb +1 -2
  112. data/lib/webby/helpers/tex_img_helper.rb +6 -10
  113. data/lib/webby/renderer.rb +5 -3
  114. data/lib/webby/resources/layout.rb +1 -1
  115. data/lib/webby/resources/page.rb +1 -1
  116. data/lib/webby/resources/resource.rb +13 -3
  117. data/lib/webby/resources.rb +16 -0
  118. data/{data → lib/webby}/tasks/build.rake +0 -0
  119. data/{examples/presentation → lib/webby}/tasks/create.rake +1 -1
  120. data/{data → lib/webby}/tasks/deploy.rake +0 -0
  121. data/{examples → lib}/webby/tasks/growl.rake +4 -1
  122. data/{data → lib/webby}/tasks/heel.rake +0 -0
  123. data/{data → lib/webby}/tasks/validate.rake +0 -0
  124. data/lib/webby.rb +11 -5
  125. data/spec/core_ext/hash_spec.rb +47 -0
  126. data/spec/core_ext/string_spec.rb +110 -0
  127. data/spec/core_ext/time_spec.rb +19 -0
  128. data/spec/webby/apps/generator_spec.rb +111 -0
  129. data/spec/webby/apps/main_spec.rb +75 -0
  130. data/spec/webby/helpers/capture_helper_spec.rb +1 -1
  131. data/spec/webby/resources_spec.rb +17 -0
  132. data/tasks/gem.rake +10 -2
  133. data/tasks/git.rake +41 -0
  134. data/tasks/rubyforge.rake +2 -2
  135. data/tasks/website.rake +38 -38
  136. metadata +125 -98
  137. data/data/tasks/blog.rake +0 -71
  138. data/data/tasks/create.rake +0 -22
  139. data/data/tasks/growl.rake +0 -12
  140. data/data/tasks/setup.rb +0 -17
  141. data/examples/presentation/content/s5/blank.gif +0 -0
  142. data/examples/presentation/content/s5/bodybg.gif +0 -0
  143. data/examples/presentation/content/s5/framing.css +0 -23
  144. data/examples/presentation/content/s5/iepngfix.htc +0 -42
  145. data/examples/presentation/content/s5/opera.css +0 -7
  146. data/examples/presentation/content/s5/outline.css +0 -15
  147. data/examples/presentation/content/s5/pretty.css +0 -86
  148. data/examples/presentation/content/s5/print.css +0 -1
  149. data/examples/presentation/content/s5/s5-core.css +0 -9
  150. data/examples/presentation/content/s5/slides.css +0 -3
  151. data/examples/presentation/content/s5/slides.js +0 -553
  152. data/examples/presentation/tasks/blog.rake +0 -71
  153. data/examples/presentation/tasks/build.rake +0 -27
  154. data/examples/presentation/tasks/deploy.rake +0 -22
  155. data/examples/presentation/tasks/growl.rake +0 -12
  156. data/examples/presentation/tasks/heel.rake +0 -28
  157. data/examples/presentation/tasks/setup.rb +0 -17
  158. data/examples/presentation/tasks/validate.rake +0 -19
  159. data/examples/webby/tasks/build.rake +0 -27
  160. data/examples/webby/tasks/create.rake +0 -22
  161. data/examples/webby/tasks/deploy.rake +0 -22
  162. data/examples/webby/tasks/heel.rake +0 -28
  163. data/examples/webby/tasks/setup.rb +0 -17
  164. data/examples/webby/tasks/validate.rake +0 -19
  165. data/lib/webby/main.rb +0 -227
@@ -97,10 +97,9 @@ module TexImgHelper
97
97
  %x[pdflatex -interaction=batchmode out.tex &> #{dev_null}]
98
98
 
99
99
  convert = "\\( -density #{res} out.pdf -trim +repage \\) "
100
- convert << "\\( +clone -fuzz 100% -fill #{fg} -opaque black \\) "
101
- convert << "+swap -compose copy-opacity -composite "
102
- convert << "\\( +clone -fuzz 100% -fill #{bg} -opaque white +matte \\) "
103
- convert << "+swap -compose over -composite #{out_file}"
100
+ convert << "\\( -clone 0 -negate -background #{fg} -channel A -combine \\) "
101
+ convert << "\\( -clone 0 -background #{bg} -channel A -combine \\) "
102
+ convert << "-delete 0 -compose dst-over -composite #{out_file}"
104
103
  %x[convert #{convert} &> #{dev_null}]
105
104
  ensure
106
105
  Dir.chdir(pwd)
@@ -124,12 +123,9 @@ module TexImgHelper
124
123
  end
125
124
  end # module TexImgHelper
126
125
 
127
- %x[pdflatex --version 2>&1]
128
- if 0 == $?.exitstatus
129
- %x[convert --version 2>&1]
130
- if 0 == $?.exitstatus
131
- register(TexImgHelper)
132
- end
126
+ if cmd_available?(%w[pdflatex --version]) \
127
+ and cmd_available?(%w[convert --help])
128
+ register(TexImgHelper)
133
129
  end
134
130
 
135
131
  end # module Webby::Helpers
@@ -37,9 +37,9 @@ class Renderer
37
37
 
38
38
  loop {
39
39
  ::File.open(page.destination, 'w') do |fd|
40
- fd.write(renderer.__send__(:_layout_page))
40
+ fd.write(renderer._layout_page)
41
41
  end
42
- break unless renderer.__send__(:_next_page)
42
+ break unless renderer._next_page
43
43
  }
44
44
  end
45
45
 
@@ -244,7 +244,7 @@ class Renderer
244
244
  #
245
245
  def _render_layout_for( res )
246
246
  return unless res.layout
247
- lyt = Resources.layouts.find :filename => res.layout
247
+ lyt = Resources.find_layout(res.layout)
248
248
  return if lyt.nil?
249
249
 
250
250
  _track_rendering(lyt.path) {
@@ -267,6 +267,8 @@ class Renderer
267
267
  # go to the next page; break out if there is no next page
268
268
  if @pager.next?
269
269
  @pager = @pager.next
270
+ @_content_for.clear
271
+ @_bindings.clear
270
272
  else
271
273
  @page.number = nil
272
274
  return false
@@ -43,7 +43,7 @@ class Layout < Resource
43
43
  return @mdata['extension'] if @mdata.has_key? 'extension'
44
44
 
45
45
  if @mdata.has_key? 'layout'
46
- lyt = ::Webby::Resources.layouts.find :filename => @mdata['layout']
46
+ lyt = ::Webby::Resources.find_layout(@mdata['layout'])
47
47
  ext = lyt ? lyt.extension : nil
48
48
  end
49
49
  end
@@ -105,7 +105,7 @@ class Page < Resource
105
105
  return @mdata['extension'] if @mdata.has_key? 'extension'
106
106
 
107
107
  if @mdata.has_key? 'layout'
108
- lyt = ::Webby::Resources.layouts.find :filename => @mdata['layout']
108
+ lyt = ::Webby::Resources.find_layout(@mdata['layout'])
109
109
  ext = lyt ? lyt.extension : nil
110
110
  return ext if ext
111
111
  end
@@ -72,10 +72,20 @@ class Resource
72
72
  # resource[key] => value or nil
73
73
  #
74
74
  # Returns the value associated with the given meta-data key. Key is
75
- # usually a string.
75
+ # converted into a string.
76
76
  #
77
77
  def []( key )
78
- @mdata[key]
78
+ @mdata[key.to_s]
79
+ end
80
+
81
+ # call-seq:
82
+ # resource[key] = value
83
+ #
84
+ # Sets the given meta-data key to the value. Key is converted into a
85
+ # string.
86
+ #
87
+ def []=( key, value )
88
+ @mdata[key.to_s] = value
79
89
  end
80
90
 
81
91
  # call-seq:
@@ -111,7 +121,7 @@ class Resource
111
121
  # check to see if the layout is dirty, and if it is then we
112
122
  # are dirty, too
113
123
  if @mdata.has_key? 'layout'
114
- lyt = ::Webby::Resources.layouts.find :filename => @mdata['layout']
124
+ lyt = ::Webby::Resources.find_layout(@mdata['layout'])
115
125
  unless lyt.nil?
116
126
  return true if lyt.dirty?
117
127
  end
@@ -71,6 +71,22 @@ module Webby::Resources
71
71
  filename.sub(%r/\A(?:\.\/|\/)/o, '').freeze
72
72
  end
73
73
 
74
+ # Returns the layout resource corresponding to the given _filename_ or
75
+ # +nil+ if no layout exists under that filename.
76
+ #
77
+ def find_layout( filename )
78
+ return if filename.nil?
79
+
80
+ fn = ::Webby::Resources::File.basename(filename)
81
+ dir = ::File.dirname(filename)
82
+ dir = '.' == dir ? '' : dir
83
+
84
+ layouts.find(:filename => fn, :in_directory => dir)
85
+
86
+ rescue RuntimeError
87
+ raise Webby::Error, "could not find layout #{filename.inspect}"
88
+ end
89
+
74
90
  end # class << self
75
91
 
76
92
  end # module Webby::Resources
File without changes
@@ -10,7 +10,7 @@ namespace :create do
10
10
 
11
11
  desc "Create a new #{name}"
12
12
  task name do |t|
13
- page, title, dir = Webby::Builder.new_page_info(t)
13
+ page, title, dir = Webby::Builder.new_page_info
14
14
  page = Webby::Builder.create(page, :from => template,
15
15
  :locals => {:title => title, :directory => dir})
16
16
  exec(::Webby.editor, page) unless ::Webby.editor.nil?
File without changes
@@ -1,5 +1,6 @@
1
1
 
2
- desc 'Send log events to Growl (Mac OS X only)'
2
+ unless WINDOWS
3
+
3
4
  task :growl do
4
5
  Logging::Logger['Webby'].add_appenders(Logging::Appenders::Growl.new(
5
6
  "Webby",
@@ -9,4 +10,6 @@ task :growl do
9
10
  ))
10
11
  end
11
12
 
13
+ end # unless WINDOWS
14
+
12
15
  # EOF
File without changes
File without changes
data/lib/webby.rb CHANGED
@@ -18,7 +18,7 @@ Logging::Appender.stdout.layout = Logging::Layouts::Pattern.new(
18
18
  module Webby
19
19
 
20
20
  # :stopdoc:
21
- VERSION = '0.8.4' # :nodoc:
21
+ VERSION = '0.9.0' # :nodoc:
22
22
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
23
23
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
24
24
  # :startdoc:
@@ -47,6 +47,7 @@ module Webby
47
47
  :base => nil,
48
48
  :create_mode => 'page',
49
49
  :blog_dir => 'blog',
50
+ :tumblog_dir => 'tumblog',
50
51
 
51
52
  # Items for running the heel webserver
52
53
  :heel_port => 4331,
@@ -159,7 +160,7 @@ module Webby
159
160
  # <tt>File.join</tt>.
160
161
  #
161
162
  def self.libpath( *args )
162
- args.empty? ? LIBPATH : ::File.join(LIBPATH, *args)
163
+ args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
163
164
  end
164
165
 
165
166
  # Returns the path for Webby. If any arguments are given,
@@ -167,7 +168,7 @@ module Webby
167
168
  # <tt>File.join</tt>.
168
169
  #
169
170
  def self.path( *args )
170
- args.empty? ? PATH : ::File.join(PATH, *args)
171
+ args.empty? ? PATH : ::File.join(PATH, args.flatten)
171
172
  end
172
173
 
173
174
  # call-seq:
@@ -201,19 +202,24 @@ end # module Webby
201
202
 
202
203
 
203
204
  # call-seq:
204
- # try_require( library ) => true or false
205
+ # try_require( library, gemname = nil ) => true or false
205
206
  #
206
207
  # Try to laod the given _library_ using the built-in require, but do not
207
208
  # raise a LoadError if unsuccessful. Returns +true+ if the _library_ was
208
209
  # successfully loaded; returns +false+ otherwise.
209
210
  #
210
- def try_require( lib )
211
+ # If a _gemname_ is given, then the "gem gemname" command will be called
212
+ # before the library is loaded.
213
+ #
214
+ def try_require( lib, gemname = nil )
215
+ gem gemname unless gemname.nil?
211
216
  require lib
212
217
  true
213
218
  rescue LoadError
214
219
  false
215
220
  end
216
221
 
222
+ Webby.require_all_libs_relative_to(__FILE__, ::File.join(%w[webby core_ext]))
217
223
  Webby.require_all_libs_relative_to(__FILE__)
218
224
 
219
225
  end # unless defined?
@@ -0,0 +1,47 @@
1
+
2
+ require ::File.expand_path(
3
+ ::File.join(::File.dirname(__FILE__), %w[.. spec_helper]))
4
+
5
+ describe Hash do
6
+
7
+ it "should stringify keys" do
8
+ h = {
9
+ :one => 1,
10
+ :two => 2,
11
+ 3 => 'three',
12
+ [3,4] => :thirty_four
13
+ }.stringify_keys
14
+ h.keys.sort.should == %w[3 34 one two]
15
+ end
16
+
17
+ it "should symbolize keys" do
18
+ h = {
19
+ 'foo' => 42,
20
+ 'bar' => 'baz'
21
+ }.symbolize_keys
22
+
23
+ h.has_key?('foo').should == false
24
+ h.has_key?('bar').should == false
25
+
26
+ h.has_key?(:foo).should == true
27
+ h.has_key?(:bar).should == true
28
+ end
29
+
30
+ describe "when sanitizing values" do
31
+ [
32
+ ['none', nil], ['nil', nil],
33
+ ['true', true], ['yes', true],
34
+ ['false', false], ['no', false]
35
+ ].each do |from, to|
36
+
37
+ it "should convert #{from.inspect} to #{to.inspect}" do
38
+ h = {:key => from}
39
+ h.sanitize!
40
+ h[:key].should == to
41
+ end
42
+ end
43
+ end
44
+
45
+ end
46
+
47
+ # EOF
@@ -0,0 +1,110 @@
1
+
2
+ require ::File.expand_path(
3
+ ::File.join(::File.dirname(__FILE__), %w[.. spec_helper]))
4
+
5
+ describe String do
6
+
7
+ describe "#/" do
8
+ it "should join other strings to form a file path" do
9
+ path = 'foo' / 'bar' / 'baz'
10
+ path.should == ::File.join(%w[foo bar baz])
11
+ end
12
+ end
13
+
14
+ describe "#titlecase" do
15
+ it "should not capitalize small words" do
16
+ 'and on the other hand of fate we have a ring'.titlecase.
17
+ should == 'And on the Other Hand of Fate We Have a Ring'
18
+ end
19
+
20
+ it "should not modify words that contain capital letters other than the first character" do
21
+ 'the iTunes store is down'.titlecase.
22
+ should == 'The iTunes Store Is Down'
23
+ "what's up with the MacUpdate site".titlecase.
24
+ should == "What's Up With the MacUpdate Site"
25
+ end
26
+
27
+ it "should skip words with line dots (example.com or del.icio.us)" do
28
+ 'the website example.com is used in documentation'.titlecase.
29
+ should == 'The Website example.com Is Used in Documentation'
30
+ end
31
+
32
+ it "should always capitlize the first and last words of the title" do
33
+ 'a little bit of'.titlecase.should == 'A Little Bit Of'
34
+ 'iTunes is being released'.titlecase.should == 'iTunes Is Being Released'
35
+ %q("a quoted title if").titlecase.should == %q("A Quoted Title If")
36
+ %q(and if you do via?).titlecase.should == %q(And if You Do Via?)
37
+ end
38
+
39
+ it "should caplitalize a small word after a colon" do
40
+ %q(starting sub-phrase with a small word: a trick, perhaps?).titlecase.
41
+ should == %q(Starting Sub-Phrase With a Small Word: A Trick, Perhaps?)
42
+
43
+ %q(sub-phrase with a small word in quotes: 'a trick, perhaps?').titlecase.
44
+ should == %q(Sub-Phrase With a Small Word in Quotes: 'A Trick, Perhaps?')
45
+
46
+ %q(sub-phrase with a small word in quotes: "a trick, perhaps?").titlecase.
47
+ should == %q(Sub-Phrase With a Small Word in Quotes: "A Trick, Perhaps?")
48
+ end
49
+
50
+ it "should properly handle contractions" do
51
+ %q(this isn't going to work).titlecase.
52
+ should == %q(This Isn't Going to Work)
53
+
54
+ %q(MicroSoft won't go down that route).titlecase.
55
+ should == %q(MicroSoft Won't Go Down That Route)
56
+ end
57
+
58
+ it "should capitalize phrases inside quotations" do
59
+ %q(Q&A with steve jobs: 'that's what happens in technology').titlecase.
60
+ should == %q(Q&A With Steve Jobs: 'That's What Happens in Technology')
61
+ end
62
+
63
+ end
64
+
65
+ describe "#to_url" do
66
+ it "should convert characters to words" do
67
+ given = "10% Inspiration & 90% Perspiration"
68
+ expected = "10-percent-inspiration-and-90-percent-perspiration"
69
+
70
+ given.to_url.should == expected
71
+ end
72
+
73
+ it "should convert entities to words" do
74
+ given = "Tea &amp; crumpets &amp; cr&ecirc;pes for me!"
75
+ expected = "tea-and-crumpets-and-crepes-for-me"
76
+
77
+ given.to_url.should == expected
78
+ end
79
+
80
+ it "should remove html tags" do
81
+ given = "I Am <strong>Awesome</strong>"
82
+ expected = "i-am-awesome"
83
+
84
+ given.to_url.should == expected
85
+ end
86
+
87
+ it "should convert ellipses" do
88
+ given = "The Suspense... Is... Killing Me"
89
+ expected = "the-suspense-dot-dot-dot-is-dot-dot-dot-killing-me"
90
+
91
+ given.to_url.should == expected
92
+ end
93
+
94
+ it "should convert underscores to dashes" do
95
+ given = "How to use attr_accessible and attr_protected"
96
+ expected = "how-to-use-attr-accessible-and-attr-protected"
97
+
98
+ given.to_url.should == expected
99
+ end
100
+
101
+ it "should remove punctuation" do
102
+ given = "I'm just making sure there's nothing wrong with things!"
103
+ expected = "im-just-making-sure-theres-nothing-wrong-with-things"
104
+
105
+ given.to_url.should == expected
106
+ end
107
+ end
108
+ end
109
+
110
+ # EOF
@@ -0,0 +1,19 @@
1
+
2
+ require ::File.expand_path(
3
+ ::File.join(::File.dirname(__FILE__), %w[.. spec_helper]))
4
+
5
+ describe Time do
6
+
7
+ it "should serialize to a YAML string" do
8
+ now = Time.now
9
+
10
+ utc_offset = now.utc_offset / 3600
11
+ sign, utc_offset = utc_offset < 0 ? ['-', -utc_offset] : ['', utc_offset]
12
+ str = "%s.%06d %s%02d:00" %
13
+ [now.strftime('%Y-%m-%d %H:%M:%S'), now.usec, sign, utc_offset]
14
+
15
+ now.to_y.should == str
16
+ end
17
+ end
18
+
19
+ # EOF
@@ -0,0 +1,111 @@
1
+
2
+ require ::File.expand_path(
3
+ ::File.join(::File.dirname(__FILE__), %w[.. .. spec_helper]))
4
+ require 'stringio'
5
+
6
+ describe Webby::Apps::Generator do
7
+
8
+ before :each do
9
+ @generator = Webby::Apps::Generator.new
10
+ end
11
+
12
+ it "should return a list of available templates" do
13
+ ary = %w[blog presentation tumblog webby website].map {|t| Webby.path('examples', t)}
14
+ @generator.templates.should == ary
15
+ end
16
+
17
+ it "should pretend to create a site" do
18
+ @generator.parse %w[-p website foo]
19
+ @generator.pretend?.should == true
20
+
21
+ @generator = Webby::Apps::Generator.new
22
+ @generator.parse %w[website foo]
23
+ @generator.pretend?.should == false
24
+
25
+ @generator = Webby::Apps::Generator.new
26
+ @generator.parse %w[--pretend website foo]
27
+ @generator.pretend?.should == true
28
+ end
29
+
30
+ it "should return a list of all the site files from the template" do
31
+ @generator.parse %w[website foo]
32
+
33
+ h = @generator.site_files
34
+ h.keys.sort.should == [
35
+ "",
36
+ "content",
37
+ "content/css",
38
+ "content/css/blueprint",
39
+ "content/css/blueprint/compressed",
40
+ "content/css/blueprint/lib",
41
+ "content/css/blueprint/plugins",
42
+ "content/css/blueprint/plugins/buttons",
43
+ "content/css/blueprint/plugins/buttons/icons",
44
+ "content/css/blueprint/plugins/css-classes",
45
+ "content/css/blueprint/plugins/fancy-type",
46
+ "layouts",
47
+ "lib",
48
+ "templates"
49
+ ]
50
+ h["content"].should == %w[content/index.txt]
51
+ h["layouts"].should == %w[layouts/default.txt]
52
+ end
53
+
54
+ describe "when parsing command line arguments" do
55
+
56
+ before :each do
57
+ @strio = StringIO.new
58
+ @generator = Webby::Apps::Generator.new
59
+ @generator.instance_variable_set(:@stdout, @strio)
60
+
61
+ class << @strio
62
+ def to_s
63
+ seek 0
64
+ str = read
65
+ truncate 0
66
+ return str
67
+ end
68
+ end
69
+ end
70
+
71
+ it "should force the overwriting of files on collision" do
72
+ @generator.options[:collision].should be_nil
73
+ @generator.parse %w[-f website foo]
74
+ @generator.options[:collision].should == :force
75
+ end
76
+
77
+ it "should skip files on collision" do
78
+ @generator.options[:collision].should be_nil
79
+ @generator.parse %w[-s website foo]
80
+ @generator.options[:collision].should == :skip
81
+ end
82
+
83
+ it "should update only the rake files in the tasks folder" do
84
+ @generator.options[:update].should be_nil
85
+ @generator.parse %w[-u website foo]
86
+ @generator.options[:update].should == true
87
+ end
88
+
89
+ it "should pretend to generate / alter files" do
90
+ @generator.options[:pretend].should be_nil
91
+ @generator.parse %w[-p website foo]
92
+ @generator.options[:pretend].should == true
93
+ end
94
+
95
+ it "should exit if a site is not specified" do
96
+ lambda{@generator.parse %w[website]}.
97
+ should raise_error(SystemExit, 'exit')
98
+ @strio.to_s.split("\n").first.
99
+ should == 'Usage: webby-gen [options] template site'
100
+ end
101
+
102
+ it "should exit if an unknown template is given" do
103
+ lambda{@generator.parse %w[foo bar]}.
104
+ should raise_error(SystemExit, 'exit')
105
+ @strio.to_s.split("\n").last.
106
+ should == " Could not find template 'foo'"
107
+ end
108
+ end
109
+ end
110
+
111
+ # EOF
@@ -0,0 +1,75 @@
1
+
2
+ require ::File.expand_path(
3
+ ::File.join(::File.dirname(__FILE__), %w[.. .. spec_helper]))
4
+
5
+ # ---------------------------------------------------------------------------
6
+ describe Webby::Apps::Main do
7
+ before do
8
+ @main = Webby::Apps::Main.new
9
+ end
10
+
11
+ describe ".capture_command_line_args" do
12
+ it "should set the raw arguments" do
13
+ raw = ["The Raw Arguments"]
14
+ args = @main.capture_command_line_args(raw)
15
+ args.raw.should == raw
16
+ end
17
+
18
+ it "should set the page with one argument by downcasing" do
19
+ page = "This-is-a-page"
20
+ args = @main.capture_command_line_args([page])
21
+ args.page.should == page.downcase
22
+ end
23
+
24
+ it "should set the page with two or more arguments by joining" do
25
+ page = %w(this is a page)
26
+ args = @main.capture_command_line_args(page)
27
+ args.page.should == page.join('-')
28
+ end
29
+
30
+ it "should set the dir from the page's dirname" do
31
+ page = "foo/bar/this-is-a-page.txt"
32
+ args = @main.capture_command_line_args([page])
33
+ args.dir.should == "foo/bar"
34
+ end
35
+
36
+ it "should set the slug from the page's basename" do
37
+ page = "foo/bar/this-is-a-page.txt"
38
+ args = @main.capture_command_line_args([page])
39
+ args.slug.should == "this-is-a-page"
40
+ end
41
+
42
+ it "should turn the slug into a url" do
43
+ page = "10% Inspiration & 90% Perspiration"
44
+ args = @main.capture_command_line_args([page])
45
+ args.slug.should == "10-percent-inspiration-and-90-percent-perspiration"
46
+ end
47
+
48
+ it "should set the page by combining the dir and slug" do
49
+ page = "10% Inspiration & 90% Perspiration"
50
+ args = @main.capture_command_line_args([page])
51
+ args.page.should == "10-percent-inspiration-and-90-percent-perspiration"
52
+
53
+ page = "foo/bar/10% Inspiration & 90% Perspiration"
54
+ args = @main.capture_command_line_args([page])
55
+ args.page.should == "foo/bar/10-percent-inspiration-and-90-percent-perspiration"
56
+ end
57
+
58
+ # TODO: Is this desired behavior?
59
+ it "should set the title by joining the raw args, getting the basename, and titlecasing" do
60
+ page = "foo/bar/this-is-a-page.txt"
61
+ args = @main.capture_command_line_args([page])
62
+ args.title.should == "This-Is-a-Page"
63
+ end
64
+ end
65
+
66
+ describe ".parse" do
67
+ it "should pass environment variables to the rake application" do
68
+ ARGV = ary = []
69
+ args = %w[rebuild foo BASE=http://www.example.com bar]
70
+ @main.parse args
71
+ ary.should == %w[rebuild BASE=http://www.example.com]
72
+ args.should == %w[foo bar]
73
+ end
74
+ end
75
+ end
@@ -23,7 +23,7 @@ describe Webby::Helpers::CaptureHelper do
23
23
  before :each do
24
24
  @renderman = Webby::Renderer.new(
25
25
  Webby::Resources::Page.new(CFN))
26
- @page_content = @renderman.render_page
26
+ @page_content = @renderman._render_page
27
27
  end
28
28
 
29
29
  after :all do
@@ -0,0 +1,17 @@
1
+
2
+
3
+ require ::File.join(::File.dirname(__FILE__), %w[.. spec_helper])
4
+
5
+ # ---------------------------------------------------------------------------
6
+ describe Webby::Resources do
7
+ it "should raise a useful error if there are no layouts" do
8
+ layouts = mock("Layouts")
9
+ Webby::Resources.stub!(:layouts).and_return(layouts)
10
+ layouts.should_receive(:find).and_raise RuntimeError
11
+
12
+ lambda do
13
+ Webby::Resources.find_layout("default")
14
+ end.should raise_error(Webby::Error, 'could not find layout "default"')
15
+
16
+ end
17
+ end
data/tasks/gem.rake CHANGED
@@ -91,8 +91,11 @@ namespace :gem do
91
91
  end
92
92
 
93
93
  desc 'Install the gem'
94
- task :install => [:clobber, :package] do
95
- sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
94
+ task :install => [:clobber, 'gem:package'] do
95
+ sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
96
+
97
+ # use this version of the command for rubygems > 1.0.0
98
+ #sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
96
99
  end
97
100
 
98
101
  desc 'Uninstall the gem'
@@ -106,6 +109,11 @@ namespace :gem do
106
109
  desc 'Reinstall the gem'
107
110
  task :reinstall => [:uninstall, :install]
108
111
 
112
+ desc 'Cleanup the gem'
113
+ task :cleanup do
114
+ sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
115
+ end
116
+
109
117
  end # namespace :gem
110
118
 
111
119
  desc 'Alias to gem:package'