technicalpickles-jeweler 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -5,3 +5,4 @@ tags
5
5
  test/tmp
6
6
  test/version_tmp
7
7
  tmp
8
+ .yardoc
data/Rakefile CHANGED
@@ -15,14 +15,27 @@ begin
15
15
  gem.description = "Simple and opinionated helper for creating Rubygem projects on GitHub"
16
16
  gem.authors = ["Josh Nichols"]
17
17
  gem.files.include %w(lib/jeweler/templates/.document lib/jeweler/templates/.gitignore)
18
- gem.add_dependency "git", ">= 1.1.1"
18
+
19
+ gem.add_dependency "git", ">= 1.2.1"
19
20
  gem.add_dependency "rubyforge"
21
+
20
22
  gem.rubyforge_project = "pickles"
23
+
24
+ gem.add_development_dependency "thoughtbot-shoulda"
25
+ gem.add_development_dependency "mhennemeyer-output_catcher"
26
+ gem.add_development_dependency "rr"
27
+ gem.add_development_dependency "mocha"
28
+ gem.add_development_dependency "redgreen"
29
+ end
30
+
31
+ Jeweler::RubyforgeTasks.new do |t|
32
+ t.doc_task = :yardoc
21
33
  end
22
34
  rescue LoadError
23
35
  puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"
24
36
  end
25
37
 
38
+
26
39
  require 'rake/testtask'
27
40
  Rake::TestTask.new(:test) do |test|
28
41
  test.test_files = FileList.new('test/**/test_*.rb') do |list|
@@ -32,14 +45,18 @@ Rake::TestTask.new(:test) do |test|
32
45
  test.verbose = true
33
46
  end
34
47
 
35
- require 'rake/rdoctask'
36
- Rake::RDocTask.new do |rdoc|
37
- rdoc.rdoc_dir = 'rdoc'
38
- rdoc.title = 'jeweler'
39
- rdoc.rdoc_files.include('README.markdown')
40
- rdoc.rdoc_files.include('lib/**/*.rb')
48
+ begin
49
+ require 'yard'
50
+ YARD::Rake::YardocTask.new(:yardoc) do |t|
51
+ t.files = FileList['lib/**/*.rb'].exclude('lib/jeweler/templates/**/*.rb')
52
+ end
53
+ rescue LoadError
54
+ task :yardoc do
55
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
56
+ end
41
57
  end
42
58
 
59
+
43
60
  begin
44
61
  require 'rcov/rcovtask'
45
62
  Rcov::RcovTask.new(:rcov) do |rcov|
@@ -104,3 +121,32 @@ if ENV["RUN_CODE_RUN"] == "true"
104
121
  else
105
122
  task :default => :test
106
123
  end
