shoe 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/CHANGELOG.rdoc +10 -0
  2. data/README.rdoc +2 -4
  3. data/TODO.rdoc +8 -2
  4. data/data/shoe/templates/extension.erb +18 -2
  5. data/data/shoe/templates/gemspec.erb +5 -13
  6. data/data/shoe/templates/{manpage.erb → manpage_1.erb} +3 -4
  7. data/data/shoe/templates/manpage_3.erb +19 -0
  8. data/lib/shoe.rb +1 -1
  9. data/lib/shoe/extensions.rb +1 -0
  10. data/lib/shoe/extensions/option_parser.rb +5 -7
  11. data/lib/shoe/extensions/test_runner.rb +28 -0
  12. data/lib/shoe/extensions/validator.rb +16 -4
  13. data/lib/shoe/generator.rb +2 -1
  14. data/lib/shoe/tasks/clean.rb +20 -3
  15. data/lib/shoe/tasks/compile.rb +5 -1
  16. data/lib/shoe/tasks/cucumber.rb +2 -2
  17. data/lib/shoe/tasks/rdoc.rb +6 -1
  18. data/lib/shoe/tasks/release.rb +1 -1
  19. data/lib/shoe/tasks/ronn.rb +8 -4
  20. data/lib/shoe/tasks/test.rb +33 -16
  21. data/man/shoe.1 +9 -10
  22. data/man/shoe.1.ronn +13 -16
  23. data/man/shoe.3 +68 -0
  24. data/man/shoe.3.ronn +64 -0
  25. data/test/extensions/fake_rubygems_server.rb +62 -0
  26. data/test/extensions/helper_methods.rb +73 -0
  27. data/test/extensions/isolated_environment.rb +50 -0
  28. data/test/extensions/test_case.rb +40 -0
  29. data/test/helper.rb +20 -0
  30. data/test/system/rake_clean_test.rb +36 -0
  31. data/test/system/rake_compile_test.rb +25 -0
  32. data/test/system/rake_cucumber_test.rb +51 -0
  33. data/test/system/rake_rdoc_test.rb +26 -0
  34. data/test/system/rake_release_test.rb +94 -0
  35. data/test/system/rake_ronn_test.rb +25 -0
  36. data/test/system/rake_test_test.rb +45 -0
  37. data/test/system/shoe_test.rb +79 -0
  38. metadata +48 -26
  39. data/.gitignore +0 -4
  40. data/BUNDLER.rdoc +0 -16
  41. data/Gemfile +0 -9
  42. data/Gemfile.lock +0 -49
  43. data/Rakefile +0 -4
  44. data/cucumber.yml +0 -2
  45. data/features/cucumber.feature +0 -27
  46. data/features/generator.feature +0 -32
  47. data/features/release.feature +0 -33
  48. data/features/step_definitions/shoe_steps.rb +0 -39
  49. data/features/support/env.rb +0 -69
  50. data/features/test.feature +0 -18
  51. data/shoe.gemspec +0 -44
@@ -1,3 +1,13 @@
1
+ == Git
2
+
3
+ * Generated C extension actually works now.
4
+ * `rake test` now properly depends on `rake compile`.
5
+ * Run Gem::Validator tests via Test::Unit::AutoRunner, so that redgreen has a chance to color the dots as well as the result line.
6
+ * Generated gemspec now selects files with Dir.glob instead of `git ls-files`.
7
+ * Always generate a section 3 manpage.
8
+ * `rake clean` now preserves <tt>.bundle/</tt> and <tt>.rvmrc</tt>.
9
+ * Include C extensions in RDoc.
10
+
1
11
  == 0.6.1 -- 2010 April 22
2
12
 
3
13
  * Reformat warning messages.
@@ -38,7 +38,8 @@ Shoe is an ecosystem-friendly library of Rake tasks for your gem.
38
38
  Shoe::Tasks accept no direct configuration. Instead, they rely on your project environment:
39
39
 
40
40
  Shoe::Tasks::Clean::
41
- calls <tt>`git clean -fdX`</tt>.
41
+ calls something like <tt>`git clean -fdX`</tt>, but preserves
42
+ <tt>.bundle/</tt> and <tt>.rvmrc</tt>.
42
43
 
43
44
  Shoe::Tasks::Compile::
44
45
  builds the
