Skip to content

Commit f862a56

Browse files
authored
Merge pull request #1124 from jdelnano/add-json-flags-to-remaining-table-rendering-cmds
[Ready for Review] Add json flag to remaining table.Render-ing cmds
2 parents b3d26e7 + e6308b5 commit f862a56

13 files changed

+188
-44
lines changed

cmd/context.go

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"io"
67
"os"
@@ -67,6 +68,8 @@ func newContextCommand(config *settings.Config) *cobra.Command {
6768
return validateToken(config)
6869
}
6970

71+
jsonFormat := false
72+
7073
command := &cobra.Command{
7174
Use: "context",
7275
Long: `Contexts provide a mechanism for securing and sharing environment variables across
@@ -94,13 +97,14 @@ are injected at runtime.`,
9497
return err
9598
}
9699

97-
return listContexts(contextClient, org.Organization.Name, org.Organization.ID)
100+
return listContexts(cmd, contextClient, org.Organization.Name, org.Organization.ID)
98101
},
99102
Args: MultiExactArgs(0, 2),
100103
Example: `circleci context list --org-id 00000000-0000-0000-0000-000000000000
101104
(deprecated usage) circleci context list <vcs-type> <org-name>`,
102105
}
103106
listCommand.Flags().StringVar(&orgID, "org-id", "", orgIDUsage)
107+
listCommand.Flags().BoolVar(&jsonFormat, "json", false, "Return output back in JSON format")
104108

