run_kit 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4f28d8c9977c242536eb737cdde4f7723df1cdaf7b094efcf724562c2fd0f1e
4
- data.tar.gz: fe8f3c3a1479f61483137e0ae96a72b2adc0e78b0ccb611130c0d13afbcdd627
3
+ metadata.gz: 6dabac9fceff597dbc18cca5e813a37c784bce2ed1148425ad5fd82264a2e3bd
4
+ data.tar.gz: f544b871ca35c2da4fd965b017a9e2b11c052f99d755c92b6110e4113ec25a4f
5
5
  SHA512:
6
- metadata.gz: 176389146afcdc0646319c3911024ff6903dcfb4836ac54f86e6f0d7ca9557c71b3a00e3d4295f7ea53c6e5751dcc8f55eb45713da71e6d32083fcbd9feb7b9e
7
- data.tar.gz: 784fc1c1c4702adca3504ca13ea1c713172df14791adfb355755dd97ea9e89d570f8f664d28cdd7b8bfcdf08a18d9c520b43dc2e6219a3a9df5285d8cea0877f
6
+ metadata.gz: 2e56df9f10755fec5eadc44396f368c0f6ebadd9987b2cf317373129902264c2e40073000198dba0511e142082780c0176a677461cd4fac083cd18d9dd8c2e29
7
+ data.tar.gz: b9dbdf57d9ec47c482f1dcdf23b237287564fe6b5c3568b2cdd1185d6ea893aee37b48634bd507e773d6deeb75d1234f54c522f9250e0ed8f348d8e17c9c424f
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "https://rubygems.org"
1
+ source "https://rubygems.org", cooldown: 7
2
2
  gemspec
3
3
 
4
4
  group :development, :test do
data/README.md CHANGED
@@ -30,6 +30,15 @@ Automatic `--help` for the above. Uses color and wraps to terminal:
30
30
 
31
31
  <img width="379" height="108" alt="image" src="https://github.com/user-attachments/assets/3d11c8ca-6b57-4dec-9c11-28bf23162ded" />
32
32
 
33
+ Flags can also read from ENV:
34
+
35
+ ```ruby
36
+ o.bool "--force", env: true # ENV["FORCE"]
37
+ o.str "--token", env: "API_TOKEN" # ENV["API_TOKEN"]
38
+ ```
39
+
40
+ Configured variables appear in `--help`. Command-line values override ENV, which overrides defaults. Boolean ENV values accept `true/1/yes/on` and `false/0/no/off/empty`, ignoring case.
41
+
33
42
  ## RunKit::Shell
34
43
 
35
44
  `RunKit::Shell` is a mixin with many helpers for bin scripts:
@@ -102,6 +111,14 @@ Note: There has been some effort to get the Pathname helpers into Ruby itself, w
102
111
 
103
112
  ### Changelog
104
113
 
105
- #### 0.1.0 (unreleased)
114
+ #### 0.1.2 (Sep 2026)
115
+
116
+ - allow options to read from ENV
117
+
118
+ #### 0.1.1 Sep 2026
119
+
120
+ - add title to progressbar default
121
+
122
+ #### 0.1.0
106
123
 
107
124
  - first
@@ -35,7 +35,7 @@ module RunKit
35
35
  module Enumerator
36
36
  def with_progressbar(options = {}, &block)
