diff --git a/Octokit.Tests/Clients/UserAdministrationClientTests.cs b/Octokit.Tests/Clients/UserAdministrationClientTests.cs index 573fe107..4174b06b 100644 --- a/Octokit.Tests/Clients/UserAdministrationClientTests.cs +++ b/Octokit.Tests/Clients/UserAdministrationClientTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using NSubstitute; using Octokit.Tests.Helpers; @@ -9,6 +10,174 @@ namespace Octokit.Tests.Clients { public class UserAdministrationClientTests { + public class TheCreateMethod + { + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new UserAdministrationClient(Substitute.For()); + await Assert.ThrowsAsync(() => client.Create(null)); + } + + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + var expectedUri = "admin/users"; + client.Create(new NewUser("name", "email@company.com")); + + connection.Received().Post( + Arg.Is(u => u.ToString() == expectedUri), + Arg.Any()); + } + + [Fact] + public void PassesRequestObject() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + client.Create(new NewUser("name", "email@company.com")); + + connection.Received().Post( + Arg.Any(), + Arg.Is(a => + a.Login == "name" && + a.Email == "email@company.com")); + } + } + + public class TheRenameMethod + { + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new UserAdministrationClient(Substitute.For()); + await Assert.ThrowsAsync(() => client.Rename(null, new UserRename("newlogin"))); + await Assert.ThrowsAsync(() => client.Rename("login", null)); + } + + [Fact] + public async Task EnsuresNonEmptyString() + { + var client = new UserAdministrationClient(Substitute.For()); + var exception = await Assert.ThrowsAsync(() => client.Rename("", new UserRename())); + Assert.Equal("login", exception.ParamName); + } + + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + var expectedUri = "admin/users/auser"; + client.Rename("auser", new UserRename()); + + connection.Received().Patch( + Arg.Is(u => u.ToString() == expectedUri), + Arg.Any()); + } + + [Fact] + public void PassesRequestObject() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + client.Rename("auser", new UserRename("newlogin")); + + connection.Received().Patch( + Arg.Any(), + Arg.Is(a => + a.Login == "newlogin")); + } + } + + public class TheCreateImpersonationTokenMethod + { + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new UserAdministrationClient(Substitute.For()); + await Assert.ThrowsAsync(() => client.CreateImpersonationToken(null, new NewImpersonationToken())); + await Assert.ThrowsAsync(() => client.CreateImpersonationToken("login", null)); + } + + [Fact] + public async Task EnsuresNonEmptyString() + { + var client = new UserAdministrationClient(Substitute.For()); + var exception = await Assert.ThrowsAsync(() => client.CreateImpersonationToken("", new NewImpersonationToken())); + Assert.Equal("login", exception.ParamName); + } + + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + var expectedUri = "admin/users/auser/authorizations"; + + client.CreateImpersonationToken("auser", new NewImpersonationToken()); + + connection.Received().Post( + Arg.Is(u => u.ToString() == expectedUri), + Arg.Any()); + } + + [Fact] + public void PassesRequestObject() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + string[] scopes = new string[] { "public-repo" }; + client.CreateImpersonationToken("auser", new NewImpersonationToken(scopes)); + + connection.Received().Post( + Arg.Any(), + Arg.Is(a => + a.Scopes.Count() == scopes.Count() && + a.Scopes.ToList().All(s => scopes.Contains(s)) && + scopes.ToList().All(s => a.Scopes.Contains(s)))); + } + } + + public class TheDeleteImpersonationTokenMethod + { + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new UserAdministrationClient(Substitute.For()); + await Assert.ThrowsAsync(() => client.DeleteImpersonationToken(null)); + } + + [Fact] + public async Task EnsuresNonEmptyString() + { + var client = new UserAdministrationClient(Substitute.For()); + var exception = await Assert.ThrowsAsync(() => client.DeleteImpersonationToken("")); + Assert.Equal("login", exception.ParamName); + } + + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + var expectedUri = "admin/users/auser/authorizations"; + client.DeleteImpersonationToken("auser"); + + connection.Connection.Received().Delete( + Arg.Is(u => u.ToString() == expectedUri)); + } + } + public class ThePromoteMethod { [Fact] @@ -32,11 +201,14 @@ namespace Octokit.Tests.Clients var connection = Substitute.For(); var client = new UserAdministrationClient(connection); + var expectedUri = "users/auser/site_admin"; client.Promote("auser"); - connection.Received().Put(Arg.Is(u => u.ToString() == "/users/auser/site_admin")); + connection.Received().Put( + Arg.Is(u => u.ToString() == expectedUri)); } } + public class TheDemoteMethod { [Fact] @@ -60,9 +232,11 @@ namespace Octokit.Tests.Clients var connection = Substitute.For(); var client = new UserAdministrationClient(connection); + var expectedUri = "users/auser/site_admin"; client.Demote("auser"); - connection.Received().Delete(Arg.Is(u => u.ToString() == "/users/auser/site_admin")); + connection.Received().Delete( + Arg.Is(u => u.ToString() == expectedUri)); } } @@ -89,9 +263,11 @@ namespace Octokit.Tests.Clients var connection = Substitute.For(); var client = new UserAdministrationClient(connection); + var expectedUri = "users/auser/suspended"; client.Suspend("auser"); - connection.Received().Put(Arg.Is(u => u.ToString() == "/users/auser/suspended")); + connection.Received().Put( + Arg.Is(u => u.ToString() == expectedUri)); } } @@ -118,9 +294,74 @@ namespace Octokit.Tests.Clients var connection = Substitute.For(); var client = new UserAdministrationClient(connection); + var expectedUri = "users/auser/suspended"; client.Unsuspend("auser"); - connection.Received().Delete(Arg.Is(u => u.ToString() == "/users/auser/suspended")); + connection.Received().Delete( + Arg.Is(u => u.ToString() == expectedUri)); + } + } + + public class TheListAllPublicKeysMethod + { + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + var expectedUri = "admin/keys"; + client.ListAllPublicKeys(); + + connection.Received().GetAll( + Arg.Is(u => u.ToString() == expectedUri)); + } + } + + public class TheDeleteMethod + { + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new UserAdministrationClient(Substitute.For()); + await Assert.ThrowsAsync(() => client.Delete(null)); + } + + [Fact] + public async Task EnsuresNonEmptyString() + { + var client = new UserAdministrationClient(Substitute.For()); + var exception = await Assert.ThrowsAsync(() => client.Delete("")); + Assert.Equal("login", exception.ParamName); + } + + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + var expectedUri = "admin/users/auser"; + client.Delete("auser"); + + connection.Connection.Received().Delete( + Arg.Is(u => u.ToString() == expectedUri)); + } + } + + public class TheDeletePublicKeyMethod + { + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new UserAdministrationClient(connection); + + var expectedUri = "admin/keys/1"; + client.DeletePublicKey(1); + + connection.Connection.Received().Delete( + Arg.Is(u => u.ToString() == expectedUri)); } } } diff --git a/Octokit/Clients/IUserAdministrationClient.cs b/Octokit/Clients/IUserAdministrationClient.cs index cdececd9..8bd2af8e 100644 --- a/Octokit/Clients/IUserAdministrationClient.cs +++ b/Octokit/Clients/IUserAdministrationClient.cs @@ -1,56 +1,137 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; using System.Threading.Tasks; namespace Octokit -{ /// - /// A client for GitHub's User Administration API. - /// - /// - /// See the Administration API documentation for more details. - /// +{ + /// + /// A client for GitHub's User Administration API (GitHub Enterprise) + /// + /// + /// See the Administration API documentation for more details. + /// public interface IUserAdministrationClient { /// - /// Promotes ordinary user to a site administrator. + /// Create a new user (must be Site Admin user). /// /// - /// https://developer.github.com/v3/users/administration/#promote-an-ordinary-user-to-a-site-administrator + /// See the API documentation + /// for more information. + /// + /// The object describing the user to create + /// The created object + Task Create(NewUser newUser); + + /// + /// Rename an existing user (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// Note that this queues a request to rename a user, rather than execute it straight away + /// + /// The username to rename + /// The request, specifying the new login + /// A object indicating the queued task message and Url to the user + Task Rename(string login, UserRename userRename); + + /// + /// Create an impersonation OAuth token (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// The user to impersonate + /// The request specifying the required scopes + /// An object containing the impersonation token + Task CreateImpersonationToken(string login, NewImpersonationToken newImpersonationToken); + + /// + /// Deletes an impersonation OAuth token (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// The user to remove impersonation token from + /// + Task DeleteImpersonationToken(string login); + + /// + /// Promotes ordinary user to a site administrator (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. /// /// The user to promote to administrator. /// Task Promote(string login); /// - /// Demotes a site administrator to an ordinary user. + /// Demotes a site administrator to an ordinary user (must be Site Admin user). /// /// - /// https://developer.github.com/v3/users/administration/#demote-a-site-administrator-to-an-ordinary-user + /// See the API documentation + /// for more information. /// /// The user to demote from administrator. /// Task Demote(string login); /// - /// Suspends a user. + /// Suspends a user (must be Site Admin user). /// /// - /// https://developer.github.com/v3/users/administration/#suspend-a-user + /// See the API documentation + /// for more information. /// /// The user to suspend. /// Task Suspend(string login); /// - /// Unsuspends a user. + /// Unsuspends a user (must be Site Admin user). /// /// - /// https://developer.github.com/v3/users/administration/#unsuspend-a-user + /// See the API documentation + /// for more information. /// /// The user to unsuspend. /// Task Unsuspend(string login); + + /// + /// List all public keys (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// + Task> ListAllPublicKeys(); + + /// + /// Delete a user (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// The user to delete + /// + Task Delete(string login); + + /// + /// Delete a public key (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// The key to delete + /// + Task DeletePublicKey(int keyId); } } diff --git a/Octokit/Clients/UserAdministrationClient.cs b/Octokit/Clients/UserAdministrationClient.cs index 4b8ff4c8..a39fcb8d 100644 --- a/Octokit/Clients/UserAdministrationClient.cs +++ b/Octokit/Clients/UserAdministrationClient.cs @@ -1,13 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; +using System.Net; using System.Threading.Tasks; namespace Octokit { /// - /// A client for GitHub's User Administration API. + /// A client for GitHub's User Administration API (GitHub Enterprise) /// /// /// See the Administration API documentation for more details. @@ -24,63 +22,210 @@ namespace Octokit } /// - /// Promotes ordinary user to a site administrator. + /// Create a new user (must be Site Admin user). /// /// - /// https://developer.github.com/v3/users/administration/#promote-an-ordinary-user-to-a-site-administrator + /// See the API documentation + /// for more information. + /// + /// The object describing the user to create + /// The created object + public Task Create(NewUser newUser) + { + Ensure.ArgumentNotNull(newUser, "newUser"); + + var endpoint = ApiUrls.UserAdministration(); + + return ApiConnection.Post(endpoint, newUser); + } + + /// + /// Rename an existing user (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// Note that this queues a request to rename a user, rather than execute it straight away + /// + /// The username to rename + /// The request, specifying the new login + /// A object indicating the queued task message and Url to the user + public Task Rename(string login, UserRename userRename) + { + Ensure.ArgumentNotNullOrEmptyString(login, "login"); + Ensure.ArgumentNotNull(userRename, "userRename"); + + var endpoint = ApiUrls.UserAdministration(login); + + return ApiConnection.Patch(endpoint, userRename); + } + + /// + /// Create an impersonation OAuth token (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// The user to impersonate + /// The request specifying the required scopes + /// An object containing the impersonation token + public Task CreateImpersonationToken(string login, NewImpersonationToken newImpersonationToken) + { + Ensure.ArgumentNotNullOrEmptyString(login, "login"); + Ensure.ArgumentNotNull(newImpersonationToken, "newImpersonationToken"); + + var endpoint = ApiUrls.UserAdministrationAuthorization(login); + + return ApiConnection.Post(endpoint, newImpersonationToken); + } + + /// + /// Deletes an impersonation OAuth token (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// The user to remove impersonation token from + /// + public async Task DeleteImpersonationToken(string login) + { + Ensure.ArgumentNotNullOrEmptyString(login, "login"); + + var endpoint = ApiUrls.UserAdministrationAuthorization(login); + + var response = ((HttpStatusCode)await Connection.Delete(endpoint)); + if (response != HttpStatusCode.NoContent) + { + throw new ApiException("Invalid Status Code returned. Expected a 204", response); + } + + return; + } + + /// + /// Promotes ordinary user to a site administrator (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. /// /// The user to promote to administrator. /// public Task Promote(string login) { Ensure.ArgumentNotNullOrEmptyString(login, "login"); - var endpoint = ApiUrls.UserAdministration(login); + var endpoint = ApiUrls.UserAdministrationSiteAdmin(login); return ApiConnection.Put(endpoint); } /// - /// Demotes a site administrator to an ordinary user. + /// Demotes a site administrator to an ordinary user (must be Site Admin user). /// /// - /// https://developer.github.com/v3/users/administration/#demote-a-site-administrator-to-an-ordinary-user + /// See the API documentation + /// for more information. /// /// The user to demote from administrator. /// public Task Demote(string login) { Ensure.ArgumentNotNullOrEmptyString(login, "login"); - var endpoint = ApiUrls.UserAdministration(login); + var endpoint = ApiUrls.UserAdministrationSiteAdmin(login); return ApiConnection.Delete(endpoint); } /// - /// Suspends a user. + /// Suspends a user (must be Site Admin user). /// /// - /// https://developer.github.com/v3/users/administration/#suspend-a-user + /// See the API documentation + /// for more information. /// /// The user to suspend. /// public Task Suspend(string login) { Ensure.ArgumentNotNullOrEmptyString(login, "login"); - var endpoint = ApiUrls.UserSuspension(login); + var endpoint = ApiUrls.UserAdministrationSuspension(login); return ApiConnection.Put(endpoint); } /// - /// Unsuspends a user. + /// Unsuspends a user (must be Site Admin user). /// /// - /// https://developer.github.com/v3/users/administration/#unsuspend-a-user + /// See the API documentation + /// for more information. /// /// The user to unsuspend. /// public Task Unsuspend(string login) { Ensure.ArgumentNotNullOrEmptyString(login, "login"); - var endpoint = ApiUrls.UserSuspension(login); + var endpoint = ApiUrls.UserAdministrationSuspension(login); return ApiConnection.Delete(endpoint); } + + /// + /// List all public keys (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// + public Task> ListAllPublicKeys() + { + var endpoint = ApiUrls.UserAdministrationPublicKeys(); + return ApiConnection.GetAll(endpoint); + } + + /// + /// Delete a user (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// The user to delete + /// + public async Task Delete(string login) + { + Ensure.ArgumentNotNullOrEmptyString(login, "login"); + var endpoint = ApiUrls.UserAdministration(login); + + var response = ((HttpStatusCode)await Connection.Delete(endpoint)); + if (response != HttpStatusCode.NoContent) + { + throw new ApiException("Invalid Status Code returned. Expected a 204", response); + } + + return; + } + + /// + /// Delete a public key (must be Site Admin user). + /// + /// + /// See the API documentation + /// for more information. + /// + /// The key to delete + /// + public async Task DeletePublicKey(int keyId) + { + Ensure.ArgumentNotNull(keyId, "keyId"); + var endpoint = ApiUrls.UserAdministrationPublicKeys(keyId); + + var response = ((HttpStatusCode)await Connection.Delete(endpoint)); + if (response != HttpStatusCode.NoContent) + { + throw new ApiException("Invalid Status Code returned. Expected a 204", response); + } + + return; + } } } diff --git a/Octokit/Helpers/ApiUrls.cs b/Octokit/Helpers/ApiUrls.cs index 2c7e131c..1f067602 100644 --- a/Octokit/Helpers/ApiUrls.cs +++ b/Octokit/Helpers/ApiUrls.cs @@ -1699,14 +1699,39 @@ namespace Octokit return "staff/indexing_jobs".FormatUri(); } + public static Uri UserAdministration() + { + return "admin/users".FormatUri(); + } + + public static Uri UserAdministration(string login) + { + return "admin/users/{0}".FormatUri(login); + } + + public static Uri UserAdministrationAuthorization(string login) + { + return "admin/users/{0}/authorizations".FormatUri(login); + } + + public static Uri UserAdministrationPublicKeys() + { + return "admin/keys".FormatUri(); + } + + public static Uri UserAdministrationPublicKeys(int keyId) + { + return "admin/keys/{0}".FormatUri(keyId); + } + /// /// Creates the relative for altering administration status of a user. /// /// The login for the intended user. /// - public static Uri UserAdministration(string login) + public static Uri UserAdministrationSiteAdmin(string login) { - return "/users/{0}/site_admin".FormatUri(login); + return "users/{0}/site_admin".FormatUri(login); } /// @@ -1714,9 +1739,9 @@ namespace Octokit /// /// The login for the intended user. /// - public static Uri UserSuspension(string login) + public static Uri UserAdministrationSuspension(string login) { - return "/users/{0}/suspended".FormatUri(login); + return "users/{0}/suspended".FormatUri(login); } } } diff --git a/Octokit/Models/Request/NewImpersonationToken.cs b/Octokit/Models/Request/NewImpersonationToken.cs new file mode 100644 index 00000000..3e55126d --- /dev/null +++ b/Octokit/Models/Request/NewImpersonationToken.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; + +namespace Octokit +{ + /// + /// Describes a new Impersonation Token to create via the method. + /// + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public class NewImpersonationToken + { + public NewImpersonationToken() { } + + /// + /// Initializes a new instance of the class. + /// + /// The scopes for the token. + public NewImpersonationToken(IEnumerable scopes) + { + Scopes = scopes; + } + + /// + /// The scopes for the token + /// + public IEnumerable Scopes { get; set; } + + internal string DebuggerDisplay + { + get + { + return string.Format(CultureInfo.InvariantCulture, "Scopes: {0}", string.Join("\r\n", Scopes)); + } + } + } +} diff --git a/Octokit/Models/Request/NewUser.cs b/Octokit/Models/Request/NewUser.cs new file mode 100644 index 00000000..600d339d --- /dev/null +++ b/Octokit/Models/Request/NewUser.cs @@ -0,0 +1,48 @@ +using System; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; + +namespace Octokit +{ + /// + /// Describes a new user to create via the method. + /// + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public class NewUser + { + public NewUser() { } + + /// + /// Initializes a new instance of the class. + /// + /// The login for the user. + /// The email address of the user + public NewUser(string login, string email) + { + Ensure.ArgumentNotNullOrEmptyString(login, "login"); + Ensure.ArgumentNotNullOrEmptyString(email, "email"); + + Login = login; + Email = email; + } + + /// + /// Login of the user + /// + public string Login { get; protected set; } + + /// + /// Email address of the user + /// + public string Email { get; protected set; } + + internal string DebuggerDisplay + { + get + { + return string.Format(CultureInfo.InvariantCulture, "Login: {0} Email: {1}", Login, Email); + } + } + } +} diff --git a/Octokit/Models/Request/UserRename.cs b/Octokit/Models/Request/UserRename.cs new file mode 100644 index 00000000..6a7bde76 --- /dev/null +++ b/Octokit/Models/Request/UserRename.cs @@ -0,0 +1,38 @@ +using System.Diagnostics; +using System.Globalization; + +namespace Octokit +{ + /// + /// Describes the new login when renaming a user via the method. + /// + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public class UserRename + { + public UserRename() { } + + /// + /// Initializes a new instance of the class. + /// + /// The new login for the user. + public UserRename(string login) + { + Ensure.ArgumentNotNullOrEmptyString(login, "login"); + + Login = login; + } + + /// + /// The new username for the user + /// + public string Login { get; protected set; } + + internal string DebuggerDisplay + { + get + { + return string.Format(CultureInfo.InvariantCulture, "Login: {0}", Login); + } + } + } +} diff --git a/Octokit/Models/Response/User.cs b/Octokit/Models/Response/User.cs index 14bc3e96..59bb4e36 100644 --- a/Octokit/Models/Response/User.cs +++ b/Octokit/Models/Response/User.cs @@ -14,11 +14,12 @@ namespace Octokit { public User() { } - public User(string avatarUrl, string bio, string blog, int collaborators, string company, DateTimeOffset createdAt, int diskUsage, string email, int followers, int following, bool? hireable, string htmlUrl, int totalPrivateRepos, int id, string location, string login, string name, int ownedPrivateRepos, Plan plan, int privateGists, int publicGists, int publicRepos, string url, bool siteAdmin, string ldapDistinguishedName) + public User(string avatarUrl, string bio, string blog, int collaborators, string company, DateTimeOffset createdAt, int diskUsage, string email, int followers, int following, bool? hireable, string htmlUrl, int totalPrivateRepos, int id, string location, string login, string name, int ownedPrivateRepos, Plan plan, int privateGists, int publicGists, int publicRepos, string url, bool siteAdmin, string ldapDistinguishedName, DateTimeOffset? suspendedAt) : base(avatarUrl, bio, blog, collaborators, company, createdAt, diskUsage, email, followers, following, hireable, htmlUrl, totalPrivateRepos, id, location, login, name, ownedPrivateRepos, plan, privateGists, publicGists, publicRepos, AccountType.User, url) { SiteAdmin = siteAdmin; LdapDistinguishedName = ldapDistinguishedName; + SuspendedAt = suspendedAt; } /// @@ -26,6 +27,16 @@ namespace Octokit /// public bool SiteAdmin { get; protected set; } + /// + /// When the user was suspended, if at all (GitHub Enterprise) + /// + public DateTimeOffset? SuspendedAt { get; protected set; } + + /// + /// Whether or not the user is currently suspended + /// + public bool Suspended { get { return SuspendedAt.HasValue; } } + /// /// LDAP Binding (GitHub Enterprise only) /// diff --git a/Octokit/Models/Response/UserRenameResponse.cs b/Octokit/Models/Response/UserRenameResponse.cs new file mode 100644 index 00000000..9fe0c8a6 --- /dev/null +++ b/Octokit/Models/Response/UserRenameResponse.cs @@ -0,0 +1,38 @@ +using System.Diagnostics; +using System.Globalization; + +namespace Octokit +{ + /// + /// Represents the response information from a operation + /// + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public class UserRenameResponse + { + public UserRenameResponse() { } + + public UserRenameResponse(string message, string url) + { + Message = message; + Url = url; + } + + /// + /// Message indiating if the Rename request was queued + /// + public string Message { get; protected set; } + + /// + /// Url to the user that will be renamed + /// + public string Url { get; protected set; } + + internal string DebuggerDisplay + { + get + { + return string.Format(CultureInfo.InvariantCulture, "Message: {0}", Message); + } + } + } +} diff --git a/Octokit/Octokit-Mono.csproj b/Octokit/Octokit-Mono.csproj index 674e22ac..1adf178b 100644 --- a/Octokit/Octokit-Mono.csproj +++ b/Octokit/Octokit-Mono.csproj @@ -452,6 +452,10 @@ + + + + \ No newline at end of file diff --git a/Octokit/Octokit-MonoAndroid.csproj b/Octokit/Octokit-MonoAndroid.csproj index 15d146fc..96b6ba41 100644 --- a/Octokit/Octokit-MonoAndroid.csproj +++ b/Octokit/Octokit-MonoAndroid.csproj @@ -460,6 +460,10 @@ + + + + \ No newline at end of file diff --git a/Octokit/Octokit-Monotouch.csproj b/Octokit/Octokit-Monotouch.csproj index 98e4beee..491e5cbb 100644 --- a/Octokit/Octokit-Monotouch.csproj +++ b/Octokit/Octokit-Monotouch.csproj @@ -456,6 +456,10 @@ + + + + diff --git a/Octokit/Octokit-Portable.csproj b/Octokit/Octokit-Portable.csproj index eedca311..f378486f 100644 --- a/Octokit/Octokit-Portable.csproj +++ b/Octokit/Octokit-Portable.csproj @@ -449,6 +449,10 @@ + + + + diff --git a/Octokit/Octokit-netcore45.csproj b/Octokit/Octokit-netcore45.csproj index 8478f6f5..67015b13 100644 --- a/Octokit/Octokit-netcore45.csproj +++ b/Octokit/Octokit-netcore45.csproj @@ -456,6 +456,10 @@ + + + + diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index 45a35727..0109e67a 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -113,12 +113,14 @@ + + @@ -132,6 +134,7 @@ + @@ -171,6 +174,7 @@ + @@ -488,4 +492,4 @@ --> - + \ No newline at end of file