gemma 1.0.0 → 2.0.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.
@@ -2,18 +2,27 @@
2
2
 
3
3
  http://github.com/jdleesmiller/gemma
4
4
 
5
+ http://github.com/jdleesmiller/gemma/wiki
6
+
5
7
  == SYNOPSIS
6
8
 
7
9
  Gemma is a gem development helper like hoe and jeweler, but it keeps the
8
- gemspec in a gemspec file, where it belongs, instead of in your Rakefile.
9
- This helps your gem to play nicely with commands like gem and bundle, and it
10
- allows gemma to provide rake tasks with sensible defaults for many common gem
10
+ +gemspec+ in a <tt>.gemspec</tt> file, instead of in a +Rakefile+. This helps
11
+ your gem to play nicely with commands like +gem+ and +bundle+, and it allows
12
+ gemma to provide +rake+ tasks with sensible defaults for many common gem
11
13
  development tasks.
12
14
 
13
- See also http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended for more
14
- background.
15
+ See http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended for some reasons
16
+ why you probably want a <tt>.gemspec</tt> file in your gem's repository.
17
+
18
+ === Usage
19
+
20
+ See the project wiki for tutorials and guides:
21
+ https://github.com/jdleesmiller/gemma/wiki
22
+
23
+ Briefly:
15
24
 
16
- === To Create a New Gem
25
+ ==== Create a New Gem
17
26
 
18
27
  Gemma has a simple interactive gem scaffolding tool; run
19
28
  gemma new
@@ -21,57 +30,59 @@ and follow the prompts. (Run with -h for help.)
21
30
 
22
31
  This gives you a simple gem template like the following:
23
32
 
24
- my_new_gem
33
+ my_gem
25
34
  |-- bin
26
- | +-- my_new_gem # executable (optional)
27
- |-- .gitignore # helpful if you're using git
28
- |-- lib
29
- | |-- my_new_gem
30
- | | +-- version.rb # the one and only version constant
31
- | +-- my_new_gem.rb # the main code file
32
- |-- my_new_gem.gemspec # gem metadata
33
- |-- Rakefile.rb # development tasks
34
- |-- README.rdoc # documentation
35
- +-- test
36
- +-- test_my_new_gem.rb # unit tests with test/unit (optional)
35
+ | `-- my_gem # executable (optional)
36
+ |-- Gemfile # for bundler (see below)
37
+ |-- lib
38
+ | |-- my_gem # most of your code goes here
39
+ | | `-- version.rb # the version constant
40
+ | `-- my_gem.rb # the main code file
41
+ |-- my_gem.gemspec # gem metadata
42
+ |-- Rakefile.rb # development tasks
43
+ |-- README.rdoc # documentation
44
+ `-- test # unit tests go here
45
+ `-- my_gem
46
+ `-- my_gem_test.rb
37
47
 
38
48
  Things you need to change in the template are marked with a +TODO+ tag.
39
49
 
40
- === To Modify an Existing Gem to use Gemma
50
+ ==== To Modify an Existing Gem to use Gemma
41
51
 
42
- First you have to have a <tt>.gemspec</tt> file. See
43
- http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended
44
- for a template and advice, and see
45
- http://docs.rubygems.org/read/chapter/20
46
- for reference material. If you have been using hoe or jeweler, you already
47
- have all of the information in your Rakefile, so you just have to move it into
48
- a <tt>.gemspec</tt> file.
52
+ The main thing you need is a <tt>.gemspec</tt> file. If you have been using hoe
53
+ or jeweler, you already have all of the information in your Rakefile, so you
54
+ just have to move it into a <tt>.gemspec</tt> file.
49
55
 
50
56
  Gemma provides rake tasks with sensible defaults based on the contents of
51
57
  your gemspec; to enable them, add the following to the top of your +Rakefile+:
52
- begin
53
- require 'rubygems'
54
- require 'gemma'
55
-
56
- Gemma::RakeTasks.with_gemspec_file 'my_gem.gemspec'
57
- rescue LoadError
58
- # Gemma is not installed; print an (optional) message:
59
- puts "Install gemma (sudo gem install gemma) for standard rake tasks."
60
- end
58
+
59
+ require 'rubygems'
60
+ require 'bundler/setup'
61
+ require 'gemma'
62
+
63
+ Gemma::RakeTasks.with_gemspec_file 'my_gem.gemspec'
64
+
65
+ task :default => :test
61
66
 
