From a650cbe0020681ea8ddd2c79dc9b7393ea26fb30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Fri, 22 Nov 2019 17:04:32 +0100 Subject: [PATCH] Simplify parsing API issues --- api/queries_issue.go | 98 +++++++++++----------------------- command/issue.go | 29 +++++++--- command/issue_test.go | 6 +-- test/fixtures/issueList.json | 20 ++----- test/fixtures/issueStatus.json | 14 ++--- 5 files changed, 61 insertions(+), 106 deletions(-) diff --git a/api/queries_issue.go b/api/queries_issue.go index 31793e608..69c3dd988 100644 --- a/api/queries_issue.go +++ b/api/queries_issue.go @@ -12,30 +12,23 @@ type IssuesPayload struct { } type Issue struct { - Number int - Title string - URL string - Labels []string - TotalLabelCount int + Number int + Title string + URL string + + Labels struct { + Nodes []IssueLabel + TotalCount int + } +} + +type IssueLabel struct { + Name string } type apiIssues struct { Issues struct { - Edges []struct { - Node struct { - Number int - Title string - URL string - Labels struct { - Edges []struct { - Node struct { - Name string - } - } - TotalCount int - } - } - } + Nodes []Issue } } @@ -43,11 +36,10 @@ const fragments = ` fragment issue on Issue { number title + url labels(first: 3) { - edges { - node { - name - } + nodes { + name } totalCount } @@ -104,28 +96,22 @@ func IssueStatus(client *Client, ghRepo Repo, currentUsername string) (*IssuesPa query($owner: String!, $repo: String!, $since: DateTime!, $viewer: String!, $per_page: Int = 10) { assigned: repository(owner: $owner, name: $repo) { issues(filterBy: {assignee: $viewer, states: OPEN}, first: $per_page, orderBy: {field: CREATED_AT, direction: DESC}) { - edges { - node { - ...issue - } + nodes { + ...issue } } } mentioned: repository(owner: $owner, name: $repo) { issues(filterBy: {mentioned: $viewer, states: OPEN}, first: $per_page, orderBy: {field: CREATED_AT, direction: DESC}) { - edges { - node { - ...issue - } + nodes { + ...issue } } } recent: repository(owner: $owner, name: $repo) { issues(filterBy: {since: $since, states: OPEN}, first: $per_page, orderBy: {field: CREATED_AT, direction: DESC}) { - edges { - node { - ...issue - } + nodes { + ...issue } } } @@ -148,14 +134,10 @@ func IssueStatus(client *Client, ghRepo Repo, currentUsername string) (*IssuesPa return nil, err } - assigned := convertAPIToIssues(resp.Assigned) - mentioned := convertAPIToIssues(resp.Mentioned) - recent := convertAPIToIssues(resp.Recent) - payload := IssuesPayload{ - assigned, - mentioned, - recent, + Assigned: resp.Assigned.Issues.Nodes, + Mentioned: resp.Mentioned.Issues.Nodes, + Recent: resp.Recent.Issues.Nodes, } return &payload, nil @@ -191,10 +173,8 @@ func IssueList(client *Client, ghRepo Repo, state string, labels []string, assig query($owner: String!, $repo: String!, $limit: Int, $states: [IssueState!] = OPEN, $labels: [String!], $assignee: String) { repository(owner: $owner, name: $repo) { issues(first: $limit, orderBy: {field: CREATED_AT, direction: DESC}, states: $states, labels: $labels, filterBy: {assignee: $assignee}) { - edges { - node { - ...issue - } + nodes { + ...issue } } } @@ -221,27 +201,9 @@ func IssueList(client *Client, ghRepo Repo, state string, labels []string, assig return nil, err } - issues := convertAPIToIssues(resp.Repository) - return issues, nil -} - -func convertAPIToIssues(i apiIssues) []Issue { - var issues []Issue - for _, edge := range i.Issues.Edges { - var labels []string - for _, labelEdge := range edge.Node.Labels.Edges { - labels = append(labels, labelEdge.Node.Name) - } - - issue := Issue{ - Number: edge.Node.Number, - Title: edge.Node.Title, - URL: edge.Node.URL, - Labels: labels, - TotalLabelCount: edge.Node.Labels.TotalCount, - } + issues := []Issue{} + for _, issue := range resp.Repository.Issues.Nodes { issues = append(issues, issue) } - - return issues + return issues, nil } diff --git a/command/issue.go b/command/issue.go index 6c4b0597e..ad1db6066 100644 --- a/command/issue.go +++ b/command/issue.go @@ -245,14 +245,27 @@ func issueCreate(cmd *cobra.Command, args []string) error { func printIssues(prefix string, issues ...api.Issue) { for _, issue := range issues { number := utils.Green("#" + strconv.Itoa(issue.Number)) - var coloredLabels string - if len(issue.Labels) > 0 { - var ellipse string - if issue.TotalLabelCount > len(issue.Labels) { - ellipse = "…" - } - coloredLabels = utils.Gray(fmt.Sprintf(" (%s%s)", strings.Join(issue.Labels, ", "), ellipse)) + coloredLabels := labelList(issue) + if coloredLabels != "" { + coloredLabels = utils.Gray(fmt.Sprintf(" (%s)", coloredLabels)) } - fmt.Printf("%s%s %s %s\n", prefix, number, truncate(70, issue.Title), coloredLabels) + fmt.Printf("%s%s %s%s\n", prefix, number, truncate(70, issue.Title), coloredLabels) } } + +func labelList(issue api.Issue) string { + if len(issue.Labels.Nodes) == 0 { + return "" + } + + labelNames := []string{} + for _, label := range issue.Labels.Nodes { + labelNames = append(labelNames, label.Name) + } + + list := strings.Join(labelNames, ", ") + if issue.Labels.TotalCount > len(issue.Labels.Nodes) { + list += ", …" + } + return list +} diff --git a/command/issue_test.go b/command/issue_test.go index 09a55609f..7c76859f7 100644 --- a/command/issue_test.go +++ b/command/issue_test.go @@ -55,9 +55,9 @@ func TestIssueList(t *testing.T) { } expectedIssues := []*regexp.Regexp{ - regexp.MustCompile(`#1.*won`), - regexp.MustCompile(`#2.*too`), - regexp.MustCompile(`#4.*fore`), + regexp.MustCompile(`(?m)^1\t.*won`), + regexp.MustCompile(`(?m)^2\t.*too`), + regexp.MustCompile(`(?m)^4\t.*fore`), } for _, r := range expectedIssues { diff --git a/test/fixtures/issueList.json b/test/fixtures/issueList.json index 17e92c743..b22899cee 100644 --- a/test/fixtures/issueList.json +++ b/test/fixtures/issueList.json @@ -2,57 +2,45 @@ "data": { "repository": { "issues": { - "edges": [ + "nodes": [ { - "node": { "number": 1, "title": "number won", "url": "https://wow.com", "labels": { - "edges": [ + "nodes": [ { - "node": { "name": "label" - } } ], "totalCount": 1 } - } }, { - "node": { "number": 2, "title": "number too", "url": "https://wow.com", "labels": { - "edges": [ + "nodes": [ { - "node": { "name": "label" - } } ], "totalCount": 1 } - } }, { - "node": { "number": 4, "title": "number fore", "url": "https://wow.com", "labels": { - "edges": [ + "nodes": [ { - "node": { "name": "label" - } } ], "totalCount": 1 } - } } ] } diff --git a/test/fixtures/issueStatus.json b/test/fixtures/issueStatus.json index 784c0cc8f..37d0818da 100644 --- a/test/fixtures/issueStatus.json +++ b/test/fixtures/issueStatus.json @@ -2,43 +2,35 @@ "data": { "assigned": { "issues": { - "edges": [ + "nodes": [ { - "node": { "number": 9, "title": "corey thinks squash tastes bad" - } }, { - "node": { "number": 10, "title": "broccoli is a superfood" - } } ] } }, "mentioned": { "issues": { - "edges": [ + "nodes": [ { - "node": { "number": 8, "title": "rabbits eat carrots" - } }, { - "node": { "number": 11, "title": "swiss chard is neutral" - } } ] } }, "recent": { "issues": { - "edges": [] + "nodes": [] } },