124
+
125
+ namespace :development_dependencies do
126
+ task :check do
127
+ missing_dependencies = Rake.application.jeweler.gemspec.development_dependencies.select do |dependency|
128
+ begin
129
+ Gem.activate dependency.name, dependency.version_requirements.to_s
130
+ false
131
+ rescue LoadError => e
132
+ true
133
+ end
134
+ end
135
+
136
+ #require 'ruby-debug'; breakpoint
137
+
138
+ if missing_dependencies.empty?
139
+ puts "Development dependencies seem to be installed."
140
+ else
141
+ puts "Missing some dependencies. Install them with the following commands:"
142
+ missing_dependencies.each do |dependency|
143
+ puts %Q{\tgem install #{dependency.name} --version "#{dependency.version_requirements}"}
144
+ end
145
+ abort "Run the specified gem commands before trying to run this again: #{$0} #{ARGV.join(' ')}"
146
+ end
147
+
148
+ end
149
+ end
150
+
151
+ task :test => 'development_dependencies:check'
152
+ task :features => 'development_dependencies:check'
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 1
3
- :patch: 2
4
- :minor: 0
3
+ :patch: 0
4
+ :minor: 1
@@ -3,9 +3,11 @@ Feature: generated Rakefile
3
3
  A user should be able to
4
4
  generate a Rakefile
5
5
 
6
- Scenario: shared
6
+ Background:
7
7
  Given a working directory
8
8
  And I have configured git sanely
9
+
10
+ Scenario: shared
9
11
  When I generate a project named 'the-perfect-gem' that is 'zomg, so good' and described as 'Descriptive'
10
12
 
11
13
  Then 'Rakefile' requires 'rubygems'
@@ -18,8 +20,6 @@ Feature: generated Rakefile
18
20
  And Rakefile has 'http://github.com/technicalpickles/the-perfect-gem' for the Jeweler::Tasks homepage
19
21
 
20
22
  Scenario: bacon
21
- Given a working directory
22
- And I have configured git sanely
23
23
  When I generate a bacon project named 'the-perfect-gem' that is 'zomg, so good'
24
24
 
25
25
 
@@ -30,8 +30,6 @@ Feature: generated Rakefile
30
30
  And Rakefile has "spec" as the default task
31
31
 
32
32
  Scenario: minitest
33
- Given a working directory
34
- And I have configured git sanely
35
33
  When I generate a minitest project named 'the-perfect-gem' that is 'zomg, so good'
36
34
 
37
35
  Then 'Rakefile' requires 'rcov/rcovtask'
@@ -41,8 +39,6 @@ Feature: generated Rakefile
41
39
  And Rakefile has "test" as the default task
42
40
 
43
41
  Scenario: rspec
44
- Given a working directory
45
- And I have configured git sanely
46
42
  When I generate a rspec project named 'the-perfect-gem' that is 'zomg, so good'
47
43
 
48
44
  Then 'Rakefile' requires 'spec/rake/spectask'
@@ -50,8 +46,6 @@ Feature: generated Rakefile
50
46
  And Rakefile has "spec" as the default task
51
47
 
52
48
  Scenario: shoulda
53
- Given a working directory
54
- And I have configured git sanely
55
49
  When I generate a shoulda project named 'the-perfect-gem' that is 'zomg, so good'
56
50
 
57
51
  Then 'Rakefile' requires 'rcov/rcovtask'
@@ -61,8 +55,6 @@ Feature: generated Rakefile
61
55
  And Rakefile has "test" as the default task
62
56
 
63
57
  Scenario: micronaut
64
- Given a working directory
65
- And I have configured git sanely
66
58
  When I generate a micronaut project named 'the-perfect-gem' that is 'zomg, so good'
67
59
 
68
60
  Then 'Rakefile' requires 'micronaut/rake_task'
@@ -70,8 +62,6 @@ Feature: generated Rakefile
70
62
  And Rakefile has "examples" as the default task
71
63
 
72
64
  Scenario: testunit
73
- Given a working directory
74
- And I have configured git sanely
75
65
  When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
76
66
 
77
67
  Then 'Rakefile' requires 'rcov/rcovtask'
@@ -81,65 +71,81 @@ Feature: generated Rakefile
81
71
  And Rakefile has "test" as the default task
82
72
 
83
73
  Scenario: no cucumber
84
- Given a working directory
85
- And I have configured git sanely
86
- And I do not want cucumber stories
74
+ Given I do not want cucumber stories
87
75
  When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
88
76
  Then Rakefile does not require 'cucumber/rake/task'
89
77
  And Rakefile does not instantiate a Cucumber::Rake::Task
90
78
 
91
79
  Scenario: cucumber
92
- Given a working directory
93
- And I have configured git sanely
94
- And I want cucumber stories
80
+ Given I want cucumber stories
95
81
  When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
96
82
  Then Rakefile requires 'cucumber/rake/task'
97
83
  And Rakefile instantiates a Cucumber::Rake::Task
98
84
 
99
85
  Scenario: no reek
100
- Given a working directory
101
- And I have configured git sanely
102
- And I do not want reek
86
+ Given I do not want reek
103
87
  When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
104
88
  Then Rakefile does not require 'reek/rake_task'
105
89
  And Rakefile does not instantiate a Reek::RakeTask
106
90
 
107
91
  Scenario: reek
108
- Given a working directory
109
- And I have configured git sanely
110
- And I want reek
92
+ Given I want reek
111
93
  When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
112
94
  Then Rakefile requires 'reek/rake_task'
113
95
  And Rakefile instantiates a Reek::RakeTask
114
96
 
115
97
  Scenario: no roodi
116
- Given a working directory
117
- And I have configured git sanely
118
- And I do not want roodi
98
+ Given I do not want roodi
119
99
  When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
120
100
  Then Rakefile does not require 'roodi'
121
101
  And Rakefile does not require 'roodi_task'
122
102
  And Rakefile does not instantiate a RoodiTask
123
103
 
124
104
  Scenario: roodi
125
- Given a working directory
126
- And I have configured git sanely
127
- And I want roodi
105
+ Given I want roodi
128
106
  When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
129
107
  Then Rakefile requires 'roodi'
130
108
  And Rakefile requires 'roodi_task'
131
109
  And Rakefile instantiates a RoodiTask
132
110
 
133
111
  Scenario: no rubyforge
134
- Given a working directory
135
- And I have configured git sanely
136
- And I do not want rubyforge setup
112
+ Given I do not want rubyforge setup
137
113
  When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
138
114
  Then Rakefile does not instantiate a Jeweler::RubyforgeTasks
139
115
 
140
116
  Scenario: rubyforge
141
- Given a working directory
142
- And I have configured git sanely
117
+ Given I want rubyforge setup
118
+ When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
119
+ Then Rakefile instantiates a Jeweler::RubyforgeTasks
120
+
121
+ Scenario: yard
122
+ Given I want to use yard instead of rdoc
123
+ When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
124
+
125
+ Then 'Rakefile' does not require 'rake/rdoctask'
126
+ And 'Rakefile' requires 'yard'
127
+ And Rakefile instantiates a YARD::Rake::YardocTask
128
+
129
+ Scenario: rdoc
130
+ Given I want to use rdoc instead of yard
131
+ When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
132
+
133
+ Then 'Rakefile' does not require 'yard'
134
+ And 'Rakefile' requires 'rake/rdoctask'
135
+ And Rakefile does not instantiate a YARD::Rake::YardocTask
136
+ And Rakefile instantiates a Rake::RDocTask.new
137
+
138
+ Scenario: rubyforge and yard
139
+ Given I want to use yard instead of rdoc
140
+ And I want rubyforge setup
141
+ When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
142
+ Then Rakefile instantiates a Jeweler::RubyforgeTasks
143
+ And Rakefile has 'yardoc' for the Jeweler::RubyforgeTasks doc_task
144
+
145
+ Scenario: rubyfoge and doc
146
+ Given I want to use rdoc instead of yard
147
+ And I want rubyforge setup
143
148
  And I want rubyforge setup
144
149
  When I generate a testunit project named 'the-perfect-gem' that is 'zomg, so good'
145
150
  Then Rakefile instantiates a Jeweler::RubyforgeTasks
151
+ And Rakefile has 'rdoc' for the Jeweler::RubyforgeTasks doc_task
@@ -25,6 +25,9 @@ end
25
25
  When /^I run "([^"]+)" in "([^"]+)"$/ do |command, directory|
26
26
  full_path = File.join(@working_dir, directory)
27
27
 
28
+ lib_path = File.expand_path 'lib'
29
+ command.gsub!(/^rake /, "rake -I#{lib_path} ")
30
+
28
31
  assert File.directory?(full_path), "#{full_path} is not a directory"
29
32
 
30
33
  @stdout = `cd #{full_path} && #{command}`
@@ -30,6 +30,14 @@ And /^I want rubyforge setup$/ do
30
30
  @use_rubyforge = true
31
31
  end
32
32
 
33
+ Given /^I want to use yard instead of rdoc$/ do
34
+ @documentation_framework = "yard"
35
+ end
36
+
37
+ Given /^I want to use rdoc instead of yard$/ do
38
+ @documentation_framework = "rdoc"
39
+ end
40
+
33
41
 
34
42
  Given /^I intend to test with (\w+)$/ do |testing_framework|
35
43
  @testing_framework = testing_framework.to_sym
@@ -77,6 +85,7 @@ When /^I generate a (.*)project named '((?:\w|-|_)+)' that is '([^']*)' and desc
77
85
  @use_rubyforge ? '--rubyforge' : nil,
