webby 0.7.1 → 0.7.2

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 (73) hide show
  1. data/History.txt +15 -0
  2. data/Manifest.txt +21 -15
  3. data/Rakefile +4 -2
  4. data/data/content/css/blueprint/compressed/print.css +76 -0
  5. data/data/content/css/blueprint/compressed/screen.css +696 -0
  6. data/data/content/css/blueprint/lib/forms.css +45 -0
  7. data/data/content/css/blueprint/lib/grid.css +95 -51
  8. data/data/content/css/blueprint/lib/grid.png +0 -0
  9. data/data/content/css/blueprint/lib/ie.css +30 -0
  10. data/data/content/css/blueprint/lib/reset.css +11 -12
  11. data/data/content/css/blueprint/lib/typography.css +69 -114
  12. data/data/content/css/blueprint/plugins/buttons/Readme +31 -0
  13. data/data/content/css/blueprint/{lib → plugins/buttons}/buttons.css +17 -32
  14. data/data/content/css/blueprint/{lib/img → plugins/buttons}/icons/cross.png +0 -0
  15. data/data/content/css/blueprint/{lib/img/icons/textfield_key.png → plugins/buttons/icons/key.png} +0 -0
  16. data/data/content/css/blueprint/{lib/img → plugins/buttons}/icons/tick.png +0 -0
  17. data/data/content/css/blueprint/plugins/css-classes/Readme +14 -0
  18. data/data/content/css/blueprint/plugins/css-classes/css-classes.css +24 -0
  19. data/data/content/css/blueprint/plugins/fancy-type/Readme +22 -0
  20. data/data/content/css/blueprint/plugins/fancy-type/fancy-type-compressed.css +5 -0
  21. data/data/content/css/blueprint/plugins/fancy-type/fancy-type.css +74 -0
  22. data/data/content/css/blueprint/print.css +35 -46
  23. data/data/content/css/blueprint/screen.css +10 -18
  24. data/data/content/css/site.css +8 -0
  25. data/data/content/index.txt +2 -2
  26. data/data/layouts/default.rhtml +4 -4
  27. data/data/templates/page.erb +3 -3
  28. data/examples/webby/content/css/blueprint/print.css +58 -61
  29. data/examples/webby/content/css/blueprint/screen.css +696 -30
  30. data/examples/webby/content/css/site.css +63 -45
  31. data/examples/webby/content/index.txt +2 -2
  32. data/examples/webby/content/manual.txt +366 -15
  33. data/examples/webby/content/script/jquery.corner.js +152 -0
  34. data/examples/webby/content/script/jquery.js +31 -0
  35. data/examples/webby/content/tips_and_tricks.txt +2 -2
  36. data/examples/webby/content/tutorial.txt +5 -5
  37. data/examples/webby/layouts/default.rhtml +19 -10
  38. data/examples/webby/templates/page.erb +5 -3
  39. data/lib/webby.rb +25 -3
  40. data/lib/webby/filters/basepath.rb +97 -0
  41. data/lib/webby/filters/coderay.rb +2 -2
  42. data/lib/webby/filters/graphviz.rb +10 -10
  43. data/lib/webby/filters/haml.rb +3 -7
  44. data/lib/webby/filters/outline.rb +194 -0
  45. data/lib/webby/helpers/tag_helper.rb +14 -13
  46. data/lib/webby/helpers/url_helper.rb +84 -13
  47. data/lib/webby/pages_db.rb +15 -8
  48. data/lib/webby/renderer.rb +2 -2
  49. data/lib/webby/resource.rb +6 -6
  50. data/lib/webby/utils.rb +17 -1
  51. data/lib/webby/webby_task.rb +20 -7
  52. data/tasks/annotations.rake +1 -1
  53. data/tasks/doc.rake +2 -2
  54. data/tasks/gem.rake +3 -3
  55. data/tasks/manifest.rake +5 -2
  56. data/tasks/post_load.rake +18 -0
  57. data/tasks/rubyforge.rake +1 -1
  58. data/tasks/setup.rb +56 -11
  59. data/tasks/spec.rake +4 -1
  60. data/tasks/svn.rake +44 -0
  61. data/tasks/website.rake +2 -2
  62. metadata +33 -18
  63. data/data/content/css/blueprint/lib/compressed.css +0 -137
  64. data/data/content/css/blueprint/lib/img/grid.png +0 -0
  65. data/examples/webby/content/css/blueprint/lib/buttons.css +0 -112
  66. data/examples/webby/content/css/blueprint/lib/compressed.css +0 -137
  67. data/examples/webby/content/css/blueprint/lib/grid.css +0 -149
  68. data/examples/webby/content/css/blueprint/lib/img/grid.png +0 -0
  69. data/examples/webby/content/css/blueprint/lib/img/icons/cross.png +0 -0
  70. data/examples/webby/content/css/blueprint/lib/img/icons/textfield_key.png +0 -0
  71. data/examples/webby/content/css/blueprint/lib/img/icons/tick.png +0 -0
  72. data/examples/webby/content/css/blueprint/lib/reset.css +0 -40
  73. data/examples/webby/content/css/blueprint/lib/typography.css +0 -161
