gemma 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,14 +1,18 @@
1
1
  module Gemma
2
2
  class RakeTasks
3
3
  #
4
- # Create tasks to run Test::Unit tests using the built-in (standard library)
5
- # `test/unit`. By default, the `test_files` given in the gemspec are tested.
4
+ # Create tasks to run minitest tests. By default, the +require_paths+ from
5
+ # the gemspec and the gem's +test+ directory are placed on the load path,
6
+ # and the +test_files+ given in the gemspec are executed as tests.
7
+ #
8
+ # Minitest works on both 1.8 and 1.9, and it's mostly compatible with
9
+ # <tt>Test::Unit</tt> tests.
6
10
  #
7
11
  # This plugin is based on the `Rake::TestTask` that comes bundled with rake.
8
12
  # If you need an option that isn't exposed by the plugin, you can modify the
9
13
  # `TestTask` object directly in a block passed to {#with_test_task}.
10
14
  #
11
- class TestUnitTasks < Plugin
15
+ class MinitestTasks < Plugin
12
16
  #
13
17
  # @param [Gem::Specification] gemspec
14
18
  #
@@ -61,16 +65,16 @@ module Gemma
61
65
  unless self.files.empty?
62
66
  require 'rake/testtask'
63
67
  Rake::TestTask.new(self.task_name) do |tt|
64
- tt.libs = gemspec.require_paths
68
+ tt.libs = gemspec.require_paths.dup
69
+ tt.libs << 'test'
65
70
  tt.test_files = self.files
66
- tt.warning = true
71
+ tt.ruby_opts << '-rubygems' << '-rbundler/setup'
67
72
  @with_test_task.call(tt) if @with_test_task
68
73
  end
69
74
  end
70
75
  nil
71
- rescue LoadError
72
- # Assume the test task is not installed.
73
76
  end
74
77
  end
75
78
  end
76
79
  end
80
+
@@ -11,6 +11,8 @@ module Gemma
11
11
  # are generated.
12
12
  #
13
13
  class Plugin
14
+ include Rake::DSL
15
+
14
16
  def initialize gemspec
15
17
  @gemspec = gemspec
16
18
  end
@@ -1,3 +1,5 @@
1
+ require 'rdoc/task'
2
+
1
3
  module Gemma
2
4
  class RakeTasks
3
5
  #
@@ -7,11 +9,8 @@ module Gemma
7
9
  # The default settings are based on the +require_paths+, +rdoc_options+ and
8
10
  # +extra_rdoc_files+ data in the gemspec.
9
11
  #
10
- # If an rdoc gem is installed, it will be used; otherwise, the built-in
11
- # rdoc will be used (see {#use_gem_if_available}).
12
- #
13
12
  # This plugin is based on the <tt>Rake::RDocTask</tt> that comes bundled
14
- # with rake. If you need an option that isn't exposed by the plugin, you
13
+ # with rdoc. If you need an option that isn't exposed by the plugin, you
15
14
  # can modify the +RDocTask+ object directly in a block passed to
16
15
  # {#with_rdoc_task}.
17
16
  #
@@ -23,7 +22,6 @@ module Gemma
23
22
  super(gemspec)
24
23
 
25
24
  # Defaults.
26
- @use_gem_if_available = true
27
25
  @task_name = :rdoc
28
26
  @with_rdoc_task = nil
29
27
 
@@ -80,17 +78,6 @@ module Gemma
80
78
  #
81
79
  attr_accessor :template
82
80
 
83
- #
84
- # If an rdoc gem is installed, use it instead of the rdoc from the
85
- # standard library (default true).
86
- #
87
- # While rdoc is part of the ruby standard library, newer versions are
88
- # available as gems.
89
- #
90
- # @return [Boolean]
91
- #
92
- attr_accessor :use_gem_if_available
93
-
94
81
  #
95
82
  # Files and directories to be processed by rdoc; extracted from gemspec;
96
83
  # by default, these are the gem's +require_paths+ and +extra_rdoc_files+.
@@ -131,15 +118,6 @@ module Gemma
131
118
  # @private
132
119
  #
133
120
  def create_rake_tasks
134
- if use_gem_if_available
135
- begin
136
- gem('rdoc')
137
- rescue LoadError
138
- # ignore -- just use the standard library one
139
- end
140
- end
141
-
142
- require 'rake/rdoctask'
143
121
  Rake::RDocTask.new(self.task_name) do |rd|
144
122
  rd.rdoc_dir = self.output
145
123
  rd.rdoc_files = self.files
@@ -147,9 +125,9 @@ module Gemma
147
125
  rd.main = self.main
148
126
  rd.template = self.template
149
127
  rd.options = self.options
