From e5366de6bab11c998c8c5223e09c957bbceb7304 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sun, 22 Oct 2017 22:06:46 +0200 Subject: [PATCH] Sagan's working --- pom.xml | 2 +- spring-cloud-release-tools-core/pom.xml | 1 - .../cloud/release/internal/sagan/Project.java | 19 +++ .../internal/sagan/ProjectMetadata.java | 17 --- .../cloud/release/internal/sagan/Release.java | 19 +++ .../internal/sagan/ReleaseMetadata.java | 14 -- .../release/internal/sagan/ReleaseUpdate.java | 13 ++ .../release/internal/sagan/Repository.java | 11 ++ .../internal/sagan/RepositoryMetadata.java | 54 -------- .../sagan/RestTemplateSaganClient.java | 40 ++++++ .../release/internal/sagan/SaganClient.java | 27 +--- .../sagan/RestTemplateSaganClientTests.java | 130 ++++++++++++++++++ .../internal/sagan/SaganClientTests.java | 20 --- spring-cloud-release-tools-spring/pom.xml | 6 +- 14 files changed, 242 insertions(+), 131 deletions(-) create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Project.java delete mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ProjectMetadata.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Release.java delete mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ReleaseMetadata.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ReleaseUpdate.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Repository.java delete mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/RepositoryMetadata.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/RestTemplateSaganClient.java create mode 100644 spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/RestTemplateSaganClientTests.java delete mode 100644 spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/SaganClientTests.java diff --git a/pom.xml b/pom.xml index fdec2ed7..44b0737d 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.springframework.cloud spring-cloud-build - 1.3.5.BUILD-SNAPSHOT + 1.3.5.RELEASE diff --git a/spring-cloud-release-tools-core/pom.xml b/spring-cloud-release-tools-core/pom.xml index e62d8cd6..1543863c 100644 --- a/spring-cloud-release-tools-core/pom.xml +++ b/spring-cloud-release-tools-core/pom.xml @@ -4,7 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.cloud.internal spring-cloud-release-tools-core jar diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Project.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Project.java new file mode 100644 index 00000000..86e7fd0b --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Project.java @@ -0,0 +1,19 @@ +package org.springframework.cloud.release.internal.sagan; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Marcin Grzejszczak + */ +public class Project { + public String id = ""; + public String name = ""; + public String repoUrl = ""; + public String siteUrl = ""; + public String category = ""; + public String stackOverflowTags; + public List projectReleases = new ArrayList<>(); + public List stackOverflowTagList = new ArrayList<>(); + public boolean aggregator; +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ProjectMetadata.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ProjectMetadata.java deleted file mode 100644 index 9fffa989..00000000 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ProjectMetadata.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.springframework.cloud.release.internal.sagan; - -import java.util.List; - -/** - * @author Marcin Grzejszczak - */ -class ProjectMetadata { - private String id = ""; - private String name = ""; - private String repoUrl = ""; - private String siteUrl = ""; - private String category = ""; - private String stackOverflowTags; - private boolean aggregator; - private List stackOverflowTagList; -} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Release.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Release.java new file mode 100644 index 00000000..01bc90e4 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Release.java @@ -0,0 +1,19 @@ +package org.springframework.cloud.release.internal.sagan; + +/** + * @author Marcin Grzejszczak + */ +public class Release { + public String releaseStatus = ""; + public String refDocUrl = ""; + public String apiDocUrl = ""; + public String groupId = ""; + public String artifactId = ""; + public Repository repository; + public String version = ""; + public boolean current; + public boolean generalAvailability; + public boolean preRelease; + public String versionDisplayName = ""; + public boolean snapshot; +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ReleaseMetadata.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ReleaseMetadata.java deleted file mode 100644 index df254b61..00000000 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ReleaseMetadata.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.springframework.cloud.release.internal.sagan; - -import java.util.List; - -/** - * @author Marcin Grzejszczak - */ -class ReleaseMetadata { - private String releaseStatus; - private String refDocUrl; - private String apiDocUrl; - private String groupId; - private String artifactId; -} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ReleaseUpdate.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ReleaseUpdate.java new file mode 100644 index 00000000..ac97b6d8 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/ReleaseUpdate.java @@ -0,0 +1,13 @@ +package org.springframework.cloud.release.internal.sagan; + +/** + * @author Marcin Grzejszczak + */ +public class ReleaseUpdate { + public String groupId = ""; + public String artifactId = ""; + public String version = ""; + public String releaseStatus = ""; + public String refDocUrl = ""; + public String apiDocUrl = ""; +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Repository.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Repository.java new file mode 100644 index 00000000..b2122d63 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/Repository.java @@ -0,0 +1,11 @@ +package org.springframework.cloud.release.internal.sagan; + +/** + * @author Marcin Grzejszczak + */ +public class Repository { + public String id; + public String name; + public String url; + public boolean snapshotsEnabled; +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/RepositoryMetadata.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/RepositoryMetadata.java deleted file mode 100644 index a2bd7457..00000000 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/RepositoryMetadata.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.springframework.cloud.release.internal.sagan; - -/** - * @author Marcin Grzejszczak - */ -class RepositoryMetadata { - private String id; - private String name; - private String url; - private boolean snapshotsEnabled; - - public RepositoryMetadata() { - } - - public RepositoryMetadata(String id, String name, String url, - boolean snapshotsEnabled) { - this.id = id; - this.name = name; - this.url = url; - this.snapshotsEnabled = snapshotsEnabled; - } - - public String getId() { - return this.id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public String getUrl() { - return this.url; - } - - public void setUrl(String url) { - this.url = url; - } - - public boolean isSnapshotsEnabled() { - return this.snapshotsEnabled; - } - - public void setSnapshotsEnabled(boolean snapshotsEnabled) { - this.snapshotsEnabled = snapshotsEnabled; - } -} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/RestTemplateSaganClient.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/RestTemplateSaganClient.java new file mode 100644 index 00000000..b7b3be85 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/RestTemplateSaganClient.java @@ -0,0 +1,40 @@ +package org.springframework.cloud.release.internal.sagan; + +import java.net.URI; + +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.RequestEntity; +import org.springframework.web.client.RestTemplate; + +/** + * @author Marcin Grzejszczak + */ +class RestTemplateSaganClient implements SaganClient { + + private final RestTemplate restTemplate; + private final String baseUrl; + + RestTemplateSaganClient(RestTemplate restTemplate, ReleaserProperties properties) { + this.restTemplate = restTemplate; + this.baseUrl = properties.getSagan().getBaseUrl(); + } + + @Override public Project getProject(String projectName) { + return this.restTemplate.getForObject(this.baseUrl + "/project_metadata/{projectName}", Project.class, projectName); + } + + @Override public Release getRelease(String projectName, String releaseVersion) { + return this.restTemplate.getForObject(this.baseUrl + "/project_metadata/{projectName}/releases/{releaseVersion}", Release.class, projectName, releaseVersion); + } + + @Override + public Release createOrUpdateRelease(String projectName, ReleaseUpdate releaseUpdate) { + RequestEntity request = RequestEntity + .post(URI.create(this.baseUrl +"/project_metadata/" + projectName + "/releases")) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE) + .body(releaseUpdate); + return this.restTemplate.exchange(request, Release.class).getBody(); + } +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/SaganClient.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/SaganClient.java index 9f0e3094..b174c47c 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/SaganClient.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/SaganClient.java @@ -1,31 +1,12 @@ package org.springframework.cloud.release.internal.sagan; -import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.web.client.RestTemplate; - /** * @author Marcin Grzejszczak */ -class SaganClient { +public interface SaganClient { + Project getProject(String projectName); - private final RestTemplate restTemplate; - private final String baseUrl; + Release getRelease(String projectName, String releaseVersion); - SaganClient(RestTemplate restTemplate, ReleaserProperties properties) { - this.restTemplate = restTemplate; - this.baseUrl = properties.getSagan().getBaseUrl(); - } - - void getProject(String projectName) { - this.restTemplate.getForObject(this.baseUrl + "/project_metadata/{projectName}", Object.class, projectName); - } - - void getRelease(String projectName, String releaseVersion) { - - } - - // POST - void createOrUpdateRelease(String projectName, Object release) { - - } + Release createOrUpdateRelease(String projectName, ReleaseUpdate releaseUpdate); } diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/RestTemplateSaganClientTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/RestTemplateSaganClientTests.java new file mode 100644 index 00000000..dad1ad6d --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/RestTemplateSaganClientTests.java @@ -0,0 +1,130 @@ +package org.springframework.cloud.release.internal.sagan; + +import static org.assertj.core.api.BDDAssertions.then; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; + +/** + * @author Marcin Grzejszczak + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = RestTemplateSaganClientTests.Config.class) +@AutoConfigureStubRunner(ids = "sagan:sagan-site") +public class RestTemplateSaganClientTests { + + @Value("${stubrunner.runningstubs.sagan-site.port}") Integer saganPort; + SaganClient client; + + @Before + public void setup() { + ReleaserProperties properties = new ReleaserProperties(); + properties.getGit().setOauthToken("foo"); + properties.getSagan().setBaseUrl("http://localhost:" + saganPort); + this.client = saganClient(properties); + } + + @Test + public void should_get_a_project() { + Project project = this.client.getProject("spring-framework"); + + then(project.id).isEqualTo("spring-framework"); + then(project.name).isEqualTo("Spring Framework"); + then(project.repoUrl).isEqualTo("http://github.com/spring-projects/spring-framework"); + then(project.siteUrl).isEqualTo("http://projects.spring.io/spring-framework"); + then(project.category).isEqualTo("active"); + then(project.stackOverflowTags).isNotBlank(); + then(project.stackOverflowTagList).isNotEmpty(); + then(project.aggregator).isFalse(); + then(project.projectReleases).isNotEmpty(); + Release release = project.projectReleases.get(0); + then(release.releaseStatus).isEqualTo("PRERELEASE"); + then(release.refDocUrl).isEqualTo("http://docs.spring.io/spring/docs/5.0.0.RC4/spring-framework-reference/"); + then(release.apiDocUrl).isEqualTo("http://docs.spring.io/spring/docs/5.0.0.RC4/javadoc-api/"); + then(release.groupId).isEqualTo("org.springframework"); + then(release.artifactId).isEqualTo("spring-context"); + then(release.repository.id).isEqualTo("spring-milestones"); + then(release.repository.name).isEqualTo("Spring Milestones"); + then(release.repository.url).isEqualTo("https://repo.spring.io/libs-milestone"); + then(release.repository.snapshotsEnabled).isFalse(); + then(release.version).isEqualTo("5.0.0.RC4"); + then(release.current).isFalse(); + then(release.generalAvailability).isFalse(); + then(release.preRelease).isTrue(); + then(release.versionDisplayName).isEqualTo("5.0.0 RC4"); + then(release.snapshot).isFalse(); + } + + @Test + public void should_get_a_release() { + Release release = this.client.getRelease("spring-framework", "5.0.0.RC4"); + + then(release.releaseStatus).isEqualTo("PRERELEASE"); + then(release.refDocUrl).isEqualTo("http://docs.spring.io/spring/docs/{version}/spring-framework-reference/"); + then(release.apiDocUrl).isEqualTo("http://docs.spring.io/spring/docs/{version}/javadoc-api/"); + then(release.groupId).isEqualTo("org.springframework"); + then(release.artifactId).isEqualTo("spring-context"); + then(release.repository.id).isEqualTo("spring-milestones"); + then(release.repository.name).isEqualTo("Spring Milestones"); + then(release.repository.url).isEqualTo("https://repo.spring.io/libs-milestone"); + then(release.repository.snapshotsEnabled).isFalse(); + then(release.version).isEqualTo("5.0.0.RC4"); + then(release.current).isFalse(); + then(release.generalAvailability).isFalse(); + then(release.preRelease).isTrue(); + then(release.versionDisplayName).isEqualTo("5.0.0 RC4"); + then(release.snapshot).isFalse(); + } + + @Test + public void should_update_a_release() { + ReleaseUpdate releaseUpdate = new ReleaseUpdate(); + releaseUpdate.groupId = "org.springframework"; + releaseUpdate.artifactId = "spring-context"; + releaseUpdate.version = "1.2.3.RELEASE"; + releaseUpdate.releaseStatus = "GENERAL_AVAILABILITY"; + releaseUpdate.refDocUrl = "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/"; + releaseUpdate.apiDocUrl = "http://docs.spring.io/spring/docs/{version}/javadoc-api/"; + + Release release = this.client.createOrUpdateRelease("spring-framework", releaseUpdate); + + then(release.releaseStatus).isEqualTo("GENERAL_AVAILABILITY"); + then(release.refDocUrl).isEqualTo("http://docs.spring.io/spring/docs/1.2.3.RELEASE/spring-framework-reference/"); + then(release.apiDocUrl).isEqualTo("http://docs.spring.io/spring/docs/1.2.3.RELEASE/javadoc-api/"); + then(release.groupId).isEqualTo("org.springframework"); + then(release.artifactId).isEqualTo("spring-context"); + then(release.version).isEqualTo("1.2.3.RELEASE"); + then(release.current).isFalse(); + then(release.generalAvailability).isTrue(); + then(release.preRelease).isFalse(); + then(release.versionDisplayName).isEqualTo("1.2.3"); + then(release.snapshot).isFalse(); + } + + private SaganClient saganClient(ReleaserProperties properties) { + RestTemplate restTemplate = restTemplate(properties); + return new RestTemplateSaganClient(restTemplate, properties); + } + + private RestTemplate restTemplate(ReleaserProperties properties) { + return new RestTemplateBuilder() + .basicAuthorization(properties.getGit().getOauthToken(), "") + .build(); + } + + @Configuration + @EnableAutoConfiguration + static class Config { + + } +} \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/SaganClientTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/SaganClientTests.java deleted file mode 100644 index c33e4591..00000000 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/SaganClientTests.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.springframework.cloud.release.internal.sagan; - -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.junit.Assert.*; - -/** - * @author Marcin Grzejszczak - */ -@RunWith(SpringRunner.class) -@AutoConfigureStubRunner(ids = "sagan:sagan-site") -public class SaganClientTests { - - @Value("${stubrunner.runningstubs.sagan-site.port}") Integer saganPort; - - -} \ No newline at end of file diff --git a/spring-cloud-release-tools-spring/pom.xml b/spring-cloud-release-tools-spring/pom.xml index e4da51f6..f81b4da9 100644 --- a/spring-cloud-release-tools-spring/pom.xml +++ b/spring-cloud-release-tools-spring/pom.xml @@ -4,7 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.cloud.internal spring-cloud-release-tools-spring jar @@ -26,6 +25,11 @@ spring-cloud-release-tools-core ${project.version} + + org.eclipse.jgit + org.eclipse.jgit + 4.6.0.201612231935-r + net.sf.jopt-simple jopt-simple