Merge branch 'master' into pr-495ext

Conflicts:
	Octokit/Octokit-Mono.csproj
	Octokit/Octokit-MonoAndroid.csproj
	Octokit/Octokit-Monotouch.csproj
	Octokit/Octokit-Portable.csproj
	Octokit/Octokit-netcore45.csproj
This commit is contained in:
Kristian Hald
2015-03-22 17:18:22 +01:00
203 changed files with 29836 additions and 636 deletions

2
.gitignore vendored
View File

@@ -73,7 +73,7 @@ nunit-*.xml
packaging/
tools/FAKE.Core
tools/SourceLink.Fake
tools/xunit.runners
tools/xunit.runner.console
*.ncrunch*
*.GhostDoc.xml

View File

@@ -77,6 +77,53 @@ namespace Octokit.Reactive
NewAuthorization newAuthorization,
string twoFactorAuthenticationCode);
/// <summary>
/// Checks the validity of an OAuth token without running afoul of normal rate limits for failed login attempts.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#check-an-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">Client ID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to check</param>
/// <returns>The valid <see cref="ApplicationAuthorization"/>.</returns>
IObservable<ApplicationAuthorization> CheckApplicationAuthentication(string clientId, string accessToken);
/// <summary>
/// Resets a valid OAuth token for an OAuth application without end user involvment.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to reset</param>
/// <returns>The valid <see cref="ApplicationAuthorization"/> with a new OAuth token</returns>
IObservable<ApplicationAuthorization> ResetApplicationAuthentication(string clientId, string accessToken);
/// <summary>
/// Revokes a single OAuth token for an OAuth application.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application">API documentation for more information.</a>
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to revoke</param>
/// <returns></returns>
IObservable<Unit> RevokeApplicationAuthentication(string clientId, string accessToken);
/// <summary>
/// Revokes every OAuth token for an OAuth application.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#revoke-all-authorizations-for-an-application">API documentation for more information.</a>
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <returns></returns>
IObservable<Unit> RevokeAllApplicationAuthentications(string clientId);
/// <summary>
/// Update the <see cref="Authorization"/> specified by the id.
/// </summary>

View File

@@ -38,7 +38,7 @@ namespace Octokit.Reactive
/// </remarks>
/// <returns>A <see cref="IObservable{User}"/> of <see cref="User"/>s that the authenticated user follows.</returns>
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
IObservable<User> GetFollowingForCurrent();
IObservable<User> GetAllFollowingForCurrent();
/// <summary>
/// List who a user is following
@@ -48,7 +48,7 @@ namespace Octokit.Reactive
/// See the <a href="http://developer.github.com/v3/users/followers/#list-users-followed-by-another-user">API documentation</a> for more information.
/// </remarks>
/// <returns>A <see cref="IObservable{User}"/> of <see cref="User"/>s that the passed user follows.</returns>
IObservable<User> GetFollowing(string login);
IObservable<User> GetAllFollowing(string login);
/// <summary>
/// Check if the authenticated user follows another user

View File

@@ -5,10 +5,50 @@ namespace Octokit.Reactive
{
public interface IObservableMiscellaneousClient
{
/// <summary>
/// Gets all the emojis available to use on GitHub.
/// </summary>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>An <see cref="IObservable{Emoji}"/> of emoji and their URI.</returns>
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate",
Justification = "Makes a network request")]
IObservable<Emoji> GetEmojis();
/// <summary>
/// Gets the rendered Markdown for the specified plain-text Markdown document.
/// </summary>
/// <param name="markdown">A plain-text Markdown document</param>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>The rendered Markdown.</returns>
IObservable<string> RenderRawMarkdown(string markdown);
/// <summary>
/// List all templates available to pass as an option when creating a repository.
/// </summary>
/// <returns>An observable list of gitignore template names.</returns>
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
IObservable<string> GetGitIgnoreTemplates();
/// <summary>
/// Retrieves the source for a single GitIgnore template
/// </summary>
/// <param name="templateName">Returns the template source for the given template</param>
IObservable<GitIgnoreTemplate> GetGitIgnoreTemplate(string templateName);
/// <summary>
/// Returns a list of the licenses shown in the license picker on GitHub.com. This is not a comprehensive
/// list of all possible OSS licenses.
/// </summary>
/// <remarks>This is a PREVIEW API! Use it at your own risk.</remarks>
/// <returns>A list of licenses available on the site</returns>
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
IObservable<LicenseMetadata> GetLicenses();
/// <summary>
/// Retrieves a license based on the licence key such as "mit"
/// </summary>
/// <param name="key"></param>
/// <returns>A <see cref="License" /> that includes the license key, text, and attributes of the license.</returns>
IObservable<License> GetLicense(string key);
}
}

View File

@@ -96,5 +96,16 @@ namespace Octokit.Reactive
/// <param name="number">The pull request number</param>
/// <returns>A collection of <see cref="PullRequestCommit"/> results</returns>
IObservable<PullRequestCommit> Commits(string owner, string name, int number);
/// <summary>
/// Get the list of files on a pull request.
/// </summary>
/// <remarks>https://developer.github.com/v3/pulls/#list-pull-requests-files</remarks>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <param name="number">The pull request number</param>
/// <returns>A collection of <see cref="PullRequestFile"/> results</returns>
IObservable<PullRequestFile> Files(string owner, string name, int number);
}
}

View File

@@ -98,24 +98,6 @@ namespace Octokit.Reactive
Justification = "Makes a network request")]
IObservable<Repository> GetAllForOrg(string organization);
/// <summary>
/// Returns the HTML rendered README.
/// </summary>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <returns></returns>
[Obsolete("This method has been obsoleted by Content.GetReadme. Please use that instead.")]
IObservable<Readme> GetReadme(string owner, string name);
/// <summary>
/// Returns just the HTML portion of the README without the surrounding HTML document.
/// </summary>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <returns></returns>
[Obsolete("This method has been obsoleted by Content.GetReadmeHtml. Please use that instead.")]
IObservable<string> GetReadmeHtml(string owner, string name);
/// <summary>
/// A client for GitHub's Commit Status API.
/// </summary>

View File

@@ -112,6 +112,81 @@ namespace Octokit.Reactive
.ToObservable();
}
/// <summary>
/// Checks the validity of an OAuth token without running afoul of normal rate limits for failed login attempts.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#check-an-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">Client ID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to check</param>
/// <returns>The valid <see cref="ApplicationAuthorization"/>.</returns>
public IObservable<ApplicationAuthorization> CheckApplicationAuthentication(string clientId, string accessToken)
{
Ensure.ArgumentNotNullOrEmptyString("clientId", clientId);
Ensure.ArgumentNotNullOrEmptyString("accessToken", accessToken);
return _client.CheckApplicationAuthentication(clientId, accessToken)
.ToObservable();
}
/// <summary>
/// Resets a valid OAuth token for an OAuth application without end user involvment.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to reset</param>
/// <returns>The valid <see cref="ApplicationAuthorization"/> with a new OAuth token</returns>
public IObservable<ApplicationAuthorization> ResetApplicationAuthentication(string clientId, string accessToken)
{
Ensure.ArgumentNotNullOrEmptyString("clientId", clientId);
Ensure.ArgumentNotNullOrEmptyString("accessToken", accessToken);
return _client.ResetApplicationAuthentication(clientId, accessToken)
.ToObservable();
}
/// <summary>
/// Revokes a single OAuth token for an OAuth application.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application">API documentation for more information.</a>
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to revoke</param>
/// <returns></returns>
public IObservable<Unit> RevokeApplicationAuthentication(string clientId, string accessToken)
{
Ensure.ArgumentNotNullOrEmptyString("clientId", clientId);
Ensure.ArgumentNotNullOrEmptyString("accessToken", accessToken);
return _client.RevokeApplicationAuthentication(clientId, accessToken)
.ToObservable();
}
/// <summary>
/// Revokes every OAuth token for an OAuth application.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#revoke-all-authorizations-for-an-application">API documentation for more information.</a>
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <returns></returns>
public IObservable<Unit> RevokeAllApplicationAuthentications(string clientId)
{
Ensure.ArgumentNotNullOrEmptyString("clientId", clientId);
return _client.RevokeAllApplicationAuthentications(clientId)
.ToObservable();
}
/// <summary>
/// Update the <see cref="Authorization"/> specified by the id.
/// </summary>

View File

@@ -56,7 +56,7 @@ namespace Octokit.Reactive
/// See the <a href="http://developer.github.com/v3/users/followers/#list-users-followed-by-another-user">API documentation</a> for more information.
/// </remarks>
/// <returns>A <see cref="IObservable{User}"/> of <see cref="User"/>s that the authenticated user follows.</returns>
public IObservable<User> GetFollowingForCurrent()
public IObservable<User> GetAllFollowingForCurrent()
{
return _connection.GetAndFlattenAllPages<User>(ApiUrls.Following());
}
@@ -69,7 +69,7 @@ namespace Octokit.Reactive
/// See the <a href="http://developer.github.com/v3/users/followers/#list-users-followed-by-another-user">API documentation</a> for more information.
/// </remarks>
/// <returns>A <see cref="IObservable{User}"/> of <see cref="User"/>s that the passed user follows.</returns>
public IObservable<User> GetFollowing(string login)
public IObservable<User> GetAllFollowing(string login)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");

View File

@@ -15,14 +15,64 @@ namespace Octokit.Reactive
_client = client;
}
/// <summary>
/// Gets all the emojis available to use on GitHub.
/// </summary>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>An <see cref="IObservable{Emoji}"/> of emoji and their URI.</returns>
public IObservable<Emoji> GetEmojis()
{
return _client.GetEmojis().ToObservable().SelectMany(e => e);
}
/// <summary>
/// Gets the rendered Markdown for the specified plain-text Markdown document.
/// </summary>
/// <param name="markdown">A plain-text Markdown document</param>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>The rendered Markdown.</returns>
public IObservable<string> RenderRawMarkdown(string markdown)
{
return _client.RenderRawMarkdown(markdown).ToObservable();
}
/// <summary>
/// List all templates available to pass as an option when creating a repository.
/// </summary>
/// <returns>An observable list of gitignore template names.</returns>
public IObservable<string> GetGitIgnoreTemplates()
{
return _client.GetGitIgnoreTemplates().ToObservable().SelectMany(t => t);
}
/// <summary>
/// Retrieves the source for a single GitIgnore template
/// </summary>
/// <param name="templateName">Returns the template source for the given template</param>
public IObservable<GitIgnoreTemplate> GetGitIgnoreTemplate(string templateName)
{
return _client.GetGitIgnoreTemplate(templateName).ToObservable();
}
/// <summary>
/// Returns a list of the licenses shown in the license picker on GitHub.com. This is not a comprehensive
/// list of all possible OSS licenses.
/// </summary>
/// <remarks>This is a PREVIEW API! Use it at your own risk.</remarks>
/// <returns>A list of licenses available on the site</returns>
public IObservable<LicenseMetadata> GetLicenses()
{
return _client.GetLicenses().ToObservable().SelectMany(l => l);
}
/// <summary>
/// Retrieves a license based on the licence key such as "mit"
/// </summary>
/// <param name="key"></param>
/// <returns>A <see cref="License" /> that includes the license key, text, and attributes of the license.</returns>
public IObservable<License> GetLicense(string key)
{
return _client.GetLicense(key).ToObservable();
}
}
}

View File

@@ -157,5 +157,21 @@ namespace Octokit.Reactive
return _connection.GetAndFlattenAllPages<PullRequestCommit>(ApiUrls.PullRequestCommits(owner, name, number));
}
/// <summary>
/// Get the list of files on a pull request.
/// </summary>
/// <remarks>https://developer.github.com/v3/pulls/#list-pull-requests-files</remarks>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <param name="number">The pull request number</param>
/// <returns>A collection of <see cref="PullRequestFile"/> results</returns>
public IObservable<PullRequestFile> Files(string owner, string name, int number)
{
Ensure.ArgumentNotNullOrEmptyString(owner, "owner");
Ensure.ArgumentNotNullOrEmptyString(name, "name");
return _connection.GetAndFlattenAllPages<PullRequestFile>(ApiUrls.PullRequestFiles(owner, name, number));
}
}
}

View File