62
67
  This gives you some standard rake tasks, in addition to any that you define
63
- yourself. (Note that the yard task only appears if you have the yard (yardoc)
64
- gem installed.)
68
+ yourself.
69
+
70
+ ==== The Standard Tasks
71
+
72
+ Run <tt>rake -T</tt> for a full list of tasks.
65
73
 
74
+ % rake -T
75
+ rake build # Build my_gem-0.0.1.gem into the pkg directory
66
76
  rake clean # Remove any temporary products.
67
77
  rake clobber # Remove any generated file.
68
- rake rcov # Analyze code coverage with tests
69
- rake rdoc # Build the rdoc HTML Files
78
+ rake clobber_rdoc # Remove RDoc HTML files
79
+ rake install # Build and install my_gem-0.0.1.gem into system gems
80
+ rake my_gem[args] # run my_gem
81
+ rake rdoc # Build RDoc HTML files
82
+ rake release # Create tag v0.0.1 and build and push my_gem-0.0.1.gem ...
83
+ rake rerdoc # Rebuild RDoc HTML files
70
84
  rake test # Run tests
71
85
  rake yard # Generate YARD Documentation
72
- ... and more!
73
-
74
- Run <tt>rake -T</tt> for a full list of tasks.
75
86
 
76
87
  You can customize the standard tasks by passing a block to +with_gemspec_file+:
77
88
 
@@ -83,68 +94,27 @@ See the gemma API docs for more information.
83
94
 
84
95
  == REQUIREMENTS
85
96
 
86
- You must have ruby, rubygems and rake installed. Tasks are also included for
87
- rcov (http://eigenclass.org/hiki.rb?rcov) and yard (http://yardoc.org/), if you
88
- have them installed. Other dependencies are handled automatically.
89
-
90
97
  Gemma has been tested on:
91
- * x86-linux (Ubuntu 10.10) with Ruby 1.8.7p299
92
- * x86-linux (rvm) with Ruby 1.9.2p0 (2010-08-18 revision 29036)
93
- * x86_64-linux (CentOS) with Ruby 1.8.7p72
94
- * with yard 0.5.8 and 0.6.3
95
- * with rcov 0.9.7.1 and 0.9.9
96
- Gemma has not yet been tested on Windows.
98
+ * ruby 1.9.2p290 (2011-07-09 revision 32553) [i686-linux] and [x86_64-linux]
99
+ * ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux] and [x86_64-linux]
100
+
101
+ Gemma has not yet been tested on Windows or Mac OS X.
97
102
 
98
103
  == INSTALLATION
99
104
 
100
- On *nix:
105
+ On RVM:
106
+ gem install gemma
101
107
 
108
+ On a system ruby:
102
109
  sudo gem install gemma
103
110
 
104
111
  == DEVELOPMENT
105
112
 
106
- To get the source and development depencies:
113
+ gem install bundler
107
114
  git clone git://github.com/jdleesmiller/gemma.git
108
115
  cd gemma
109
- gem build gemma.gemspec
110
- sudo gem install gemma-X.X.X.gem --development
111
- where X.X.X is the current gemma version.
112
-
113
- == RELATED PROJECTS
114
-
115
- There are many projects that help to automate common gem development tasks.
116
- Hoe and Jeweler are the most popular; they generate the gemspec and tasks using
117
- a configuration specified in the Rakefile, which is the opposite to what gemma
118
- does. Mr Bones is a gem template generator that appears to be similar to Hoe
119
- and Jeweler, but I haven't used it myself.
120
-
121
- * http://seattlerb.rubyforge.org/hoe/
122
- * http://github.com/technicalpickles/jeweler
123
- * http://codeforpeople.rubyforge.org/bones/
124
-
125
- Bundler also provides some support for gem development. It includes a simple gem
126
- scaffolding generator, and the results are compatible with gemma. It also
127
- includes some rake extensions for building, installing and releasing gems
128
- (Bundler::GemHelper). (As of version 1.0.7.)
129
- * http://gembundler.com
130
- * http://gembundler.com/rubygems.html
131
-
132
- gemesis provides tasks for building, releasing and installing gems based on the
133
- gemspec, but (at the time of writing) it doesn't provide tasks for tests and
134
- documentation, etc.
135
-
136
- * http://github.com/markryall/gemesis/tree/master/lib/gemesis
137
-
138
- rake-compiler provides support for compiling native extensions from a
139
- gemspec, and it looks like it should work fairly well with gemma.
140
-
141
- * http://github.com/luislavena/rake-compiler
142
-
143
-
144
- Other helpful articles:
145
-
146
- * http://rubygems.rubyforge.org/rubygems-update/Gem/Version.html
147
- * http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/
116
+ bundle
117
+ rake -T # list development tasks
148
118
 