@@ -1,4 +1,4 @@
1
- # $Id: pages_db.rb 67 2007-12-09 00:49:26Z tim_pease $
1
+ # $Id: pages_db.rb 119 2008-01-29 04:26:27Z wbruce $
2
2
 
3
3
  module Webby
4
4
 
@@ -98,9 +98,17 @@ class PagesDB
98
98
  opts = Hash === args.last ? args.pop : {}
99
99
  find_all = args.include? :all
100
100
 
101
- dir = opts.has_key?(:in_directory) ? opts.delete(:in_directory) : nil
102
- if dir && !@db.has_key?(dir)
103
- raise RuntimeError, "unknown directory '#{dir}'"
101
+ search = if (dir = opts.delete(:in_directory))
102
+ strategy = if opts.delete(:recursive)
103
+ lambda { |key| key =~ /^#{Regexp.escape(dir)}(?:\/|$)/ }
104
+ else
105
+ lambda { |key| key == dir }
106
+ end
107
+ matching_keys = @db.keys.select(&strategy)
108
+ raise RuntimeError, "unknown directory '#{dir}'" if matching_keys.empty?
109
+ matching_keys.map { |key| @db[key] }.flatten
110
+ else
111
+ self
104
112
  end
105
113
 
106
114
  block ||= lambda do |page|
@@ -111,18 +119,17 @@ class PagesDB
111
119
  end
112
120
  found
113
121
  end
114
-
122
+
115
123
  ary = []
116
- search = dir ? @db[dir] : self
117
124
  search.each do |page|
118
125
  if block.call(page)
119
126
  ary << page
120
127
  break unless find_all
121
128
  end
122
129
  end
123
-
130
+
124
131
  return ary if find_all
125
- return ary.first
132
+ return ary.first
126
133
  end
127
134
 
128
135
  # call-seq:
@@ -1,4 +1,4 @@
1
- # $Id: renderer.rb 68 2007-12-09 07:45:37Z tim_pease $
1
+ # $Id: renderer.rb 112 2008-01-26 05:31:48Z tim_pease $
2
2
 
3
3
  require 'erb'
4
4
  try_require 'bluecloth'
@@ -110,7 +110,7 @@ class Renderer
110
110
  # continues until all _items_ have been paginated.
111
111
  #
112
112
  # Calling this method creates a <code>@pager</code> object that can be
113
- # accessed from the _page_. The <code>@pager</code> contains information
113
+ # accessed from the page. The <code>@pager</code> contains information
114
114
  # about the next page, the current page number, the previous page, and the
115
115
  # number of items in the current page.
116
116
  #
@@ -1,4 +1,4 @@
1
- # $Id: resource.rb 91 2008-01-03 18:24:52Z tim_pease $
1
+ # $Id: resource.rb 102 2008-01-19 23:13:55Z tim_pease $
2
2
 
3
3
  module Webby
4
4
 
@@ -121,7 +121,7 @@ class Resource
121
121
  # filename. The extension is determined by looking at the following:
122
122
  #
123
123
  # * this resource's meta-data for an 'extension' property
124
- # * the meta-data of this resource's layout for an 'extension' propery
124
+ # * the meta-data of this resource's layout for an 'extension' property
125
125
  # * the extension of this resource file
126
126
  #
127
127
  def extension
@@ -144,16 +144,16 @@ class Resource
144
144
  # resource is dirty and in need of rendering.
145
145
  #
146
146
  # The destination for any resource can be overridden by explicitly setting
147
- # the 'destination' propery in the resource's meta-data.
147
+ # the 'destination' property in the resource's meta-data.
148
148
  #
149
149
  def destination
150
150
  return @dest if defined? @dest and @dest
151
151
  return @dest = ::Webby.cairn if is_layout?
152
152
 
153
153
  @dest = if @mdata.has_key? 'destination' then @mdata['destination']
154
- else File.join(dir, filename) end
154
+ else ::File.join(dir, filename) end
155
155
 
156
- @dest = File.join(::Webby.site.output_dir, @dest)
156
+ @dest = ::File.join(::Webby.site.output_dir, @dest)
157
157
  @dest << @number.to_s if @number
158
158
 
159
159
  ext = extension
@@ -259,7 +259,7 @@ class Resource
259
259
 
260
260
  # if this file's mtime is larger than the destination file's
261
261
  # mtime, then we are dirty
262
- dirty = @mtime > File.mtime(destination)
262
+ dirty = @mtime > ::File.mtime(destination)
263
263
  return dirty if is_static? or dirty
264
264
 
265
265
  # check to see if the layout is dirty, and it it is then we
@@ -1,4 +1,4 @@
1
- # $Id: utils.rb 67 2007-12-09 00:49:26Z tim_pease $
1
+ # $Id: utils.rb 121 2008-01-29 04:55:28Z tim_pease $
2
2
 
3
3
  module Enumerable
4
4
  def injecting( initial )
@@ -33,4 +33,20 @@ class Hash
33
33
  end
34
34
  end
35
35
 
36
+ class String
37
+ def underscore
38
+ self.
39
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
40
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
41
+ tr(" -", "__").
42
+ downcase
43
+ end
44
+ end
45
+
46
+ class Time
47
+ def to_y
48
+ self.to_yaml.slice(4..-1).strip
49
+ end
50
+ end
51
+
36
52
  # EOF
@@ -1,4 +1,4 @@
1
- # $Id: webby_task.rb 86 2008-01-01 22:14:55Z tim_pease $
1
+ # $Id: webby_task.rb 106 2008-01-25 04:58:49Z tim_pease $
2
2
 
3
3
  begin
4
4
  require 'rake'
@@ -43,7 +43,7 @@ class WebbyTask < TaskLib
43
43
  yield self if block_given?
44
44
 
45
45
  # load any user defined libraries
46
- glob = File.join(FileUtils.pwd, 'lib', '**', '*.rb')
46
+ glob = ::File.join(FileUtils.pwd, 'lib', '**', '*.rb')
47
47
  Dir.glob(glob).sort.each {|fn| require fn}
48
48
 
49
49
  # create the Webby rake tasks
@@ -54,18 +54,22 @@ class WebbyTask < TaskLib
54
54
  # Defines the :build and :rebuild tasks
55
55
  #
56
56
  def define_build_tasks
57
+ task :configure_basepath do
58
+ ::Webby.site.base = ENV['BASE'] if ENV.has_key?('BASE')
59
+ end
60
+
57
61
  desc "build the website"
58
- task :build do |t|
62
+ task :build => :configure_basepath do |t|
59
63
  ::Webby::Builder.run
60
64
  end
61
65
 
62
66
  desc "rebuild the website"
63
- task :rebuild do |t|
67
+ task :rebuild => :configure_basepath do |t|
64
68
  ::Webby::Builder.run :rebuild => true
65
69
  end
66
70
 
67
71
  desc "continuously build the website"
68
- task :autobuild do |t|
72
+ task :autobuild => :configure_basepath do |t|
69
73
  ::Webby::AutoBuilder.run
70
74
  end
71
75
 
@@ -88,8 +92,17 @@ class WebbyTask < TaskLib
88
92
  raise "Usage: rake #{t.name} path" unless ARGV.length == 2
89
93
 
90
94
  page = t.application.top_level_tasks.pop
91
- page = File.join(::Webby.site.content_dir, page)
92
- page << '.txt' if File.extname(page).empty?
95
+ name = ::Webby::File.basename(page)
96
+ ext = ::Webby::File.extname(page)
97
+ dir = ::Webby::File.dirname(page)
98
+
99
+ if ::Webby.site.create_mode == 'directory'
100
+ page = ::File.join(::Webby.site.content_dir, name, 'index')
101
+ page << '.' << (ext.empty? ? 'txt' : ext)
102
+ else
103
+ page = ::File.join(::Webby.site.content_dir, page)
104
+ page << '.txt' if ext.empty?
105
+ end
93
106
 
94
107
  ::Webby::Builder.create page, :from => template
95
108
  end # task
@@ -1,4 +1,4 @@
1
- # $Id: annotations.rake 85 2008-01-01 20:37:31Z tim_pease $
1
+ # $Id$
2
2
 
3
3
  if HAVE_BONES
4
4
 
@@ -1,4 +1,4 @@
1
- # $Id: doc.rake 85 2008-01-01 20:37:31Z tim_pease $
1
+ # $Id$
2
2
 
3
3
  require 'rake/rdoctask'
4
4
 
@@ -7,7 +7,6 @@ namespace :doc do
7
7
  desc 'Generate RDoc documentation'
8
8
  Rake::RDocTask.new do |rd|
9
9
  rd.main = PROJ.rdoc_main
10
- rd.options << '-d' if !WIN32 and `which dot` =~ %r/\/dot/
11
10
  rd.rdoc_dir = PROJ.rdoc_dir
12
11
 
13
12
  incl = Regexp.new(PROJ.rdoc_include.join('|'))
@@ -24,6 +23,7 @@ namespace :doc do
24
23
  title = "#{PROJ.rubyforge_name}'s " + title if PROJ.rubyforge_name != title
25
24
 
26
25
  rd.options << "-t #{title}"
26
+ rd.options.concat(PROJ.rdoc_opts)
27
27
  end
28
28
 
29
29
  desc 'Generate ri locally for testing'
@@ -1,4 +1,4 @@
1
- # $Id: gem.rake 85 2008-01-01 20:37:31Z tim_pease $
1
+ # $Id$
2
2
 
3
3
  require 'rake/gempackagetask'
4
4
 
@@ -69,12 +69,12 @@ namespace :gem do
69
69
 
70
70
  desc 'Install the gem'
71
71
  task :install => [:clobber, :package] do
72
- sh "#{SUDO} #{GEM} install pkg/#{PROJ.spec.file_name}"
72
+ sh "#{SUDO} #{GEM} install pkg/#{PROJ.spec.full_name}"
73
73
  end
74
74
 
75
75
  desc 'Uninstall the gem'
76
76
  task :uninstall do
77
- sh "#{SUDO} #{GEM} uninstall -v '#{PROJ.version}' #{PROJ.name}"
77
+ sh "#{SUDO} #{GEM} uninstall -v '#{PROJ.version}' -x #{PROJ.name}"
78
78
  end
79
79
 
80
80
  end # namespace :gem
@@ -1,4 +1,4 @@
1
- # $Id: manifest.rake 85 2008-01-01 20:37:31Z tim_pease $
1
+ # $Id$
2
2
 
3
3
  require 'find'
4
4
 
@@ -36,6 +36,9 @@ namespace :manifest do
36
36
  files << fn unless test ?f, fn
37
37
  File.open(fn, 'w') {|fp| fp.puts files.sort}
38
38
  end
39
- end
39
+ end # namespace :manifest
40
+
41
+ desc 'Alias to manifest:check'
42
+ task :manifest => 'manifest:check'
40
43
 
41
44
  # EOF
@@ -0,0 +1,18 @@
1
+ # $Id$
2
+
3
+ # This file does not define any rake tasks. It is used to load some project
4
+ # settings if they are not defined by the user.
5
+
6
+ unless PROJ.changes
7
+ PROJ.changes = paragraphs_of('History.txt', 0..1).join("\n\n")
8
+ end
9
+
10
+ unless PROJ.description
11
+ PROJ.description = paragraphs_of('README.txt', 'description').join("\n\n")
12
+ end
13
+
14
+ unless PROJ.summary
15
+ PROJ.summary = PROJ.description.split('.').first
16
+ end
17
+
18
+ # EOF
@@ -45,7 +45,7 @@ namespace :doc do
45
45
 
46
46
  host = "#{config['username']}@rubyforge.org"
47
47
  remote_dir = "/var/www/gforge-projects/#{PROJ.rubyforge_name}/"
48
- remote_dir << PROJ.rdoc_remote_dir || PROJ.name
48
+ remote_dir << PROJ.rdoc_remote_dir if PROJ.rdoc_remote_dir
49
49
  local_dir = PROJ.rdoc_dir
50
50
 
51
51
  Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
@@ -1,4 +1,4 @@
1
- # $Id: setup.rb 85 2008-01-01 20:37:31Z tim_pease $
1
+ # $Id$
2
2
 
3
3
  require 'rubygems'
4
4
  require 'rake'
@@ -16,7 +16,7 @@ PROJ.email = nil
16
16
  PROJ.url = nil
17
17
  PROJ.version = ENV['VERSION'] || '0.0.0'
18
18
  PROJ.rubyforge_name = nil
19
- PROJ.exclude = %w(tmp$ bak$ ~$ CVS \.svn ^pkg ^doc)
19
+ PROJ.exclude = %w(tmp$ bak$ ~$ CVS .svn/ ^pkg/ ^doc/)
20
20
 
21
21
  # Rspec
22
22
  PROJ.specs = FileList['spec/**/*_spec.rb']
@@ -32,8 +32,8 @@ PROJ.rcov_opts = ['--sort', 'coverage', '-T']
32
32
 
33
33
  # Rdoc
34
34
  PROJ.rdoc_opts = []
35
- PROJ.rdoc_include = %w(^lib ^bin ^ext txt$)
36
- PROJ.rdoc_exclude = %w(extconf\.rb$ ^Manifest\.txt$)
35
+ PROJ.rdoc_include = %w(^lib/ ^bin/ ^ext/ .txt$)
36
+ PROJ.rdoc_exclude = %w(extconf.rb$ ^Manifest.txt$)
37
37
  PROJ.rdoc_main = 'README.txt'
38
38
  PROJ.rdoc_dir = 'doc'
39
39
  PROJ.rdoc_remote_dir = nil
@@ -60,8 +60,17 @@ PROJ.need_zip = false
60
60
  PROJ.annotation_exclude = []
61
61
  PROJ.annotation_extensions = %w(.txt .rb .erb) << ''
62
62
 
63
+ # Subversion Repository
64
+ PROJ.svn = false
65
+ PROJ.svn_root = nil
66
+ PROJ.svn_trunk = 'trunk'
67
+ PROJ.svn_tags = 'tags'
68
+ PROJ.svn_branches = 'branches'
69
+
63
70
  # Load the other rake files in the tasks folder
64
- Dir.glob('tasks/*.rake').sort.each {|fn| import fn}
71
+ rakefiles = Dir.glob('tasks/*.rake').sort
72
+ rakefiles.unshift(rakefiles.delete('tasks/post_load.rake')).compact!
73
+ import(*rakefiles)
65
74
 
66
75
  # Setup some constants
67
76
  WIN32 = %r/win32/ =~ RUBY_PLATFORM unless defined? WIN32
@@ -108,8 +117,28 @@ end
108
117
  # changes = paragraphs_of('History.txt', 0..1).join("\n\n")
109
118
  # summary, *description = paragraphs_of('README.txt', 3, 3..8)
110
119
  #
111
- def paragraphs_of(path, *paragraphs)
112
- File.read(path).delete("\r").split(/\n\n+/).values_at(*paragraphs)
120
+ def paragraphs_of( path, *paragraphs )
121
+ title = String === paragraphs.first ? paragraphs.shift : nil
122
+ ary = File.read(path).delete("\r").split(/\n\n+/)
123
+
124
+ result = if title
125
+ tmp, matching = [], false
126
+ rgxp = %r/^=+\s*#{Regexp.escape(title)}/i
127
+ paragraphs << (0..-1) if paragraphs.empty?
128
+
129
+ ary.each do |val|
130
+ if val =~ rgxp
131
+ break if matching
132
+ matching = true
133
+ rgxp = %r/^=+/i
134
+ elsif matching
135
+ tmp << val
136
+ end
137
+ end
138
+ tmp
139
+ else ary end
140
+
141
+ result.values_at(*paragraphs)
113
142
  end
114
143
 
115
144
  # Adds the given gem _name_ to the current project's dependency list. An
@@ -123,11 +152,13 @@ def depend_on( name, version = nil )
123
152
  PROJ.dependencies << (version.nil? ? [name] : [name, ">= #{version}"])
124
153
  end
125
154
 
126
- # Adds the given _path_ to the include path if it is not already there
155
+ # Adds the given arguments to the include path if they are not already there
127
156
  #
128
- def ensure_in_path( path )
129
- path = File.expand_path(path)
130
- $:.unshift(path) if test(?d, path) and not $:.include?(path)
157
+ def ensure_in_path( *args )
158
+ args.each do |path|
159
+ path = File.expand_path(path)
160
+ $:.unshift(path) if test(?d, path) and not $:.include?(path)
161
+ end
131
162
  end
132
163
 
133
164
  # Find a rake task using the task name and remove any description text. This
@@ -141,4 +172,18 @@ def remove_desc_for_task( names )
141
172
  end
142
173
  end
143
174
 
175
+ # Change working directories to _dir_, call the _block_ of code, and then
176
+ # change back to the original working directory (the current directory when
177
+ # this method was called).
178
+ #
179
+ def in_directory( dir, &block )
180
+ curdir = pwd
181
+ begin
182
+ cd dir
183
+ return block.call
184
+ ensure
185
+ cd curdir
186
+ end
187
+ end
188
+
144
189
  # EOF
@@ -1,4 +1,4 @@
1
- # $Id: spec.rake 85 2008-01-01 20:37:31Z tim_pease $
1
+ # $Id$
2
2
 
3
3
  if HAVE_SPEC_RAKE_SPECTASK
4
4
 
@@ -8,12 +8,14 @@ namespace :spec do
8
8
  Spec::Rake::SpecTask.new(:run) do |t|
9
9
  t.spec_opts = PROJ.spec_opts
10
10
  t.spec_files = PROJ.specs
11
+ t.libs += PROJ.libs
11
12
  end
12
13
 
13
14
  desc 'Run all specs with text output'
14
15
  Spec::Rake::SpecTask.new(:specdoc) do |t|
15
16
  t.spec_opts = PROJ.spec_opts + ['--format', 'specdoc']
16
17
  t.spec_files = PROJ.specs
18
+ t.libs += PROJ.libs
17
19
  end
18
20
 
19
21
  if HAVE_RCOV
@@ -21,6 +23,7 @@ namespace :spec do
21
23
  Spec::Rake::SpecTask.new(:rcov) do |t|
22
24
  t.spec_opts = PROJ.spec_opts
23
25
  t.spec_files = PROJ.specs
26
+ t.libs += PROJ.libs
24
27
  t.rcov = true
25
28
  t.rcov_opts = PROJ.rcov_opts + ['--exclude', 'spec']
26
29
  end
@@ -0,0 +1,44 @@
1
+ # $Id$
2
+
3
+
4
+ if PROJ.svn and system("svn --version 2>&1 > #{DEV_NULL}")
5
+
6
+ unless PROJ.svn_root
7
+ info = %x/svn info ./
8
+ m = %r/^Repository Root:\s+(.*)$/.match(info)
9
+ PROJ.svn_root = (m.nil? ? '' : m[1])
10
+ end
11
+ PROJ.svn_root = File.join(PROJ.svn_root, PROJ.svn) if String === PROJ.svn
12
+
13
+ namespace :svn do
14
+
15
+ desc 'Show tags from the SVN repository'
16
+ task :show_tags do |t|
17
+ tags = %x/svn list #{File.join(PROJ.svn_root, PROJ.svn_tags)}/
18
+ tags.gsub!(%r/\/$/, '')
19
+ puts tags
20
+ end
21
+
22
+ desc 'Create a new tag in the SVN repository'
23
+ task :create_tag do |t|
24
+ v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
25
+ abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
26
+
27
+ trunk = File.join(PROJ.svn_root, PROJ.svn_trunk)
28
+ tag = "%s-%s" % [PROJ.name, PROJ.version]
29
+ tag = File.join(PROJ.svn_root, PROJ.svn_tags, tag)
30
+ msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
31
+
32
+ puts "Creating SVN tag '#{tag}'"
33
+ unless system "svn cp -m '#{msg}' #{trunk} #{tag}"
34
+ abort "Tag creation failed"
35
+ end
36
+ end
37
+
38
+ end # namespace :svn
39
+
40
+ task 'gem:release' => 'svn:create_tag'
41
+
42
+ end # if PROJ.svn
43
+
44
+ # EOF