@@ -161,30 +161,6 @@ namespace Octokit.Reactive
return _connection.GetAndFlattenAllPages<Repository>(ApiUrls.OrganizationRepositories(organization));
}
/// <summary>
/// Returns the HTML rendered README.
/// </summary>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <returns></returns>
[Obsolete("This method has been obsoleted by Content.GetReadme. Please use that instead.")]
public IObservable<Readme> GetReadme(string owner, string name)
{
return _client.Content.GetReadme(owner, name).ToObservable();
}
/// <summary>
/// Returns just the HTML portion of the README without the surrounding HTML document.
/// </summary>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <returns></returns>
[Obsolete("This method has been obsoleted by Content.GetReadmeHtml. Please use that instead.")]
public IObservable<string> GetReadmeHtml(string owner, string name)
{
return _client.Content.GetReadmeHtml(owner, name).ToObservable();
}
/// <summary>
/// A client for GitHub's Commit Status API.
/// </summary>

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections;
using System.Diagnostics;
using System.Linq;
using Octokit.Tests.Helpers;
@@ -36,6 +37,28 @@ namespace Octokit.Tests.Conventions
}
}
[Theory]
[MemberData("ResponseModelTypes")]
public void ResponseModelsHaveReadOnlyCollections(Type modelType)
{
foreach (var property in modelType.GetProperties())
{
var propertyType = property.PropertyType;
if (typeof(IEnumerable).IsAssignableFrom(propertyType))
{
// Let's skip arrays as well for now.
// There seems to be some special array handling in the Gist model.
if (propertyType == typeof(string) || propertyType.IsArray)
{
continue;
}
AssertEx.IsReadOnlyCollection(propertyType);
}
}
}
public static IEnumerable<object[]> ModelTypes
{
get { return GetModelTypes(includeRequestModels: true).Select(type => new[] { type }); }

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" />
<Import Project="..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -13,7 +13,7 @@
<AssemblyName>Octokit.Tests.Conventions</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<NuGetPackageImportStamp>c9328b3d</NuGetPackageImportStamp>
<NuGetPackageImportStamp>2fbb7772</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -44,14 +44,16 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Rx-Interfaces.2.2.5\lib\net45\System.Reactive.Interfaces.dll</HintPath>
</Reference>
<Reference Include="xunit.abstractions">
<HintPath>..\packages\xunit.abstractions.2.0.0-beta5-build2785\lib\net35\xunit.abstractions.dll</HintPath>
<Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<HintPath>..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
</Reference>
<Reference Include="xunit.assert">
<HintPath>..\packages\xunit.assert.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monoandroid+monotouch10\xunit.assert.dll</HintPath>
<Reference Include="xunit.assert, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.assert.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll</HintPath>
</Reference>
<Reference Include="xunit.core">
<HintPath>..\packages\xunit.core.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monotouch+monoandroid\xunit.core.dll</HintPath>
<Reference Include="xunit.core, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
@@ -94,8 +96,8 @@
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props'))" />
<Error Condition="!Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -2,9 +2,10 @@
<packages>
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="xunit" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.core" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="0.99.9-build1021" targetFramework="net45" />
<package id="xunit" version="2.0.0" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0" targetFramework="net45" />
<package id="xunit.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.extensibility.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="2.0.0" targetFramework="net45" />
</packages>

View File

@@ -15,7 +15,7 @@ public class AssigneesClientTests
_gitHubClient = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = _gitHubClient.Repository.Create(new NewRepository { Name = repoName }).Result;
_repository = _gitHubClient.Repository.Create(new NewRepository(repoName)).Result;
_owner = _repository.Owner.Login;
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Threading.Tasks;
using Octokit.Tests.Helpers;
using Xunit;
namespace Octokit.Tests.Integration.Clients
@@ -97,5 +98,117 @@ namespace Octokit.Tests.Integration.Clients
await client.Authorization.Delete(created.Id);
}
[ApplicationTest]
public async Task CanCheckApplicationAuthentication()
{
var client = Helper.GetAuthenticatedClient();
var fingerprint = Helper.MakeNameWithTimestamp("authorization-testing");
var note = Helper.MakeNameWithTimestamp("Testing authentication");
var newAuthorization = new NewAuthorization(
note,
new[] { "user" },
fingerprint);
var created = await client.Authorization.GetOrCreateApplicationAuthentication(
Helper.ClientId,
Helper.ClientSecret,
newAuthorization);
var applicationClient = Helper.GetAuthenticatedApplicationClient();
var applicationAuthorization = await applicationClient.Authorization.CheckApplicationAuthentication(Helper.ClientId, created.Token);
Assert.NotNull(applicationAuthorization);
Assert.Equal(created.Token, applicationAuthorization.Token);
await client.Authorization.Delete(created.Id);
AssertEx.Throws<NotFoundException>(async () => await client.Authorization.Get(created.Id));
}
[ApplicationTest]
public async Task CanResetApplicationAuthentication()
{
var client = Helper.GetAuthenticatedClient();
var fingerprint = Helper.MakeNameWithTimestamp("authorization-testing");
var note = Helper.MakeNameWithTimestamp("Testing authentication");
var newAuthorization = new NewAuthorization(
note,
new[] { "user" },
fingerprint);
var created = await client.Authorization.GetOrCreateApplicationAuthentication(
Helper.ClientId,
Helper.ClientSecret,
newAuthorization);
var applicationClient = Helper.GetAuthenticatedApplicationClient();
var applicationAuthorization = await applicationClient.Authorization.ResetApplicationAuthentication(Helper.ClientId, created.Token);
Assert.NotNull(applicationAuthorization);
Assert.NotEqual(created.Token, applicationAuthorization.Token);
await client.Authorization.Delete(created.Id);
AssertEx.Throws<NotFoundException>(async () => await client.Authorization.Get(created.Id));
}
[ApplicationTest]
public async Task CanRevokeApplicationAuthentication()
{
var client = Helper.GetAuthenticatedClient();
var fingerprint = Helper.MakeNameWithTimestamp("authorization-testing");
var note = Helper.MakeNameWithTimestamp("Testing authentication");
var newAuthorization = new NewAuthorization(
note,
new[] { "user" },
fingerprint);
var created = await client.Authorization.GetOrCreateApplicationAuthentication(
Helper.ClientId,
Helper.ClientSecret,
newAuthorization);
var applicationClient = Helper.GetAuthenticatedApplicationClient();
await applicationClient.Authorization.RevokeApplicationAuthentication(Helper.ClientId, created.Token);
AssertEx.Throws<NotFoundException>(async () => await applicationClient.Authorization.CheckApplicationAuthentication(Helper.ClientId, created.Token));
AssertEx.Throws<NotFoundException>(async () => await client.Authorization.Get(created.Id));
}
[ApplicationTest]
public async Task CanRevokeAllApplicationAuthentications()
{
var client = Helper.GetAuthenticatedClient();
var fingerprint = Helper.MakeNameWithTimestamp("authorization-testing");
var note = Helper.MakeNameWithTimestamp("Testing authentication");
var token1 = await client.Authorization.GetOrCreateApplicationAuthentication(
Helper.ClientId,
Helper.ClientSecret,
new NewAuthorization(
note,
new[] { "user" },
fingerprint));
fingerprint = Helper.MakeNameWithTimestamp("authorization-testing-2");
note = Helper.MakeNameWithTimestamp("Testing authentication 2");
var token2 = await client.Authorization.GetOrCreateApplicationAuthentication(
Helper.ClientId,
Helper.ClientSecret,
new NewAuthorization(
note,
new[] { "user" },
fingerprint));
var applicationClient = Helper.GetAuthenticatedApplicationClient();
await applicationClient.Authorization.RevokeAllApplicationAuthentications(Helper.ClientId);
AssertEx.Throws<NotFoundException>(async () =>
await applicationClient.Authorization.CheckApplicationAuthentication(Helper.ClientId, token1.Token));
AssertEx.Throws<NotFoundException>(async () =>
await applicationClient.Authorization.CheckApplicationAuthentication(Helper.ClientId, token2.Token));
AssertEx.Throws<NotFoundException>(async () => await client.Authorization.Get(token1.Id));
AssertEx.Throws<NotFoundException>(async () => await client.Authorization.Get(token2.Id));
}
}
}

View File

@@ -17,7 +17,7 @@ public class BlobClientTests : IDisposable
_fixture = client.GitDatabase.Blob;
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = client.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_owner = _repository.Owner.Login;
}

View File

@@ -15,7 +15,7 @@ public class BranchesClientTests
{
_github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = _github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = _github.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
}
[IntegrationTest]

View File

@@ -56,7 +56,7 @@ public class CommitStatusClientTests
_client = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = _client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = _client.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_owner = _repository.Owner.Login;
}

View File

@@ -17,7 +17,7 @@ public class CommitsClientTests : IDisposable
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_fixture = _client.GitDatabase.Commit;
_repository = _client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = _client.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_owner = _repository.Owner.Login;
}

View File

@@ -19,9 +19,8 @@ public class DeploymentStatusClientTests : IDisposable
_deploymentsClient = _gitHubClient.Repository.Deployment;
var newRepository = new NewRepository
var newRepository = new NewRepository(Helper.MakeNameWithTimestamp("public-repo"))
{
Name = Helper.MakeNameWithTimestamp("public-repo"),
AutoInit = true
};

View File

@@ -6,11 +6,11 @@ using Xunit;
public class DeploymentsClientTests : IDisposable
{
IGitHubClient _gitHubClient;
IDeploymentsClient _deploymentsClient;
Repository _repository;
Commit _commit;
string _repositoryOwner;
readonly IGitHubClient _gitHubClient;
readonly IDeploymentsClient _deploymentsClient;
readonly Repository _repository;
readonly Commit _commit;
readonly string _repositoryOwner;
public DeploymentsClientTests()
{
@@ -18,9 +18,8 @@ public class DeploymentsClientTests : IDisposable
_deploymentsClient = _gitHubClient.Repository.Deployment;
var newRepository = new NewRepository
var newRepository = new NewRepository(Helper.MakeNameWithTimestamp("public-repo"))
{
Name = Helper.MakeNameWithTimestamp("public-repo"),
AutoInit = true
};

View File

@@ -21,7 +21,7 @@ public class FollowersClientTests : IDisposable
{
await _github.User.Followers.Follow("alfhenrik");
var following = await _github.User.Followers.GetFollowingForCurrent();
var following = await _github.User.Followers.GetAllFollowingForCurrent();
Assert.NotNull(following);
Assert.True(following.Any(f => f.Login == "alfhenrik"));
@@ -30,7 +30,7 @@ public class FollowersClientTests : IDisposable
[IntegrationTest]
public async Task ReturnsUsersTheUserIsFollowing()
{
var following = await _github.User.Followers.GetFollowing("alfhenrik");
var following = await _github.User.Followers.GetAllFollowing("alfhenrik");
Assert.NotNull(following);
Assert.NotEmpty(following);
@@ -69,7 +69,7 @@ public class FollowersClientTests : IDisposable
public async Task FollowUserNotBeingFollowedByTheUser()
{
var result = await _github.User.Followers.Follow("alfhenrik");
var following = await _github.User.Followers.GetFollowingForCurrent();
var following = await _github.User.Followers.GetAllFollowingForCurrent();
Assert.True(result);
Assert.NotEmpty(following);

View File

@@ -19,7 +19,7 @@ public class IssuesClientTests : IDisposable
_gitHubClient = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_issuesClient = _gitHubClient.Issue;
_repository = _gitHubClient.Repository.Create(new NewRepository { Name = repoName }).Result;
_repository = _gitHubClient.Repository.Create(new NewRepository(repoName)).Result;
}
[IntegrationTest]

View File

@@ -23,7 +23,7 @@ public class IssuesEventsClientTests : IDisposable
_issuesClient = _gitHubClient.Issue;
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = _gitHubClient.Repository.Create(new NewRepository { Name = repoName }).Result;
_repository = _gitHubClient.Repository.Create(new NewRepository(repoName)).Result;
_repositoryOwner = _repository.Owner.Login;
_repositoryName = _repository.Name;
}
@@ -94,6 +94,14 @@ public class IssuesEventsClientTests : IDisposable
Assert.Equal(issueEvents[0].Event, issueEventLookupById.Event);
}
[IntegrationTest]
public async Task CanDeserializeUnsubscribeEvent()
{
var client = Helper.GetAuthenticatedClient();
var issue = await client.Issue.Events.Get("waffleio", "waffle.io", 142230057);
Assert.Equal(EventInfoState.Unsubscribed, issue.Event);
}
public void Dispose()
{
Helper.DeleteRepo(_repository);

View File

@@ -21,7 +21,7 @@ public class IssuesLabelsClientTests : IDisposable
_issuesClient = _gitHubClient.Issue;
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = _gitHubClient.Repository.Create(new NewRepository { Name = repoName }).Result;
_repository = _gitHubClient.Repository.Create(new NewRepository(repoName)).Result;
_repositoryOwner = _repository.Owner.Login;
_repositoryName = _repository.Name;
}

View File

@@ -23,7 +23,7 @@ public class MergingClientTests : IDisposable
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_fixture = _client.Repository.Merging;
_repository = _client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = _client.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_owner = _repository.Owner.Login;
}

View File

@@ -20,7 +20,7 @@ public class MilestonesClientTests : IDisposable
_milestonesClient = _gitHubClient.Issue.Milestone;
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = _gitHubClient.Repository.Create(new NewRepository { Name = repoName }).Result;
_repository = _gitHubClient.Repository.Create(new NewRepository(repoName)).Result;
_repositoryOwner = _repository.Owner.Login;
_repositoryName = _repository.Name;
}

View File

@@ -29,4 +29,45 @@ public class MiscellaneousClientTests
Assert.Equal("<p>This is\n a <strong>test</strong></p>\n", result);
}
}
public class TheGetGitIgnoreTemplatesMethod
{
[IntegrationTest]
public async Task ReturnsListOfGitIgnoreTemplates()
{
var github = Helper.GetAuthenticatedClient();
var result = await github.Miscellaneous.GetGitIgnoreTemplates();
Assert.True(result.Count > 2);
}
}
public class TheGetLicensesMethod
{
[IntegrationTest]
public async Task CanRetrieveListOfLicenses()
{
var github = Helper.GetAuthenticatedClient();
var result = await github.Miscellaneous.GetLicenses();
Assert.True(result.Count > 2);
Assert.Contains(result, license => license.Key == "mit");
}
}
public class TheGetLicenseMethod
{
[IntegrationTest]
public async Task CanRetrieveListOfLicenses()
{
var github = Helper.GetAuthenticatedClient();
var result = await github.Miscellaneous.GetLicense("mit");
Assert.Equal("mit", result.Key);
Assert.Equal("MIT License", result.Name);
}
}
}

View File

