cmdparse 2.0.1 → 2.0.2
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.
- data/ChangeLog +44 -12
- data/Rakefile +4 -1
- data/VERSION +1 -1
- data/doc/src/index.page +8 -0
- data/doc/src/tutorial.page +19 -7
- data/lib/cmdparse.rb +36 -9
- data/lib/cmdparse/wrappers/optparse.rb +1 -1
- data/net.rb +2 -2
- metadata +2 -2
data/ChangeLog
CHANGED
@@ -1,16 +1,48 @@
|
|
1
1
|
------------------------------------------------------------------------
|
2
|
-
|
3
|
-
Changed paths:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
A /
|
11
|
-
|
12
|
-
|
13
|
-
|
2
|
+
r417 | thomas | 2006-06-17 21:35:12 +0200 (Sat, 17 Jun 2006) | 1 line
|
3
|
+
Changed paths:
|
4
|
+
M /trunk/cmdparse/doc/src/index.page
|
5
|
+
|
6
|
+
* fixed spelling error
|
7
|
+
------------------------------------------------------------------------
|
8
|
+
r416 | thomas | 2006-06-17 21:32:55 +0200 (Sat, 17 Jun 2006) | 7 lines
|
9
|
+
Changed paths:
|
10
|
+
A /trunk/cmdparse/.emacs.desktop
|
11
|
+
M /trunk/cmdparse/Rakefile
|
12
|
+
M /trunk/cmdparse/doc/src/index.page
|
13
|
+
M /trunk/cmdparse/doc/src/tutorial.page
|
14
|
+
M /trunk/cmdparse/lib/cmdparse.rb
|
15
|
+
M /trunk/cmdparse/net.rb
|
16
|
+
A /trunk/cmdparse/test
|
17
|
+
A /trunk/cmdparse/test/tc_commandhash.rb
|
18
|
+
|
19
|
+
* included patches #4756 and #4729 from Assaph Mehr and slightly modified them
|
20
|
+
* added the test file for CommandHash from Assaph Mehr
|
21
|
+
* updated Rakefile to run test the test file
|
22
|
+
* updated the tutorial to include information about partial command matching
|
23
|
+
* minor update to index page
|
24
|
+
* update sampe net.rb script to use partial command matching
|
25
|
+
* added emacs desktop file
|
26
|
+
------------------------------------------------------------------------
|
27
|
+
r397 | thomas | 2006-04-05 16:12:46 +0200 (Wed, 05 Apr 2006) | 1 line
|
28
|
+
Changed paths:
|
29
|
+
M /trunk/cmdparse/doc/src/tutorial.page
|
30
|
+
|
31
|
+
* small changes
|
32
|
+
------------------------------------------------------------------------
|
33
|
+
r396 | thomas | 2006-04-04 17:43:24 +0200 (Tue, 04 Apr 2006) | 3 lines
|
34
|
+
Changed paths:
|
35
|
+
M /trunk/cmdparse/Rakefile
|
36
|
+
M /trunk/cmdparse/TODO
|
37
|
+
M /trunk/cmdparse/doc/src/default.template
|
38
|
+
D /trunk/cmdparse/doc/src/documentation.page
|
39
|
+
M /trunk/cmdparse/doc/src/index.page
|
40
|
+
A /trunk/cmdparse/doc/src/tutorial.page (from /trunk/cmdparse/doc/src/documentation.page:340)
|
41
|
+
M /trunk/cmdparse/lib/cmdparse.rb
|
42
|
+
|
43
|
+
* bumped version number to 2.0.1
|
44
|
+
* fixed bug with GemSpec reported by Marcus Werne: lib/cmdparse.rb get automatically loaded now
|
45
|
+
* split documentation page into main docu page and tutorial page
|
14
46
|
------------------------------------------------------------------------
|
15
47
|
r332 | thomas | 2005-08-16 10:54:01 +0200 (Tue, 16 Aug 2005) | 1 line
|
16
48
|
Changed paths:
|
data/Rakefile
CHANGED
@@ -44,7 +44,7 @@ SRC_RB = FileList['lib/**/*.rb']
|
|
44
44
|
# The default task is run if rake is given no explicit arguments.
|
45
45
|
|
46
46
|
desc "Default Task"
|
47
|
-
task :default => :
|
47
|
+
task :default => :test
|
48
48
|
|
49
49
|
|
50
50
|
# End user tasks ################################################################
|
@@ -67,6 +67,9 @@ task :clean do
|
|
67
67
|
ruby "setup.rb clean"
|
68
68
|
end
|
69
69
|
|
70
|
+
task :test do
|
71
|
+
ruby "-Ilib test/tc_commandhash.rb"
|
72
|
+
end
|
70
73
|
|
71
74
|
CLOBBER << "doc/output"
|
72
75
|
desc "Builds the documentation"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.2
|
data/doc/src/index.page
CHANGED
@@ -12,6 +12,14 @@ Have a look around the site!
|
|
12
12
|
|
13
13
|
h2. News
|
14
14
|
|
15
|
+
<b>2006-06-17 cmdparse 2.0.2 released!!!</b>
|
16
|
+
|
17
|
+
Changes:
|
18
|
+
|
19
|
+
* Included two patches from Assaph Mehr:
|
20
|
+
* partial command matching can now be used (see <a href="{relocatable: tutorial.page}">tutorial page</a>)
|
21
|
+
* now a banner for the help and version commands can be specified
|
22
|
+
|
15
23
|
<b>2006-04-05 cmdparse 2.0.1 released!!!</b>
|
16
24
|
|
17
25
|
Changes:
|
data/doc/src/tutorial.page
CHANGED
@@ -65,9 +65,12 @@ Create a new new file and write the necessary @require@ statements.
|
|
65
65
|
h3. The @CommandParser@ class
|
66
66
|
|
67
67
|
Next we will define our basic @CommandParser@ by defining the name of the program, its version and
|
68
|
-
the global options. The boolean argument to the constructor of the @CommandParser@ class
|
69
|
-
whether exceptions should be handled gracefully, i.e. by showing an appropriate error
|
70
|
-
the help screen.
|
68
|
+
the global options. The first boolean argument to the constructor of the @CommandParser@ class
|
69
|
+
defines whether exceptions should be handled gracefully, i.e. by showing an appropriate error
|
70
|
+
message and the help screen. The second boolean argument defines whether the top level commands
|
71
|
+
should use partial command matching instead of full command matching. If partial command matching is
|
72
|
+
used, then the shortest unambiguous part of a command name can be used instead of always specifing
|
73
|
+
the full command name.
|
71
74
|
|
72
75
|
<notextile>{extract: {file: ../net.rb, lines: !ruby/range 30..36}}</notextile>
|
73
76
|
|
@@ -97,10 +100,10 @@ However, we want the program to do something "useful". Therefore we define a new
|
|
97
100
|
|
98
101
|
<notextile>{extract: {file: ../net.rb, lines: !ruby/range 41..44}}</notextile>
|
99
102
|
|
100
|
-
This command is defined by using the default @Command@ class. First an instance is created
|
101
|
-
|
102
|
-
short description so that the @help@ command can produce something useful.
|
103
|
-
command to our @CommandParser@ instance.
|
103
|
+
This command is defined by using the default @Command@ class. First an instance is created assigning
|
104
|
+
a name to the command and defining whether this command takes subcommands and uses partial command
|
105
|
+
matching. Next we add a short description so that the @help@ command can produce something useful.
|
106
|
+
And at last, we add this command to our @CommandParser@ instance.
|
104
107
|
|
105
108
|
We specified that our @ipaddr@ command takes subcommands. So we have to define them, too:
|
106
109
|
|
@@ -158,6 +161,15 @@ Why? As the @ipaddr@ command takes subcommands there should be an additional com
|
|
158
161
|
@list@) on the command line. However, as the @list@ command is the default command for @ipaddr@ you
|
159
162
|
do not need to type it.
|
160
163
|
|
164
|
+
*By the way:* You get the same output if you type
|
165
|
+
<pre>
|
166
|
+
$ ruby net.rb ip
|
167
|
+
</pre>
|
168
|
+
|
169
|
+
Why? As partial command matching is used for the top level commands, the shortest unambiguous name
|
170
|
+
for a command can be used. As there is no other command starting with @ip@ (or even with the letter
|
171
|
+
@i@), it is sufficient to write the above to select the @ipaddr@ command.
|
172
|
+
|
161
173
|
*Notice:* The options of a command which does not take subcommands do not need to be at the front;
|
162
174
|
they can be anywhere, like this
|
163
175
|
<pre>
|
data/lib/cmdparse.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
#--
|
3
3
|
#
|
4
|
-
# $Id: cmdparse.rb
|
4
|
+
# $Id: cmdparse.rb 416 2006-06-17 19:32:55Z thomas $
|
5
5
|
#
|
6
6
|
# cmdparse: advanced command line parser supporting commands
|
7
7
|
# Copyright (C) 2004 Thomas Leitner
|
@@ -25,7 +25,7 @@
|
|
25
25
|
module CmdParse
|
26
26
|
|
27
27
|
# The version of this cmdparse implemention
|
28
|
-
VERSION = [2, 0,
|
28
|
+
VERSION = [2, 0, 2]
|
29
29
|
|
30
30
|
|
31
31
|
# Base class for all cmdparse errors.
|
@@ -103,6 +103,18 @@ module CmdParse
|
|
103
103
|
# Require default option parser wrapper
|
104
104
|
require 'cmdparse/wrappers/optparse'
|
105
105
|
|
106
|
+
# Command Hash - will return partial key matches as well if there is a single
|
107
|
+
# non-ambigous matching key
|
108
|
+
class CommandHash < Hash
|
109
|
+
|
110
|
+
def []( cmd_name )
|
111
|
+
super or begin
|
112
|
+
possible = keys.select {|key| key =~ /^#{cmd_name}.*/ }
|
113
|
+
fetch( possible[0] ) if possible.size == 1
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
106
118
|
|
107
119
|
# Base class for the commands. This class implements all needed methods so that it can be used by
|
108
120
|
# the +CommandParser+ class.
|
@@ -131,13 +143,21 @@ module CmdParse
|
|
131
143
|
attr_reader :commands
|
132
144
|
|
133
145
|
# Initializes the command called +name+. The parameter +has_commands+ specifies if this command
|
134
|
-
# takes other commands as argument.
|
135
|
-
|
146
|
+
# takes other commands as argument. The optional argument +partial_commands+ specifies, if
|
147
|
+
# partial command matching should be used.
|
148
|
+
def initialize( name, has_commands, partial_commands = false )
|
136
149
|
@name = name
|
137
150
|
@options = ParserWrapper.new
|
138
151
|
@has_commands = has_commands
|
139
|
-
@commands =
|
152
|
+
@commands = Hash.new
|
140
153
|
@default_command = nil
|
154
|
+
use_partial_commands( partial_commands )
|
155
|
+
end
|
156
|
+
|
157
|
+
def use_partial_commands( use_partial )
|
158
|
+
temp = ( use_partial ? CommandHash.new : Hash.new )
|
159
|
+
temp.update( @commands )
|
160
|
+
@commands = temp
|
141
161
|
end
|
142
162
|
|
143
163
|
# Returns +true+ if this command supports sub commands.
|
@@ -272,7 +292,7 @@ module CmdParse
|
|
272
292
|
if args.length > 0
|
273
293
|
cmd = commandparser.main_command
|
274
294
|
arg = args.shift
|
275
|
-
while !arg.nil? && cmd.commands
|
295
|
+
while !arg.nil? && cmd.commands[ arg ]
|
276
296
|
cmd = cmd.commands[arg]
|
277
297
|
arg = args.shift
|
278
298
|
end
|
@@ -292,6 +312,7 @@ module CmdParse
|
|
292
312
|
#######
|
293
313
|
|
294
314
|
def show_program_help
|
315
|
+
puts commandparser.banner + "\n" if commandparser.banner
|
295
316
|
puts "Usage: #{commandparser.program_name} [options] COMMAND [options] [COMMAND [options] ...] [args]"
|
296
317
|
puts ""
|
297
318
|
list_commands( 1, commandparser.main_command )
|
@@ -331,6 +352,7 @@ module CmdParse
|
|
331
352
|
def execute( args )
|
332
353
|
version = commandparser.program_version
|
333
354
|
version = version.join( '.' ) if version.instance_of?( Array )
|
355
|
+
puts commandparser.banner + "\n" if commandparser.banner
|
334
356
|
puts version
|
335
357
|
exit
|
336
358
|
end
|
@@ -341,6 +363,9 @@ module CmdParse
|
|
341
363
|
# The main class for creating a command based CLI program.
|
342
364
|
class CommandParser
|
343
365
|
|
366
|
+
# A standard banner for help & version screens
|
367
|
+
attr_accessor :banner
|
368
|
+
|
344
369
|
# The top level command representing the program itself.
|
345
370
|
attr_reader :main_command
|
346
371
|
|
@@ -354,10 +379,12 @@ module CmdParse
|
|
354
379
|
attr_reader :handle_exceptions
|
355
380
|
|
356
381
|
# Create a new CommandParser object. The optional argument +handleExceptions+ specifies if the
|
357
|
-
# object should handle exceptions gracefully.
|
358
|
-
|
382
|
+
# object should handle exceptions gracefully. Set +partial_commands+ to +true+, if you want
|
383
|
+
# partial command matching for the top level commands.
|
384
|
+
def initialize( handleExceptions = false, partial_commands = false )
|
359
385
|
@main_command = Command.new( 'mainCommand', true )
|
360
386
|
@main_command.super_command = self
|
387
|
+
@main_command.use_partial_commands( partial_commands )
|
361
388
|
@program_name = $0
|
362
389
|
@program_version = "0.0.0"
|
363
390
|
@handle_exceptions = handleExceptions
|
@@ -402,7 +429,7 @@ module CmdParse
|
|
402
429
|
cmdName = command.default_command
|
403
430
|
end
|
404
431
|
else
|
405
|
-
raise InvalidCommandError.new( cmdName ) unless command.commands
|
432
|
+
raise InvalidCommandError.new( cmdName ) unless command.commands[ cmdName ]
|
406
433
|
end
|
407
434
|
|
408
435
|
command = command.commands[cmdName]
|
data/net.rb
CHANGED
@@ -27,7 +27,7 @@ class NetStatCommand < CmdParse::Command
|
|
27
27
|
|
28
28
|
end
|
29
29
|
|
30
|
-
cmd = CmdParse::CommandParser.new( true )
|
30
|
+
cmd = CmdParse::CommandParser.new( true, true )
|
31
31
|
cmd.program_name = "net"
|
32
32
|
cmd.program_version = [0, 1, 1]
|
33
33
|
cmd.options = CmdParse::OptionParserWrapper.new do |opt|
|
@@ -39,7 +39,7 @@ cmd.add_command( CmdParse::VersionCommand.new )
|
|
39
39
|
cmd.add_command( NetStatCommand.new )
|
40
40
|
|
41
41
|
# ipaddr
|
42
|
-
ipaddr = CmdParse::Command.new( 'ipaddr', true )
|
42
|
+
ipaddr = CmdParse::Command.new( 'ipaddr', true, true )
|
43
43
|
ipaddr.short_desc = "Manage IP addresses"
|
44
44
|
cmd.add_command( ipaddr )
|
45
45
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: cmdparse
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 2.0.
|
7
|
-
date: 2006-
|
6
|
+
version: 2.0.2
|
7
|
+
date: 2006-06-17 00:00:00 +02:00
|
8
8
|
summary: Advanced command line parser supporting commands
|
9
9
|
require_paths:
|
10
10
|
- lib
|