gemma 0.0.2 → 1.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.
@@ -1,4 +1,7 @@
1
1
  module Gemma
2
+ #
3
+ # Helpers for processing command line arguments.
4
+ #
2
5
  module Options
3
6
  #
4
7
  # @attr [String, nil] argument
@@ -53,7 +53,11 @@ module Gemma
53
53
  block.call(self) if block_given?
54
54
 
55
55
  @plugins.values.each do |plugin|
56
- plugin.create_rake_tasks
56
+ begin
57
+ plugin.create_rake_tasks
58
+ rescue
59
+ warn "plugin #{plugin.class} failed: #{$!}"
60
+ end
57
61
  end
58
62
  end
59
63
 
@@ -88,6 +92,11 @@ module Gemma
88
92
  #
89
93
  def rdoc; @plugins[:rdoc] end
90
94
 
95
+ #
96
+ # @return [RunTasks]
97
+ #
98
+ def run; @plugins[:run] end
99
+
91
100
  #
92
101
  # @return [TestUnitTasks]
93
102
  #
@@ -98,23 +107,14 @@ module Gemma
98
107
  #
99
108
  def yard; @plugins[:yard] end
100
109
 
101
- #
102
- # @return [GemTasks]
103
- #
104
- #def gem; @plugins[:gem] end
105
-
106
110
  protected
107
111
 
108
112
  def create_default_plugins
109
113
  @plugins[:rcov] = Gemma::RakeTasks::RcovTasks.new(gemspec)
110
114
  @plugins[:rdoc] = Gemma::RakeTasks::RDocTasks.new(gemspec)
115
+ @plugins[:run] = Gemma::RakeTasks::RunTasks.new(gemspec)
111
116
  @plugins[:test] = Gemma::RakeTasks::TestUnitTasks.new(gemspec)
112
117
  @plugins[:yard] = Gemma::RakeTasks::YardTasks.new(gemspec)
113
-
114
- # not that helpful yet
115
- # @plugins[:gem] = Gemma::RakeTasks::GemTasks.new(gemspec,
116
- # gemspec_file_name)
117
118
  end
118
-
119
119
  end
120
120
  end
@@ -19,6 +19,7 @@ module Gemma
19
19
  # Defaults.
20
20
  @task_name = :rcov
21
21
  @output = 'rcov'
22
+ @files = gemspec.test_files.dup
22
23
  @with_rcov_task = nil
23
24
  end
24
25
 
@@ -35,6 +36,13 @@ module Gemma
35
36
  # @return [String]
36
37
  #
37
38
  attr_accessor :output
39
+
40
+ #
41
+ # The files to test; defaults to the +test_files+ from the gemspec.
42
+ #
43
+ # @return [Array<String>]
44
+ #
45
+ attr_accessor :files
38
46
 
39
47
  #
40
48
  # Customize the rcov task.
@@ -59,19 +67,18 @@ module Gemma
59
67
  # @private
60
68
  #
61
69
  def create_rake_tasks
62
- begin
63
- require 'rcov/rcovtask'
64
- Rcov::RcovTask.new(self.task_name) do |rcov|
65
- rcov.libs = gemspec.require_paths
66
- rcov.test_files = gemspec.test_files
67
- rcov.warning = true
68
- rcov.rcov_opts << "-x ^/"
69
- rcov.output_dir = self.output
70
- @with_rcov_task.call(rcov) if @with_rcov_task
71
- end
72
- rescue LoadError
73
- # Assume rcov is not installed.
70
+ require 'rcov/rcovtask'
71
+ Rcov::RcovTask.new(self.task_name) do |rcov|
72
+ rcov.libs = gemspec.require_paths
73
+ rcov.test_files = self.files
74
+ rcov.warning = true
75
+ rcov.rcov_opts << "-x ^/"
76
+ rcov.output_dir = self.output
77
+ @with_rcov_task.call(rcov) if @with_rcov_task
74
78
  end
79
+ nil
80
+ rescue LoadError
81
+ # Assume rcov is not installed.
75
82
  end
76
83
  end
77
84
  end
@@ -1,19 +1,19 @@
1
1
  module Gemma
2
2
  class RakeTasks
3
3
  #
4
- # Create tasks for generating `rdoc` API documentation with settings from
4
+ # Create tasks for generating +rdoc+ API documentation with settings from
5
5
  # the gemspec.
6
6
  #