@@ -222,7 +222,7 @@ public class PullRequestReviewCommentsClientTests : IDisposable
async Task<Repository> CreateRepository(string repoName)
{
return await _gitHubClient.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
return await _gitHubClient.Repository.Create(new NewRepository(repoName) { AutoInit = true });
}
/// <summary>

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Octokit;
using Octokit.Tests.Integration;
@@ -13,6 +14,7 @@ public class PullRequestsClientTests : IDisposable
readonly IRepositoryCommentsClient _repositoryCommentsClient;
const string branchName = "my-branch";
const string otherBranchName = "my-other-branch";
public PullRequestsClientTests()
{
@@ -23,7 +25,7 @@ public class PullRequestsClientTests : IDisposable
var repoName = Helper.MakeNameWithTimestamp("source-repo");
_repository = _client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = _client.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
}
[IntegrationTest]
@@ -129,6 +131,47 @@ public class PullRequestsClientTests : IDisposable
Assert.Equal(1, pullRequests.Count);
}
[IntegrationTest]
public async Task CanSortPullRequests()
{
await CreateTheWorld();
var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
var pullRequest = await _fixture.Create(Helper.UserName, _repository.Name, newPullRequest);
var newPullRequest2 = new NewPullRequest("another pull request", otherBranchName, "master");
var anotherPullRequest = await _fixture.Create(Helper.UserName, _repository.Name, newPullRequest2);
var updatePullRequest = new PullRequestUpdate { Body = "This is the body" };
await _fixture.Update(Helper.UserName, _repository.Name, pullRequest.Number, updatePullRequest);
var sortPullRequestsByUpdated = new PullRequestRequest { SortProperty = PullRequestSort.Updated, SortDirection = SortDirection.Ascending };
var pullRequests = await _fixture.GetForRepository(Helper.UserName, _repository.Name, sortPullRequestsByUpdated);
Assert.Equal(anotherPullRequest.Title, pullRequests[0].Title);
var sortPullRequestsByLongRunning = new PullRequestRequest { SortProperty = PullRequestSort.LongRunning };
var pullRequestsByLongRunning = await _fixture.GetForRepository(Helper.UserName, _repository.Name, sortPullRequestsByLongRunning);
Assert.Equal(pullRequest.Title, pullRequestsByLongRunning[0].Title);
}
[IntegrationTest]
public async Task CanSpecifyDirectionOfSort()
{
await CreateTheWorld();
var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
var pullRequest = await _fixture.Create(Helper.UserName, _repository.Name, newPullRequest);
var newPullRequest2 = new NewPullRequest("another pull request", otherBranchName, "master");
var anotherPullRequest = await _fixture.Create(Helper.UserName, _repository.Name, newPullRequest2);
var pullRequests = await _fixture.GetForRepository(Helper.UserName, _repository.Name, new PullRequestRequest { SortDirection = SortDirection.Ascending });
Assert.Equal(pullRequest.Title, pullRequests[0].Title);
var pullRequestsDescending = await _fixture.GetForRepository(Helper.UserName, _repository.Name, new PullRequestRequest());
Assert.Equal(anotherPullRequest.Title, pullRequestsDescending[0].Title);
}
[IntegrationTest]
public async Task IsNotMergedInitially()
{
@@ -218,6 +261,30 @@ public class PullRequestsClientTests : IDisposable
Assert.Equal(1, result[1].Commit.CommentCount);
}
[IntegrationTest]
public async Task CanBrowseFiles()
{
var expectedFiles = new List<PullRequestFile>
{
new PullRequestFile(null, "Octokit.Tests.Integration/Clients/ReferencesClientTests.cs", null, 8, 3, 11, null, null, null, null),
new PullRequestFile(null, "Octokit/Clients/ApiPagination.cs", null, 21, 6, 27, null, null, null, null),
new PullRequestFile(null, "Octokit/Helpers/IApiPagination.cs", null, 1, 1, 2, null, null, null, null),
new PullRequestFile(null, "Octokit/Http/ApiConnection.cs", null, 1, 1, 2, null, null, null, null)
};
var result = await _fixture.Files("octokit", "octokit.net", 288);
Assert.Equal(4, result.Count);
Assert.True(expectedFiles.All(expectedFile => result.Any(file => file.FileName.Equals(expectedFile.FileName))));
foreach (var file in result)
{
var expectedFile = expectedFiles.Find(prf => file.FileName.Equals(prf.FileName));
Assert.Equal(expectedFile.Changes, file.Changes);
Assert.Equal(expectedFile.Additions, file.Additions);
Assert.Equal(expectedFile.Deletions, file.Deletions);
}
}
async Task CreateTheWorld()
{
var master = await _client.GitDatabase.Reference.Get(Helper.UserName, _repository.Name, "heads/master");
@@ -235,6 +302,11 @@ public class PullRequestsClientTests : IDisposable
// create branch
await _client.GitDatabase.Reference.Create(Helper.UserName, _repository.Name, new NewReference("refs/heads/my-branch", featureBranchCommit.Sha));
var otherFeatureBranchTree = await CreateTree(new Dictionary<string, string> { { "README.md", "I am overwriting this blob with something else" } });
var otherFeatureBranchCommit = await CreateCommit("this is the other commit to merge into the other pull request", otherFeatureBranchTree.Sha, newMaster.Sha);
await _client.GitDatabase.Reference.Create(Helper.UserName, _repository.Name, new NewReference("refs/heads/my-other-branch", otherFeatureBranchCommit.Sha));
}
async Task<TreeResponse> CreateTree(IEnumerable<KeyValuePair<string, string>> treeContents)

View File

@@ -20,7 +20,7 @@ public class ReferencesClientTests : IDisposable
_fixture = _client.GitDatabase.Reference;
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = _client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = _client.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_owner = _repository.Owner.Login;
}

View File

@@ -22,7 +22,7 @@ public class ReleasesClientTests
_releaseClient = github.Release;
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = github.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_repositoryOwner = _repository.Owner.Login;
_repositoryName = _repository.Name;
}
@@ -69,7 +69,7 @@ public class ReleasesClientTests
_releaseClient = github.Release;
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = github.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_repositoryOwner = _repository.Owner.Login;
_repositoryName = _repository.Name;
}
@@ -133,7 +133,7 @@ public class ReleasesClientTests
_releaseClient = _github.Release;
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = _github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = _github.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_repositoryOwner = _repository.Owner.Login;
_repositoryName = _repository.Name;
}

View File

