diff --git a/Octokit.Reactive/Clients/IObservableRepositoriesClient.cs b/Octokit.Reactive/Clients/IObservableRepositoriesClient.cs index 238cea4a..e8f914b0 100644 --- a/Octokit.Reactive/Clients/IObservableRepositoriesClient.cs +++ b/Octokit.Reactive/Clients/IObservableRepositoriesClient.cs @@ -61,7 +61,20 @@ namespace Octokit.Reactive [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Makes a network request")] IObservable GetAllForCurrent(); - + + /// + /// Retrieves every that belongs to the current user. + /// + /// + /// The default page size on GitHub.com is 30. + /// + /// Search parameters to filter results on + /// Thrown if the client is not authenticated. + /// A of . + [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", + Justification = "Makes a network request")] + IObservable GetAllForCurrent(RepositoryRequest request); + /// /// Retrieves every that belongs to the specified user. /// diff --git a/Octokit.Reactive/Clients/ObservableRepositoriesClient.cs b/Octokit.Reactive/Clients/ObservableRepositoriesClient.cs index b4a010e7..a942c2a8 100644 --- a/Octokit.Reactive/Clients/ObservableRepositoriesClient.cs +++ b/Octokit.Reactive/Clients/ObservableRepositoriesClient.cs @@ -115,6 +115,22 @@ namespace Octokit.Reactive return _connection.GetAndFlattenAllPages(ApiUrls.Repositories()); } + /// + /// Retrieves every that belongs to the current user. + /// + /// + /// The default page size on GitHub.com is 30. + /// + /// Search parameters to filter results on + /// Thrown if the client is not authenticated. + /// A of . + public IObservable GetAllForCurrent(RepositoryRequest request) + { + Ensure.ArgumentNotNull(request, "request"); + + return _connection.GetAndFlattenAllPages(ApiUrls.Repositories(), request.ToParametersDictionary()); + } + /// /// Retrieves every that belongs to the specified user. /// diff --git a/Octokit.Tests.Integration/Clients/RepositoriesClientTests.cs b/Octokit.Tests.Integration/Clients/RepositoriesClientTests.cs index eeaca98e..9d868b52 100644 --- a/Octokit.Tests.Integration/Clients/RepositoriesClientTests.cs +++ b/Octokit.Tests.Integration/Clients/RepositoriesClientTests.cs @@ -615,6 +615,62 @@ public class RepositoriesClientTests } } + public class TheGetAllForCurrentMethod + { + [IntegrationTest] + public async Task CanRetrieveResults() + { + var github = Helper.GetAuthenticatedClient(); + + var repositories = await github.Repository.GetAllForCurrent(); + + Assert.NotEmpty(repositories); + } + + [IntegrationTest] + public async Task CanSortResults() + { + var github = Helper.GetAuthenticatedClient(); + + var request = new RepositoryRequest + { + Sort = RepositorySort.Created + }; + + var reposByCreated = await github.Repository.GetAllForCurrent(request); + + request.Sort = RepositorySort.FullName; + + var reposByFullName = await github.Repository.GetAllForCurrent(request); + + Assert.NotEmpty(reposByCreated); + Assert.NotEmpty(reposByFullName); + Assert.NotEqual(reposByCreated, reposByFullName); + } + + + [IntegrationTest] + public async Task CanChangeSortDirection() + { + var github = Helper.GetAuthenticatedClient(); + + var request = new RepositoryRequest + { + Direction = SortDirection.Ascending + }; + + var reposAscending = await github.Repository.GetAllForCurrent(request); + + request.Direction = SortDirection.Ascending; + + var reposDescending = await github.Repository.GetAllForCurrent(request); + + Assert.NotEmpty(reposAscending); + Assert.NotEmpty(reposDescending); + Assert.NotEqual(reposAscending, reposDescending); + } + } + public class TheGetAllLanguagesMethod { [IntegrationTest] diff --git a/Octokit.Tests/Clients/RepositoriesClientTests.cs b/Octokit.Tests/Clients/RepositoriesClientTests.cs index 1fdb60a5..364dc4d3 100644 --- a/Octokit.Tests/Clients/RepositoriesClientTests.cs +++ b/Octokit.Tests/Clients/RepositoriesClientTests.cs @@ -288,6 +288,68 @@ namespace Octokit.Tests.Clients connection.Received() .GetAll(Arg.Is(u => u.ToString() == "user/repos")); } + + [Fact] + public void CanFilterByType() + { + var connection = Substitute.For(); + var client = new RepositoriesClient(connection); + + var request = new RepositoryRequest + { + Type = RepositoryType.All + }; + + client.GetAllForCurrent(request); + + connection.Received() + .GetAll( + Arg.Is(u => u.ToString() == "user/repos"), + Arg.Is>(d => d["type"] == "all")); + } + + [Fact] + public void CanFilterBySort() + { + var connection = Substitute.For(); + var client = new RepositoriesClient(connection); + + var request = new RepositoryRequest + { + Type = RepositoryType.Private, + Sort = RepositorySort.FullName + }; + + client.GetAllForCurrent(request); + + connection.Received() + .GetAll( + Arg.Is(u => u.ToString() == "user/repos"), + Arg.Is>(d => + d["type"] == "private" && d["sort"] == "full_name")); + } + + [Fact] + public void CanFilterBySortDirection() + { + var connection = Substitute.For(); + var client = new RepositoriesClient(connection); + + var request = new RepositoryRequest + { + Type = RepositoryType.Member, + Sort = RepositorySort.Updated, + Direction = SortDirection.Ascending + }; + + client.GetAllForCurrent(request); + + connection.Received() + .GetAll( + Arg.Is(u => u.ToString() == "user/repos"), + Arg.Is>(d => + d["type"] == "member" && d["sort"] == "updated" && d["direction"] == "asc")); + } } public class TheGetAllForUserMethod diff --git a/Octokit/Clients/IRepositoriesClient.cs b/Octokit/Clients/IRepositoriesClient.cs index 2080e6a0..a6c8cdc0 100644 --- a/Octokit/Clients/IRepositoriesClient.cs +++ b/Octokit/Clients/IRepositoriesClient.cs @@ -108,7 +108,7 @@ namespace Octokit [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Makes a network request")] Task> GetAllPublic(); - + /// /// Gets all repositories owned by the current user. /// @@ -122,7 +122,22 @@ namespace Octokit [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Makes a network request")] Task> GetAllForCurrent(); - + + /// + /// Gets all repositories owned by the current user. + /// + /// + /// See the API documentation for more information. + /// The default page size on GitHub.com is 30. + /// + /// Search parameters to filter results on + /// Thrown if the client is not authenticated. + /// Thrown when a general API error occurs. + /// A of . + [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", + Justification = "Makes a network request")] + Task> GetAllForCurrent(RepositoryRequest request); + /// /// Gets all repositories owned by the specified user. /// diff --git a/Octokit/Clients/RepositoriesClient.cs b/Octokit/Clients/RepositoriesClient.cs index cc118d48..b8f68c83 100644 --- a/Octokit/Clients/RepositoriesClient.cs +++ b/Octokit/Clients/RepositoriesClient.cs @@ -204,6 +204,24 @@ namespace Octokit return ApiConnection.GetAll(ApiUrls.Repositories()); } + /// + /// Gets all repositories owned by the current user. + /// + /// + /// See the API documentation for more information. + /// The default page size on GitHub.com is 30. + /// + /// Search parameters to filter results on + /// Thrown if the client is not authenticated. + /// Thrown when a general API error occurs. + /// A of . + public Task> GetAllForCurrent(RepositoryRequest request) + { + Ensure.ArgumentNotNull(request, "request"); + + return ApiConnection.GetAll(ApiUrls.Repositories(), request.ToParametersDictionary()); + } + /// /// Gets all repositories owned by the specified user. /// diff --git a/Octokit/Models/Request/RepositoryRequest.cs b/Octokit/Models/Request/RepositoryRequest.cs new file mode 100644 index 00000000..a420e9ff --- /dev/null +++ b/Octokit/Models/Request/RepositoryRequest.cs @@ -0,0 +1,45 @@ +using System; +using System.Diagnostics; +using System.Globalization; +using Octokit.Internal; + +namespace Octokit +{ + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public class RepositoryRequest : RequestParameters + { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")] + public RepositoryType Type { get; set; } + + public RepositorySort Sort { get; set; } + + public SortDirection Direction { get; set; } + + internal string DebuggerDisplay + { + get + { + return String.Format(CultureInfo.InvariantCulture, "Type: {0}, Sort: {1}, Direction: {2}", Type, Sort, Direction); + } + } + } + + public enum RepositoryType + { + All, + Owner, + Public, + Private, + Member + } + + public enum RepositorySort + { + Created, + Updated, + Pushed, + + [Parameter(Value = "full_name")] + FullName + } +} diff --git a/Octokit/Octokit-Mono.csproj b/Octokit/Octokit-Mono.csproj index 61556f1e..a8bf80ab 100644 --- a/Octokit/Octokit-Mono.csproj +++ b/Octokit/Octokit-Mono.csproj @@ -368,6 +368,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-MonoAndroid.csproj b/Octokit/Octokit-MonoAndroid.csproj index aa58c2a9..56859c3a 100644 --- a/Octokit/Octokit-MonoAndroid.csproj +++ b/Octokit/Octokit-MonoAndroid.csproj @@ -380,6 +380,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-Monotouch.csproj b/Octokit/Octokit-Monotouch.csproj index a7bd1580..3535181b 100644 --- a/Octokit/Octokit-Monotouch.csproj +++ b/Octokit/Octokit-Monotouch.csproj @@ -373,7 +373,8 @@ + - + \ No newline at end of file diff --git a/Octokit/Octokit-Portable.csproj b/Octokit/Octokit-Portable.csproj index 6162c449..df8d5d62 100644 --- a/Octokit/Octokit-Portable.csproj +++ b/Octokit/Octokit-Portable.csproj @@ -366,6 +366,7 @@ + @@ -396,4 +397,4 @@ --> - + \ No newline at end of file diff --git a/Octokit/Octokit-netcore45.csproj b/Octokit/Octokit-netcore45.csproj index bbe7548e..f29a903d 100644 --- a/Octokit/Octokit-netcore45.csproj +++ b/Octokit/Octokit-netcore45.csproj @@ -370,6 +370,7 @@ + diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index f1a90016..a3bd9201 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -84,6 +84,7 @@ +