cri 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS.md +6 -0
- data/README.md +5 -0
- data/lib/cri.rb +2 -1
- data/lib/cri/command.rb +17 -12
- data/lib/cri/command_dsl.rb +16 -0
- data/lib/cri/command_runner.rb +48 -0
- data/test/test_command_dsl.rb +20 -0
- metadata +24 -28
data/NEWS.md
CHANGED
data/README.md
CHANGED
@@ -109,6 +109,11 @@ The {Cri::CommandDSL#run} method takes a block with the actual code to
|
|
109
109
|
execute. This block takes three arguments: the options, any arguments passed
|
110
110
|
to the command, and the command itself.
|
111
111
|
|
112
|
+
Instead of defining a run block, it is possible to declare a class, the
|
113
|
+
_command runner_ class ({Cri::CommandRunner}) that will perform the actual
|
114
|
+
execution of the command. This makes it easier to break up large run blocks
|
115
|
+
into manageable pieces.
|
116
|
+
|
112
117
|
Commands can have subcommands. For example, the `git` commandline tool would be represented by a command that has subcommands named `commit`, `add`, and so on. Commands with subcommands do not use a run block; execution will always be dispatched to a subcommand (or none, if no subcommand is found).
|
113
118
|
|
114
119
|
To add a command as a subcommand to another command, use the {Cri::Command#add_command} method, like this:
|
data/lib/cri.rb
CHANGED
@@ -17,10 +17,11 @@ module Cri
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# The current Cri version.
|
20
|
-
VERSION = '2.0
|
20
|
+
VERSION = '2.1.0'
|
21
21
|
|
22
22
|
autoload 'Command', 'cri/command'
|
23
23
|
autoload 'CommandDSL', 'cri/command_dsl'
|
24
|
+
autoload 'CommandRunner', 'cri/command_runner'
|
24
25
|
autoload 'OptionParser', 'cri/option_parser'
|
25
26
|
|
26
27
|
end
|
data/lib/cri/command.rb
CHANGED
@@ -317,18 +317,23 @@ module Cri
|
|
317
317
|
end
|
318
318
|
|
319
319
|
# Append options
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
defs.
|
327
|
-
text <<
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
320
|
+
groups = { 'options' => self.option_definitions }
|
321
|
+
if self.supercommand
|
322
|
+
groups["options for #{self.supercommand.name}"] = self.supercommand.global_option_definitions
|
323
|
+
end
|
324
|
+
length = groups.values.inject(&:+).inject(0) { |m,o| [ m, o[:long].size ].max }
|
325
|
+
groups.each_pair do |name, defs|
|
326
|
+
unless defs.empty?
|
327
|
+
text << "\n"
|
328
|
+
text << "#{name}:\n"
|
329
|
+
text << "\n"
|
330
|
+
defs.sort { |x,y| x[:long] <=> y[:long] }.each do |opt_def|
|
331
|
+
text << sprintf(
|
332
|
+
" -%1s --%-#{length+4}s %s\n",
|
333
|
+
opt_def[:short],
|
334
|
+
opt_def[:long],
|
335
|
+
opt_def[:desc])
|
336
|
+
end
|
332
337
|
end
|
333
338
|
end
|
334
339
|
|
data/lib/cri/command_dsl.rb
CHANGED
@@ -149,6 +149,8 @@ module Cri
|
|
149
149
|
|
150
150
|
# Sets the run block to the given block. The given block should have two
|
151
151
|
# or three arguments (options, arguments, and optionally the command).
|
152
|
+
# Calling this will override existing run block or runner declarations
|
153
|
+
# (using {#run} and {#runner}, respectively).
|
152
154
|
#
|
153
155
|
# @return [void]
|
154
156
|
def run(&block)
|
@@ -160,6 +162,20 @@ module Cri
|
|
160
162
|
@command.block = block
|
161
163
|
end
|
162
164
|
|
165
|
+
# Defines the runner class for this command. Calling this will override
|
166
|
+
# existing run block or runner declarations (using {#run} and {#runner},
|
167
|
+
# respectively).
|
168
|
+
#
|
169
|
+
# @param [Class<CommandRunner>] klass The command runner class (subclass
|
170
|
+
# of {CommandRunner}) that is used for executing this command.
|
171
|
+
#
|
172
|
+
# @return [void]
|
173
|
+
def runner(klass)
|
174
|
+
run do |opts, args, cmd|
|
175
|
+
klass.new(opts, args, cmd).call
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
163
179
|
protected
|
164
180
|
|
165
181
|
def add_option(short, long, desc, argument, block)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Cri
|
4
|
+
|
5
|
+
# A command runner is responsible for the execution of a command. Using it
|
6
|
+
# is optional, but it is useful for commands whose execution block is large.
|
7
|
+
class CommandRunner
|
8
|
+
|
9
|
+
# @return [Hash] A hash contain the options and their values
|
10
|
+
attr_reader :options
|
11
|
+
|
12
|
+
# @return [Array] The list of arguments
|
13
|
+
attr_reader :arguments
|
14
|
+
|
15
|
+
# @return [Command] The command
|
16
|
+
attr_reader :command
|
17
|
+
|
18
|
+
# @param [Hash] options A hash contain the options and their values
|
19
|
+
#
|
20
|
+
# @param [Array] arguments The list of arguments
|
21
|
+
#
|
22
|
+
# @param [Cri::Command] command The Cri command
|
23
|
+
def initialize(options, arguments, command)
|
24
|
+
@options = options
|
25
|
+
@arguments = arguments
|
26
|
+
@command = command
|
27
|
+
end
|
28
|
+
|
29
|
+
# Runs the command. By default, this simply does the actual execution, but
|
30
|
+
# subclasses may choose to add error handling around the actual execution.
|
31
|
+
#
|
32
|
+
# @return [void]
|
33
|
+
def call
|
34
|
+
self.run
|
35
|
+
end
|
36
|
+
|
37
|
+
# Performs the actual execution of the command.
|
38
|
+
#
|
39
|
+
# @return [void]
|
40
|
+
#
|
41
|
+
# @abstract
|
42
|
+
def run
|
43
|
+
raise NotImplementedError, 'Cri::CommandRunner subclasses must implement #run'
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/test/test_command_dsl.rb
CHANGED
@@ -75,4 +75,24 @@ class Cri::CommandDSLTestCase < Cri::TestCase
|
|
75
75
|
assert_equal %w( aah moo ), command.aliases.sort
|
76
76
|
end
|
77
77
|
|
78
|
+
def test_runner
|
79
|
+
# Define
|
80
|
+
dsl = Cri::CommandDSL.new
|
81
|
+
dsl.instance_eval <<-EOS
|
82
|
+
class Cri::CommandDSLTestCaseCommandRunner < Cri::CommandRunner
|
83
|
+
def run
|
84
|
+
$works = arguments[0]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
runner Cri::CommandDSLTestCaseCommandRunner
|
89
|
+
EOS
|
90
|
+
command = dsl.command
|
91
|
+
|
92
|
+
# Check
|
93
|
+
$works = false
|
94
|
+
command.run(%w( certainly ))
|
95
|
+
assert_equal 'certainly', $works
|
96
|
+
end
|
97
|
+
|
78
98
|
end
|
metadata
CHANGED
@@ -1,30 +1,27 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cri
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.1.0
|
4
5
|
prerelease:
|
5
|
-
version: 2.0.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Denis Defreyne
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-07-17 00:00:00 Z
|
12
|
+
date: 2012-01-16 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
|
-
|
16
|
-
|
14
|
+
description: Cri allows building easy-to-use commandline interfaces with support for
|
15
|
+
subcommands.
|
17
16
|
email: denis.defreyne@stoneship.org
|
18
17
|
executables: []
|
19
|
-
|
20
18
|
extensions: []
|
21
|
-
|
22
|
-
extra_rdoc_files:
|
19
|
+
extra_rdoc_files:
|
23
20
|
- ChangeLog
|
24
21
|
- LICENSE
|
25
22
|
- README.md
|
26
23
|
- NEWS.md
|
27
|
-
files:
|
24
|
+
files:
|
28
25
|
- ChangeLog
|
29
26
|
- LICENSE
|
30
27
|
- NEWS.md
|
@@ -32,6 +29,7 @@ files:
|
|
32
29
|
- README.md
|
33
30
|
- lib/cri/command.rb
|
34
31
|
- lib/cri/command_dsl.rb
|
32
|
+
- lib/cri/command_runner.rb
|
35
33
|
- lib/cri/commands/basic_help.rb
|
36
34
|
- lib/cri/commands/basic_root.rb
|
37
35
|
- lib/cri/core_ext/string.rb
|
@@ -49,31 +47,29 @@ files:
|
|
49
47
|
- .gemtest
|
50
48
|
homepage: http://stoneship.org/software/cri/
|
51
49
|
licenses: []
|
52
|
-
|
53
50
|
post_install_message:
|
54
|
-
rdoc_options:
|
51
|
+
rdoc_options:
|
55
52
|
- --main
|
56
53
|
- README.md
|
57
|
-
require_paths:
|
54
|
+
require_paths:
|
58
55
|
- lib
|
59
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
57
|
none: false
|
61
|
-
requirements:
|
62
|
-
- -
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version:
|
65
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
63
|
none: false
|
67
|
-
requirements:
|
68
|
-
- -
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version:
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
71
68
|
requirements: []
|
72
|
-
|
73
69
|
rubyforge_project:
|
74
|
-
rubygems_version: 1.8.
|
70
|
+
rubygems_version: 1.8.10
|
75
71
|
signing_key:
|
76
72
|
specification_version: 3
|
77
73
|
summary: a library for building easy-to-use commandline tools
|
78
74
|
test_files: []
|
79
|
-
|
75
|
+
has_rdoc:
|