149
119
  == TODO
150
120
 
@@ -156,11 +126,20 @@ Other helpful articles:
156
126
  g.yard_dev.options.push('--protected', '--private')
157
127
  end
158
128
  * more tasks (e.g. to publish docs)
159
- * tasks for version control? (see http://github.com/nvie/gitflow)
129
+ * more tasks to support C extensions
130
+ * hooks for the rcov and/or simplecov coverage tools
131
+ * tasks for version control? (e.g. based on http://github.com/nvie/gitflow)
160
132
  * contributions welcome!
161
133
 
162
134
  == HISTORY
163
135
 
136
+ <em>2.0.0</em>
137
+ * now relies on bundler
138
+ * now specifies particular gem version that must be used for rake, rdoc and
139
+ yard; the old approach was to try to work with whatever was already installed,
140
+ but this proved too fragile
141
+ * removed rcov support, because it doesn't work on 1.9.x (see simplecov)
142
+
164
143
  <em>1.0.0</em>
165
144
  * added templates
166
145
  * changed rdoc and yard tasks to use +require_paths+ instead of +files+
data/bin/gemma CHANGED
@@ -111,7 +111,7 @@ end
111
111
  templates = opts['--template']
112
112
  if templates.empty?
113
113
  if interactive
114
- templates << 'base' << 'test_unit'
114
+ templates << 'base' << 'minitest'
115
115
  hl.choose do |menu|
116
116
  menu.prompt = "type of gem: "
117
117
  menu.shell = true
@@ -1,3 +1,5 @@
1
+ require 'shellwords'
2
+
1
3
  require 'gemma/version'
2
4
  require 'gemma/utility'
3
5
  require 'gemma/options'
@@ -5,11 +7,11 @@ require 'gemma/rake_tasks'
5
7
 
6
8
  # Load default Rakefile plugins:
7
9
  require 'gemma/rake_tasks/plugin'
8
- require 'gemma/rake_tasks/rcov_tasks'
9
10
  require 'gemma/rake_tasks/rdoc_tasks'
10
11
  require 'gemma/rake_tasks/run_tasks'
11
12
  require 'gemma/rake_tasks/yard_tasks'
12
- require 'gemma/rake_tasks/test_unit_tasks'
13
+ require 'gemma/rake_tasks/minitest_tasks'
14
+ require 'gemma/rake_tasks/gem_tasks'
13
15
 
14
16
  require 'gemma/conventions'
15
17
  require 'gemma/gem_from_template'
@@ -1,37 +1,32 @@
1
1
  module Gemma
2
2
  #
3
- # A home for conventions, advice and best practices.
3
+ # Methods to check input against accepted conventions.
4
+ #
5
+ # For help on extensions:
6
+ # * http://nokogiri.org/tutorials/installing_nokogiri.html explains how to
7
+ # prepare several unices to build native extensions.
8
+ #
9
+ # General objectives for gemma:
10
+ # * follow and promote accepted conventions where obvious
11
+ # * make the outputs from rdoc, test, etc. work like they do in rubygems
12
+ # * avoid load path noise ($: << ...)
13
+ # * make it easy to start hacking on an existing gem that uses gemma
14
+ # - git clone ...
15
+ # - gem install bundle
16
+ # - bundle # install both gemma dependencies and the gem's dependencies
17
+ # - rake -T # should now work
4
18
  #
5
19
  module Conventions
6
- #
7
- # References:
8
- # http://stackoverflow.com/questions/221320/standard-file-naming-conventions-in-ruby
9
- # http://containerdiv.wordpress.com/2009/05/24/ruby-gems-vs-rails-plugins/
10
- #
11
- # There is probably a required format (regex) for names, but I've never
12
- # figured out what it is. It should be a valid file/directory name on
13
- # Windows.
14
- #
15
- GOOD_GEM_NAME_TIPS = <<-STRING
16
- Some tips for good gem names:
17
- * use lower case
18
- * separate words with _ (underscore)
19
- * don't put 'ruby' in the name; this is implied, because it's a rubygem
20
-
21
- It is also common to use a hyphen (-) to separate words.
22
-
23
- If your gem name is my_new_gem, it can be installed with
24
- sudo gem install my_new_gem
25
- used in scripts with
26
- require 'rubygems'
27
- require 'my_new_gem'
28
- and its contents should be contained in a module or class called MyNewGem.
29
- STRING
30
-
31
20
  #
32
21
  # Check gem naming conventions; this is sufficient but not necessary for
33
22
  # the gem name to be valid.
34
23
  #
24
+ # References:
25
+ # * http://guides.rubygems.org/patterns/
26
+ # * http://blog.segment7.net/articles/2010/11/15/how-to-name-gems
27
+ # * http://stackoverflow.com/questions/221320/standard-file-naming-conventions-in-ruby
28
+ # * http://containerdiv.wordpress.com/2009/05/24/ruby-gems-vs-rails-plugins/
29
+ #
35
30
  # @return [Boolean]
36
31
  #
37
32
  def self.good_gem_name? gem_name
@@ -17,7 +17,7 @@ module Gemma
17
17
  # there are files that occur in multiple templates (files in earlier
18
18
  # templates are overwritten by those in later templates, at present).
19
19
  #
20
- BUILTIN_TEMPLATES = %w(base executable test_unit)
20
+ BUILTIN_TEMPLATES = %w(base executable minitest)
21
21
 
22
22
  def initialize
23
23
  @gem_name = nil
@@ -78,18 +78,12 @@ module Gemma
78
78
  File.expand_path(File.join('.',self.dir_name))
79
79
  end
80
80
 
81
- #
82
- # Gem version requirement for the development dependency on gemma.
83
- #
84
- # @return [String]
85
- #
86
- def gemma_version_requirement
87
- "~> #{Gemma::VERSION.split(/\./).take(2).join('.')}"
88
- end
89
-
90
81
  #
91
82
  # Copy given templates to +destination_path+ and run erb where needed.
92
83
  #
84
+ # @param [Array<String>] template_paths absolute paths of the template
85
+ # directories to copy
86
+ #
93
87
  def create_gem template_paths, destination_path=self.destination_path
94
88
  raise "destination #{destination_path} exists" if File.exists?(
95
89
  destination_path)
@@ -33,20 +33,24 @@ module Gemma
33
33
  # Matching options that appear after a `--` terminator are not extracted;
34
34
  # they remain in the {ExtractResult#remaining_options} list.
35
35
  #
36
+ # The +options+ parameter takes an array of arguments; to split a string
37
+ # into the appropriate form, you can use the +Shellwords+ module in the ruby
38
+ # standard library.
39
+ #
36
40
  # @example
37
41
  # Gemma::Options.extract(%w(-a), %w(-a foo bar.txt))
38
42
  # #=> #<struct Gemma::Options::ExtractResult argument="foo",
39
43
  # # remaining_options=["bar.txt"]>
40
44
  #
41
45
  # @param [Array<String>] names one or more names for the option to extract
42
- # (`['--file','-f']`, for example)
46
+ # (`['--file','-f']`, for example)
43
47
  #
44
48
  # @param [Array<String>] options to extract from; you should ensure that
45
- # there isn't leading/trailing whitespace (strip), because this method
46
- # doesn't detect it
49
+ # there isn't leading/trailing whitespace (strip), because this
50
+ # method doesn't detect it
47
51
  #
48
52
  # @return [ExtractResult] contains the argument for the given option and the
49
- # rest of the options
53
+ # rest of the options
50
54
  #
51
55
  def self.extract names, options
52
56
  options = options.dup
@@ -8,6 +8,7 @@ module Gemma
8
8
  # @example To create the default tasks based on your _mygem_.gemspec file:
9
9
  # # At the top of Rakefile.rb.
10
10
  # require 'rubygems'
11
+ # require 'bundler/setup'
11
12
  # require 'gemma'
12
13
  #
13
14
  # Gemma::RakeTasks.with_gemspec_file 'mygem.gemspec'
@@ -22,7 +23,7 @@ module Gemma
22
23
  end
23
24
 
24
25
  #
25
- # Constructor for internal use; you should usually use the
26
+ # Constructor mainly for internal use; you should usually use the
26
27
  # `with_gemspec_file` alias (see examples in {RakeTasks}).
27
28
  #
28
29
  # @param [String, Gem::Specification] gemspec either the name of a gemspec
@@ -43,7 +44,7 @@ module Gemma
43
44
  @gemspec_file_name = nil
44
45
  @gemspec = gemspec
45
46
  else
46
- raise ArgumentError
47
+ raise ArgumentError, 'bad gemspec argument'
47
48
  end
48
49
 
49
50
  @plugins = {}
@@ -82,11 +83,6 @@ module Gemma
82
83
  #
83
84
  attr_reader :plugins
84
85
 
85
- #
86
- # @return [RcovTasks]
87
- #
88
- def rcov; @plugins[:rcov] end
89
-
90
86
  #
91
87
  # @return [RDocTasks]
92
88
  #
@@ -98,7 +94,7 @@ module Gemma
98
94
  def run; @plugins[:run] end
99
95
 
100
96
  #
101
- # @return [TestUnitTasks]
97
+ # @return [MinitestTasks]
102
98
  #
103
99
  def test; @plugins[:test] end
104
100
 
@@ -107,14 +103,19 @@ module Gemma
107
103
  #
108
104
  def yard; @plugins[:yard] end
109
105
 
106
+ #
107
+ # @return [GemTasks]
108
+ #
109
+ def gem; @plugins[:gem] end
110
+
110
111
  protected
111
112
 
112
113
  def create_default_plugins
113
- @plugins[:rcov] = Gemma::RakeTasks::RcovTasks.new(gemspec)
114
114
  @plugins[:rdoc] = Gemma::RakeTasks::RDocTasks.new(gemspec)
115
115
  @plugins[:run] = Gemma::RakeTasks::RunTasks.new(gemspec)
116
- @plugins[:test] = Gemma::RakeTasks::TestUnitTasks.new(gemspec)
116
+ @plugins[:test] = Gemma::RakeTasks::MinitestTasks.new(gemspec)
117
117
  @plugins[:yard] = Gemma::RakeTasks::YardTasks.new(gemspec)
118
+ @plugins[:gem] = Gemma::RakeTasks::GemTasks.new(gemspec,gemspec_file_name)
118
119
  end
119
120
  end
120
121
  end
@@ -0,0 +1,38 @@
1
+ module Gemma
2
+ class RakeTasks
3
+ #
4
+ # Create tasks for building and releasing gems.
5
+ #
6
+ # Note that the +release+ task is git-specific, but the other tasks are not
7
+ # specific to any particular version control system.
8
+ #
9
+ # This plugin just calls <tt>Bundler::GemHelper</tt> with the given gemspec.
10
+ #
11
+ class GemTasks < Plugin
12
+ #
13
+ # @param [Gem::Specification] gemspec
14
+ # @param [String, nil] gemspec_file_name
15
+ #
16
+ def initialize gemspec, gemspec_file_name
17
+ super(gemspec)
18
+ @gemspec_file_name = gemspec_file_name
19
+ end
20
+
21
+ #
22
+ # Internal method; see {Plugin#create_rake_tasks}.
23
+ #
24
+ # @return [nil]
25
+ #
26
+ # @private
27
+ #
28
+ def create_rake_tasks
29
+ require 'bundler/gem_helper'
30
+ dir = File.dirname(@gemspec_file_name) if @gemspec_file_name
31
+ Bundler::GemHelper.install_tasks(:dir => dir,
32
+ :name => gemspec.name)
33
+ nil
34
+ end
35
+ end
36
+ end
37
+ end
38
+