105109
showContextCommand := &cobra.Command{
106110
Short: "Show a context",
@@ -206,23 +210,41 @@ are injected at runtime.`,
206210
return command
207211
}
208212

209-
func listContexts(contextClient context.ContextInterface, orgName string, orgId string) error {
213+
func listContexts(cmd *cobra.Command, contextClient context.ContextInterface, orgName string, orgId string) error {
210214
contexts, err := contextClient.Contexts()
211215
if err != nil {
212216
return err
213217
}
214218

215-
table := tablewriter.NewWriter(os.Stdout)
216-
table.SetHeader([]string{"Organization", "Org ID", "Name", "Created At"})
217-
for _, context := range contexts {
218-
table.Append([]string{
219-
orgName,
220-
orgId,
221-
context.Name,
222-
context.CreatedAt.Format(time.RFC3339),
223-
})
219+
jsonVal, err := cmd.Flags().GetBool("json")
220+
if err != nil {
221+
return err
224222
}
225-
table.Render()
223+
224+
if jsonVal {
225+
// return JSON formatted for output
226+
jsonCtxs, err := json.Marshal(contexts)
227+
if err != nil {
228+
return err
229+
}
230+
jsonWriter := cmd.OutOrStdout()
231+
if _, err := jsonWriter.Write(jsonCtxs); err != nil {
232+
return err
233+
}
234+
} else {
235+
table := tablewriter.NewWriter(os.Stdout)
236+
table.SetHeader([]string{"Organization", "Org ID", "Name", "Created At"})
237+
for _, context := range contexts {
238+
table.Append([]string{
239+
orgName,
240+
orgId,
241+
context.Name,
242+
context.CreatedAt.Format(time.RFC3339),
243+
})
244+
}
245+
table.Render()
246+
}
247+
226248
return nil
227249
}
228250

cmd/create_telemetry_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,14 @@ func TestLoadTelemetrySettings(t *testing.T) {
6060
UniqueID: uniqueId,
6161
},
6262
telemetryEvents: []telemetry.Event{
63-
{Object: "cli-telemetry", Action: "enabled",
63+
{
64+
Object: "cli-telemetry", Action: "enabled",
6465
Properties: map[string]interface{}{
6566
"UUID": uniqueId,
6667
"user_id": userId,
6768
"is_self_hosted": false,
68-
}},
69+
},
70+
},
6971
},
7072
},
7173
},

cmd/info/info.go

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package info
22

33
import (
4+
"encoding/json"
5+
46
"github.com/CircleCI-Public/circleci-cli/api/info"
57
"github.com/CircleCI-Public/circleci-cli/cmd/validator"
68
"github.com/CircleCI-Public/circleci-cli/settings"
@@ -20,6 +22,8 @@ type infoOptions struct {
2022
func NewInfoCommand(config *settings.Config, preRunE validator.Validator) *cobra.Command {
2123
client, _ := info.NewInfoClient(*config)
2224

25+
jsonFormat := false
26+
2327
opts := infoOptions{
2428
cfg: config,
2529
validator: preRunE,
@@ -29,6 +33,8 @@ func NewInfoCommand(config *settings.Config, preRunE validator.Validator) *cobra
2933
Short: "Check information associated to your user account.",
3034
}
3135
orgInfoCmd := orgInfoCommand(client, opts)
36+
orgInfoCmd.PersistentFlags().BoolVar(&jsonFormat, "json", false,
37+
"Return output back in JSON format")
3238
infoCommand.AddCommand(orgInfoCmd)
3339

3440
return infoCommand
@@ -63,15 +69,33 @@ func getOrgInformation(cmd *cobra.Command, client info.InfoClient) error {
6369
return err
6470
}
6571

66-
table := tablewriter.NewWriter(cmd.OutOrStdout())
72+
jsonVal, err := cmd.Flags().GetBool("json")
73+
if err != nil {
74+
return err
75+
}
6776

68-
table.SetHeader([]string{"ID", "Name"})
77+
if jsonVal {
78+
// return JSON formatted for output
79+
jsonResp, err := json.Marshal(resp)
80+
if err != nil {
81+
return err
82+
}
83+
jsonWriter := cmd.OutOrStdout()
84+
if _, err := jsonWriter.Write(jsonResp); err != nil {
85+
return err
86+
}
87+
} else {
88+
table := tablewriter.NewWriter(cmd.OutOrStdout())
6989

70-
for _, info := range *resp {
71-
table.Append([]string{
72-
info.ID, info.Name,
73-
})
90+
table.SetHeader([]string{"ID", "Name"})
91+
92+
for _, info := range *resp {
93+
table.Append([]string{
94+
info.ID, info.Name,
95+
})
96+
}
97+
table.Render()
7498
}
75-
table.Render()
99+
76100
return nil
77101
}

cmd/info/info_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func TestTelemetry(t *testing.T) {
152152
assert.DeepEqual(t, telemetryClient.events, []telemetry.Event{
153153
telemetry.CreateInfoEvent(telemetry.CommandInfo{
154154
Name: "org",
155-
LocalArgs: map[string]string{"help": "false"},
155+
LocalArgs: map[string]string{"help": "false", "json": "false"},
156156
}, nil),
157157
})
158158
}

cmd/project/environment_variable.go

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package project
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"strings"
67

@@ -16,6 +17,8 @@ func newProjectEnvironmentVariableCommand(ops *projectOpts, preRunE validator.Va
1617
Short: "Operate on environment variables of projects",
1718
}
1819

20+
jsonFormat := false
21+
1922
listVarsCommand := &cobra.Command{
2023
Short: "List all environment variables of a project",
2124
Use: "list <vcs-type> <org-name> <project-name>",
@@ -39,6 +42,11 @@ func newProjectEnvironmentVariableCommand(ops *projectOpts, preRunE validator.Va
3942

4043
createVarCommand.Flags().StringVar(&envValue, "env-value", "", "An environment variable value to be created. You can also pass it by stdin without this option.")
4144

45+
listVarsCommand.PersistentFlags().BoolVar(&jsonFormat, "json", false,
46+
"Return output back in JSON format")
47+
createVarCommand.PersistentFlags().BoolVar(&jsonFormat, "json", false,
48+
"Return output back in JSON format")
49+
4250
cmd.AddCommand(listVarsCommand)
4351
cmd.AddCommand(createVarCommand)
4452
return cmd
@@ -50,14 +58,31 @@ func listProjectEnvironmentVariables(cmd *cobra.Command, client projectapi.Proje
5058
return err
5159
}
5260

53-
table := tablewriter.NewWriter(cmd.OutOrStdout())
61+
jsonVal, err := cmd.Flags().GetBool("json")
62+
if err != nil {
63+
return err
64+
}
65+
66+
if jsonVal {
67+
// return JSON formatted for output
68+
jsonEnvVars, err := json.Marshal(envVars)
69+
if err != nil {
70+
return err
71+
}
72+
jsonWriter := cmd.OutOrStdout()
73+
if _, err := jsonWriter.Write(jsonEnvVars); err != nil {
74+
return err
75+
}
76+
} else {
77+
table := tablewriter.NewWriter(cmd.OutOrStdout())
5478

55-
table.SetHeader([]string{"Environment Variable", "Value"})
79+
table.SetHeader([]string{"Environment Variable", "Value"})
5680

57-
for _, envVar := range envVars {
58-
table.Append([]string{envVar.Name, envVar.Value})
81+
for _, envVar := range envVars {
82+
table.Append([]string{envVar.Name, envVar.Value})
83+
}
84+
table.Render()
5985
}
60-
table.Render()
6186

6287
return nil
6388
}
@@ -95,11 +120,28 @@ func createProjectEnvironmentVariable(cmd *cobra.Command, client projectapi.Proj
95120
return err
96121
}
97122

98-
table := tablewriter.NewWriter(cmd.OutOrStdout())
123+
jsonVal, err := cmd.Flags().GetBool("json")
124+
if err != nil {
125+
return err
126+
}
99127

100-
table.SetHeader([]string{"Environment Variable", "Value"})
101-
table.Append([]string{v.Name, v.Value})
102-
table.Render()
128+
if jsonVal {
129+
// return JSON formatted for output
130+
jsonV, err := json.Marshal(v)
131+
if err != nil {
132+
return err
133+
}
134+
jsonWriter := cmd.OutOrStdout()
135+
if _, err := jsonWriter.Write(jsonV); err != nil {
136+
return err
137+
}
138+
} else {
139+
table := tablewriter.NewWriter(cmd.OutOrStdout())
140+
141+
table.SetHeader([]string{"Environment Variable", "Value"})
142+
table.Append([]string{v.Name, v.Value})
143+
table.Render()
144+
}
103145

104146
return nil
105147
}

cmd/runner/instance.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package runner
22

33
import (
4+
"encoding/json"
45
"io"
56
"time"
67

@@ -18,6 +19,8 @@ func newRunnerInstanceCommand(o *runnerOpts, preRunE validator.Validator) *cobra
1819
Short: "Operate on runner instances",
1920
}
2021

22+
jsonFormat := false
23+
2124
cmd.AddCommand(&cobra.Command{
2225
Use: "list <namespace or resource-class>",
2326
Short: "List runner instances",
@@ -42,16 +45,31 @@ func newRunnerInstanceCommand(o *runnerOpts, preRunE validator.Validator) *cobra
4245
return err
4346
}
4447

45-
table := newRunnerInstanceTable(cmd.OutOrStdout())
46-
defer table.Render()
47-
for _, r := range runners {
48-
appendRunnerInstance(table, r)
48+
if jsonFormat {
49+
// return JSON formatted for output
50+
jsonRunners, err := json.Marshal(runners)
51+
if err != nil {
52+
return err
53+
}
54+
jsonWriter := cmd.OutOrStdout()
55+
if _, err := jsonWriter.Write(jsonRunners); err != nil {
56+
return err
57+
}
58+
} else {
59+
table := newRunnerInstanceTable(cmd.OutOrStdout())
60+
defer table.Render()
61+
for _, r := range runners {
62+
appendRunnerInstance(table, r)
63+
}
4964
}
5065

5166
return nil
5267
},
5368
})
5469

70+
cmd.PersistentFlags().BoolVar(&jsonFormat, "json", false,
71+
"Return output back in JSON format")
72+
5573
return cmd
5674
}
5775

cmd/runner/testdata/runner/instance-expected-usage.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ Usage:
44
Available Commands:
55
list List runner instances
66

7+
Flags:
8+
--json Return output back in JSON format
9+
710
Use "runner instance [command] --help" for more information about a command.
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
Usage:
2-
runner instance list <namespace or resource-class>
2+
runner instance list <namespace or resource-class> [flags]
33

44
Aliases:
55
list, ls
66

77
Examples:
88
circleci runner instance ls my-namespace
99
circleci runner instance ls my-namespace/my-resource-class
10+
11+
Global Flags:
12+
--json Return output back in JSON format

cmd/runner/testdata/runner/token-expected-usage.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@ Available Commands:
66
delete Delete a token
77
list List tokens for a resource-class
88

9+
Flags:
10+
--json Return output back in JSON format
11+
912
Use "runner token [command] --help" for more information about a command.
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
Usage:
2-
runner token create <resource-class> <nickname>
2+
runner token create <resource-class> <nickname> [flags]
3+
4+
Global Flags:
5+
--json Return output back in JSON format

0 commit comments

Comments
 (0)