dry-cli 1.1.0 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3bb38a55577b2607724ceaafe32979ca39b83b62ece8d5e734f522646042d2f5
4
- data.tar.gz: 05e3fe644ca5fceb2bd3dc740453faf8aab28faaf7ad5ae9ab39a23474f7f611
3
+ metadata.gz: 8ab3b2530b7f867fee473bfb808d816bcfefd9732f49e158d32d5d914873516c
4
+ data.tar.gz: 897275b361168f15eb760ced1d5a6db6ec1229361a9b323e06a3204bfe89cd8d
5
5
  SHA512:
6
- metadata.gz: 97ff398081901a642d1d8d898a50eec46e33103defff2e4c77f11a0e5150dcb79fc7e568cbeaaeaa7e6af9f0e05835b265a2ceb7fda144f4983b8dfc27363728
7
- data.tar.gz: 39b43443b842724a7096a909bba93dd93ceda1c470a2cfc2ec9ac9e02f2aee0b449f2dd6c2b7bf9c0c92485ad404a14ba1a352518d5070366535bbc19d5cb789
6
+ metadata.gz: c12f142b52bb3114425d7be016416603a951cc88b5252593a77f3cd48bbe73d0b7e453dca3519fd5025af9832b875f563208914cb5657d6d0b5eef19782d6412
7
+ data.tar.gz: 2749e9f49dcf611171bdcdb2f9dbc51106cf78d7658155b2229a6e391610c18f288235ebe2abac654b6dfa8a0461e54e325cd2d315aa9303b2a06e1ddc1119fa
data/CHANGELOG.md CHANGED
@@ -1,5 +1,49 @@
1
1
  <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
