help_parser 8.0.210917 → 8.1.221206

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: 89d031ef15e33460fc4f23ccec23cc98f01cb9808fd77bb478c63be6a638f034
4
- data.tar.gz: 9521262caa0b0a1617fc52bdeec42c4e305a4fc4ce34c5871128c64eecf5aae7
3
+ metadata.gz: 157ae793a16a5b92ca1633306080465fcd2e9671aaed67dc01fb47cb318f0824
4
+ data.tar.gz: cc72ed9f03c94ef2f5455897807a49ba69e79786ceae5daa3d158d3265e9a931
5
5
  SHA512:
6
- metadata.gz: 4e6c0faa99fd04e8b8e2f289b0f1894538747defaeb557400b36904f7c330961b9cc068aa8bdbe06493f8339af19cd4397cfdca9e1f82bc20ddbf84b91553955
7
- data.tar.gz: 135b86c92d72faa5b49cdfedd7b6c66a9e568e592ae5b8afc86c612efa23020c828acb45693435d5f5349679f61a963bac81041da6d6bdae9549c1ab2de3214b
6
+ metadata.gz: aea35622e25f8fd0cf84cc3115ce15b524440e698f516ebbd89188fa56d30c098dcc8711d61cee4b07aa7b77f935091222c2b0ff71465480d0e9cf76530810f5
7
+ data.tar.gz: 88a2613d9487be0b11e0da90bef805abc5fc1a7ca0012a97b32d5aa62540f382cc91e38b6714e4279bdba319475b323126625b4cf092e037742f30ba1c4ee22a
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Help Parser VIII: Helpland
2
2
 
