diff --git a/Octokit.Reactive/Clients/ObservableReleasesClient.cs b/Octokit.Reactive/Clients/ObservableReleasesClient.cs index 6d931619..faff51a7 100644 --- a/Octokit.Reactive/Clients/ObservableReleasesClient.cs +++ b/Octokit.Reactive/Clients/ObservableReleasesClient.cs @@ -1,22 +1,25 @@ using System; using System.Reactive.Threading.Tasks; +using Octokit.Reactive.Helpers; namespace Octokit.Reactive.Clients { public class ObservableReleasesClient : IObservableReleasesClient { readonly IReleasesClient _client; + readonly IConnection _connection; - public ObservableReleasesClient(IReleasesClient client) + public ObservableReleasesClient(IGitHubClient client) { Ensure.ArgumentNotNull(client, "client"); - _client = client; + _client = client.Release; + _connection = client.Connection; } - public IObservable> GetAll(string owner, string name) + public IObservable GetAll(string owner, string name) { - return _client.GetAll(owner, name).ToObservable(); + return _connection.GetAndFlattenAllPages(ApiUrls.Releases(owner, name)); } public IObservable CreateRelease(string owner, string name, ReleaseUpdate data) diff --git a/Octokit.Reactive/IObservableReleasesClient.cs b/Octokit.Reactive/IObservableReleasesClient.cs index 2df0869b..26c0f120 100644 --- a/Octokit.Reactive/IObservableReleasesClient.cs +++ b/Octokit.Reactive/IObservableReleasesClient.cs @@ -4,7 +4,7 @@ namespace Octokit.Reactive { public interface IObservableReleasesClient { - IObservable> GetAll(string owner, string name); + IObservable GetAll(string owner, string name); IObservable CreateRelease(string owner, string name, ReleaseUpdate data); IObservable UploadAsset(Release release, ReleaseAssetUpload data); } diff --git a/Octokit.Reactive/ObservableGitHubClient.cs b/Octokit.Reactive/ObservableGitHubClient.cs index 3f5401c5..ce966870 100644 --- a/Octokit.Reactive/ObservableGitHubClient.cs +++ b/Octokit.Reactive/ObservableGitHubClient.cs @@ -17,7 +17,8 @@ namespace Octokit.Reactive Organization = new ObservableOrganizationsClient(gitHubClient); Repository = new ObservableRepositoriesClient(gitHubClient); SshKey = new ObservableSshKeysClient(gitHubClient); - User = new ObservableUsersClient(gitHubClient.User); + User = new ObservableUsersClient(gitHubClient); + Release = new ObservableReleasesClient(gitHubClient); } public IConnection Connection { get { return _gitHubClient.Connection; }} @@ -25,6 +26,7 @@ namespace Octokit.Reactive public IObservableMiscellaneousClient Miscellaneous { get; private set; } public IObservableOrganizationsClient Organization { get; private set; } public IObservableRepositoriesClient Repository { get; private set; } + public IObservableReleasesClient Release { get; private set; } public IObservableSshKeysClient SshKey { get; private set; } public IObservableUsersClient User { get; private set; } } diff --git a/Octokit.Tests/Clients/ReleasesClientTests.cs b/Octokit.Tests/Clients/ReleasesClientTests.cs index 561e3e19..c6d74c2a 100644 --- a/Octokit.Tests/Clients/ReleasesClientTests.cs +++ b/Octokit.Tests/Clients/ReleasesClientTests.cs @@ -1,9 +1,7 @@ using System; -using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using NSubstitute; -using Octokit.Internal; using Octokit.Tests.Helpers; using Xunit; diff --git a/Octokit/Clients/ReleasesClient.cs b/Octokit/Clients/ReleasesClient.cs index e7d33920..b81f724b 100644 --- a/Octokit/Clients/ReleasesClient.cs +++ b/Octokit/Clients/ReleasesClient.cs @@ -16,7 +16,7 @@ namespace Octokit Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); Ensure.ArgumentNotNullOrEmptyString(name, "repository"); - var endpoint = "/repos/{0}/{1}/releases".FormatUri(owner, name); + var endpoint = ApiUrls.Releases(owner, name); return await Client.GetAll(endpoint, null, "application/vnd.github.manifold-preview"); } @@ -26,7 +26,7 @@ namespace Octokit Ensure.ArgumentNotNullOrEmptyString(name, "repository"); Ensure.ArgumentNotNull(data, "data"); - var endpoint = "/repos/{0}/{1}/releases".FormatUri(owner, name); + var endpoint = ApiUrls.Releases(owner, name); return await Client.Post(endpoint, data, "application/vnd.github.manifold-preview"); } diff --git a/Octokit/Helpers/ApiUrls.cs b/Octokit/Helpers/ApiUrls.cs index 1a6ec8c3..13b23235 100644 --- a/Octokit/Helpers/ApiUrls.cs +++ b/Octokit/Helpers/ApiUrls.cs @@ -89,5 +89,16 @@ namespace Octokit { return _currentUserEmailsEndpoint; } + + /// + /// Returns the that returns all of the releases for the specified repository. + /// + /// The owner of the repository. + /// The name of the repository. + /// + public static Uri Releases(string owner, string name) + { + return "/repos/{0}/{1}/releases".FormatUri(owner, name); + } } } diff --git a/Octokit/Helpers/StringExtensions.cs b/Octokit/Helpers/StringExtensions.cs index a834271f..7276d7af 100644 --- a/Octokit/Helpers/StringExtensions.cs +++ b/Octokit/Helpers/StringExtensions.cs @@ -26,10 +26,10 @@ namespace Octokit return new Uri(string.Format(CultureInfo.InvariantCulture, pattern, args), UriKind.Relative); } - static Regex OptionalQueryStringRegex = new Regex("\\{\\?([^}]+)\\}"); + static readonly Regex _optionalQueryStringRegex = new Regex("\\{\\?([^}]+)\\}"); public static Uri ExpandUriTemplate(this string template, object values) { - var optionalQueryStringMatch = OptionalQueryStringRegex.Match(template); + var optionalQueryStringMatch = _optionalQueryStringRegex.Match(template); if(optionalQueryStringMatch.Success) { var expansion = ""; @@ -39,7 +39,7 @@ namespace Octokit { expansion = "?" + parameterName + "=" + Uri.EscapeDataString("" + parameterProperty.GetValue(values, new object[0])); } - template = OptionalQueryStringRegex.Replace(template, expansion); + template = _optionalQueryStringRegex.Replace(template, expansion); } return new Uri(template); }