gemma 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+