benry-cmdopt 2.1.0 → 2.3.0

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: 5e37b3eb5a8294bfae3627f384720f843e2c6ae9c79ec0cc704b732368d46437
4
- data.tar.gz: 3a3b34226485ae5c0aaa3f3b90d6ba281b34f7843d5e03179235784af0fc2467
3
+ metadata.gz: bfcbb37a1e33df36573f607fc8a5b7f81761b0535422023b64648ac596b1ce4c
4
+ data.tar.gz: d9b57e362e8d3e6ec7bf808b661436cbe827b3f5ba7d87f6ea5c55c0bafce69c
5
5
  SHA512:
6
- metadata.gz: f1aae8384f952ddbc0ba5408e39e5b289d09c9b9e768a4cee237c723d7f0bef459b2ab7c8e3639705e8495790fb02bb6fced99bf9a3676e772d4b0c2d622961d
7
- data.tar.gz: 737074f681fa450d2e0fc9b82b85aedba8088db313b522c32b1c01cae6a68ed091da08ca437f58e543b0a6d896618c42a078ded25bba9fba971c3e3ec90bc82f
6
+ metadata.gz: 1710700fceb026a2fe422ccaf5681dd83e4160a25c9f2fc3bc35662cfb695b7588fb2d9eea0ec7211c65a6e297bb3675e7dd3af63cfc9eaa4eb05561dc9714ca
7
+ data.tar.gz: 43c560b46bb5de501f5d82442092644961d711a46770161bcebb0bd8fcebfb5fabf15add17f5f875c32f66a07d8bdb6ce45eab3bf493ce54f64336add6cd0817
data/CHANGES.md CHANGED
@@ -2,6 +2,19 @@ CHANGES
2
2
  =======
3
3
 
4
4
 
5
+ Release 2.3.0 (2023-11-26)
6
+ --------------------------
7
+
8
+ * [change] `Schema#add()` raises SchemaError if option key, short or long option duplicated.
9
+
10
+
11
+ Release 2.2.0 (2023-10-28)
12
+ --------------------------
13
+
14
+ * [enhance] Define `Schema#add_item()` which adds option item into the schema. This is for Benry-CmdApp framework.
15
+ * [change] (EXPERIMENTAL) Make `desc`, `detail`, `hidden`, `important`, `tag` attrubtes of `SchemaItem` object to be writable. This is for Benry-CmdApp framework.
16
+
17
+
5
18
  Release 2.1.0 (2023-10-15)
6
19
  --------------------------
7
20
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Benry-CmdOpt
2
2
 
3
- ($Release: 2.1.0 $)
3
+ ($Release: 2.3.0 $)
4
4
 
5
5
 
6
6
 
@@ -139,6 +139,23 @@ cmdopt = Benry::CmdOpt.new
139
139
  cmdopt.add(:number, "-n <N>", "number", type: Integer, enum: [1, 2, 3]) # very intuitive
