help_parser 7.0.200907 → 8.0.210917
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/README.md +35 -32
- data/lib/help_parser/completion.rb +11 -6
- data/lib/help_parser/constants.rb +17 -3
- data/lib/help_parser/k2t2r.rb +3 -2
- data/lib/help_parser/macros.rb +8 -6
- data/lib/help_parser/options.rb +19 -10
- data/lib/help_parser/parseh.rb +14 -11
- data/lib/help_parser/{validations.rb → validate.rb} +17 -11
- data/lib/help_parser.rb +12 -22
- metadata +12 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89d031ef15e33460fc4f23ccec23cc98f01cb9808fd77bb478c63be6a638f034
|
4
|
+
data.tar.gz: 9521262caa0b0a1617fc52bdeec42c4e305a4fc4ce34c5871128c64eecf5aae7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e6c0faa99fd04e8b8e2f289b0f1894538747defaeb557400b36904f7c330961b9cc068aa8bdbe06493f8339af19cd4397cfdca9e1f82bc20ddbf84b91553955
|
7
|
+
data.tar.gz: 135b86c92d72faa5b49cdfedd7b6c66a9e568e592ae5b8afc86c612efa23020c828acb45693435d5f5349679f61a963bac81041da6d6bdae9549c1ab2de3214b
|
data/README.md
CHANGED
@@ -1,25 +1,30 @@
|
|
1
|
-
# Help Parser
|
1
|
+
# Help Parser VIII: Helpland
|
2
2
|
|
3
|
-
* [VERSION
|
4
|
-
* [github](https://www.github.com/carlosjhr64/
|
3
|
+
* [VERSION 8.0.210917](https://github.com/carlosjhr64/help_parser/releases)
|
4
|
+
* [github](https://www.github.com/carlosjhr64/help_parser)
|
5
5
|
* [rubygems](https://rubygems.org/gems/help_parser)
|
6
6
|
|
7
7
|
## DESCRIPTION:
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
Welcome to Help Parser!
|
10
|
+
Do you have your help text?
|
11
|
+
Let's parse!
|
11
12
|
|
12
|
-
|
13
|
+
## INSTALL:
|
14
|
+
|
15
|
+
```console
|
16
|
+
$ gem install help_parser
|
17
|
+
```
|
13
18
|
|
14
19
|
## SYNOPSIS:
|
15
20
|
<!-- The following PREVIEW has been approved for ALL PROGRAMMERS by CarlosJHR64.
|
16
21
|
For the README validator that checks against me lying....
|
17
22
|
```ruby
|
18
|
-
unless File.basename($PROGRAM_NAME) == '
|
23
|
+
unless File.basename($PROGRAM_NAME) == 'party'
|
19
24
|
# For example's sake say
|
20
|
-
$PROGRAM_NAME = '
|
25
|
+
$PROGRAM_NAME = 'party'
|
21
26
|
# and ARGV is
|
22
|
-
ARGV.concat ["-\-age", "-\-date=2020-09-07", '
|
27
|
+
ARGV.concat ["-\-age", "-\-date=2020-09-07", 'touch', 'that']
|
23
28
|
# and proceed as if run as:
|
24
29
|
# awesome -\-name=Doe -\-value a b c
|
25
30
|
end
|
@@ -28,34 +33,35 @@ The following gem has been rated
|
|
28
33
|
| M | Mature |
|
29
34
|
-->
|
30
35
|
|
31
|
-
> Who ever you are, you were meant to find me today...
|
32
|
-
> there is no turning back!
|
33
|
-
> Above all, don't invoke the command!
|
34
|
-
|
35
36
|
```ruby
|
36
37
|
require "help_parser"
|
37
38
|
|
38
39
|
HELP = <<-HELP
|
39
40
|
# <= Hash here, parser skips
|
40
|
-
# HelpParser:
|
41
|
+
# HelpParser: Party command example #
|
41
42
|
Usage:
|
42
|
-
|
43
|
-
|
44
|
-
|
43
|
+
party :options+ [<args>+]
|
44
|
+
party [:alternate] <arg=FLOAT>
|
45
|
+
party literal <arg1=WORD> <arg2=WORD>
|
45
46
|
Options:
|
46
47
|
-v --version \t Give version and quit
|
47
48
|
-h --help \t Give help and quit
|
48
49
|
-s --long \t Short long synonyms
|
49
|
-
--
|
50
|
+
--touch that \t Defaulted
|
50
51
|
--date=DATE \t Typed
|
51
52
|
--age=INTEGER 80 \t Typed and Defaulted
|
52
53
|
-a --all=YN y \t Short, long, typed, and defaulted
|
53
54
|
--to_be
|
54
55
|
--not_to_be
|
56
|
+
--rain
|
57
|
+
--water
|
58
|
+
--wet
|
55
59
|
Exclusive:
|
56
60
|
to_be not_to_be \t Tells parser these are mutually exclusive keys
|
57
61
|
Inclusive:
|
58
62
|
date age \t Tells parser any of these must include all of these
|
63
|
+
Conditional:
|
64
|
+
rain water wet \t Tells parser if first then all
|
59
65
|
Alternate:
|
60
66
|
--invoke
|
61
67
|
--wut
|
@@ -67,7 +73,7 @@ Types:
|
|
67
73
|
YN /^[YNyn]$/
|
68
74
|
# <= Hash here, parser breaks out
|
69
75
|
# Notes #
|
70
|
-
|
76
|
+
I wouldn't touch that!
|
71
77
|
HELP
|
72
78
|
|
73
79
|
VERSION = "1.2.3"
|
@@ -82,30 +88,27 @@ HelpParser.string(:arg1, :arg2, :arg3) # for OPTIONS.arg1, etc : String
|
|
82
88
|
#=> [:arg1, :arg2, :arg3]
|
83
89
|
|
84
90
|
## If run as:
|
85
|
-
##
|
86
|
-
OPTIONS.age
|
87
|
-
OPTIONS.
|
91
|
+
## party --age --date=2020-09-07 touch that
|
92
|
+
OPTIONS.age? #=> 80
|
93
|
+
OPTIONS.age?.class #=> Integer
|
94
|
+
OPTIONS.args? #=> ["touch", "that"]
|
95
|
+
OPTIONS.args?.class #=> Array
|
88
96
|
OPTIONS.arg? and OPTIONS.arg #=> false
|
97
|
+
OPTIONS.arg?.class #=> FalseClass
|
89
98
|
```
|
90
99
|
|
91
|
-
YOU HAVE INVOKED THE COMMAND...
|
92
|
-
YOUR HELP BELONGS TO ME!!!
|
93
|
-
|
94
100
|
## Features
|
95
101
|
|
96
|
-
*
|
97
|
-
*
|
102
|
+
* `$DEBUG=true` on --debug
|
103
|
+
* `$VERBOSE=true` on --verbose
|
98
104
|
* -h and --help simultaneously will check help string for errors
|
99
|
-
|
100
|
-
## INSTALL:
|
101
|
-
|
102
|
-
$ sudo gem install help_parser
|
105
|
+
* `HelpParser::REDTTY[msg]` will red color output `msg` to `STDERR`.
|
103
106
|
|
104
107
|
## LICENSE:
|
105
108
|
|
106
109
|
(The MIT License)
|
107
110
|
|
108
|
-
Copyright (c)
|
111
|
+
Copyright (c) 2021 CarlosJHR64
|
109
112
|
|
110
113
|
Permission is hereby granted, free of charge, to any person obtaining
|
111
114
|
a copy of this software and associated documentation files (the
|
@@ -29,8 +29,8 @@ module HelpParser
|
|
29
29
|
def diagnose
|
30
30
|
dict = {}
|
31
31
|
@specs.each do |k,v|
|
32
|
-
next if RESERVED
|
33
|
-
v.flatten.map{
|
32
|
+
next if RESERVED.include? k
|
33
|
+
v.flatten.map{_1.scan(/\w+/).first}.each{dict[_1]=true}
|
34
34
|
end
|
35
35
|
typos = @hash.keys.select{|k|k.is_a? String and not dict[k]}
|
36
36
|
raise UsageError, MSG[UNRECOGNIZED, typos] unless typos.empty?
|
@@ -46,10 +46,15 @@ module HelpParser
|
|
46
46
|
regex = t2r[type]
|
47
47
|
case value
|
48
48
|
when String
|
49
|
-
|
49
|
+
unless value=~regex
|
50
|
+
raise UsageError, "--#{key}=#{value} !~ #{type}=#{regex.inspect}"
|
51
|
+
end
|
50
52
|
when Array
|
51
53
|
value.each do |string|
|
52
|
-
|
54
|
+
unless string=~regex
|
55
|
+
raise UsageError,
|
56
|
+
"--#{key}=#{string} !~ #{type}=#{regex.inspect}"
|
57
|
+
end
|
53
58
|
end
|
54
59
|
else
|
55
60
|
raise UsageError, "--#{key} !~ #{type}=#{regex.inspect}"
|
@@ -106,7 +111,7 @@ module HelpParser
|
|
106
111
|
end
|
107
112
|
next
|
108
113
|
elsif m=FLAG_GROUP.match(token)
|
109
|
-
group,plus = m[
|
114
|
+
group,plus = m[:k],m[:p]
|
110
115
|
key = keys[i]
|
111
116
|
raise NoMatch if key.nil? || key.is_a?(Integer)
|
112
117
|
list = @specs[group].flatten.select{|f|f[0]=='-'}.map{|f| F2K[f]}
|
@@ -121,7 +126,7 @@ module HelpParser
|
|
121
126
|
elsif m=VARIABLE.match(token)
|
122
127
|
key = keys[i]
|
123
128
|
raise NoMatch unless key.is_a?(Integer)
|
124
|
-
variable,plus = m[
|
129
|
+
variable,plus = m[:k],m[:p]
|
125
130
|
if plus.nil?
|
126
131
|
@cache[variable] = @hash[key]
|
127
132
|
else
|
@@ -1,8 +1,19 @@
|
|
1
1
|
module HelpParser
|
2
|
+
V,VSN = 'v','version'
|
3
|
+
H,HLP = 'h','help'
|
4
|
+
VRBS,DBG = 'verbose','debug'
|
5
|
+
|
6
|
+
# reserved name
|
2
7
|
USAGE = 'usage'
|
3
8
|
TYPES = 'types'
|
4
9
|
EXCLUSIVE = 'exclusive'
|
5
10
|
INCLUSIVE = 'inclusive'
|
11
|
+
CONDITIONAL = 'conditional'
|
12
|
+
FLAG_CLUMPS = [EXCLUSIVE,INCLUSIVE,CONDITIONAL]
|
13
|
+
RESERVED = [USAGE,TYPES,EXCLUSIVE,INCLUSIVE,CONDITIONAL]
|
14
|
+
|
15
|
+
# sections
|
16
|
+
SECTION_NAME = /^[A-Z]\w+:$/
|
6
17
|
|
7
18
|
# usage
|
8
19
|
FLAG = /^[-][-]?(?<k>\w+)$/
|
@@ -16,7 +27,8 @@ module HelpParser
|
|
16
27
|
|
17
28
|
# spec -w,? --w+
|
18
29
|
SHORT_LONG = /^[-](?<s>\w),?\s+[-][-](?<k>\w+)$/
|
19
|
-
SHORT_LONG_DEFAULT =
|
30
|
+
SHORT_LONG_DEFAULT =
|
31
|
+
/^[-](?<s>\w),?\s+[-][-](?<k>\w+)(=(?<t>[A-Z]+))?,?\s+(?<d>[^-\s]\S*)$/
|
20
32
|
|
21
33
|
# spec W+ /~/
|
22
34
|
TYPE_DEF = /^(?<t>[A-Z]+),?\s+\/(?<r>\S+)\/$/
|
@@ -43,6 +55,7 @@ module HelpParser
|
|
43
55
|
REDUNDANT = 'Redundant'
|
44
56
|
EXCLUSIVE_KEYS = 'Exclusive keys'
|
45
57
|
INCLUSIVE_KEYS = 'Inclusive keys'
|
58
|
+
CONDITIONAL_KEYS = 'Conditional keys'
|
46
59
|
UNBALANCED = 'Unbalanced brackets'
|
47
60
|
UNRECOGNIZED_TOKEN = 'Unrecognized usage token'
|
48
61
|
UNRECOGNIZED_TYPE = 'Unrecognized type spec'
|
@@ -68,6 +81,7 @@ module HelpParser
|
|
68
81
|
# lambda utilities
|
69
82
|
MSG = lambda{|msg,*keys| "#{msg}: #{keys.join(' ')}"}
|
70
83
|
F2K = lambda{|f| f[1]=='-' ? f[2..((f.index('=')||0)-1)] : f[1]}
|
71
|
-
|
72
|
-
|
84
|
+
REDTTY = lambda{|msg,out=$stderr|
|
85
|
+
out.tty? ? out.puts("\033[0;31m#{msg}\033[0m"): out.puts(msg)
|
86
|
+
}
|
73
87
|
end
|
data/lib/help_parser/k2t2r.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module HelpParser
|
2
2
|
def self.k2t(specs)
|
3
3
|
k2t = NoDupHash.new
|
4
|
-
tokens = specs.select{|k,v| !(k==TYPES)}.values.flatten
|
4
|
+
tokens = specs.select{|k,v| !(k==TYPES)}.values.flatten
|
5
|
+
.select{|v|v.include?('=')}
|
5
6
|
tokens.each do |token|
|
6
7
|
if match = VARIABLE.match(token) || LONG.match(token)
|
7
|
-
name, type = match[
|
8
|
+
name, type = match[:k], match[:t]
|
8
9
|
if _=k2t[name]
|
9
10
|
raise HelpError, MSG[INCONSISTENT,name,type,_] unless type==_
|
10
11
|
else
|
data/lib/help_parser/macros.rb
CHANGED
@@ -20,7 +20,8 @@ module HelpParser
|
|
20
20
|
class Options
|
21
21
|
def #{name}?
|
22
22
|
s = @hash['#{name}']
|
23
|
-
raise UsageError, MSG[NOT_STRING,'#{name}'] unless s.nil? ||
|
23
|
+
raise UsageError, MSG[NOT_STRING,'#{name}'] unless s.nil? ||
|
24
|
+
s.is_a?(String)
|
24
25
|
return s
|
25
26
|
end
|
26
27
|
end
|
@@ -50,7 +51,8 @@ module HelpParser
|
|
50
51
|
class Options
|
51
52
|
def #{name}?
|
52
53
|
a = @hash['#{name}']
|
53
|
-
raise UsageError, MSG[NOT_STRINGS,'#{name}'] unless a.nil? ||
|
54
|
+
raise UsageError, MSG[NOT_STRINGS,'#{name}'] unless a.nil? ||
|
55
|
+
a.is_a?(Array)
|
54
56
|
return a
|
55
57
|
end
|
56
58
|
end
|
@@ -100,7 +102,7 @@ module HelpParser
|
|
100
102
|
def #{name}
|
101
103
|
f = @hash['#{name}']
|
102
104
|
raise unless f.is_a?(Array)
|
103
|
-
f.map{
|
105
|
+
f.map{_1.to_f}
|
104
106
|
rescue
|
105
107
|
raise UsageError, MSG[#{NOT_FLOATS},'#{name}']
|
106
108
|
end
|
@@ -118,7 +120,7 @@ module HelpParser
|
|
118
120
|
f = @hash['#{name}']
|
119
121
|
return nil unless f
|
120
122
|
raise unless f.is_a?(Array)
|
121
|
-
f.map{
|
123
|
+
f.map{_1.to_f}
|
122
124
|
rescue
|
123
125
|
raise UsageError, MSG[NOT_FLOATS,'#{name}']
|
124
126
|
end
|
@@ -169,7 +171,7 @@ module HelpParser
|
|
169
171
|
def #{name}
|
170
172
|
f = @hash['#{name}']
|
171
173
|
raise unless f.is_a?(Array)
|
172
|
-
f.map{
|
174
|
+
f.map{_1.to_i}
|
173
175
|
rescue
|
174
176
|
raise UsageError, MSG[NOT_INTEGERS,'#{name}']
|
175
177
|
end
|
@@ -187,7 +189,7 @@ module HelpParser
|
|
187
189
|
f = @hash['#{name}']
|
188
190
|
return nil unless f
|
189
191
|
raise unless f.is_a?(Array)
|
190
|
-
f.map{
|
192
|
+
f.map{_1.to_i}
|
191
193
|
rescue
|
192
194
|
raise UsageError, MSG[NOT_INTEGERS,'#{name}']
|
193
195
|
end
|
data/lib/help_parser/options.rb
CHANGED
@@ -2,36 +2,45 @@ module HelpParser
|
|
2
2
|
class Options
|
3
3
|
def initialize(version, help, argv)
|
4
4
|
@hash = HelpParser.parsea(argv)
|
5
|
-
if version && (@hash.has_key?(
|
5
|
+
if version && (@hash.has_key?(V) || @hash.has_key?(VSN))
|
6
6
|
# -v or --version
|
7
7
|
raise VersionException, version
|
8
8
|
end
|
9
9
|
if help
|
10
|
-
h = [
|
11
|
-
if h.any?{
|
12
|
-
HelpParser.parseh(help, validate: true) if h.all?{
|
10
|
+
h = [H, HLP]
|
11
|
+
if h.any?{@hash.key? _1}
|
12
|
+
HelpParser.parseh(help, validate: true) if h.all?{@hash.key? _1}
|
13
13
|
raise HelpException, help
|
14
14
|
end
|
15
15
|
specs = HelpParser.parseh(help)
|
16
16
|
Completion.new(@hash, specs)
|
17
17
|
if exclusive=specs[EXCLUSIVE]
|
18
18
|
exclusive.each do |x|
|
19
|
-
count =
|
19
|
+
count = x.count{@hash.key? _1}
|
20
20
|
raise HelpParser::UsageError, MSG[EXCLUSIVE_KEYS,*x] if count > 1
|
21
21
|
end
|
22
22
|
end
|
23
23
|
if inclusive=specs[INCLUSIVE]
|
24
24
|
inclusive.each do |i|
|
25
|
-
count =
|
26
|
-
|
25
|
+
count = i.count{@hash.key? _1}
|
26
|
+
unless count==0 or count==i.length
|
27
|
+
raise HelpParser::UsageError, MSG[INCLUSIVE_KEYS,*i]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
if conditional=specs[CONDITIONAL]
|
32
|
+
conditional.each do |c|
|
33
|
+
if @hash.key? c[0] and not c.all?{@hash.key? _1}
|
34
|
+
raise HelpParser::UsageError, MSG[CONDITIONAL_KEYS,*c]
|
35
|
+
end
|
27
36
|
end
|
28
37
|
end
|
29
38
|
end
|
30
|
-
$VERBOSE = true if @hash[
|
31
|
-
$DEBUG = true if @hash[
|
39
|
+
$VERBOSE = true if @hash[VRBS]==true
|
40
|
+
$DEBUG = true if @hash[DBG]==true
|
32
41
|
end
|
33
42
|
|
34
|
-
def
|
43
|
+
def to_h
|
35
44
|
@hash
|
36
45
|
end
|
37
46
|
|
data/lib/help_parser/parseh.rb
CHANGED
@@ -4,7 +4,7 @@ module HelpParser
|
|
4
4
|
help.each_line do |line|
|
5
5
|
line.chomp!
|
6
6
|
next if line==''
|
7
|
-
if line
|
7
|
+
if line=~SECTION_NAME
|
8
8
|
name = line[0..-2].downcase
|
9
9
|
specs[name] = []
|
10
10
|
else
|
@@ -15,29 +15,32 @@ module HelpParser
|
|
15
15
|
raise HelpError, EXTRANEOUS_SPACES if validate and spec==''
|
16
16
|
case name
|
17
17
|
when USAGE
|
18
|
-
|
18
|
+
Validate.line_chars(spec.chars) if validate
|
19
19
|
tokens = HelpParser.parseu(spec.chars)
|
20
|
-
|
20
|
+
Validate.usage_tokens(tokens) if validate
|
21
21
|
specs[USAGE].push tokens
|
22
22
|
when TYPES
|
23
|
-
|
23
|
+
if validate and not spec=~TYPE_DEF
|
24
|
+
raise HelpError, MSG[UNRECOGNIZED_TYPE,spec]
|
25
|
+
end
|
24
26
|
specs[TYPES].push spec.split(CSV)
|
25
|
-
when EXCLUSIVE,INCLUSIVE
|
26
|
-
|
27
|
+
when *FLAG_CLUMPS # EXCLUSIVE,INCLUSIVE,CONDITIONAL,...
|
28
|
+
if validate and not spec=~X_DEF
|
29
|
+
raise HelpError, MSG[UNRECOGNIZED_X,spec]
|
30
|
+
end
|
27
31
|
specs[name].push spec.split(CSV)
|
28
32
|
else
|
29
|
-
|
30
|
-
|
31
|
-
end
|
33
|
+
raise HelpError, MSG[UNRECOGNIZED_OPTION,spec] if validate and
|
34
|
+
not [SHORT, LONG, SHORT_LONG, SHORT_LONG_DEFAULT].any?{_1=~spec}
|
32
35
|
specs[name].push spec.split(CSV)
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
36
39
|
if validate
|
37
|
-
|
40
|
+
Validate.usage_specs(specs)
|
38
41
|
if t2r = HelpParser.t2r(specs)
|
39
42
|
k2t = HelpParser.k2t(specs)
|
40
|
-
|
43
|
+
Validate.k2t2r(specs, k2t, t2r)
|
41
44
|
end
|
42
45
|
end
|
43
46
|
return specs
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module HelpParser
|
2
|
-
|
2
|
+
module Validate
|
3
|
+
def self.line_chars(chars)
|
3
4
|
count = 0
|
4
5
|
chars.each do |c|
|
5
6
|
if c=='['
|
@@ -12,7 +13,7 @@ module HelpParser
|
|
12
13
|
raise HelpError, MSG[UNBALANCED,chars.join] unless count==0
|
13
14
|
end
|
14
15
|
|
15
|
-
def self.
|
16
|
+
def self.usage_tokens(tokens)
|
16
17
|
words = []
|
17
18
|
tokens.flatten.each do |token|
|
18
19
|
match = token.match(FLAG) ||
|
@@ -20,22 +21,24 @@ module HelpParser
|
|
20
21
|
token.match(VARIABLE) ||
|
21
22
|
token.match(FLAG_GROUP)
|
22
23
|
raise HelpError, MSG[UNRECOGNIZED_TOKEN,token] unless match
|
23
|
-
words.push match[
|
24
|
+
words.push match[:k] # key
|
24
25
|
end
|
25
26
|
words.each_with_index do |word,i|
|
26
27
|
raise HelpError, MSG[DUP_WORD,word] unless i==words.rindex(word)
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
30
|
-
def self.
|
31
|
-
option_specs = specs.select{|a,b|
|
31
|
+
def self.usage_specs(specs)
|
32
|
+
option_specs = specs.select{|a,b| not RESERVED.include? a}
|
32
33
|
flags = option_specs.values.flatten.select{|f|f[0]=='-'}.map{|f| F2K[f]}
|
33
|
-
|
34
|
+
FLAG_CLUMPS.each do |k|
|
34
35
|
if a=specs[k]
|
35
36
|
seen = {}
|
36
37
|
a.each do |xs|
|
37
38
|
k = xs.sort.join(' ').to_sym
|
38
|
-
|
39
|
+
if seen[k] or not xs.length==xs.uniq.length
|
40
|
+
raise HelpError, MSG[DUP_X,k]
|
41
|
+
end
|
39
42
|
seen[k] = true
|
40
43
|
xs.each do |x|
|
41
44
|
raise HelpError, MSG[UNSEEN_FLAG, x] unless flags.include?(x)
|
@@ -51,7 +54,7 @@ module HelpParser
|
|
51
54
|
unless specs_usage.nil?
|
52
55
|
specs_usage.flatten.each do |token|
|
53
56
|
if match = token.match(FLAG_GROUP)
|
54
|
-
key = match[
|
57
|
+
key = match[:k]
|
55
58
|
raise HelpError, MSG[UNDEFINED_SECTION,key] unless specs[key]
|
56
59
|
group.push(key)
|
57
60
|
end
|
@@ -59,12 +62,12 @@ module HelpParser
|
|
59
62
|
end
|
60
63
|
specs.each do |key,tokens|
|
61
64
|
raise HelpError, MSG[MISSING_CASES,key] unless tokens.size>0
|
62
|
-
next if specs_usage.nil? or RESERVED
|
65
|
+
next if specs_usage.nil? or RESERVED.include? key
|
63
66
|
raise HelpError, MSG[MISSING_USAGE,key] unless group.include?(key)
|
64
67
|
end
|
65
68
|
end
|
66
69
|
|
67
|
-
def self.
|
70
|
+
def self.k2t2r(specs, k2t, t2r)
|
68
71
|
a,b = k2t.values.uniq.sort,t2r.keys.sort
|
69
72
|
unless a==b
|
70
73
|
c = (a+b).uniq.select{|x|!(a.include?(x) && b.include?(x))}
|
@@ -82,8 +85,11 @@ module HelpParser
|
|
82
85
|
long = long_type[2..(i-1)]
|
83
86
|
type = long_type[(i+1)..-1]
|
84
87
|
regex = t2r[type]
|
85
|
-
|
88
|
+
unless regex=~default
|
89
|
+
raise HelpError, MSG[BAD_DEFAULT,long,default,type,regex.inspect]
|
90
|
+
end
|
86
91
|
end
|
87
92
|
end
|
88
93
|
end
|
89
94
|
end
|
95
|
+
end
|
data/lib/help_parser.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
require_relative '
|
2
|
-
require_relative '
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
9
|
-
require_relative '
|
10
|
-
require_relative '
|
11
|
-
require_relative './help_parser/macros'
|
1
|
+
require_relative 'help_parser/constants'
|
2
|
+
require_relative 'help_parser/exceptions'
|
3
|
+
require_relative 'help_parser/aliases'
|
4
|
+
require_relative 'help_parser/parsea'
|
5
|
+
require_relative 'help_parser/parseu'
|
6
|
+
require_relative 'help_parser/parseh'
|
7
|
+
require_relative 'help_parser/k2t2r'
|
8
|
+
require_relative 'help_parser/completion'
|
9
|
+
require_relative 'help_parser/options'
|
10
|
+
require_relative 'help_parser/macros'
|
12
11
|
|
13
12
|
module HelpParser
|
14
|
-
VERSION = '
|
13
|
+
VERSION = '8.0.210917'
|
14
|
+
autoload :Validate, 'help_parser/validate'
|
15
15
|
|
16
16
|
def self.[](
|
17
17
|
version = nil,
|
@@ -21,16 +21,6 @@ module HelpParser
|
|
21
21
|
rescue HelpParserException => exception
|
22
22
|
exception.exit
|
23
23
|
end
|
24
|
-
|
25
|
-
def self.run(
|
26
|
-
version = nil,
|
27
|
-
help = nil,
|
28
|
-
argv = [File.basename($0)]+ARGV)
|
29
|
-
options = Options.new(version, help, argv)
|
30
|
-
yield options
|
31
|
-
rescue HelpParserException => exception
|
32
|
-
exception.exit
|
33
|
-
end
|
34
24
|
end
|
35
25
|
|
36
26
|
# Requires:
|
metadata
CHANGED
@@ -1,20 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: help_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 8.0.210917
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
autorequire:
|
7
|
+
- CarlosJHR64
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description:
|
14
|
-
Can't help YOU???
|
15
|
-
You're not the first to say that...
|
16
|
-
|
17
|
-
I will parse your help!
|
13
|
+
description: "Welcome to Help Parser! \nDo you have your help text? \nLet's parse!\n"
|
18
14
|
email: carlosjhr64@gmail.com
|
19
15
|
executables: []
|
20
16
|
extensions: []
|
@@ -33,12 +29,12 @@ files:
|
|
33
29
|
- lib/help_parser/parsea.rb
|
34
30
|
- lib/help_parser/parseh.rb
|
35
31
|
- lib/help_parser/parseu.rb
|
36
|
-
- lib/help_parser/
|
37
|
-
homepage: https://github.com/carlosjhr64/
|
32
|
+
- lib/help_parser/validate.rb
|
33
|
+
homepage: https://github.com/carlosjhr64/help_parser
|
38
34
|
licenses:
|
39
35
|
- MIT
|
40
36
|
metadata: {}
|
41
|
-
post_install_message:
|
37
|
+
post_install_message:
|
42
38
|
rdoc_options: []
|
43
39
|
require_paths:
|
44
40
|
- lib
|
@@ -53,9 +49,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
49
|
- !ruby/object:Gem::Version
|
54
50
|
version: '0'
|
55
51
|
requirements:
|
56
|
-
- 'ruby: ruby
|
57
|
-
rubygems_version: 3.
|
58
|
-
signing_key:
|
52
|
+
- 'ruby: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]'
|
53
|
+
rubygems_version: 3.2.22
|
54
|
+
signing_key:
|
59
55
|
specification_version: 4
|
60
|
-
summary:
|
56
|
+
summary: Welcome to Help Parser! Do you have your help text? Let's parse!
|
61
57
|
test_files: []
|