Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support both kebab-case and camelCase as Spring init CLI Options #28138

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -38,6 +38,7 @@
*
* @author Stephane Nicoll
* @author Eddú Meléndez
* @author Vignesh Thangavel Ilangovan
* @since 1.2.0
*/
public class InitCommand extends OptionParsingCommand {
Expand Down Expand Up @@ -128,16 +129,20 @@ protected void options() {
otherOptions();
}

/**
* Supports both kebab-case and camelCase as project CLI Options. camelCase to be
* deprecated as part of future releases
*/
private void projectGenerationOptions() {
this.groupId = option(Arrays.asList("groupId", "g"), "Project coordinates (for example 'org.test')")
.withRequiredArg();
this.artifactId = option(Arrays.asList("artifactId", "a"),
this.groupId = option(Arrays.asList("groupId", "group-id", "g"),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

groupId is not deprecated.

"Project coordinates (for example 'org.test')").withRequiredArg();
this.artifactId = option(Arrays.asList("artifactId", "artifact-id", "a"),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

artifactId is not deprecated.

"Project coordinates; infer archive name (for example 'test')").withRequiredArg();
this.version = option(Arrays.asList("version", "v"), "Project version (for example '0.0.1-SNAPSHOT')")
.withRequiredArg();
this.name = option(Arrays.asList("name", "n"), "Project name; infer application name").withRequiredArg();
this.description = option("description", "Project description").withRequiredArg();
this.packageName = option("package-name", "Package name").withRequiredArg();
this.packageName = option(Arrays.asList("packageName", "package-name"), "Package name").withRequiredArg();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The plan is to use kebab case consistently, not introducing a mixed case for new properties.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought we were going to support both camelCase and kebab-case until we've improved the output of spring init --list so that it converts the server's output from the camelCase that it expects to the kebab-case that the CLI prefers. That improvement to spring init --list was to be handled separately.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah ok, right. I understand now. Yes, so we should have to consistent indeed but we need to deprecate them.

this.type = option(Arrays.asList("type", "t"),
"Project type. Not normally needed if you use --build "
+ "and/or --format. Check the capabilities of the service (--list) for more details")
Expand All @@ -148,11 +153,11 @@ private void projectGenerationOptions() {
.defaultsTo("maven");
this.format = option("format", "Format of the generated content (for example 'build' for a build file, "
+ "'project' for a project archive)").withRequiredArg().defaultsTo("project");
this.javaVersion = option(Arrays.asList("java-version", "j"), "Language level (for example '1.8')")
.withRequiredArg();
this.javaVersion = option(Arrays.asList("javaVersion", "java-version", "j"),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The plan is to use kebab case consistently, not introducing a mixed case for new properties.

"Language level (for example '1.8')").withRequiredArg();
this.language = option(Arrays.asList("language", "l"), "Programming language (for example 'java')")
.withRequiredArg();
this.bootVersion = option(Arrays.asList("boot-version", "b"),
this.bootVersion = option(Arrays.asList("bootVersion", "boot-version", "b"),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The plan is to use kebab case consistently, not introducing a mixed case for new properties.

"Spring Boot version (for example '1.2.0.RELEASE')").withRequiredArg();
this.dependencies = option(Arrays.asList("dependencies", "d"),
"Comma-separated list of dependency identifiers to include in the generated project")
Expand Down
Expand Up @@ -44,6 +44,7 @@
*
* @author Stephane Nicoll
* @author Eddú Meléndez
* @author Vignesh Thangavel Ilangovan
*/
@ExtendWith(MockitoExtension.class)
class InitCommandTests extends AbstractHttpClientMockTests {
Expand Down Expand Up @@ -272,6 +273,32 @@ void parseProjectOptions() throws Exception {
assertThat(dependencies.contains("data-jpa")).isTrue();
}

@Test
void parseProjectWithKebabCaseCLIOptions() throws Exception {
this.handler.disableProjectGeneration();
this.command.run("--group-id=org.demo", "--artifact-id=acme", "--version=1.2.3-SNAPSHOT", "--name=acme-sample",
"--description=Acme sample project", "--package-name=demo.foo", "--type=ant-project", "--build=grunt",
"--format=web", "--packaging=war", "--java-version=1.9", "--language=groovy",
"--boot-version=1.2.0.RELEASE", "--dependencies=web,data-jpa");
assertThat(this.handler.lastRequest.getGroupId()).isEqualTo("org.demo");
assertThat(this.handler.lastRequest.getArtifactId()).isEqualTo("acme");
assertThat(this.handler.lastRequest.getVersion()).isEqualTo("1.2.3-SNAPSHOT");
assertThat(this.handler.lastRequest.getName()).isEqualTo("acme-sample");
assertThat(this.handler.lastRequest.getDescription()).isEqualTo("Acme sample project");
assertThat(this.handler.lastRequest.getPackageName()).isEqualTo("demo.foo");
assertThat(this.handler.lastRequest.getType()).isEqualTo("ant-project");
assertThat(this.handler.lastRequest.getBuild()).isEqualTo("grunt");
assertThat(this.handler.lastRequest.getFormat()).isEqualTo("web");
assertThat(this.handler.lastRequest.getPackaging()).isEqualTo("war");
assertThat(this.handler.lastRequest.getJavaVersion()).isEqualTo("1.9");
assertThat(this.handler.lastRequest.getLanguage()).isEqualTo("groovy");
assertThat(this.handler.lastRequest.getBootVersion()).isEqualTo("1.2.0.RELEASE");
List<String> dependencies = this.handler.lastRequest.getDependencies();
assertThat(dependencies).hasSize(2);
assertThat(dependencies.contains("web")).isTrue();
assertThat(dependencies.contains("data-jpa")).isTrue();
}

@Test
void overwriteFileInArchive(@TempDir File tempDir) throws Exception {
File conflict = new File(tempDir, "test.txt");
Expand Down