7
- # The default settings are based on the `files`, `rdoc_options` and
8
- # `extra_rdoc_files` data in the gemspec. By default, test cases (which
9
- # might be included in `files`) are not documented.
7
+ # The default settings are based on the +require_paths+, +rdoc_options+ and
8
+ # +extra_rdoc_files+ data in the gemspec.
10
9
  #
11
10
  # If an rdoc gem is installed, it will be used; otherwise, the built-in
12
- # rdoc will be used.
11
+ # rdoc will be used (see {#use_gem_if_available}).
13
12
  #
14
- # This plugin is based on the `Rake::RDocTask` that comes bundled with rake.
15
- # If you need an option that isn't exposed by the plugin, you can modify the
16
- # `RDocTask` object directly in a block passed to {#with_rdoc_task}.
13
+ # 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
15
+ # can modify the +RDocTask+ object directly in a block passed to
16
+ # {#with_rdoc_task}.
17
17
  #
18
18
  class RDocTasks < Plugin
19
19
  #
@@ -38,8 +38,7 @@ module Gemma
38
38
  @title, @options = Options.extract(%w(-t --title), @options).to_a
39
39
  @template, @options = Options.extract(%w(-T --template), @options).to_a
40
40
 
41
- # Don't include the test files by default.
42
- @files = gemspec.files - gemspec.test_files
41
+ @files = gemspec.require_paths + gemspec.extra_rdoc_files
43
42
  end
44
43
 
45
44
  #
@@ -93,8 +92,8 @@ module Gemma
93
92
  attr_accessor :use_gem_if_available
94
93
 
95
94
  #
96
- # Files to be processed by rdoc; extracted from gemspec; test files are
97
- # not included by default.
95
+ # Files and directories to be processed by rdoc; extracted from gemspec;
96
+ # by default, these are the gem's +require_paths+ and +extra_rdoc_files+.
98
97
  #
99
98
  # @return [Array<String>]
100
99
  #
@@ -0,0 +1,73 @@
1
+ module Gemma
2
+ class RakeTasks
3
+ #
4
+ # Run an executable script in the bin folder.
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.
9
+ #
10
+ # To pass arguments to the script, you have to pass them as arguments to
11
+ # the rake task. The syntax for quoting the arguments will depend on your
12
+ # shell, but on bash it might look like:
13
+ #
14
+ # rake my_prog['foo --bar=baz --bat=hi']
15
+ #
16
+ class RunTasks < Plugin
17
+ #
18
+ # @param [Gem::Specification] gemspec
19
+ #
20
+ def initialize gemspec
21
+ super(gemspec)
22
+
23
+ # Defaults.
24
+ @task_prefix = ''
25
+ @program_names = gemspec.executables.dup
26
+ @ruby_args = ['-w', "-I#{gemspec.require_paths.join(':')}", '-rubygems']
27
+ end
28
+
29
+ #
30
+ # The task names are formed by prepending this string onto each program
31
+ # name; defaults to the empty string.
32
+ #
33
+ # @return [String]
34
+ #
35
+ attr_accessor :task_prefix
36
+
37
+ #
38
+ # Names of the executable (file in the bin directory) to run; by default,
39
+ # contains the +executables+ from the gemspec.
40
+ #
41
+ # @return [Array<String>] may be empty
42
+ #
43
+ attr_accessor :program_names
44
+
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
+ #
54
+ # Internal method; see {Plugin#create_rake_tasks}.
55
+ #
56
+ # @return [nil]
57
+ #
58
+ # @private
59
+ #
60
+ def create_rake_tasks
61
+ for program_name in program_names
62
+ desc "run #{program_name}"
63
+ task((task_prefix + program_name), :args) do |t, args|
64
+ args = (args[:args] || '').split(/\s/)
65
+ ruby(*(ruby_args + ["bin/#{program_name}"] + args))
66
+ end
67
+ end
68
+ nil
69
+ end
70
+ end
71
+ end
72
+ end
73
+
@@ -17,16 +17,24 @@ module Gemma
17
17
 
18
18
  # Defaults.
19
19
  @task_name = :test
20
+ @files = gemspec.test_files.dup
20
21
  @with_test_task = nil
21
22
  end
22
23
 
23
24
  #
24
- # Name of rake task used to generate these docs; defaults to test.
25
+ # Name of rake task used to run the test; defaults to test.
25
26
  #
26
27
  # @return [Symbol]
27
28
  #
28
29
  attr_accessor :task_name