150
- rd.inline_source = false # doesn't seem to work on 1.8.7
151
128
  @with_rdoc_task.call(rd) if @with_rdoc_task
152
129
  end
130
+ CLOBBER.include(self.output)
153
131
 
154
132
  nil
155
133
  end
@@ -3,13 +3,13 @@ module Gemma
3
3
  #
4
4
  # Run an executable script in the bin folder.
5
5
  #
6
- # There is one task per entry in the gemspec's +executables+ list.
7
- # By default, warnings are enabled, the load path is set according to the
8
- # +require_paths+ in the gemspec, and rubygems is included.
6
+ # There is one task per entry in the gemspec's +executables+ list. The
7
+ # executable is run with <tt>Kernel.exec</tt>. The result is equivalent to
8
+ # running <tt>bundler exec ...</tt>.
9
9
  #
10
10
  # To pass arguments to the script, you have to pass them as arguments to
11
11
  # the rake task. The syntax for quoting the arguments will depend on your
12
- # shell, but on bash it might look like:
12
+ # shell, but on bash looks like:
13
13
  #
14
14
  # rake my_prog['foo --bar=baz --bat=hi']
15
15
  #
@@ -23,7 +23,6 @@ module Gemma
23
23
  # Defaults.
24
24
  @task_prefix = ''
25
25
  @program_names = gemspec.executables.dup
26
- @ruby_args = ['-w', "-I#{gemspec.require_paths.join(':')}", '-rubygems']
27
26
  end
28
27
 
29
28
  #
@@ -42,14 +41,6 @@ module Gemma
42
41
  #
43
42
  attr_accessor :program_names
44
43
 
45
- #
46
- # Arguments to be passed to ruby; by default, warnings are enabled (-w)
47
- # and the gemspec's +require_paths+ are on the load path (-I).
48
- #
49
- # @return [Array<String>]
50
- #
51
- attr_accessor :ruby_args
52
-
53
44
  #
54
45
  # Internal method; see {Plugin#create_rake_tasks}.
55
46
  #
@@ -58,11 +49,11 @@ module Gemma
58
49
  # @private
59
50
  #
60
51
  def create_rake_tasks
61
- for program_name in program_names
52
+ program_names.each do |program_name|
62
53
  desc "run #{program_name}"
63
54
  task((task_prefix + program_name), :args) do |t, args|
64
- args = (args[:args] || '').split(/\s/)
65
- ruby(*(ruby_args + ["bin/#{program_name}"] + args))
55
+ program_args = Shellwords.shellsplit(args[:args] || '')
56
+ Kernel.exec(program_name, *program_args)
66
57
  end
67
58
  end
68
59
  nil
@@ -1,3 +1,5 @@
1
+ require 'yard'
2
+
1
3
  module Gemma
2
4
  class RakeTasks
3
5
  #
@@ -128,7 +130,6 @@ module Gemma
128
130
  # @private
129
131
  #
130
132
  def create_rake_tasks
131
- require 'yard'
132
133
  YARD::Rake::YardocTask.new do |yd|
133
134
  yd.name = self.task_name
134
135
  yd.options = complete_options
@@ -1,3 +1,6 @@
1
1
  module Gemma
2
- VERSION = '1.0.0'
2
+ VERSION_MAJOR = 2
3
+ VERSION_MINOR = 0
4
+ VERSION_PATCH = 0
5
+ VERSION = [VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH].join('.')
3
6
  end
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+ gemspec
3
+
@@ -1,10 +1,7 @@
1
- begin
2
- require 'rubygems'
3
- require 'gemma'
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'gemma'
4
4
 
5
- Gemma::RakeTasks.with_gemspec_file '<%= gem_name %>.gemspec'
6
- rescue LoadError
7
- puts 'Install gemma (sudo gem install gemma) for more rake tasks.'
8
- end
5
+ Gemma::RakeTasks.with_gemspec_file '<%= gem_name %>.gemspec'
9
6
 
10
7
  task :default => :test
@@ -11,17 +11,16 @@ Gem::Specification.new do |s|
11
11
  s.authors = ['TODO write your name']
12
12
  s.email = ['TODO write your e-mail address']
13
13
  s.homepage = 'TODO homepage'
14
- s.summary = %q{TODO write gem summary}
15
- s.description = %q{TODO write gem description}
14
+ s.summary = %q{TODO write short gem summary}
15
+ s.description = %q{TODO write longer gem description}
16
16
 
17
17
  s.rubyforge_project = '<%= gem_name %>'
18
18
 
19
- #s.add_runtime_dependency '...'
20
- s.add_development_dependency 'gemma', '>= <%= Gemma::VERSION %>', '<%=
21
- gemma_version_requirement %>'
19
+ #s.add_runtime_dependency '...', '~> x.y.z'
20
+ s.add_development_dependency 'gemma', '~> <%= Gemma::VERSION %>'
22
21
 