@@ -17,7 +17,7 @@ public class RepositoriesClientTests
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
var createdRepository = await github.Repository.Create(new NewRepository { Name = repoName });
var createdRepository = await github.Repository.Create(new NewRepository(repoName));
try
{
@@ -58,9 +58,8 @@ public class RepositoriesClientTests
try
{
createdRepository = await github.Repository.Create(new NewRepository
createdRepository = await github.Repository.Create(new NewRepository(repoName)
{
Name = repoName,
Private = true
});
@@ -84,9 +83,8 @@ public class RepositoriesClientTests
var repoName = Helper.MakeNameWithTimestamp("repo-without-downloads");
var createdRepository = await github.Repository.Create(new NewRepository
var createdRepository = await github.Repository.Create(new NewRepository(repoName)
{
Name = repoName,
HasDownloads = false
});
@@ -109,9 +107,8 @@ public class RepositoriesClientTests
var repoName = Helper.MakeNameWithTimestamp("repo-without-issues");
var createdRepository = await github.Repository.Create(new NewRepository
var createdRepository = await github.Repository.Create(new NewRepository(repoName)
{
Name = repoName,
HasIssues = false
});
@@ -134,9 +131,8 @@ public class RepositoriesClientTests
var repoName = Helper.MakeNameWithTimestamp("repo-without-wiki");
var createdRepository = await github.Repository.Create(new NewRepository
var createdRepository = await github.Repository.Create(new NewRepository(repoName)
{
Name = repoName,
HasWiki = false
});
@@ -159,9 +155,8 @@ public class RepositoriesClientTests
var repoName = Helper.MakeNameWithTimestamp("repo-with-description");
var createdRepository = await github.Repository.Create(new NewRepository
var createdRepository = await github.Repository.Create(new NewRepository(repoName)
{
Name = repoName,
Description = "theDescription"
});
@@ -184,9 +179,8 @@ public class RepositoriesClientTests
var repoName = Helper.MakeNameWithTimestamp("repo-with-homepage");
var createdRepository = await github.Repository.Create(new NewRepository
var createdRepository = await github.Repository.Create(new NewRepository(repoName)
{
Name = repoName,
Homepage = "http://aUrl.to/nowhere"
});
@@ -209,9 +203,8 @@ public class RepositoriesClientTests
var repoName = Helper.MakeNameWithTimestamp("repo-with-autoinit");
var createdRepository = await github.Repository.Create(new NewRepository
var createdRepository = await github.Repository.Create(new NewRepository(repoName)
{
Name = repoName,
AutoInit = true
});
@@ -234,9 +227,8 @@ public class RepositoriesClientTests
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("repo-with-gitignore");
var createdRepository = await github.Repository.Create(new NewRepository
var createdRepository = await github.Repository.Create(new NewRepository(repoName)
{
Name = repoName,
AutoInit = true,
GitignoreTemplate = "VisualStudio"
});
@@ -259,7 +251,7 @@ public class RepositoriesClientTests
{
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("existing-repo");
var repository = new NewRepository { Name = repoName };
var repository = new NewRepository(repoName);
var createdRepository = await github.Repository.Create(repository);
try
@@ -298,7 +290,7 @@ public class RepositoriesClientTests
.Select(x =>
{
var repoName = Helper.MakeNameWithTimestamp("private-repo-" + x);
var repository = new NewRepository { Name = repoName, Private = true };
var repository = new NewRepository(repoName) { Private = true };
return github.Repository.Create(repository);
});
@@ -307,7 +299,7 @@ public class RepositoriesClientTests
try
{
await Assert.ThrowsAsync<PrivateRepositoryQuotaExceededException>(
() => github.Repository.Create(new NewRepository { Name = "x-private", Private = true }));
() => github.Repository.Create(new NewRepository("x-private") { Private = true }));
}
finally
{
@@ -328,7 +320,7 @@ public class RepositoriesClientTests
var repoName = Helper.MakeNameWithTimestamp("public-org-repo");
var createdRepository = await github.Repository.Create(Helper.Organization, new NewRepository { Name = repoName });
var createdRepository = await github.Repository.Create(Helper.Organization, new NewRepository(repoName));
try
{
@@ -358,7 +350,7 @@ public class RepositoriesClientTests
var repoName = Helper.MakeNameWithTimestamp("existing-org-repo");
var repository = new NewRepository { Name = repoName };
var repository = new NewRepository(repoName);
var createdRepository = await github.Repository.Create(Helper.Organization, repository);
try
@@ -394,7 +386,7 @@ public class RepositoriesClientTests
{
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = await github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
_repository = await github.Repository.Create(new NewRepository(repoName) { AutoInit = true });
var updatedName = Helper.MakeNameWithTimestamp("updated-repo");
var update = new RepositoryUpdate { Name = updatedName };
@@ -408,7 +400,7 @@ public class RepositoriesClientTests
{
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = await github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
_repository = await github.Repository.Create(new NewRepository(repoName) { AutoInit = true });
var update = new RepositoryUpdate { Name = repoName, Description = "Updated description" };
_repository = await github.Repository.Edit(Helper.UserName, repoName, update);
@@ -421,7 +413,7 @@ public class RepositoriesClientTests
{
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = await github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
_repository = await github.Repository.Create(new NewRepository(repoName) { AutoInit = true });
var update = new RepositoryUpdate { Name = repoName, Homepage = "http://aUrl.to/nowhere" };
_repository = await github.Repository.Edit(Helper.UserName, repoName, update);
@@ -441,7 +433,7 @@ public class RepositoriesClientTests
}
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = await github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
_repository = await github.Repository.Create(new NewRepository(repoName) { AutoInit = true });
var update = new RepositoryUpdate { Name = repoName, Private = true };
_repository = await github.Repository.Edit(Helper.UserName, repoName, update);
@@ -454,7 +446,7 @@ public class RepositoriesClientTests
{
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = await github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
_repository = await github.Repository.Create(new NewRepository(repoName) { AutoInit = true });
var update = new RepositoryUpdate { Name = repoName, HasDownloads = false };
_repository = await github.Repository.Edit(Helper.UserName, repoName, update);
@@ -467,7 +459,7 @@ public class RepositoriesClientTests
{
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = await github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
_repository = await github.Repository.Create(new NewRepository(repoName) { AutoInit = true });
var update = new RepositoryUpdate { Name = repoName, HasIssues = false };
_repository = await github.Repository.Edit(Helper.UserName, repoName, update);
@@ -480,7 +472,7 @@ public class RepositoriesClientTests
{
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = await github.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
_repository = await github.Repository.Create(new NewRepository(repoName) { AutoInit = true });
var update = new RepositoryUpdate { Name = repoName, HasWiki = false };
_repository = await github.Repository.Edit(Helper.UserName, repoName, update);
@@ -502,7 +494,7 @@ public class RepositoriesClientTests
var github = Helper.GetAuthenticatedClient();
var repoName = Helper.MakeNameWithTimestamp("repo-to-delete");
await github.Repository.Create(new NewRepository { Name = repoName });
await github.Repository.Create(new NewRepository(repoName));
await github.Repository.Delete(Helper.UserName, repoName);
}
@@ -575,33 +567,6 @@ public class RepositoriesClientTests
}
}
public class TheGetReadmeMethod
{
[IntegrationTest]
public async Task ReturnsReadmeForSeeGit()
{
var github = Helper.GetAuthenticatedClient();
var readme = await github.Repository.GetReadme("octokit", "octokit.net");
Assert.Equal("README.md", readme.Name);
string readMeHtml = await readme.GetHtmlContent();
Assert.True(readMeHtml.StartsWith("<div class="));
Assert.Contains(@"data-path=""README.md"" id=""file""", readMeHtml);
Assert.Contains("Octokit - GitHub API Client Library for .NET", readMeHtml);
}
[IntegrationTest]
public async Task ReturnsReadmeHtmlForSeeGit()
{
var github = Helper.GetAuthenticatedClient();
var readmeHtml = await github.Repository.GetReadmeHtml("octokit", "octokit.net");
Assert.True(readmeHtml.StartsWith("<div class="));
Assert.Contains(@"data-path=""README.md"" id=""readme""", readmeHtml);
Assert.Contains("Octokit - GitHub API Client Library for .NET", readmeHtml);
}
}
public class TheGetAllContributorsMethod
{
[IntegrationTest]

View File

@@ -92,7 +92,7 @@ public class RepositoryCommitsClientTests
var repoName = Helper.MakeNameWithTimestamp("source-repo");
_repository = _client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = _client.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
}
[IntegrationTest]

View File

@@ -90,7 +90,7 @@ namespace Octokit.Tests.Integration.Clients
{
var fixture = client.Repository.Content;
var repoName = Helper.MakeNameWithTimestamp("source-repo");
repository = await client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
repository = await client.Repository.Create(new NewRepository(repoName) { AutoInit = true });
var file = await fixture.CreateFile(
repository.Owner.Login,

View File

@@ -19,7 +19,7 @@ public class RepositoryDeployKeysClientTests : IDisposable
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_fixture = client.Repository.DeployKeys;
_repository = client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = client.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_owner = _repository.Owner.Login;
}

View File

@@ -83,7 +83,7 @@ namespace Octokit.Tests.Integration.Clients
async Task<RepositorySummary> CreateRepository()
{
var repoName = Helper.MakeNameWithTimestamp("public-repo");
var repository = await _client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true });
var repository = await _client.Repository.Create(new NewRepository(repoName) { AutoInit = true });
return new RepositorySummary
{
Owner = repository.Owner.Login,

View File

@@ -18,7 +18,7 @@ public class TreeClientTests : IDisposable
_fixture = _client.GitDatabase.Tree;
var repoName = Helper.MakeNameWithTimestamp("public-repo");
_repository = _client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
_repository = _client.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_owner = _repository.Owner.Login;
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Security.Policy;
namespace Octokit.Tests.Integration
{
@@ -25,6 +26,17 @@ namespace Octokit.Tests.Integration
return new Credentials(githubUsername, githubPassword);
});
static readonly Lazy<Credentials> _oauthApplicationCredentials = new Lazy<Credentials>(() =>
{
var applicationClientId = ClientId;
var applicationClientSecret = ClientSecret;
if (applicationClientId == null || applicationClientSecret == null)
return null;
return new Credentials(applicationClientId, applicationClientSecret);
});
static Helper()
{
// Force reading of environment variables.
@@ -38,6 +50,8 @@ namespace Octokit.Tests.Integration
public static Credentials Credentials { get { return _credentialsThunk.Value; }}
public static Credentials ApplicationCredentials { get { return _oauthApplicationCredentials.Value; } }
public static bool IsPaidAccount
{
get
@@ -97,6 +111,14 @@ namespace Octokit.Tests.Integration
};
}
public static GitHubClient GetAuthenticatedApplicationClient()
{
return new GitHubClient(new ProductHeaderValue("OctokitTests"))
{
Credentials = ApplicationCredentials
};
}
public static IGitHubClient GetAnonymousClient()
{
return new GitHubClient(new ProductHeaderValue("OctokitTests"));

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
using Xunit.Abstractions;
using Xunit.Sdk;
@@ -8,16 +9,23 @@ namespace Octokit.Tests.Integration
{
public class ApplicationTestDiscoverer : IXunitTestCaseDiscoverer
{
public IEnumerable<IXunitTestCase> Discover(ITestMethod testMethod, IAttributeInfo factAttribute)
readonly IMessageSink diagnosticMessageSink;
public ApplicationTestDiscoverer(IMessageSink diagnosticMessageSink)
{
this.diagnosticMessageSink = diagnosticMessageSink;
}
public IEnumerable<IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute)
{
if (String.IsNullOrWhiteSpace(Helper.ClientId)
&& String.IsNullOrWhiteSpace(Helper.ClientSecret))
{
yield return new SkipTestCase(testMethod,
"Environment variables are not set for this test - set OCTOKIT_CLIENTID and OCTOKIT_CLIENTSECRET");
return Enumerable.Empty<IXunitTestCase>();
}
yield return new XunitTestCase(testMethod);
return new[] { new XunitTestCase(diagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), testMethod) };
}
}
@@ -25,13 +33,4 @@ namespace Octokit.Tests.Integration
public class ApplicationTestAttribute : FactAttribute
{
}
public class SkipTestCase : XunitTestCase
{
public SkipTestCase(ITestMethod testMethod, string skipReason)
: base(testMethod)
{
SkipReason = skipReason;
}
}
}

View File

@@ -8,11 +8,18 @@ namespace Octokit.Tests.Integration
{
public class IntegrationTestDiscoverer : IXunitTestCaseDiscoverer
{
public IEnumerable<IXunitTestCase> Discover(ITestMethod testMethod, IAttributeInfo factAttribute)
readonly IMessageSink diagnosticMessageSink;
public IntegrationTestDiscoverer(IMessageSink diagnosticMessageSink)
{
this.diagnosticMessageSink = diagnosticMessageSink;
}
public IEnumerable<IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute)
{
return Helper.Credentials == null
? Enumerable.Empty<IXunitTestCase>()
: new [] { new XunitTestCase(testMethod) };
: new[] { new XunitTestCase(diagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), testMethod) };
}
}

View File

@@ -8,16 +8,21 @@ namespace Octokit.Tests.Integration
{
public class OrganizationTestDiscoverer : IXunitTestCaseDiscoverer
{
public IEnumerable<IXunitTestCase> Discover(ITestMethod testMethod, IAttributeInfo factAttribute)
readonly IMessageSink diagnosticMessageSink;
public OrganizationTestDiscoverer(IMessageSink diagnosticMessageSink)
{
this.diagnosticMessageSink = diagnosticMessageSink;
}
public IEnumerable<IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute)
{
if (Helper.Organization == null)
{
return Enumerable.Empty<IXunitTestCase>();
}
else
{
return new [] { new XunitTestCase(testMethod) };
}
return new[] { new XunitTestCase(diagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), testMethod) };
}
}

View File

@@ -8,7 +8,14 @@ namespace Octokit.Tests.Integration
{
public class PaidAccountTestDiscoverer : IXunitTestCaseDiscoverer
{
public IEnumerable<IXunitTestCase> Discover(ITestMethod testMethod, IAttributeInfo factAttribute)
readonly IMessageSink diagnosticMessageSink;
public PaidAccountTestDiscoverer(IMessageSink diagnosticMessageSink)
{
this.diagnosticMessageSink = diagnosticMessageSink;
}
public IEnumerable<IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute)
{
if (Helper.Credentials == null)
return Enumerable.Empty<IXunitTestCase>();
@@ -16,7 +23,7 @@ namespace Octokit.Tests.Integration
if (!Helper.IsPaidAccount)
return Enumerable.Empty<IXunitTestCase>();
return new[] { new XunitTestCase(testMethod) };
return new[] { new XunitTestCase(diagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), testMethod) };
}
}

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" />
<Import Project="..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -13,7 +13,7 @@
<AssemblyName>Octokit.Tests.Integration</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<NuGetPackageImportStamp>89e72d09</NuGetPackageImportStamp>
<NuGetPackageImportStamp>884d959c</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -53,18 +53,20 @@
<Reference Include="System.Xml.Linq" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Xml" />
<Reference Include="xunit.abstractions">
<HintPath>..\packages\xunit.abstractions.2.0.0-beta5-build2785\lib\net35\xunit.abstractions.dll</HintPath>
<Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<HintPath>..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
</Reference>
<Reference Include="xunit.assert">
<HintPath>..\packages\xunit.assert.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monoandroid+monotouch10\xunit.assert.dll</HintPath>
</Reference>
<Reference Include="xunit.core">
<HintPath>..\packages\xunit.core.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monotouch+monoandroid\xunit.core.dll</HintPath>
</Reference>
<Reference Include="xunit.execution, Version=2.0.0.2785, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<Reference Include="xunit.assert, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.execution.dll</HintPath>
<HintPath>..\packages\xunit.assert.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll</HintPath>
</Reference>
<Reference Include="xunit.core, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll</HintPath>
</Reference>
<Reference Include="xunit.execution.desktop, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.extensibility.execution.2.0.0\lib\net45\xunit.execution.desktop.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
@@ -148,8 +150,8 @@
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props'))" />
<Error Condition="!Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -18,7 +18,7 @@ public class ObservableIssuesClientTests : IDisposable
_client = new ObservableIssuesClient(github);
_repoName = Helper.MakeNameWithTimestamp("public-repo");
var result = github.Repository.Create(new NewRepository { Name = _repoName }).Result;
var result = github.Repository.Create(new NewRepository(_repoName)).Result;
_createdRepository = result;
}

View File

@@ -21,7 +21,7 @@ public class ObservableRespositoryDeployKeysClientTests : IDisposable
_client = new ObservableRepositoryDeployKeysClient(github);
var repoName = Helper.MakeNameWithTimestamp("public-repo");
var result = github.Repository.Create(new NewRepository() { Name = repoName, AutoInit = true }).Result;
var result = github.Repository.Create(new NewRepository(repoName) { AutoInit = true }).Result;
_repository = result;
_owner = _repository.Owner.Login;
}

View File

@@ -14,6 +14,10 @@
<assemblyIdentity name="System.Reactive.Linq" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.1.30214.0" newVersion="2.1.30214.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="xunit.core" publicKeyToken="8d05b1bb7a6fdb6c" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.2880" newVersion="2.0.0.2880" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -3,9 +3,11 @@
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
<package id="xunit" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.core" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="0.99.9-build1021" targetFramework="net45" />
<package id="xunit" version="2.0.0" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0" targetFramework="net45" />
<package id="xunit.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.extensibility.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.extensibility.execution" version="2.0.0" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="2.0.0" targetFramework="net45" />
</packages>

View File

@@ -243,5 +243,114 @@ namespace Octokit.Tests.Clients
Args.String); // NOTE: preview API
}
}
public class TheCheckApplicationAuthenticationMethod
{
[Fact]
public async Task ChecksApplicationAuthenticateAtCorrectUrl()
{
var client = Substitute.For<IApiConnection>();
var authEndpoint = new AuthorizationsClient(client);
authEndpoint.CheckApplicationAuthentication("clientId", "accessToken");
client.Received().Get<ApplicationAuthorization>(
Arg.Is<Uri>(u => u.ToString() == "applications/clientId/tokens/accessToken"),
null,
Arg.Any<string>());
}
[Fact]
public async Task EnsuresArgumentsNotNull()
{
var client = Substitute.For<IApiConnection>();
var authEndpoint = new AuthorizationsClient(client);
await AssertEx.Throws<ArgumentNullException>(async () => await authEndpoint.CheckApplicationAuthentication(null, "accessToken"));
await AssertEx.Throws<ArgumentException>(async () => await authEndpoint.CheckApplicationAuthentication("", "accessToken"));
await AssertEx.Throws<ArgumentNullException>(async () => await authEndpoint.CheckApplicationAuthentication("clientId", null));
await AssertEx.Throws<ArgumentException>(async () => await authEndpoint.CheckApplicationAuthentication("clientId", ""));
}
}
public class TheResetApplicationAuthenticationMethod
{
[Fact]
public async Task ResetsApplicationAuthenticationAtCorrectUrl()
{
var client = Substitute.For<IApiConnection>();
var authEndpoint = new AuthorizationsClient(client);
authEndpoint.ResetApplicationAuthentication("clientId", "accessToken");
client.Received().Post<ApplicationAuthorization>(
Arg.Is<Uri>(u => u.ToString() == "applications/clientId/tokens/accessToken"),
Args.Object);
}
[Fact]
public async Task EnsuresArgumentsNotNull()
{
var client = Substitute.For<IApiConnection>();
var authEndpoint = new AuthorizationsClient(client);
await AssertEx.Throws<ArgumentNullException>(async () => await authEndpoint.ResetApplicationAuthentication(null, "accessToken"));
await AssertEx.Throws<ArgumentException>(async () => await authEndpoint.ResetApplicationAuthentication("", "accessToken"));
await AssertEx.Throws<ArgumentNullException>(async () => await authEndpoint.ResetApplicationAuthentication("clientId", null));
await AssertEx.Throws<ArgumentException>(async () => await authEndpoint.ResetApplicationAuthentication("clientId", ""));
}
}
public class TheRevokeApplicationAuthenticationMethod
{
[Fact]
public async Task RevokesApplicatonAuthenticationAtCorrectUrl()
{
var client = Substitute.For<IApiConnection>();
var authEndpoint = new AuthorizationsClient(client);
authEndpoint.RevokeApplicationAuthentication("clientId", "accessToken");
client.Received().Delete(
Arg.Is<Uri>(u => u.ToString() == "applications/clientId/tokens/accessToken"));
}
[Fact]
public async Task EnsuresArgumentsNotNull()
{
var client = Substitute.For<IApiConnection>();
var authEndpoint = new AuthorizationsClient(client);
await AssertEx.Throws<ArgumentNullException>(async () => await authEndpoint.RevokeApplicationAuthentication(null, "accessToken"));
await AssertEx.Throws<ArgumentException>(async () => await authEndpoint.RevokeApplicationAuthentication("", "accessToken"));
await AssertEx.Throws<ArgumentNullException>(async () => await authEndpoint.RevokeApplicationAuthentication("clientId", null));
await AssertEx.Throws<ArgumentException>(async () => await authEndpoint.RevokeApplicationAuthentication("clientId", ""));
}
}
public class TheRevokeAllApplicationAuthenticationsMethod
{
[Fact]
public async Task RevokesAllApplicationAuthenticationsAtCorrectUrl()
{
var client = Substitute.For<IApiConnection>();
var authEndpoint = new AuthorizationsClient(client);
authEndpoint.RevokeAllApplicationAuthentications("clientId");
client.Received().Delete(
Arg.Is<Uri>(u => u.ToString() == "applications/clientId/tokens"));
}
[Fact]
public async Task EnsuresArgumentsNotNull()
{
var client = Substitute.For<IApiConnection>();
var authEndpoint = new AuthorizationsClient(client);
await AssertEx.Throws<ArgumentNullException>(async () => await authEndpoint.RevokeAllApplicationAuthentications(null));
await AssertEx.Throws<ArgumentException>(async () => await authEndpoint.RevokeAllApplicationAuthentications(""));
}
}
}
}

View File

@@ -74,7 +74,7 @@ namespace Octokit.Tests.Clients
var connection = Substitute.For<IApiConnection>();
var client = new FollowersClient(connection);
client.GetFollowingForCurrent();
client.GetAllFollowingForCurrent();
connection.Received().GetAll<User>(Arg.Is<Uri>(u => u.ToString() == "user/following"));
}
@@ -88,7 +88,7 @@ namespace Octokit.Tests.Clients
var connection = Substitute.For<IApiConnection>();
var client = new FollowersClient(connection);
client.GetFollowing("alfhenrik");
client.GetAllFollowing("alfhenrik");
connection.Received().GetAll<User>(Arg.Is<Uri>(u => u.ToString() == "users/alfhenrik/following"));
}
@@ -99,8 +99,8 @@ namespace Octokit.Tests.Clients
var connection = Substitute.For<IApiConnection>();
var client = new FollowersClient(connection);
await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetFollowing(null));
await Assert.ThrowsAsync<ArgumentException>(() => client.GetFollowing(""));
await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAllFollowing(null));
await Assert.ThrowsAsync<ArgumentException>(() => client.GetAllFollowing(""));
}
}

View File

