Skip to content

Commit

Permalink
jq: add option to pretty print JSON output
Browse files Browse the repository at this point in the history
Adds a new function `EvaluateFormatted` to maintain backward compatibility.
Indenting output by 2 spaces matches jq output.
  • Loading branch information
mjpieters committed Mar 27, 2023
1 parent 32d3260 commit d3a4294
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 17 deletions.
9 changes: 9 additions & 0 deletions pkg/jq/jq.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ import (

// Evaluate a jq expression against an input and write it to an output.
func Evaluate(input io.Reader, output io.Writer, expr string) error {
return EvaluateFormatted(input, output, expr, false)
}

// Evaluate a jq expression against an input and write it to an output, either without
// whitespace or with 2 spaces of indentation per level (pretty printed).
func EvaluateFormatted(input io.Reader, output io.Writer, expr string, pretty_print bool) error {
query, err := gojq.Parse(expr)
if err != nil {
return err
Expand All @@ -40,6 +46,9 @@ func Evaluate(input io.Reader, output io.Writer, expr string) error {
}

enc := json.NewEncoder(output)
if pretty_print {
enc.SetIndent("", " ") // pretty print, jq style
}

iter := code.Run(responseData)
for {
Expand Down
51 changes: 34 additions & 17 deletions pkg/jq/jq_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ import (
"github.com/stretchr/testify/assert"
)

func TestEvaluate(t *testing.T) {
func TestEvaluateFormatted(t *testing.T) {
t.Setenv("CODE", "code_c")
type args struct {
json io.Reader
expr string
json io.Reader
expr string
pretty_print bool
}
tests := []struct {
name string
Expand All @@ -25,40 +26,54 @@ func TestEvaluate(t *testing.T) {
{
name: "simple",
args: args{
json: strings.NewReader(`{"name":"Mona", "arms":8}`),
expr: `.name`,
json: strings.NewReader(`{"name":"Mona", "arms":8}`),
expr: `.name`,
pretty_print: false,
},
wantW: "Mona\n",
},
{
name: "multiple queries",
args: args{
json: strings.NewReader(`{"name":"Mona", "arms":8}`),
expr: `.name,.arms`,
json: strings.NewReader(`{"name":"Mona", "arms":8}`),
expr: `.name,.arms`,
pretty_print: false,
},
wantW: "Mona\n8\n",
},
{
name: "object as JSON",
args: args{
json: strings.NewReader(`{"user":{"login":"monalisa"}}`),
expr: `.user`,
json: strings.NewReader(`{"user":{"login":"monalisa"}}`),
expr: `.user`,
pretty_print: false,
},
wantW: "{\"login\":\"monalisa\"}\n",
},
{
name: "object as JSON, pretty printed",
args: args{
json: strings.NewReader(`{"user":{"login":"monalisa"}}`),
expr: `.user`,
pretty_print: true,
},
wantW: "{\n \"login\": \"monalisa\"\n}\n",
},
{
name: "empty array",
args: args{
json: strings.NewReader(`[]`),
expr: `.`,
json: strings.NewReader(`[]`),
expr: `.`,
pretty_print: false,
},
wantW: "[]\n",
},
{
name: "empty array 2",
args: args{
json: strings.NewReader(`[]`),
expr: `[]`,
json: strings.NewReader(`[]`),
expr: `[]`,
pretty_print: false,
},
wantW: "[]\n",
},
Expand All @@ -79,7 +94,8 @@ func TestEvaluate(t *testing.T) {
"labels": [{}, {"name":"feature"}]
}
]`)),
expr: `.[] | [.title,(.labels | map(.name) | join(","))] | @tsv`,
expr: `.[] | [.title,(.labels | map(.name) | join(","))] | @tsv`,
pretty_print: false,
},
wantW: heredoc.Doc(`
First title bug,help wanted
Expand All @@ -104,15 +120,16 @@ func TestEvaluate(t *testing.T) {
"labels": [{}, {"name":"feature"}]
}
]`)),
expr: `.[] | select(.title == env.CODE) | .labels`,
expr: `.[] | select(.title == env.CODE) | .labels`,
pretty_print: true,
},
wantW: "[{},{\"name\":\"feature\"}]\n",
wantW: "[\n {},\n {\n \"name\": \"feature\"\n }\n]\n",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
w := &bytes.Buffer{}
err := Evaluate(tt.args.json, w, tt.args.expr)
err := EvaluateFormatted(tt.args.json, w, tt.args.expr, tt.args.pretty_print)
if tt.wantErr {
assert.Error(t, err)
return
Expand Down

0 comments on commit d3a4294

Please sign in to comment.