benry-cmdopt 2.2.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: 9308d0182f3f4a17d45f3b7a1f212a4f5f2112f4084d725b2de05271a908bb1d
4
- data.tar.gz: f9b8e9066b9857d2693382f03bcbeacdd040695287d426d8ef8c28cf242f1cd1
3
+ metadata.gz: bfcbb37a1e33df36573f607fc8a5b7f81761b0535422023b64648ac596b1ce4c
4
+ data.tar.gz: d9b57e362e8d3e6ec7bf808b661436cbe827b3f5ba7d87f6ea5c55c0bafce69c
5
5
  SHA512:
6
- metadata.gz: e231075a8a9fdd99a0379390ebc1fae07c812f8229d1689e0b7f04b91d5c0c596122835dde000c3ba609681898c3048fa51d08232cd33d4b9df0bacbc22036c6
7
- data.tar.gz: bcabe45f475efd7c95e989c9f7f2c9b61c65396b6373cbb0a68427ce10798a942c4af3cfd8ae66a34928c710b2cac24388d8848a6a1271ca40d3e9458a217898
6
+ metadata.gz: 1710700fceb026a2fe422ccaf5681dd83e4160a25c9f2fc3bc35662cfb695b7588fb2d9eea0ec7211c65a6e297bb3675e7dd3af63cfc9eaa4eb05561dc9714ca
7
+ data.tar.gz: 43c560b46bb5de501f5d82442092644961d711a46770161bcebb0bd8fcebfb5fabf15add17f5f875c32f66a07d8bdb6ce45eab3bf493ce54f64336add6cd0817
data/CHANGES.md CHANGED
@@ -2,10 +2,16 @@ 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
+
5
11
  Release 2.2.0 (2023-10-28)
6
12
  --------------------------
7
13
 
8
- * [enhance] Define `SchemaItem#add_item()` which adds option item into the schema. This is for Benry-CmdApp framework.
14
+ * [enhance] Define `Schema#add_item()` which adds option item into the schema. This is for Benry-CmdApp framework.
9
15
  * [change] (EXPERIMENTAL) Make `desc`, `detail`, `hidden`, `important`, `tag` attrubtes of `SchemaItem` object to be writable. This is for Benry-CmdApp framework.
10
16
 
11
17
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Benry-CmdOpt
2
2
 
3
- ($Release: 2.2.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.2.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.2.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.2.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.2.0 $'.split()[1]
26
+ VERSION = '$Release: 2.3.0 $'.split()[1]
27
27
 
28
28
 
29
29
  def self.new()
@@ -138,16 +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
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)
146
150
  #; [!a693h] adds option item into current schema.
147
151
  @items << item
148
152
  self
149
153
  end
150
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
+
151
172
  def option_help(width_or_format=nil, all: false)
152
173
  #; [!0aq0i] can take integer as width.
153
174
  #; [!pcsah] can take format string.
data/test/cmdopt_test.rb CHANGED
@@ -258,6 +258,26 @@ Oktest.scope do
258
258
 
259
259
  topic '#add_item()' do
260
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
+
261
281
  spec "[!a693h] adds option item into current schema." do
262
282
  item = Benry::CmdOpt::SchemaItem.new(:quiet, "-q", "quiet", "q", nil, nil, false)
263
283
  sc = Benry::CmdOpt::Schema.new
@@ -269,6 +289,35 @@ END
269
289
 
270
290
  end
271
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
+
272
321
  topic '#option_help()' do
273
322
 
274
323
  before do
@@ -774,10 +823,10 @@ END
774
823
 
775
824
  spec "[!melyd] raises SchemaError when enum is not an Array nor Set." do
776
825
  sc = @schema
777
- sc.add(:indent, "-i <N>", "indent width", enum: ["2", "4", "8"])
778
- 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"]))
779
828
  pr = proc {
780
- sc.add(:indent, "-i <N>", "indent width", enum: "2,4,8")
829
+ sc.add(:indent3, "-k <N>", "indent width", enum: "2,4,8")
781
830
  }
782
831
  ok {pr}.raise?(Benry::CmdOpt::SchemaError,
783
832
  '"2,4,8": Array or set expected.')
@@ -847,7 +896,6 @@ END
847
896
  @schema.add(:indent1, "-i <N>", "indent", type: Integer, range: range1)
848
897
  @schema.add(:indent2, "-j <N>", "indent", type: Integer, range: range2)
849
898
  }
850
- pr.call
851
899
  ok {pr}.NOT.raise?(Exception)
852
900
  end
853
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.2.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-28 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