Skip to content

Commit 2cc7312

Browse files
Gaurab DeyDale Wick
authored andcommitted
Fix column filter when printing multiple tables
- Table Print can accept a list of columns which will be printed when other tables are printed, and therefore are non-error column filters. [#162819971](https://www.pivotaltracker.com/story/show/162819971) Signed-off-by: Dale Wick <dwick@pivotal.io>
1 parent 18df66a commit 2cc7312

17 files changed

Lines changed: 343 additions & 63 deletions

cmd/inspect_release.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ func (c InspectReleaseCmd) Run(opts InspectReleaseOpts) error {
9292
pkgsTable.Sections = append(pkgsTable.Sections, section)
9393
}
9494

95-
c.ui.PrintTable(jobsTable)
96-
c.ui.PrintTable(pkgsTable)
95+
c.ui.PrintTableFiltered(jobsTable, pkgsTable.Header)
96+
c.ui.PrintTableFiltered(pkgsTable, jobsTable.Header)
9797

9898
return nil
9999
}

ui/color_ui.go

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,23 +47,15 @@ func (ui *ColorUI) PrintErrorBlock(block string) {
4747
}
4848

4949
func (ui *ColorUI) PrintTable(table Table) {
50-
table.HeaderFormatFunc = ui.boldFunc
50+
ui.printTableHeader(&table)
5151

52-
for k, s := range table.Sections {
53-
for i, r := range s.Rows {
54-
for j, v := range r {
55-
table.Sections[k].Rows[i][j] = ui.colorValueFmt(v)
56-
}
57-
}
58-
}
52+
ui.parent.PrintTable(table)
53+
}
5954

60-
for i, r := range table.Rows {
61-
for j, v := range r {
62-
table.Rows[i][j] = ui.colorValueFmt(v)
63-
}
64-
}
55+
func (ui *ColorUI) PrintTableFiltered(table Table, filterHeader []Header) {
56+
ui.printTableHeader(&table)
6557

66-
ui.parent.PrintTable(table)
58+
ui.parent.PrintTableFiltered(table, filterHeader)
6759
}
6860