23
22
  s.files = Dir.glob('{lib,bin}/**/*.rb') + %w(README.rdoc)
24
- s.test_files = Dir.glob('test/test_*.rb')
23
+ s.test_files = Dir.glob('test/<%= gem_name %>/*_test.rb')
25
24
  s.executables = Dir.glob('bin/*').map{|f| File.basename(f)}
26
25
 
27
26
  s.rdoc_options = [
@@ -1,3 +1,6 @@
1
1
  module <%= module_name %>
2
- VERSION = '0.0.1'
2
+ VERSION_MAJOR = 0
3
+ VERSION_MINOR = 0
4
+ VERSION_PATCH = 1
5
+ VERSION = [VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH].join('.')
3
6
  end
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env ruby
1
+ #!/usr/bin/env <%= RbConfig::CONFIG['ruby_install_name'] %>
2
2
 
3
3
  require '<%= gem_name %>'
4
4
 
@@ -1,5 +1,5 @@
1
- require "test/unit"
2
- require "<%= gem_name %>"
1
+ require '<%= gem_name %>'
2
+ require 'test/unit'
3
3
 
4
4
  class Test<%= module_name %> < Test::Unit::TestCase
5
5
  def test_<%= gem_name %>
@@ -0,0 +1,64 @@
1
+ require 'gemma/test_helper'
2
+ require 'tmpdir'
3
+
4
+ class Gemma::GemFromTemplateTest < Test::Unit::TestCase
5
+ def setup
6
+ @tmp = Dir.mktmpdir('gemma')
7
+ @old_pwd = Dir.pwd
8
+ Dir.chdir(@tmp)
9
+ end
10
+
11
+ def teardown
12
+ Dir.chdir(@old_pwd)
13
+ FileUtils.remove_entry_secure @tmp
14
+ end
15
+
16
+ def test_create
17
+ #
18
+ # basic create-from-template tests
19
+ #
20
+ gt = Gemma::GemFromTemplate.new
21
+ gt.gem_name = "my_new_gem"
22
+ assert gt.good_gem_name?
23
+
24
+ assert_equal "MyNewGem", gt.module_name
25
+ gt.module_name = "Foo" # override default
26
+ assert_equal "Foo", gt.module_name
27
+ gt.module_name = nil # revert back to default
28
+ assert_equal "MyNewGem", gt.module_name
29
+
30
+ assert_equal "my_new_gem", gt.dir_name
31
+ gt.dir_name = "bar" # override default
32
+ assert_equal "bar", gt.dir_name
33
+ gt.dir_name = nil # revert back to default
34
+ assert_equal "my_new_gem", gt.dir_name
35
+
36
+ template_paths = Gemma::GemFromTemplate::BUILTIN_TEMPLATES.map{|path|
37
+ File.join(Gemma::GemFromTemplate::TEMPLATE_ROOT,path)}
38
+ assert_equal 'base', File.basename(template_paths.first)
39
+
40
+ gt.dir_name = "my_new_gem_base"
41
+ gt.create_gem template_paths[0..0] # just base
42
+
43
+ gt.dir_name = "my_new_gem_full"
44
+ gt.create_gem template_paths # expand all templates
45
+ end
46
+
47
+ def test_todos
48
+ #
49
+ # we should be able to find the to-do markers in a newly created gem
50
+ #
51
+ gt = Gemma::GemFromTemplate.new
52
+ gt.gem_name = "test_gem"
53
+
54
+ template_paths = Gemma::GemFromTemplate::BUILTIN_TEMPLATES.map{|path|
55
+ File.join(Gemma::GemFromTemplate::TEMPLATE_ROOT,path)}
56
+ gt.create_gem template_paths
57
+
58
+ # look for some to-do markers
59
+ io = StringIO.new
60
+ Gemma::Utility.rgrep(/TODO/, gt.destination_path, io)
61
+ assert io.string =~ /README\.rdoc/
62
+ end
63
+ end
64
+
@@ -0,0 +1,121 @@
1
+ require 'gemma/test_helper'
2
+ require 'tmpdir'
3
+ require 'open4'
4
+
5
+ #
6
+ # Run the 'gemma new' command and then run some basic commands to make sure that
7
+ # things worked out.
8
+ #
9
+ class Gemma::GemmaNewTest < Test::Unit::TestCase
10
+ #
11
+ # Run a command in a bundler-free environment and capture both stdout and
12
+ # stderror output.
13
+ #
14
+ # We don't want to let our (gemma) bundler environment interfere with the
15
+ # bundler environment that we want to set up for the test gem, so we use
16
+ # bundler's +with_clean_env+ (which doesn't quite work yet in bundler 1.0, so
17
+ # we have to hack things a bit more than should be necessary)
18
+ #
19
+ # We also don't want to generate lots of confusing test output, so we capture
20
+ # stdout and stderr using Open4. (On 1.9.2, we can use <tt>Open3.popen2e</tt>,
21
+ # which is nicer, but Open3 on ruby 1.8.7 doesn't let us get exitstatus.)
22
+ #
23
+ def run_cmd *args
24
+ Bundler.with_clean_env {
25
+ # FIXME in bundler 1.1, this should not be necessary; see
26
+ # https://github.com/carlhuda/bundler/issues/1133
27
+ ENV.delete_if { |k,_| k[0,7] == 'BUNDLE_' }
28
+
29
+ # We also have to clear RUBYOPT, because Bundler::ORIGINAL_ENV in the test
30
+ # runner's process still contains some bundler stuff from rake's process.
31
+ # This suggests that we might have to stop using rake's built-in TestTask,
32
+ # and instead use one that runs the tests in a Bundler.with_clean_env
33
+ # block. However, it usually doesn't seem to make a difference, unless
34
+ # you're doing strange things like we are here.
35
+ ENV.delete('RUBYOPT')
36
+
37
+ output = nil
38
+ status = Open4.popen4(*args) {|pid,i,o,e|
39
+ i.close
40
+ output = o.read + e.read
41
+ }
42
+ [status, output]
43
+ }
44
+ end
45
+
46
+ def setup
47
+ # work in a temporary directory
48
+ @tmp = Dir.mktmpdir('gemma')
49
+ @old_pwd = Dir.pwd
50
+ Dir.chdir(@tmp)
51
+
52
+ # create a test gem; note that here we DO want the gemma bundler
53
+ # environment, because it puts our gemma executable on the bin path
54
+ output = `gemma new --name="test_gem"`
55
+ raise "gemma new failed:\n#{output}" unless $?.exitstatus
56
+
57
+ # we should get some TODOs from the template in the output
58
+ assert_match /TODO write your name/, output
59
+
60
+ Dir.chdir('test_gem')
61
+
62
+ # edit the test gem's Gemfile to point to this gemma
63
+ raise "no Gemfile in test gem" unless File.exists?('Gemfile')
64
+ File.open('Gemfile', 'a') do |f|
65
+ f.puts "gem 'gemma', :path => #{@old_pwd.dump}"
66
+ end
67
+
68
+ # run bundler on the test gem; it should find the same gems that we're using
69
+ # in the gemma bundle
70
+ status, output = run_cmd('bundle', 'install', '--local')
71
+ raise "bundle failed:\n#{output}" unless status.exitstatus == 0
72
+
73
+ # it should say that it has loaded two things from source: gemma and the
74
+ # test_gem itself; if it doesn't it indicates that something strange
75
+ # happened with bundler's environment (or it may just break on future
76
+ # versions of bundler)
77
+ raise "did not load from source" unless output =~ /from source at/
78
+
79
+ # bundler should produce a lock file
80
+ raise "no Gemfile.lock in test gem" unless File.exists?('Gemfile.lock')
81
+ end
82
+
83
+ def teardown
84
+ Dir.chdir(@old_pwd)
85
+ FileUtils.remove_entry_secure @tmp
86
+ end
87
+
88
+ def test_rake
89
+ # list the rake tasks; this ensures that gemma loaded
90
+ status, output = run_cmd('rake -T')
91
+ assert_equal 0, status.exitstatus
92
+ assert_match /rake test/, output
93
+ assert_match /rake test_gem/, output
94
+ assert_match /rake rdoc/, output
95
+ assert_match /rake yard/, output
96
+
97
+ # run the tests; they should fail initially
98
+ status, output = run_cmd('rake')
99
+ assert_not_equal 0, status.exitstatus
100
+ assert_match /TODO write tests/, output
101
+
102
+ # run the executable; it should also fail
103
+ status, output = run_cmd('rake test_gem')
104
+ assert_not_equal 0, status.exitstatus
105
+ assert_match /TODO write program code/, output
106
+
107
+ # generate rdoc output
108
+ status, output = run_cmd('rake rdoc')
109
+ assert_equal 0, status.exitstatus
110
+
111
+ # generate yard output
112
+ status, output = run_cmd('rake yard')
113
+ assert_equal 0, status.exitstatus
114
+
115
+ # build the gem; this should fail, because we have invalid authors, etc.
116
+ status, output = run_cmd('rake build')
117
+ assert_match /TODO/, output # "... is not a valid author"
118
+ assert_equal 1, status.exitstatus
119
+ end
120
+ end
121
+