simple-cli-options 0.1.0 → 0.1.2

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/option.rb +19 -3
  3. data/lib/options.rb +10 -3
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8ff6ff3ffba56b65402a9c002d311a0bfa969924de39c043b68835b83983d6c
4
- data.tar.gz: 2916c0ea3b668b499a5a0d22fa7e7a3e0a2de753f856d2fd2529ca284dcee920
3
+ metadata.gz: a20b6b59fed0e7c00325c3df20d25fdd3e860bfb8e4635e824abf29ad413348a
4
+ data.tar.gz: 4e1dde6d25abb317503dd35eee37199886163c37d3b79f2a250b3b6c09749e49
5
5
  SHA512:
6
- metadata.gz: b7313860656b22a3498b6b6ba606e00c2490957f3531b4528654c2130e3595f763a729a5833c887ef00327a672410b1f20dd6736d2e43a8719601eac1475f4dd
7
- data.tar.gz: 41420744ead523fa5b942e59987928a5013dc08305d725a4aeabce726c9e7c45738a470a9d413cbe80c3b8b202aefdda41d317a8ed1be7416306e951bdbd0814
6
+ metadata.gz: eea0745fe1eb1a4616f70e90f9d8f5397fc4ebea94018c1e99d97310a949c28656f46a32ecdba211189dba58689edb54bc5b022aea7a9502442cabc006923e62
7
+ data.tar.gz: 299417202d0fe3f9bdb7cc0ce4db4c92a6ab02843dc23fb9485f59ac10c41a4463efc689ffe421c8c1df38611455ff2b161829870b871b13a69c6ba9a7d64a7f
data/lib/option.rb CHANGED
@@ -39,11 +39,15 @@ class Option
39
39
  validate_structure!
40
40
 
41
41
  # バリデーションは追加(Array)可能、変換は上書き
42
- @validators = T.let([options[:validate]].compact, T::Array[T.proc.params(arg0: String).returns(T::Boolean)])
42
+ # 各バリデータは、成功時に nil、失敗時にエラーメッセージ(String)を返す想定
43
+ @validators = T.let(
44
+ [options[:validate]].compact,
45
+ T::Array[T.proc.params(arg0: String).returns(T.nilable(String))]
46
+ )
43
47
  @converter = T.let(options[:convert] || ->(v) { v }, T.proc.params(arg0: String).returns(T.untyped))
44
48
  end
45
49
 
46
- sig { params(block: T.proc.params(arg0: String).returns(T::Boolean)).returns(T.self_type) }
50
+ sig { params(block: T.proc.params(arg0: String).returns(T.nilable(String))).returns(T.self_type) }
47
51
  def validate(&block)
48
52
  @validators << block
49
53
  self
@@ -58,8 +62,20 @@ class Option
58
62
  sig { params(value: String).returns(T.untyped) }
59
63
  def process(value)
60
64
  @validators.each do |v|
61
- raise "Validation failed for option '#{@name}' with value: #{value}" unless v.call(value)
65
+ msg = v.call(value)
66
+ next if msg.nil?
67
+
68
+ flags = [@short, @long].reject(&:empty?)
69
+ flags_part =
70
+ if flags.empty?
71
+ "option '#{@name}'"
72
+ else
73
+ "#{flags.join(' or ')} option"
74
+ end
75
+
76
+ raise ArgumentError, "#{msg} for #{flags_part}"
62
77
  end
78
+
63
79
  @converter.call(value)
64
80
  end
65
81
 
data/lib/options.rb CHANGED
@@ -37,8 +37,10 @@ class Options
37
37
  end
38
38
  end
39
39
 
40
- sig { params(argv: T::Array[String]).void }
41
- def parse!(argv)
40
+ sig { params(argv: T.nilable(T::Array[String])).void }
41
+ def parse!(argv = nil)
42
+ argv = T.let(argv || ARGV, T::Array[String])
43
+
42
44
  if argv.include?('-h') || argv.include?('--help')
43
45
  show_help
44
46
  exit 0
@@ -49,7 +51,12 @@ class Options
49
51
  idx = argv.find_index { |arg| arg == opt.short || arg == opt.long }
50
52
 
51
53
  if idx && argv[idx + 1]
52
- @values[opt.name] = opt.process(T.must(argv[idx + 1]))
54
+ begin
55
+ @values[opt.name] = opt.process(T.must(argv[idx + 1]))
56
+ rescue ArgumentError => e
57
+ warn "Error: #{e.message}"
58
+ exit 1
59
+ end
53
60
  elsif opt.required_flag
54
61
  warn "Error: Missing required option: #{opt.long.empty? ? opt.short : opt.long}"
55
62
  exit 1
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple-cli-options
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - HIROAKI SATOU