help_parser 8.2.230210 → 9.0.240926
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 +74 -59
- data/lib/help_parser/macros.rb +12 -128
- data/lib/help_parser/parseh.rb +5 -2
- data/lib/help_parser/validate.rb +13 -3
- data/lib/help_parser.rb +1 -1
- metadata +60 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60dd76f994f506e15f1593b7561ee1b23cc59c0cf3cd53cc1140dcbc59b7b0f5
|
4
|
+
data.tar.gz: c113698c66f7790c4977d57c7906dad639774dd315158677091e59c5db188cef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f40ba2d34b2340c12d69812d8554a942dac423a2e5e764ac15d58cf644f978eb937e2104bef8ce288dd79f0875d8bda92998ad692e50ebbe6ff0f5cb6d130ec3
|
7
|
+
data.tar.gz: f12bfbd92bfe9101292598c69ceff2beb81bd92838b975f39d61e15e16fc6268ffb525896f5983186bced970e3e63d4e6a27cbd5d63cad91943a264236b184b4
|
data/README.md
CHANGED
@@ -1,14 +1,12 @@
|
|
1
|
-
# Help Parser
|
1
|
+
# Help Parser IX: Revelations
|
2
2
|
|
3
|
-
* [VERSION
|
3
|
+
* [VERSION 9.0.240926](https://github.com/carlosjhr64/help_parser/releases)
|
4
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
|
-
Do you have your help text?
|
11
|
-
Let's parse!
|
9
|
+
Options parsing based on your help text.
|
12
10
|
|
13
11
|
## INSTALL:
|
14
12
|
```console
|
@@ -18,94 +16,111 @@ $ gem install help_parser
|
|
18
16
|
<!-- The following PREVIEW has been approved for ALL PROGRAMMERS by CarlosJHR64.
|
19
17
|
For the README validator that checks against me lying....
|
20
18
|
```ruby
|
21
|
-
unless File.basename($PROGRAM_NAME) == '
|
19
|
+
unless File.basename($PROGRAM_NAME) == 'revelations'
|
22
20
|
# For example's sake say
|
23
|
-
$PROGRAM_NAME = '
|
21
|
+
$PROGRAM_NAME = 'revelations'
|
24
22
|
# and ARGV is
|
25
|
-
ARGV.concat [
|
26
|
-
# and proceed as if run as:
|
27
|
-
# awesome -\-name=Doe -\-value a b c
|
23
|
+
ARGV.concat ['1,2,3','4,5,6']
|
24
|
+
# and proceed as if run as: `revelations 1,2,3 4,5,6`
|
28
25
|
end
|
29
26
|
```
|
30
27
|
The following gem has been rated
|
31
|
-
| M | Mature |
|
32
|
-
-->
|
28
|
+
| M | Mature | -->
|
33
29
|
```ruby
|
34
|
-
|
30
|
+
#!/usr/bin/env ruby
|
31
|
+
require 'help_parser'
|
35
32
|
|
36
|
-
|
33
|
+
VERSION = '1.2.3'
|
34
|
+
OPTIONS = HelpParser[VERSION, <<-HELP]
|
37
35
|
# <= Hash here, parser skips
|
38
|
-
# HelpParser
|
36
|
+
# HelpParser command example #
|
37
|
+
|
38
|
+
One can write any notes on the help text as long as
|
39
|
+
it does not start with a space or a "Keyword:".
|
40
|
+
|
39
41
|
Usage:
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
revelations :options+ [<arg>]
|
43
|
+
revelations :alternate <args=FLOAT>+
|
44
|
+
revelations literal <arg1=WORD> <arg2=WORD>
|
45
|
+
revelations <numbers=CSVI>+
|
46
|
+
|
47
|
+
The ":keyword" refers to a flag in defined in the "Keyword:" section.
|
48
|
+
A "[...]" is an optional part of the usage.
|
49
|
+
A "+" means one or more of it is allowed.
|
50
|
+
|
43
51
|
Options:
|
44
|
-
-v --version
|
45
|
-
-h --help
|
46
|
-
|
47
|
-
--
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
52
|
+
-v --version \t Give version and quit
|
53
|
+
-h --help \t Give help and quit
|
54
|
+
--verbose \t Set $VERBOSE true
|
55
|
+
--debug \t Set $DEBUG true
|
56
|
+
|
57
|
+
The above(version, help, verbose, debug) are built-in options.
|
58
|
+
The tab, "\t", splits the comment from the flags.
|
59
|
+
On its own a flag is set to true, else it's nil.
|
60
|
+
But you can also set a long flag value to a string as allowed by its type.
|
61
|
+
|
62
|
+
-a --all=YN y \t Short, long, typed, and defaulted
|
63
|
+
|
64
|
+
OPTIONS.all at first is nil. If set without a value, it's set to "y"
|
65
|
+
One can set it to to either "n" of "y" as allowed by YN(see below under Types:).
|
66
|
+
|
67
|
+
--stop=NUMBER \t Typed
|
68
|
+
--start=NUMBER 0 \t Typed and defaulted
|
69
|
+
|
53
70
|
--rain
|
54
71
|
--water
|
55
72
|
--wet
|
73
|
+
|
74
|
+
--to_be
|
75
|
+
--not_to_be
|
76
|
+
|
56
77
|
Exclusive:
|
57
|
-
to_be not_to_be
|
78
|
+
to_be not_to_be \t Tells parser these are mutually exclusive keys
|
58
79
|
Inclusive:
|
59
|
-
|
80
|
+
start stop \t Tells parser any of these must include all of these
|
60
81
|
Conditional:
|
61
|
-
rain water wet
|
82
|
+
rain water wet \t Tells parser if first then all
|
83
|
+
\t Note how one can continue the comment as needed
|
84
|
+
|
62
85
|
Alternate:
|
63
|
-
--
|
64
|
-
--
|
86
|
+
--sum
|
87
|
+
--multiply
|
88
|
+
|
65
89
|
Types:
|
66
90
|
WORD /^[A-Za-z]+$/
|
67
|
-
|
68
|
-
INTEGER /^\\d+$/
|
91
|
+
NUMBER /^\\d+$/
|
69
92
|
FLOAT /^\\d+\\.\\d+$/
|
70
93
|
YN /^[YNyn]$/
|
94
|
+
CSVI /^\\d+(,\\d+)*$/
|
71
95
|
# <= Hash here, parser breaks out
|
72
|
-
|
73
|
-
I wouldn't touch that!
|
96
|
+
And now one can freely write whatever....
|
74
97
|
HELP
|
75
98
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
HelpParser.
|
83
|
-
HelpParser.
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
OPTIONS.age? #=> 80
|
90
|
-
OPTIONS.age?.class #=> Integer
|
91
|
-
OPTIONS.args? #=> ["touch", "that"]
|
92
|
-
OPTIONS.args?.class #=> Array
|
93
|
-
OPTIONS.arg? and OPTIONS.arg #=> false
|
94
|
-
OPTIONS.arg?.class #=> FalseClass
|
99
|
+
# Tell HelpParser how to remap the string values:
|
100
|
+
HelpParser.integer(:stop, :start) # HelpParser.map(:stop, :start, map: :to_i)
|
101
|
+
HelpParser.float(:args) # HelpParser.map(:args, map: :to_f)
|
102
|
+
# Also available: HelpParser.rational(*name) = HelpParser.map(*names, map: to_r)
|
103
|
+
|
104
|
+
# Tell HelpParser how to split the string values:
|
105
|
+
HelpParser.split(:numbers, sep: ',', map: :to_i)
|
106
|
+
# Also available: HelpParser.csv(*name) = HelpParser.split(*names)
|
107
|
+
|
108
|
+
# If one runs `revelations 1,2,3 4,5,6`, then:
|
109
|
+
OPTIONS.numbers #=> [[1, 2, 3], [4, 5, 6]]
|
110
|
+
# And everything else is unset:
|
111
|
+
OPTIONS.stop #=> nil
|
95
112
|
```
|
96
113
|
## Features
|
97
114
|
|
98
|
-
* `ARGV` setup for `ARGF` when one of the "Types:" given is "ARGF"
|
99
|
-
* `$DEBUG=true` on --debug
|
100
|
-
* `$VERBOSE=true` on --verbose
|
101
115
|
* -h and --help simultaneously will check help string for errors
|
116
|
+
* `ARGV` setup for `ARGF` when one of the "Types:" given is "ARGF"
|
102
117
|
* `HelpParser::REDTTY[msg]` will red color output `msg` to `$stderr`.
|
103
118
|
|
104
119
|
## LICENSE:
|
105
120
|
|
106
121
|
(The MIT License)
|
107
122
|
|
108
|
-
Copyright (c)
|
123
|
+
Copyright (c) 2024 CarlosJHR64
|
109
124
|
|
110
125
|
Permission is hereby granted, free of charge, to any person obtaining
|
111
126
|
a copy of this software and associated documentation files (the
|
data/lib/help_parser/macros.rb
CHANGED
@@ -1,145 +1,29 @@
|
|
1
1
|
module HelpParser
|
2
|
-
def self.
|
2
|
+
def self.map(*names, map:)
|
3
3
|
names.each do |name|
|
4
4
|
Options.instance_eval do
|
5
5
|
define_method(name) do
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
v = @hash[name.to_s] and (v.is_a?(Array) ?
|
7
|
+
v.map(&map) :
|
8
|
+
v.method(map).call)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
13
|
+
def self.integer(*names) = HelpParser.map(*names, map: :to_i)
|
14
|
+
def self.float(*names) = HelpParser.map(*names, map: :to_f)
|
15
|
+
def self.rational(*names) = HelpParser.map(*names, map: :to_r)
|
13
16
|
|
14
|
-
def self.
|
15
|
-
names.each do |name|
|
16
|
-
Options.instance_eval do
|
17
|
-
define_method("#{name}?") do
|
18
|
-
s = @hash[name.to_s]
|
19
|
-
raise UsageError,MSG[NOT_STRING,name] unless s.nil? || s.is_a?(String)
|
20
|
-
s
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.strings(*names)
|
27
|
-
names.each do |name|
|
28
|
-
Options.instance_eval do
|
29
|
-
define_method(name) do
|
30
|
-
a = @hash[name.to_s]
|
31
|
-
raise UsageError, MSG[NOT_STRINGS,name] unless a.is_a?(Array)
|
32
|
-
a
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.strings?(*names)
|
39
|
-
names.each do |name|
|
40
|
-
Options.instance_eval do
|
41
|
-
define_method("#{name}?") do
|
42
|
-
a = @hash[name.to_s]
|
43
|
-
raise UsageError,MSG[NOT_STRINGS,name] unless a.nil? || a.is_a?(Array)
|
44
|
-
a
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.float(*names)
|
51
|
-
names.each do |name|
|
52
|
-
Options.instance_eval do
|
53
|
-
define_method(name) do
|
54
|
-
@hash[name.to_s]&.to_f or raise
|
55
|
-
rescue
|
56
|
-
raise UsageError, MSG[NOT_FLOAT,name]
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.float?(*names)
|
63
|
-
names.each do |name|
|
64
|
-
Options.instance_eval do
|
65
|
-
define_method("#{name}?") do
|
66
|
-
@hash[name.to_s]&.to_f
|
67
|
-
rescue
|
68
|
-
raise UsageError, MSG[NOT_FLOAT,name]
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def self.floats(*names)
|
17
|
+
def self.split(*names, sep:, map:)
|
75
18
|
names.each do |name|
|
76
19
|
Options.instance_eval do
|
77
20
|
define_method(name) do
|
78
|
-
@hash[name.to_s].
|
79
|
-
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def self.floats?(*names)
|
87
|
-
names.each do |name|
|
88
|
-
Options.instance_eval do
|
89
|
-
define_method("#{name}?") do
|
90
|
-
@hash[name.to_s]&.map(&:to_f)
|
91
|
-
rescue
|
92
|
-
raise UsageError, MSG[NOT_FLOATS,name]
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def self.int(*names)
|
99
|
-
names.each do |name|
|
100
|
-
Options.instance_eval do
|
101
|
-
define_method(name) do
|
102
|
-
@hash[name.to_s]&.to_i or raise
|
103
|
-
rescue
|
104
|
-
raise UsageError, MSG[NOT_INTEGER,name]
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def self.int?(*names)
|
111
|
-
names.each do |name|
|
112
|
-
Options.instance_eval do
|
113
|
-
define_method("#{name}?") do
|
114
|
-
@hash[name.to_s]&.to_i
|
115
|
-
rescue
|
116
|
-
raise UsageError, MSG[NOT_INTEGER,name]
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def self.ints(*names)
|
123
|
-
names.each do |name|
|
124
|
-
Options.instance_eval do
|
125
|
-
define_method(name) do
|
126
|
-
@hash[name.to_s].map(&:to_i)
|
127
|
-
rescue
|
128
|
-
raise UsageError, MSG[NOT_INTEGERS,name]
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def self.ints?(*names)
|
135
|
-
names.each do |name|
|
136
|
-
Options.instance_eval do
|
137
|
-
define_method("#{name}?") do
|
138
|
-
@hash[name.to_s]&.map(&:to_i)
|
139
|
-
rescue
|
140
|
-
raise UsageError, MSG[NOT_INTEGERS,name]
|
21
|
+
v = @hash[name.to_s] and (v.is_a?(Array) ?
|
22
|
+
v.map{_1.split(sep).map(&map)} :
|
23
|
+
v.split(sep).map(&map))
|
141
24
|
end
|
142
25
|
end
|
143
26
|
end
|
144
27
|
end
|
28
|
+
def self.csv(*names) = HelpParser.split(*names, sep: ',', map: :strip)
|
145
29
|
end
|
data/lib/help_parser/parseh.rb
CHANGED
@@ -11,8 +11,11 @@ module HelpParser
|
|
11
11
|
next if name==''
|
12
12
|
break if line[0]=='#'
|
13
13
|
next unless line[0]==' '
|
14
|
-
spec =
|
15
|
-
|
14
|
+
spec,comment = line.split("\t", 2).map(&:strip)
|
15
|
+
if spec.empty?
|
16
|
+
raise HelpError, EXTRANEOUS_SPACES if validate && comment.to_s.empty?
|
17
|
+
next
|
18
|
+
end
|
16
19
|
case name
|
17
20
|
when USAGE
|
18
21
|
Validate.balanced_brackets(spec.chars) if validate
|
data/lib/help_parser/validate.rb
CHANGED
@@ -41,11 +41,21 @@ module Validate
|
|
41
41
|
flags.each_with_index do |flag,i|
|
42
42
|
raise HelpError, MSG[DUP_FLAG,flag] unless i==flags.rindex(flag)
|
43
43
|
end
|
44
|
-
group = []
|
44
|
+
group,var = [],{}
|
45
45
|
specs_usage = specs[USAGE]
|
46
46
|
specs_usage&.flatten&.each do |token|
|
47
|
-
|
48
|
-
|
47
|
+
case token
|
48
|
+
when VARIABLE
|
49
|
+
key,bool = $~[:k],$~[:p].nil?
|
50
|
+
if var.key? key
|
51
|
+
unless var[key]==bool
|
52
|
+
raise HelpError, MSG[INCONSISTENT,"<#{key}>","<#{key}>+"]
|
53
|
+
end
|
54
|
+
else
|
55
|
+
var[key]=bool
|
56
|
+
end
|
57
|
+
when FLAG_GROUP
|
58
|
+
key = $~[:k]
|
49
59
|
raise HelpError, MSG[UNDEFINED_SECTION,key] unless specs[key]
|
50
60
|
group.push(key)
|
51
61
|
end
|
data/lib/help_parser.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: help_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 9.0.240926
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CarlosJHR64
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -16,61 +16,103 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1.1'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: 1.1.0
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
29
|
+
version: '1.1'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
32
|
+
version: 1.1.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: cucumber
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '9.2'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 9.2.0
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '9.2'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 9.2.0
|
33
53
|
- !ruby/object:Gem::Dependency
|
34
54
|
name: parser
|
35
55
|
requirement: !ruby/object:Gem::Requirement
|
36
56
|
requirements:
|
37
57
|
- - "~>"
|
38
58
|
- !ruby/object:Gem::Version
|
39
|
-
version: '3.
|
59
|
+
version: '3.3'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 3.3.5
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.3'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 3.3.5
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: rubocop
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.66'
|
40
80
|
- - ">="
|
41
81
|
- !ruby/object:Gem::Version
|
42
|
-
version:
|
82
|
+
version: 1.66.1
|
43
83
|
type: :development
|
44
84
|
prerelease: false
|
45
85
|
version_requirements: !ruby/object:Gem::Requirement
|
46
86
|
requirements:
|
47
87
|
- - "~>"
|
48
88
|
- !ruby/object:Gem::Version
|
49
|
-
version: '
|
89
|
+
version: '1.66'
|
50
90
|
- - ">="
|
51
91
|
- !ruby/object:Gem::Version
|
52
|
-
version:
|
92
|
+
version: 1.66.1
|
53
93
|
- !ruby/object:Gem::Dependency
|
54
94
|
name: test-unit
|
55
95
|
requirement: !ruby/object:Gem::Requirement
|
56
96
|
requirements:
|
57
97
|
- - "~>"
|
58
98
|
- !ruby/object:Gem::Version
|
59
|
-
version: '3.
|
99
|
+
version: '3.6'
|
60
100
|
- - ">="
|
61
101
|
- !ruby/object:Gem::Version
|
62
|
-
version: 3.
|
102
|
+
version: 3.6.2
|
63
103
|
type: :development
|
64
104
|
prerelease: false
|
65
105
|
version_requirements: !ruby/object:Gem::Requirement
|
66
106
|
requirements:
|
67
107
|
- - "~>"
|
68
108
|
- !ruby/object:Gem::Version
|
69
|
-
version: '3.
|
109
|
+
version: '3.6'
|
70
110
|
- - ">="
|
71
111
|
- !ruby/object:Gem::Version
|
72
|
-
version: 3.
|
73
|
-
description:
|
112
|
+
version: 3.6.2
|
113
|
+
description: 'Options parsing based on your help text.
|
114
|
+
|
115
|
+
'
|
74
116
|
email: carlosjhr64@gmail.com
|
75
117
|
executables: []
|
76
118
|
extensions: []
|
@@ -109,8 +151,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
151
|
version: '0'
|
110
152
|
requirements:
|
111
153
|
- 'git: 2.30'
|
112
|
-
|
154
|
+
- 'ruby: 3.3'
|
155
|
+
rubygems_version: 3.5.19
|
113
156
|
signing_key:
|
114
157
|
specification_version: 4
|
115
|
-
summary:
|
158
|
+
summary: Options parsing based on your help text.
|
116
159
|
test_files: []
|