Skip to content

Commit

Permalink
#252 Ambiguity in OptionMetadataBuilder default value setter
Browse files Browse the repository at this point in the history
  • Loading branch information
stariy95 committed Nov 29, 2018
1 parent d7a4db6 commit 1b78f39
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 22 deletions.
1 change: 1 addition & 0 deletions RELEASE-NOTES.md
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
* #249 Replace confusing variants of addOption in BQCoreModuleExtender * #249 Replace confusing variants of addOption in BQCoreModuleExtender
* #250 Update modules parent to 0.14 * #250 Update modules parent to 0.14
* #251 Rename method addConfigOnOption in BQCoreModuleExtender * #251 Rename method addConfigOnOption in BQCoreModuleExtender
* #252 Ambiguity in OptionMetadataBuilder default value setter


## 0.25 ## 0.25


Expand Down
3 changes: 3 additions & 0 deletions UPGRADE.md
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@


## 1.0.RC1 ## 1.0.RC1


* [bootique #251](https://github.com/bootique/bootique/issues/249): Method `defaultValue()` in OptionMetadata builder
changed to `valueOptionalWithDefault()`

* [bootique #251](https://github.com/bootique/bootique/issues/249): Method `addConfigOnOption(String optionName, String configResourceId)` * [bootique #251](https://github.com/bootique/bootique/issues/249): Method `addConfigOnOption(String optionName, String configResourceId)`
in `BQCoreModuleExtender` renamed to `mapConfigResource` in `BQCoreModuleExtender` renamed to `mapConfigResource`


Expand Down
16 changes: 5 additions & 11 deletions bootique/src/main/java/io/bootique/jopt/JoptCliFactory.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -122,25 +122,19 @@ protected void addOption(OptionParser parser, OptionMetadata option) {
// TODO: how do we resolve short name conflicts? // TODO: how do we resolve short name conflicts?
List<String> longAndShort = asList(option.getShortName(), option.getName()); List<String> longAndShort = asList(option.getShortName(), option.getName());
OptionSpecBuilder optionBuilder = parser.acceptsAll(longAndShort, description); OptionSpecBuilder optionBuilder = parser.acceptsAll(longAndShort, description);
ArgumentAcceptingOptionSpec<String> optionSpec = null;
switch (option.getValueCardinality()) { switch (option.getValueCardinality()) {
case OPTIONAL: case OPTIONAL:
optionSpec = optionBuilder.withOptionalArg().describedAs(option.getValueName()); ArgumentAcceptingOptionSpec<String> optionSpec = optionBuilder.withOptionalArg().describedAs(option.getValueName());
if(option.getDefaultValue() != null) {
optionSpec.defaultsTo(option.getDefaultValue());
}
break; break;
case REQUIRED: case REQUIRED:
optionSpec = optionBuilder.withRequiredArg().describedAs(option.getValueName()); optionBuilder.withRequiredArg().describedAs(option.getValueName());
break; break;
default: default:
break; break;
} }

if(option.getDefaultValue() != null) {
if(optionSpec == null) {
// need optional arg to enable default value
optionSpec = optionBuilder.withOptionalArg();
}
optionSpec.defaultsTo(option.getDefaultValue());
}
} }


// using option-bound command strategy... // using option-bound command strategy...
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -130,16 +130,29 @@ public Builder valueOptional(String valueName) {
} }


/** /**
* Sets the default value for this option that will be used if the option is provided on * Marks value optional and sets the default value for this option that will be used if the option is provided on
* command line without an explicit value. * command line without an explicit value.
* *
* @param defaultValue a default value for the option. * @param defaultValue a default value for the option.
* @return this builder instance * @return this builder instance
* @since 0.24 * @since 1.0.RC1
*/ */
public Builder defaultValue(String defaultValue) { public Builder valueOptionalWithDefault(String defaultValue) {
return valueOptionalWithDefault("", defaultValue);
}

/**
* Marks value optional and sets the default value for this option that will be used if the option is provided on
* command line without an explicit value.
*
* @param valueName a description of value
* @param defaultValue a default value for the option.
* @return this builder instance
* @since 1.0.RC1
*/
public Builder valueOptionalWithDefault(String valueName, String defaultValue) {
this.option.defaultValue = defaultValue; this.option.defaultValue = defaultValue;
return this; return valueOptional(valueName);
} }


