From f7992a682e917082ad84648b796df45c19be3996 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Thu, 2 Jun 2022 08:41:48 +0100 Subject: [PATCH] Fix ShellOption with required - Where applicable mark option required so that user is notified instead of blindly using null. - Fixes #436 --- .../StandardMethodTargetRegistrar.java | 3 +++ .../StandardMethodTargetRegistrarTests.java | 27 +++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardMethodTargetRegistrar.java b/spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardMethodTargetRegistrar.java index b92fd3d3..0e9c3d81 100644 --- a/spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardMethodTargetRegistrar.java +++ b/spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardMethodTargetRegistrar.java @@ -140,6 +140,9 @@ public class StandardMethodTargetRegistrar implements MethodTargetRegistrar, App && !ObjectUtils.nullSafeEquals(so.defaultValue(), ShellOption.NULL)) { optionSpec.defaultValue(so.defaultValue()); } + else { + optionSpec.required(); + } } } else { diff --git a/spring-shell-standard/src/test/java/org/springframework/shell/standard/StandardMethodTargetRegistrarTests.java b/spring-shell-standard/src/test/java/org/springframework/shell/standard/StandardMethodTargetRegistrarTests.java index 36d028d7..df118d4d 100644 --- a/spring-shell-standard/src/test/java/org/springframework/shell/standard/StandardMethodTargetRegistrarTests.java +++ b/spring-shell-standard/src/test/java/org/springframework/shell/standard/StandardMethodTargetRegistrarTests.java @@ -64,7 +64,7 @@ public class StandardMethodTargetRegistrarTests { @Test public void testRegistrations() { - applicationContext = new AnnotationConfigApplicationContext(Sample.class); + applicationContext = new AnnotationConfigApplicationContext(Sample1.class); registrar.setApplicationContext(applicationContext); registrar.register(catalog); Map registrations = catalog.getRegistrations(); @@ -74,6 +74,7 @@ public class StandardMethodTargetRegistrarTests { assertThat(registrations.get("say-hello").getAvailability()).isNotNull(); assertThat(registrations.get("say-hello").getOptions()).hasSize(1); assertThat(registrations.get("say-hello").getOptions().get(0).getLongNames()).containsExactly("what"); + assertThat(registrations.get("say-hello").getOptions().get(0).isRequired()).isTrue(); assertThat(registrations.get("hi")).isNotNull(); assertThat(registrations.get("hi").getAvailability()).isNotNull(); @@ -83,7 +84,7 @@ public class StandardMethodTargetRegistrarTests { } @ShellComponent - public static class Sample { + public static class Sample1 { @ShellMethod("some command") public String sayHello(String what) { @@ -96,6 +97,28 @@ public class StandardMethodTargetRegistrarTests { } } + @Test + public void testOptionRequiredWithAnnotation() { + applicationContext = new AnnotationConfigApplicationContext(Sample2.class); + registrar.setApplicationContext(applicationContext); + registrar.register(catalog); + Map registrations = catalog.getRegistrations(); + assertThat(registrations).hasSize(1); + + assertThat(registrations.get("say-hello")).isNotNull(); + assertThat(registrations.get("say-hello").getOptions()).hasSize(1); + assertThat(registrations.get("say-hello").getOptions().get(0).isRequired()).isTrue(); + } + + @ShellComponent + public static class Sample2 { + + @ShellMethod("some command") + public String sayHello(@ShellOption String what) { + return "hello " + what; + } + } + @Test public void testAvailabilityIndicators() { applicationContext = new AnnotationConfigApplicationContext(SampleWithAvailability.class);