mcornick-jeweler 1.2.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 (130) hide show
  1. data/.gitignore +9 -0
  2. data/ChangeLog.markdown +111 -0
  3. data/LICENSE +20 -0
  4. data/README.markdown +185 -0
  5. data/ROADMAP +12 -0
  6. data/Rakefile +103 -0
  7. data/VERSION.yml +4 -0
  8. data/bin/jeweler +8 -0
  9. data/features/generator/cucumber.feature +83 -0
  10. data/features/generator/directory_layout.feature +76 -0
  11. data/features/generator/dotdocument.feature +14 -0
  12. data/features/generator/env_options.feature +9 -0
  13. data/features/generator/git.feature +94 -0
  14. data/features/generator/license.feature +11 -0
  15. data/features/generator/rakefile.feature +151 -0
  16. data/features/generator/readme.feature +12 -0
  17. data/features/generator/test.feature +41 -0
  18. data/features/generator/test_helper.feature +49 -0
  19. data/features/placeholder.feature +5 -0
  20. data/features/step_definitions/debug_steps.rb +6 -0
  21. data/features/step_definitions/filesystem_steps.rb +68 -0
  22. data/features/step_definitions/generator_steps.rb +284 -0
  23. data/features/step_definitions/task_steps.rb +6 -0
  24. data/features/support/env.rb +29 -0
  25. data/features/tasks/build_gem.feature +9 -0
  26. data/features/tasks/version.feature +24 -0
  27. data/features/tasks/version_bumping.feature +33 -0
  28. data/jeweler.gemspec +225 -0
  29. data/lib/jeweler.rb +153 -0
  30. data/lib/jeweler/commands.rb +14 -0
  31. data/lib/jeweler/commands/build_gem.rb +31 -0
  32. data/lib/jeweler/commands/check_dependencies.rb +52 -0
  33. data/lib/jeweler/commands/install_gem.rb +40 -0
  34. data/lib/jeweler/commands/release.rb +86 -0
  35. data/lib/jeweler/commands/release_to_rubyforge.rb +51 -0
  36. data/lib/jeweler/commands/setup_rubyforge.rb +57 -0
  37. data/lib/jeweler/commands/validate_gemspec.rb +30 -0
  38. data/lib/jeweler/commands/version/base.rb +41 -0
  39. data/lib/jeweler/commands/version/bump_major.rb +13 -0
  40. data/lib/jeweler/commands/version/bump_minor.rb +12 -0
  41. data/lib/jeweler/commands/version/bump_patch.rb +14 -0
  42. data/lib/jeweler/commands/version/write.rb +12 -0
  43. data/lib/jeweler/commands/write_gemspec.rb +39 -0
  44. data/lib/jeweler/errors.rb +20 -0
  45. data/lib/jeweler/gemspec_helper.rb +79 -0
  46. data/lib/jeweler/generator.rb +306 -0
  47. data/lib/jeweler/generator/application.rb +54 -0
  48. data/lib/jeweler/generator/bacon_mixin.rb +43 -0
  49. data/lib/jeweler/generator/micronaut_mixin.rb +41 -0
  50. data/lib/jeweler/generator/minitest_mixin.rb +42 -0
  51. data/lib/jeweler/generator/options.rb +102 -0
  52. data/lib/jeweler/generator/rdoc_mixin.rb +9 -0
  53. data/lib/jeweler/generator/rspec_mixin.rb +42 -0
  54. data/lib/jeweler/generator/shoulda_mixin.rb +42 -0
  55. data/lib/jeweler/generator/testunit_mixin.rb +39 -0
  56. data/lib/jeweler/generator/yard_mixin.rb +14 -0
  57. data/lib/jeweler/rubyforge_tasks.rb +98 -0
  58. data/lib/jeweler/specification.rb +66 -0
  59. data/lib/jeweler/tasks.rb +135 -0
  60. data/lib/jeweler/templates/.document +5 -0
  61. data/lib/jeweler/templates/.gitignore +5 -0
  62. data/lib/jeweler/templates/LICENSE +20 -0
  63. data/lib/jeweler/templates/README.rdoc +18 -0
  64. data/lib/jeweler/templates/Rakefile +153 -0
  65. data/lib/jeweler/templates/bacon/flunking.rb +7 -0
  66. data/lib/jeweler/templates/bacon/helper.rb +8 -0
  67. data/lib/jeweler/templates/features/default.feature +9 -0
  68. data/lib/jeweler/templates/features/support/env.rb +8 -0
  69. data/lib/jeweler/templates/micronaut/flunking.rb +7 -0
  70. data/lib/jeweler/templates/micronaut/helper.rb +17 -0
  71. data/lib/jeweler/templates/minitest/flunking.rb +7 -0
  72. data/lib/jeweler/templates/minitest/helper.rb +11 -0
  73. data/lib/jeweler/templates/rspec/flunking.rb +7 -0
  74. data/lib/jeweler/templates/rspec/helper.rb +10 -0
  75. data/lib/jeweler/templates/shoulda/flunking.rb +7 -0
  76. data/lib/jeweler/templates/shoulda/helper.rb +10 -0
  77. data/lib/jeweler/templates/testunit/flunking.rb +7 -0
  78. data/lib/jeweler/templates/testunit/helper.rb +9 -0
  79. data/lib/jeweler/version_helper.rb +128 -0
  80. data/test/fixtures/bar/VERSION.yml +4 -0
  81. data/test/fixtures/bar/bin/foo_the_ultimate_bin +1 -0
  82. data/test/fixtures/bar/hey_include_me_in_gemspec +0 -0
  83. data/test/fixtures/bar/lib/foo_the_ultimate_lib.rb +1 -0
  84. data/test/fixtures/existing-project-with-version-plaintext/.document +5 -0
  85. data/test/fixtures/existing-project-with-version-plaintext/.gitignore +5 -0
  86. data/test/fixtures/existing-project-with-version-plaintext/LICENSE +20 -0
  87. data/test/fixtures/existing-project-with-version-plaintext/README.rdoc +7 -0
  88. data/test/fixtures/existing-project-with-version-plaintext/Rakefile +82 -0
  89. data/test/fixtures/existing-project-with-version-plaintext/VERSION +1 -0
  90. data/test/fixtures/existing-project-with-version-plaintext/existing-project-with-version.gemspec +29 -0
  91. data/test/fixtures/existing-project-with-version-plaintext/lib/existing_project_with_version.rb +0 -0
  92. data/test/fixtures/existing-project-with-version-plaintext/test/existing_project_with_version_test.rb +7 -0
  93. data/test/fixtures/existing-project-with-version-plaintext/test/test_helper.rb +10 -0
  94. data/test/fixtures/existing-project-with-version-yaml/.document +5 -0
  95. data/test/fixtures/existing-project-with-version-yaml/.gitignore +5 -0
  96. data/test/fixtures/existing-project-with-version-yaml/LICENSE +20 -0
  97. data/test/fixtures/existing-project-with-version-yaml/README.rdoc +7 -0
  98. data/test/fixtures/existing-project-with-version-yaml/Rakefile +82 -0
  99. data/test/fixtures/existing-project-with-version-yaml/VERSION.yml +4 -0
  100. data/test/fixtures/existing-project-with-version-yaml/bin/foo_the_ultimate_bin +0 -0
  101. data/test/fixtures/existing-project-with-version-yaml/existing-project-with-version.gemspec +29 -0
  102. data/test/fixtures/existing-project-with-version-yaml/lib/existing_project_with_version.rb +0 -0
  103. data/test/fixtures/existing-project-with-version-yaml/test/existing_project_with_version_test.rb +7 -0
  104. data/test/fixtures/existing-project-with-version-yaml/test/test_helper.rb +10 -0
  105. data/test/geminstaller.yml +12 -0
  106. data/test/jeweler/commands/test_build_gem.rb +72 -0
  107. data/test/jeweler/commands/test_install_gem.rb +74 -0
  108. data/test/jeweler/commands/test_release.rb +362 -0
  109. data/test/jeweler/commands/test_release_to_rubyforge.rb +157 -0
  110. data/test/jeweler/commands/test_setup_rubyforge.rb +182 -0
  111. data/test/jeweler/commands/test_validate_gemspec.rb +27 -0
  112. data/test/jeweler/commands/test_write_gemspec.rb +92 -0
  113. data/test/jeweler/commands/version/test_base.rb +32 -0
  114. data/test/jeweler/commands/version/test_bump_major.rb +22 -0
  115. data/test/jeweler/commands/version/test_bump_minor.rb +19 -0
  116. data/test/jeweler/commands/version/test_bump_patch.rb +20 -0
  117. data/test/jeweler/commands/version/test_write.rb +23 -0
  118. data/test/shoulda_macros/jeweler_macros.rb +35 -0
  119. data/test/test_application.rb +139 -0
  120. data/test/test_gemspec_helper.rb +40 -0
  121. data/test/test_generator.rb +166 -0
  122. data/test/test_generator_initialization.rb +156 -0
  123. data/test/test_generator_mixins.rb +18 -0
  124. data/test/test_helper.rb +159 -0
  125. data/test/test_jeweler.rb +174 -0
  126. data/test/test_options.rb +149 -0
  127. data/test/test_specification.rb +61 -0
  128. data/test/test_tasks.rb +35 -0
  129. data/test/test_version_helper.rb +153 -0
  130. metadata +283 -0
