From 267eb6831a64e8517ef3c36a0d5de9b1d074ef0a Mon Sep 17 00:00:00 2001 From: Haroon Date: Fri, 22 Nov 2013 09:47:30 +0000 Subject: [PATCH] added created and updated qualifiers we use the new DateRange class to achieve date searches --- Octokit.Tests/Clients/SearchClientTests.cs | 28 ++++++- Octokit/Models/Request/SearchTerm.cs | 91 +++++++++++++++++++++- 2 files changed, 114 insertions(+), 5 deletions(-) diff --git a/Octokit.Tests/Clients/SearchClientTests.cs b/Octokit.Tests/Clients/SearchClientTests.cs index 40b82bc0..e453b126 100644 --- a/Octokit.Tests/Clients/SearchClientTests.cs +++ b/Octokit.Tests/Clients/SearchClientTests.cs @@ -146,7 +146,7 @@ namespace Octokit.Tests.Clients connection.Received().GetAll(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); } - + [Fact] public void TestingTheLangaugeQualifier() { @@ -173,6 +173,32 @@ namespace Octokit.Tests.Clients 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 RepositoriesRequest("github", 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 RepositoriesRequest("github", 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() { diff --git a/Octokit/Models/Request/SearchTerm.cs b/Octokit/Models/Request/SearchTerm.cs index b4787fc4..baf85abe 100644 --- a/Octokit/Models/Request/SearchTerm.cs +++ b/Octokit/Models/Request/SearchTerm.cs @@ -12,7 +12,7 @@ namespace Octokit { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")] public RepositoriesRequest(string term, Range size = null, Range stars = null, Range forks = null, ForkQualifier? fork = null, Language? language = null, - IEnumerable inQualifiers = null, string user = null, RepoSearchSort? sort = null) + IEnumerable inQualifiers = null, string user = null, DateRange created = null, DateRange updated = null, RepoSearchSort? sort = null) { Term = term; Page = 1; @@ -24,6 +24,8 @@ namespace Octokit Language = language; User = user; Sort = sort; + Created = created; + Updated = updated; if (inQualifiers != null && inQualifiers.Count() > 0) In = inQualifiers.Distinct().ToList(); @@ -100,10 +102,16 @@ namespace Octokit public string User { get; set; } /// - /// Filters repositories based on times of creation, or when they were last updated. + /// Filters repositories based on times of creation. /// https://help.github.com/articles/searching-repositories#created-and-last-updated /// - public string Created { get; set; } + 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; } [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)")] public string MergeParameters() @@ -145,6 +153,16 @@ namespace Octokit parameters.Add(String.Format("user:{0}", User)); } + if (Created != null) + { + parameters.Add(String.Format("created:{0}", Created)); + } + + if (Updated != null) + { + parameters.Add(String.Format("pushed:{0}", Updated)); + } + return String.Join("+", parameters); } @@ -180,7 +198,7 @@ namespace Octokit } /// - /// Helper method in generating the range values for a qualifer e.g. In or Size qualifiers + /// Helper class in generating the range values for a qualifer e.g. In or Size qualifiers /// public class Range { @@ -259,6 +277,71 @@ namespace Octokit } } + /// + /// 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.DateTime.ToString(System.String)"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object)")] + public DateRange(DateTime date, QualifierOperator op) + { + switch (op) + { + case QualifierOperator.GreaterThan: + query = string.Format(">{0}", date.ToString("yyyy-mm-dd")); + break; + case QualifierOperator.LessThan: + query = string.Format("<{0}", date.ToString("yyyy-mm-dd")); + break; + case QualifierOperator.LessOrEqualTo: + query = string.Format("<={0}", date.ToString("yyyy-mm-dd")); + break; + case QualifierOperator.GreaterOrEqualTo: + query = string.Format(">={0}", date.ToString("yyyy-mm-dd")); + break; + default: + break; + } + } + + public static DateRange LessThan(DateTime date) + { + return new DateRange(date, QualifierOperator.LessThan); + } + + public static DateRange LessThanOrEquals(DateTime date) + { + return new DateRange(date, QualifierOperator.LessOrEqualTo); + } + + public static DateRange GreaterThan(DateTime date) + { + return new DateRange(date, QualifierOperator.GreaterThan); + } + + public static DateRange GreaterThanOrEquals(DateTime date) + { + return new DateRange(date, QualifierOperator.GreaterOrEqualTo); + } + + 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 { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Abap")]