From a950a3b73a4f7fbcc413f857ead4abf7c6bdaf30 Mon Sep 17 00:00:00 2001 From: Sven Schwyn Date: Tue, 27 Jan 2026 19:36:23 +0100 Subject: [PATCH] Fix missing optional arguments to win over values --- lib/dry/cli/option.rb | 2 ++ spec/support/fixtures/shared_commands.rb | 11 +++++++++++ spec/support/fixtures/with_block.rb | 15 ++++++++------- spec/support/fixtures/with_registry.rb | 15 ++++++++------- spec/support/fixtures/with_zero_arity_block.rb | 15 ++++++++------- spec/support/shared_examples/commands.rb | 18 ++++++++++++++++-- 6 files changed, 53 insertions(+), 23 deletions(-) diff --git a/lib/dry/cli/option.rb b/lib/dry/cli/option.rb index aa72dd4c..41c5a361 100644 --- a/lib/dry/cli/option.rb +++ b/lib/dry/cli/option.rb @@ -124,6 +124,8 @@ def alias_names # @api private def valid_value?(value) + return true if value.nil? && !required? + available_values = values return true if available_values.nil? diff --git a/spec/support/fixtures/shared_commands.rb b/spec/support/fixtures/shared_commands.rb index 772e484d..f10d3033 100644 --- a/spec/support/fixtures/shared_commands.rb +++ b/spec/support/fixtures/shared_commands.rb @@ -88,6 +88,17 @@ def call(steps:, **) puts steps end end + + class Vacuum < Dry::CLI::Command + desc "Vacuum the database" + + argument :mode, desc: "Optional mode of vacuum", required: true, values: [:full, :freeze, :verbose] + argument :parallel, desc: "Parallel workers", values: [1, 2, 3] + + def call(mode:, parallel: nil, **) + puts "mode: #{mode}, parallel: #{parallel}" + end + end end module Destroy diff --git a/spec/support/fixtures/with_block.rb b/spec/support/fixtures/with_block.rb index 04bae70a..81326423 100755 --- a/spec/support/fixtures/with_block.rb +++ b/spec/support/fixtures/with_block.rb @@ -34,14 +34,15 @@ cli.register "callbacks", Webpack::CLI::CallbacksCommand cli.register "db" do |prefix| - prefix.register "apply", Commands::DB::Apply - prefix.register "console", Commands::DB::Console - prefix.register "create", Commands::DB::Create - prefix.register "drop", Commands::DB::Drop - prefix.register "migrate", Commands::DB::Migrate - prefix.register "prepare", Commands::DB::Prepare - prefix.register "version", Commands::DB::Version + prefix.register "apply", Commands::DB::Apply + prefix.register "console", Commands::DB::Console + prefix.register "create", Commands::DB::Create + prefix.register "drop", Commands::DB::Drop + prefix.register "migrate", Commands::DB::Migrate + prefix.register "prepare", Commands::DB::Prepare + prefix.register "version", Commands::DB::Version prefix.register "rollback", Commands::DB::Rollback + prefix.register "vacuum", Commands::DB::Vacuum end cli.register "destroy", aliases: ["d"] do |prefix| diff --git a/spec/support/fixtures/with_registry.rb b/spec/support/fixtures/with_registry.rb index 9aac8053..45fba25d 100644 --- a/spec/support/fixtures/with_registry.rb +++ b/spec/support/fixtures/with_registry.rb @@ -12,14 +12,15 @@ module Commands register "assets precompile", ::Commands::Assets::Precompile register "console", ::Commands::Console register "db" do |prefix| - prefix.register "apply", ::Commands::DB::Apply - prefix.register "console", ::Commands::DB::Console - prefix.register "create", ::Commands::DB::Create - prefix.register "drop", ::Commands::DB::Drop - prefix.register "migrate", ::Commands::DB::Migrate - prefix.register "prepare", ::Commands::DB::Prepare - prefix.register "version", ::Commands::DB::Version + prefix.register "apply", ::Commands::DB::Apply + prefix.register "console", ::Commands::DB::Console + prefix.register "create", ::Commands::DB::Create + prefix.register "drop", ::Commands::DB::Drop + prefix.register "migrate", ::Commands::DB::Migrate + prefix.register "prepare", ::Commands::DB::Prepare + prefix.register "version", ::Commands::DB::Version prefix.register "rollback", ::Commands::DB::Rollback + prefix.register "vacuum", ::Commands::DB::Vacuum end register "destroy", aliases: ["d"] do |prefix| diff --git a/spec/support/fixtures/with_zero_arity_block.rb b/spec/support/fixtures/with_zero_arity_block.rb index 2b5bcdf8..31a8178b 100755 --- a/spec/support/fixtures/with_zero_arity_block.rb +++ b/spec/support/fixtures/with_zero_arity_block.rb @@ -35,14 +35,15 @@ register "callbacks", Webpack::CLI::CallbacksCommand register "db" do - register "apply", Commands::DB::Apply - register "console", Commands::DB::Console - register "create", Commands::DB::Create - register "drop", Commands::DB::Drop - register "migrate", Commands::DB::Migrate - register "prepare", Commands::DB::Prepare - register "version", Commands::DB::Version + register "apply", Commands::DB::Apply + register "console", Commands::DB::Console + register "create", Commands::DB::Create + register "drop", Commands::DB::Drop + register "migrate", Commands::DB::Migrate + register "prepare", Commands::DB::Prepare + register "version", Commands::DB::Version register "rollback", Commands::DB::Rollback + register "vacuum", Commands::DB::Vacuum end register "destroy", aliases: ["d"] do diff --git a/spec/support/shared_examples/commands.rb b/spec/support/shared_examples/commands.rb index c5339979..956e8a4d 100644 --- a/spec/support/shared_examples/commands.rb +++ b/spec/support/shared_examples/commands.rb @@ -156,7 +156,7 @@ expect(output).to eq("exec - Task: test - Directories: []\n") end - it "capture all the remaining arguments" do + it "captures all the remaining arguments" do output = capture_output { cli.call(arguments: %w[exec test api admin]) } expect(output).to eq("exec - Task: test - Directories: [\"api\", \"admin\"]\n") end @@ -164,7 +164,7 @@ context "with supported values" do context "and with supported value passed" do - it "call the command with the option" do + it "calls the command with the option" do output = capture_output { cli.call(arguments: %w[console --engine=pry]) } expect(output).to eq("console - engine: pry\n") end @@ -183,6 +183,20 @@ expect(error).to eq("ERROR: \"rspec db rollback\" was called with arguments \"4\"\n") end end + + context "without a required argument limited by values array" do + it "prints error" do + error = capture_error { cli.call(arguments: %w[db vacuum]) } + expect(error).to eq("ERROR: \"rspec db vacuum\" was called with arguments \"\"\n") + end + end + + context "without an optional argument limited by values array" do + it "can be used" do + output = capture_output { cli.call(arguments: %w[db vacuum full]) } + expect(output).to eq("mode: full, parallel: \n") + end + end end it "with help param" do