@@ -58,10 +58,12 @@ namespace Octokit.Tests.Clients
client.GetForRepository("fake", "repo", new PullRequestRequest { Head = "user:ref-head", Base = "fake_base_branch"});
connection.Received().GetAll<PullRequest>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/pulls"),
Arg.Is<Dictionary<string, string>>(d => d.Count == 3
Arg.Is<Dictionary<string, string>>(d => d.Count == 5
&& d["head"] == "user:ref-head"
&& d["state"] == "open"
&& d["base"] == "fake_base_branch"));
&& d["base"] == "fake_base_branch"
&& d["sort"] == "created"
&& d["direction"] == "desc"));
}
}
@@ -219,6 +221,33 @@ namespace Octokit.Tests.Clients
}
}
public class TheFilesMethod
{
[Fact]
public async Task RequestsCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new PullRequestsClient(connection);
await client.Files("fake", "repo", 42);
connection.Received()
.GetAll<PullRequestFile>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/pulls/42/files"));
}
[Fact]
public async Task EnsuresArgumentsNotNull()
{
var connection = Substitute.For<IApiConnection>();
var client = new PullRequestsClient(connection);
await AssertEx.Throws<ArgumentNullException>(() => client.Files(null, "name", 1));
await AssertEx.Throws<ArgumentNullException>(() => client.Files("owner", null, 1));
await AssertEx.Throws<ArgumentException>(() => client.Files("", "name", 1));
await AssertEx.Throws<ArgumentException>(() => client.Files("owner", "", 1));
}
}
public class TheCtor
{
[Fact]

View File

@@ -31,7 +31,6 @@ namespace Octokit.Tests.Clients
var client = new RepositoriesClient(Substitute.For<IApiConnection>());
await AssertEx.Throws<ArgumentNullException>(async () => await client.Create(null));
await AssertEx.Throws<ArgumentException>(async () => await client.Create(new NewRepository { Name = null }));
}
[Fact]
@@ -40,7 +39,7 @@ namespace Octokit.Tests.Clients
var connection = Substitute.For<IApiConnection>();
var client = new RepositoriesClient(connection);
client.Create(new NewRepository { Name = "aName" });
client.Create(new NewRepository("aName"));
connection.Received().Post<Repository>(Arg.Is<Uri>(u => u.ToString() == "user/repos"), Arg.Any<NewRepository>());
}
@@ -50,7 +49,7 @@ namespace Octokit.Tests.Clients
{
var connection = Substitute.For<IApiConnection>();
var client = new RepositoriesClient(connection);
var newRepository = new NewRepository { Name = "aName" };
var newRepository = new NewRepository("aName");
client.Create(newRepository);
@@ -60,7 +59,7 @@ namespace Octokit.Tests.Clients
[Fact]
public async Task ThrowsRepositoryExistsExceptionWhenRepositoryExistsForCurrentUser()
{
var newRepository = new NewRepository { Name = "aName" };
var newRepository = new NewRepository("aName");
var response = Substitute.For<IResponse>();
response.StatusCode.Returns((HttpStatusCode)422);
response.Body.Returns(@"{""message"":""Validation Failed"",""documentation_url"":"
@@ -86,7 +85,7 @@ namespace Octokit.Tests.Clients
[Fact]
public async Task ThrowsExceptionWhenPrivateRepositoryQuotaExceeded()
{
var newRepository = new NewRepository { Name = "aName", Private = true };
var newRepository = new NewRepository("aName") { Private = true };
var response = Substitute.For<IResponse>();
response.StatusCode.Returns((HttpStatusCode)422);
response.Body.Returns(@"{""message"":""Validation Failed"",""documentation_url"":"
@@ -115,9 +114,8 @@ namespace Octokit.Tests.Clients
{
var client = new RepositoriesClient(Substitute.For<IApiConnection>());
await AssertEx.Throws<ArgumentNullException>(async () => await client.Create(null, new NewRepository { Name = "aName" }));
await AssertEx.Throws<ArgumentNullException>(async () => await client.Create(null, new NewRepository("aName")));
await AssertEx.Throws<ArgumentException>(async () => await client.Create("aLogin", null));
await AssertEx.Throws<ArgumentException>(async () => await client.Create("aLogin", new NewRepository { Name = null }));
}
[Fact]
@@ -126,7 +124,7 @@ namespace Octokit.Tests.Clients
var connection = Substitute.For<IApiConnection>();
var client = new RepositoriesClient(connection);
await client.Create("theLogin", new NewRepository { Name = "aName" });
await client.Create("theLogin", new NewRepository("aName"));
connection.Received().Post<Repository>(
Arg.Is<Uri>(u => u.ToString() == "orgs/theLogin/repos"),
@@ -138,7 +136,7 @@ namespace Octokit.Tests.Clients
{
var connection = Substitute.For<IApiConnection>();
var client = new RepositoriesClient(connection);
var newRepository = new NewRepository { Name = "aName" };
var newRepository = new NewRepository("aName");
await client.Create("aLogin", newRepository);
@@ -148,7 +146,7 @@ namespace Octokit.Tests.Clients
[Fact]
public async Task ThrowsRepositoryExistsExceptionWhenRepositoryExistsForSpecifiedOrg()
{
var newRepository = new NewRepository { Name = "aName" };
var newRepository = new NewRepository("aName");
var response = Substitute.For<IResponse>();
response.StatusCode.Returns((HttpStatusCode)422);
response.Body.Returns(@"{""message"":""Validation Failed"",""documentation_url"":"
@@ -174,7 +172,7 @@ namespace Octokit.Tests.Clients
[Fact]
public async Task ThrowsValidationException()
{
var newRepository = new NewRepository { Name = "aName" };
var newRepository = new NewRepository("aName");
var response = Substitute.For<IResponse>();
response.StatusCode.Returns((HttpStatusCode)422);
response.Body.Returns(@"{""message"":""Validation Failed"",""documentation_url"":"
@@ -194,7 +192,7 @@ namespace Octokit.Tests.Clients
[Fact]
public async Task ThrowsRepositoryExistsExceptionForEnterpriseInstance()
{
var newRepository = new NewRepository { Name = "aName" };
var newRepository = new NewRepository("aName");
var response = Substitute.For<IResponse>();
response.StatusCode.Returns((HttpStatusCode)422);
response.Body.Returns(@"{""message"":""Validation Failed"",""documentation_url"":"

View File

@@ -60,7 +60,7 @@ namespace Octokit.Tests.Clients
statisticsClient.GetCommitActivity("username", "repositoryName");
client.Received().GetQueuedOperation<IEnumerable<WeeklyCommitActivity>>(expectedEndPoint, Args.CancellationToken);
client.Received().GetQueuedOperation<IReadOnlyList<WeeklyCommitActivity>>(expectedEndPoint, Args.CancellationToken);
}
[Fact]

View File

@@ -55,5 +55,14 @@ namespace Octokit.Tests.Helpers
// The collection == null case is for .NET 4.0
Assert.True(instance is IReadOnlyList<T> && (collection == null || collection.IsReadOnly));
}
public static void IsReadOnlyCollection(Type type)
{
var isReadOnlyList = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IReadOnlyList<>);
var isReadOnlyDictionary = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IReadOnlyDictionary<,>);
Assert.True(isReadOnlyList || isReadOnlyDictionary);
}
}
}

View File

@@ -0,0 +1,94 @@
using System.Linq;
using Octokit;
using Octokit.Internal;
using Xunit;
public class IssueEventTests
{
[Fact]
public void CanDeserializeAnUnsubscribedIssueEvent()
{
const string json = @"{
""id"": 42,
""url"": ""https://api.github.com/repos/octocat/Hello-World/issues/events/42"",
""actor"": {
""login"": ""octocat"",
""id"": 1060,
""avatar_url"": ""https://avatars.githubusercontent.com/u/1?v=3"",
""gravatar_id"": """",
""url"": ""https://api.github.com/users/octocat"",
""html_url"": ""https://github.com/octocat"",
""followers_url"": ""https://api.github.com/users/octocat/followers"",
""following_url"": ""https://api.github.com/users/octocat/following{/other_user}"",
""gists_url"": ""https://api.github.com/users/octocat/gists{/gist_id}"",
""starred_url"": ""https://api.github.com/users/octocat/starred{/owner}{/repo}"",
""subscriptions_url"": ""https://api.github.com/users/octocat/subscriptions"",
""organizations_url"": ""https://api.github.com/users/octocat/orgs"",
""repos_url"": ""https://api.github.com/users/octocat/repos"",
""events_url"": ""https://api.github.com/users/octocat/events{/privacy}"",
""received_events_url"": ""https://api.github.com/users/octocat/received_events"",
""type"": ""User"",
""site_admin"": false
},
""event"": ""unsubscribed"",
""commit_id"": null,
""created_at"": ""2014-07-16T15:41:42Z"",
""issue"": {
""url"": ""https://api.github.com/repos/octocat/Hello-World/issues/1205"",
""labels_url"": ""https://api.github.com/repos/octocat/Hello-World/issues/1205/labels{/name}"",
""comments_url"": ""https://api.github.com/repos/octocat/Hello-World/issues/1205/comments"",
""events_url"": ""https://api.github.com/repos/octocat/Hello-World/issues/1205/events"",
""html_url"": ""https://github.com/octocat/Hello-World/issues/1205"",
""id"": 37995243,
""number"": 1205,
""title"": ""settings icon should not be visible on sidebar if you are not a collaborator for public repos (and should not be accessible at /settings)"",
""user"": {
""login"": ""ashumz"",
""id"": 100216,
""avatar_url"": ""https://avatars.githubusercontent.com/u/6?v=3"",
""gravatar_id"": """",
""url"": ""https://api.github.com/users/octocat"",
""html_url"": ""https://github.com/octocat"",
""followers_url"": ""https://api.github.com/users/octocat/followers"",
""following_url"": ""https://api.github.com/users/octocat/following{/other_user}"",
""gists_url"": ""https://api.github.com/users/octocat/gists{/gist_id}"",
""starred_url"": ""https://api.github.com/users/octocat/starred{/owner}{/repo}"",
""subscriptions_url"": ""https://api.github.com/users/octocat/subscriptions"",
""organizations_url"": ""https://api.github.com/users/octocat/orgs"",
""repos_url"": ""https://api.github.com/users/octocat/repos"",
""events_url"": ""https://api.github.com/users/octocat/events{/privacy}"",
""received_events_url"": ""https://api.github.com/users/octocat/received_events"",
""type"": ""User"",
""site_admin"": false
},
""labels"": [
{
""url"": ""https://api.github.com/repos/octocat/Hello-World/labels/bug"",
""name"": ""bug"",
""color"": ""fc2929""
},
{
""url"": ""https://api.github.com/repos/octocat/Hello-World/labels/waffle:ready"",
""name"": ""octocat:ready"",
""color"": ""00c5fe""
}
],
""state"": ""closed"",
""locked"": false,
""assignee"": null,
""milestone"": null,
""comments"": 0,
""created_at"": ""2014-07-16T15:39:21Z"",
""updated_at"": ""2014-07-16T22:16:37Z"",
""closed_at"": ""2014-07-16T22:16:37Z"",
""body"": ""body content""
}
}";
var serializer = new SimpleJsonSerializer();
var issueEvent = serializer.Deserialize<IssueEvent>(json);
Assert.NotNull(issueEvent);
Assert.Equal(EventInfoState.Unsubscribed, issueEvent.Event);
}
}

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" />
<Import Project="..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -13,7 +13,7 @@
<AssemblyName>Octokit.Tests-NetCore45</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<NuGetPackageImportStamp>42c4ff23</NuGetPackageImportStamp>
<NuGetPackageImportStamp>f3747da2</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -45,14 +45,16 @@
<Reference Include="System.Net.Http" />
<Reference Include="System.XML" />
<Reference Include="System.Xml.Linq" />
<Reference Include="xunit.abstractions">
<HintPath>..\packages\xunit.abstractions.2.0.0-beta5-build2785\lib\net35\xunit.abstractions.dll</HintPath>
<Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<HintPath>..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
</Reference>
<Reference Include="xunit.assert">
<HintPath>..\packages\xunit.assert.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monoandroid+monotouch10\xunit.assert.dll</HintPath>
<Reference Include="xunit.assert, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.assert.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll</HintPath>
</Reference>
<Reference Include="xunit.core">
<HintPath>..\packages\xunit.core.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monotouch+monoandroid\xunit.core.dll</HintPath>
<Reference Include="xunit.core, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
@@ -128,6 +130,7 @@
<Compile Include="Models\DeploymentStatusTests.cs" />
<Compile Include="Models\DeploymentTests.cs" />
<Compile Include="Models\GistTests.cs" />
<Compile Include="Models\IssueEventTests.cs" />
<Compile Include="Models\IssueRequestTests.cs" />
<Compile Include="Models\IssueTest.cs" />
<Compile Include="Models\MilestoneRequestTests.cs" />
@@ -178,8 +181,8 @@
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props'))" />
<Error Condition="!Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" />
<Import Project="..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -13,7 +13,7 @@
<AssemblyName>Octokit.Tests-Portable</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<NuGetPackageImportStamp>6b300e8a</NuGetPackageImportStamp>
<NuGetPackageImportStamp>2ac0e5a7</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -45,14 +45,16 @@
<Reference Include="System.Net.Http" />
<Reference Include="System.XML" />
<Reference Include="System.Xml.Linq" />
<Reference Include="xunit.abstractions">
<HintPath>..\packages\xunit.abstractions.2.0.0-beta5-build2785\lib\net35\xunit.abstractions.dll</HintPath>
<Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<HintPath>..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
</Reference>
<Reference Include="xunit.assert">
<HintPath>..\packages\xunit.assert.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monoandroid+monotouch10\xunit.assert.dll</HintPath>
<Reference Include="xunit.assert, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.assert.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll</HintPath>
</Reference>
<Reference Include="xunit.core">
<HintPath>..\packages\xunit.core.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monotouch+monoandroid\xunit.core.dll</HintPath>
<Reference Include="xunit.core, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
@@ -126,6 +128,7 @@
<Compile Include="Models\DeploymentStatusTests.cs" />
<Compile Include="Models\DeploymentTests.cs" />
<Compile Include="Models\GistTests.cs" />
<Compile Include="Models\IssueEventTests.cs" />
<Compile Include="Models\IssueRequestTests.cs" />
<Compile Include="Models\IssueTest.cs" />
<Compile Include="Models\MilestoneRequestTests.cs" />
@@ -176,8 +179,8 @@
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props'))" />
<Error Condition="!Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" />
<Import Project="..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props" Condition="Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -13,7 +13,7 @@
<AssemblyName>Octokit.Tests</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<NuGetPackageImportStamp>f1b9719f</NuGetPackageImportStamp>
<NuGetPackageImportStamp>525bf01a</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -57,14 +57,16 @@
</Reference>
<Reference Include="System.XML" />
<Reference Include="System.Xml.Linq" />
<Reference Include="xunit.abstractions">
<HintPath>..\packages\xunit.abstractions.2.0.0-beta5-build2785\lib\net35\xunit.abstractions.dll</HintPath>
<Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<HintPath>..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
</Reference>
<Reference Include="xunit.assert">
<HintPath>..\packages\xunit.assert.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monoandroid+monotouch10\xunit.assert.dll</HintPath>
<Reference Include="xunit.assert, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.assert.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll</HintPath>
</Reference>
<Reference Include="xunit.core">
<HintPath>..\packages\xunit.core.2.0.0-beta5-build2785\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monotouch+monoandroid\xunit.core.dll</HintPath>
<Reference Include="xunit.core, Version=2.0.0.2929, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
@@ -144,6 +146,7 @@
<Compile Include="Models\DeploymentStatusTests.cs" />
<Compile Include="Models\DeploymentTests.cs" />
<Compile Include="Models\GistTests.cs" />
<Compile Include="Models\IssueEventTests.cs" />
<Compile Include="Models\IssueTest.cs" />
<Compile Include="Models\NewReferenceTests.cs" />
<Compile Include="Models\MilestoneRequestTests.cs" />
@@ -218,8 +221,8 @@
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0-beta5-build2785\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.0.99.9-build1021\build\net20\xunit.runner.visualstudio.props'))" />
<Error Condition="!Exists('..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.core.2.0.0\build\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.props'))" />
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.2.0.0\build\net20\xunit.runner.visualstudio.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -60,7 +60,7 @@ namespace Octokit.Tests.Reactive
var githubClient = Substitute.For<IGitHubClient>();
var client = new ObservableFollowersClient(githubClient);
client.GetFollowingForCurrent();
client.GetAllFollowingForCurrent();
githubClient.Connection.Received(1).Get<List<User>>(
new Uri("user/following", UriKind.Relative), null, null);
@@ -75,7 +75,7 @@ namespace Octokit.Tests.Reactive
var githubClient = Substitute.For<IGitHubClient>();
var client = new ObservableFollowersClient(githubClient);
client.GetFollowing("alfhenrik");
client.GetAllFollowing("alfhenrik");
githubClient.Connection.Received(1).Get<List<User>>(
new Uri("users/alfhenrik/following", UriKind.Relative), null, null);
@@ -86,8 +86,8 @@ namespace Octokit.Tests.Reactive
{
var client = new ObservableFollowersClient(Substitute.For<IGitHubClient>());
await AssertEx.Throws<ArgumentNullException>(async () => await client.GetFollowing(null));
await AssertEx.Throws<ArgumentException>(async () => await client.GetFollowing(""));
await AssertEx.Throws<ArgumentNullException>(async () => await client.GetAllFollowing(null));
await AssertEx.Throws<ArgumentException>(async () => await client.GetAllFollowing(""));
}
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Threading.Tasks;
using NSubstitute;
@@ -130,10 +131,12 @@ namespace Octokit.Tests.Reactive
);
var gitHubClient = Substitute.For<IGitHubClient>();
gitHubClient.Connection.Get<List<PullRequest>>(Arg.Is(firstPageUrl),
Arg.Is<Dictionary<string, string>>(d => d.Count == 3
Arg.Is<Dictionary<string, string>>(d => d.Count == 5
&& d["head"] == "user:ref-name"
&& d["state"] == "open"
&& d["base"] == "fake_base_branch"), Arg.Any<string>())
&& d["base"] == "fake_base_branch"
&& d["sort"] == "created"
&& d["direction"] == "desc"), Arg.Any<string>())
.Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => firstPageResponse));
gitHubClient.Connection.Get<List<PullRequest>>(secondPageUrl, null, null)
.Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => secondPageResponse));
@@ -276,7 +279,7 @@ namespace Octokit.Tests.Reactive
[Fact]
public async Task FetchesAllCommitsForPullRequest()
{
var commit = new PullRequestCommit(null, null, null, null, null, null, null, null);
var commit = new PullRequestCommit(null, null, null, null, null, Enumerable.Empty<GitReference>(), null, null);
var expectedUrl = string.Format("repos/fake/repo/pulls/42/commits");
var gitHubClient = Substitute.For<IGitHubClient>();
var connection = Substitute.For<IConnection>();
@@ -310,6 +313,44 @@ namespace Octokit.Tests.Reactive
}
}
public class TheFilesMethod
{
[Fact]
public async Task FetchesAllFilesForPullRequest()
{
var file = new PullRequestFile(null, null, null, 0, 0, 0, null, null, null, null);
var expectedUrl = string.Format("repos/fake/repo/pulls/42/files");
var gitHubClient = Substitute.For<IGitHubClient>();
var connection = Substitute.For<IConnection>();
IApiResponse<List<PullRequestFile>> response = new ApiResponse<List<PullRequestFile>>
(
new Response(),
new List<PullRequestFile> { file }
);
connection.Get<List<PullRequestFile>>(Args.Uri, null, null)
.Returns(Task.FromResult(response));
gitHubClient.Connection.Returns(connection);
var client = new ObservablePullRequestsClient(gitHubClient);
var files = await client.Files("fake", "repo", 42).ToList();
Assert.Equal(1, files.Count);
Assert.Same(file, files[0]);
connection.Received().Get<List<PullRequestFile>>(new Uri(expectedUrl, UriKind.Relative), null, null);
}
[Fact]
public async Task EnsuresArgumentsNotNull()
{
var connection = Substitute.For<IApiConnection>();
var client = new PullRequestsClient(connection);
await AssertEx.Throws<ArgumentNullException>(async () => await client.Files(null, "name", 1));
await AssertEx.Throws<ArgumentNullException>(async () => await client.Files("owner", null, 1));
await AssertEx.Throws<ArgumentException>(async () => await client.Files("", "name", 1));
await AssertEx.Throws<ArgumentException>(async () => await client.Files("owner", "", 1));
}
}
public class TheCtor
{
[Fact]

View File

@@ -4,9 +4,10 @@
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
<package id="xunit" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.core" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="0.99.9-build1021" targetFramework="net45" />
<package id="xunit" version="2.0.0" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0" targetFramework="net45" />
<package id="xunit.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.extensibility.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="2.0.0" targetFramework="net45" />
</packages>

View File

@@ -4,9 +4,10 @@
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
<package id="xunit" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.core" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="0.99.9-build1021" targetFramework="net45" />
<package id="xunit" version="2.0.0" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0" targetFramework="net45" />
<package id="xunit.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.extensibility.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="2.0.0" targetFramework="net45" />
</packages>

View File

@@ -4,9 +4,10 @@
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
<package id="xunit" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.core" version="2.0.0-beta5-build2785" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="0.99.9-build1021" targetFramework="net45" />
<package id="xunit" version="2.0.0" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
<package id="xunit.assert" version="2.0.0" targetFramework="net45" />
<package id="xunit.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.extensibility.core" version="2.0.0" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="2.0.0" targetFramework="net45" />
</packages>

View File

@@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Octokit.Tests.Integration",
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{CEC9D451-6291-4EDF-971A-D398144FBF96}"
ProjectSection(SolutionItems) = preProject
.gitattributes = .gitattributes
.gitignore = .gitignore
appveyor.yml = appveyor.yml
build.cmd = build.cmd
build.fsx = build.fsx
@@ -46,6 +48,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Octokit-Portable", "Octokit
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Octokit.Tests-Portable", "Octokit.Tests\Octokit.Tests-Portable.csproj", "{CBE29DDD-F15C-46CC-A250-E6ECF55BEED4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{DB068FD2-F54C-48EB-A6FD-1AC9EA3F8F57}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU

View File

@@ -176,6 +176,85 @@ namespace Octokit
}
}
/// <summary>
/// Checks the validity of an OAuth token without running afoul of normal rate limits for failed login attempts.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#check-an-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">Client ID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to check</param>
/// <returns>The valid <see cref="ApplicationAuthorization"/>.</returns>
public async Task<ApplicationAuthorization> CheckApplicationAuthentication(string clientId, string accessToken)
{
Ensure.ArgumentNotNullOrEmptyString(clientId, "clientId");
Ensure.ArgumentNotNullOrEmptyString(accessToken, "accessToken");
var endpoint = ApiUrls.ApplicationAuthorization(clientId, accessToken);
return await ApiConnection.Get<ApplicationAuthorization>(
endpoint,
null,
previewAcceptsHeader);
}
/// <summary>
/// Resets a valid OAuth token for an OAuth application without end user involvment.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to reset</param>
/// <returns>The valid <see cref="ApplicationAuthorization"/> with a new OAuth token</returns>
public async Task<ApplicationAuthorization> ResetApplicationAuthentication(string clientId, string accessToken)
{
Ensure.ArgumentNotNullOrEmptyString(clientId, "clientId");
Ensure.ArgumentNotNullOrEmptyString(accessToken, "accessToken");
var requestData = new { };
return await ApiConnection.Post<ApplicationAuthorization>(
ApiUrls.ApplicationAuthorization(clientId, accessToken), requestData);
}
/// <summary>
/// Revokes a single OAuth token for an OAuth application.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application">API documentation for more information.</a>
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to revoke</param>
/// <returns>A <see cref="Task"/> for the request's execution.</returns>
public Task RevokeApplicationAuthentication(string clientId, string accessToken)
{
Ensure.ArgumentNotNullOrEmptyString(clientId, "clientId");
Ensure.ArgumentNotNullOrEmptyString(accessToken, "accessToken");
return ApiConnection.Delete(
ApiUrls.ApplicationAuthorization(clientId, accessToken));
}
/// <summary>
/// Revokes every OAuth token for an OAuth application.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#revoke-all-authorizations-for-an-application">API documentation for more information.</a>
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <returns>A <see cref="Task"/> for the request's execution.</returns>
public Task RevokeAllApplicationAuthentications(string clientId)
{
Ensure.ArgumentNotNullOrEmptyString(clientId, "clientId");
return ApiConnection.Delete(
ApiUrls.ApplicationAuthorization(clientId));
}
/// <summary>
/// Updates the specified <see cref="Authorization"/>.
/// </summary>

