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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f19d24ec56736d0d1bbcce1e0a847ac45e9d82defc89c7799c7b9c8c7c4ae078
4
- data.tar.gz: fe92cf2d740771329bee184dd205d59bc72c1265d79ac50af3a6c4d0fa735297
3
+ metadata.gz: 60dd76f994f506e15f1593b7561ee1b23cc59c0cf3cd53cc1140dcbc59b7b0f5
4
+ data.tar.gz: c113698c66f7790c4977d57c7906dad639774dd315158677091e59c5db188cef
5
5
  SHA512:
6
- metadata.gz: f20dad3a1453e625236af9cb176328652352e9f2f35f00da02cc6ab1853671c82ae13d5ec8226247be116cbd82bdbb4aee24490200f04b2ddba79e380822f36b
7
- data.tar.gz: 0aebde782784afb644dd1047f32af8de07d07af4c53435ec47ed8c8f7e54a3997a6e6a08c372f23e1a38f37c10f6e0604c26afcb5f16b8d7677120891f10ed71
6
+ metadata.gz: f40ba2d34b2340c12d69812d8554a942dac423a2e5e764ac15d58cf644f978eb937e2104bef8ce288dd79f0875d8bda92998ad692e50ebbe6ff0f5cb6d130ec3
7
+ data.tar.gz: f12bfbd92bfe9101292598c69ceff2beb81bd92838b975f39d61e15e16fc6268ffb525896f5983186bced970e3e63d4e6a27cbd5d63cad91943a264236b184b4
data/README.md CHANGED
@@ -1,14 +1,12 @@
1
- # Help Parser VIII: Helpland
1
+ # Help Parser IX: Revelations
2
2
 
3
- * [VERSION 8.2.230210](https://github.com/carlosjhr64/help_parser/releases)
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
- Welcome to Help Parser!
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) == 'party'
19
+ unless File.basename($PROGRAM_NAME) == 'revelations'
22
20
  # For example's sake say
23
- $PROGRAM_NAME = 'party'
21
+ $PROGRAM_NAME = 'revelations'
24
22
  # and ARGV is
25
- ARGV.concat ["-\-age", "-\-date=2020-09-07", 'touch', 'that']
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
- require "help_parser"
30
+ #!/usr/bin/env ruby
31
+ require 'help_parser'
35
32
 
36
- HELP = <<-HELP
33
+ VERSION = '1.2.3'
34
+ OPTIONS = HelpParser[VERSION, <<-HELP]
37
35
  # <= Hash here, parser skips
38
- # HelpParser: Party command example #
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
- party :options+ [<args>+]
41
- party [:alternate] <arg=FLOAT>
42
- party literal <arg1=WORD> <arg2=WORD>
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 \t Give version and quit
45
- -h --help \t Give help and quit
46
- -s --long \t Short long synonyms
47
- --touch that \t Defaulted
48
- --date=DATE \t Typed
49
- --age=INTEGER 80 \t Typed and Defaulted
50
- -a --all=YN y \t Short, long, typed, and defaulted
51
- --to_be
52
- --not_to_be
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 \t Tells parser these are mutually exclusive keys
78
+ to_be not_to_be \t Tells parser these are mutually exclusive keys
58
79
  Inclusive:
59
- date age \t Tells parser any of these must include all of these
80
+ start stop \t Tells parser any of these must include all of these
60
81
  Conditional:
61
- rain water wet \t Tells parser if first then all
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
- --invoke
64
- --wut
86
+ --sum
87
+ --multiply
88
+
65
89
  Types:
66
90
  WORD /^[A-Za-z]+$/
67
- DATE /^\\d\\d\\d\\d-\\d\\d-\\d\\d$/
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
- # Notes #
73
- I wouldn't touch that!
96
+ And now one can freely write whatever....
74
97
  HELP
75
98
 
76
- VERSION = "1.2.3"
77
-
78
- OPTIONS = HelpParser[VERSION, HELP] #~> HelpParser
79
-
80
- # Macros:
81
- HelpParser.strings?(:args) # for OPTIONS.args : Array(String) | Nil
82
- HelpParser.int?(:age) # for OPTIONS.age? : Integer | Nil
83
- HelpParser.float(:arg) # for options.arg : Float
84
- HelpParser.string(:arg1, :arg2, :arg3) # for OPTIONS.arg1, etc : String
85
- #=> [:arg1, :arg2, :arg3]
86
-
87
- ## If run as:
88
- ## party --age --date=2020-09-07 touch that
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) 2023 CarlosJHR64
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
@@ -1,145 +1,29 @@
1
1
  module HelpParser
2
- def self.string(*names)
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
- s = @hash[name.to_s]
7
- raise UsageError, MSG[NOT_STRING,name] unless s.is_a?(String)
8
- s
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.string?(*names)
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].map(&:to_f)
79
- rescue
80
- raise UsageError, MSG[NOT_FLOATS,name]
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
@@ -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 = (index=line.rindex("\t"))? line[0,index].strip : line.strip
15
- raise HelpError, EXTRANEOUS_SPACES if validate && spec.empty?
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
@@ -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
- if (match=token.match FLAG_GROUP)
48
- key = match[:k]
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
@@ -10,7 +10,7 @@ require_relative 'help_parser/options'
10
10
  require_relative 'help_parser/macros'
11
11
 
12
12
  module HelpParser
13
- VERSION = '8.2.230210'
13
+ VERSION = '9.0.240926'
14
14
  autoload :Validate, 'help_parser/validate'
15
15
 
16
16
  def self.[](
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: 8.2.230210
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: 2023-02-10 00:00:00.000000000 Z
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: '0.8'
19
+ version: '1.1'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.8.1
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: '0.8'
29
+ version: '1.1'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.8.1
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.2'
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: 3.2.0
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: '3.2'
89
+ version: '1.66'
50
90
  - - ">="
51
91
  - !ruby/object:Gem::Version
52
- version: 3.2.0
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.5'
99
+ version: '3.6'
60
100
  - - ">="
61
101
  - !ruby/object:Gem::Version
62
- version: 3.5.7
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.5'
109
+ version: '3.6'
70
110
  - - ">="
71
111
  - !ruby/object:Gem::Version
72
- version: 3.5.7
73
- description: "Welcome to Help Parser! \nDo you have your help text? \nLet's parse!\n"
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
- rubygems_version: 3.4.6
154
+ - 'ruby: 3.3'
155
+ rubygems_version: 3.5.19
113
156
  signing_key:
114
157
  specification_version: 4
115
- summary: Welcome to Help Parser! Do you have your help text? Let's parse!
158
+ summary: Options parsing based on your help text.
116
159
  test_files: []