29
30
 
31
+ #
32
+ # The files to test; defaults to the +test_files+ from the gemspec.
33
+ #
34
+ # @return [Array<String>]
35
+ #
36
+ attr_accessor :files
37
+
30
38
  #
31
39
  # Customize the test task.
32
40
  #
@@ -50,14 +58,18 @@ module Gemma
50
58
  # @private
51
59
  #
52
60
  def create_rake_tasks
53
- require 'rake/testtask'
54
- Rake::TestTask.new(self.task_name) do |tt|
55
- tt.libs = gemspec.require_paths
56
- tt.test_files = gemspec.test_files
57
- tt.warning = true
58
- @with_test_task.call(tt) if @with_test_task
61
+ unless self.files.empty?
62
+ require 'rake/testtask'
63
+ Rake::TestTask.new(self.task_name) do |tt|
64
+ tt.libs = gemspec.require_paths
65
+ tt.test_files = self.files
66
+ tt.warning = true
67
+ @with_test_task.call(tt) if @with_test_task
68
+ end
59
69
  end
60
70
  nil
71
+ rescue LoadError
72
+ # Assume the test task is not installed.
61
73
  end
62
74
  end
63
75
  end
@@ -4,24 +4,25 @@ module Gemma
4
4
  # Create tasks to generate documentation with yard (yardoc) if it is
5
5
  # available.
6
6
  #
7
- # The files to document are extracted from the gemspec's `files` and
8
- # `extra_rdoc_files` members.
7
+ # The gemspec's +require_paths+ and +extra_rdoc_files+ are documented by
8
+ # default.
9
9
  #
10
10
  # Unfortunately, yardoc's command line options are largely incompatible with
11
- # those for rdoc, but the `--main` and `--title` options from `rdoc_options`
12
- # are also passed through to yardoc by default. The short forms `-m` and
13
- # `-t` of these arguments are also passed on as `--main` and `--title` to
14
- # yardoc (note that `-m` and `-t` mean different things to yardoc than to
15
- # rdoc!). Note that any files (that is, non-options) in `rdoc_options` are
16
- # also ignored.
11
+ # those for rdoc, but the <tt>--main</tt> and <tt>--title</tt> options from
12
+ # +rdoc_options+ are passed through to yardoc by default. The short forms
13
+ # <tt>-m</tt> and <tt>-t</tt> of these arguments are also passed on as
14
+ # <tt>--main</tt> and <tt>--title</tt> to yardoc (note that <tt>-m</tt> and
15
+ # <tt>-t</tt> mean different things to yardoc than to rdoc!). Note that any
16
+ # files (that is, non-options) in +rdoc_options+ are also ignored.
17
17
  #
18
18
  # If you want to further customize your yardoc output, you can add options
19
- # in the {Gemma::RakeTasks.with_gemspec_file} configuration block.
19
+ # in the {Gemma::RakeTasks.with_gemspec_file} configuration block or use a
20
+ # <tt>.yardopts</tt> file.
20
21
  #
21
- # This plugin is based on the `YARD::Rake::YardocTask` that comes bundled
22
- # with yard. If you need an option that isn't exposed by the plugin, you
23
- # can modify the `YardocTask` object directly in a block passed to
24
- # {#with_yardoc_task}.
22
+ # This plugin is based on the <tt>YARD::Rake::YardocTask</tt> that comes
23
+ # bundled with yard. If you need an option that isn't exposed by the
24
+ # plugin, you can modify the +YardocTask+ object directly in a block passed
25
+ # to {#with_yardoc_task}.
25
26
  #
26
27
  class YardTasks < Plugin
27
28
  #
@@ -43,9 +44,8 @@ module Gemma
43
44
 
44
45
  @options = []
45
46
 
46
- # Don't document the test files.
47
- # Yard splits up the ruby files from the 'extra' files.
48
- @files = gemspec.files - gemspec.test_files - gemspec.extra_rdoc_files
47
+ # Yard splits up the files from the 'extra' files.
48
+ @files = gemspec.require_paths.dup
49
49
  @extra_files = gemspec.extra_rdoc_files.dup
50
50
  @extra_files.delete(main) if main
51
51
  end
@@ -82,7 +82,7 @@ module Gemma
82
82
 
83
83
  #
84
84
  # Ruby files to be processed by yard; these are extracted from the
85
- # gemspec; test files are not included by default.
85
+ # gemspec; by default these are the +require_paths+.
86
86
  #