6961
func (ui *ColorUI) AskForText(label string) (string, error) {
@@ -90,6 +82,24 @@ func (ui *ColorUI) Flush() {
9082
ui.parent.Flush()
9183
}
9284

85+
func (ui *ColorUI) printTableHeader(table *Table) {
86+
table.HeaderFormatFunc = ui.boldFunc
87+
88+
for k, s := range table.Sections {
89+
for i, r := range s.Rows {
90+
for j, v := range r {
91+
table.Sections[k].Rows[i][j] = ui.colorValueFmt(v)
92+
}
93+
}
94+
}
95+
96+
for i, r := range table.Rows {
97+
for j, v := range r {
98+
table.Rows[i][j] = ui.colorValueFmt(v)
99+
}
100+
}
101+
}
102+
93103
func (ui *ColorUI) colorValueFmt(val Value) Value {
94104
if valFmt, ok := val.(ValueFmt); ok {
95105
if valFmt.Error {

ui/conf_ui.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,17 @@ func (ui *ConfUI) PrintTable(table Table) {
9191
ui.parent.PrintTable(table)
9292
}
9393

94+
func (ui *ConfUI) PrintTableFiltered(table Table, filterHeader []Header) {
95+
if len(ui.showColumns) > 0 {
96+
err := table.SetColumnVisibilityFiltered(ui.showColumns, filterHeader)
97+
if err != nil {
98+
panic(err)
99+
}
100+
}
101+
102+
ui.parent.PrintTableFiltered(table, filterHeader)
103+
}
104+
94105
func (ui *ConfUI) AskForText(label string) (string, error) {
95106
return ui.parent.AskForText(label)
96107
}

ui/fakes/fake_ui.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,14 @@ func (ui *FakeUI) PrintTable(table Table) {
9393
ui.Tables = append(ui.Tables, table)
9494
}
9595

96+
func (ui *FakeUI) PrintTableFiltered(table Table, filterHeader []Header) {
97+
ui.mutex.Lock()
98+
defer ui.mutex.Unlock()
99+
100+
ui.Table = table
101+
ui.Tables = append(ui.Tables, table)
102+
}
103+
96104
func (ui *FakeUI) AskForText(label string) (string, error) {
97105
ui.mutex.Lock()
98106
defer ui.mutex.Unlock()

ui/indenting_ui.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ func (ui *indentingUI) PrintTable(table Table) {
4242
ui.parent.PrintTable(table)
4343
}
4444

45+
func (ui *indentingUI) PrintTableFiltered(table Table, filterHeader []Header) {
46+
ui.parent.PrintTableFiltered(table, filterHeader)
47+
}
48+
4549
func (ui *indentingUI) AskForText(label string) (string, error) {
4650
return ui.parent.AskForText(label)
4751
}

ui/indenting_ui_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,24 @@ var _ = Describe("IndentingUI", func() {
104104
})
105105
})
106106

107+
Describe("PrintTableFiltered", func() {
108+
BeforeEach(func() {
109+
parentUI = parentFakeUI
110+
})
111+
112+
It("delegates to the parent UI", func() {
113+
table := Table{
114+
Content: "things",
115+
Header: []Header{NewHeader("header1")},
116+
}
117+
filteredHeader := []Header{}
118+
119+
ui.PrintTableFiltered(table, filteredHeader)
120+
121+
Expect(parentFakeUI.Table).To(Equal(table))
122+
})
123+
})
124+
107125
Describe("IsInteractive", func() {
108126
BeforeEach(func() {
109127
parentUI = parentFakeUI

ui/interfaces.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type UI interface {
1515
PrintErrorBlock(string)
1616

1717
PrintTable(Table)
18+
PrintTableFiltered(Table, []Header)
1819

1920
AskForText(label string) (string, error)
2021
AskForChoice(label string, options []string) (int, error)

ui/json_ui.go

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -61,42 +61,12 @@ func (ui *jsonUI) PrintErrorBlock(block string) {
6161
}
6262

6363
func (ui *jsonUI) PrintTable(table Table) {
64-
table.FillFirstColumn = true
65-
66-
header := map[string]string{}
67-
68-
if len(table.Header) > 0 {
69-
for i, val := range table.Header {
70-
if val.Hidden {
71-
continue
72-
}
73-
74-
if val.Key == string(UNKNOWN_HEADER_MAPPING) {
75-
table.Header[i].Key = strconv.Itoa(i)
76-
}
77-
78-
header[table.Header[i].Key] = val.Title
79-
}
80-
} else if len(table.AsRows()) > 0 {
81-
var rawHeaders []Header
82-
for i, _ := range table.AsRows()[0] {
83-
val := Header{
84-
Key: fmt.Sprintf("col_%d", i),
85-
Hidden: false,
86-
}
87-
header[val.Key] = val.Title
88-
rawHeaders = append(rawHeaders, val)
89-
}
90-
table.Header = rawHeaders
91-
}
92-
93-
resp := tableResp{
94-
Content: table.Content,
95-
Header: header,
96-
Rows: ui.stringRows(table.Header, table.AsRows()),
97-
Notes: table.Notes,
98-
}
64+
resp := ui.printTableHeader(&table)
65+
ui.uiResp.Tables = append(ui.uiResp.Tables, resp)
66+
}
9967

68+
func (ui *jsonUI) PrintTableFiltered(table Table, filterHeader []Header) {
69+
resp := ui.printTableHeader(&table)
10070
ui.uiResp.Tables = append(ui.uiResp.Tables, resp)
10171
}
10272

@@ -134,6 +104,46 @@ func (ui *jsonUI) Flush() {
134104
}
135105
}
136106

107+
func (ui *jsonUI) printTableHeader(table *Table) tableResp {
108+
table.FillFirstColumn = true
109+
110+
header := map[string]string{}
111+
112+
if len(table.Header) > 0 {
113+
for i, val := range table.Header {
114+
if val.Hidden {
115+
continue
116+
}
117+
118+
if val.Key == string(UNKNOWN_HEADER_MAPPING) {
119+
table.Header[i].Key = strconv.Itoa(i)
120+
}
121+
122+
header[table.Header[i].Key] = val.Title
123+
}
124+
} else if len(table.AsRows()) > 0 {
125+
var rawHeaders []Header
126+
for i, _ := range table.AsRows()[0] {
127+
val := Header{
128+
Key: fmt.Sprintf("col_%d", i),
129+
Hidden: false,
130+
}
131+
header[val.Key] = val.Title
132+
rawHeaders = append(rawHeaders, val)
133+
}
134+
table.Header = rawHeaders
135+
}
136+
137+
resp := tableResp{
138+
Content: table.Content,
139+
Header: header,
140+
Rows: ui.stringRows(table.Header, table.AsRows()),
141+
Notes: table.Notes,
142+
}
143+
144+
return resp
145+
}
146+
137147
func (ui *jsonUI) stringRows(header []Header, rows [][]Value) []map[string]string {
138148
result := []map[string]string{}
139149

ui/json_ui_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,51 @@ var _ = Describe("JSONUI", func() {
292292
})
293293
})
294294

295+
Describe("PrintTableFiltered", func() {
296+
It("includes Headers in Tables", func() {
297+
table := Table{
298+
Content: "things",
299+
Header: []Header{
300+
NewHeader("Header1"),
301+
NewHeader("Header2"),
302+
},
303+
304+
Rows: [][]Value{
305+
{ValueString{S: "r1c1"}, ValueString{S: "r1c2"}},
306+
{ValueString{S: "r2c1"}, ValueString{S: "r2c2"}},
307+
},
308+
309+
Notes: []string{"note1", "note2"},
310+
}
311+
312+
table2 := Table{
313+
Content: "things2",
314+
}
315+
316+
filteredHeader := []Header{}
317+
318+
ui.PrintTableFiltered(table, filteredHeader)
319+
ui.PrintTableFiltered(table2, filteredHeader)
320+
321+
Expect(finalOutput()).To(Equal(uiResp{
322+
Tables: []tableResp{
323+
{
324+
Content: "things",
325+
Header: map[string]string{"header1": "Header1", "header2": "Header2"},
326+
Rows: []map[string]string{{"header1": "r1c1", "header2": "r1c2"},
327+
{"header1": "r2c1", "header2": "r2c2"}},
328+
Notes: []string{"note1", "note2"},
329+
},
330+
{
331+
Content: "things2",
332+
Header: map[string]string{},
333+
Rows: []map[string]string{},
334+
},
335+
},
336+
}))
337+
})
338+
})
339+
295340
Describe("AskForText", func() {
296341
It("panics", func() {
297342
Expect(func() { ui.AskForText("") }).To(Panic())

ui/non_interactive.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ func (ui *nonInteractiveUI) PrintTable(table Table) {
4141
ui.parent.PrintTable(table)
4242
}
4343

44+
func (ui *nonInteractiveUI) PrintTableFiltered(table Table, filterHeader []Header) {
45+
ui.parent.PrintTableFiltered(table, filterHeader)
46+
}
47+
4448
func (ui *nonInteractiveUI) AskForText(label string) (string, error) {
4549
panic(bosherr.NewUserError("Cannot ask for input in non-interactive UI"))
4650
}

0 commit comments

Comments
 (0)