benry-cmdopt 2.1.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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