From 903fb84d97658dd625f38d014e4c9c10a337f1f0 Mon Sep 17 00:00:00 2001 From: Matt Burke Date: Wed, 2 Oct 2013 10:36:40 -0400 Subject: [PATCH] Move Releases API to RepositoriesClient. Releases are grouped under Repositories on developer.github.com. --- .../RepositoriesClientTests.cs | 18 +++++++++ Octokit.Tests/Clients/ReleasesClientTests.cs | 40 ------------------- .../Clients/RepositoriesClientTests.cs | 23 +++++++++++ Octokit.Tests/Octokit.Tests.csproj | 1 - Octokit/ApiExtensions.cs | 8 ++++ Octokit/Clients/ApiPagination.cs | 13 ++++++ Octokit/Clients/ReleasesClient.cs | 21 ---------- Octokit/Clients/RepositoriesClient.cs | 9 +++++ Octokit/Http/ApiConnection.cs | 15 +++++++ Octokit/Http/IApiConnection.cs | 1 + Octokit/IApiPagination.cs | 1 + Octokit/IReleasesClient.cs | 9 ----- Octokit/IRepositoriesClient.cs | 8 ++++ Octokit/Octokit.csproj | 2 - 14 files changed, 96 insertions(+), 73 deletions(-) delete mode 100644 Octokit.Tests/Clients/ReleasesClientTests.cs delete mode 100644 Octokit/Clients/ReleasesClient.cs delete mode 100644 Octokit/IReleasesClient.cs diff --git a/Octokit.Tests.Integration/RepositoriesClientTests.cs b/Octokit.Tests.Integration/RepositoriesClientTests.cs index 3b55a09c..b599e9d0 100644 --- a/Octokit.Tests.Integration/RepositoriesClientTests.cs +++ b/Octokit.Tests.Integration/RepositoriesClientTests.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Threading.Tasks; using Xunit; @@ -89,5 +90,22 @@ namespace Octokit.Tests.Integration Assert.Contains("

WARNING: This is some haacky code.", readMeHtml); } } + + public class TheGetReleasesMethod + { + [IntegrationTest] + public async Task ReturnsReleases() + { + var github = new GitHubClient + { + Credentials = AutomationSettings.Current.GitHubCredentials + }; + + var releases = await github.Repository.GetReleases("git-tfs", "git-tfs"); + + Assert.True(releases.Count > 5); + Assert.True(releases.Any(release => release.TagName == "v0.18.0")); + } + } } } diff --git a/Octokit.Tests/Clients/ReleasesClientTests.cs b/Octokit.Tests/Clients/ReleasesClientTests.cs deleted file mode 100644 index fed75bd9..00000000 --- a/Octokit.Tests/Clients/ReleasesClientTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Threading.Tasks; -using NSubstitute; -using Octokit.Clients; -using Octokit.Http; -using Octokit.Tests.Helpers; -using Xunit; - -namespace Octokit.Tests.Clients -{ - ///

- /// Client tests mostly just need to make sure they call the IApiConnection with the correct - /// relative Uri. No need to fake up the response. All *those* tests are in ApiConnectionTests.cs. - /// - public class ReleasesClientTests - { - public class TheGetAllMethod - { - [Fact] - public void RequestsCorrectUrl() - { - var client = Substitute.For>(); - var repositoriesClient = new ReleasesClient(client); - - repositoriesClient.GetAll("fake", "repo"); - - client.Received().GetAll(Arg.Is(u => u.ToString() == "/repos/fake/repo/releases"), null); - } - - [Fact] - public async Task EnsuresNonNullArguments() - { - var repositoriesClient = new ReleasesClient(Substitute.For>()); - - await AssertEx.Throws(async () => await repositoriesClient.GetAll(null, "name")); - await AssertEx.Throws(async () => await repositoriesClient.GetAll("owner", null)); - } - } - } -} diff --git a/Octokit.Tests/Clients/RepositoriesClientTests.cs b/Octokit.Tests/Clients/RepositoriesClientTests.cs index 08a0ec5b..37a1da54 100644 --- a/Octokit.Tests/Clients/RepositoriesClientTests.cs +++ b/Octokit.Tests/Clients/RepositoriesClientTests.cs @@ -139,5 +139,28 @@ namespace Octokit.Tests.Clients client.Received().GetHtml(Arg.Is(u => u.ToString() == "https://github.example.com/readme"), null); } } + + public class TheGetReleasesMethod + { + [Fact] + public void RequestsCorrectUrl() + { + var client = Substitute.For>(); + var repositoriesClient = new RepositoriesClient(client); + + repositoriesClient.GetReleases("fake", "repo"); + + client.Received().GetAll(Arg.Is(u => u.ToString() == "/repos/fake/repo/releases"), null); + } + + [Fact] + public async Task EnsuresNonNullArguments() + { + var repositoriesClient = new RepositoriesClient(Substitute.For>()); + + await AssertEx.Throws(async () => await repositoriesClient.GetReleases(null, "name")); + await AssertEx.Throws(async () => await repositoriesClient.GetReleases("owner", null)); + } + } } } diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index e76e24c1..1a2d582e 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -51,7 +51,6 @@ - diff --git a/Octokit/ApiExtensions.cs b/Octokit/ApiExtensions.cs index d813a203..58a882ef 100644 --- a/Octokit/ApiExtensions.cs +++ b/Octokit/ApiExtensions.cs @@ -26,6 +26,14 @@ namespace Octokit return connection.GetAll(endpoint, null); } + public static Task> GetAll(this IApiConnection connection, Uri endpoint) + { + Ensure.ArgumentNotNull(connection, "connection"); + Ensure.ArgumentNotNull(endpoint, "endpoint"); + + return connection.GetAll(endpoint, null); + } + public static Task GetHtml(this IApiConnection connection, Uri endpoint) { Ensure.ArgumentNotNull(connection, "connection"); diff --git a/Octokit/Clients/ApiPagination.cs b/Octokit/Clients/ApiPagination.cs index 997d9a13..ff5e0a8d 100644 --- a/Octokit/Clients/ApiPagination.cs +++ b/Octokit/Clients/ApiPagination.cs @@ -26,5 +26,18 @@ namespace Octokit.Clients } return new ReadOnlyCollection(allItems); } + + public async Task> GetAllPages(Func>> getFirstPage) + { + Ensure.ArgumentNotNull(getFirstPage, "getFirstPage"); + + var page = await getFirstPage(); + var allItems = new List(page); + while ((page = await page.GetNextPage()) != null) + { + allItems.AddRange(page); + } + return new ReadOnlyCollection(allItems); + } } } diff --git a/Octokit/Clients/ReleasesClient.cs b/Octokit/Clients/ReleasesClient.cs deleted file mode 100644 index 1ee99993..00000000 --- a/Octokit/Clients/ReleasesClient.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Threading.Tasks; -using Octokit.Http; - -namespace Octokit.Clients -{ - public class ReleasesClient : ApiClient, IReleasesClient - { - public ReleasesClient(IApiConnection client) : base(client) - { - } - - public async Task> GetAll(string owner, string repository) - { - Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); - Ensure.ArgumentNotNullOrEmptyString(repository, "repository"); - - var endpoint = "/repos/{0}/{1}/releases".FormatUri(owner, repository); - return await Client.GetAll(endpoint); - } - } -} diff --git a/Octokit/Clients/RepositoriesClient.cs b/Octokit/Clients/RepositoriesClient.cs index e09e0dbb..d3d3f768 100644 --- a/Octokit/Clients/RepositoriesClient.cs +++ b/Octokit/Clients/RepositoriesClient.cs @@ -53,5 +53,14 @@ namespace Octokit.Clients var readmeInfo = await Client.GetItem(endpoint, null); return new Readme(readmeInfo, Client); } + + public async Task> GetReleases(string owner, string name) + { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "repository"); + + var endpoint = "/repos/{0}/{1}/releases".FormatUri(owner, name); + return await Client.GetAll(endpoint); + } } } diff --git a/Octokit/Http/ApiConnection.cs b/Octokit/Http/ApiConnection.cs index 3869f24e..637cc894 100644 --- a/Octokit/Http/ApiConnection.cs +++ b/Octokit/Http/ApiConnection.cs @@ -54,6 +54,13 @@ namespace Octokit.Http return await pagination.GetAllPages(async () => await GetPage(endpoint, parameters)); } + public async Task> GetAll(Uri endpoint, IDictionary parameters) + { + Ensure.ArgumentNotNull(endpoint, "endpoint"); + + return await pagination.GetAllPages(async () => await GetPage(endpoint, parameters)); + } + public async Task Create(Uri endpoint, object data) { Ensure.ArgumentNotNull(endpoint, "endpoint"); @@ -99,5 +106,13 @@ namespace Octokit.Http return new ReadOnlyPagedCollection(response, Connection); } + async Task> GetPage(Uri endpoint, IDictionary parameters) + { + Ensure.ArgumentNotNull(endpoint, "endpoint"); + + var response = await Connection.GetAsync>(endpoint, parameters); + return new ReadOnlyPagedCollection(response, Connection); + } + } } diff --git a/Octokit/Http/IApiConnection.cs b/Octokit/Http/IApiConnection.cs index 73e06011..ad3decb4 100644 --- a/Octokit/Http/IApiConnection.cs +++ b/Octokit/Http/IApiConnection.cs @@ -17,6 +17,7 @@ namespace Octokit.Http Task GetItem(Uri endpoint, IDictionary parameters); Task GetHtml(Uri endpoint, IDictionary parameters); Task> GetAll(Uri endpoint, IDictionary parameters); + Task> GetAll(Uri endpoint, IDictionary parameters); Task Create(Uri endpoint, object data); Task Update(Uri endpoint, object data); Task Delete(Uri endpoint); diff --git a/Octokit/IApiPagination.cs b/Octokit/IApiPagination.cs index a6aae0e7..b7986b71 100644 --- a/Octokit/IApiPagination.cs +++ b/Octokit/IApiPagination.cs @@ -7,5 +7,6 @@ namespace Octokit public interface IApiPagination { Task> GetAllPages(Func>> getFirstPage); + Task> GetAllPages(Func>> getFirstPage); } } \ No newline at end of file diff --git a/Octokit/IReleasesClient.cs b/Octokit/IReleasesClient.cs deleted file mode 100644 index 88510a2f..00000000 --- a/Octokit/IReleasesClient.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace Octokit -{ - public interface IReleasesClient - { - Task> GetAll(string owner, string repository); - } -} diff --git a/Octokit/IRepositoriesClient.cs b/Octokit/IRepositoriesClient.cs index 347e1ef8..efa70a67 100644 --- a/Octokit/IRepositoriesClient.cs +++ b/Octokit/IRepositoriesClient.cs @@ -56,5 +56,13 @@ namespace Octokit /// The name of the repository. /// Task GetReadme(string owner, string name); + + /// + /// Retrieves every for the specified repository. + /// + /// The owner of the repository. + /// The name of the reposiitory + /// A of . + Task> GetReleases(string owner, string name); } } diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index 43984922..dd4104b5 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -83,7 +83,6 @@ - @@ -107,7 +106,6 @@ -