dry-cli 0.6.0 → 1.0.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 +4 -4
- data/CHANGELOG.md +75 -37
- data/LICENSE +1 -1
- data/README.md +5 -4
- data/dry-cli.gemspec +15 -14
- data/lib/dry/cli/banner.rb +31 -21
- data/lib/dry/cli/command.rb +56 -25
- data/lib/dry/cli/command_registry.rb +59 -34
- data/lib/dry/cli/inflector.rb +1 -1
- data/lib/dry/cli/inline.rb +4 -4
- data/lib/dry/cli/option.rb +2 -2
- data/lib/dry/cli/parser.rb +16 -18
- data/lib/dry/cli/program_name.rb +1 -1
- data/lib/dry/cli/registry.rb +11 -6
- data/lib/dry/cli/usage.rb +11 -8
- data/lib/dry/cli/version.rb +1 -1
- data/lib/dry/cli.rb +53 -34
- metadata +19 -20
- data/lib/dry/cli/utils/files.rb +0 -444
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require 'concurrent/hash'
|
3
|
+
require "set"
|
5
4
|
|
6
5
|
module Dry
|
7
6
|
class CLI
|
@@ -13,52 +12,65 @@ module Dry
|
|
13
12
|
# @since 0.1.0
|
14
13
|
# @api private
|
15
14
|
def initialize
|
15
|
+
@_mutex = Mutex.new
|
16
16
|
@root = Node.new
|
17
17
|
end
|
18
18
|
|
19
19
|
# @since 0.1.0
|
20
20
|
# @api private
|
21
21
|
def set(name, command, aliases)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
@_mutex.synchronize do
|
23
|
+
node = @root
|
24
|
+
name.split(/[[:space:]]/).each do |token|
|
25
|
+
node = node.put(node, token)
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
node.aliases!(aliases)
|
29
|
+
if command
|
30
|
+
node.leaf!(command)
|
31
|
+
node.subcommands!(command)
|
32
|
+
end
|
29
33
|
|
30
|
-
|
34
|
+
nil
|
35
|
+
end
|
31
36
|
end
|
32
37
|
|
33
38
|
# @since 0.1.0
|
34
39
|
# @api private
|
35
40
|
#
|
36
41
|
def get(arguments)
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
42
|
+
@_mutex.synchronize do
|
43
|
+
node = @root
|
44
|
+
args = []
|
45
|
+
names = []
|
46
|
+
valid_leaf = nil
|
47
|
+
result = LookupResult.new(node, args, names, node.leaf?)
|
48
|
+
|
49
|
+
arguments.each_with_index do |token, i|
|
50
|
+
tmp = node.lookup(token)
|
51
|
+
|
52
|
+
if tmp.nil? && valid_leaf
|
53
|
+
result = valid_leaf
|
54
|
+
break
|
55
|
+
elsif tmp.nil?
|
56
|
+
result = LookupResult.new(node, args, names, false)
|
57
|
+
break
|
58
|
+
elsif tmp.leaf?
|
59
|
+
args = arguments[i + 1..-1]
|
60
|
+
names = arguments[0..i]
|
61
|
+
node = tmp
|
62
|
+
result = LookupResult.new(node, args, names, true)
|
63
|
+
valid_leaf = result
|
64
|
+
break unless tmp.children?
|
65
|
+
else
|
66
|
+
names = arguments[0..i]
|
67
|
+
node = tmp
|
68
|
+
result = LookupResult.new(node, args, names, node.leaf?)
|
69
|
+
end
|
58
70
|
end
|
59
|
-
end
|
60
71
|
|
61
|
-
|
72
|
+
result
|
73
|
+
end
|
62
74
|
end
|
63
75
|
|
64
76
|
# Node of the registry
|
@@ -94,8 +106,8 @@ module Dry
|
|
94
106
|
# @api private
|
95
107
|
def initialize(parent = nil)
|
96
108
|
@parent = parent
|
97
|
-
@children =
|
98
|
-
@aliases =
|
109
|
+
@children = {}
|
110
|
+
@aliases = {}
|
99
111
|
@command = nil
|
100
112
|
|
101
113
|
@before_callbacks = Chain.new
|
@@ -120,6 +132,13 @@ module Dry
|
|
120
132
|
@command = command
|
121
133
|
end
|
122
134
|
|
135
|
+
# @since 0.7.0
|
136
|
+
# @api private
|
137
|
+
def subcommands!(command)
|
138
|
+
command_class = command.is_a?(Class) ? command : command.class
|
139
|
+
command_class.subcommands = children
|
140
|
+
end
|
141
|
+
|
123
142
|
# @since 0.1.0
|
124
143
|
# @api private
|
125
144
|
def alias!(key, child)
|
@@ -139,6 +158,12 @@ module Dry
|
|
139
158
|
def leaf?
|
140
159
|
!command.nil?
|
141
160
|
end
|
161
|
+
|
162
|
+
# @since 0.7.0
|
163
|
+
# @api private
|
164
|
+
def children?
|
165
|
+
children.any?
|
166
|
+
end
|
142
167
|
end
|
143
168
|
|
144
169
|
# Result of a registry lookup
|
data/lib/dry/cli/inflector.rb
CHANGED
data/lib/dry/cli/inline.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "backports/2.5.0/module/define_method" if RUBY_VERSION < "2.5"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
class CLI
|
7
|
-
require
|
7
|
+
require "dry/cli"
|
8
8
|
# Inline Syntax (aka DSL) to implement one-file applications
|
9
9
|
#
|
10
10
|
# `dry/cli/inline` is not required by default
|
@@ -62,8 +62,8 @@ module Dry
|
|
62
62
|
# @since 0.6.0
|
63
63
|
def run(arguments: ARGV, out: $stdout)
|
64
64
|
command = AnonymousCommand
|
65
|
-
command.define_method(:call) do
|
66
|
-
yield(
|
65
|
+
command.define_method(:call) do |**args|
|
66
|
+
yield(**args)
|
67
67
|
end
|
68
68
|
|
69
69
|
Dry.CLI(command).call(arguments: arguments, out: out)
|
data/lib/dry/cli/option.rb
CHANGED
@@ -32,7 +32,7 @@ module Dry
|
|
32
32
|
# @api private
|
33
33
|
def desc
|
34
34
|
desc = options[:desc]
|
35
|
-
values ? "#{desc}: (#{values.join(
|
35
|
+
values ? "#{desc}: (#{values.join("/")})" : desc
|
36
36
|
end
|
37
37
|
|
38
38
|
# @since 0.1.0
|
@@ -108,7 +108,7 @@ module Dry
|
|
108
108
|
# @api private
|
109
109
|
def alias_names
|
110
110
|
aliases
|
111
|
-
.map { |name| name.gsub(/^-{1,2}/,
|
111
|
+
.map { |name| name.gsub(/^-{1,2}/, "") }
|
112
112
|
.compact
|
113
113
|
.uniq
|
114
114
|
.map { |name| name.size == 1 ? "-#{name}" : "--#{name}" }
|
data/lib/dry/cli/parser.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "optparse"
|
4
|
+
require "dry/cli/program_name"
|
5
5
|
|
6
6
|
module Dry
|
7
7
|
class CLI
|
@@ -13,7 +13,7 @@ module Dry
|
|
13
13
|
# @since 0.1.0
|
14
14
|
# @api private
|
15
15
|
#
|
16
|
-
def self.call(command, arguments,
|
16
|
+
def self.call(command, arguments, prog_name)
|
17
17
|
original_arguments = arguments.dup
|
18
18
|
parsed_options = {}
|
19
19
|
|
@@ -24,28 +24,22 @@ module Dry
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
opts.on_tail(
|
27
|
+
opts.on_tail("-h", "--help") do
|
28
28
|
return Result.help
|
29
29
|
end
|
30
30
|
end.parse!(arguments)
|
31
31
|
|
32
32
|
parsed_options = command.default_params.merge(parsed_options)
|
33
|
-
parse_required_params(command, arguments,
|
33
|
+
parse_required_params(command, arguments, prog_name, parsed_options)
|
34
34
|
rescue ::OptionParser::ParseError
|
35
|
-
Result.failure("
|
36
|
-
end
|
37
|
-
|
38
|
-
# @since 0.1.0
|
39
|
-
# @api private
|
40
|
-
def self.full_command_name(names)
|
41
|
-
ProgramName.call(names)
|
35
|
+
Result.failure("ERROR: \"#{prog_name}\" was called with arguments \"#{original_arguments.join(" ")}\"") # rubocop:disable Metrics/LineLength
|
42
36
|
end
|
43
37
|
|
44
38
|
# @since 0.1.0
|
45
39
|
# @api private
|
46
40
|
#
|
47
41
|
# rubocop:disable Metrics/AbcSize
|
48
|
-
def self.parse_required_params(command, arguments,
|
42
|
+
def self.parse_required_params(command, arguments, prog_name, parsed_options)
|
49
43
|
parsed_params = match_arguments(command.arguments, arguments)
|
50
44
|
parsed_required_params = match_arguments(command.required_arguments, arguments)
|
51
45
|
all_required_params_satisfied = command.required_arguments.all? { |param| !parsed_required_params[param.name].nil? } # rubocop:disable Metrics/LineLength
|
@@ -55,12 +49,16 @@ module Dry
|
|
55
49
|
unless all_required_params_satisfied
|
56
50
|
parsed_required_params_values = parsed_required_params.values.compact
|
57
51
|
|
58
|
-
usage = "\nUsage: \"#{
|
52
|
+
usage = "\nUsage: \"#{prog_name} #{command.required_arguments.map(&:description_name).join(" ")}" # rubocop:disable Metrics/LineLength
|
53
|
+
|
54
|
+
usage += " | #{prog_name} SUBCOMMAND" if command.subcommands.any?
|
55
|
+
|
56
|
+
usage += '"'
|
59
57
|
|
60
|
-
if parsed_required_params_values.empty?
|
61
|
-
return Result.failure("ERROR: \"#{
|
58
|
+
if parsed_required_params_values.empty?
|
59
|
+
return Result.failure("ERROR: \"#{prog_name}\" was called with no arguments#{usage}")
|
62
60
|
else
|
63
|
-
return Result.failure("ERROR: \"#{
|
61
|
+
return Result.failure("ERROR: \"#{prog_name}\" was called with arguments #{parsed_required_params_values}#{usage}") # rubocop:disable Metrics/LineLength
|
64
62
|
end
|
65
63
|
end
|
66
64
|
|
@@ -103,7 +101,7 @@ module Dry
|
|
103
101
|
|
104
102
|
# @since 0.1.0
|
105
103
|
# @api private
|
106
|
-
def self.failure(error =
|
104
|
+
def self.failure(error = "Error: Invalid param provided")
|
107
105
|
new(error: error)
|
108
106
|
end
|
109
107
|
|
data/lib/dry/cli/program_name.rb
CHANGED
data/lib/dry/cli/registry.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/cli/command_registry"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
class CLI
|
@@ -12,6 +12,7 @@ module Dry
|
|
12
12
|
# @api private
|
13
13
|
def self.extended(base)
|
14
14
|
base.class_eval do
|
15
|
+
@_mutex = Mutex.new
|
15
16
|
@commands = CommandRegistry.new
|
16
17
|
end
|
17
18
|
end
|
@@ -75,6 +76,8 @@ module Dry
|
|
75
76
|
# end
|
76
77
|
# end
|
77
78
|
def register(name, command = nil, aliases: [], &block)
|
79
|
+
@commands.set(name, command, aliases)
|
80
|
+
|
78
81
|
if block_given?
|
79
82
|
prefix = Prefix.new(@commands, name, aliases)
|
80
83
|
if block.arity.zero?
|
@@ -82,8 +85,6 @@ module Dry
|
|
82
85
|
else
|
83
86
|
yield(prefix)
|
84
87
|
end
|
85
|
-
else
|
86
|
-
@commands.set(name, command, aliases)
|
87
88
|
end
|
88
89
|
end
|
89
90
|
|
@@ -170,7 +171,9 @@ module Dry
|
|
170
171
|
# end
|
171
172
|
# end
|
172
173
|
def before(command_name, callback = nil, &blk)
|
173
|
-
|
174
|
+
@_mutex.synchronize do
|
175
|
+
command(command_name).before_callbacks.append(&_callback(callback, blk))
|
176
|
+
end
|
174
177
|
end
|
175
178
|
|
176
179
|
# Register an after callback.
|
@@ -256,7 +259,9 @@ module Dry
|
|
256
259
|
# end
|
257
260
|
# end
|
258
261
|
def after(command_name, callback = nil, &blk)
|
259
|
-
|
262
|
+
@_mutex.synchronize do
|
263
|
+
command(command_name).after_callbacks.append(&_callback(callback, blk))
|
264
|
+
end
|
260
265
|
end
|
261
266
|
|
262
267
|
# @since 0.1.0
|
@@ -267,7 +272,7 @@ module Dry
|
|
267
272
|
|
268
273
|
private
|
269
274
|
|
270
|
-
COMMAND_NAME_SEPARATOR =
|
275
|
+
COMMAND_NAME_SEPARATOR = " "
|
271
276
|
|
272
277
|
# @since 0.2.0
|
273
278
|
# @api private
|
data/lib/dry/cli/usage.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/cli/program_name"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
class CLI
|
@@ -11,12 +11,13 @@ module Dry
|
|
11
11
|
module Usage
|
12
12
|
# @since 0.1.0
|
13
13
|
# @api private
|
14
|
-
SUBCOMMAND_BANNER =
|
14
|
+
SUBCOMMAND_BANNER = " [SUBCOMMAND]"
|
15
|
+
ROOT_COMMAND_WITH_SUBCOMMANDS_BANNER = " [ARGUMENT|SUBCOMMAND]"
|
15
16
|
|
16
17
|
# @since 0.1.0
|
17
18
|
# @api private
|
18
19
|
def self.call(result)
|
19
|
-
header =
|
20
|
+
header = "Commands:"
|
20
21
|
max_length, commands = commands_and_arguments(result)
|
21
22
|
|
22
23
|
commands.map do |banner, node|
|
@@ -30,7 +31,9 @@ module Dry
|
|
30
31
|
def self.commands_and_arguments(result)
|
31
32
|
max_length = 0
|
32
33
|
ret = commands(result).each_with_object({}) do |(name, node), memo|
|
33
|
-
args = if node.leaf?
|
34
|
+
args = if node.command && node.leaf? && node.children?
|
35
|
+
ROOT_COMMAND_WITH_SUBCOMMANDS_BANNER
|
36
|
+
elsif node.leaf?
|
34
37
|
arguments(node.command)
|
35
38
|
else
|
36
39
|
SUBCOMMAND_BANNER
|
@@ -52,11 +55,11 @@ module Dry
|
|
52
55
|
required_arguments = command.required_arguments
|
53
56
|
optional_arguments = command.optional_arguments
|
54
57
|
|
55
|
-
required = required_arguments.map { |arg| arg.name.upcase }.join(
|
56
|
-
optional = optional_arguments.map { |arg| "[#{arg.name.upcase}]" }.join(
|
58
|
+
required = required_arguments.map { |arg| arg.name.upcase }.join(" ") if required_arguments.any? # rubocop:disable Metrics/LineLength
|
59
|
+
optional = optional_arguments.map { |arg| "[#{arg.name.upcase}]" }.join(" ") if optional_arguments.any? # rubocop:disable Metrics/LineLength
|
57
60
|
result = [required, optional].compact
|
58
61
|
|
59
|
-
" #{result.join(
|
62
|
+
" #{result.join(" ")}" unless result.empty?
|
60
63
|
end
|
61
64
|
|
62
65
|
# @since 0.1.0
|
@@ -70,7 +73,7 @@ module Dry
|
|
70
73
|
# @since 0.1.0
|
71
74
|
# @api private
|
72
75
|
def self.justify(string, padding, usage)
|
73
|
-
return string.chomp(
|
76
|
+
return string.chomp(" ") if usage.nil?
|
74
77
|
|
75
78
|
string.ljust(padding + padding / 2)
|
76
79
|
end
|
data/lib/dry/cli/version.rb
CHANGED
data/lib/dry/cli.rb
CHANGED
@@ -8,14 +8,14 @@ module Dry
|
|
8
8
|
#
|
9
9
|
# @since 0.1.0
|
10
10
|
class CLI
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
11
|
+
require "dry/cli/version"
|
12
|
+
require "dry/cli/errors"
|
13
|
+
require "dry/cli/command"
|
14
|
+
require "dry/cli/registry"
|
15
|
+
require "dry/cli/parser"
|
16
|
+
require "dry/cli/usage"
|
17
|
+
require "dry/cli/banner"
|
18
|
+
require "dry/cli/inflector"
|
19
19
|
|
20
20
|
# Check if command
|
21
21
|
#
|
@@ -62,9 +62,11 @@ module Dry
|
|
62
62
|
# @since 0.1.0
|
63
63
|
def call(arguments: ARGV, out: $stdout, err: $stderr)
|
64
64
|
@out, @err = out, err
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
kommand ? perform_command(arguments) : perform_registry(arguments)
|
66
|
+
rescue SignalException => e
|
67
|
+
signal_exception(e)
|
68
|
+
rescue Errno::EPIPE
|
69
|
+
# no op
|
68
70
|
end
|
69
71
|
|
70
72
|
private
|
@@ -106,16 +108,13 @@ module Dry
|
|
106
108
|
# @api private
|
107
109
|
def perform_registry(arguments)
|
108
110
|
result = registry.get(arguments)
|
111
|
+
return usage(result) unless result.found?
|
109
112
|
|
110
|
-
|
111
|
-
command, args = parse(result.command, result.arguments, result.names)
|
113
|
+
command, args = parse(result.command, result.arguments, result.names)
|
112
114
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
else
|
117
|
-
usage(result)
|
118
|
-
end
|
115
|
+
result.before_callbacks.run(command, args)
|
116
|
+
command.call(**args)
|
117
|
+
result.after_callbacks.run(command, args)
|
119
118
|
end
|
120
119
|
|
121
120
|
# Parse arguments for a command.
|
@@ -131,26 +130,37 @@ module Dry
|
|
131
130
|
# @since 0.6.0
|
132
131
|
# @api private
|
133
132
|
def parse(command, arguments, names)
|
134
|
-
|
133
|
+
prog_name = ProgramName.call(names)
|
135
134
|
|
136
|
-
|
137
|
-
out.puts Banner.call(command, names)
|
138
|
-
exit(0)
|
139
|
-
end
|
135
|
+
result = Parser.call(command, arguments, prog_name)
|
140
136
|
|
141
|
-
if result.
|
142
|
-
|
143
|
-
|
144
|
-
end
|
137
|
+
return help(command, prog_name) if result.help?
|
138
|
+
|
139
|
+
return error(result) if result.error?
|
145
140
|
|
146
|
-
[command
|
141
|
+
[build_command(command), result.arguments]
|
142
|
+
end
|
143
|
+
|
144
|
+
# @since 0.6.0
|
145
|
+
# @api private
|
146
|
+
def build_command(command)
|
147
|
+
command.is_a?(Class) ? command.new : command
|
148
|
+
end
|
149
|
+
|
150
|
+
# @since 0.6.0
|
151
|
+
# @api private
|
152
|
+
def help(command, prog_name)
|
153
|
+
out.puts Banner.call(command, prog_name)
|
154
|
+
exit(0) # Successful exit
|
155
|
+
end
|
156
|
+
|
157
|
+
# @since 0.6.0
|
158
|
+
# @api private
|
159
|
+
def error(result)
|
160
|
+
err.puts(result.error)
|
161
|
+
exit(1)
|
147
162
|
end
|
148
163
|
|
149
|
-
# Prints the command usage and exit.
|
150
|
-
#
|
151
|
-
# @param result [Dry::CLI::CommandRegistry::LookupResult]
|
152
|
-
# @param out [IO] sta output
|
153
|
-
#
|
154
164
|
# @since 0.1.0
|
155
165
|
# @api private
|
156
166
|
def usage(result)
|
@@ -158,6 +168,15 @@ module Dry
|
|
158
168
|
exit(1)
|
159
169
|
end
|
160
170
|
|
171
|
+
# Handles Exit codes for signals
|
172
|
+
# Fatal error signal "n". Say 130 = 128 + 2 (SIGINT) or 137 = 128 + 9 (SIGKILL)
|
173
|
+
#
|
174
|
+
# @since 0.7.0
|
175
|
+
# @api private
|
176
|
+
def signal_exception(exception)
|
177
|
+
exit(128 + exception.signo)
|
178
|
+
end
|
179
|
+
|
161
180
|
# Check if command
|
162
181
|
#
|
163
182
|
# @param command [Object] the command to check
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: concurrent-ruby
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +58,20 @@ dependencies:
|
|
72
58
|
- - "~>"
|
73
59
|
- !ruby/object:Gem::Version
|
74
60
|
version: '3.7'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rubocop
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0.82'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0.82'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: simplecov
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,14 +109,13 @@ files:
|
|
109
109
|
- lib/dry/cli/program_name.rb
|
110
110
|
- lib/dry/cli/registry.rb
|
111
111
|
- lib/dry/cli/usage.rb
|
112
|
-
- lib/dry/cli/utils/files.rb
|
113
112
|
- lib/dry/cli/version.rb
|
114
113
|
homepage: https://dry-rb.org/gems/dry-cli
|
115
114
|
licenses:
|
116
115
|
- MIT
|
117
116
|
metadata:
|
118
117
|
allowed_push_host: https://rubygems.org
|
119
|
-
changelog_uri: https://github.com/dry-rb/dry-cli/blob/
|
118
|
+
changelog_uri: https://github.com/dry-rb/dry-cli/blob/main/CHANGELOG.md
|
120
119
|
source_code_uri: https://github.com/dry-rb/dry-cli
|
121
120
|
bug_tracker_uri: https://github.com/dry-rb/dry-cli/issues
|
122
121
|
post_install_message:
|
@@ -127,14 +126,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
127
126
|
requirements:
|
128
127
|
- - ">="
|
129
128
|
- !ruby/object:Gem::Version
|
130
|
-
version: 2.
|
129
|
+
version: 2.7.0
|
131
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
131
|
requirements:
|
133
132
|
- - ">="
|
134
133
|
- !ruby/object:Gem::Version
|
135
134
|
version: '0'
|
136
135
|
requirements: []
|
137
|
-
rubygems_version: 3.
|
136
|
+
rubygems_version: 3.1.6
|
138
137
|
signing_key:
|
139
138
|
specification_version: 4
|
140
139
|
summary: Common framework to build command line interfaces with Ruby
|