diff --git a/src/main/java/com/spotify/github/v3/checks/CheckRunResponse.java b/src/main/java/com/spotify/github/v3/checks/CheckRunResponse.java index 7b672a2a..9c50f3e0 100644 --- a/src/main/java/com/spotify/github/v3/checks/CheckRunResponse.java +++ b/src/main/java/com/spotify/github/v3/checks/CheckRunResponse.java @@ -22,7 +22,11 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.spotify.github.GithubStyle; + +import java.util.List; import java.util.Optional; + +import com.spotify.github.v3.prs.PartialPullRequestItem; import org.immutables.value.Value; /** The CheckRun response resource. */ @@ -73,4 +77,10 @@ public interface CheckRunResponse extends CheckRunBase { * @return the optional */ Optional app(); + + /** + * Pull Requests where this check is applied. + * @return the list of pull requests + */ + List pullRequests(); } diff --git a/src/main/java/com/spotify/github/v3/checks/CheckSuite.java b/src/main/java/com/spotify/github/v3/checks/CheckSuite.java index 380b8aee..ea13d811 100644 --- a/src/main/java/com/spotify/github/v3/checks/CheckSuite.java +++ b/src/main/java/com/spotify/github/v3/checks/CheckSuite.java @@ -7,9 +7,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -22,23 +22,34 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.spotify.github.GithubStyle; + +import java.util.List; import java.util.Optional; + +import com.spotify.github.v3.prs.PartialPullRequestItem; import org.immutables.value.Value; -/** Github CheckSuite */ +/** GitHub CheckSuite */ @Value.Immutable @GithubStyle @JsonDeserialize(as = ImmutableCheckSuite.class) public interface CheckSuite { /** - * The Check Suite Id. + * The Check Suite id. * - * @return the integer + * @return the long id */ Long id(); Optional app(); Optional headBranch(); + + /** + * Pull Requests where this check suite is applied. + * + * @return the list of pull requests + */ + List pullRequests(); } diff --git a/src/main/java/com/spotify/github/v3/clients/PullRequestClient.java b/src/main/java/com/spotify/github/v3/clients/PullRequestClient.java index 9cb703cc..538b7255 100644 --- a/src/main/java/com/spotify/github/v3/clients/PullRequestClient.java +++ b/src/main/java/com/spotify/github/v3/clients/PullRequestClient.java @@ -97,11 +97,23 @@ public CompletableFuture> list(final PullRequestParameters /** * Get a specific pull request. * - * @param number pull request number + * @deprecated Use {@link #get(long)} instead + * @param prNumber pull request number * @return pull request */ - public CompletableFuture get(final int number) { - final String path = String.format(PR_NUMBER_TEMPLATE, owner, repo, number); + @Deprecated + public CompletableFuture get(final int prNumber) { + return get((long) prNumber); + } + + /** + * Get a specific pull request. + * + * @param prNumber pull request number + * @return pull request + */ + public CompletableFuture get(final long prNumber) { + final String path = String.format(PR_NUMBER_TEMPLATE, owner, repo, prNumber); log.debug("Fetching pull request from " + path); return github.request(path, PullRequest.class); } @@ -120,23 +132,50 @@ public CompletableFuture create(final PullRequestCreate request) { /** * Update given pull request. * - * @param number pull request number + * @deprecated Use {@link #update(long, PullRequestUpdate)} instead + * @param prNumber pull request number * @param request update request * @return pull request */ - public CompletableFuture update(final int number, final PullRequestUpdate request) { - final String path = String.format(PR_NUMBER_TEMPLATE, owner, repo, number); + @Deprecated + public CompletableFuture update( + final int prNumber, final PullRequestUpdate request) { + return update((long) prNumber, request); + } + + /** + * Update given pull request. + * + * @param prNumber pull request number + * @param request update request + * @return pull request + */ + public CompletableFuture update( + final long prNumber, final PullRequestUpdate request) { + final String path = String.format(PR_NUMBER_TEMPLATE, owner, repo, prNumber); return github.patch(path, github.json().toJsonUnchecked(request), PullRequest.class); } /** * List pull request commits. * - * @param number pull request number + * @deprecated Use {@link #listCommits(long)} instead + * @param prNumber pull request number + * @return commits + */ + @Deprecated + public CompletableFuture> listCommits(final int prNumber) { + return listCommits((long) prNumber); + } + + /** + * List pull request commits. + * + * @param prNumber pull request number * @return commits */ - public CompletableFuture> listCommits(final int number) { - final String path = String.format(PR_COMMITS_TEMPLATE, owner, repo, number); + public CompletableFuture> listCommits(final long prNumber) { + final String path = String.format(PR_COMMITS_TEMPLATE, owner, repo, prNumber); log.debug("Fetching pull request commits from " + path); return github.request(path, LIST_COMMIT_TYPE_REFERENCE); } @@ -144,11 +183,23 @@ public CompletableFuture> listCommits(final int number) { /** * List pull request reviews. Reviews are returned in chronological order. * - * @param number pull request number + * @deprecated Use {@link #listReviews(long)} instead + * @param prNumber pull request number * @return list of reviews */ - public CompletableFuture> listReviews(final int number) { - final String path = String.format(PR_REVIEWS_TEMPLATE, owner, repo, number); + @Deprecated + public CompletableFuture> listReviews(final int prNumber) { + return listReviews((long) prNumber); + } + + /** + * List pull request reviews. Reviews are returned in chronological order. + * + * @param prNumber pull request number + * @return list of reviews + */ + public CompletableFuture> listReviews(final long prNumber) { + final String path = String.format(PR_REVIEWS_TEMPLATE, owner, repo, prNumber); log.debug("Fetching pull request reviews from " + path); return github.request(path, LIST_REVIEW_TYPE_REFERENCE); } @@ -156,13 +207,26 @@ public CompletableFuture> listReviews(final int number) { /** * List pull request reviews paginated. Reviews are returned in chronological order. * - * @param number pull request number - * @param itemsPerPage number of items per page + * @deprecated Use {@link #listReviews(long,long)} instead + * @param prNumber pull request number + * @param itemsPerPage prNumber of items per page + * @return iterator of reviews + */ + @Deprecated + public Iterator> listReviews(final int prNumber, final int itemsPerPage) { + return listReviews((long) prNumber, itemsPerPage); + } + + /** + * List pull request reviews paginated. Reviews are returned in chronological order. + * + * @param prNumber pull request number + * @param itemsPerPage prNumber of items per page * @return iterator of reviews */ - public Iterator> listReviews(final int number, final int itemsPerPage) { + public Iterator> listReviews(final long prNumber, final long itemsPerPage) { // FIXME Use itemsPerPage property - final String path = String.format(PR_REVIEWS_TEMPLATE, owner, repo, number); + final String path = String.format(PR_REVIEWS_TEMPLATE, owner, repo, prNumber); log.debug("Fetching pull request reviews from " + path); return new GithubPageIterator<>(new GithubPage<>(github, path, LIST_REVIEW_TYPE_REFERENCE)); } @@ -170,13 +234,27 @@ public Iterator> listReviews(final int number, final int items /** * Creates a review for a pull request. * - * @param number pull request number + * @deprecated Use {@link #createReview(long,ReviewParameters)} instead + * @param prNumber pull request number + * @param properties properties for reviewing the PR, such as sha, body and event + * @see "https://developer.github.com/v3/pulls/reviews/#create-a-review-for-a-pull-request" + */ + @Deprecated + public CompletableFuture createReview( + final int prNumber, final ReviewParameters properties) { + return createReview((long) prNumber, properties); + } + + /** + * Creates a review for a pull request. + * + * @param prNumber pull request number * @param properties properties for reviewing the PR, such as sha, body and event * @see "https://developer.github.com/v3/pulls/reviews/#create-a-review-for-a-pull-request" */ public CompletableFuture createReview( - final int number, final ReviewParameters properties) { - final String path = String.format(PR_REVIEWS_TEMPLATE, owner, repo, number); + final long prNumber, final ReviewParameters properties) { + final String path = String.format(PR_REVIEWS_TEMPLATE, owner, repo, prNumber); final String jsonPayload = github.json().toJsonUnchecked(properties); log.debug("Creating review for PR: " + path); return github.post(path, jsonPayload, Review.class); @@ -185,11 +263,23 @@ public CompletableFuture createReview( /** * List pull request requested reviews. * - * @param number pull request number + * @deprecated Use {@link #listReviewRequests(long)} instead + * @param prNumber pull request number + * @return list of reviews + */ + @Deprecated + public CompletableFuture listReviewRequests(final int prNumber) { + return listReviewRequests((long) prNumber); + } + + /** + * List pull request requested reviews. + * + * @param prNumber pull request number * @return list of reviews */ - public CompletableFuture listReviewRequests(final int number) { - final String path = String.format(PR_REVIEW_REQUESTS_TEMPLATE, owner, repo, number); + public CompletableFuture listReviewRequests(final long prNumber) { + final String path = String.format(PR_REVIEW_REQUESTS_TEMPLATE, owner, repo, prNumber); log.debug("Fetching pull request requested reviews from " + path); return github.request(path, LIST_REVIEW_REQUEST_TYPE_REFERENCE); } @@ -197,13 +287,27 @@ public CompletableFuture listReviewRequests(final int number) { /** * Requests a review for a pull request. * - * @param number pull request number + * @deprecated Use {@link #requestReview(long,RequestReviewParameters)} instead + * @param prNumber pull request number * @param properties properties for reviewing the PR, such as reviewers and team_reviewers. * @see "https://docs.github.com/en/rest/reference/pulls#request-reviewers-for-a-pull-request" */ + @Deprecated public CompletableFuture requestReview( - final int number, final RequestReviewParameters properties) { - final String path = String.format(PR_REVIEW_REQUESTS_TEMPLATE, owner, repo, number); + final int prNumber, final RequestReviewParameters properties) { + return requestReview((long) prNumber, properties); + } + + /** + * Requests a review for a pull request. + * + * @param prNumber pull request number + * @param properties properties for reviewing the PR, such as reviewers and team_reviewers. + * @see "https://docs.github.com/en/rest/reference/pulls#request-reviewers-for-a-pull-request" + */ + public CompletableFuture requestReview( + final long prNumber, final RequestReviewParameters properties) { + final String path = String.format(PR_REVIEW_REQUESTS_TEMPLATE, owner, repo, prNumber); final String jsonPayload = github.json().toJsonUnchecked(properties); log.debug("Requesting reviews for PR: " + path); return github.post(path, jsonPayload, PullRequest.class); @@ -212,13 +316,27 @@ public CompletableFuture requestReview( /** * Remove a request for review for a pull request. * - * @param number pull request number + * @deprecated Use {@link #removeRequestedReview(long,RequestReviewParameters)} instead + * @param prNumber pull request number * @param properties properties for reviewing the PR, such as reviewers and team_reviewers. * @see "https://docs.github.com/en/rest/reference/pulls#request-reviewers-for-a-pull-request" */ + @Deprecated public CompletableFuture removeRequestedReview( - final int number, final RequestReviewParameters properties) { - final String path = String.format(PR_REVIEW_REQUESTS_TEMPLATE, owner, repo, number); + final int prNumber, final RequestReviewParameters properties) { + return removeRequestedReview((long) prNumber, properties); + } + + /** + * Remove a request for review for a pull request. + * + * @param prNumber pull request number + * @param properties properties for reviewing the PR, such as reviewers and team_reviewers. + * @see "https://docs.github.com/en/rest/reference/pulls#request-reviewers-for-a-pull-request" + */ + public CompletableFuture removeRequestedReview( + final long prNumber, final RequestReviewParameters properties) { + final String path = String.format(PR_REVIEW_REQUESTS_TEMPLATE, owner, repo, prNumber); final String jsonPayload = github.json().toJsonUnchecked(properties); log.debug("Removing requested reviews for PR: " + path); return github.delete(path, jsonPayload).thenAccept(IGNORE_RESPONSE_CONSUMER); @@ -227,19 +345,50 @@ public CompletableFuture removeRequestedReview( /** * Merges a pull request. * - * @param number pull request number + * @deprecated Use {@link #merge(long,MergeParameters)} instead + * @param prNumber pull request number * @param properties the properties on merging the PR, such as title, message and sha * @see "https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button" */ - public CompletableFuture merge(final int number, final MergeParameters properties) { - final String path = String.format(PR_NUMBER_TEMPLATE + "/merge", owner, repo, number); + @Deprecated + public CompletableFuture merge(final int prNumber, final MergeParameters properties) { + return merge((long) prNumber, properties); + } + + /** + * Merges a pull request. + * + * @param prNumber pull request number + * @param properties the properties on merging the PR, such as title, message and sha + * @see "https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button" + */ + public CompletableFuture merge(final long prNumber, final MergeParameters properties) { + final String path = String.format(PR_NUMBER_TEMPLATE + "/merge", owner, repo, prNumber); final String jsonPayload = github.json().toJsonUnchecked(properties); log.debug("Merging pr, running: {}", path); return github.put(path, jsonPayload).thenAccept(IGNORE_RESPONSE_CONSUMER); } - public CompletableFuture patch(final int number) { - final String path = String.format(PR_NUMBER_TEMPLATE, owner, repo, number); + /** + * Fetches a pull request patch. + * + * @deprecated Use {@link #patch(long)} instead + * @param prNumber pull request number + * @return reader for the patch + */ + @Deprecated + public CompletableFuture patch(final int prNumber) { + return patch((long) prNumber); + } + + /** + * Fetches a pull request patch. + * + * @param prNumber pull request number + * @return reader for the patch + */ + public CompletableFuture patch(final long prNumber) { + final String path = String.format(PR_NUMBER_TEMPLATE, owner, repo, prNumber); final Map extraHeaders = ImmutableMap.of(HttpHeaders.ACCEPT, "application/vnd.github.patch"); log.debug("Fetching pull request patch from " + path); @@ -255,8 +404,26 @@ public CompletableFuture patch(final int number) { }); } - public CompletableFuture diff(final int number) { - final String path = String.format(PR_NUMBER_TEMPLATE, owner, repo, number); + /** + * Fetches a pull request diff. + * + * @deprecated Use {@link #diff(long)} instead + * @param prNumber pull request number + * @return reader for the diff + */ + @Deprecated + public CompletableFuture diff(final int prNumber) { + return diff((long) prNumber); + } + + /** + * Fetches a pull request diff. + * + * @param prNumber pull request number + * @return reader for the diff + */ + public CompletableFuture diff(final long prNumber) { + final String path = String.format(PR_NUMBER_TEMPLATE, owner, repo, prNumber); final Map extraHeaders = ImmutableMap.of(HttpHeaders.ACCEPT, "application/vnd.github.diff"); log.debug("Fetching pull diff from " + path); @@ -272,6 +439,12 @@ public CompletableFuture diff(final int number) { }); } + /** + * List pull requests using given parameters. + * + * @param parameterPath request parameters + * @return pull requests + */ private CompletableFuture> list(final String parameterPath) { final String path = String.format(PR_TEMPLATE + parameterPath, owner, repo); log.debug("Fetching pull requests from " + path); diff --git a/src/main/java/com/spotify/github/v3/prs/PartialPullRequestItem.java b/src/main/java/com/spotify/github/v3/prs/PartialPullRequestItem.java new file mode 100644 index 00000000..35dd2018 --- /dev/null +++ b/src/main/java/com/spotify/github/v3/prs/PartialPullRequestItem.java @@ -0,0 +1,52 @@ +/*- + * -\-\- + * github-api + * -- + * Copyright (C) 2016 - 2020 Spotify AB + * -- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * -/-/- + */ +package com.spotify.github.v3.prs; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.spotify.github.CloseTracking; +import com.spotify.github.GithubStyle; +import org.immutables.value.Value; + +import javax.annotation.Nullable; +import java.net.URI; + +@Value.Immutable +@GithubStyle +@JsonSerialize(as = ImmutablePartialPullRequestItem.class) +@JsonDeserialize(as = ImmutablePartialPullRequestItem.class) +public interface PartialPullRequestItem extends CloseTracking { + /** ID. */ + Long id(); + + /** URL. */ + URI url(); + + /** Number. */ + Long number(); + + /** Head reference. */ + @Nullable + PullRequestRef head(); + + /** Base reference. */ + @Nullable + PullRequestRef base(); +} diff --git a/src/main/java/com/spotify/github/v3/prs/PullRequestItem.java b/src/main/java/com/spotify/github/v3/prs/PullRequestItem.java index 318716c4..469b8c87 100644 --- a/src/main/java/com/spotify/github/v3/prs/PullRequestItem.java +++ b/src/main/java/com/spotify/github/v3/prs/PullRequestItem.java @@ -23,7 +23,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.spotify.github.CloseTracking; import com.spotify.github.GitHubInstant; import com.spotify.github.GithubStyle; import com.spotify.github.v3.Milestone; @@ -39,15 +38,7 @@ @GithubStyle @JsonSerialize(as = ImmutablePullRequestItem.class) @JsonDeserialize(as = ImmutablePullRequestItem.class) -public interface PullRequestItem extends CloseTracking { - - /** ID. */ - @Nullable - Long id(); - - /** URL. */ - @Nullable - URI url(); +public interface PullRequestItem extends PartialPullRequestItem { /** HTML URL. */ @Nullable @@ -69,10 +60,6 @@ public interface PullRequestItem extends CloseTracking { @Nullable URI commitsUrl(); - /** Number. */ - @Nullable - Integer number(); - /** Either open, closed, or all to filter by state. Default: open. */ @Nullable String state(); @@ -100,14 +87,6 @@ public interface PullRequestItem extends CloseTracking { /** Merged date. */ Optional mergedAt(); - /** Head reference. */ - @Nullable - PullRequestRef head(); - - /** Base reference. */ - @Nullable - PullRequestRef base(); - /** User. */ @Nullable User user(); diff --git a/src/test/java/com/spotify/github/v3/activity/events/PullRequestReviewEventTest.java b/src/test/java/com/spotify/github/v3/activity/events/PullRequestReviewEventTest.java index b71ede72..4afb8fbf 100644 --- a/src/test/java/com/spotify/github/v3/activity/events/PullRequestReviewEventTest.java +++ b/src/test/java/com/spotify/github/v3/activity/events/PullRequestReviewEventTest.java @@ -40,7 +40,7 @@ public void testDeserialization() throws IOException { final PullRequestReviewEvent statusEvent = Json.create().fromJson(fixture, PullRequestReviewEvent.class); assertThat(statusEvent.action(), is("submitted")); - assertThat(statusEvent.pullRequest().number(), is(8)); + assertThat(statusEvent.pullRequest().number(), is(8L)); assertThat(statusEvent.review().state(), is(ReviewState.APPROVED)); } } diff --git a/src/test/java/com/spotify/github/v3/clients/PullRequestClientTest.java b/src/test/java/com/spotify/github/v3/clients/PullRequestClientTest.java index 5ddc0514..4e67ed9d 100644 --- a/src/test/java/com/spotify/github/v3/clients/PullRequestClientTest.java +++ b/src/test/java/com/spotify/github/v3/clients/PullRequestClientTest.java @@ -136,7 +136,7 @@ public void updatePullRequest() throws Exception { final PullRequestUpdate request = ImmutablePullRequestUpdate.builder().title(title).body(body) .build(); - final CompletableFuture result = pullRequestClient.update(1, request); + final CompletableFuture result = pullRequestClient.update(1L, request); capture.getValue().onResponse(call, response); @@ -170,7 +170,7 @@ public void testListReviewRequests() throws Throwable { PullRequestClient.create(github, "owner", "repo"); final CompletableFuture result = - pullRequestClient.listReviewRequests(1); + pullRequestClient.listReviewRequests(1L); capture.getValue().onResponse(call, response); @@ -203,7 +203,7 @@ public void testRemoveRequestedReview() throws Throwable { PullRequestClient.create(github, "owner", "repo"); CompletableFuture result = - pullRequestClient.removeRequestedReview(1, ImmutableRequestReviewParameters.builder() + pullRequestClient.removeRequestedReview(1L, ImmutableRequestReviewParameters.builder() .reviewers(ImmutableList.of("user1", "user2")) .build()); @@ -234,7 +234,7 @@ public void testRemoveRequestedReview_failure() throws Throwable { PullRequestClient.create(github, "owner", "repo"); CompletableFuture result = - pullRequestClient.removeRequestedReview(1, ImmutableRequestReviewParameters.builder() + pullRequestClient.removeRequestedReview(1L, ImmutableRequestReviewParameters.builder() .reviewers(ImmutableList.of("user1", "user2")) .build()); @@ -268,7 +268,7 @@ public void testGetPatch() throws Throwable { PullRequestClient.create(github, "owner", "repo"); final CompletableFuture result = - pullRequestClient.patch(1); + pullRequestClient.patch(1L); capture.getValue().onResponse(call, response); @@ -301,7 +301,7 @@ public void testGetDiff() throws Throwable { PullRequestClient.create(github, "owner", "repo"); final CompletableFuture result = - pullRequestClient.diff(1); + pullRequestClient.diff(1L); capture.getValue().onResponse(call, response); diff --git a/src/test/java/com/spotify/github/v3/clients/RepositoryClientTest.java b/src/test/java/com/spotify/github/v3/clients/RepositoryClientTest.java index 7a621ca2..0524d560 100644 --- a/src/test/java/com/spotify/github/v3/clients/RepositoryClientTest.java +++ b/src/test/java/com/spotify/github/v3/clients/RepositoryClientTest.java @@ -286,7 +286,7 @@ public void listPullRequestsForCommit() throws Exception { .thenReturn(fixture); final List prs = repoClient.listPullRequestsForCommit("thesha").get(); assertThat(prs.size(), is(1)); - assertThat(prs.get(0).number(), is(1347)); + assertThat(prs.get(0).number(), is(1347L)); } @Test