Skip to content

Commit 7bc6230

Browse files
authored
feat: Support custom delimiter (#662)
1 parent 25d7416 commit 7bc6230

File tree

5 files changed

+50
-11
lines changed

5 files changed

+50
-11
lines changed

internal/cmd/issue/list/list.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ $ jira issue list --plain --columns key,assignee,status
5050
# List issues in a plain table view and show all fields
5151
$ jira issue list --plain --no-truncate
5252
53+
# List issues in a plain table view using custom delimiter (default is "\t")
54+
$ jira issue list --plain --delimeter "|"
55+
5356
# List issues as raw JSON data
5457
$ jira issue list --raw
5558
@@ -141,6 +144,10 @@ func loadList(cmd *cobra.Command, args []string) {
141144
plain, err := cmd.Flags().GetBool("plain")
142145
cmdutil.ExitIfError(err)
143146

147+
148+
delimiter, err := cmd.Flags().GetString("delimiter")
149+
cmdutil.ExitIfError(err)
150+
144151
csv, err := cmd.Flags().GetBool("csv")
145152
cmdutil.ExitIfError(err)
146153

@@ -174,6 +181,7 @@ func loadList(cmd *cobra.Command, args []string) {
174181
},
175182
Display: view.DisplayFormat{
176183
Plain: plain,
184+
Delimiter: delimiter,
177185
CSV: csv,
178186
NoHeaders: noHeaders,
179187
NoTruncate: noTruncate,
@@ -236,6 +244,7 @@ func SetFlags(cmd *cobra.Command) {
236244
cmd.Flags().Bool("plain", false, "Display output in plain mode")
237245
cmd.Flags().Bool("no-headers", false, "Don't display table headers in plain mode. Works only with --plain")
238246
cmd.Flags().Bool("no-truncate", false, "Show all available columns in plain mode. Works only with --plain")
247+
cmd.Flags().String("delimiter", "\t", "Custom delimeter for columns in plain mode. Works only with --plain")
239248
cmd.Flags().Uint("comments", 1, "Show N comments when viewing the issue")
240249
cmd.Flags().Bool("raw", false, "Print raw JSON output")
241250
cmd.Flags().Bool("csv", false, "Print output in CSV format")

internal/view/helper.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,13 @@ func copyKey() tui.CopyKeyFunc {
152152
}
153153
}
154154

155-
func renderPlain(w io.Writer, data tui.TableData) error {
155+
func renderPlain(w io.Writer, data tui.TableData, delimiter string) error {
156156
for _, items := range data {
157157
n := len(items)
158158
for j, v := range items {
159159
_, _ = fmt.Fprintf(w, "%s", unescape(v))
160160
if j != n-1 {
161-
_, _ = fmt.Fprintf(w, "\t")
161+
fmt.Fprintf(w, "%s", delimiter)
162162
}
163163
}
164164
_, _ = fmt.Fprintln(w)

internal/view/issues.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
// DisplayFormat is a issue display type.
1717
type DisplayFormat struct {
1818
Plain bool
19+
Delimiter string
1920
CSV bool
2021
NoHeaders bool
2122
NoTruncate bool
@@ -40,8 +41,13 @@ type IssueList struct {
4041
// Render renders the view.
4142
func (l *IssueList) Render() error {
4243
if l.Display.Plain || tui.IsDumbTerminal() || tui.IsNotTTY() {
44+
// custom delimiter is used only in plain mode, otherwise \t is used
45+
delimeter := "\t"
46+
if l.Display.Plain {
47+
delimeter = l.Display.Delimiter
48+
}
4349
w := tabwriter.NewWriter(os.Stdout, 0, tabWidth, 1, '\t', 0)
44-
return l.renderPlain(w)
50+
return l.renderPlain(w, delimeter)
4551
}
4652

4753
if l.Display.CSV {
@@ -129,9 +135,9 @@ func (l *IssueList) Render() error {
129135
return view.Paint(data)
130136
}
131137

132-
// renderPlain renders issues in plain formatted view.
133-
func (l *IssueList) renderPlain(w io.Writer) error {
134-
return renderPlain(w, l.data())
138+
// renderPlain renders the issue in plain view.
139+
func (l *IssueList) renderPlain(w io.Writer, delimeter string) error {
140+
return renderPlain(w, l.data(), delimeter)
135141
}
136142

137143
// renderCSV renders issues in csv format.

internal/view/issues_test.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestIssueRenderInPlainView(t *testing.T) {
5252
NoTruncate: false,
5353
},
5454
}
55-
assert.NoError(t, issue.renderPlain(&b))
55+
assert.NoError(t, issue.renderPlain(&b, "\t"))
5656

5757
expected := `TYPE KEY SUMMARY STATUS
5858
Bug TEST-1 This is a test Done
@@ -61,6 +61,29 @@ Story TEST-2 This is another test Open
6161
assert.Equal(t, expected, b.String())
6262
}
6363

64+
func TestIssueRenderInPlainViewWithCustomDelimiter(t *testing.T) {
65+
var b bytes.Buffer
66+
67+
issue := IssueList{
68+
Total: 2,
69+
Project: "TEST",
70+
Server: "https://test.local",
71+
Data: getIssues(),
72+
Display: DisplayFormat{
73+
Plain: true,
74+
NoHeaders: false,
75+
NoTruncate: false,
76+
},
77+
}
78+
assert.NoError(t, issue.renderPlain(&b, "|"))
79+
80+
expected := `TYPE|KEY|SUMMARY|STATUS
81+
Bug|TEST-1|This is a test|Done
82+
Story|TEST-2|This is another test|Open
83+
`
84+
assert.Equal(t, expected, b.String())
85+
}
86+
6487
func TestIssueRenderInPlainViewAndNoTruncate(t *testing.T) {
6588
var b bytes.Buffer
6689

@@ -75,7 +98,7 @@ func TestIssueRenderInPlainViewAndNoTruncate(t *testing.T) {
7598
NoTruncate: true,
7699
},
77100
}
78-
assert.NoError(t, issue.renderPlain(&b))
101+
assert.NoError(t, issue.renderPlain(&b, "\t"))
79102

80103
expected := `TYPE KEY SUMMARY STATUS ASSIGNEE REPORTER PRIORITY RESOLUTION CREATED UPDATED LABELS
81104
Bug TEST-1 This is a test Done Person A Person Z High Fixed 2020-12-13 14:05:20 2020-12-13 14:07:20 krakatit
@@ -98,7 +121,7 @@ func TestIssueRenderInPlainViewWithoutHeaders(t *testing.T) {
98121
NoTruncate: true,
99122
},
100123
}
101-
assert.NoError(t, issue.renderPlain(&b))
124+
assert.NoError(t, issue.renderPlain(&b, "\t"))
102125

103126
expected := `Bug TEST-1 This is a test Done Person A Person Z High Fixed 2020-12-13 14:05:20 2020-12-13 14:07:20 krakatit
104127
Story TEST-2 This is another test Open Person A Normal 2020-12-13 14:05:20 2020-12-13 14:07:20 pat,mat
@@ -122,7 +145,7 @@ func TestIssueRenderInPlainViewWithFewColumns(t *testing.T) {
122145
Columns: []string{"key", "type", "status", "created"},
123146
},
124147
}
125-
assert.NoError(t, issue.renderPlain(&b))
148+
assert.NoError(t, issue.renderPlain(&b, "\t"))
126149

127150
expected := `KEY TYPE STATUS CREATED
128151
TEST-1 Bug Done 2020-12-13 14:05:20

internal/view/sprint.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ func (sl *SprintList) RenderInTable() error {
100100

101101
// renderPlain renders the issue in plain view.
102102
func (sl *SprintList) renderPlain(w io.Writer) error {
103-
return renderPlain(w, sl.tableData())
103+
// sprint view supports only \t as delimiter, not custom.
104+
return renderPlain(w, sl.tableData(), "\t")
104105
}
105106

106107
func (sl *SprintList) data() []tui.PreviewData {

0 commit comments

Comments
 (0)