37
37
  defaults = {
38
- format: "%j%% %B #{RunKit::Term.paint_ansi("%c/%u %e", RunKit::Term.ansi256_fg(242))}",
38
+ format: "%t: %j%% %B #{RunKit::Term.paint_ansi("%c/%u %e", RunKit::Term.ansi256_fg(242))}",
39
39
  progress_mark: RunKit::Term.paint_ansi("━", RunKit::Term.ansi256_fg(46)),
40
40
  remainder_mark: RunKit::Term.paint_ansi("━", RunKit::Term.ansi256_fg(237)),
41
41
  output: $stdout.isatty ? $stdout : $stderr,
@@ -37,28 +37,28 @@ module RunKit
37
37
  # flags
38
38
  #
39
39
 
40
- def bool(*opts, default: nil, required: false)
41
- add_flag(Flag.new(:bool, opts, default:, required:))
40
+ def bool(*opts, default: nil, required: false, env: nil)
41
+ add_flag(Flag.new(:bool, opts, default:, required:, env:))
42
42
  end
43
43
 
44
- def float(*opts, default: nil, required: false, choices: nil)
45
- add_flag(Flag.new(:float, opts, default:, required:, choices:))
44
+ def float(*opts, default: nil, required: false, choices: nil, env: nil)
45
+ add_flag(Flag.new(:float, opts, default:, required:, choices:, env:))
46
46
  end
47
47
 
48
- def int(*opts, default: nil, required: false, choices: nil)
49
- add_flag(Flag.new(:int, opts, default:, required:, choices:))
48
+ def int(*opts, default: nil, required: false, choices: nil, env: nil)
49
+ add_flag(Flag.new(:int, opts, default:, required:, choices:, env:))
50
50
  end
51
51
 
52
- def path(*opts, default: nil, required: false, choices: nil)
53
- add_flag(Flag.new(:path, opts, default:, required:, choices:))
52
+ def path(*opts, default: nil, required: false, choices: nil, env: nil)
53
+ add_flag(Flag.new(:path, opts, default:, required:, choices:, env:))
54
54
  end
55
55
 
56
- def str(*opts, default: nil, required: false, choices: nil)
57
- add_flag(Flag.new(:str, opts, default:, required:, choices:))
56
+ def str(*opts, default: nil, required: false, choices: nil, env: nil)
57
+ add_flag(Flag.new(:str, opts, default:, required:, choices:, env:))
58
58
  end
59
59
 
60
- def sym(*opts, default: nil, required: false, choices: nil)
61
- add_flag(Flag.new(:sym, opts, default:, required:, choices:))
60
+ def sym(*opts, default: nil, required: false, choices: nil, env: nil)
61
+ add_flag(Flag.new(:sym, opts, default:, required:, choices:, env:))
62
62
  end
63
63
 
64
64
  # long-form aliases
@@ -12,12 +12,14 @@ module RunKit
12
12
  # --no-foo
13
13
  NEGATE_RE = /\A--no-(\w[\w-]*)\z/
14
14
 
15
+ TRUE_ENV = %w[1 true yes on]
16
+ FALSE_ENV = ["", "0", "false", "no", "off"]
15
17
  KINDS = %i[bool float int path str sym]
16
18
 
17
- attr_reader :choices, :default, :help, :kind, :meta, :required, :switches
19
+ attr_reader(*%i[choices default env help kind meta required switches])
18
20
 
19
21
  # ctor
20
- def initialize(kind, opts, default: nil, required: false, choices: nil)
22
+ def initialize(kind, opts, default: nil, required: false, choices: nil, env: nil)
21
23
  @choices, @kind, @required = choices, kind, required
22
24
 
23
25
  # extract @help from last string
@@ -28,6 +30,7 @@ module RunKit
28
30
 
29
31
  # Extract meta from the final switch, if written as `--port <int>`.
30
32
  @meta = build_meta
33
+ @env = (env == true) ? key.to_s.upcase : env
31
34
 
32
35
  # default, with some special handling for bool
33
36
  @default = default
@@ -50,22 +53,21 @@ module RunKit
50
53
  end
51
54
 
52
55
  raise Error, "option '#{switch}' requires a value" if !param
53
- parsed = begin
54
- case kind
55
- when :float then Float(param)
56
- when :int then Integer(param, 10)
57
- when :path then Pathname.new(param)
58
- when :str then param
59
- when :sym then param.to_sym
60
- end
61
- rescue ArgumentError
62
- raise Error, "invalid value '#{param}' for option '#{switch}'"
63
- end
56
+ parse_value(param, "option '#{switch}'")
57
+ end
64
58
 
65
- if choices && !choices.include?(parsed)
66
- raise Error, "invalid value '#{parsed}' for option '#{switch}', must be one of #{choices.join(", ")}"
59
+ # Parse a value supplied by ENV[$SOMETHING]
60
+ def parse_env(param)
61
+ source = "environment variable '#{env}'"
62
+
63
+ # special handling for bools
64
+ if bool?
65
+ return true if TRUE_ENV.include?(param.downcase)
66
+ return false if FALSE_ENV.include?(param.downcase)
67
+ raise Error, "invalid value '#{param}' for #{source}"
67
68
  end
68
- parsed
69
+
70
+ parse_value(param, source)
69
71
  end
70
72
 
71
73
  # one-liners
@@ -96,6 +98,7 @@ module RunKit
96
98
  raise ArgumentError, "required must be true or false" unless required == true || required == false
97
99
  raise ArgumentError, "required flags cannot have defaults" if required && default != nil
98
100
  raise ArgumentError, "invalid default #{default.inspect} for #{kind}" if default != nil && !allowed?(default)
101
+ raise ArgumentError, "env must be true or a string" unless env.nil? || env.is_a?(String)
99
102
 
100
103
  # choices
101
104
  if choices
@@ -130,6 +133,25 @@ module RunKit
130
133
  when :sym then candidate.is_a?(Symbol)
131
134
  end
132
135
  end
136
+
137
+ def parse_value(param, source)
138
+ parsed = begin
139
+ case kind
140
+ when :float then Float(param)
141
+ when :int then Integer(param, 10)
142
+ when :path then Pathname.new(param)
143
+ when :str then param
144
+ when :sym then param.to_sym
145
+ end
146
+ rescue ArgumentError
147
+ raise Error, "invalid value '#{param}' for #{source}"
148
+ end
149
+
150
+ if choices && !choices.include?(parsed)
151
+ raise Error, "invalid value '#{parsed}' for #{source}, must be one of #{choices.join(", ")}"
152
+ end
153
+ parsed
154
+ end
133
155
  end
134
156
  end
135
157
  end
@@ -36,10 +36,15 @@ module RunKit
36
36
  buf << label
37
37
 
38
38
  # right
39
- if flag.help
39
+ help = flag.help
40
+ if flag.env
41
+ env_help = "[env: #{flag.env}]"
42
+ help = help ? "#{help} #{env_help}" : env_help
43
+ end
44
+ if help
40
45
  buf << " " * (label_width - Term.width(label) + 2)
41
46
  indent = INDENT + label_width + 2
42
- buf << Term.wrap(flag.help, width - indent).gsub("\n", "\n#{" " * indent}")
47
+ buf << Term.wrap(help, width - indent).gsub("\n", "\n#{" " * indent}")
43
48
  end
44
49
  buf << "\n"
45
50
  end
@@ -14,7 +14,10 @@ module RunKit
14
14
 
15
15
  # Reset transient state, parse argv, and assemble the result.
16
16
  def parse(argv)
17
- @options, @queue = config.defaults, argv.dup
17
+ env = build_env
18
+ raise NakedRequested if config.naked? && argv.empty? && env.empty?
19
+
20
+ @options, @queue = config.defaults.merge(env), argv.dup
18
21
  parse_queue
19
22
  validate!
20
23
  options
@@ -27,8 +30,6 @@ module RunKit
27
30
  #
28
31
 
29
32
  def parse_queue
30
- raise NakedRequested if config.naked? && queue.empty?
31
-
32
33
  # any non-flags we find below
33
34
  operands = []
34
35
 
@@ -117,6 +118,13 @@ module RunKit
117
118
  # helpers
118
119
  #
119
120
 
121
+ def build_env
122
+ config.flags.filter_map do
123
+ next unless _1.env && ENV.key?(_1.env)
124
+ [_1.key, _1.parse_env(ENV.fetch(_1.env))]
125
+ end.to_h
126
+ end
127
+
120
128
  def builtin!(flag)
121
129
  raise HelpRequested if flag == config.help_flag
122
130
  raise VersionRequested if flag == config.version_flag
data/run_kit.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "run_kit"
3
- s.version = "0.1.0"
3
+ s.version = "0.1.2"
4
4
  s.authors = ["Adam Doppelt"]
5
5
  s.email = "amd@gurge.com"
6
6
  s.summary = "Run kit."
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: run_kit
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
  - Adam Doppelt
@@ -87,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
89
  requirements: []
90
- rubygems_version: 3.6.9
90
+ rubygems_version: 4.0.6
91
91
  specification_version: 4
92
92
  summary: Run kit.
93
93
  test_files: []