@@ -102,9 +103,6 @@ Or, if you have <tt>{gem-man}[http://github.com/defunkt/gem-man]</tt> installed:
102
103
 
103
104
  $ gem man shoe
104
105
 
105
- Also, if you're using {Bundler}[http://gembundler.com], see
106
- <tt>BUNDLER.rdoc</tt> for some helpful tips.
107
-
108
106
 
109
107
  == Contribute
110
108
 
data/TODO.rdoc CHANGED
@@ -1,6 +1,12 @@
1
1
  = Next Up
2
2
 
3
+ * Remove Launchy? (Follow hub's lead.)
4
+ * Start running on 1.9: Gem::Validator uses MiniTest::Unit.
5
+
6
+ = Someday Maybe
7
+
8
+ * Re-think focus: probably want to ditch cucumber, since I'm not using it for shoe?
9
+ * Document rake task hooks prepare:execute and prepare:release.
10
+ * Use a generator framework?
3
11
  * Generator should do the right thing when the base directory has a dash in it.
4
- * Find a better way to clean; I don't want to whack .bundler and .rvmrc.
5
12
  * Add :only/:except options to Shoe::Tasks.define.
6
- * Port cucumber features to Test::Unit so they'll be run under `gem check --test shoe`.
@@ -3,7 +3,23 @@
3
3
  static VALUE m<%= module_name %>;
4
4
  static VALUE m<%= extension_module_name %>;
5
5
 
6
- void Init_ext() {
6
+ /*
7
+ * Document-class: <%= extension_module_name %>
8
+ * Document-method: run
9
+ *
10
+ * call-seq:
11
+ * run -> nil
12
+ *
13
+ */
14
+ static VALUE run(VALUE self) {
15
+ return Qnil;
16
+ }
17
+
18
+ /*
19
+ * Documentation for <%= extension_module_name %>.
20
+ */
21
+ void Init_extension() {
7
22
  m<%= module_name %> = rb_define_module("<%= module_name %>");
8
- m<%= extension_module_name %> = rb_define_module_under("<%= module_name %>", "<%= extension_module_name %>");
23
+ m<%= extension_module_name %> = rb_define_module_under(m<%= module_name %>, "<%= extension_module_name %>");
24
+ rb_define_method(m<%= extension_module_name %>, "run", run, 0);
9
25
  }
@@ -26,22 +26,14 @@ Gem::Specification.new do |spec|
26
26
  # spec.add_development_dependency 'ronn'
27
27
  spec.add_development_dependency 'shoe'
28
28
 
29
- # This may not be the best way to select files for inclusion in your gem, but
30
- # it does at least honor your .gitignore, keeping that bit of your
31
- # configuration DRY. Alternatively, you could use more explicit Dir.glob
32
- # patterns or even try reading a Manifest file, hoe-style.
33
- def spec.git_files(glob=nil)
34
- `git ls-files -z --cached --other --exclude-standard #{glob}`.split("\0")
35
- end
36
-
37
29
  # The kooky &File.method(:basename) trick keeps us from accidentally
38
30
  # shadowing a variable named "file" in the context that evaluates this
39
31
  # gemspec. I actually ran into this problem with Bundler!
40
- spec.files = spec.git_files
41
- spec.executables = spec.git_files('bin/*').map &File.method(:basename)
42
- spec.extensions = spec.git_files('ext/**/extconf.rb')
43
- spec.extra_rdoc_files = spec.git_files('{,**/}*.rdoc')
44
- spec.test_files = spec.git_files('test/{,**/}*_test.rb')
32
+ spec.files = Dir['**/*.rdoc', 'bin/*', 'data/**/*', 'ext/**/*.{rb,c}', 'lib/**/*.rb', 'man/**/*', 'test/**/*.rb']
33
+ spec.executables = Dir['bin/*'].map &File.method(:basename)
34
+ spec.extensions = Dir['ext/**/extconf.rb']
35
+ spec.extra_rdoc_files = Dir['**/*.rdoc', 'ext/**/*.c']
36
+ spec.test_files = Dir['test/**/*_test.rb']
45
37
 
46
38
  spec.rdoc_options = %W(
47
39
  --main README.rdoc
@@ -18,13 +18,12 @@ Write your description here.
18
18
 
19
19
  * `-v`, `--version`[=all]:
20
20
  Print `<%= name %>`'s version number and exit. If `=all` is given, also print
21
- version numbers of `<%= name %>`'s dependencies. (This is standard `optparse` behavior
22
- that deserves more attention!)
21
+ version numbers of `<%= name %>`'s dependencies.
23
22
 
24
23
  ## AUTHOR
25
24
 
26
- <%= `git config --get user.name`.chomp %> <<%= `git config --get user.email`.chomp %>>
25
+ <%= `git config --get user.name`.chomp %>, [<%= `git config --get github.user`.chomp %>](http://github.com/<%= `git config --get github.user`.chomp %>) on GitHub.
27
26
 
28
27
  ## SEE ALSO
29
28
 
30
- ruby(1)
29
+ <%= name %>(3)
@@ -0,0 +1,19 @@
1
+ <%= name %>(3) --
2
+ =================
3
+
4
+ ## SYNOPSIS
5
+
6
+ `require '<%= name %>'`
7
+ <%= module_name %>.somthing(_parameter_)
8
+
9
+ ## DESCRIPTION
10
+
11
+ Write your description here.
12
+
13
+ ## AUTHOR
14
+
15
+ <%= `git config --get user.name`.chomp %>, [<%= `git config --get github.user`.chomp %>](http://github.com/<%= `git config --get github.user`.chomp %>) on GitHub.
16
+
17
+ ## SEE ALSO
18
+
19
+ ruby(1)
@@ -3,7 +3,7 @@ require 'rbconfig'
3
3
  require 'rbconfig/datadir'
4
4
 
5
5
  module Shoe
6
- VERSION = '0.6.1'
6
+ VERSION = '0.6.2'
7
7
 
8
8
  autoload :Extensions, 'shoe/extensions'
9
9
  autoload :Generator, 'shoe/generator'
@@ -5,6 +5,7 @@ module Shoe
5
5
  autoload :Pathname, 'shoe/extensions/pathname'
6
6
  autoload :SourceIndex, 'shoe/extensions/source_index'
7
7
  autoload :Specification, 'shoe/extensions/specification'
8
+ autoload :TestRunner, 'shoe/extensions/test_runner'
8
9
  autoload :Validator, 'shoe/extensions/validator'
9
10
  end
10
11
  end
@@ -13,7 +13,7 @@ module Shoe
13
13
  # To use:
14
14
  # parser = OptionsParser.new do |opts|
15
15
  # opts.extend(Shoe::Extensions::OptionParser)
16
- # opts.defaults = %w(--foo --no-bar --baz=5)
16
+ # opts.defaults = %w(--foo --no-bar --baz=42)
17
17
  # # ... and so on ...
18
18
  # end
19
19
  #
@@ -26,11 +26,9 @@ module Shoe
26
26
  end
27
27
 
28
28
  def order(*args, &block)
29
- begin
30
- super(*defaults.followed_by(*args), &block)
31
- rescue ::OptionParser::ParseError
32
- abort($!)
33
- end
29
+ super(*defaults.followed_by(*args), &block)
30
+ rescue ::OptionParser::ParseError
31
+ abort($!)
34
32
  end
35
33
 
36
34
  def help
@@ -41,7 +39,7 @@ module Shoe
41
39
 
42
40
  module Defaults #:nodoc:
43
41
  def followed_by(*args)
44
- dup.concat(*args)
42
+ dup.concat(args.flatten)
45
43
  end
46
44
 
47
45
  def help(before, indent)
@@ -0,0 +1,28 @@
1
+ module Shoe
2
+ module Extensions
3
+
4
+ module TestRunner
5
+ # Conforms the normal TestRunner interface to the slightly different form
6
+ # called by Gem::Validator.
7
+ #
8
+ # Note that we use Test::Unit::AutoRunner (rather than going directly for
9
+ # Test::Unit::UI::Console::TestRunner) in order to give redgreen a chance
10
+ # to register itself, should it have been required in one of the
11
+ # test_files.
12
+ def self.run(suite, ui)
13
+ runner = Test::Unit::AutoRunner.new(false)
14
+ runner.collector = lambda { suite }
15
+ runner.run.extend(BooleanPassed)
16
+ end
17
+
18
+ private
19
+
20
+ module BooleanPassed #:nodoc:
21
+ def passed?
22
+ self
23
+ end
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -2,12 +2,24 @@ module Shoe
2
2
  module Extensions
3
3
 
4
4
  module Validator
5
- def alert_error(*args)
6
- # no-op
5
+ def self.extended(base)
6
+ base.send :include, InstanceMethods
7
+ base.test_runner = TestRunner
7
8
  end
8
9
 
9
- def unit_test(*args)
10
- exit(1) unless super.passed?
10
+ def test_runner=(klass)
11
+ remove_const :TestRunner
12
+ const_set :TestRunner, klass
13
+ end
14
+
15
+ module InstanceMethods #:nodoc:
16
+ def alert_error(*args)
17
+ # no-op
18
+ end
19
+
20
+ def unit_test(*args)
21
+ exit(1) unless super.passed?
22
+ end
11
23
  end
12
24
  end
13
25
 
@@ -52,11 +52,12 @@ module Shoe
52
52
  install('rakefile.erb', 'Rakefile')
53
53
  install('gemspec.erb', "#{name}.gemspec")
54
54
  install('module.erb', "lib/#{name}.rb")
55
+ install('manpage_3.erb', "man/#{name}.3.ronn")
55
56
 
56
57
  if application?
57
58
  install('executable.erb', "bin/#{name}", 0755)
58
59
  install('application.erb', "lib/#{name}/application.rb")
59
- install('manpage.erb', "man/#{name}.1.ronn")
60
+ install('manpage_1.erb', "man/#{name}.1.ronn")
60
61
  end
61
62
 
62
63
  if data?
@@ -4,7 +4,9 @@ module Shoe
4
4
  # Defines <tt>`rake clean`</tt> to remove <tt>.gitignore</tt>d files and
5
5
  # directories.
6
6
  #
7
- # Uses <tt>`{git clean}[http://www.kernel.org/pub/software/scm/git/docs/git-clean.html] -fdX`</tt>.
7
+ # Uses something like <tt>`{git
8
+ # clean}[http://www.kernel.org/pub/software/scm/git/docs/git-clean.html]
9
+ # -fdX`</tt>, except preserves <tt>.bundle/</tt> and <tt>.rvmrc</tt>.
8
10
  #
9
11
  # To enable, version your project with git[http://git-scm.com].
10
12
  #
@@ -16,11 +18,26 @@ module Shoe
16
18
  end
17
19
 
18
20
  def define
19
- desc 'Remove ignored files'
21
+ desc <<-END.gsub(/^ */, '')
22
+ Remove ignored files.
23
+ Configure via your .gitignore file. Uses something like `git clean -fdX`,
24
+ except preserves .bundle/ and .rvmrc.
25
+ END
26
+
20
27
  task :clean do
21
- sh 'git clean -fdX'
28
+ rm_r ignored_files - preserved_files
22
29
  end
23
30
  end
31
+
32
+ private
33
+
34
+ def ignored_files
35
+ `git ls-files -z --exclude-standard --ignored --others --directory`.split("\0")
36
+ end
37
+
38
+ def preserved_files
39
+ %w( .bundle/ .rvmrc )
40
+ end
24
41
  end
25
42
 
26
43
  end
@@ -19,7 +19,11 @@ module Shoe
19
19
  end
20
20
 
21
21
  def define
22
- desc 'Compile C extensions'
22
+ desc <<-END.gsub(/^ */, '')
23
+ Compile C extensions.
24
+ Configure via the `extensions` field in #{spec.name}.gemspec.
25
+ END
26
+
23
27
  task :compile do
24
28
  top_level_path = File.expand_path('.')
25
29
  destination_path = File.join(top_level_path, spec.require_paths.first)
@@ -48,7 +48,7 @@ module Shoe
48
48
  task :execute
49
49
  end
50
50
 
51
- ::Cucumber::Rake::Task.new({ :cucumber => 'prepare:execute' }, 'Run features') do |task|
51
+ ::Cucumber::Rake::Task.new({ :cucumber => 'prepare:execute' }, "Run features.\nConfigure via the default profile in cucumber.yml.") do |task|
52
52
  task.profile = 'default'
53
53
  end
54
54
 
@@ -61,7 +61,7 @@ module Shoe
61
61
  end
62
62
 
63
63
  namespace :cucumber do
64
- ::Cucumber::Rake::Task.new({ profile => 'prepare:execute' }, "Run #{profile} features") do |task|
64
+ ::Cucumber::Rake::Task.new({ profile => 'prepare:execute' }, "Run #{profile} features.\nConfigure via the #{profile} profile in cucumber.yml.") do |task|
65
65
  task.profile = profile
66
66
  end
67
67
  end
@@ -29,7 +29,12 @@ module Shoe
29
29
  end
30
30
 
31
31
  def define
32
- desc 'Generate documentation'
32
+ desc <<-END.gsub(/^ */, '')
33
+ Generate documentation.
34
+ Configure via the `rdoc_options` and `extra_rdoc_files` fields in
35
+ #{spec.name}.gemspec. Open in a different browser by setting the
36
+ BROWSER environment variable.
37
+ END
33
38
  task :rdoc do
34
39
  Gem::DocManager.new(spec).extend(Extensions::DocManager).generate_rdoc
35
40
  Launchy::Browser.run('rdoc/index.html')
@@ -33,7 +33,7 @@ module Shoe
33
33
  end
34
34
 
35
35
  def define
36
- desc "Release #{spec.full_name}"
36
+ desc "Release #{spec.full_name}."
37
37
  task :release do
38
38
  sh "git commit -a -m 'Release #{spec.version}'"
39
39
  sh "git tag #{version_tag(spec.version)}"
@@ -14,9 +14,8 @@ module Shoe
14
14
  #
15
15
  # == Notes
16
16
  #
17
- # * It's best to check the generated man pages into version control so
18
- # they'll be included in your gem for
19
- # {gem-man}[http://github.com/defunkt/gem-man].
17
+ # * It's best to include the generated man pages in your gem, so that
18
+ # {gem-man}[http://github.com/defunkt/gem-man] can get to them.
20
19
  #
21
20
  # * Ronn becomes a prerequisite for Release, so your man pages are sure to
22
21
  # be up-to-date.
@@ -42,7 +41,12 @@ module Shoe
42
41
  private
43
42
 
44
43
  def define_tasks
45
- desc 'Generate man pages'
44
+ desc <<-END.gsub(/^ */, '')
45
+ Generate man pages.
46
+ Configure via the `date` and `authors` fields in #{spec.name}.gemspec.
47
+ Uses ronn sources in man/*.ronn.
48
+ END
49
+
46
50
  task :ronn => 'ronn:build' do
47
51
  sh 'man', *man_files
48
52
  end
@@ -44,45 +44,62 @@ module Shoe
44
44
  # <tt>{dependencies}[http://docs.rubygems.org/read/chapter/20#dependencies]</tt>
45
45
  # are on the <tt>$LOAD_PATH</tt>.
46
46
  #
47
- # <b>Bad:</b>
47
+ # <b>Wrong:</b>
48
48
  #
49
49
  # # Don't do this; test_helper's not in the $LOAD_PATH
50
50
  # require 'test_helper'
51
51
  #
52
- # <b>Good:</b>
52
+ # <b>Right:</b>
53
53
  #
54
54
  # require 'test/test_helper'
55
55
  #
56
+ # = Pretty Colors
57
+ #
58
+ # If you like pretty colors (I do!), just <tt>require
59
+ # '{redgreen}[http://rubygems.org/gems/redgreen]'</tt> in your tests. The
60
+ # <tt>Gem::Validator</tt> has been configured to play nicely with it.
61
+ #
62
+ # <b>Wrong:</b>
63
+ #
64
+ # # Don't do this; it breaks `gem check --test` if redgreen's not installed.
65
+ # require 'redgreen' if $stdout.tty?
66
+ #
67
+ # <b>Right:</b>
68
+ #
69
+ # begin
70
+ # require 'redgreen' if $stdout.tty?
71
+ # rescue LoadError
72
+ # # No colors, but `gem check --test` is golden!
73
+ # end
74
+ #
56
75
  class Test < Abstract
57
76
  def active?
58
77
  !spec.test_files.empty?
59
78
  end
60
79
 
61
80
  def define
62
- desc 'Run tests'
81
+ desc <<-END.gsub(/^ */, '')
82
+ Run tests.
83
+ Configure via the `test_files` field in #{spec.name}.gemspec.
84
+ END
85
+
63
86
  task :test do
64
87
  Gem.source_index.extend(Extensions::SourceIndex)
65
88
  Gem.source_index.local_gemspec = spec
66
89
 
67
- Gem::Validator.send(:remove_const, :TestRunner)
68
- Gem::Validator.const_set(:TestRunner, LocalTestRunner)
69
- Gem::Validator.new.extend(Extensions::Validator).unit_test(spec)
90
+ Gem::Validator.extend(Extensions::Validator)
91
+ Gem::Validator.new.unit_test(spec)
70
92
  end
71
93
 
72
- task :prepare
73
- task :test => :prepare
94
+ namespace :prepare do
95
+ task :execute
96
+ end
97
+
98
+ task :test => 'prepare:execute'
74
99
 
75
100
  task :default
76
101
  Rake.application[:default].prerequisites.unshift(Rake.application[:test])
77
102
  end
78
-
79
- private
80
-
81
- class LocalTestRunner < ::Test::Unit::UI::Console::TestRunner #:nodoc:
82
- def self.run(*args)
83
- new(args.first, ::Test::Unit::UI::NORMAL).start
84
- end
85
- end
86
103
  end
87
104
 
88
105
  end