+ ## 1.3.0 2025-07-29
4
+
5
+
6
+ ### Added
7
+
8
+ - Support unlimited nesting when registering commands via `register` with blocks. (@aaronmallen in #149)
9
+
10
+ You could previously do this only with fully qualified registrations:
11
+
12
+ ```ruby
13
+ Commands.register "nested one", MyFirstNestedCommand
14
+ Commands.register "nested one two", MySecondNestedCommand
15
+ Commands.register "nested one two three", MyThirdNestedCommand
16
+ ```
17
+
18
+ Now you can do the same via blocks:
19
+
20
+ ```ruby
21
+ Commands.register "nested" do
22
+ register "one", MyFirstNestedCommand do
23
+ register "two", MySecondNestedCommand do
24
+ register "three", MyThirdNestedCommand
25
+ end
26
+ end
27
+ end
28
+ ```
29
+
30
+ ### Changed
31
+
32
+ - Set minimum Ruby version to 3.1. (@timriley)
33
+
34
+ [Compare v1.2.0...v1.3.0](https://github.com/dry-rb/dry-cli/compare/v1.2.0...v1.3.0)
35
+
36
+ ## 1.2.0 2024-10-15
37
+
38
+
39
+ ### Added
40
+
41
+ - Added `:hidden` option to register commands that should not be shown in the help output. (@benoittgt in #137)
42
+ - Provide suggestions when there is a typo in a command name. (@benoittgt in #138)
43
+
44
+
45
+ [Compare v1.1.0...v1.2.0](https://github.com/dry-rb/dry-cli/compare/v1.1.0...v1.2.0)
46
+
3
47
  ## 1.1.0 2024-07-14
4
48
 
5
49
 
data/README.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  This library officially supports the following Ruby versions:
16
16
 
17
- * MRI `>= 2.4.0`
17
+ * MRI `>= 3.1.0`
18
18
  * jruby `>= 9.4` (not tested on CI)
19
19
 
20
20
  ## License
data/dry-cli.gemspec CHANGED
@@ -26,13 +26,12 @@ Gem::Specification.new do |spec|
26
26
  spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-cli"
27
27
  spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-cli/issues"
28
28
 
29
- spec.required_ruby_version = ">= 2.4.0"
29
+ spec.required_ruby_version = ">= 3.1"
30
30
 
31
31
  # to update dependencies edit project.yml
32
32
 
33
33
  spec.add_development_dependency "bundler", ">= 1.6", "< 3"
34
34
  spec.add_development_dependency "rake", "~> 13.0"
35
35
  spec.add_development_dependency "rspec", "~> 3.7"
36
- spec.add_development_dependency "rubocop", "~> 0.82"
37
36
  spec.add_development_dependency "simplecov", "~> 0.17.1"
38
37
  end
@@ -18,7 +18,7 @@ module Dry
18
18
 
19
19
  # @since 0.1.0
20
20
  # @api private
21
- def set(name, command, aliases)
21
+ def set(name, command, aliases, hidden)
22
22
  @_mutex.synchronize do
23
23
  node = @root
24
24
  name.split(/[[:space:]]/).each do |token|
@@ -26,6 +26,7 @@ module Dry
26
26
  end
27
27
 
28
28
  node.aliases!(aliases)
29
+ node.hidden!(hidden)
29
30
  if command
30
31
  node.leaf!(command)
31
32
  node.subcommands!(command)
@@ -91,6 +92,10 @@ module Dry
91
92
  # @api private
92
93
  attr_reader :aliases
93
94
 
95
+ # @since 1.1.1
96
+ # @api private
97
+ attr_reader :hidden
98
+
94
99
  # @since 0.1.0
95
100
  # @api private
96
101
  attr_reader :command
@@ -109,6 +114,7 @@ module Dry
109
114
  @parent = parent
110
115
  @children = {}
111
116
  @aliases = {}
117
+ @hidden = hidden
112
118
  @command = nil
113
119
 
114
120
  @before_callbacks = Chain.new
@@ -154,6 +160,12 @@ module Dry
154
160
  end
155
161
  end
156
162
 
163
+ # @since 1.1.1
164
+ # @api private
165
+ def hidden!(hidden)
166
+ @hidden = hidden
167
+ end
168
+
157
169
  # @since 0.1.0
158
170
  # @api private
159
171
  def leaf?
@@ -75,11 +75,11 @@ module Dry
75
75
  # end
76
76
  # end
77
77
  # end
78
- def register(name, command = nil, aliases: [], &block)
79
- @commands.set(name, command, aliases)
78
+ def register(name, command = nil, aliases: [], hidden: false, &block)
79
+ @commands.set(name, command, aliases, hidden)
80
80
 
81
81
  if block_given?
82
- prefix = Prefix.new(@commands, name, aliases)
82
+ prefix = Prefix.new(@commands, name, aliases, hidden)
83
83
  if block.arity.zero?
84
84
  prefix.instance_eval(&block)
85
85
  else
@@ -308,19 +308,28 @@ module Dry
308
308
  class Prefix
309
309
  # @since 0.1.0
310
310
  # @api private
311
- def initialize(registry, prefix, aliases)
311
+ def initialize(registry, prefix, aliases, hidden)
312
312
  @registry = registry
313
313
  @prefix = prefix
314
314
 
315
- registry.set(prefix, nil, aliases)
315
+ registry.set(prefix, nil, aliases, hidden)
316
316
  end
317
317
 
318
318
  # @since 0.1.0
319
319
  #
320
320
  # @see Dry::CLI::Registry#register
321
- def register(name, command, aliases: [])
321
+ def register(name, command = nil, aliases: [], hidden: false, &block)
322
322
  command_name = "#{prefix} #{name}"
323
- registry.set(command_name, command, aliases)
323
+ registry.set(command_name, command, aliases, hidden)
324
+
325
+ if block_given?
326
+ prefix = self.class.new(registry, command_name, aliases, hidden)
327
+ if block.arity.zero?
328
+ prefix.instance_eval(&block)
329
+ else
330
+ yield(prefix)
331
+ end
332
+ end
324
333
  end
325
334
 
326
335
  private
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/cli/program_name"
4
+ require "did_you_mean"
5
+
6
+ module Dry
7
+ class CLI
8
+ # Command(s) usage
9
+ #
10
+ # @since 1.1.1
11
+ # @api private
12
+ module SpellChecker
13
+ # @since 1.1.1
14
+ # @api private
15
+ def self.call(result, arguments)
16
+ commands = result.children.keys
17
+ cmd = cmd_to_spell(arguments, result.names)
18
+
19
+ suggestions = DidYouMean::SpellChecker.new(dictionary: commands).correct(cmd.first)
20
+ if suggestions.any?
21
+ "I don't know how to '#{cmd.join(" ")}'. Did you mean: '#{suggestions.first}' ?"
22
+ end
23
+ end
24
+
25
+ # @since 1.1.1
26
+ # @api private
27
+ def self.cmd_to_spell(arguments, result_names)
28
+ arguments - result_names
29
+ end
30
+
31
+ # @since 1.1.1
32
+ # @api private
33
+ def self.ignore?(cmd)
34
+ cmd.empty? || cmd.first.start_with?("-")
35
+ end
36
+ end
37
+ end
38
+ end
data/lib/dry/cli/usage.rb CHANGED
@@ -21,9 +21,11 @@ module Dry
21
21
  max_length, commands = commands_and_arguments(result)
22
22
 
23
23
  commands.map do |banner, node|
24
+ next if node.hidden
25
+
24
26
  usage = description(node.command) if node.leaf?
25
27
  "#{justify(banner, max_length, usage)}#{usage}"
26
- end.unshift(header).join("\n")
28
+ end.compact.unshift(header).join("\n")
27
29
  end
28
30
 
29
31
  # @since 0.1.0
@@ -3,6 +3,6 @@
3
3
  module Dry
4
4
  class CLI
5
5
  # @since 0.1.0
6
- VERSION = "1.1.0"
6
+ VERSION = "1.3.0"
7
7
  end
8
8
  end
data/lib/dry/cli.rb CHANGED
@@ -14,6 +14,7 @@ module Dry
14
14
  require "dry/cli/registry"
15
15
  require "dry/cli/parser"
16
16
  require "dry/cli/usage"
17
+ require "dry/cli/spell_checker"
17
18
  require "dry/cli/banner"
18
19
  require "dry/cli/inflector"
19
20
 
@@ -108,7 +109,7 @@ module Dry
108
109
  # @api private
109
110
  def perform_registry(arguments)
110
111
  result = registry.get(arguments)
111
- return usage(result) unless result.found?
112
+ return spell_checker(result, arguments) unless result.found?
112
113
 
113
114
  command, args = parse(result.command, result.arguments, result.names)
114
115
 
@@ -161,9 +162,11 @@ module Dry
161
162
  exit(1)
162
163
  end
163
164
 
164
- # @since 0.1.0
165
- # @api private
166
- def usage(result)
165
+ # @since 1.1.1
166
+ def spell_checker(result, arguments)
167
+ spell_checker = SpellChecker.call(result, arguments)
168
+ err.puts spell_checker if spell_checker
169
+ puts
167
170
  err.puts Usage.call(result)
168
171
  exit(1)
169
172
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-14 00:00:00.000000000 Z
11
+ date: 2025-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,20 +58,6 @@ dependencies:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
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
61
  - !ruby/object:Gem::Dependency
76
62
  name: simplecov
77
63
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +94,7 @@ files:
108
94
  - lib/dry/cli/parser.rb
109
95
  - lib/dry/cli/program_name.rb
110
96
  - lib/dry/cli/registry.rb
97
+ - lib/dry/cli/spell_checker.rb
111
98
  - lib/dry/cli/usage.rb
112
99
  - lib/dry/cli/version.rb
113
100
  homepage: https://dry-rb.org/gems/dry-cli
@@ -118,7 +105,7 @@ metadata:
118
105
  changelog_uri: https://github.com/dry-rb/dry-cli/blob/main/CHANGELOG.md
119
106
  source_code_uri: https://github.com/dry-rb/dry-cli
120
107
  bug_tracker_uri: https://github.com/dry-rb/dry-cli/issues
121
- post_install_message:
108
+ post_install_message:
122
109
  rdoc_options: []
123
110
  require_paths:
124
111
  - lib
@@ -126,7 +113,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
113
  requirements:
127
114
  - - ">="
128
115
  - !ruby/object:Gem::Version
129
- version: 2.4.0
116
+ version: '3.1'
130
117
  required_rubygems_version: !ruby/object:Gem::Requirement
131
118
  requirements:
132
119
  - - ">="
@@ -134,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
121
  version: '0'
135
122
  requirements: []
136
123
  rubygems_version: 3.3.27
137
- signing_key:
124
+ signing_key:
138
125
  specification_version: 4
139
126
  summary: Common framework to build command line interfaces with Ruby
140
127
  test_files: []