@@ -0,0 +1,54 @@
1
+ class Jeweler
2
+ class Generator
3
+ class Application
4
+ class << self
5
+ def run!(*arguments)
6
+ env_opts = if ENV['JEWELER_OPTS']
7
+ Jeweler::Generator::Options.new(ENV['JEWELER_OPTS'].split(' '))
8
+ end
9
+ options = Jeweler::Generator::Options.new(arguments)
10
+ options = options.merge(env_opts) if env_opts
11
+
12
+ if options[:invalid_argument]
13
+ $stderr.puts options[:invalid_argument]
14
+ options[:show_help] = true
15
+ end
16
+
17
+ if options[:show_help]
18
+ $stderr.puts options.opts
19
+ return 1
20
+ end
21
+
22
+ unless arguments.size == 1
23
+ $stderr.puts options.opts
24
+ return 1
25
+ end
26
+
27
+ project_name = arguments.first
28
+
29
+ begin
30
+ generator = Jeweler::Generator.new(project_name, options)
31
+ generator.run
32
+ return 0
33
+ rescue Jeweler::NoGitUserName
34
+ $stderr.puts %Q{No user.name found in ~/.gitconfig. Please tell git about yourself (see http://github.com/guides/tell-git-your-user-name-and-email-address for details). For example: git config --global user.name "mad voo"}
35
+ return 1
36
+ rescue Jeweler::NoGitUserEmail
37
+ $stderr.puts %Q{No user.email found in ~/.gitconfig. Please tell git about yourself (see http://github.com/guides/tell-git-your-user-name-and-email-address for details). For example: git config --global user.email mad.vooo@gmail.com}
38
+ return 1
39
+ rescue Jeweler::NoGitHubUser
40
+ $stderr.puts %Q{No github.user found in ~/.gitconfig. Please tell git about your GitHub account (see http://github.com/blog/180-local-github-config for details). For example: git config --global github.user defunkt}
41
+ return 1
42
+ rescue Jeweler::NoGitHubToken
43
+ $stderr.puts %Q{No github.token found in ~/.gitconfig. Please tell git about your GitHub account (see http://github.com/blog/180-local-github-config for details). For example: git config --global github.token 6ef8395fecf207165f1a82178ae1b984}
44
+ return 1
45
+ rescue Jeweler::FileInTheWay
46
+ $stderr.puts "The directory #{project_name} already exists. Maybe move it out of the way before continuing?"
47
+ return 1
48
+ end
49
+ end
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,43 @@
1
+ class Jeweler
2
+ class Generator
3
+ module BaconMixin
4
+
5
+ def self.extended(generator)
6
+ generator.development_dependencies << "bacon"
7
+ end
8
+
9
+ def default_task
10
+ 'spec'
11
+ end
12
+
13
+ def feature_support_require
14
+ 'test/unit/assertions'
15
+ end
16
+
17
+ def feature_support_extend
18
+ 'Test::Unit::Assertions' # NOTE can't use bacon inside of cucumber actually
19
+ end
20
+
21
+ def test_dir
22
+ 'spec'
23
+ end
24
+
25
+ def test_task
26
+ 'spec'
27
+ end
28
+
29
+ def test_pattern
30
+ 'spec/**/*_spec.rb'
31
+ end
32
+
33
+ def test_filename
34
+ "#{require_name}_spec.rb"
35
+ end
36
+
37
+ def test_helper_filename
38
+ "spec_helper.rb"
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,41 @@
1
+ class Jeweler
2
+ class Generator
3
+ module MicronautMixin
4
+ def self.extended(generator)
5
+ generator.development_dependencies << "spicycode-micronaut"
6
+ end
7
+
8
+ def default_task
9
+ 'examples'
10
+ end
11
+
12
+ def feature_support_require
13
+ 'micronaut/expectations'
14
+ end
15
+
16
+ def feature_support_extend
17
+ 'Micronaut::Matchers'
18
+ end
19
+
20
+ def test_dir
21
+ 'examples'
22
+ end
23
+
24
+ def test_task
25
+ 'examples'
26
+ end
27
+
28
+ def test_pattern
29
+ 'examples/**/*_example.rb'
30
+ end
31
+
32
+ def test_filename
33
+ "#{require_name}_example.rb"
34
+ end
35
+
36
+ def test_helper_filename
37
+ "example_helper.rb"
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ class Jeweler
2
+ class Generator
3
+ module MinitestMixin
4
+ def self.extended(generator)
5
+ generator.development_dependencies << "minitest"
6
+ end
7
+
8
+ def default_task
9
+ 'test'
10
+ end
11
+
12
+ def feature_support_require
13
+ 'mini/test'
14
+ end
15
+
16
+ def feature_support_extend
17
+ 'Mini::Test::Assertions'
18
+ end
19
+
20
+ def test_dir
21
+ 'test'
22
+ end
23
+
24
+ def test_task
25
+ 'test'
26
+ end
27
+
28
+ def test_pattern
29
+ 'test/**/*_test.rb'
30
+ end
31
+
32
+ def test_filename
33
+ "#{require_name}_test.rb"
34
+ end
35
+
36
+ def test_helper_filename
37
+ "test_helper.rb"
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,102 @@
1
+ class Jeweler
2
+ class Generator
3
+ class Options < Hash
4
+ attr_reader :opts, :orig_args
5
+
6
+ def initialize(args)
7
+ super()
8
+
9
+ @orig_args = args.clone
10
+ self[:testing_framework] = :shoulda
11
+ self[:documentation_framework] = :rdoc
12
+
13
+ @opts = OptionParser.new do |o|
14
+ o.banner = "Usage: #{File.basename($0)} [options] reponame\ne.g. #{File.basename($0)} the-perfect-gem"
15
+
16
+ o.on('--bacon', 'generate bacon specifications') do
17
+ self[:testing_framework] = :bacon
18
+ end
19
+
20
+ o.on('--shoulda', 'generate shoulda tests') do
21
+ self[:testing_framework] = :shoulda
22
+ end
23
+
24
+ o.on('--testunit', 'generate test/unit tests') do
25
+ self[:testing_framework] = :testunit
26
+ end
27
+
28
+ o.on('--minitest', 'generate minitest tests') do
29
+ self[:testing_framework] = :minitest
30
+ end
31
+
32
+ o.on('--rspec', 'generate rspec code examples') do
33
+ self[:testing_framework] = :rspec
34
+ end
35
+
36
+ o.on('--micronaut', 'generate micronaut examples') do
37
+ self[:testing_framework] = :micronaut
38
+ end
39
+
40
+ o.on('--cucumber', 'generate cucumber stories in addition to the other tests') do
41
+ self[:use_cucumber] = true
42
+ end
43
+
44
+ o.on('--reek', 'generate rake task for reek') do
45
+ self[:use_reek] = true
46
+ end
47
+
48
+ o.on('--roodi', 'generate rake task for roodi') do
49
+ self[:use_roodi] = true
50
+ end
51
+
52
+ o.on('--create-repo', 'create the repository on GitHub') do
53
+ self[:create_repo] = true
54
+ end
55
+
56
+ o.on('--gemcutter', 'setup project for gemcutter') do
57
+ self[:gemcutter] = true
58
+ end
59
+
60
+ o.on('--rubyforge', 'setup project for rubyforge') do
61
+ self[:rubyforge] = true
62
+ end
63
+
64
+ o.on('--summary [SUMMARY]', 'specify the summary of the project') do |summary|
65
+ self[:summary] = summary
66
+ end
67
+
68
+ o.on('--description [DESCRIPTION]', 'specify a description of the project') do |description|
69
+ self[:description] = description
70
+ end
71
+
72
+ o.on('--directory [DIRECTORY]', 'specify the directory to generate into') do |directory|
73
+ self[:directory] = directory
74
+ end
75
+
76
+ o.on('--yard', 'use yard for documentation') do
77
+ self[:documentation_framework] = :yard
78
+ end
79
+
80
+ o.on('--rdoc', 'use rdoc for documentation') do
81
+ self[:documentation_framework] = :rdoc
82
+ end
83
+
84
+ o.on_tail('-h', '--help', 'display this help and exit') do
85
+ self[:show_help] = true
86
+ end
87
+ end
88
+
89
+ begin
90
+ @opts.parse!(args)
91
+ rescue OptionParser::InvalidOption => e
92
+ self[:invalid_argument] = e.message
93
+ end
94
+ end
95
+
96
+ def merge(other)
97
+ self.class.new(@orig_args + other.orig_args)
98
+ end
99
+
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,9 @@
1
+ class Jeweler
2
+ class Generator
3
+ module RdocMixin
4
+ def doc_task
5
+ 'rdoc'
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,42 @@
1
+ class Jeweler
2
+ class Generator
3
+ module RspecMixin
4
+ def self.extended(generator)
5
+ generator.development_dependencies << "rspec"
6
+ end
7
+
8
+ def default_task
9
+ 'spec'
10
+ end
11
+
12
+ def feature_support_require
13
+ 'spec/expectations'
14
+ end
15
+
16
+ def feature_support_extend
17
+ nil # Cucumber is smart enough extend Spec::Expectations on its own
18
+ end
19
+
20
+ def test_dir
21
+ 'spec'
22
+ end
23
+
24
+ def test_task
25
+ 'spec'
26
+ end
27
+
28
+ def test_pattern
29
+ 'spec/**/*_spec.rb'
30
+ end
31
+
32
+ def test_filename
33
+ "#{require_name}_spec.rb"
34
+ end
35
+
36
+ def test_helper_filename
37
+ "spec_helper.rb"
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ class Jeweler
2
+ class Generator
3
+ module ShouldaMixin
4
+ def self.extended(generator)
5
+ generator.development_dependencies << "thoughtbot-shoulda"
6
+ end
7
+
8
+ def default_task
9
+ 'test'
10
+ end
11
+
12
+ def feature_support_require
13
+ 'test/unit/assertions'
14
+ end
15
+
16
+ def feature_support_extend
17
+ 'Test::Unit::Assertions'
18
+ end
19
+
20
+ def test_dir
21
+ 'test'
22
+ end
23
+
24
+ def test_task
25
+ 'test'
26
+ end
27
+
28
+ def test_pattern
29
+ 'test/**/*_test.rb'
30
+ end
31
+
32
+ def test_filename
33
+ "#{require_name}_test.rb"
34
+ end
35
+
36
+ def test_helper_filename
37
+ "test_helper.rb"
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,39 @@
1
+ class Jeweler
2
+ class Generator
3
+ module TestunitMixin
4
+
5
+ def default_task
6
+ 'test'
7
+ end
8
+
9
+ def feature_support_require
10
+ 'test/unit/assertions'
11
+ end
12
+
13
+ def feature_support_extend
14
+ 'Test::Unit::Assertions'
15
+ end
16
+
17
+ def test_dir
18
+ 'test'
19
+ end
20
+
21
+ def test_task
22
+ 'test'
23
+ end
24
+
25
+ def test_pattern
26
+ 'test/**/*_test.rb'
27
+ end
28
+
29
+ def test_filename
30
+ "#{require_name}_test.rb"
31
+ end
32
+
33
+ def test_helper_filename
34
+ "test_helper.rb"
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,14 @@
1
+ class Jeweler
2
+ class Generator
3
+ module YardMixin
4
+ def self.extended(generator)
5
+ generator.development_dependencies << "yard"
6
+ end
7
+
8
+ def doc_task
9
+ 'yardoc'
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,98 @@
1
+ require 'rake'
2
+ require 'rake/tasklib'
3
+ require 'rake/contrib/sshpublisher'
4
+
5
+
6
+ class Jeweler
7
+ # Rake tasks for putting a Jeweler gem on Rubyforge.
8
+ #
9
+ # Jeweler::Tasks.new needs to be used before this.
10
+ #
11
+ # Basic usage:
12
+ #
13
+ # Jeweler::RubyforgeTasks.new
14
+ #
15
+ # Easy enough, right?
16
+ #
17
+ # There are a few options you can tweak:
18
+ #
19
+ # * project: the rubyforge project to operate on. This defaults to whatever you specified in your gemspec. Defaults to your gem name.
20
+ # * remote_doc_path: the place to upload docs to on Rubyforge under /var/www/gforge-projects/#{project}/
21
+ #
22
+ class RubyforgeTasks < ::Rake::TaskLib
23
+ # The RubyForge project to interact with. Defaults to whatever is in your jeweler gemspec.
24
+ attr_accessor :project
25
+ # The path to upload docs to. It is relative to /var/www/gforge-projects/#{project}/, and defaults to your gemspec's name
26
+ attr_accessor :remote_doc_path
27
+ # Task to be used for generating documentation, before they are uploaded. Defaults to rdoc.
28
+ attr_accessor :doc_task
29
+
30
+ attr_accessor :jeweler
31
+
32
+ def initialize
33
+ yield self if block_given?
34
+
35
+ self.jeweler = Rake.application.jeweler
36
+
37
+ self.remote_doc_path ||= jeweler.gemspec.name
38
+ self.project ||= jeweler.gemspec.rubyforge_project
39
+ self.doc_task ||= :rdoc
40
+
41
+ define
42
+ end
43
+
44
+ def define
45
+ namespace :rubyforge do
46
+
47
+ desc "Release gem and RDoc documentation to RubyForge"
48
+ task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
49
+
50
+ namespace :release do
51
+ desc "Release the current gem version to RubyForge."
52
+ task :gem => [:gemspec, :build] do
53
+ begin
54
+ jeweler.release_gem_to_rubyforge
55
+ rescue NoRubyForgeProjectInGemspecError => e
56
+ abort "Setting up RubyForge requires that you specify a 'rubyforge_project' in your Jeweler::Tasks declaration"
57
+ rescue MissingRubyForgePackageError => e
58
+ abort "Rubyforge reported that the #{e.message} package isn't setup. Run rake rubyforge:setup to do so."
59
+ rescue RubyForgeProjectNotConfiguredError => e
60
+ abort "RubyForge reported that #{e.message} wasn't configured. This means you need to run 'rubyforge setup', 'rubyforge login', and 'rubyforge configure', or maybe the project doesn't exist on RubyForge"
61
+ end
62
+ end
63
+
64
+ desc "Publish docs to RubyForge."
65
+ task :docs => doc_task do
66
+ config = YAML.load(
67
+ File.read(File.expand_path('~/.rubyforge/user-config.yml'))
68
+ )
69
+
70
+ host = "#{config['username']}@rubyforge.org"
71
+ remote_dir = "/var/www/gforge-projects/#{project}/#{remote_doc_path}"
72
+
73
+ local_dir = case self.doc_task.to_sym
74
+ when :rdoc then 'rdoc'
75
+ when :yardoc then 'doc'
76
+ else
77
+ raise "Unsure what to run to generate documentation. Please set doc_task and re-run."
78
+ end
79
+
80
+ sh %{rsync -av --delete #{local_dir}/ #{host}:#{remote_dir}}
81
+ end
82
+ end
83
+
84
+ desc "Setup a rubyforge project for this gem"
85
+ task :setup do
86
+ begin
87
+ jeweler.setup_rubyforge
88
+ rescue NoRubyForgeProjectInGemspecError => e
89
+ abort "Setting up RubyForge requires that you specify a 'rubyforge_project' in your Jeweler::Tasks declaration"
90
+ rescue RubyForgeProjectNotConfiguredError => e
91
+ abort "The RubyForge reported that #{e.message} wasn't configured. This means you need to run 'rubyforge setup', 'rubyforge login', and 'rubyforge configure', or maybe the project doesn't exist on RubyForge"
92
+ end
93
+ end
94
+
95
+ end
96
+ end
97
+ end
98
+ end