shoe 0.6.1 → 0.6.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 (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