View File

@@ -54,7 +54,7 @@ namespace Octokit
/// See the <a href="http://developer.github.com/v3/users/followers/#list-users-followed-by-another-user">API documentation</a> for more information.
/// </remarks>
/// <returns>A <see cref="IReadOnlyList{User}"/> of <see cref="User"/>s that the authenticated user follows.</returns>
public Task<IReadOnlyList<User>> GetFollowingForCurrent()
public Task<IReadOnlyList<User>> GetAllFollowingForCurrent()
{
return ApiConnection.GetAll<User>(ApiUrls.Following());
}
@@ -67,7 +67,7 @@ namespace Octokit
/// See the <a href="http://developer.github.com/v3/users/followers/#list-users-followed-by-another-user">API documentation</a> for more information.
/// </remarks>
/// <returns>A <see cref="IReadOnlyList{User}"/> of <see cref="User"/>s that the passed user follows.</returns>
public Task<IReadOnlyList<User>> GetFollowing(string login)
public Task<IReadOnlyList<User>> GetAllFollowing(string login)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");

View File

@@ -99,6 +99,53 @@ namespace Octokit
NewAuthorization newAuthorization,
string twoFactorAuthenticationCode);
/// <summary>
/// Checks the validity of an OAuth token without running afoul of normal rate limits for failed login attempts.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#check-an-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">Client ID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to check</param>
/// <returns>The valid <see cref="ApplicationAuthorization"/>.</returns>
Task<ApplicationAuthorization> CheckApplicationAuthentication(string clientId, string accessToken);
/// <summary>
/// Resets a valid OAuth token for an OAuth application without end user involvment.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization">API documentation</a> for more information.
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to reset</param>
/// <returns>The valid <see cref="ApplicationAuthorization"/> with a new OAuth token</returns>
Task<ApplicationAuthorization> ResetApplicationAuthentication(string clientId, string accessToken);
/// <summary>
/// Revokes a single OAuth token for an OAuth application.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application">API documentation for more information.</a>
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <param name="accessToken">The OAuth token to revoke</param>
/// <returns>A <see cref="Task"/> for the request's execution.</returns>
Task RevokeApplicationAuthentication(string clientId, string accessToken);
/// <summary>
/// Revokes every OAuth token for an OAuth application.
/// </summary>
/// <remarks>
/// This method requires authentication.
/// See the <a href="https://developer.github.com/v3/oauth_authorizations/#revoke-all-authorizations-for-an-application">API documentation for more information.</a>
/// </remarks>
/// <param name="clientId">ClientID of the OAuth application for the token</param>
/// <returns>A <see cref="Task"/> for the request's execution.</returns>
Task RevokeAllApplicationAuthentications(string clientId);
/// <summary>
/// Updates the specified <see cref="Authorization"/>.
/// </summary>

View File

@@ -40,7 +40,7 @@ namespace Octokit
/// </remarks>
/// <returns>A <see cref="IReadOnlyList{User}"/> of <see cref="User"/>s that the authenticated user follows.</returns>
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
Task<IReadOnlyList<User>> GetFollowingForCurrent();
Task<IReadOnlyList<User>> GetAllFollowingForCurrent();
/// <summary>
/// List who a user is following
@@ -50,7 +50,7 @@ namespace Octokit
/// See the <a href="http://developer.github.com/v3/users/followers/#list-users-followed-by-another-user">API documentation</a> for more information.
/// </remarks>
/// <returns>A <see cref="IReadOnlyList{User}"/> of <see cref="User"/>s that the passed user follows.</returns>
Task<IReadOnlyList<User>> GetFollowing(string login);
Task<IReadOnlyList<User>> GetAllFollowing(string login);
/// <summary>
/// Check if the authenticated user follows another user

View File

@@ -29,5 +29,35 @@ namespace Octokit
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns>The rendered Markdown.</returns>
Task<string> RenderRawMarkdown(string markdown);
/// <summary>
/// List all templates available to pass as an option when creating a repository.
/// </summary>
/// <returns>A list of template names</returns>
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
Task<IReadOnlyList<string>> GetGitIgnoreTemplates();
/// <summary>
/// Retrieves the source for a single GitIgnore template
/// </summary>
/// <param name="templateName"></param>
/// <returns>A template and its source</returns>
Task<GitIgnoreTemplate> GetGitIgnoreTemplate(string templateName);
/// <summary>
/// Returns a list of the licenses shown in the license picker on GitHub.com. This is not a comprehensive
/// list of all possible OSS licenses.
/// </summary>
/// <remarks>This is a PREVIEW API! Use it at your own risk.</remarks>
/// <returns>A list of licenses available on the site</returns>
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
Task<IReadOnlyList<LicenseMetadata>> GetLicenses();
/// <summary>
/// Retrieves a license based on the licence key such as "mit"
/// </summary>
/// <param name="key"></param>
/// <returns>A <see cref="License" /> that includes the license key, text, and attributes of the license.</returns>
Task<License> GetLicense(string key);
}
}

