diff --git a/Octokit.Reactive/Clients/IObservableCommitsClient.cs b/Octokit.Reactive/Clients/IObservableCommitsClient.cs new file mode 100644 index 00000000..8c175792 --- /dev/null +++ b/Octokit.Reactive/Clients/IObservableCommitsClient.cs @@ -0,0 +1,22 @@ +using System; +using System.Diagnostics.CodeAnalysis; + +namespace Octokit.Reactive +{ + public interface IObservableCommitsClient + { + /// + /// Gets a commit for a given repository by sha reference + /// + /// + /// http://developer.github.com/v3/git/commits/#get-a-commit + /// + /// The owner of the repository + /// The name of the repository + /// Tha sha reference of the commit + /// + [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", + Justification = "Method makes a network request")] + IObservable Get(string owner, string name, string reference); + } +} \ No newline at end of file diff --git a/Octokit.Reactive/Clients/IObservableGitDatabaseClient.cs b/Octokit.Reactive/Clients/IObservableGitDatabaseClient.cs index 8c984fb6..d071c78a 100644 --- a/Octokit.Reactive/Clients/IObservableGitDatabaseClient.cs +++ b/Octokit.Reactive/Clients/IObservableGitDatabaseClient.cs @@ -6,5 +6,6 @@ public interface IObservableGitDatabaseClient { IObservableTagsClient Tag { get; set; } + IObservableCommitsClient Commit { get; set; } } } \ No newline at end of file diff --git a/Octokit.Reactive/Clients/ObservableCommitsClient.cs b/Octokit.Reactive/Clients/ObservableCommitsClient.cs new file mode 100644 index 00000000..371cd621 --- /dev/null +++ b/Octokit.Reactive/Clients/ObservableCommitsClient.cs @@ -0,0 +1,25 @@ +using System; +using System.Reactive.Threading.Tasks; + +namespace Octokit.Reactive +{ + public class ObservableCommitsClient : IObservableCommitsClient + { + readonly ICommitsClient _client; + + public ObservableCommitsClient(IGitHubClient client) + { + Ensure.ArgumentNotNull(client, "client"); + _client = client.GitDatabase.Commit; + } + + public IObservable Get(string owner, string name, string reference) + { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + Ensure.ArgumentNotNullOrEmptyString(reference, "reference"); + + return _client.Get(owner, name, reference).ToObservable(); + } + } +} \ No newline at end of file diff --git a/Octokit.Reactive/Clients/ObservableGitDatabaseClient.cs b/Octokit.Reactive/Clients/ObservableGitDatabaseClient.cs index 9207a75a..48a65d0a 100644 --- a/Octokit.Reactive/Clients/ObservableGitDatabaseClient.cs +++ b/Octokit.Reactive/Clients/ObservableGitDatabaseClient.cs @@ -5,8 +5,10 @@ public ObservableGitDatabaseClient(IGitHubClient client) { Tag = new ObservableTagsClient(client); + Commit = new ObservableCommitsClient(client); } public IObservableTagsClient Tag { get; set; } + public IObservableCommitsClient Commit { get; set; } } } \ No newline at end of file diff --git a/Octokit.Reactive/Octokit.Reactive.csproj b/Octokit.Reactive/Octokit.Reactive.csproj index cb921381..e2e8913e 100644 --- a/Octokit.Reactive/Octokit.Reactive.csproj +++ b/Octokit.Reactive/Octokit.Reactive.csproj @@ -73,6 +73,8 @@ Properties\SolutionInfo.cs + + diff --git a/Octokit.Tests/Clients/GitDatabaseClientTests.cs b/Octokit.Tests/Clients/GitDatabaseClientTests.cs index e43362f3..93ee03bb 100644 --- a/Octokit.Tests/Clients/GitDatabaseClientTests.cs +++ b/Octokit.Tests/Clients/GitDatabaseClientTests.cs @@ -14,11 +14,19 @@ public class GitDatabaseClientTests } [Fact] - public void SetChildsClients() + public void SetTagsClient() { var apiConnection = Substitute.For(); var gitDatabaseClient = new GitDatabaseClient(apiConnection); Assert.NotNull(gitDatabaseClient.Tag); } + + [Fact] + public void SetCommitsClient() + { + var apiConnection = Substitute.For(); + var gitDatabaseClient = new GitDatabaseClient(apiConnection); + Assert.NotNull(gitDatabaseClient.Commit); + } } } \ No newline at end of file diff --git a/Octokit.Tests/Clients/TagsClientTests.cs b/Octokit.Tests/Clients/TagsClientTests.cs index ab37b754..2c6c3cff 100644 --- a/Octokit.Tests/Clients/TagsClientTests.cs +++ b/Octokit.Tests/Clients/TagsClientTests.cs @@ -77,13 +77,13 @@ public class TagsClientTests [Fact] public void PerformsNewTagSerialization() { - var tag = new NewTag() + var tag = new NewTag { Message = "tag-message", Tag = "tag-name", Object = "tag-object", Type = TaggedType.Tree, - Tagger = new Tagger + Tagger = new UserAction { Name = "tagger-name", Email = "tagger-email", diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index 9a832fec..78c56a68 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -110,6 +110,7 @@ + diff --git a/Octokit.Tests/Reactive/ObservableCommitsClientTests.cs b/Octokit.Tests/Reactive/ObservableCommitsClientTests.cs new file mode 100644 index 00000000..af1419c2 --- /dev/null +++ b/Octokit.Tests/Reactive/ObservableCommitsClientTests.cs @@ -0,0 +1,37 @@ +using System; +using System.Reactive.Linq; +using System.Threading.Tasks; +using NSubstitute; +using Octokit.Reactive; +using Octokit.Tests.Helpers; +using Xunit; + +namespace Octokit.Tests.Reactive +{ + public class ObservableCommitsClientTests + { + public class TheCtorMethod + { + [Fact] + public void EnsuresArgumentIsNotNulll() + { + Assert.Throws(() => new ObservableCommitsClient(null)); + } + } + + public class TheGetMethod + { + public async Task EnsureNonNullArguments() + { + var client = new ObservableCommitsClient(Substitute.For()); + + await AssertEx.Throws(async () => await client.Get(null, "name", "")); + await AssertEx.Throws(async () => await client.Get("owner", null, "")); + await AssertEx.Throws(async () => await client.Get("owner", "name", null)); + await AssertEx.Throws(async () => await client.Get("", "name", "reference")); + await AssertEx.Throws(async () => await client.Get("owner", "", "reference")); + await AssertEx.Throws(async () => await client.Get("owner", "name", "")); + } + } + } +} \ No newline at end of file diff --git a/Octokit/Clients/GitDatabaseClient.cs b/Octokit/Clients/GitDatabaseClient.cs index 0e97a0de..908f1ca0 100644 --- a/Octokit/Clients/GitDatabaseClient.cs +++ b/Octokit/Clients/GitDatabaseClient.cs @@ -6,8 +6,10 @@ : base(apiConnection) { Tag = new TagsClient(apiConnection); + Commit = new CommitsClient(apiConnection); } public ITagsClient Tag { get; set; } + public ICommitsClient Commit { get; set; } } } \ No newline at end of file diff --git a/Octokit/Clients/IGitDatabaseClient.cs b/Octokit/Clients/IGitDatabaseClient.cs index 6bd46eb4..8c36b6bb 100644 --- a/Octokit/Clients/IGitDatabaseClient.cs +++ b/Octokit/Clients/IGitDatabaseClient.cs @@ -6,5 +6,6 @@ public interface IGitDatabaseClient { ITagsClient Tag { get; set; } + ICommitsClient Commit { get; set; } } } \ No newline at end of file diff --git a/Octokit/Models/Response/Commit.cs b/Octokit/Models/Response/Commit.cs index b9296251..7205a177 100644 --- a/Octokit/Models/Response/Commit.cs +++ b/Octokit/Models/Response/Commit.cs @@ -1,4 +1,6 @@ -namespace Octokit +using System.Collections.Generic; + +namespace Octokit { public class Commit { @@ -6,12 +8,12 @@ public string Url { get; set; } public string Message { get; set; } public UserAction Author { get; set; } - public UserAction Commiter { get; set; } - public CommitRelation Tree { get; set; } - public CommitRelation[] Parents { get; set; } + public UserAction Committer { get; set; } + public GitReference Tree { get; set; } + public IEnumerable Parents { get; set; } } - public class CommitRelation + public class GitReference { public string Url { get; set; } public string Sha { get; set; }