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 @@
+