public OptionMetadata build() { public OptionMetadata build() {
Expand Down
14 changes: 7 additions & 7 deletions bootique/src/test/java/io/bootique/Bootique_CliOptionsIT.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ public void testOption_OverrideConfig() {
.module(binder -> BQCoreModule .module(binder -> BQCoreModule
.extend(binder) .extend(binder)
.addOptions(OptionMetadata.builder("opt-1").valueOptional().build(), .addOptions(OptionMetadata.builder("opt-1").valueOptional().build(),
OptionMetadata.builder("opt-2").valueOptional().defaultValue("2").build()) OptionMetadata.builder("opt-2").valueOptionalWithDefault("2").build())
.mapConfigPath("opt-1", "c.m.l") .mapConfigPath("opt-1", "c.m.l")
.mapConfigPath("opt-2", "c.m.k")) .mapConfigPath("opt-2", "c.m.k"))
.createRuntime(); .createRuntime();
Expand Down Expand Up @@ -208,7 +208,7 @@ public void testOptionPathAbsentInYAML() {
public void testOptionsCommandAndModuleOverlapping() { public void testOptionsCommandAndModuleOverlapping() {
BQRuntime runtime = runtimeFactory.app("--config=classpath:io/bootique/config/test4.yml", "--cmd-1", "--opt-1") BQRuntime runtime = runtimeFactory.app("--config=classpath:io/bootique/config/test4.yml", "--cmd-1", "--opt-1")
.module(binder -> BQCoreModule.extend(binder) .module(binder -> BQCoreModule.extend(binder)
.addOption(OptionMetadata.builder("opt-1").valueOptional().defaultValue("2").build()) .addOption(OptionMetadata.builder("opt-1").valueOptionalWithDefault("2").build())
.mapConfigPath("opt-1", "c.m.k") .mapConfigPath("opt-1", "c.m.k")
.addCommand(new TestOptionCommand1())) .addCommand(new TestOptionCommand1()))
.createRuntime(); .createRuntime();
Expand Down Expand Up @@ -248,8 +248,8 @@ public void testOptionsWithOverlappingPath_OverrideConfig() {
BQRuntime runtime = runtimeFactory.app("--config=classpath:io/bootique/config/test4.yml", "--opt-2", "--opt-3") BQRuntime runtime = runtimeFactory.app("--config=classpath:io/bootique/config/test4.yml", "--opt-2", "--opt-3")
.module(binder -> BQCoreModule.extend(binder) .module(binder -> BQCoreModule.extend(binder)
.addOptions(OptionMetadata.builder("opt-1").valueOptional().build(), .addOptions(OptionMetadata.builder("opt-1").valueOptional().build(),
OptionMetadata.builder("opt-2").valueOptional().defaultValue("2").build(), OptionMetadata.builder("opt-2").valueOptionalWithDefault("2").build(),
OptionMetadata.builder("opt-3").valueOptional().defaultValue("3").build()) OptionMetadata.builder("opt-3").valueOptionalWithDefault("3").build())
.mapConfigPath("opt-1", "c.m.k") .mapConfigPath("opt-1", "c.m.k")
.mapConfigPath("opt-2", "c.m.k") .mapConfigPath("opt-2", "c.m.k")
.mapConfigPath("opt-3", "c.m.k")) .mapConfigPath("opt-3", "c.m.k"))
Expand Down Expand Up @@ -301,7 +301,7 @@ public void testMultipleOptionsConfigFiles_OverrideInCLIOrder() {
public void testOptionDefaultValue() { public void testOptionDefaultValue() {
BQRuntime runtime = runtimeFactory.app("--option") BQRuntime runtime = runtimeFactory.app("--option")
.module(b -> BQCoreModule.extend(b).addOptions( .module(b -> BQCoreModule.extend(b).addOptions(
OptionMetadata.builder("option").defaultValue("val").build() OptionMetadata.builder("option").valueOptionalWithDefault("val").build()
)) ))
.createRuntime(); .createRuntime();
Cli cli = runtime.getInstance(Cli.class); Cli cli = runtime.getInstance(Cli.class);
Expand All @@ -313,7 +313,7 @@ public void testOptionDefaultValue() {
public void testMissingOptionDefaultValue() { public void testMissingOptionDefaultValue() {
BQRuntime runtime = runtimeFactory.app() BQRuntime runtime = runtimeFactory.app()
.module(b -> BQCoreModule.extend(b).addOptions( .module(b -> BQCoreModule.extend(b).addOptions(
OptionMetadata.builder("option").defaultValue("val").build() OptionMetadata.builder("option").valueOptionalWithDefault("val").build()
)) ))
.createRuntime(); .createRuntime();
Cli cli = runtime.getInstance(Cli.class); Cli cli = runtime.getInstance(Cli.class);
Expand Down Expand Up @@ -442,7 +442,7 @@ static final class CommandWithDefaultOptionValue extends CommandWithMetadata {


public CommandWithDefaultOptionValue() { public CommandWithDefaultOptionValue() {
super(CommandMetadata.builder("cmd") super(CommandMetadata.builder("cmd")
.addOption(OptionMetadata.builder("option").defaultValue("val").build())); .addOption(OptionMetadata.builder("option").valueOptionalWithDefault("val").build()));
} }


@Override @Override
Expand Down

0 comments on commit 1b78f39

Please sign in to comment.