3
- * [VERSION 8.0.210917](https://github.com/carlosjhr64/help_parser/releases)
3
+ * [VERSION 8.1.221206](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
 
@@ -102,13 +102,13 @@ OPTIONS.arg?.class #=> FalseClass
102
102
  * `$DEBUG=true` on --debug
103
103
  * `$VERBOSE=true` on --verbose
104
104
  * -h and --help simultaneously will check help string for errors
105
- * `HelpParser::REDTTY[msg]` will red color output `msg` to `STDERR`.
105
+ * `HelpParser::REDTTY[msg]` will red color output `msg` to `$stderr`.
106
106
 
107
107
  ## LICENSE:
108
108
 
109
109
  (The MIT License)
110
110
 
111
- Copyright (c) 2021 CarlosJHR64
111
+ Copyright (c) 2022 CarlosJHR64
112
112
 
113
113
  Permission is hereby granted, free of charge, to any person obtaining
114
114
  a copy of this software and associated documentation files (the
@@ -28,9 +28,14 @@ module HelpParser
28
28
  # Diagnose user's usage.
29
29
  def diagnose
30
30
  dict = {}
31
- @specs.each do |k,v|
32
- next if RESERVED.include? k
33
- v.flatten.map{_1.scan(/\w+/).first}.each{dict[_1]=true}
31
+ @specs.each do |section,list|
32
+ next if RESERVED.include? section
33
+ list.flatten.select{_1[0]=='-'}.each do |key_type|
34
+ key_type.scan(/\w+/) do |key|
35
+ dict[key]=true
36
+ break
37
+ end
38
+ end
34
39
  end
35
40
  typos = @hash.keys.select{|k|k.is_a? String and not dict[k]}
36
41
  raise UsageError, MSG[UNRECOGNIZED, typos] unless typos.empty?
@@ -66,7 +71,7 @@ module HelpParser
66
71
  def pad
67
72
  # Synonyms and defaults:
68
73
  @specs.each do |section,options|
69
- next if section==USAGE || section==TYPES
74
+ next if RESERVED.any?{section==_1}
70
75
  options.each do |words|
71
76
  next unless words.size>1
72
77
  first,second,default = words[0],words[1],words[2]
@@ -95,6 +100,8 @@ module HelpParser
95
100
  @hash[long] = default
96
101
  end
97
102
  end
103
+ else
104
+ raise SoftwareError, MSG[UNEXPECTED, words]
98
105
  end
99
106
  end
100
107
  end
@@ -113,13 +120,13 @@ module HelpParser
113
120
  elsif m=FLAG_GROUP.match(token)
114
121
  group,plus = m[:k],m[:p]
115
122
  key = keys[i]
116
- raise NoMatch if key.nil? || key.is_a?(Integer)
123
+ raise NoMatch unless key.is_a? String
117
124
  list = @specs[group].flatten.select{|f|f[0]=='-'}.map{|f| F2K[f]}
118
125
  raise NoMatch unless list.include?(key)
119
126
  unless plus.nil?
120
127
  loop do
121
128
  key = keys[i+1]
122
- break if key.nil? || key.is_a?(Integer) || !list.include?(key)
129
+ break unless key.is_a?(String) and list.include?(key)
123
130
  i+=1
124
131
  end
125
132
  end
@@ -1,6 +1,6 @@
1
1
  module HelpParser
2
- V,VSN = 'v','version'
3
- H,HLP = 'h','help'
2
+ VSN = ['v','version']
3
+ HLP = ['h','help']
4
4
  VRBS,DBG = 'verbose','debug'
5
5
 
6
6
  # reserved name
@@ -13,7 +13,7 @@ module HelpParser
13
13
  RESERVED = [USAGE,TYPES,EXCLUSIVE,INCLUSIVE,CONDITIONAL]
14
14
 
15
15
  # sections
16
- SECTION_NAME = /^[A-Z]\w+:$/
16
+ SECTION_NAME = /^(?<name>[A-Z]\w+):$/
17
17
 
18
18
  # usage
19
19
  FLAG = /^[-][-]?(?<k>\w+)$/
@@ -28,7 +28,7 @@ module HelpParser
28
28
  # spec -w,? --w+
29
29
  SHORT_LONG = /^[-](?<s>\w),?\s+[-][-](?<k>\w+)$/
30
30
  SHORT_LONG_DEFAULT =
31
- /^[-](?<s>\w),?\s+[-][-](?<k>\w+)(=(?<t>[A-Z]+))?,?\s+(?<d>[^-\s]\S*)$/
31
+ /^[-](?<s>\w),?\s+[-][-](?<k>\w+)(=(?<t>[A-Z]+))?,?\s+(?<d>\S*)$/
32
32
 
33
33
  # spec W+ /~/
34
34
  TYPE_DEF = /^(?<t>[A-Z]+),?\s+\/(?<r>\S+)\/$/
@@ -1,8 +1,11 @@
1
1
  module HelpParser
2
+ # k2t is an acronym for the "key to type" mapping
2
3
  def self.k2t(specs)
3
4
  k2t = NoDupHash.new
4
- tokens = specs.select{|k,v| !(k==TYPES)}.values.flatten
5
- .select{|v|v.include?('=')}
5
+ # If specs section is not a RESERVED section, it's an options list.
6
+ tokens = specs.select{|k,v| k==USAGE or not RESERVED.include?(k)}
7
+ # Tokens associating a key to a type.
8
+ .values.flatten.select{|v|v.include?('=')}
6
9
  tokens.each do |token|
7
10
  if match = VARIABLE.match(token) || LONG.match(token)
8
11
  name, type = match[:k], match[:t]
@@ -19,6 +22,7 @@ module HelpParser
19
22
  return k2t
20
23
  end
21
24
 
25
+ # t2r is an acronym for "type to regexp"
22
26
  def self.t2r(specs)
23
27
  if types = specs[TYPES]
24
28
  t2r = NoDupHash.new
@@ -66,9 +66,7 @@ module HelpParser
66
66
  code = <<-CODE
67
67
  class Options
68
68
  def #{name}
69
- f = @hash['#{name}']
70
- raise if f.nil?
71
- f.to_f
69
+ @hash['#{name}']&.to_f or raise
72
70
  rescue
73
71
  raise UsageError, MSG[NOT_FLOAT,'#{name}']
74
72
  end
@@ -83,9 +81,7 @@ module HelpParser
83
81
  code = <<-CODE
84
82
  class Options
85
83
  def #{name}?
86
- f = @hash['#{name}']
87
- f = f.to_f if f
88
- return f
84
+ @hash['#{name}']&.to_f
89
85
  rescue
90
86
  raise UsageError, MSG[NOT_FLOAT,'#{name}']
91
87
  end
@@ -100,9 +96,7 @@ module HelpParser
100
96
  code = <<-CODE
101
97
  class Options
102
98
  def #{name}
103
- f = @hash['#{name}']
104
- raise unless f.is_a?(Array)
105
- f.map{_1.to_f}
99
+ @hash['#{name}'].map{_1.to_f}
106
100
  rescue
107
101
  raise UsageError, MSG[#{NOT_FLOATS},'#{name}']
108
102
  end
@@ -117,10 +111,7 @@ module HelpParser
117
111
  code = <<-CODE
118
112
  class Options
119
113
  def #{name}?
120
- f = @hash['#{name}']
121
- return nil unless f
122
- raise unless f.is_a?(Array)
123
- f.map{_1.to_f}
114
+ @hash['#{name}']&.map{_1.to_f}
124
115
  rescue
125
116
  raise UsageError, MSG[NOT_FLOATS,'#{name}']
126
117
  end
@@ -135,9 +126,7 @@ module HelpParser
135
126
  code = <<-CODE
136
127
  class Options
137
128
  def #{name}
138
- f = @hash['#{name}']
139
- raise if f.nil?
140
- f.to_i
129
+ @hash['#{name}']&.to_i or raise
141
130
  rescue
142
131
  raise UsageError, MSG[NOT_INTEGER,'#{name}']
143
132
  end
@@ -152,9 +141,7 @@ module HelpParser
152
141
  code = <<-CODE
153
142
  class Options
154
143
  def #{name}?
155
- f = @hash['#{name}']
156
- f = f.to_i if f
157
- return f
144
+ @hash['#{name}']&.to_i
158
145
  rescue
159
146
  raise UsageError, MSG[NOT_INTEGER,'#{name}']
160
147
  end
@@ -169,9 +156,7 @@ module HelpParser
169
156
  code = <<-CODE
170
157
  class Options
171
158
  def #{name}
172
- f = @hash['#{name}']
173
- raise unless f.is_a?(Array)
174
- f.map{_1.to_i}
159
+ @hash['#{name}'].map{_1.to_i}
175
160
  rescue
176
161
  raise UsageError, MSG[NOT_INTEGERS,'#{name}']
177
162
  end
@@ -186,10 +171,7 @@ module HelpParser
186
171
  code = <<-CODE
187
172
  class Options
188
173
  def #{name}?
189
- f = @hash['#{name}']
190
- return nil unless f
191
- raise unless f.is_a?(Array)
192
- f.map{_1.to_i}
174
+ @hash['#{name}']&.map{_1.to_i}
193
175
  rescue
194
176
  raise UsageError, MSG[NOT_INTEGERS,'#{name}']
195
177
  end
@@ -2,14 +2,13 @@ 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?(V) || @hash.has_key?(VSN))
5
+ if version && VSN.any?{@hash.has_key? _1}
6
6
  # -v or --version
7
7
  raise VersionException, version
8
8
  end
9
9
  if help
10
- h = [H, HLP]
11
- if h.any?{@hash.key? _1}
12
- HelpParser.parseh(help, validate: true) if h.all?{@hash.key? _1}
10
+ if HLP.any?{@hash.key? _1}
11
+ HelpParser.parseh(help, validate: true) if HLP.all?{@hash.key? _1}
13
12
  raise HelpException, help
14
13
  end
15
14
  specs = HelpParser.parseh(help)
@@ -4,8 +4,8 @@ module HelpParser
4
4
  help.each_line do |line|
5
5
  line.chomp!
6
6
  next if line==''
7
- if line=~SECTION_NAME
8
- name = line[0..-2].downcase
7
+ if md = SECTION_NAME.match(line)
8
+ name = md[:name].downcase
9
9
  specs[name] = []
10
10
  else
11
11
  next if name==''
@@ -15,7 +15,7 @@ module HelpParser
15
15
  raise HelpError, EXTRANEOUS_SPACES if validate and spec==''
16
16
  case name
17
17
  when USAGE
18
- Validate.line_chars(spec.chars) if validate
18
+ Validate.balanced_brackets(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
@@ -1,4 +1,8 @@
1
1
  module HelpParser
2
+ # Chars := String.split(/\t/,2).first.strip.chars
3
+ # Token := String=~/^[^ \[\]]$/
4
+ # Note that emergent Token is String=~/^[^\s\[\]]$/
5
+ # Tokens := Array(Token|Tokens)
2
6
  def self.parseu(chars)
3
7
  tokens,token = [],''
4
8
  while c = chars.shift
@@ -1,6 +1,6 @@
1
1
  module HelpParser
2
2
  module Validate
3
- def self.line_chars(chars)
3
+ def self.balanced_brackets(chars)
4
4
  count = 0
5
5
  chars.each do |c|
6
6
  if c=='['
@@ -16,12 +16,9 @@ module Validate
16
16
  def self.usage_tokens(tokens)
17
17
  words = []
18
18
  tokens.flatten.each do |token|
19
- match = token.match(FLAG) ||
20
- token.match(LITERAL) ||
21
- token.match(VARIABLE) ||
22
- token.match(FLAG_GROUP)
23
- raise HelpError, MSG[UNRECOGNIZED_TOKEN,token] unless match
24
- words.push match[:k] # key
19
+ raise HelpError, MSG[UNRECOGNIZED_TOKEN,token] unless
20
+ [FLAG,LITERAL,VARIABLE,FLAG_GROUP]
21
+ .detect{_=token.match(_1) and words.push(_[:k])}
25
22
  end
26
23
  words.each_with_index do |word,i|
27
24
  raise HelpError, MSG[DUP_WORD,word] unless i==words.rindex(word)
@@ -29,8 +26,8 @@ module Validate
29
26
  end
30
27
 
31
28
  def self.usage_specs(specs)
32
- option_specs = specs.select{|a,b| not RESERVED.include? a}
33
- flags = option_specs.values.flatten.select{|f|f[0]=='-'}.map{|f| F2K[f]}
29
+ flags = specs.select{|a,b| not RESERVED.include? a}.values.flatten
30
+ .select{|f|f[0]=='-'}.map{|f| F2K[f]}
34
31
  FLAG_CLUMPS.each do |k|
35
32
  if a=specs[k]
36
33
  seen = {}
@@ -74,7 +71,7 @@ module Validate
74
71
  raise HelpError, MSG[UNCOMPLETED_TYPES,c.join(',')]
75
72
  end
76
73
  specs.each do |section,tokens|
77
- next if section==USAGE || section==TYPES
74
+ next if RESERVED.include? section
78
75
  tokens.each do |words|
79
76
  next if words.size<2
80
77
  default = words[-1]
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.0.210917'
13
+ VERSION = '8.1.221206'
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.0.210917
4
+ version: 8.1.221206
5
5
  platform: ruby
6
6
  authors:
7
7
  - CarlosJHR64
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-17 00:00:00.000000000 Z
11
+ date: 2022-12-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: "Welcome to Help Parser! \nDo you have your help text? \nLet's parse!\n"
14
14
  email: carlosjhr64@gmail.com
@@ -34,7 +34,7 @@ homepage: https://github.com/carlosjhr64/help_parser
34
34
  licenses:
35
35
  - MIT
36
36
  metadata: {}
37
- post_install_message:
37
+ post_install_message:
38
38
  rdoc_options: []
39
39
  require_paths:
40
40
  - lib
@@ -49,9 +49,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0'
51
51
  requirements:
52
- - 'ruby: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]'
53
- rubygems_version: 3.2.22
54
- signing_key:
52
+ - 'ruby: ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [aarch64-linux]'
53
+ rubygems_version: 3.3.7
54
+ signing_key:
55
55
  specification_version: 4
56
56
  summary: Welcome to Help Parser! Do you have your help text? Let's parse!
57
57
  test_files: []