Support plain boolean without option annotations

- Fix so that we can have `boolean arg` without using
  `@Option` or `@ShellOption` defaulting to false.
- Fixes #744
This commit is contained in:
Janne Valkealahti
2023-05-20 14:49:21 +01:00
parent 96402a79b6
commit 8bed75ad77
5 changed files with 43 additions and 27 deletions

View File

@@ -331,6 +331,8 @@ class CommandRegistrationFactoryBean implements FactoryBean<CommandRegistration>
optionSpec.position(mp.getParameterIndex());
if (ClassUtils.isAssignable(boolean.class, parameterType)) {
optionSpec.arity(OptionArity.ZERO_OR_ONE);
optionSpec.required(false);
optionSpec.defaultValue("false");
}
else if (ClassUtils.isAssignable(Boolean.class, parameterType)) {
optionSpec.arity(OptionArity.ZERO_OR_ONE);

View File

@@ -23,6 +23,7 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.shell.Availability;
import org.springframework.shell.AvailabilityProvider;
import org.springframework.shell.command.CommandOption;
import org.springframework.shell.command.CommandRegistration;
import org.springframework.shell.command.CommandRegistration.OptionArity;
import org.springframework.shell.command.annotation.Command;
@@ -192,6 +193,18 @@ class CommandRegistrationFactoryBeanTests {
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
});
configCommon(OptionValuesWithBoolean.class, new OptionValuesWithBoolean(), "command5", new Class[] { boolean.class })
.run((context) -> {
CommandRegistrationFactoryBean fb = context.getBean(FACTORYBEANREF,
CommandRegistrationFactoryBean.class);
assertThat(fb).isNotNull();
CommandRegistration registration = fb.getObject();
assertThat(registration).isNotNull();
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
assertThat(registration.getOptions().get(0).isRequired()).isFalse();
assertThat(registration.getOptions().get(0).getDefaultValue()).isEqualTo("false");
});
}
@Command
@@ -212,6 +225,10 @@ class CommandRegistrationFactoryBeanTests {
@Command
void command4(Boolean arg) {
}
@Command
void command5(boolean arg) {
}
}
@Test