cmdparse 3.0.1 → 3.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.
- 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
|