View File

@@ -97,5 +97,15 @@ namespace Octokit
/// <param name="number">The pull request number</param>
/// <returns>A <see cref="IReadOnlyList{PullRequestCommit}"/> of <see cref="Commit"/>s which are part of this pull request</returns>
Task<IReadOnlyList<PullRequestCommit>> Commits(string owner, string name, int number);
/// <summary>
/// Get the list of files on a pull request.
/// </summary>
/// <remarks>https://developer.github.com/v3/pulls/#list-pull-requests-files</remarks>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <param name="number">The pull request number</param>
/// <returns>A <see cref="IReadOnlyList{PullRequestFile}"/> which are part of this pull request</returns>
Task<IReadOnlyList<PullRequestFile>> Files(string owner, string name, int number);
}
}

View File

@@ -164,32 +164,6 @@ namespace Octokit
Justification = "Makes a network request")]
Task<IReadOnlyList<Repository>> GetAllForOrg(string organization);
/// <summary>
/// Gets the preferred README for the specified repository.
/// </summary>
/// <remarks>
/// See the <a href="http://developer.github.com/v3/repos/contents/#get-the-readme">API documentation</a> for more information.
/// </remarks>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns></returns>
[Obsolete("This method has been obsoleted by Content.GetReadme. Please use that instead.")]
Task<Readme> GetReadme(string owner, string name);
/// <summary>
/// Gets the perferred README's HTML for the specified repository.
/// </summary>
/// <remarks>
/// See the <a href="http://developer.github.com/v3/repos/contents/#get-the-readme">API documentation</a> for more information.
/// </remarks>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns></returns>
[Obsolete("This method has been obsoleted by Content.GetReadmeHtml. Please use that instead.")]
Task<string> GetReadmeHtml(string owner, string name);
/// <summary>
/// A client for GitHub's Commit Status API.
/// </summary>

View File

@@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
#if NET_45
using System.Collections.ObjectModel;
#endif
using System.Linq;
using System.Threading.Tasks;
namespace Octokit
{
@@ -56,5 +56,65 @@ namespace Octokit
.ConfigureAwait(false);
return response.Body;
}
/// <summary>
/// List all templates available to pass as an option when creating a repository.
/// </summary>
/// <returns>A list of template names</returns>
public async Task<IReadOnlyList<string>> GetGitIgnoreTemplates()
{
var endpoint = new Uri("gitignore/templates", UriKind.Relative);
var response = await _connection.Get<string[]>(endpoint, null, null)
.ConfigureAwait(false);
return new ReadOnlyCollection<string>(response.Body);
}
/// <summary>
/// Retrieves the source for a single GitIgnore template
/// </summary>
/// <param name="templateName"></param>
/// <returns>A template and its source</returns>
public async Task<GitIgnoreTemplate> GetGitIgnoreTemplate(string templateName)
{
Ensure.ArgumentNotNullOrEmptyString(templateName, "templateName");
var endpoint = new Uri("gitignore/templates/" + Uri.EscapeUriString(templateName), UriKind.Relative);
var response = await _connection.Get<GitIgnoreTemplate>(endpoint, null, null)
.ConfigureAwait(false);
return response.Body;
}
/// <summary>
/// Returns a list of the licenses shown in the license picker on GitHub.com. This is not a comprehensive
/// list of all possible OSS licenses.
/// </summary>
/// <remarks>This is a PREVIEW API! Use it at your own risk.</remarks>
/// <returns>A list of licenses available on the site</returns>
public async Task<IReadOnlyList<LicenseMetadata>> GetLicenses()
{
const string previewAcceptsHeader = "application/vnd.github.drax-preview+json";
var endpoint = new Uri("licenses", UriKind.Relative);
var response = await _connection.Get<LicenseMetadata[]>(endpoint, null, previewAcceptsHeader)
.ConfigureAwait(false);
return new ReadOnlyCollection<LicenseMetadata>(response.Body);
}
/// <summary>
/// Retrieves a license based on the licence key such as "mit"
/// </summary>
/// <param name="key"></param>
/// <returns>A <see cref="License" /> that includes the license key, text, and attributes of the license.</returns>
public async Task<License> GetLicense(string key)
{
const string previewAcceptsHeader = "application/vnd.github.drax-preview+json";
var endpoint = new Uri("licenses/" + Uri.EscapeUriString(key), UriKind.Relative);
var response = await _connection.Get<License>(endpoint, null, previewAcceptsHeader)
.ConfigureAwait(false);
return response.Body;
}
}
}

View File

@@ -159,5 +159,21 @@ namespace Octokit
return ApiConnection.GetAll<PullRequestCommit>(ApiUrls.PullRequestCommits(owner, name, number));
}
/// <summary>
/// Get the list of files on a pull request.
/// </summary>
/// <remarks>https://developer.github.com/v3/pulls/#list-pull-requests-files</remarks>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <param name="number">The pull request number</param>
/// <returns>A <see cref="IReadOnlyList{PullRequestFile}"/> which are part of this pull request</returns>
public Task<IReadOnlyList<PullRequestFile>> Files(string owner, string name, int number)
{
Ensure.ArgumentNotNullOrEmptyString(owner, "owner");
Ensure.ArgumentNotNullOrEmptyString(name, "name");
return ApiConnection.GetAll<PullRequestFile>(ApiUrls.PullRequestFiles(owner, name, number));
}
}
}

View File

@@ -48,8 +48,6 @@ namespace Octokit
public Task<Repository> Create(NewRepository newRepository)
{
Ensure.ArgumentNotNull(newRepository, "newRepository");
if (string.IsNullOrEmpty(newRepository.Name))
throw new ArgumentException("The new repository's name must not be null.");
return Create(ApiUrls.Repositories(), null, newRepository);
}
@@ -256,38 +254,6 @@ namespace Octokit
return ApiConnection.GetAll<Repository>(ApiUrls.OrganizationRepositories(organization));
}
/// <summary>
/// Gets the preferred README for the specified repository.
/// </summary>
/// <remarks>
/// See the <a href="http://developer.github.com/v3/repos/contents/#get-the-readme">API documentation</a> for more information.
/// </remarks>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns></returns>
[Obsolete("This method has been obsoleted by Content.GetReadme. Please use that instead.")]
public Task<Readme> GetReadme(string owner, string name)
{
return Content.GetReadme(owner, name);
}
/// <summary>
/// Gets the perferred README's HTML for the specified repository.
/// </summary>
/// <remarks>
/// See the <a href="http://developer.github.com/v3/repos/contents/#get-the-readme">API documentation</a> for more information.
/// </remarks>
/// <param name="owner">The owner of the repository</param>
/// <param name="name">The name of the repository</param>
/// <exception cref="ApiException">Thrown when a general API error occurs.</exception>
/// <returns></returns>
[Obsolete("This method has been obsoleted by Content.GetReadmeHtml. Please use that instead.")]
public Task<string> GetReadmeHtml(string owner, string name)
{
return Content.GetReadmeHtml(owner, name);
}
/// <summary>
/// A client for GitHub's Commit Status API.
/// </summary>

View File

@@ -71,7 +71,7 @@ namespace Octokit
Ensure.ArgumentNotNullOrEmptyString(repositoryName, "repositoryName");
var endpoint = "/repos/{0}/{1}/stats/commit_activity".FormatUri(owner, repositoryName);
var activity = await ApiConnection.GetQueuedOperation<IEnumerable<WeeklyCommitActivity>>(endpoint,cancellationToken);
var activity = await ApiConnection.GetQueuedOperation<IReadOnlyList<WeeklyCommitActivity>>(endpoint,cancellationToken);
return new CommitActivity(activity);
}

View File

@@ -48,5 +48,15 @@ namespace Octokit
{
return "authorizations/clients/{0}/{1}".FormatUri(clientId, fingerprint);
}
public static Uri ApplicationAuthorization(string clientId)
{
return "applications/{0}/tokens".FormatUri(clientId);
}
public static Uri ApplicationAuthorization(string clientId, string accessToken)
{
return "applications/{0}/tokens/{1}".FormatUri(clientId, accessToken);
}
}
}

View File

@@ -857,6 +857,11 @@ namespace Octokit
return "repos/{0}/{1}/pulls/{2}/commits".FormatUri(owner, name, number);
}
public static Uri PullRequestFiles(string owner, string name, int number)
{
return "repos/{0}/{1}/pulls/{2}/files".FormatUri(owner, name, number);
}
/// <summary>
/// Returns the <see cref="Uri"/> for a spesific comment for the specified commit.
/// </summary>

View File