78
86
  @use_roodi ? '--roodi' : nil,
79
87
  @use_reek ? '--reek' : nil,
88
+ @documentation_framework ? "--#{@documentation_framework}" : nil,
80
89
  @name].compact
81
90
 
82
91
  @stdout = OutputCatcher.catch_out do
@@ -1,8 +1,18 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
2
  require 'jeweler'
3
3
 
4
- require 'mocha'
5
- require 'output_catcher'
4
+ begin
5
+ require 'mocha'
6
+ require 'output_catcher'
7
+ rescue LoadError => e
8
+ puts "*" * 80
9
+ puts "Some dependencies needed to run tests were missing. Run the following command to find them:"
10
+ puts
11
+ puts "\trake development_dependencies:check"
12
+ puts "*" * 80
13
+ exit 1
14
+ end
15
+
6
16
 
7
17
  require 'test/unit/assertions'
8
18
 
data/jeweler.gemspec CHANGED
@@ -1,12 +1,15 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
1
4
  # -*- encoding: utf-8 -*-
2
5
 
3
6
  Gem::Specification.new do |s|
4
7
  s.name = %q{jeweler}
5
- s.version = "1.0.2"
8
+ s.version = "1.1.0"
6
9
 
7
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
11
  s.authors = ["Josh Nichols"]
