shoe 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,10 @@
1
+ == Git
2
+
3
+ * Lean on cucumber.yml to define cucumber tasks.
4
+ * Lean on spec.test_files and Gem::Validator to run tests.
5
+ * Shoe::Tasks can now be used a la carte.
6
+ * The shoe generator script now requires a path argument.
7
+
1
8
  == 0.4.0
2
9
 
3
10
  * Don't generate the gemspec; *use* it instead.
@@ -1,66 +1,96 @@
1
1
  = Shoe
2
2
 
3
- Shoe is a library of Rake tasks that (unlike
4
- Hoe[http://seattlerb.rubyforge.org/hoe] and
5
- Jeweler[http://github.com/technicalpickles/jeweler]) honors your gemspec.
6
- (Background[http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended/].)
7
-
8
- Shoe's Rake tasks accept *zero* configuration parameters. All configuration
9
- should be performed in your (checked into version control) gemspec. This way,
10
- Shoe can lean on Rubygems for the things it's already good at, using
11
- {Gem::Ext::ExtConfBuilder}[http://rubygems.rubyforge.org/rubygems-update/Gem/Ext/ExtConfBuilder.html]
12
- and
13
- {Gem::DocManager}[http://rubygems.rubyforge.org/rubygems-update/Gem/DocManager.html]
14
- instead of {ad-hoc}[http://github.com/luislavena/rake-compiler/] {Rake
15
- tasks}[http://rake.rubyforge.org/classes/Rake/RDocTask.html] -- indeed, this is
16
- what your users will be doing when they install your gem!
17
-
18
- (I have a pipe dream of one day running tests strictly with
19
- {Gem::Validator}[http://rubygems.rubyforge.org/rubygems-update/Gem/Validator.html].)
3
+ Shoe is an ecosystem-friendly library of Rake tasks for your gem.
4
+
5
+ * It <b>reads your gemspec</b> instead of writing it like
6
+ Hoe[http://seattlerb.rubyforge.org/hoe] and
7
+ Jeweler[http://github.com/technicalpickles/jeweler] do.
8
+ (Background[http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended/].)
9
+
10
+ * It <b>uses Rubygems</b>
11
+ {for}[http://rubygems.rubyforge.org/rubygems-update/Gem/Ext/ExtConfBuilder.html]
12
+ {common}[http://rubygems.rubyforge.org/rubygems-update/Gem/DocManager.html]
13
+ {functionality}[http://rubygems.rubyforge.org/rubygems-update/Gem/Validator.html],
14
+ rather than
15
+ {reinventing}[http://github.com/luislavena/rake-compiler/]
16
+ {the}[http://rake.rubyforge.org/classes/Rake/RDocTask.html]
17
+ {wheel}[http://rake.rubyforge.org/classes/Rake/TestTask.html].
18
+
20
19
 
21
20
  == Install
22
21
 
23
22
  $ gem install shoe
24
23
 
25
- == Use
26
24
 
27
- In your <tt>Rakefile</tt>:
25
+ == Use
28
26
 
29
27
  require 'shoe'
30
28
 
31
29
  Shoe::Tasks.define('my_project.gemspec')
32
30
 
33
- Then you'll see (at most) the following rake tasks available:
34
31
 
35
- rake clean # Remove ignored files
36
- rake compile # Compile C extensions
37
- rake cucumber:ok # Run features
38
- rake cucumber:wip # Run work-in-progress features
39
- rake default # Run tests / Run features
40
- rake rdoc # Generate documentation
41
- rake release # Release myproject-0.1.0
42
- rake test # Run tests
32
+ == Configure
33
+
34
+ Shoe::Tasks accept no direct configuration. Instead, they rely on your project environment:
35
+
36
+ Shoe::Tasks::Clean::
37
+ calls <tt>`git clean -fdX`</tt>.
38
+
39
+ Shoe::Tasks::Compile::
40
+ builds the
41
+ <tt>extensions[http://docs.rubygems.org/read/chapter/20#extensions]</tt> in
42
+ your gemspec.
43
+
44
+ Shoe::Tasks::Cucumber::
45
+ runs individual profiles in your
46
+ <tt>{cucumber.yml}[http://wiki.github.com/aslakhellesoy/cucumber/cucumberyml]</tt>.
47
+
48
+ Shoe::Tasks::Rdoc::
49
+ uses the
50
+ <tt>rdoc_options[http://docs.rubygems.org/read/chapter/20#rdoc_options]</tt>
51
+ and
52
+ <tt>extra_rdoc_files[http://docs.rubygems.org/read/chapter/20#extra_rdoc_files]</tt>
53
+ in your gemspec.
54
+
55
+ Shoe::Tasks::Release::
56
+ calls <tt>`git tag`</tt>, <tt>`git push`</tt>, <tt>`gem build`</tt> and
57
+ <tt>`gem push`</tt>, of course.
58
+
59
+ Shoe::Tasks::Test::
60
+ runs the
61
+ <tt>test_files[http://docs.rubygems.org/read/chapter/20#test_files]</tt> in
62
+ your gemspec.
63
+
64
+ Each Task class definition has more specific configuration notes.
65
+
66
+
67
+ == Cherry Pick
68
+
69
+ If you don't want to use all the Shoe::Tasks, just instantiate the ones you
70
+ want:
71
+
72
+ require 'shoe'
73
+
74
+ Shoe::Tasks::Cucumber.new('my_project.gemspec')
75
+ Shoe::Tasks::Rdoc.new('my_project.gemspec')
43
76
 
44
- I say "at most" because, when possible, tasks are conditionally defined: you
45
- won't see "rake compile" if you don't specify any extensions in your gemspec,
46
- for example.
47
77
 
48
78
  == Bootstrap
49
79
 
50
- If you like, you can also use the provided <tt>shoe</tt> executable to generate
51
- some starter files for your new project:
80
+ The provided <tt>shoe</tt> executable will generate a helpful gemspec and some
81
+ other skeleton files for your new project:
52
82
 
53
- $ mkdir foo
54
- $ cd foo
55
- $ shoe
83
+ $ shoe my_project
56
84
 
57
- This will generate <tt>README.rdoc</tt>, <tt>Rakefile</tt>,
58
- <tt>foo.gemspec</tt>, and <tt>lib/foo/version.rb</tt>.
85
+ If you're using {Bundler}[http://gembundler.com], see
86
+ {bundler.rdoc}[link:files/doc/bundler_rdoc.html] for some helpful tips.
59
87
 
60
- If you're using Bundler, see {BUNDLER.rdoc}[link:files/BUNDLER_rdoc.html] for more.
61
88
 
62
- == Send Me Feedback
89
+ == Contribute
63
90
 
64
- A number of these tasks are maybe less useful for you than they could be, probably because you and I use different conventions. If you have some ideas for making Shoe better, I'd love to hear them! Feel free to send issues / pull requests / messages through GitHub.
91
+ A number of these tasks are maybe less useful for you than they could be,
92
+ probably because you and I use different conventions. If you have some ideas
93
+ for making Shoe better, I'd love to hear them! Feel free to send issues / pull
94
+ requests / messages through GitHub.
65
95
 
66
96
  All the best, -- Matthew
data/TODO.rdoc CHANGED
@@ -1,8 +1,6 @@
1
1
  = Next Up
2
2
 
3
3
  * Help generate man pages?
4
- * Ditch cucumber tasks? (This moves us more into the pure-gemspec space.)
5
- * Use Gem::Validator to run tests.
6
- * Find a nicer way to express task dependencies; then maybe tasks could be used a la carte?
7
4
  * How would I incorporate Gem::Specification#add_bundler_dependencies?
8
- * Require a path argument for the shoe executable.
5
+ * Support any extension flavor that Rubygems supports, not just extconf.rb.
6
+ * Find a better way to clean; I don't want to whack .bundler and .rvmrc.
data/bin/shoe CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'shoe'
4
- Shoe::Generator.new.run
4
+ Shoe::Generator.new(*ARGV).run
@@ -0,0 +1,2 @@
1
+ default: --format progress --tags ~@wip
2
+ wip: --tags @wip --wip
@@ -1,4 +1,4 @@
1
- = Using Shoe with Bundler
1
+ = Using Shoe with {Bundler}[http://gembundler.com]
2
2
 
3
3
  Bootstrapping is a little chicken-and-egg-y, but with the following initial <tt>Gemfile</tt>:
4
4
 
@@ -8,7 +8,7 @@ Bootstrapping is a little chicken-and-egg-y, but with the following initial <tt>
8
8
  You should be able to:
9
9
 
10
10
  $ bundle install
11
- $ bundle exec shoe
11
+ $ bundle exec shoe .
12
12
 
13
13
  From there, I've been preferring <tt>`bundle exec bash`</tt> over <tt>`bundle
14
14
  exec rake`</tt> or using <tt>require 'bundler/setup'</tt> in my
@@ -11,8 +11,18 @@ Feature: Cucumber
11
11
  Scenario: Running rake --tasks in a shoe project with Cucumber features
12
12
  Given I have created a project called "my_project"
13
13
  And I have appended "gem 'cucumber'" to "my_project/Gemfile"
14
- And I have created a directory called "my_project/features"
14
+ And I have created a file called "my_project/cucumber.yml" containing:
15
+ """
16
+ default: --tags ~@wip
17
+ wip: --tags @wip --wip
18
+ """
15
19
  When I run bundle exec rake --tasks inside "my_project"
16
20
  Then I should see "rake cucumber" on standard out
17
21
  And I should see "rake cucumber:wip" on standard out
18
22
 
23
+ Scenario: Running rake --tasks in a shoe project with a bad cucumber.yml
24
+ Given I have created a project called "my_project"
25
+ And I have appended "gem 'cucumber'" to "my_project/Gemfile"
26
+ And I have created a file called "my_project/cucumber.yml" containing ""
27
+ When I run bundle exec rake --tasks inside "my_project"
28
+ Then I should not see "rake cucumber" on standard out
@@ -10,7 +10,7 @@ Feature: Getting started
10
10
  source :rubygems
11
11
  gem 'shoe', :group => :development
12
12
  """
13
- When I run bundle exec shoe inside "my_project"
13
+ When I run bundle exec shoe . inside "my_project"
14
14
  Then I should see a file "my_project/Rakefile"
15
15
  And I should see a file "my_project/README.rdoc"
16
16
  And I should see a file "my_project/lib/my_project/version.rb"
@@ -24,6 +24,6 @@ Feature: Getting started
24
24
  gem 'shoe', :group => :development
25
25
  """
26
26
  And I have created a file called "my_project/Rakefile" containing "# RAKEFILE CONTENTS"
27
- When I run bundle exec shoe inside "my_project"
27
+ When I run bundle exec shoe . inside "my_project"
28
28
  Then I should see "Rakefile exists. Not clobbering." on standard error
29
29
  And the contents of "my_project/Rakefile" should still be "# RAKEFILE CONTENTS"
@@ -4,7 +4,7 @@ Given /^I have created a project called "([^\"]*)"$/ do |name|
4
4
  source :rubygems
5
5
  gem 'shoe', :group => :development
6
6
  END
7
- run('bundle exec shoe', name)
7
+ run('bundle exec shoe .', name)
8
8
  end
9
9
 
10
10
  Given /^I have created a directory called "([^\"]*)"$/ do |name|
@@ -0,0 +1,18 @@
1
+ Feature: Test
2
+ In order to run tests
3
+ As a developer
4
+ I want shoe to give me a rake task
5
+
6
+ Scenario: Running rake --tasks in a shoe project without tests
7
+ Given I have created a project called "my_project"
8
+ And I have run git init inside "my_project"
9
+ When I run bundle exec rake --tasks inside "my_project"
10
+ Then I should not see "rake test" on standard out
11
+
12
+ Scenario: Running rake --tasks in a shoe project with tests
13
+ Given I have created a project called "my_project"
14
+ And I have run git init inside "my_project"
15
+ And I have created a directory called "my_project/test"
16
+ And I have created a file called "my_project/test/foo_test.rb" containing ""
17
+ When I run bundle exec rake --tasks inside "my_project"
18
+ Then I should see "rake test" on standard out
@@ -3,8 +3,8 @@ require 'pathname'
3
3
 
4
4
  module Shoe
5
5
  class Generator
6
- def initialize
7
- @root = Pathname.pwd.expand_path
6
+ def initialize(root)
7
+ @root = Pathname.new(root).expand_path
8
8
  @template_path = Pathname.new(__FILE__).dirname.join('templates')
9
9
  end
10
10
 
@@ -9,18 +9,18 @@ module Shoe
9
9
  autoload :Release, 'shoe/tasks/release'
10
10
  autoload :Test, 'shoe/tasks/test'
11
11
 
12
- LOAD_ORDER = %w(
12
+ NAMES = %w(
13
13
  Clean
14
+ Compile
15
+ Cucumber
14
16
  Rdoc
15
17
  Release
16
18
  Test
17
- Cucumber
18
- Compile
19
19
  )
20
20
 
21
21
  def self.define(spec)
22
- LOAD_ORDER.map { |name| const_get(name) }.
23
- each { |task| task.new(spec) }
22
+ NAMES.map { |name| const_get(name) }.
23
+ each { |task| task.new(spec) }
24
24
  end
25
25
 
26
26
  end
@@ -11,25 +11,18 @@ module Shoe
11
11
  Gem::Specification.load(spec)
12
12
  end
13
13
 
14
+ @spec.extend(LocalGemspecExtensions)
15
+
14
16
  if active?
15
17
  define
16
18
  end
17
19
  end
18
20
 
19
- def active?
20
- true
21
- end
22
-
23
21
  private
24
22
 
25
- def before(name, dependency)
26
- desc Rake::Task[dependency].comment
27
- task name => dependency
28
- end
29
-
30
- def before_existing(name, dependency)
31
- if Rake::Task.task_defined?(name)
32
- task name => dependency
23
+ module LocalGemspecExtensions #:nodoc:
24
+ def full_gem_path
25
+ Dir.pwd
33
26
  end
34
27
  end
35
28
 
@@ -1,6 +1,15 @@
1
1
  module Shoe
2
2
  module Tasks
3
3
 
4
+ # Defines <tt>`rake clean`</tt> to remove <tt>.gitignore</tt>d files and
5
+ # directories.
6
+ #
7
+ # Uses <tt>`{git clean}[http://www.kernel.org/pub/software/scm/git/docs/git-clean.html] -fdX`</tt>.
8
+ #
9
+ # To enable, version your project with git[http://git-scm.com].
10
+ #
11
+ # To configure, edit your
12
+ # <tt>{.gitignore}[http://www.kernel.org/pub/software/scm/git/docs/gitignore.html]</tt>.
4
13
  class Clean < Abstract
5
14
  def active?
6
15
  File.directory?('.git')
@@ -3,6 +3,16 @@ require 'rubygems/ext'
3
3
  module Shoe
4
4
  module Tasks
5
5
 
6
+ # Defines <tt>`rake compile`</tt> to build your C extensions.
7
+ #
8
+ # Uses
9
+ # <tt>{Gem::Ext::ExtConfBuilder}[http://rubygems.rubyforge.org/rubygems-update/Gem/Ext/ExtConfBuilder.html]</tt>,
10
+ # so extensions are compiled locally just as they will be with <tt>`gem
11
+ # install`</tt>. Your users will thank you.
12
+ #
13
+ # To enable and configure, add
14
+ # <tt>extensions[http://docs.rubygems.org/read/chapter/20#extensions]</tt>
15
+ # to your gemspec.
6
16
  class Compile < Abstract
7
17
  def active?
8
18
  !spec.extensions.empty?
@@ -26,14 +36,7 @@ module Shoe
26
36
  end
27
37
  end
28
38
 
29
- %w(
30
- test
31
- cucumber:ok
32
- cucumber:wip
33
- release
34
- ).each do |name|
35
- before_existing(name, :compile)
36
- end
39
+ task :prepare => :compile
37
40
  end
38
41
  end
39
42
 
@@ -1,9 +1,18 @@
1
+ require 'yaml'
2
+
1
3
  module Shoe
2
4
  module Tasks
3
5
 
6
+ # Defines <tt>`rake cucumber`</tt> and <tt>`rake cucumber:<PROFILE>`</tt> to
7
+ # run your Cucumber[http://cukes.info] features.
8
+ #
9
+ # <tt>`rake cucumber`</tt> will run features according to the <tt>default</tt> profile; <tt>`rake cucumber:foo`</tt> according to the <tt>foo</tt> profile.
10
+ #
11
+ # To enable and configure, create and edit your
12
+ # <tt>{cucumber.yml}[http://wiki.github.com/aslakhellesoy/cucumber/cucumberyml]</tt>.
4
13
  class Cucumber < Abstract
5
14
  def active?
6
- File.directory?('features')
15
+ !cucumber_profiles.empty?
7
16
  end
8
17
 
9
18
  def define
@@ -11,7 +20,7 @@ module Shoe
11
20
  require 'cucumber/rake/task'
12
21
  rescue LoadError
13
22
  warn 'cucumber',
14
- "Although you have a features directory, it seems you don't have cucumber installed.",
23
+ "Although you have a cucumber.yml, it seems you don't have cucumber installed.",
15
24
  "You probably want to add a \"gem 'cucumber'\" to your Gemfile."
16
25
  else
17
26
  define_tasks
@@ -21,18 +30,38 @@ module Shoe
21
30
  private
22
31
 
23
32
  def define_tasks
24
- namespace :cucumber do
25
- ::Cucumber::Rake::Task.new(:ok, 'Run features') do |task|
26
- task.cucumber_opts = '--tags ~@wip'
33
+ cucumber_profiles.each do |profile|
34
+ if profile == 'default'
35
+ define_default_task
36
+ else
37
+ define_profile_task(profile)
27
38
  end
39
+ end
40
+ end
28
41
 
29
- ::Cucumber::Rake::Task.new(:wip, 'Run work-in-progress features') do |task|
30
- task.cucumber_opts = '--tags @wip --wip'
31
- end
42
+ def cucumber_profiles
43
+ YAML.load_file('cucumber.yml').keys rescue []
44
+ end
45
+
46
+ def define_default_task
47
+ task :prepare
48
+
49
+ ::Cucumber::Rake::Task.new({ :cucumber => :prepare }, 'Run features') do |task|
50
+ task.profile = 'default'
32
51
  end
33
52
 
34
- before(:default, 'cucumber:ok')
35
- before(:default, 'cucumber:wip')
53
+ task :default
54
+ Rake.application[:default].prerequisites.push(Rake.application[:cucumber])
55
+ end
56
+
57
+ def define_profile_task(profile)
58
+ task :prepare
59
+
60
+ namespace :cucumber do
61
+ ::Cucumber::Rake::Task.new({ profile => :prepare }, "Run #{profile} features") do |task|
62
+ task.profile = profile
63
+ end
64
+ end
36
65
  end
37
66
  end
38
67
 
@@ -3,7 +3,30 @@ require 'rubygems/doc_manager'
3
3
  module Shoe
4
4
  module Tasks
5
5
 
6
+ # Defines <tt>`rake rdoc`</tt> to generate project documentation.
7
+ #
8
+ # Uses
9
+ # <tt>{Gem::DocManager}[http://rubygems.rubyforge.org/rubygems-update/Gem/DocManager.html]</tt>,
10
+ # so rdoc is generated locally just as it will be with <tt>`gem
11
+ # install`</tt> and <tt>`gem rdoc`</tt>. Your users will thank you for
12
+ # making sure their local documentation looks nice.
13
+ #
14
+ # (Incidentally, this is why Shoe prefers rdoc (the file format) over
15
+ # Markdown[http://daringfireball.net/projects/markdown/] and rdoc (the
16
+ # tool) over YARD[http://yardoc.org/], even though both have considerable
17
+ # advantages -- it's what your users are going to get!)
18
+ #
19
+ # This task is always enabled.
20
+ #
21
+ # To configure, add
22
+ # <tt>rdoc_options[http://docs.rubygems.org/read/chapter/20#rdoc_options]</tt> and
23
+ # <tt>extra_rdoc_files[http://docs.rubygems.org/read/chapter/20#extra_rdoc_files]</tt>
24
+ # to your gemspec.
6
25
  class Rdoc < Abstract
26
+ def active?
27
+ true
28
+ end
29
+
7
30
  def define
8
31
  desc 'Generate documentation'
9
32
  task :rdoc do
@@ -29,16 +52,8 @@ module Shoe
29
52
  @spec = spec
30
53
  @doc_dir = Dir.pwd
31
54
  @rdoc_args = []
32
- adjust_spec_so_that_we_can_generate_rdoc_locally
33
- end
34
-
35
- def adjust_spec_so_that_we_can_generate_rdoc_locally
36
- def @spec.full_gem_path
37
- Dir.pwd
38
- end
39
55
  end
40
56
  end
41
-
42
57
  end
43
58
 
44
59
  end
@@ -1,6 +1,30 @@
1
1
  module Shoe
2
2
  module Tasks
3
3
 
4
+ # Defines <tt>`rake release`</tt> to release your gem.
5
+ #
6
+ # To release is to: commit, tag, optionally push (with tags), and then
7
+ # build and push your gem.
8
+ #
9
+ # This task is enabled under very specific circumstances, to safeguard
10
+ # against accidental releases:
11
+ # 1. Your <tt>version[http://docs.rubygems.org/read/chapter/20#version]</tt> is greater than <tt>0.0.0</tt>.
12
+ # 2. There is no existing git tag <tt>"v#{version}"</tt>.
13
+ # 3. You are currently on the <tt>master</tt> branch.
14
+ #
15
+ # To configure, adjust the
16
+ # <tt>version[http://docs.rubygems.org/read/chapter/20#version]</tt> in
17
+ # your gemspec.
18
+ #
19
+ # = Semantic Versioning
20
+ #
21
+ # Shoe helps you follow the Tagging Specification of {Semantic
22
+ # Versioning}[http://semver.org] by tagging your releases as
23
+ # <tt>"v#{version}"</tt>, prefixing a <tt>"v"</tt> before the version
24
+ # number.
25
+ #
26
+ # Shoe additionally complains if you haven't yet created a <tt>semver</tt>
27
+ # tag to denote your compliance.
4
28
  class Release < Abstract
5
29
  def active?
6
30
  spec.extend(VersionExtensions)
@@ -1,22 +1,111 @@
1
- require 'rake/testtask'
1
+ require 'rubygems/validator'
2
+ require 'test/unit/ui/console/testrunner'
3
+
4
+ # Disable Test::Unit::AutoRunner.
5
+ #
6
+ # Though I tried to be really restrictive with the above testrunner require
7
+ # statement, test/unit itself still gets pulled in, activating the at_exit
8
+ # hook. Dang.
9
+ Test::Unit.run = true
2
10
 
3
11
  module Shoe
4
12
  module Tasks
5
13
 
6
- # MAYBE be a little more forgiving in test selection, using
7
- # test/**/*_test.rb. Or create suites based on subdirectory?
14
+ # Defines <tt>`rake test`</tt> to run your tests.
15
+ #
16
+ # Uses
17
+ # <tt>{Gem::Validator}[http://rubygems.rubyforge.org/rubygems-update/Gem/Validator.html]</tt>,
18
+ # so tests are run locally just as they will be with <tt>`{gem
19
+ # check}[http://docs.rubygems.org/read/chapter/10#page30] --test
20
+ # your_project`</tt>.
21
+ #
22
+ # (Incidentally, this ensures your tests _are_ runnable via <tt>`gem
23
+ # check`</tt>, a forgotten command second only to <tt>`{gem
24
+ # cert}[http://docs.rubygems.org/read/chapter/10#page93]`</tt> in its
25
+ # underuse.)
26
+ #
27
+ # To enable and configure, edit the
28
+ # <tt>test_files[http://docs.rubygems.org/read/chapter/20#test_files]</tt>
29
+ # in your gemspec.
30
+ #
31
+ # = <tt>Test::Unit</tt>
32
+ #
33
+ # Using <tt>Gem::Validator</tt> in this way means that you *must* use
34
+ # <tt>Test::Unit</tt> in all of your
35
+ # <tt>test_files[http://docs</tt>.rubygems.org/read/chapter/20#test_files]
36
+ # -- if you prefer Rspec[http://rspec.info], just leave <tt>test_files</tt>
37
+ # blank and set up your own Rake task.
38
+ #
39
+ # = <tt>$LOAD_PATH</tt>
40
+ #
41
+ # At test time, the root of your gem, any
42
+ # <tt>{require_paths}[http://docs.rubygems.org/read/chapter/20#require_paths]</tt>,
43
+ # and any
44
+ # <tt>{dependencies}[http://docs.rubygems.org/read/chapter/20#dependencies]</tt>
45
+ # are on the <tt>$LOAD_PATH</tt>.
46
+ #
47
+ # <b>Bad:</b>
48
+ #
49
+ # # Don't do this; test_helper's not in the $LOAD_PATH
50
+ # require 'test_helper'
51
+ #
52
+ # <b>Good:</b>
53
+ #
54
+ # require 'test/test_helper'
55
+ #
8
56
  class Test < Abstract
9
57
  def active?
10
- File.directory?('test')
58
+ !spec.test_files.empty?
11
59
  end
12
60
 
13
61
  def define
14
- Rake::TestTask.new do |task|
15
- task.libs = ['lib', 'test']
16
- task.pattern = 'test/*_test.rb'
62
+ desc 'Run tests'
63
+ task :test do
64
+ Gem.source_index.extend(LocalGemSourceIndex)
65
+ Gem.source_index.local_gemspec = spec
66
+
67
+ Gem::Validator.send(:remove_const, :TestRunner)
68
+ Gem::Validator.const_set(:TestRunner, LocalTestRunner)
69
+ Gem::Validator.new.extend(LocalGemValidator).unit_test(spec)
70
+ end
71
+
72
+ task :prepare
73
+ task :test => :prepare
74
+
75
+ task :default
76
+ Rake.application[:default].prerequisites.unshift(Rake.application[:test])
77
+ end
78
+
79
+ private
80
+
81
+ module LocalGemSourceIndex #:nodoc:
82
+ attr_accessor :local_gemspec
83
+
84
+ def find_name(*args)
85
+ if args.first == local_gemspec.name
86
+ [local_gemspec]
87
+ else
88
+ super
89
+ end
90
+ end
91
+ end
92
+
93
+ module LocalGemValidator #:nodoc:
94
+ def alert_error(*args)
95
+ # no-op
17
96
  end
18
97
 
19
- before(:default, :test)
98
+ def unit_test(*args)
99
+ unless super.passed?
100
+ exit 1
101
+ end
102
+ end
103
+ end
104
+
105
+ class LocalTestRunner < ::Test::Unit::UI::Console::TestRunner #:nodoc:
106
+ def self.run(*args)
107
+ new(args.first, ::Test::Unit::UI::NORMAL).start
108
+ end
20
109
  end
21
110
  end
22
111
 
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.files = spec.git_files
26
26
  spec.executables = spec.git_files('bin/*').map &File.method(:basename)
27
27
  spec.extensions = spec.git_files('ext/**/extconf.rb')
28
+ spec.test_files = spec.git_files('test/{,**/}*_test.rb')
28
29
 
29
30
  spec.extra_rdoc_files = spec.git_files('{,**/}*.rdoc')
30
31
  spec.rdoc_options = %W(
@@ -1,3 +1,3 @@
1
1
  module Shoe
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0'
3
3
  end
@@ -5,8 +5,13 @@ Gem::Specification.new do |spec|
5
5
  spec.name = 'shoe'
6
6
  spec.version = Shoe::VERSION
7
7
 
8
- spec.summary = 'Another take on hoe, jeweler & friends.'
9
- spec.description = spec.summary
8
+ spec.summary = 'An ecosystem-friendly library of Rake tasks for your gem.'
9
+ spec.description = <<-END.gsub(/^\s*/, '')
10
+ Shoe assumes you could be using any number of other tools -- bundler,
11
+ cucumber, git, rip, rubygems -- and so leans hard on them for the things
12
+ they do well, relegating command-line rake to mere syntactic sugar.
13
+ END
14
+
10
15
  spec.author = 'Matthew Todd'
11
16
  spec.email = 'matthew.todd@gmail.com'
12
17
  spec.homepage = 'http://github.com/matthewtodd/shoe'
@@ -23,6 +28,7 @@ Gem::Specification.new do |spec|
23
28
  spec.files = spec.git_files
24
29
  spec.executables = spec.git_files('bin/*').map &File.method(:basename)
25
30
  spec.extensions = spec.git_files('ext/**/extconf.rb')
31
+ spec.test_files = spec.git_files('test/{,**/}*_test.rb')
26
32
 
27
33
  spec.extra_rdoc_files = spec.git_files('{,**/}*.rdoc')
28
34
  spec.rdoc_options = %W(
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 4
7
+ - 5
8
8
  - 0
9
- version: 0.4.0
9
+ version: 0.5.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Matthew Todd
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-07 00:00:00 +03:00
17
+ date: 2010-04-08 00:00:00 +03:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -41,20 +41,23 @@ dependencies:
41
41
  version: "0"
42
42
  type: :development
43
43
  version_requirements: *id002
44
- description: Another take on hoe, jeweler & friends.
44
+ description: |
45
+ Shoe assumes you could be using any number of other tools -- bundler,
46
+ cucumber, git, rip, rubygems -- and so leans hard on them for the things
47
+ they do well, relegating command-line rake to mere syntactic sugar.
48
+
45
49
  email: matthew.todd@gmail.com
46
50
  executables:
47
51
  - shoe
48
52
  extensions: []
49
53
 
50
54
  extra_rdoc_files:
51
- - BUNDLER.rdoc
52
55
  - CHANGELOG.rdoc
53
56
  - README.rdoc
54
57
  - TODO.rdoc
58
+ - doc/bundler.rdoc
55
59
  files:
56
60
  - .gitignore
57
- - BUNDLER.rdoc
58
61
  - CHANGELOG.rdoc
59
62
  - Gemfile
60
63
  - Gemfile.lock
@@ -62,11 +65,14 @@ files:
62
65
  - Rakefile
63
66
  - TODO.rdoc
64
67
  - bin/shoe
68
+ - cucumber.yml
69
+ - doc/bundler.rdoc
65
70
  - features/cucumber.feature
66
71
  - features/getting_started.feature
67
72
  - features/release.feature
68
73
  - features/step_definitions/shoe_steps.rb
69
74
  - features/support/env.rb
75
+ - features/test.feature
70
76
  - lib/shoe.rb
71
77
  - lib/shoe/generator.rb
72
78
  - lib/shoe/tasks.rb
@@ -92,7 +98,7 @@ rdoc_options:
92
98
  - --main
93
99
  - README.rdoc
94
100
  - --title
95
- - shoe-0.4.0
101
+ - shoe-0.5.0
96
102
  - --inline-source
97
103
  require_paths:
98
104
  - lib
@@ -118,6 +124,6 @@ rubyforge_project:
118
124
  rubygems_version: 1.3.6
119
125
  signing_key:
120
126
  specification_version: 3
121
- summary: Another take on hoe, jeweler & friends.
127
+ summary: An ecosystem-friendly library of Rake tasks for your gem.
122
128
  test_files: []
123
129