@@ -11,6 +11,17 @@ namespace Octokit
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class NewRepository
{
/// <summary>
/// Creates an object that describes the repository to create on GitHub.
/// </summary>
/// <param name="name">The name of the repository. This is the only required parameter.</param>
public NewRepository(string name)
{
Ensure.ArgumentNotNullOrEmptyString(name, "name");
Name = name;
}
/// <summary>
/// Optional. Gets or sets whether to create an initial commit with empty README. The default is false.
/// </summary>
@@ -47,10 +58,20 @@ namespace Octokit
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gitignore", Justification = "It needs to be this way for proper serialization.")]
public string GitignoreTemplate { get; set; }
/// <summary>
/// Optional. Gets or sets the desired Desired LICENSE template to apply. Use the name of the template without
/// the extension. For example, “mit” or “mozilla”.
/// </summary>
/// <remarks>
/// The list of license templates are here: https://github.com/github/choosealicense.com/tree/gh-pages/_licenses
/// Just omit the ".txt" file extension for the template name.
/// </remarks>
public string LicenseTemplate { get; set; }
/// <summary>
/// Required. Gets or sets the new repository's name.
/// </summary>
public string Name { get; set; }
public string Name { get; private set; }
/// <summary>
/// Optional. Gets or sets whether the new repository is private; the default is false.

View File

@@ -1,6 +1,7 @@
using System;
using System.Diagnostics;
using System.Globalization;
using Octokit.Internal;
namespace Octokit
{
@@ -10,6 +11,8 @@ namespace Octokit
public PullRequestRequest()
{
State = ItemState.Open;
SortProperty = PullRequestSort.Created;
SortDirection = SortDirection.Descending;
}
/// <summary>
@@ -27,6 +30,18 @@ namespace Octokit
/// </summary>
public string Base { get; set; }
/// <summary>
/// What property to sort pull requests by.
/// </summary>
[Parameter(Key="sort")]
public PullRequestSort SortProperty { get; set; }
/// <summary>
/// What direction to sort the pull requests.
/// </summary>
[Parameter(Key="direction")]
public SortDirection SortDirection { get; set; }
internal string DebuggerDisplay
{
get
@@ -35,4 +50,25 @@ namespace Octokit
}
}
}
public enum PullRequestSort
{
/// <summary>
/// Sort by created date (default)
/// </summary>
Created,
/// <summary>
/// Sort by last updated date
/// </summary>
Updated,
/// <summary>
/// Sort by popularity (comment count)
/// </summary>
Popularity,
/// <summary>
/// Sort by age (filtering by pulls updated in the last month)
/// </summary>
[Parameter(Value= "long-running")]
LongRunning
}
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
@@ -16,7 +17,9 @@ namespace Octokit
public CodeFrequency(IEnumerable<AdditionsAndDeletions> additionsAndDeletionsByWeek)
{
AdditionsAndDeletionsByWeek = additionsAndDeletionsByWeek;
Ensure.ArgumentNotNull(additionsAndDeletionsByWeek, "additionsAndDeletionsByWeek");
AdditionsAndDeletionsByWeek = new ReadOnlyCollection<AdditionsAndDeletions>(additionsAndDeletionsByWeek.ToList());
}
/// <summary>
@@ -32,7 +35,7 @@ namespace Octokit
/// <summary>
/// A weekly aggregate of the number of additions and deletions pushed to a repository.
/// </summary>
public IEnumerable<AdditionsAndDeletions> AdditionsAndDeletionsByWeek { get; private set; }
public IReadOnlyList<AdditionsAndDeletions> AdditionsAndDeletionsByWeek { get; private set; }
internal string DebuggerDisplay
{

View File

@@ -1,5 +1,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
namespace Octokit
{
@@ -11,11 +13,13 @@ namespace Octokit
public Commit(string url, string label, string @ref, string sha, User user, Repository repository, string message, SignatureResponse author, SignatureResponse committer, GitReference tree, IEnumerable<GitReference> parents, int commentCount)
: base(url, label, @ref, sha, user, repository)
{
Ensure.ArgumentNotNull(parents, "parents");
Message = message;
Author = author;
Committer = committer;
Tree = tree;
Parents = parents;
Parents = new ReadOnlyCollection<GitReference>(parents.ToList());
CommentCount = commentCount;
}
@@ -27,7 +31,7 @@ namespace Octokit
public GitReference Tree { get; protected set; }
public IEnumerable<GitReference> Parents { get; protected set; }
public IReadOnlyList<GitReference> Parents { get; protected set; }
public int CommentCount { get; protected set; }
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
@@ -13,13 +14,15 @@ namespace Octokit
public CommitActivity(IEnumerable<WeeklyCommitActivity> activity)
{
Activity = activity;
Ensure.ArgumentNotNull(activity, "activity");
Activity = new ReadOnlyCollection<WeeklyCommitActivity>(activity.ToList());
}
/// <summary>
/// Returns the last year of commit activity grouped by week.
/// </summary>
public IEnumerable<WeeklyCommitActivity> Activity { get; private set; }
public IReadOnlyList<WeeklyCommitActivity> Activity { get; private set; }
internal string DebuggerDisplay
{

View File

@@ -162,5 +162,10 @@ namespace Octokit
/// The pull requests branch was restored.
/// </summary>
HeadRefRestored,
/// <summary>
/// The actor unsubscribed from notifications for an issue.
/// </summary>
Unsubscribed,
}
}

View File

@@ -0,0 +1,35 @@
using System;
using System.Diagnostics;
using System.Globalization;
namespace Octokit
{
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class GitIgnoreTemplate
{
public GitIgnoreTemplate(string name, string source)
{
Ensure.ArgumentNotNullOrEmptyString(name, "name");
Ensure.ArgumentNotNullOrEmptyString(source, "source");
Name = name;
Source = source;
}
public GitIgnoreTemplate()
{
}
public string Name { get; protected set; }
public string Source { get; protected set; }
internal string DebuggerDisplay
{
get
{
return String.Format(CultureInfo.InvariantCulture, "GitIgnore: {0}", Name);
}
}
}
}

View File

@@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
namespace Octokit
{
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class License : LicenseMetadata
{
public License(
string key,
string name,
Uri url,
Uri htmlUrl,
bool featured,
string description,
string category,
string implementation,
string body,
IEnumerable<string> required,
IEnumerable<string> permitted,
IEnumerable<string> forbidden) : base(key, name, url)
{
Ensure.ArgumentNotNull(htmlUrl, "htmlUrl");
Ensure.ArgumentNotNull(description, "description");
Ensure.ArgumentNotNull(category, "category");
Ensure.ArgumentNotNull(implementation, "implementation");
Ensure.ArgumentNotNull(body, "body");
Ensure.ArgumentNotNull(required, "required");
Ensure.ArgumentNotNull(permitted, "permitted");
Ensure.ArgumentNotNull(forbidden, "forbidden");
HtmlUrl = htmlUrl;
Featured = featured;
Description = description;
Category = category;
Implementation = implementation;
Body = body;
Required = new ReadOnlyCollection<string>(required.ToList());
Permitted = new ReadOnlyCollection<string>(permitted.ToList());
Forbidden = new ReadOnlyCollection<string>(forbidden.ToList());
}
public License()
{
}
/// <summary>
/// Url to the license on https://choosealicense.com
/// </summary>
public Uri HtmlUrl { get; protected set; }
/// <summary>
/// Whether the license is one of the licenses featured on https://choosealicense.com
/// </summary>
public bool Featured { get; protected set; }
/// <summary>
/// A description of the license.
/// </summary>
public string Description { get; protected set; }
/// <summary>
/// A group or family that the license belongs to such as the GPL family of licenses.
/// </summary>
public string Category { get; protected set; }
/// <summary>
/// Notes on how to properly apply the license.
/// </summary>
public string Implementation { get; protected set; }
/// <summary>
/// Set of codes for what is required under the terms of the license. For example, "include-copyright"
/// </summary>
public IReadOnlyList<string> Required { get; protected set; }
/// <summary>
/// Set of codes for what is permitted under the terms of the license. For example, "commerical-use"
/// </summary>
public IReadOnlyList<string> Permitted { get; protected set; }
/// <summary>
/// Set of codes for what is forbidden under the terms of the license. For example, "no-liability"
/// </summary>
public IReadOnlyList<string> Forbidden { get; protected set; }
/// <summary>
/// The text of the license
/// </summary>
public string Body { get; protected set; }
internal override string DebuggerDisplay
{
get
{
return String.Format(CultureInfo.InvariantCulture, "{0} Category: {1}", base.DebuggerDisplay, Category);
}
}
}
}

View File

@@ -0,0 +1,48 @@
using System;
using System.Diagnostics;
using System.Globalization;
namespace Octokit
{
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class LicenseMetadata
{
public LicenseMetadata(string key, string name, Uri url)
{
Ensure.ArgumentNotNullOrEmptyString(key, "key");
Ensure.ArgumentNotNullOrEmptyString(name, "name");
Ensure.ArgumentNotNull(url, "url");
Key = key;
Name = name;
Url = url;
}
public LicenseMetadata()
{
}
/// <summary>
/// The
/// </summary>
public string Key { get; protected set; }
/// <summary>
/// Friendly name of the license.
/// </summary>
public string Name { get; protected set; }
/// <summary>
/// URL to retrieve details about a license.
/// </summary>
public Uri Url { get; protected set; }
internal virtual string DebuggerDisplay
{
get
{
return String.Format(CultureInfo.InvariantCulture, "Key: {0} Name: {1}", Key, Name);
}
}
}
}

View File

@@ -1,5 +1,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
namespace Octokit
{
@@ -10,10 +12,12 @@ namespace Octokit
public Merge(Author author, Author committer, Commit commit, IEnumerable<GitReference> parents, string commentsUrl, int commentCount, string htmlUrl)
{
Ensure.ArgumentNotNull(parents, "parents");
Author = author;
Committer = committer;
Commit = commit;
Parents = parents;
Parents = new ReadOnlyCollection<GitReference>(parents.ToList());
CommentsUrl = commentsUrl;
CommentCount = commentCount;
HtmlUrl = htmlUrl;
@@ -22,7 +26,7 @@ namespace Octokit
public Author Author { get; protected set; }
public Author Committer { get; protected set; }
public Commit Commit { get; protected set; }
public IEnumerable<GitReference> Parents { get; protected set; }
public IReadOnlyList<GitReference> Parents { get; protected set; }
public string CommentsUrl { get; protected set; }
public int CommentCount { get; protected set; }
public string HtmlUrl { get; protected set; }

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
@@ -16,19 +17,22 @@ namespace Octokit
public Participation(IEnumerable<int> all, IEnumerable<int> owner)
{
All = all;
Owner = owner;
Ensure.ArgumentNotNull(all, "all");
Ensure.ArgumentNotNull(owner, "owner");
All = new ReadOnlyCollection<int>(all.ToList());
Owner = new ReadOnlyCollection<int>(owner.ToList());
}
/// <summary>
/// Returns the commit counts made each week, for the last 52 weeks
/// </summary>
public IEnumerable<int> All { get; protected set; }
public IReadOnlyList<int> All { get; protected set; }
/// <summary>
/// Returns the commit counts made by the owner each week, for the last 52 weeks
/// </summary>
public IEnumerable<int> Owner { get; protected set; }
public IReadOnlyList<int> Owner { get; protected set; }
/// <summary>
/// The total number of commits made by the owner in the last 52 weeks.

View File

@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
namespace Octokit
{
@@ -12,12 +14,14 @@ namespace Octokit
public PullRequestCommit(SignatureResponse author, Uri commentsUrl, Commit commit, SignatureResponse committer, Uri htmlUrl, IEnumerable<GitReference> parents, string sha, Uri url)
{
Ensure.ArgumentNotNull(parents, "parents");
Author = author;
CommentsUrl = commentsUrl;
Commit = commit;
Committer = committer;
HtmlUrl = htmlUrl;
Parents = parents;
Parents = new ReadOnlyCollection<GitReference>(parents.ToList());
Sha = sha;
Url = url;
}
@@ -32,7 +36,7 @@ namespace Octokit
public Uri HtmlUrl { get; protected set; }
public IEnumerable<GitReference> Parents { get; protected set; }
public IReadOnlyList<GitReference> Parents { get; protected set; }
public string Sha { get; protected set; }

View File

@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Octokit.Internal;
namespace Octokit
{
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class PullRequestFile
{
public PullRequestFile() { }
public PullRequestFile(string sha, string fileName, string status, int additions, int deletions, int changes, Uri blobUri, Uri rawUri, Uri contentsUri, string patch)
{
Sha = sha;
FileName = fileName;
Status = status;
Additions = additions;
Deletions = deletions;
Changes = changes;
BlobUri = blobUri;
RawUri = rawUri;
ContentsUri = contentsUri;
Patch = patch;
}
public string Sha { get; protected set; }
[Parameter(Key = "filename")]
public string FileName { get; protected set; }
public string Status { get; protected set; }
public int Additions { get; protected set; }
public int Deletions { get; protected set; }
public int Changes { get; protected set; }
public Uri BlobUri { get; protected set; }
public Uri RawUri { get; protected set; }
public Uri ContentsUri { get; protected set; }
public string Patch { get; protected set; }
internal string DebuggerDisplay
{
get { return String.Format(CultureInfo.InvariantCulture, "Sha: {0} FileName: {1} Additions: {2} Deletions: {3} Changes: {4}", Sha, FileName, Additions, Deletions, Changes); }
}
}
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
@@ -14,7 +15,9 @@ namespace Octokit
public WeeklyCommitActivity(IEnumerable<int> days, int total, long week)
{
Days = days;
Ensure.ArgumentNotNull(days, "days");
Days = new ReadOnlyCollection<int>(days.ToList());
Total = total;
Week = week;
}
@@ -22,7 +25,7 @@ namespace Octokit
/// <summary>
/// The days array is a group of commits per day, starting on Sunday.
/// </summary>
public IEnumerable<int> Days { get; protected set; }
public IReadOnlyList<int> Days { get; protected set; }
/// <summary>
/// Totally number of commits made this week.

View File

@@ -389,6 +389,10 @@
<Compile Include="Models\Request\RepositoryRequest.cs" />
<Compile Include="Models\Response\RepositoryHookConfiguration.cs" />
<Compile Include="Models\Request\RepositoryForksListRequest.cs" />
<Compile Include="Models\Response\GitIgnoreTemplate.cs" />
<Compile Include="Models\Response\License.cs" />
<Compile Include="Models\Response\LicenseMetadata.cs" />
<Compile Include="Models\Response\PullRequestFile.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -401,6 +401,10 @@
<Compile Include="Models\Request\RepositoryRequest.cs" />
<Compile Include="Models\Response\RepositoryHookConfiguration.cs" />
<Compile Include="Models\Request\RepositoryForksListRequest.cs" />
<Compile Include="Models\Response\GitIgnoreTemplate.cs" />
<Compile Include="Models\Response\License.cs" />
<Compile Include="Models\Response\LicenseMetadata.cs" />
<Compile Include="Models\Response\PullRequestFile.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
</Project>

View File

@@ -394,6 +394,10 @@
<Compile Include="Models\Request\RepositoryRequest.cs" />
<Compile Include="Models\Response\RepositoryHookConfiguration.cs" />
<Compile Include="Models\Request\RepositoryForksListRequest.cs" />
<Compile Include="Models\Response\GitIgnoreTemplate.cs" />
<Compile Include="Models\Response\License.cs" />
<Compile Include="Models\Response\LicenseMetadata.cs" />
<Compile Include="Models\Response\PullRequestFile.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.MonoTouch.CSharp.targets" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

View File

@@ -387,6 +387,10 @@
<Compile Include="Models\Request\RepositoryRequest.cs" />
<Compile Include="Models\Response\RepositoryHookConfiguration.cs" />
<Compile Include="Models\Request\RepositoryForksListRequest.cs" />
<Compile Include="Models\Response\GitIgnoreTemplate.cs" />
<Compile Include="Models\Response\License.cs" />
<Compile Include="Models\Response\LicenseMetadata.cs" />
<Compile Include="Models\Response\PullRequestFile.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">

View File

@@ -391,6 +391,10 @@
<Compile Include="Models\Request\ReleaseAssetUpload.cs" />
<Compile Include="Models\Request\RepositoryRequest.cs" />
<Compile Include="Models\Request\RepositoryForksListRequest.cs" />
<Compile Include="Models\Response\GitIgnoreTemplate.cs" />
<Compile Include="Models\Response\License.cs" />
<Compile Include="Models\Response\LicenseMetadata.cs" />
<Compile Include="Models\Response\PullRequestFile.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">

View File

@@ -105,11 +105,15 @@
<Compile Include="Models\Response\ActivityPayloads\StarredEventPayload.cs" />
<Compile Include="Models\Response\CombinedCommitStatus.cs" />
<Compile Include="Models\Response\CommitContent.cs" />
<Compile Include="Models\Response\GitIgnoreTemplate.cs" />
<Compile Include="Models\Response\License.cs" />
<Compile Include="Models\Response\LicenseMetadata.cs" />
<Compile Include="Models\Response\Merge.cs" />
<Compile Include="Models\Response\ContentType.cs" />
<Compile Include="Models\Response\ApplicationAuthorization.cs" />
<Compile Include="Models\Response\GitHubCommitFile.cs" />
<Compile Include="Models\Response\PublicKey.cs" />
<Compile Include="Models\Response\PullRequestFile.cs" />
<Compile Include="Models\Response\RepositoryContent.cs" />
<Compile Include="Models\Response\RepositoryContentChangeSet.cs" />
<Compile Include="Models\Response\RepositoryContributor.cs" />

View File

@@ -1,4 +1,4 @@
# Octokit - GitHub API Client Library for .NET ![Build Status](https://ci.appveyor.com/api/projects/status/github/octokit/octokit.net?branch=master)
# Octokit - GitHub API Client Library for .NET [![Build Status](https://ci.appveyor.com/api/projects/status/github/octokit/octokit.net?branch=master)](https://ci.appveyor.com/project/Haacked15676/octokit-net)
Octokit is a client library targeting .NET 4.5 and above that provides an easy
way to interact with the [GitHub API](http://developer.github.com/v3/).
@@ -54,7 +54,7 @@ for more details.
## Build Server
The builds and tests for Octokit.net are run on [qed](https://github.com/half-ogre/qed/). This enables us to build and test incoming pull requests: http://half-ogre-qed.cloudapp.net/octokit/octokit.net
The builds and tests for Octokit.net are run on [AppVeyor](http://www.appveyor.com). This enables us to build and test incoming pull requests: https://ci.appveyor.com/project/Haacked15676/octokit-net
## Problems?

View File

@@ -1,3 +1,10 @@
### New in 0.8.0 (released 2015/03/20)
* New: added `MiscellaneousClient.GetGitIgnoreTemplates` and `MiscellaneousClient.GetGitIgnoreTemplates` APIs - #753 via @haacked
* New: added `MiscellaneousClient.GetLicenses` and `MiscellaneousClient.GetLicense` preview APIs - #754 via @haacked
* New: enhancements to `AuthorizationClient`- #731 via @alfhenrik
* Fixed: handled `unsubscribe` type for Issue events - #751 via @darrencamp
* Fixes: ensure response models define readonly interfaces - #755 via @khellang
### New in 0.7.3 (released 2015/03/06)
* New: added `Repository.GetAllPublic` for searching public repositories - #691 via @rms81
* New: added filters to `Repository.GetAllForCurrent()` - #742 via @shiftkey

Some files were not shown because too many files have changed in this diff Show More