Add extra attributes to the init command

Update the CLI init command to expose additional attributes supported
by Spring Initializr. These are: groupId, artifactId, version, name,
description and language.

Closes gh-2793 and gh-2907
pull/2796/merge
Eddú Meléndez 10 years ago committed by Stephane Nicoll
parent d4dfa8d979
commit 0b8fd67507

@ -37,6 +37,7 @@ import org.springframework.util.Assert;
* {@link Command} that initializes a project using Spring initializr.
*
* @author Stephane Nicoll
* @author Eddú Meléndez
* @since 1.2.0
*/
public class InitCommand extends OptionParsingCommand {
@ -96,6 +97,18 @@ public class InitCommand extends OptionParsingCommand {
private OptionSpec<Void> force;
private OptionSpec<String> language;
private OptionSpec<String> groupId;
private OptionSpec<String> artifactId;
private OptionSpec<String> name;
private OptionSpec<String> version;
private OptionSpec<String> description;
InitOptionHandler(InitializrService initializrService) {
this.serviceCapabilitiesReport = new ServiceCapabilitiesReportGenerator(
initializrService);
@ -140,6 +153,24 @@ public class InitCommand extends OptionParsingCommand {
"The project type to use. Not normally needed if you use --build "
+ "and/or --format. Check the capabilities of the service "
+ "(--list) for more details").withRequiredArg();
this.language = option(Arrays.asList("language", "lang"),
"Programming Language to use (for example 'java')")
.withRequiredArg();
this.groupId = option(Arrays.asList("groupId", "g"),
"The project group that produced the dependency (for example 'org.test')")
.withRequiredArg();
this.artifactId = option(Arrays.asList("artifactId", "a"),
"The unique id for an artifact produced by the project group (for example 'test')")
.withRequiredArg();
this.name = option(Arrays.asList("name", "n"),
"The full name of the project.")
.withRequiredArg();
this.version = option(Arrays.asList("version", "v"),
"The version of the dependency (for example '0.0.1-SNAPSHOT')")
.withRequiredArg();
this.description = option(Arrays.asList("description", "des"),
"A detailed description of the project")
.withRequiredArg();
}
private void otherOptions() {
@ -209,6 +240,24 @@ public class InitCommand extends OptionParsingCommand {
if (options.has(this.type)) {
request.setType(options.valueOf(this.type));
}
if(options.has(this.language)) {
request.setLanguage(options.valueOf(this.language));
}
if(options.has(this.groupId)) {
request.setGroupId(options.valueOf(this.groupId));
}
if (options.has(this.artifactId)) {
request.setArtifactId(options.valueOf(this.artifactId));
}
if(options.has(this.name)) {
request.setName(options.valueOf(this.name));
}
if(options.has(this.version)) {
request.setVersion(options.valueOf(this.version));
}
if(options.has(this.description)) {
request.setDescription(options.valueOf(this.description));
}
request.setExtract(options.has(this.extract));
if (nonOptionArguments.size() == 1) {
String output = (String) nonOptionArguments.get(0);

@ -59,6 +59,18 @@ class ProjectGenerationRequest {
private String type;
private String language;
private String groupId;
private String artifactId;
private String name;
private String version;
private String description;
/**
* The URL of the service to use.
* @see #DEFAULT_SERVICE_URL
@ -199,6 +211,72 @@ class ProjectGenerationRequest {
this.type = type;
}
/**
* The programming language to use or {@code null} if it should not be customized.
*/
public String getLanguage() {
return this.language;
}
public void setLanguage(String language) {
this.language = language;
}
/**
* The groupId to use or {@code null} if it should not be customized.
*/
public String getGroupId() {
return this.groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
/**
* The artifactId to use or {@code null} if it should not be customized.
*/
public String getArtifactId() {
return this.artifactId;
}
public void setArtifactId(String artifactId) {
this.artifactId = artifactId;
}
/**
* The name to use or {@code null} if it should not be customized.
*/
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
/**
* The artifact version to use or {@code null} if it should not be customized.
*/
public String getVersion() {
return this.version;
}
public void setVersion(String version) {
this.version = version;
}
/**
*
*/
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
/**
* Generates the URI to use to generate a project represented by this request
* @param metadata the metadata that describes the service
@ -217,6 +295,9 @@ class ProjectGenerationRequest {
sb.append(projectType.getAction());
builder.setPath(sb.toString());
if (this.artifactId != null) {
builder.setParameter("artifactId", this.artifactId);
}
if (this.bootVersion != null) {
builder.setParameter("bootVersion", this.bootVersion);
}
@ -225,15 +306,30 @@ class ProjectGenerationRequest {
builder.setParameter("dependencies",
StringUtils.collectionToCommaDelimitedString(this.dependencies));
}
if (this.description != null) {
builder.setParameter("description", this.description);
}
if (this.groupId != null) {
builder.setParameter("groupId", this.groupId);
}
if (this.javaVersion != null) {
builder.setParameter("javaVersion", this.javaVersion);
}
if (this.language != null) {
builder.setParameter("language", this.language);
}
if (this.name != null) {
builder.setParameter("name", this.name);
}
if (this.packaging != null) {
builder.setParameter("packaging", this.packaging);
}
if (this.type != null) {
builder.setParameter("type", projectType.getId());
}
if (this.version != null) {
builder.setParameter("version", this.version);
}
return builder.build();
}

@ -49,6 +49,7 @@ import static org.mockito.Mockito.verify;
* Tests for {@link InitCommand}
*
* @author Stephane Nicoll
* @author Eddú Meléndez
*/
public class InitCommandTests extends AbstractHttpClientMockTests {
@ -280,8 +281,9 @@ public class InitCommandTests extends AbstractHttpClientMockTests {
@Test
public void parseProjectOptions() throws Exception {
this.handler.disableProjectGeneration();
this.command.run("-b=1.2.0.RELEASE", "-d=web,data-jpa", "-j=1.9", "-p=war",
"--build=grunt", "--format=web", "-t=ant-project");
this.command.run("-b=1.2.0.RELEASE", "-d=web,data-jpa", "-j=1.9", "-p=war", "--build=grunt",
"--format=web", "-t=ant-project", "-lang=groovy", "-g=org.test", "-a=demo", "-n=demo",
"-v=0.0.1-SNAPSHOT", "-des=Demo project for Spring Boot");
assertEquals("1.2.0.RELEASE", this.handler.lastRequest.getBootVersion());
List<String> dependencies = this.handler.lastRequest.getDependencies();
assertEquals(2, dependencies.size());
@ -292,6 +294,12 @@ public class InitCommandTests extends AbstractHttpClientMockTests {
assertEquals("grunt", this.handler.lastRequest.getBuild());
assertEquals("web", this.handler.lastRequest.getFormat());
assertEquals("ant-project", this.handler.lastRequest.getType());
assertEquals("groovy", this.handler.lastRequest.getLanguage());
assertEquals("org.test", this.handler.lastRequest.getGroupId());
assertEquals("demo", this.handler.lastRequest.getArtifactId());
assertEquals("demo", this.handler.lastRequest.getName());
assertEquals("0.0.1-SNAPSHOT", this.handler.lastRequest.getVersion());
assertEquals("Demo project for Spring Boot", this.handler.lastRequest.getDescription());
}
@Test

@ -37,6 +37,7 @@ import static org.junit.Assert.assertEquals;
* Tests for {@link ProjectGenerationRequest}
*
* @author Stephane Nicoll
* @author Eddú Meléndez
*/
public class ProjectGenerationRequestTests {
@ -112,6 +113,24 @@ public class ProjectGenerationRequestTests {
this.request.generateUrl(metadata));
}
@Test
public void customLanguage() {
this.request.setLanguage("java");
assertEquals(createDefaultUrl("?language=java&type=test-type"),
this.request.generateUrl(createDefaultMetadata()));
}
@Test
public void customProjectInfo() {
this.request.setGroupId("org.test");
this.request.setArtifactId("demo");
this.request.setVersion("0.0.1-SNAPSHOT");
this.request.setDescription("Spring Boot Demo");
assertEquals(createDefaultUrl("?artifactId=demo&description=Spring+Boot+Demo"
+ "&groupId=org.test&type=test-type&version=0.0.1-SNAPSHOT"),
this.request.generateUrl(createDefaultMetadata()));
}
@Test
public void buildNoMatch() {
InitializrServiceMetadata metadata = readMetadata();

Loading…
Cancel
Save