From 5423cfca20c9f2b111d70b5fd36de18b3ba122e3 Mon Sep 17 00:00:00 2001 From: Henrik Andersson Date: Tue, 14 Jan 2014 18:12:24 +1000 Subject: [PATCH] Refactor to use BaseSearchRequest --- Octokit.Tests/Clients/SearchClientTests.cs | 12 +- Octokit/Models/Request/SearchIssuesRequest.cs | 110 +++++++----------- 2 files changed, 45 insertions(+), 77 deletions(-) diff --git a/Octokit.Tests/Clients/SearchClientTests.cs b/Octokit.Tests/Clients/SearchClientTests.cs index 7a7daf1c..7c80d646 100644 --- a/Octokit.Tests/Clients/SearchClientTests.cs +++ b/Octokit.Tests/Clients/SearchClientTests.cs @@ -237,7 +237,7 @@ namespace Octokit.Tests.Clients var connection = Substitute.For(); var client = new SearchClient(connection); var request = new SearchIssuesRequest("something"); - request.Sort = IssueSearchSort.Comments; + request.SortField = IssueSearchSort.Comments; client.SearchIssues(request); @@ -253,7 +253,7 @@ namespace Octokit.Tests.Clients var connection = Substitute.For(); var client = new SearchClient(connection); var request = new SearchIssuesRequest("something"); - request.Sort = IssueSearchSort.Updated; + request.SortField = IssueSearchSort.Updated; request.Order = SortDirection.Ascending; client.SearchIssues(request); @@ -292,7 +292,7 @@ namespace Octokit.Tests.Clients connection.Received().GetAll( Arg.Is(u=>u.ToString() == "search/issues"), - Arg.Is>(d=>d["q"] == "something+in:Comment")); + Arg.Is>(d=>d["q"] == "something+in:comment")); } [Fact] @@ -307,7 +307,7 @@ namespace Octokit.Tests.Clients connection.Received().GetAll( Arg.Is(u => u.ToString() == "search/issues"), - Arg.Is>(d => d["q"] == "something+in:Body,Title")); + Arg.Is>(d => d["q"] == "something+in:body,title")); } [Fact] @@ -322,7 +322,7 @@ namespace Octokit.Tests.Clients connection.Received().GetAll( Arg.Is(u => u.ToString() == "search/issues"), - Arg.Is>(d => d["q"] == "something+type:Issue")); + Arg.Is>(d => d["q"] == "something+type:issue")); } [Fact] @@ -337,7 +337,7 @@ namespace Octokit.Tests.Clients connection.Received().GetAll( Arg.Is(u => u.ToString() == "search/issues"), - Arg.Is>(d => d["q"] == "something+type:PR")); + Arg.Is>(d => d["q"] == "something+type:pr")); } [Fact] diff --git a/Octokit/Models/Request/SearchIssuesRequest.cs b/Octokit/Models/Request/SearchIssuesRequest.cs index b54ca2bc..e5c15f8e 100644 --- a/Octokit/Models/Request/SearchIssuesRequest.cs +++ b/Octokit/Models/Request/SearchIssuesRequest.cs @@ -12,44 +12,20 @@ namespace Octokit /// /// Searching Issues /// - public class SearchIssuesRequest + public class SearchIssuesRequest : BaseSearchRequest { - 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-issues - /// - public string Term { get; set; } + public SearchIssuesRequest(string term) : base(term) { } /// /// 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 IssueSearchSort? Sort { get; set; } + public IssueSearchSort? SortField { get; set; } - /// - /// 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; } + public override string Sort + { + get { return SortField.ToParameter(); } + } /// /// https://help.github.com/articles/searching-issues#search-in @@ -60,7 +36,7 @@ namespace Octokit get { return _inQualifier; } set { - if(value != null && value.Any()) + if (value != null && value.Any()) { _inQualifier = value.Distinct().ToList(); } @@ -107,16 +83,16 @@ namespace Octokit /// /// https://help.github.com/articles/searching-issues#labels /// - public IEnumerable Labels + public IEnumerable Labels { - get { return _labels; } + get { return _labels; } set { - if(value != null && value.Any()) + if (value != null && value.Any()) { _labels = value.Distinct().ToList(); } - } + } } /// @@ -149,31 +125,33 @@ namespace Octokit /// public string Repo { get; set; } - public string MergeParameters() + public override IReadOnlyCollection MergedQualifiers() { var parameters = new List(); - if(In != null) + if (In != null) { - parameters.Add(String.Format(CultureInfo.InvariantCulture, "in:{0}", String.Join(",", In))); + parameters.Add(String.Format(CultureInfo.InvariantCulture, "in:{0}", + String.Join(",", In.Select(i => i.ToParameter())))); } - if(Type != null) + if (Type != null) { - parameters.Add(String.Format(CultureInfo.InvariantCulture, "type:{0}", Type)); + parameters.Add(String.Format(CultureInfo.InvariantCulture, "type:{0}", + Type.ToParameter())); } - if(Author.IsNotBlank()) + if (Author.IsNotBlank()) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "author:{0}", Author)); } - if(Assignee.IsNotBlank()) + if (Assignee.IsNotBlank()) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "assignee:{0}", Assignee)); } - if(Mentions.IsNotBlank()) + if (Mentions.IsNotBlank()) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "mentions:{0}", Mentions)); } @@ -183,73 +161,58 @@ namespace Octokit parameters.Add(String.Format(CultureInfo.InvariantCulture, "commenter:{0}", Commenter)); } - if(Involves.IsNotBlank()) + if (Involves.IsNotBlank()) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "involves:{0}", Involves)); } - if(State != null) + if (State != null) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "state:{0}", State)); } - if(Labels != null) + if (Labels != null) { - foreach(var label in Labels) + foreach (var label in Labels) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "label:{0}", label)); } } - if(Language != null) + if (Language != null) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "language:{0}", Language)); } - if(Created != null) + if (Created != null) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "created:{0}", Created)); } - if(Updated != null) + if (Updated != null) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "updated:{0}", Updated)); } - if(Comments != null) + if (Comments != null) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "comments:{0}", Comments)); } - if(User.IsNotBlank()) + if (User.IsNotBlank()) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "user:{0}", User)); } - if(Repo.IsNotBlank()) + if (Repo.IsNotBlank()) { parameters.Add(String.Format(CultureInfo.InvariantCulture, "repo:{0}", Repo)); } - - return String.Join("+", parameters); - } - [SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.Int32.ToString")] - public IDictionary Parameters - { - get - { - var d = new Dictionary(); - d.Add("page", Page.ToString()); - d.Add("per_page", PerPage.ToString()); - d.Add("sort", Sort.ToParameter()); - d.Add("order", Order.ToParameter()); - var mergedParameters = MergeParameters(); - d.Add("q", Term + (mergedParameters.IsNotBlank() ? "+" + mergedParameters : "")); - return d; - } + return parameters; } } + public enum IssueSearchSort { /// @@ -271,14 +234,19 @@ namespace Octokit public enum IssueInQualifier { + [Parameter(Value = "title")] Title, + [Parameter(Value = "body")] Body, + [Parameter(Value = "comment")] Comment } public enum IssueTypeQualifier { + [Parameter(Value = "pr")] PR, + [Parameter(Value = "issue")] Issue } }