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 +4 -4
- data/Gemfile +1 -1
- data/README.md +18 -1
- data/lib/run_kit/core_ext.rb +1 -1
- data/lib/run_kit/options/config.rb +12 -12
- data/lib/run_kit/options/flag.rb +38 -16
- data/lib/run_kit/options/help.rb +7 -2
- data/lib/run_kit/options/parser.rb +11 -3
- data/run_kit.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6dabac9fceff597dbc18cca5e813a37c784bce2ed1148425ad5fd82264a2e3bd
|
|
4
|
+
data.tar.gz: f544b871ca35c2da4fd965b017a9e2b11c052f99d755c92b6110e4113ec25a4f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2e56df9f10755fec5eadc44396f368c0f6ebadd9987b2cf317373129902264c2e40073000198dba0511e142082780c0176a677461cd4fac083cd18d9dd8c2e29
|
|
7
|
+
data.tar.gz: b9dbdf57d9ec47c482f1dcdf23b237287564fe6b5c3568b2cdd1185d6ea893aee37b48634bd507e773d6deeb75d1234f54c522f9250e0ed8f348d8e17c9c424f
|
data/Gemfile
CHANGED
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.
|
|
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
|
data/lib/run_kit/core_ext.rb
CHANGED
|
@@ -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
|
data/lib/run_kit/options/flag.rb
CHANGED
|
@@ -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
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
66
|
-
|
|
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
|
-
|
|
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
|
data/lib/run_kit/options/help.rb
CHANGED
|
@@ -36,10 +36,15 @@ module RunKit
|
|
|
36
36
|
buf << label
|
|
37
37
|
|
|
38
38
|
# right
|
|
39
|
-
|
|
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(
|
|
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
|
-
|
|
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
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.
|
|
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:
|
|
90
|
+
rubygems_version: 4.0.6
|
|
91
91
|
specification_version: 4
|
|
92
92
|
summary: Run kit.
|
|
93
93
|
test_files: []
|