9
- s.date = %q{2009-07-29}
12
+ s.date = %q{2009-08-05}
10
13
  s.default_executable = %q{jeweler}
11
14
  s.description = %q{Simple and opinionated helper for creating Rubygem projects on GitHub}
12
15
  s.email = %q{josh@technicalpickles.com}
@@ -150,7 +153,7 @@ Gem::Specification.new do |s|
150
153
  s.rdoc_options = ["--charset=UTF-8"]
151
154
  s.require_paths = ["lib"]
152
155
  s.rubyforge_project = %q{pickles}
153
- s.rubygems_version = %q{1.3.4}
156
+ s.rubygems_version = %q{1.3.5}
154
157
  s.summary = %q{Simple and opinionated helper for creating Rubygem projects on GitHub}
155
158
  s.test_files = [
156
159
  "test/fixtures/bar/lib/foo_the_ultimate_lib.rb",
@@ -191,14 +194,29 @@ Gem::Specification.new do |s|
191
194
  s.specification_version = 3
192
195
 
193
196
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
194
- s.add_runtime_dependency(%q<git>, [">= 1.1.1"])
197
+ s.add_runtime_dependency(%q<git>, [">= 1.2.1"])
195
198
  s.add_runtime_dependency(%q<rubyforge>, [">= 0"])
199
+ s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
200
+ s.add_development_dependency(%q<mhennemeyer-output_catcher>, [">= 0"])
201
+ s.add_development_dependency(%q<rr>, [">= 0"])
202
+ s.add_development_dependency(%q<mocha>, [">= 0"])
203
+ s.add_development_dependency(%q<redgreen>, [">= 0"])
196
204
  else
197
- s.add_dependency(%q<git>, [">= 1.1.1"])
205
+ s.add_dependency(%q<git>, [">= 1.2.1"])
198
206
  s.add_dependency(%q<rubyforge>, [">= 0"])
207
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
208
+ s.add_dependency(%q<mhennemeyer-output_catcher>, [">= 0"])
209
+ s.add_dependency(%q<rr>, [">= 0"])
210
+ s.add_dependency(%q<mocha>, [">= 0"])
211
+ s.add_dependency(%q<redgreen>, [">= 0"])
199
212
  end
200
213
  else
201
- s.add_dependency(%q<git>, [">= 1.1.1"])
214
+ s.add_dependency(%q<git>, [">= 1.2.1"])
202
215
  s.add_dependency(%q<rubyforge>, [">= 0"])
216
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
217
+ s.add_dependency(%q<mhennemeyer-output_catcher>, [">= 0"])
218
+ s.add_dependency(%q<rr>, [">= 0"])
219
+ s.add_dependency(%q<mocha>, [">= 0"])
220
+ s.add_dependency(%q<redgreen>, [">= 0"])
203
221
  end
204
222
  end
@@ -1,3 +1,5 @@
1
+ require 'rbconfig'
2
+
1
3
  class Jeweler
2
4
  module Commands
3
5
  class InstallGem
@@ -9,10 +11,22 @@ class Jeweler
9
11
 
10
12
 
11
13
  def run
12
- command = "sudo gem install #{gemspec_helper.gem_path}"
14
+ command = "gem install #{gemspec_helper.gem_path}"
13
15
  output.puts "Executing #{command.inspect}:"
14
16
 
15
- sh command # TODO where does sh actually come from!?
17
+ sh sudo_wrapper(command) # TODO where does sh actually come from!? - rake, apparently
18
+ end
19
+
20
+ def sudo_wrapper(command)
21
+ use_sudo? ? "sudo #{command}" : command
22
+ end
23
+
24
+ def use_sudo?
25
+ host_os !~ /mswin|windows|cygwin/i
26
+ end
27
+
28
+ def host_os
29
+ Config::CONFIG['host_os']
16
30
  end
17
31
 
18
32
  def self.build_for(jeweler)
@@ -12,7 +12,7 @@ class Jeweler
12
12
  end
13
13
 
14
14
  def run
15
- raise "Hey buddy, try committing them files first" if any_pending_changes?
15
+ raise "Hey buddy, try committing them files first" unless clean_staging_area?
16
16
 
17
17
  repo.checkout('master')
18
18
 
@@ -22,11 +22,12 @@ class Jeweler
22
22
  output.puts "Pushing master to origin"
23
23
  repo.push
24
24
 
25
- tag_release! unless release_tagged?
25
+ tag_release! if release_not_tagged?
26
26
  end
27
27
 
28
- def any_pending_changes?
29
- !(@repo.status.added.empty? && @repo.status.deleted.empty? && @repo.status.changed.empty?)
28
+ def clean_staging_area?
29
+ status = repo.status
30
+ status.added.empty? && status.deleted.empty? && status.changed.empty?
30
31
  end
31
32
 
32
33
  def tag_release!
@@ -52,13 +53,15 @@ class Jeweler
52
53
  "v#{version}"
53
54
  end
54
55
 
55
- def release_tagged?
56
+ def release_not_tagged?
56
57
  tag = repo.tag(release_tag) rescue nil
57
- ! tag.nil?
58
+ tag.nil?
58
59
  end
59
60
 
60
61
  def gemspec_changed?
61
- any_pending_changes?
62
+ `git status` # OMGHAX. status always ends up being 'M' unless this runs
63
+ status = repo.status[gemspec_helper.path]
64
+ ! status.type.nil?
62
65
  end
63
66
 
64
67
  def gemspec_helper
@@ -11,7 +11,26 @@ class Jeweler
11
11
  output.puts "Logging into rubyforge"
12
12
  @rubyforge.login
13
13
 
14
+ if package_exists?
15
+ output.puts "#{@gemspec.name} package already exists in the #{@gemspec.rubyforge_project} project"
16
+ return
17
+ end
18
+
14
19
  output.puts "Creating #{@gemspec.name} package in the #{@gemspec.rubyforge_project} project"
20
+ create_package
21
+ end
22
+
23
+ def package_exists?
24
+ begin
25
+ @rubyforge.lookup 'package', @gemspec.name
26
+ true
27
+ rescue RuntimeError => e
28
+ raise unless e.message == "no <package_id> configured for <#{@gemspec.name}>"
29
+ false
30
+ end
31
+ end
32
+
33
+ def create_package
15
34
  begin
16
35
  @rubyforge.create_package(@gemspec.rubyforge_project, @gemspec.name)
17
36
  rescue StandardError => e
@@ -30,6 +30,9 @@ class Jeweler
30
30
  gemspec_ruby = prettyify_array(gemspec_ruby, :files)
31
31
  gemspec_ruby = prettyify_array(gemspec_ruby, :test_files)
32
32
  gemspec_ruby = prettyify_array(gemspec_ruby, :extra_rdoc_files)
33
+ f.puts "# Generated by jeweler"
34
+ f.puts "# DO NOT EDIT THIS FILE"
35
+ f.puts "# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`"
33
36
  f.write gemspec_ruby
34
37
  end
35
38
  end
@@ -7,7 +7,8 @@ class Jeweler
7
7
  super()
8
8
 
9
9
  @orig_args = args.clone
10
- self[:testing_framework] = :shoulda
10
+ self[:testing_framework] = :shoulda
11
+ self[:documentation_framework] = :rdoc
11
12
 
12
13
  @opts = OptionParser.new do |o|
13
14
  o.banner = "Usage: #{File.basename($0)} [options] reponame\ne.g. #{File.basename($0)} the-perfect-gem"
@@ -68,6 +69,14 @@ class Jeweler
68
69
  self[:directory] = directory
69
70
  end
70
71
 
72
+ o.on('--yard', 'use yard for documentation') do
73
+ self[:documentation_framework] = :yard
74
+ end
75
+
76
+ o.on('--rdoc', 'use rdoc for documentation') do
77
+ self[:documentation_framework] = :rdoc
78
+ end
79
+
71
80
  o.on_tail('-h', '--help', 'display this help and exit') do
72
81
  self[:show_help] = true
73
82
  end
@@ -28,13 +28,16 @@ class Jeweler
28
28
  end
29
29
 
30
30
  class Generator
31
- attr_accessor :target_dir, :user_name, :user_email, :summary, :testing_framework,
31
+ attr_accessor :target_dir, :user_name, :user_email, :summary,
32
32
  :project_name, :github_username, :github_token,
33
- :repo, :should_create_repo, :should_use_cucumber, :should_setup_rubyforge,
33
+ :repo, :should_create_repo,
34
+ :testing_framework, :documentation_framework,
35
+ :should_use_cucumber, :should_setup_rubyforge,
34
36
  :should_use_reek, :should_use_roodi,
35
37
  :description
36
38
 
37
39
  DEFAULT_TESTING_FRAMEWORK = :shoulda
40
+ DEFAULT_DOCUMENTATION_FRAMEWORK = :rdoc
38
41
 
39
42
  def initialize(project_name, options = {})
40
43
  if project_name.nil? || project_name.squeeze.strip == ""
@@ -44,6 +47,7 @@ class Jeweler
44
47
  self.project_name = project_name
45
48
 
46
49
  self.testing_framework = (options[:testing_framework] || DEFAULT_TESTING_FRAMEWORK).to_sym
50
+ self.documentation_framework = options[:documentation_framework] || DEFAULT_DOCUMENTATION_FRAMEWORK
47
51
  begin
48
52
  generator_mixin_name = "#{self.testing_framework.to_s.capitalize}Mixin"
49
53
  generator_mixin = self.class.const_get(generator_mixin_name)
@@ -127,14 +131,19 @@ class Jeweler
127
131
  File.join(features_dir, 'step_definitions')
128
132
  end
129
133
 
134
+ def doc_task
135
+ case documentation_framework
136
+ when :yard then "yardoc"
137
+ else
138
+ documentation_framework.to_s
139
+ end
140
+ end
141
+
130
142
  protected
131
143
 
132
144
  # This is in a separate method so we can stub it out during testing
133
145
  def read_git_config
134
- # we could just use Git::Base's .config, but that relies on a repo being around already
135
- # ... which we don't have yet, since this is part of a sanity check
136
- lib = Git::Lib.new(nil, nil)
137
- config = lib.parse_config '~/.gitconfig'
146
+ Git.global_config
138
147
  end
139
148
 
140
149
  private
@@ -4,8 +4,29 @@ require 'rake/contrib/sshpublisher'
4
4
 
5
5
 
6
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
+ #
7
22
  class RubyforgeTasks < ::Rake::TaskLib
8
- attr_accessor :project, :remote_doc_path
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
+
9
30
  attr_accessor :jeweler
10
31
 
11
32
  def initialize
@@ -15,6 +36,7 @@ class Jeweler
15
36
 
16
37
  self.remote_doc_path ||= jeweler.gemspec.name
17
38
  self.project ||= jeweler.gemspec.rubyforge_project
39
+ self.doc_task ||= :rdoc
18
40
 
19
41
  define
20
42
  end
@@ -26,21 +48,51 @@ class Jeweler
26
48
  task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
27
49
 
28
50
  namespace :release do
29
- desc "Publish RDoc to RubyForge."
30
- task :docs => [:rdoc] 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
31
66
  config = YAML.load(
32
67
  File.read(File.expand_path('~/.rubyforge/user-config.yml'))
33
68
  )
34
69
 
35
70
  host = "#{config['username']}@rubyforge.org"
36
71
  remote_dir = "/var/www/gforge-projects/#{project}/#{remote_doc_path}"
37
- local_dir = 'rdoc'
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
38
79
 
39
80
  sh %{rsync -av --delete #{local_dir}/ #{host}:#{remote_dir}}
40
81
  end
41
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
+
42
95
  end
43
-
44
96
  end
45
97
  end
46
98
  end