Skip to content

Commit

Permalink
Added "json" as specific value for --format flag in list commands, as…
Browse files Browse the repository at this point in the history
… an alias to `{{json .}}`

Signed-off-by: Silvin Lubecki <[email protected]>
  • Loading branch information
silvin-lubecki committed Jan 19, 2021
1 parent 78fc2f1 commit f69b3c5
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 3 deletions.
17 changes: 14 additions & 3 deletions cli/command/formatter/formatter.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,21 @@ import (
"text/tabwriter"
"text/template"

"github.com/docker/cli/templates"
"github.com/pkg/errors"

"github.com/docker/cli/templates"
)

// Format keys used to specify certain kinds of output formats
const (
TableFormatKey = "table"
RawFormatKey = "raw"
PrettyFormatKey = "pretty"
JSONFormatKey = "json"

DefaultQuietFormat = "{{.ID}}"

jsonFormat = "{{json .}}"
)

// Format is the format string rendered using the Context
Expand All @@ -28,6 +32,11 @@ func (f Format) IsTable() bool {
return strings.HasPrefix(string(f), TableFormatKey)
}

// IsJSON returns true if the format is the json format
func (f Format) IsJSON() bool {
return string(f) == JSONFormatKey
}

// Contains returns true if the format contains the substring
func (f Format) Contains(sub string) bool {
return strings.Contains(string(f), sub)
Expand All @@ -50,10 +59,12 @@ type Context struct {

func (c *Context) preFormat() {
c.finalFormat = string(c.Format)

// TODO: handle this in the Format type
if c.Format.IsTable() {
switch {
case c.Format.IsTable():
c.finalFormat = c.finalFormat[len(TableFormatKey):]
case c.Format.IsJSON():
c.finalFormat = jsonFormat
}

c.finalFormat = strings.Trim(c.finalFormat, " ")
Expand Down
68 changes: 68 additions & 0 deletions cli/command/formatter/formatter_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package formatter

import (
"bytes"
"testing"

"gotest.tools/v3/assert"
)

func TestFormat(t *testing.T) {
f := Format("json")
assert.Assert(t, f.IsJSON())
assert.Assert(t, !f.IsTable())

f = Format("table")
assert.Assert(t, !f.IsJSON())
assert.Assert(t, f.IsTable())

f = Format("other")
assert.Assert(t, !f.IsJSON())
assert.Assert(t, !f.IsTable())
}

type fakeSubContext struct {
Name string
}

func (f fakeSubContext) FullHeader() interface{} {
return map[string]string{"Name": "NAME"}
}

func TestContext(t *testing.T) {
testCases := []struct {
name string
format string
expected string
}{
{
name: "json format",
format: JSONFormatKey,
expected: `{"Name":"test"}
`,
},
{
name: "table format",
format: `table {{.Name}}`,
expected: `NAME
test
`,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
buf := bytes.NewBuffer(nil)
ctx := Context{
Format: Format(tc.format),
Output: buf,
}
subContext := fakeSubContext{Name: "test"}
subFormat := func(f func(sub SubContext) error) error {
return f(subContext)
}
err := ctx.Write(&subContext, subFormat)
assert.NilError(t, err)
assert.Equal(t, buf.String(), tc.expected)
})
}
}

0 comments on commit f69b3c5

Please sign in to comment.