diff --git a/Octokit.Tests/Clients/SearchClientTests.cs b/Octokit.Tests/Clients/SearchClientTests.cs new file mode 100644 index 00000000..bc465931 --- /dev/null +++ b/Octokit.Tests/Clients/SearchClientTests.cs @@ -0,0 +1,240 @@ +using System; +using System.Threading.Tasks; +using NSubstitute; +using Octokit.Tests.Helpers; +using Xunit; +using System.Collections.Generic; + +namespace Octokit.Tests.Clients +{ + /// + /// Client tests mostly just need to make sure they call the IApiConnection with the correct + /// relative Uri. No need to fake up the response. All *those* tests are in ApiConnectionTests.cs. + /// + public class SearchClientTests + { + public class TheConstructor + { + [Fact] + public void EnsuresNonNullArguments() + { + Assert.Throws(() => new SearchClient(null)); + } + } + + public class TheSearchUsersMethod + { + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + client.SearchUsers(new SearchUsersRequest("something")); + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/users"), Arg.Any>()); + } + + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new SearchClient(Substitute.For()); + AssertEx.Throws(async () => await client.SearchUsers(null)); + } + } + + public class TheSearchRepoMethod + { + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + client.SearchRepo(new SearchRepositoriesRequest("something")); + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new SearchClient(Substitute.For()); + AssertEx.Throws(async () => await client.SearchRepo(null)); + } + + [Fact] + public void TestingTheSizeQualifier() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //check sizes for repos that are greater than 50 MB + var request = new SearchRepositoriesRequest("github"); + request.Size = Range.GreaterThan(50); + + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public void TestingTheStarsQualifier() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos whos stargazers are greater than 500 + var request = new SearchRepositoriesRequest("github"); + request.Stars = Range.GreaterThan(500); + + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public void TestingTheForksQualifier() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos which has forks that are greater than 50 + var request = new SearchRepositoriesRequest("github"); + request.Forks = Range.GreaterThan(50); + + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public void TestingTheForkQualifier() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //search repos that contains rails and forks are included in the search + var request = new SearchRepositoriesRequest("rails"); + request.Fork = ForkQualifier.IncludeForks; + + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public void TestingTheLangaugeQualifier() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos whos language is Ruby + var request = new SearchRepositoriesRequest("github"); + request.Language = Language.Ruby; + + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public void TestingTheInQualifier() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the Description contains the test 'github' + var request = new SearchRepositoriesRequest("github"); + request.In = new[] { InQualifier.Description }; + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public void TestingTheCreatedQualifier() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the search contains 'github' and has been created after year jan 1 2011 + var request = new SearchRepositoriesRequest("github"); + request.Created = DateRange.GreaterThan(new DateTime(2011, 1, 1)); + + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public void TestingTheUpdatedQualifier() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the search contains 'github' and has been pushed before year jan 1 2013 + var request = new SearchRepositoriesRequest("github"); + request.Updated = DateRange.LessThan(new DateTime(2013, 1, 1)); + + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public void TestingTheUserQualifier() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the Description contains rails and user/org is 'github' + var request = new SearchRepositoriesRequest("rails"); + request.User = "github"; + + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + + [Fact] + public void TestingTheSortParameter() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the Description contains rails and user/org is 'github' + var request = new SearchRepositoriesRequest("rails"); + request.Sort = RepoSearchSort.Forks; + + client.SearchRepo(request); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + } + } + + public class TheSearchIssuesMethod + { + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + client.SearchIssues(new SearchIssuesRequest("something")); + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/issues"), Arg.Any>()); + } + + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new SearchClient(Substitute.For()); + AssertEx.Throws(async () => await client.SearchIssues(null)); + } + } + + public class TheSearchCodeMethod + { + [Fact] + public void RequestsTheCorrectUrl() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + client.SearchCode(new SearchCodeRequest("something")); + connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/code"), Arg.Any>()); + } + + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new SearchClient(Substitute.For()); + AssertEx.Throws(async () => await client.SearchCode(null)); + } + } + } +} diff --git a/Octokit.Tests/OctoKit.Tests-NetCore45.csproj b/Octokit.Tests/OctoKit.Tests-NetCore45.csproj index 7864e602..bf6f745e 100644 --- a/Octokit.Tests/OctoKit.Tests-NetCore45.csproj +++ b/Octokit.Tests/OctoKit.Tests-NetCore45.csproj @@ -110,6 +110,7 @@ + diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index bdde23a5..6ad0f6c0 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -62,6 +62,7 @@ + diff --git a/Octokit/Clients/ISearchClient.cs b/Octokit/Clients/ISearchClient.cs new file mode 100644 index 00000000..4ad5d09c --- /dev/null +++ b/Octokit/Clients/ISearchClient.cs @@ -0,0 +1,45 @@ +#if NET_45 +using System.Collections.Generic; +#endif +using System.Threading.Tasks; +namespace Octokit +{ + + /// + /// GitHub Search Api Client + /// + public interface ISearchClient + { + /// + /// search repos + /// http://developer.github.com/v3/search/#search-repositories + /// + /// + /// List of repos + Task> SearchRepo(SearchRepositoriesRequest search); + + /// + /// search users + /// http://developer.github.com/v3/search/#search-users + /// + /// + /// List of users + Task> SearchUsers(SearchUsersRequest search); + + /// + /// search issues + /// http://developer.github.com/v3/search/#search-issues + /// + /// + /// List of issues + Task> SearchIssues(SearchIssuesRequest search); + + /// + /// search code + /// http://developer.github.com/v3/search/#search-code + /// + /// + /// List of files + Task> SearchCode(SearchCodeRequest search); + } +} \ No newline at end of file diff --git a/Octokit/Clients/SearchClient.cs b/Octokit/Clients/SearchClient.cs new file mode 100644 index 00000000..41745a89 --- /dev/null +++ b/Octokit/Clients/SearchClient.cs @@ -0,0 +1,67 @@ +#if NET_45 +using System.Collections.Generic; +#endif +using System.Threading.Tasks; +namespace Octokit +{ + public class SearchClient : ApiClient, ISearchClient + { + /// + /// Initializes a new GitHub Search API client. + /// + /// An API connection. + public SearchClient(IApiConnection apiConnection) + : base(apiConnection) + { + + } + + /// + /// search repos + /// http://developer.github.com/v3/search/#search-repositories + /// + /// + /// List of repos + public Task> SearchRepo(SearchRepositoriesRequest search) + { + Ensure.ArgumentNotNull(search, "search"); + return ApiConnection.GetAll("search/repositories".FormatUri(), search.Parameters); + } + + /// + /// search users + /// http://developer.github.com/v3/search/#search-users + /// + /// + /// List of users + public Task> SearchUsers(SearchUsersRequest search) + { + Ensure.ArgumentNotNull(search, "search"); + return ApiConnection.GetAll("search/users".FormatUri(), search.ToParametersDictionary()); + } + + /// + /// search issues + /// http://developer.github.com/v3/search/#search-issues + /// + /// + /// List of issues + public Task> SearchIssues(SearchIssuesRequest search) + { + Ensure.ArgumentNotNull(search, "search"); + return ApiConnection.GetAll("search/issues".FormatUri(), search.ToParametersDictionary()); + } + + /// + /// search code + /// http://developer.github.com/v3/search/#search-code + /// + /// + /// List of files + public Task> SearchCode(SearchCodeRequest search) + { + Ensure.ArgumentNotNull(search, "search"); + return ApiConnection.GetAll("search/code".FormatUri(), search.ToParametersDictionary()); + } + } +} \ No newline at end of file diff --git a/Octokit/Models/Request/SearchCodeRequest.cs b/Octokit/Models/Request/SearchCodeRequest.cs new file mode 100644 index 00000000..73d855e2 --- /dev/null +++ b/Octokit/Models/Request/SearchCodeRequest.cs @@ -0,0 +1,52 @@ +using Octokit.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Octokit +{ + /// + /// Searching Code/Files + /// http://developer.github.com/v3/search/#search-code + /// + public class SearchCodeRequest : RequestParameters + { + public SearchCodeRequest(string term) + { + Ensure.ArgumentNotNullOrEmptyString(term, "term"); + Term = term; + Page = 1; + PerPage = 100; + Order = SortDirection.Descending; + } + + /// + /// The search term + /// + [Parameter(Key = "q")] + public string Term { get; private set; } + + /// + /// Optional Sort field. Can only be indexed, which indicates how recently a file has been indexed by the GitHub search infrastructure. If not provided, results are sorted by best match. + /// + //public string Sort { get; set; } //this will need to be re-added + + /// + /// Optional Sort order if sort parameter is provided. One of asc or desc; the default is desc. + /// + public SortDirection Order { get; set; } + + /// + /// Page of paginated results + /// + public int Page { get; set; } + + /// + /// Number of items per page + /// + [Parameter(Key = "per_page")] + public int PerPage { get; set; } + } +} diff --git a/Octokit/Models/Request/SearchIssuesRequest.cs b/Octokit/Models/Request/SearchIssuesRequest.cs new file mode 100644 index 00000000..346917c6 --- /dev/null +++ b/Octokit/Models/Request/SearchIssuesRequest.cs @@ -0,0 +1,52 @@ +using Octokit.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Octokit +{ + /// + /// Searching Issues + /// + public class SearchIssuesRequest : RequestParameters + { + public SearchIssuesRequest(string term) + { + Ensure.ArgumentNotNullOrEmptyString(term,"term"); + Term = term; + Page = 1; + PerPage = 100; + Order = SortDirection.Descending; + } + + /// + /// The search terms. This can be any combination of the supported repository search parameters: + /// http://developer.github.com/v3/search/#search-code + /// + [Parameter(Key= "q")] + public string Term { get; private set; } + + /// + /// For http://developer.github.com/v3/search/#search-issues + /// Optional Sort field. One of comments, created, or updated. If not provided, results are sorted by best match. + /// + //public string Sort { get; set; } //re-add laters + + /// + /// Optional Sort order if sort parameter is provided. One of asc or desc; the default is desc. + /// + public SortDirection Order { get; set; } + + /// + /// Page of paginated results + /// + public int Page { get; set; } + + /// + /// Number of items per page + /// + public int PerPage { get; set; } + } +} diff --git a/Octokit/Models/Request/SearchQualifierOperator.cs b/Octokit/Models/Request/SearchQualifierOperator.cs new file mode 100644 index 00000000..3b3d0f82 --- /dev/null +++ b/Octokit/Models/Request/SearchQualifierOperator.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Octokit +{ + public enum SearchQualifierOperator + { + GreaterThan, // > + LessThan, // < + LessThanOrEqualTo, // <= + GreaterThanOrEqualTo// >= + } +} diff --git a/Octokit/Models/Request/SearchRepositoriesRequest.cs b/Octokit/Models/Request/SearchRepositoriesRequest.cs new file mode 100644 index 00000000..81cbb263 --- /dev/null +++ b/Octokit/Models/Request/SearchRepositoriesRequest.cs @@ -0,0 +1,775 @@ +using Octokit.Internal; +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Linq; + +namespace Octokit +{ + /// + /// Searching Repositories + /// http://developer.github.com/v3/search/#search-repositories + /// + public class SearchRepositoriesRequest + { + public SearchRepositoriesRequest(string term) + { + Term = term; + Page = 1; + PerPage = 100; + Fork = ForkQualifier.ExcludeForks; + Order = SortDirection.Descending; + } + + /// + /// The search terms. This can be any combination of the supported repository search parameters: + /// http://developer.github.com/v3/search/#search-repositories + /// + public string Term { get; set; } + + /// + /// For https://help.github.com/articles/searching-repositories#sorting + /// Optional Sort field. One of stars, forks, or updated. If not provided, results are sorted by best match. + /// + public RepoSearchSort? Sort { get; set; } + + /// + /// Sort order one of asc or desc - the default is desc. + /// + public SortDirection Order { get; set; } + + /// + /// Page of paginated results + /// + public int Page { get; set; } + + /// + /// Number of items per page + /// + public int PerPage { get; set; } + + private IEnumerable _inQualifier; + + /// + /// The in qualifier limits what fields are searched. With this qualifier you can restrict the search to just the repository name, description, README, or any combination of these. + /// Without the qualifier, only the name and description are searched. + /// https://help.github.com/articles/searching-repositories#search-in + /// + public IEnumerable In + { + get + { + return _inQualifier; + } + set + { + if (value != null && value.Any()) + _inQualifier = value.Distinct().ToList(); + } + } + + /// + /// Filters repositories based on the number of forks, and/or whether forked repositories should be included in the results at all. + /// https://help.github.com/articles/searching-repositories#forks + /// + public Range Forks { get; set; } + + /// + /// Filters repositories based whether forked repositories should be included in the results at all. + /// Defaults to ExcludeForks + /// https://help.github.com/articles/searching-repositories#forks + /// + public ForkQualifier Fork { get; set; } + + /// + /// The size qualifier finds repository's that match a certain size (in kilobytes). + /// https://help.github.com/articles/searching-repositories#size + /// + public Range Size { get; set; } + + /// + /// Searches repositories based on the language they’re written in. + /// https://help.github.com/articles/searching-repositories#languages + /// + public Language? Language { get; set; } + + /// + /// Searches repositories based on the number of stars. + /// https://help.github.com/articles/searching-repositories#stars + /// + public Range Stars { get; set; } + + /// + /// Limits searches to a specific user or repository. + /// https://help.github.com/articles/searching-repositories#users-organizations-and-repositories + /// + public string User { get; set; } + + /// + /// Filters repositories based on times of creation. + /// https://help.github.com/articles/searching-repositories#created-and-last-updated + /// + public DateRange Created { get; set; } + + /// + /// Filters repositories based on when they were last updated. + /// https://help.github.com/articles/searching-repositories#created-and-last-updated + /// + public DateRange Updated { get; set; } + + public string MergeParameters() + { + var parameters = new List(); + + if (In != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "in:{0}", String.Join(",", In))); + } + + if (Size != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "size:{0}", Size)); + } + + if (Forks != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "forks:{0}", Forks)); + } + + parameters.Add(String.Format(CultureInfo.InvariantCulture, "fork:{0}", Fork)); + + if (Stars != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "stars:{0}", Stars)); + } + + if (Language != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "language:{0}", Language)); + } + + if (User.IsNotBlank()) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "user:{0}", User)); + } + + if (Created != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "created:{0}", Created)); + } + + if (Updated != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "pushed:{0}", Updated)); + } + + return String.Join("+", parameters); + } + + /// + /// get the params in the correct format... + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.Int32.ToString")] + public System.Collections.Generic.IDictionary Parameters + { + get + { + var d = new System.Collections.Generic.Dictionary(); + d.Add("page", Page.ToString()); + d.Add("per_page", PerPage.ToString()); + d.Add("sort", Sort.ToString()); + d.Add("q", Term + " " + MergeParameters()); //add qualifiers onto the search term + return d; + } + } + } + + /// + /// https://help.github.com/articles/searching-repositories#search-in + /// The in qualifier limits what fields are searched. With this qualifier you can restrict the search to just the + /// repository name, description, README, or any combination of these. + /// + public enum InQualifier + { + Name, + Description, + Readme + } + + /// + /// Helper class in generating the range values for a qualifer e.g. In or Size qualifiers + /// + public class Range + { + private string query = string.Empty; + + /// + /// Matches repositories that are size MB exactly + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.Int32.ToString")] + public Range(int size) + { + query = size.ToString(); + } + + /// + /// Matches repositories that are between and KB + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object[])"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object,System.Object)"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.Int32.ToString")] + public Range(int minSize, int maxSize) + { + query = string.Format("{0}..{1}", minSize.ToString(), maxSize.ToString()); + } + + /// + /// Matches repositories with regards to the size + /// We will use the to see what operator will be applied to the size qualifier + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object[])"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.Int32.ToString"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object)")] + public Range(int size, SearchQualifierOperator op) + { + switch (op) + { + case SearchQualifierOperator.GreaterThan: + query = string.Format(">{0}", size.ToString()); + break; + case SearchQualifierOperator.LessThan: + query = string.Format("<{0}", size.ToString()); + break; + case SearchQualifierOperator.LessThanOrEqualTo: + query = string.Format("<={0}", size.ToString()); + break; + case SearchQualifierOperator.GreaterThanOrEqualTo: + query = string.Format(">={0}", size.ToString()); + break; + default: + break; + } + } + + /// + /// Helper class that build a with a LessThan comparator used for filtering results + /// + public static Range LessThan(int size) + { + return new Range(size, SearchQualifierOperator.LessThan); + } + + /// + /// Helper class that build a with a LessThanOrEqual comparator used for filtering results + /// + public static Range LessThanOrEquals(int size) + { + return new Range(size, SearchQualifierOperator.LessThanOrEqualTo); + } + + /// + /// Helper class that build a with a GreaterThan comparator used for filtering results + /// + public static Range GreaterThan(int size) + { + return new Range(size, SearchQualifierOperator.GreaterThan); + } + + /// + /// Helper class that build a with a GreaterThanOrEqualTo comparator used for filtering results + /// + public static Range GreaterThanOrEquals(int size) + { + return new Range(size, SearchQualifierOperator.GreaterThanOrEqualTo); + } + + public override string ToString() + { + return query; + } + } + + /// + /// helper class in generating the date range values for the date qualifier e.g. + /// https://help.github.com/articles/searching-repositories#created-and-last-updated + /// + public class DateRange + { + private string query = string.Empty; + + /// + /// Matches repositories with regards to the date + /// We will use the to see what operator will be applied to the date qualifier + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object[])"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.DateTime.ToString(System.String)"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object)")] + public DateRange(DateTime date, SearchQualifierOperator op) + { + switch (op) + { + case SearchQualifierOperator.GreaterThan: + query = string.Format(">{0}", date.ToString("yyyy-mm-dd")); + break; + case SearchQualifierOperator.LessThan: + query = string.Format("<{0}", date.ToString("yyyy-mm-dd")); + break; + case SearchQualifierOperator.LessThanOrEqualTo: + query = string.Format("<={0}", date.ToString("yyyy-mm-dd")); + break; + case SearchQualifierOperator.GreaterThanOrEqualTo: + query = string.Format(">={0}", date.ToString("yyyy-mm-dd")); + break; + default: + break; + } + } + + /// + /// helper method to create a LessThan Date Comparision + /// e.g. "<" 2011 + /// + /// date to be used for comparision (times are ignored) + /// + public static DateRange LessThan(DateTime date) + { + return new DateRange(date, SearchQualifierOperator.LessThan); + } + + /// + /// helper method to create a LessThanOrEqualTo Date Comparision + /// e.g. "<=" 2011 + /// + /// date to be used for comparision (times are ignored) + /// + public static DateRange LessThanOrEquals(DateTime date) + { + return new DateRange(date, SearchQualifierOperator.LessThanOrEqualTo); + } + + /// + /// helper method to create a GreaterThan Date Comparision + /// e.g. ">" 2011 + /// + /// date to be used for comparision (times are ignored) + /// + public static DateRange GreaterThan(DateTime date) + { + return new DateRange(date, SearchQualifierOperator.GreaterThan); + } + + /// + /// helper method to create a GreaterThanOrEqualTo Date Comparision + /// e.g. ">=" 2011 + /// + /// date to be used for comparision (times are ignored) + /// + public static DateRange GreaterThanOrEquals(DateTime date) + { + return new DateRange(date, SearchQualifierOperator.GreaterThanOrEqualTo); + } + + public override string ToString() + { + return query; + } + } + + /// + /// lanuages that can be searched on in github + /// https://help.github.com/articles/searching-repositories#languages + /// + public enum Language + { + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Abap")] + Abap, + [Parameter(Value = "ActionScript")] + ActionScript, + Ada, + Apex, + [Parameter(Value = "AppleScript")] + AppleScript, + Arc, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Arduino")] + Arduino, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Conf")] + [Parameter(Value = "ApacheConf")] + ApacheConf, + Asp, + Assembly, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Augeas")] + Augeas, + [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "HotKey")] + [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "HotKey")] + [Parameter(Value = "AutoHotkey")] + AutoHotKey, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Awk")] + Awk, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Batchfile")] + Batchfile, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Befunge")] + Befunge, + [Parameter(Value = "BlitzMax")] + BlitzMax, + Boo, + Bro, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "C")] + C, + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "hs")] + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "hs")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "hs")] + [Parameter(Value = "C2HS Haskell")] + C2hsHaskell, + Ceylon, + Chuck, + Clips, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Clojure")] + Clojure, + Cobol, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Cmake")] + Cmake, + [Parameter(Value = "C-ObjDump")] + CObjDump, + [Parameter(Value = "CoffeeScript")] + CoffeeScript, + [Parameter(Value = "ColdFusion")] + ColdFusion, + CommonLisp, + Coq, + [Parameter(Value = "C++")] + CPlusPlus, + [Parameter(Value = "C#")] + CSharp, + Css, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Cpp")] + [Parameter(Value = "Cpp-ObjDump")] + CppObjDump, + Cucumber, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Cython")] + Cython, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "D")] + D, + [Parameter(Value = "D-ObjDump")] + DObjDump, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Darcs")] + [Parameter(Value = "DarcsPatch")] + DarcsPatch, + Dart, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Dcpu")] + [Parameter(Value = "DCPU-16 ASM")] + Dcpu16Asm, + Dot, + Dylan, + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ec")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ec")] + Ec, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ecere")] + [Parameter(Value = "Ecere Projects")] + EcereProjects, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ecl")] + Ecl, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Edn")] + Edn, + Eiffel, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Elixer")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Elixer")] + Elixer, + Elm, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Emacs")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Emacs")] + EmacsLisp, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Erlang")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Erlang")] + Erlang, + [Parameter(Value = "F#")] + FSharp, + Factor, + Fancy, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Fantom")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Fantom")] + Fantom, + Fish, + Forth, + Fortran, + Gas, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Genshi")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Genshi")] + Genshi, + [Parameter(Value = "Gentoo Build")] + GentooBuild, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Eclass")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Eclass")] + [Parameter(Value = "Gentoo Eclass")] + GentooEclass, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gettext")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gettext")] + [Parameter(Value = "Gettext Catalog")] + GettextCatalog, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Glsl")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Glsl")] + Glsl, + Go, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gosu")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gosu")] + Gosu, + Groff, + Groovy, + [Parameter(Value = "Groovy Server Pages")] + GroovyServerPages, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Haml")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Haml")] + Haml, + [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "HandleBars")] + [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "HandleBars")] + [Parameter(Value = "HandleBars")] + HandleBars, + Haskell, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Haxe")] + Haxe, + Http, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ini")] + Ini, + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Io")] + Io, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ioke")] + Ioke, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Irc")] + [Parameter(Value = "IRC log")] + IrcLog, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "J")] + J, + Java, + [Parameter(Value = "Java Server Pages")] + JavaServerPages, + JavaScript, + Json, + Julia, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Kotlin")] + Kotlin, + Lasso, + Less, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lfe")] + Lfe, + [Parameter(Value = "LillyPond")] + LillyPond, + [Parameter(Value = "Literate CoffeeScript")] + LiterateCoffeeScript, + [Parameter(Value = "Literate Haskell")] + LiterateHaskell, + [Parameter(Value = "LiveScript")] + LiveScript, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Llvm")] + Llvm, + Logos, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Logtalk")] + Logtalk, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lua")] + Lua, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "M")] + M, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Makefile")] + Makefile, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Mako")] + Mako, + Markdown, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Matlab")] + Matlab, + Max, + [Parameter(Value = "MiniD")] + MiniD, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Mirah")] + Mirah, + Monkey, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Moocode")] + Moocode, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Moonscript")] + Moonscript, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Mupad")] + Mupad, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Myghty")] + Myghty, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Nemerle")] + Nemerle, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Nginx")] + Nginx, + Nimrod, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Nsis")] + Nsis, + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Nu")] + Nu, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Num")] + [Parameter(Value = "NumPY")] + NumPY, + [Parameter(Value = "ObjDump")] + ObjDump, + ObjectiveC, + ObjectiveJ, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Caml")] + [Parameter(Value = "OCaml")] + OCaml, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Omgrofl")] + Omgrofl, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ooc")] + Ooc, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Opa")] + Opa, + [Parameter(Value = "OpenCL")] + OpenCL, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Abl")] + [Parameter(Value = "OpenEdge ABL")] + OpenEdgeAbl, + Parrot, + [Parameter(Value = "Parrot Assembly")] + ParrotAssembly, + [Parameter(Value = "Parrot Internal Representation")] + ParrotInternalRepresentation, + Pascal, + Perl, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Php")] + Php, + Pike, + [Parameter(Value = "PogoScript")] + PogoScript, + [Parameter(Value = "PowerShell")] + PowerShell, + Processing, + Prolog, + Puppet, + [Parameter(Value = "Pure Data")] + PureData, + Python, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Traceback")] + [Parameter(Value = "Python traceback")] + PythonTraceback, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "R")] + R, + Racket, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ragel")] + [Parameter(Value = "Ragel in Ruby Host")] + RagelInRubyHost, + [Parameter(Value = "Raw token data")] + RawTokenData, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Rebol")] + Rebol, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Redcode")] + Redcode, + [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "ReStructured")] + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Re")] + [Parameter(Value = "reStructuredText")] + ReStructuredText, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Rhtml")] + Rhtml, + Rouge, + Ruby, + Rust, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scala")] + Scala, + Scheme, + Sage, + Sass, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scilab")] + Scilab, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scss")] + Scss, + Self, + Shell, + Slash, + Smalltalk, + Smarty, + Squirrel, + [Parameter(Value = "Standard ML")] + StandardML, + [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "SuperCollider")] + [Parameter(Value = "SuperCollider")] + SuperCollider, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Tcl")] + Tcl, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Tcsh")] + Tcsh, + Tea, + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Te")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Te")] + [Parameter(Value = "TeX")] + TeX, + Textile, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Toml")] + Toml, + Turing, + Twig, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Txl")] + Txl, + [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "TypeScript")] + [Parameter(Value = "TypeScript")] + TypeScript, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Paralel")] + [Parameter(Value = "Unified Paralel C")] + UnifiedParalelC, + Unknown, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Vala")] + Vala, + Verilog, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Vhdl")] + Vhdl, + [Parameter(Value = "VimL")] + VimL, + VisualBasic, + Volt, + Wisp, + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Xc")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Xc")] + Xc, + Xml, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Proc")] + [Parameter(Value = "XProc")] + XProc, + [Parameter(Value = "XQuery")] + XQuery, + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Xs")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Xs")] + Xs, + Xslt, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Xtend")] + Xtend, + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Yaml")] + Yaml + } + + /// + /// sorting repositories by any of below + /// https://help.github.com/articles/searching-repositories#sorting + /// + public enum RepoSearchSort + { + /// + /// search by number of stars + /// + Stars, + /// + /// search by number of forks + /// + Forks, + /// + /// search by last updated + /// + Updated + } + + /// + /// https://help.github.com/articles/searching-repositories#forks + /// Specifying whether forked repositories should be included in results or not. + /// + public enum ForkQualifier + { + /// + /// only search for forked repos + /// + OnlyForks, + /// + /// include forked repos into the search + /// + IncludeForks, + /// + /// forks are not included in the search (default behaviour) + /// + ExcludeForks + } +} \ No newline at end of file diff --git a/Octokit/Models/Request/SearchUsersRequest.cs b/Octokit/Models/Request/SearchUsersRequest.cs new file mode 100644 index 00000000..7f1d4509 --- /dev/null +++ b/Octokit/Models/Request/SearchUsersRequest.cs @@ -0,0 +1,52 @@ +using Octokit.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Octokit +{ + /// + /// Searching Users + /// + public class SearchUsersRequest : RequestParameters + { + public SearchUsersRequest(string term) + { + Ensure.ArgumentNotNullOrEmptyString(term, "term"); + Term = term; + Page = 1; + PerPage = 100; + Order = SortDirection.Descending; + } + + /// + /// The search terms. This can be any combination of the supported repository search parameters: + /// http://developer.github.com/v3/search/#search-code + /// + [Parameter(Key="q")] + public string Term { get; private set; } + + /// + /// For http://developer.github.com/v3/search/#search-users + /// Optional Sort field. One of followers, repositories, or joined. If not provided, results are sorted by best match. + /// + //public string Sort { get; set; } //re-add later + + /// + /// Optional Sort order if sort parameter is provided. One of asc or desc; the default is desc. + /// + public SortDirection Order { get; set; } + + /// + /// Page of paginated results + /// + public int Page { get; set; } + + /// + /// Number of items per page + /// + public int PerPage { get; set; } + } +} diff --git a/Octokit/Models/Response/SearchCode.cs b/Octokit/Models/Response/SearchCode.cs new file mode 100644 index 00000000..cb742d4f --- /dev/null +++ b/Octokit/Models/Response/SearchCode.cs @@ -0,0 +1,43 @@ +using System; + +namespace Octokit +{ + public class SearchCode + { + /// + /// file name + /// + public string Name { get; set; } + + /// + /// path to file + /// + public string Path { get; set; } + + /// + /// Sha for file + /// + public string Sha { get; set; } + + /// + /// api-url to file + /// + public Uri Url { get; set; } + + /// + /// git-url to file + /// + public Uri GitUrl { get; set; } + + /// + /// html-url to file + /// + public Uri HtmlUrl { get; set; } + + /// + /// Repo where this file belongs to + /// + public Repository Repository { get; set; } + } + +} \ No newline at end of file diff --git a/Octokit/Octokit-Mono.csproj b/Octokit/Octokit-Mono.csproj index 4805f639..61dd2346 100644 --- a/Octokit/Octokit-Mono.csproj +++ b/Octokit/Octokit-Mono.csproj @@ -230,9 +230,17 @@ + + + + + + + + diff --git a/Octokit/Octokit-MonoAndroid.csproj b/Octokit/Octokit-MonoAndroid.csproj index e8848d39..ab60e2ea 100644 --- a/Octokit/Octokit-MonoAndroid.csproj +++ b/Octokit/Octokit-MonoAndroid.csproj @@ -221,12 +221,22 @@ + + + + + + + + + + diff --git a/Octokit/Octokit-Monotouch.csproj b/Octokit/Octokit-Monotouch.csproj index 7991904c..27fc865a 100644 --- a/Octokit/Octokit-Monotouch.csproj +++ b/Octokit/Octokit-Monotouch.csproj @@ -216,12 +216,22 @@ + + + + + + + + + + diff --git a/Octokit/Octokit-netcore45.csproj b/Octokit/Octokit-netcore45.csproj index a115d596..8d4d829b 100644 --- a/Octokit/Octokit-netcore45.csproj +++ b/Octokit/Octokit-netcore45.csproj @@ -228,9 +228,17 @@ + + + + + + + + diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index 3fa7f194..f921aec7 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -54,6 +54,12 @@ Properties\SolutionInfo.cs + + + + + + @@ -76,6 +82,7 @@ + @@ -123,6 +130,7 @@ +