Merge pull request #851 from MichaelMure/feat-836-machine-parseable-ls-text

Steve Moyer created

feat(836): updates default `ls` formatter for TSV output

Change summary

commands/ls.go      |  2 
commands/ls_test.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 59 insertions(+), 1 deletion(-)

Detailed changes

commands/ls.go 🔗

@@ -279,7 +279,7 @@ func lsDefaultFormatter(env *Env, bugExcerpts []*cache.BugExcerpt) error {
 			comments = "  ∞ 💬"
 		}
 
-		env.out.Printf("%s %s\t%s\t%s\t%s\n",
+		env.out.Printf("%s\t%s\t%s\t%s\t%s\n",
 			colors.Cyan(b.Id.Human()),
 			colors.Yellow(b.Status),
 			titleFmt+labelsFmt,

commands/ls_test.go 🔗

@@ -1,6 +1,8 @@
 package commands
 
 import (
+	"encoding/json"
+	"fmt"
 	"testing"
 
 	"github.com/stretchr/testify/require"
@@ -41,3 +43,59 @@ func Test_repairQuery(t *testing.T) {
 		require.Equal(t, tc.output, repairQuery(tc.args))
 	}
 }
+
+func TestLs_Format(t *testing.T) {
+	const expOrgMode = `^#+TODO: OPEN | CLOSED
+[*] OPEN   [0-9a-f]{7} \[\d\d\d\d-\d\d-\d\d [[:alpha:]]{3} \d\d:\d\d\] John Doe: this is a bug title ::
+[*]{2} Last Edited: \[\d\d\d\d-\d\d-\d\d [[:alpha:]]{3} \d\d:\d\d\]
+[*]{2} Actors:
+: [0-9a-f]{7} John Doe
+[*]{2} Participants:
+: [0-9a-f]{7} John Doe
+$`
+
+	cases := []struct {
+		format string
+		exp    string
+	}{
+		{"default", "^[0-9a-f]{7}\topen\tthis is a bug title                               \tJohn Doe       \t\n$"},
+		{"plain", "^[0-9a-f]{7} \\[open\\] this is a bug title\n$"},
+		{"compact", "^[0-9a-f]{7} open this is a bug title                            John Doe\n$"},
+		{"org-mode", expOrgMode},
+	}
+
+	for _, testcase := range cases {
+		opts := lsOptions{
+			sortDirection: "asc",
+			sortBy:        "creation",
+			outputFormat:  testcase.format,
+		}
+
+		name := fmt.Sprintf("with %s format", testcase.format)
+
+		t.Run(name, func(t *testing.T) {
+			env, _ := newTestEnvAndBug(t)
+
+			require.NoError(t, runLs(env.env, opts, []string{}))
+			t.Log(env.out.String())
+			require.Regexp(t, testcase.exp, env.out.String())
+		})
+	}
+
+	t.Run("with JSON format", func(t *testing.T) {
+		opts := lsOptions{
+			sortDirection: "asc",
+			sortBy:        "creation",
+			outputFormat:  "json",
+		}
+
+		env, _ := newTestEnvAndBug(t)
+
+		require.NoError(t, runLs(env.env, opts, []string{}))
+
+		bugs := []JSONBugExcerpt{}
+		require.NoError(t, json.Unmarshal(env.out.Bytes(), &bugs))
+
+		require.Len(t, bugs, 1)
+	})
+}