87
87
  # @return [Array<String>]
88
88
  #
@@ -128,21 +128,19 @@ module Gemma
128
128
  # @private
129
129
  #
130
130
  def create_rake_tasks
131
- begin
132
- require 'yard'
133
- YARD::Rake::YardocTask.new do |yd|
134
- yd.name = self.task_name
135
- yd.options = complete_options
136
- yd.files = self.files
137
- yd.files.push('-', *self.extra_files) unless self.extra_files.empty?
138
- @with_yardoc_task.call(yd) if @with_yardoc_task
139
- end
140
- CLOBBER.include(self.output)
141
- CLOBBER.include('.yardoc')
142
- rescue LoadError
143
- # Assume yard is not installed.
131
+ require 'yard'
132
+ YARD::Rake::YardocTask.new do |yd|
133
+ yd.name = self.task_name
134
+ yd.options = complete_options
135
+ yd.files = self.files
136
+ yd.files.push('-', *self.extra_files) unless self.extra_files.empty?
137
+ @with_yardoc_task.call(yd) if @with_yardoc_task
144
138
  end
139
+ CLOBBER.include(self.output)
140
+ CLOBBER.include('.yardoc')
145
141
  nil
142
+ rescue LoadError
143
+ # Assume yard is not installed.
146
144
  end
147
145
 
148
146
  private
@@ -0,0 +1,41 @@
1
+ module Gemma
2
+ module Utility
3
+ #
4
+ # If the usage information for a script is documented in a comment block at
5
+ # the top of the file, this method prints it out. If there is a shebang
6
+ # (#!) on the first line, it is not printed.
7
+ #
8
+ def self.print_usage_from_file_comment file, comment_char='#', io=$stdout
9
+ lines = File.readlines(file)
10
+ lines.shift if lines.first =~ /^#!/ # ignore shebang
11
+ for line in lines
12
+ line.strip!
13
+ break unless line =~ /^#{comment_char}(.*)/
14
+ io.puts $1
15
+ end
16
+ end
17
+
18
+ #
19
+ # A very simple recursive grep.
20
+ #
21
+ # @param [Regexp] tag
22
+ #
23
+ # @param [String] path
24
+ #
25
+ # @param [IO] io
26
+ #
27
+ # @return [nil]
28
+ #
29
+ def self.rgrep tag, path, io=$stdout
30
+ Dir.chdir path do
31
+ (Dir["**/*"] + Dir["**/.*"]).select {|f| File.file? f}.sort.each do |f|
32
+ File.readlines(f).each_with_index do |line, i|
33
+ io.puts "#{f}:#{i}: #{line}" if line =~ tag
34
+ end
35
+ end
36
+ end
37
+ nil
38
+ end
39
+ end
40
+ end
41
+
@@ -1,3 +1,3 @@
1
1
  module Gemma
2
- VERSION = '0.0.2'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -0,0 +1,6 @@
1
+ .*.swp
2
+ pkg/*
3
+ *.gem
4
+ .bundle
5
+ /rcov
6
+ /rdoc
@@ -0,0 +1,49 @@
1
+ = <%= gem_name %>
2
+
3
+ * TODO url
4
+
5
+ == SYNOPSIS
6
+
7
+ TODO description
8
+
9
+ === Usage
10
+
11
+ TODO (code sample of usage)
12
+
13
+ == REQUIREMENTS
14
+
15
+ * TODO (list of requirements)
16
+
17
+ == INSTALLATION
18
+
19
+ sudo gem install <%= gem_name %>
20
+
21
+ == DEVELOPMENT
22
+
23
+ TODO developer advice
24
+
25
+ == LICENSE
26
+
27
+ (The MIT License)
28
+
29
+ Copyright (c) <%= Time.new.strftime("%Y") %> TODO
30
+
31
+ Permission is hereby granted, free of charge, to any person obtaining
32
+ a copy of this software and associated documentation files (the
33
+ 'Software'), to deal in the Software without restriction, including
34
+ without limitation the rights to use, copy, modify, merge, publish,
35
+ distribute, sublicense, and/or sell copies of the Software, and to
36
+ permit persons to whom the Software is furnished to do so, subject to
37
+ the following conditions:
38
+
39
+ The above copyright notice and this permission notice shall be
40
+ included in all copies or substantial portions of the Software.
41
+
42
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
43
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
44
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
45
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
46
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
47
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
48
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
49
+