140
140
  ```
141
141
 
142
+ * `optparse.rb` doesn't report error even when options are duplicated.
143
+ This specification makes debugging hard.
144
+
145
+ `benry/cmdopt.rb` reports error when options are duplicated.
146
+
147
+ ```ruby
148
+ require 'optparse'
149
+
150
+ options = {}
151
+ parser = OptionParser.new
152
+ parser.on('-v', '--version') { options[:version] = true }
153
+ parser.on('-v', '--verbose') { options[:verbose] = true } # !!!!
154
+ argv = ["-v"]
155
+ parser.parse!(argv)
156
+ p options #=> {:verbose=>true}, not {:version=>true}
157
+ ```
158
+
142
159
  * `optparse.rb` adds `-h` and `--help` options automatically, and
143
160
  terminates current process when `-h` or `--help` specified in command-line.
144
161
  It is hard to remove these options.
data/benry-cmdopt.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "benry-cmdopt"
5
- spec.version = "$Release: 2.1.0 $".split()[1]
5
+ spec.version = "$Release: 2.3.0 $".split()[1]
6
6
  spec.author = "kwatch"
7
7
  spec.email = "kwatch@gmail.com"
8
8
  spec.platform = Gem::Platform::RUBY
@@ -21,7 +21,7 @@
21
21
  <ul class="nav">
22
22
  </ul>
23
23
  </nav>
24
- <p>($Release: 2.1.0 $)</p>
24
+ <p>($Release: 2.3.0 $)</p>
25
25
  <section class="section" id="whats-this">
26
26
  <h2>What's This?</h2>
27
27
  <p>Benry-CmdOpt is a command option parser library, like <code>optparse.rb</code>
@@ -155,6 +155,23 @@ cmdopt = Benry::CmdOpt.new
155
155
  cmdopt.add(:number, "-n &ltN&gt;", "number", type: Integer, <strong>enum: [1, 2, 3]</strong>) # very intuitive
156
156
  </pre>
157
157
  <ul>
158
+ <li><code>optparse.rb</code> doesn't report error even when options are duplicated.
159
+ This specification makes debugging hard.
160
+ <p></p>
161
+ <code>benry/cmdopt.rb</code> reports error when options are duplicated.</li>
162
+ </ul>
163
+ <pre class="language-ruby">
164
+ require 'optparse'
165
+
166
+ options = {}
167
+ parser = OptionParser.new
168
+ parser.on(<strong>'-v'</strong>, '--version') { options[:version] = true }
169
+ parser.on(<strong>'-v'</strong>, '--verbose') { options[:verbose] = true } # !!!!
170
+ argv = ["-v"]
171
+ parser.parse!(argv)
172
+ p options #=&gt; {:verbose=&gt;true}, not {:version=&gt;true}
173
+ </pre>
174
+ <ul>
158
175
  <li><code>optparse.rb</code> adds <code>-h</code> and <code>--help</code> options automatically, and
159
176
  terminates current process when <code>-h</code> or <code>--help</code> specified in command-line.
160
177
  It is hard to remove these options.
data/doc/css/style.css CHANGED
@@ -74,12 +74,12 @@ pre > strong {
74
74
  font-weight: bold;
75
75
  color: #900;
76
76
  }
77
- pre.language-terminal {
77
+ pre.language-terminal, pre.language-console {
78
78
  background: #333;
79
79
  color: #fff;
80
80
  border-color: #000;
81
81
  }
82
- pre.language-terminal > strong {
82
+ pre.language-terminal > strong, pre.language-console > strong {
83
83
  color: #f66;
84
84
  }
85
85
  code {
data/lib/benry/cmdopt.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  ###
5
- ### $Release: 2.1.0 $
5
+ ### $Release: 2.3.0 $
6
6
  ### $Copyright: copyright(c) 2021 kwatch@gmail.com $
7
7
  ### $License: MIT License $
8
8
  ###
@@ -23,7 +23,7 @@ end
23
23
  module Benry::CmdOpt
24
24
 
25
25
 
26
- VERSION = '$Release: 2.1.0 $'.split()[1]
26
+ VERSION = '$Release: 2.3.0 $'.split()[1]
27
27
 
28
28
 
29
29
  def self.new()
@@ -138,10 +138,37 @@ module Benry::CmdOpt
138
138
  #; [!yht0v] keeps command option definitions.
139
139
  item = SchemaItem.new(key, optdef, desc, short, long, param, required,
140
140
  type: type, rexp: rexp, enum: enum, range: range, value: value, detail: detail, hidden: hidden, important: important, tag: tag, &callback)
141
- @items << item
141
+ add_item(item)
142
142
  item
143
143
  end
144
144
 
145
+ def add_item(item)
146
+ #; [!qyjp9] raises SchemaError if invalid item added.
147
+ errmsg = _validate_item(item)
148
+ errmsg == nil or
149
+ raise SchemaError.new(errmsg)
150
+ #; [!a693h] adds option item into current schema.
151
+ @items << item
152
+ self
153
+ end
154
+
155
+ def _validate_item(item)
156
+ key = item.key; short = item.short; long = item.long
157
+ for x in @items
158
+ #; [!ewl20] returns error message if option key duplicated.
159
+ key != x.key or
160
+ return "#{key}: Option key duplicated."
161
+ #; [!xg56v] returns error message if short option duplicated.
162
+ short == nil || short != x.short or
163
+ return "-#{short}: Short option duplicated (key: #{key} and #{x.key})."
164
+ #; [!izezi] returns error message if long option duplicated.
165
+ long == nil || long != x.long or
166
+ return "--#{long}: Long option duplicated (key: #{key} and #{x.key})."
167
+ end
168
+ return nil
169
+ end
170
+ private :_validate_item
171
+
145
172
  def option_help(width_or_format=nil, all: false)
146
173
  #; [!0aq0i] can take integer as width.
147
174
  #; [!pcsah] can take format string.
@@ -320,6 +347,7 @@ module Benry::CmdOpt
320
347
  end
321
348
 
322
349
  attr_reader :key, :optdef, :desc, :short, :long, :param, :type, :rexp, :enum, :range, :detail, :value, :tag, :callback
350
+ attr_writer :desc, :detail, :hidden, :important, :tag # !!experimental!!
323
351
  alias pattern rexp # for backward compatibility
324
352
  alias help desc # for backward compatibility
325
353
 
data/test/cmdopt_test.rb CHANGED
@@ -256,6 +256,68 @@ Oktest.scope do
256
256
  end
257
257
 
258
258
 
259
+ topic '#add_item()' do
260
+
261
+ spec "[!qyjp9] raises SchemaError if invalid item added." do
262
+ sc = Benry::CmdOpt::Schema.new
263
+ sc.add(:quiet, "-q, --quiet", "quiet mode")
264
+ #
265
+ item1 = Benry::CmdOpt::SchemaItem.new(:quiet, "-q", "quiet", "q", nil, nil, false)
266
+ pr = proc { sc.add_item(item1) }
267
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
268
+ "quiet: Option key duplicated.")
269
+ #
270
+ item2 = Benry::CmdOpt::SchemaItem.new(:quiet2, "-q", "quiet", "q", nil, nil, false)
271
+ pr = proc { sc.add_item(item2) }
272
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
273
+ "-q: Short option duplicated (key: quiet2 and quiet).")
274
+ #
275
+ item3 = Benry::CmdOpt::SchemaItem.new(:quiet3, "--quiet", "quiet", nil, "quiet", nil, false)
276
+ pr = proc { sc.add_item(item3) }
277
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
278
+ "--quiet: Long option duplicated (key: quiet3 and quiet).")
279
+ end
280
+
281
+ spec "[!a693h] adds option item into current schema." do
282
+ item = Benry::CmdOpt::SchemaItem.new(:quiet, "-q", "quiet", "q", nil, nil, false)
283
+ sc = Benry::CmdOpt::Schema.new
284
+ sc.add_item(item)
285
+ ok {sc.to_s} == <<"END"
286
+ -q : quiet
287
+ END
288
+ end
289
+
290
+ end
291
+
292
+
293
+ topic '#_validate_item()' do
294
+
295
+ before do
296
+ @schema = Benry::CmdOpt::Schema.new
297
+ @schema.add(:quiet, "-q, --quiet", "quiet mode")
298
+ end
299
+
300
+ spec "[!ewl20] returns error message if option key duplicated." do
301
+ item = Benry::CmdOpt::SchemaItem.new(:quiet, "-q", "quiet mode", "q", nil, nil, false)
302
+ ret = @schema.__send__(:_validate_item, item)
303
+ ok {ret} == "quiet: Option key duplicated."
304
+ end
305
+
306
+ spec "[!xg56v] returns error message if short option duplicated." do
307
+ item = Benry::CmdOpt::SchemaItem.new(:quiet2, "-q", "quiet mode", "q", nil, nil, false)
308
+ ret = @schema.__send__(:_validate_item, item)
309
+ ok {ret} == "-q: Short option duplicated (key: quiet2 and quiet)."
310
+ end
311
+
312
+ spec "[!izezi] returns error message if long option duplicated." do
313
+ item = Benry::CmdOpt::SchemaItem.new(:quiet3, "--quiet", "quiet mode", nil, "quiet", nil, false)
314
+ ret = @schema.__send__(:_validate_item, item)
315
+ ok {ret} == "--quiet: Long option duplicated (key: quiet3 and quiet)."
316
+ end
317
+
318
+ end
319
+
320
+
259
321
  topic '#option_help()' do
260
322
 
261
323
  before do
@@ -761,10 +823,10 @@ END
761
823
 
762
824
  spec "[!melyd] raises SchemaError when enum is not an Array nor Set." do
763
825
  sc = @schema
764
- sc.add(:indent, "-i <N>", "indent width", enum: ["2", "4", "8"])
765
- sc.add(:indent, "-i <N>", "indent width", enum: Set.new(["2", "4", "8"]))
826
+ sc.add(:indent1, "-i <N>", "indent width", enum: ["2", "4", "8"])
827
+ sc.add(:indent2, "-j <N>", "indent width", enum: Set.new(["2", "4", "8"]))
766
828
  pr = proc {
767
- sc.add(:indent, "-i <N>", "indent width", enum: "2,4,8")
829
+ sc.add(:indent3, "-k <N>", "indent width", enum: "2,4,8")
768
830
  }
769
831
  ok {pr}.raise?(Benry::CmdOpt::SchemaError,
770
832
  '"2,4,8": Array or set expected.')
@@ -834,7 +896,6 @@ END
834
896
  @schema.add(:indent1, "-i <N>", "indent", type: Integer, range: range1)
835
897
  @schema.add(:indent2, "-j <N>", "indent", type: Integer, range: range2)
836
898
  }
837
- pr.call
838
899
  ok {pr}.NOT.raise?(Exception)
839
900
  end
840
901
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: benry-cmdopt
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kwatch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-15 00:00:00.000000000 Z
11
+ date: 2023-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oktest