cmdparse 3.0.1 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/doc/default.scss +1 -1
- data/doc/default.template +4 -7
- data/doc/news.page +8 -0
- data/lib/cmdparse.rb +55 -44
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8fcb2e570f788efd92d168dc0c3f4dc2008502e
|
4
|
+
data.tar.gz: 42fcef0757b5bfc74ce00dd517e448103aad1f8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b75dca182871ab46fc25b11a32d4373104dc994fde0aefa3887d6b51e4eecf69260c7b740963703ab0383dbbbc196809b5293e7ea08e949c1883553677709a7c
|
7
|
+
data.tar.gz: e959185d687ed0134e3358804c6390dbb4067aa77b1f6184c33b01918935721b9451b51d297c10b444043305b6779eea04cc372d840266f1cd54f0995255459e
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.0.
|
1
|
+
3.0.2
|
data/doc/default.scss
CHANGED
@@ -270,7 +270,7 @@ $logo-color: #3A974D;
|
|
270
270
|
/***************************************/
|
271
271
|
/***************************************/
|
272
272
|
|
273
|
-
@import url("
|
273
|
+
@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,700|Open+Sans+Condensed:300,700");
|
274
274
|
|
275
275
|
/*********************************************************************************/
|
276
276
|
/* Basic */
|
data/doc/default.template
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
<!-- Sidebar -->
|
26
26
|
<div id="sidebar">
|
27
|
-
<h1 id="logo"><a href="{relocatable: /}">cmdparse</a><br /><span>v 3.0.
|
27
|
+
<h1 id="logo"><a href="{relocatable: /}">cmdparse</a><br /><span>v 3.0.2</span></h1>
|
28
28
|
|
29
29
|
<!-- Nav -->
|
30
30
|
<nav id="nav">
|
@@ -62,13 +62,10 @@
|
|
62
62
|
var sc_project=10338773;
|
63
63
|
var sc_invisible=1;
|
64
64
|
var sc_security="7779f3af";
|
65
|
+
var scJsHost = (("https:" == document.location.protocol) ? "https://secure." : "http://www.");
|
66
|
+
document.write("<sc"+"ript type='text/javascript' src='" + scJsHost+ "statcounter.com/counter/counter.js'></"+"script>");
|
65
67
|
</script>
|
66
|
-
<
|
67
|
-
<noscript><div class="statcounter">
|
68
|
-
<a title="free hit counters" href="http://statcounter.com/" class="statcounter">
|
69
|
-
<img class="statcounter" src="http://c.statcounter.com/10338773/0/7779f3af/1/" alt="free hit counters" />
|
70
|
-
</a>
|
71
|
-
</div></noscript>
|
68
|
+
<noscript><div class="statcounter"><a title="website statistics" href="http://statcounter.com/" target="_blank"><img class="statcounter" src="//c.statcounter.com/10338773/0/7779f3af/1/" alt="website statistics" /></a></div></noscript>
|
72
69
|
<!-- End of StatCounter Code for Default Guide -->
|
73
70
|
</body>
|
74
71
|
</html>
|
data/doc/news.page
CHANGED
@@ -5,6 +5,14 @@ sort_info: 8
|
|
5
5
|
---
|
6
6
|
## News
|
7
7
|
|
8
|
+
### 2016-12-28 cmdparse 3.0.2 released!
|
9
|
+
|
10
|
+
Changes:
|
11
|
+
|
12
|
+
* Raise an error if too many arguments are provided for a command
|
13
|
+
* Better error message if not enough arguments are provided for a command
|
14
|
+
|
15
|
+
|
8
16
|
### 2015-03-14 cmdparse 3.0.1 released!
|
9
17
|
|
10
18
|
Changes:
|
data/lib/cmdparse.rb
CHANGED
@@ -12,13 +12,42 @@ require 'optparse'
|
|
12
12
|
OptionParser::Officious.delete('version')
|
13
13
|
OptionParser::Officious.delete('help')
|
14
14
|
|
15
|
+
|
16
|
+
# Extension for OptionParser objects to allow access to some internals.
|
17
|
+
class OptionParser #:nodoc:
|
18
|
+
|
19
|
+
# Access the option list stack.
|
20
|
+
attr_reader :stack
|
21
|
+
|
22
|
+
# Returns +true+ if at least one local option is defined.
|
23
|
+
#
|
24
|
+
# The zeroth stack element is not respected when doing the query because it contains either the
|
25
|
+
# OptionParser::DefaultList or a CmdParse::MultiList with the global options of the
|
26
|
+
# CmdParse::CommandParser.
|
27
|
+
def options_defined?
|
28
|
+
stack[1..-1].each do |list|
|
29
|
+
list.each_option do |switch|
|
30
|
+
return true if switch.kind_of?(OptionParser::Switch) && (switch.short || switch.long)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns +true+ if a banner has been set.
|
37
|
+
def banner?
|
38
|
+
!@banner.nil?
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
15
44
|
# Namespace module for cmdparse.
|
16
45
|
#
|
17
46
|
# See CmdParse::CommandParser and CmdParse::Command for the two important classes.
|
18
47
|
module CmdParse
|
19
48
|
|
20
49
|
# The version of this cmdparse implemention
|
21
|
-
VERSION = '3.0.
|
50
|
+
VERSION = '3.0.2'.freeze
|
22
51
|
|
23
52
|
|
24
53
|
# Base class for all cmdparse errors.
|
@@ -76,6 +105,11 @@ module CmdParse
|
|
76
105
|
reason 'Not enough arguments provided, minimum is'
|
77
106
|
end
|
78
107
|
|
108
|
+
# This error is thrown when too many arguments are provided for the command.
|
109
|
+
class TooManyArgumentsError < ParseError
|
110
|
+
reason 'Too many arguments provided, maximum is'
|
111
|
+
end
|
112
|
+
|
79
113
|
# Command Hash - will return partial key matches as well if there is a single non-ambigous
|
80
114
|
# matching key
|
81
115
|
class CommandHash < Hash #:nodoc:
|
@@ -85,7 +119,7 @@ module CmdParse
|
|
85
119
|
end
|
86
120
|
|
87
121
|
def [](cmd_name) #:nodoc:
|
88
|
-
super
|
122
|
+
super || begin
|
89
123
|
possible = keys.select {|key| key[0, cmd_name.length] == cmd_name }
|
90
124
|
fetch(possible[0]) if possible.size == 1
|
91
125
|
end
|
@@ -125,33 +159,6 @@ module CmdParse
|
|
125
159
|
|
126
160
|
end
|
127
161
|
|
128
|
-
# Extension for OptionParser objects to allow access to some internals.
|
129
|
-
class ::OptionParser #:nodoc:
|
130
|
-
|
131
|
-
# Access the option list stack.
|
132
|
-
attr_reader :stack
|
133
|
-
|
134
|
-
# Returns +true+ if at least one local option is defined.
|
135
|
-
#
|
136
|
-
# The zeroth stack element is not respected when doing the query because it contains either the
|
137
|
-
# OptionParser::DefaultList or a CmdParse::MultiList with the global options of the
|
138
|
-
# CmdParse::CommandParser.
|
139
|
-
def options_defined?
|
140
|
-
stack[1..-1].each do |list|
|
141
|
-
list.each_option do |switch|
|
142
|
-
return true if ::OptionParser::Switch === switch && (switch.short || switch.long)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
false
|
146
|
-
end
|
147
|
-
|
148
|
-
# Returns +true+ if a banner has been set.
|
149
|
-
def banner?
|
150
|
-
!@banner.nil?
|
151
|
-
end
|
152
|
-
|
153
|
-
end
|
154
|
-
|
155
162
|
# === Base class for commands
|
156
163
|
#
|
157
164
|
# This class implements all needed methods so that it can be used by the CommandParser class.
|
@@ -258,8 +265,8 @@ module CmdParse
|
|
258
265
|
#
|
259
266
|
# The argument +val+ needs to be +true+ or +false+.
|
260
267
|
def takes_commands(val)
|
261
|
-
if !val && commands.
|
262
|
-
raise Error, "Can't change
|
268
|
+
if !val && !commands.empty?
|
269
|
+
raise Error, "Can't change takes_commands to false because there are already sub-commands"
|
263
270
|
else
|
264
271
|
@takes_commands = val
|
265
272
|
end
|
@@ -486,7 +493,7 @@ module CmdParse
|
|
486
493
|
#
|
487
494
|
# {command | other_command | another_command }
|
488
495
|
def usage_commands
|
489
|
-
(commands.
|
496
|
+
(commands.empty? ? '' : "{#{commands.keys.sort.join(" | ")}}")
|
490
497
|
end
|
491
498
|
|
492
499
|
# Returns the formatted short description.
|
@@ -511,7 +518,7 @@ module CmdParse
|
|
511
518
|
def help_commands
|
512
519
|
describe_commands = lambda do |command, level = 0|
|
513
520
|
command.commands.sort.collect do |name, cmd|
|
514
|
-
str =
|
521
|
+
str = " " * level << name << (name == command.default_command ? " (*)" : '')
|
515
522
|
str = str.ljust(command_parser.help_desc_indent) << cmd.short_desc.to_s
|
516
523
|
str = format(str, width: command_parser.help_line_width - command_parser.help_indent,
|
517
524
|
indent: command_parser.help_desc_indent)
|
@@ -527,7 +534,7 @@ module CmdParse
|
|
527
534
|
# For the output format see #cond_format_help_section
|
528
535
|
def help_arguments
|
529
536
|
desc = @argument_desc.map {|k, v| k.to_s.ljust(command_parser.help_desc_indent) << v.to_s}
|
530
|
-
cond_format_help_section('Arguments', desc, condition:
|
537
|
+
cond_format_help_section('Arguments', desc, condition: !@argument_desc.empty?)
|
531
538
|
end
|
532
539
|
|
533
540
|
# Returns the formatted option descriptions for the given OptionParser instance.
|
@@ -554,7 +561,7 @@ module CmdParse
|
|
554
561
|
|
555
562
|
# For sorting commands by name.
|
556
563
|
def <=>(other)
|
557
|
-
|
564
|
+
name <=> other.name
|
558
565
|
end
|
559
566
|
|
560
567
|
protected
|
@@ -585,7 +592,7 @@ module CmdParse
|
|
585
592
|
out = "#{title}:\n"
|
586
593
|
lines = lines.flatten.join("\n").split(/\n/)
|
587
594
|
if preformatted
|
588
|
-
lines.map! {|l| ' '*command_parser.help_indent << l} if indent
|
595
|
+
lines.map! {|l| ' ' * command_parser.help_indent << l} if indent
|
589
596
|
out << lines.join("\n")
|
590
597
|
else
|
591
598
|
out << format(lines.join("\n"), indent: (indent ? command_parser.help_indent : 0), indent_first_line: true)
|
@@ -617,11 +624,11 @@ module CmdParse
|
|
617
624
|
|
618
625
|
content.split(/\n\n/).map do |paragraph|
|
619
626
|
lines = []
|
620
|
-
|
627
|
+
unless paragraph.empty?
|
621
628
|
unless (str = paragraph.slice!(pattern).sub(/[ \n]\z/, ''))
|
622
629
|
str = paragraph.slice!(0, line_length)
|
623
630
|
end
|
624
|
-
lines << (lines.empty? && !indent_first_line ? '' : ' '*indent) + str.
|
631
|
+
lines << (lines.empty? && !indent_first_line ? '' : ' ' * indent) + str.tr("\n", ' ')
|
625
632
|
pattern = other_lines_pattern
|
626
633
|
end
|
627
634
|
lines.join("\n")
|
@@ -648,8 +655,8 @@ module CmdParse
|
|
648
655
|
def initialize #:nodoc:
|
649
656
|
super('help', takes_commands: false)
|
650
657
|
short_desc('Provide help for individual commands')
|
651
|
-
long_desc('This command prints the program help if no arguments are given. If one or '
|
652
|
-
'more command names are given as arguments, these arguments are interpreted '
|
658
|
+
long_desc('This command prints the program help if no arguments are given. If one or ' \
|
659
|
+
'more command names are given as arguments, these arguments are interpreted ' \
|
653
660
|
'as a hierachy of commands and the help for the right most command is show.')
|
654
661
|
argument_desc(COMMAND: 'The name of a command or sub-command')
|
655
662
|
end
|
@@ -666,7 +673,7 @@ module CmdParse
|
|
666
673
|
end
|
667
674
|
|
668
675
|
def execute(*args) #:nodoc:
|
669
|
-
if args.
|
676
|
+
if !args.empty?
|
670
677
|
cmd = command_parser.main_command
|
671
678
|
arg = args.shift
|
672
679
|
while !arg.nil? && cmd.commands.key?(arg)
|
@@ -789,8 +796,8 @@ module CmdParse
|
|
789
796
|
#
|
790
797
|
# handle_exceptions:: Set to +true+ if exceptions should be handled gracefully by showing the
|
791
798
|
# error and a help message, or to +false+ if exception should not be handled
|
792
|
-
# at all. If this options is set to :no_help, the exception is handled but
|
793
|
-
# help message is shown.
|
799
|
+
# at all. If this options is set to :no_help, the exception is handled but
|
800
|
+
# no help message is shown.
|
794
801
|
#
|
795
802
|
# takes_commands:: Specifies whether the main program takes any commands.
|
796
803
|
def initialize(handle_exceptions: false, takes_commands: true)
|
@@ -868,7 +875,11 @@ module CmdParse
|
|
868
875
|
else
|
869
876
|
original_n = @current_command.arity
|
870
877
|
n = (original_n < 0 ? -original_n - 1 : original_n)
|
871
|
-
|
878
|
+
if argv.size < n
|
879
|
+
raise NotEnoughArgumentsError.new("#{n} - #{@current_command.usage_arguments}")
|
880
|
+
elsif argv.size > n && original_n > 0
|
881
|
+
raise TooManyArgumentsError.new("#{n} - #{@current_command.usage_arguments}")
|
882
|
+
end
|
872
883
|
|
873
884
|
argv.slice!(n..-1) unless original_n < 0
|
874
885
|
@current_command.execute(*argv)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cmdparse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Leitner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: webgen
|
@@ -76,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
76
|
version: '0'
|
77
77
|
requirements: []
|
78
78
|
rubyforge_project:
|
79
|
-
rubygems_version: 2.
|
79
|
+
rubygems_version: 2.6.8
|
80
80
|
signing_key:
|
81
81
|
specification_version: 4
|
82
82
|
summary: Advanced command line parser supporting commands
|