Skip to content

Commit e7cdde6

Browse files
authored
Linting and refactoring of gRPC API .proto files - BREAKING CHANGE (#1223)
* Added linter ignore rules to match current .proto files * Fixed SERVICE_SUFFIX lint warning * Fixed RPC_RESPONSE_STANDARD_NAME lint warning * Fixed RPC_REQUEST_STANDARD_NAME and RPC_REQUEST_RESPONSE_UNIQUE lint warning There is one error remaining that require a more involved refactoring. * Fixed ENUM_VALUE_PREFIX and ENUM_VALUE_UPPER_SNAKE_CASE lint warning * Fixed FIELD_LOWER_SNAKE_CASE lint warning * Fixed PACKAGE_VERSION_SUFFIX lint warning * Fixed PACKAGE_DIRECTORY_MATCH lint warning * Fixed plurals in repeated fields * Fixed .proto files indentations * Fixed some multiword names * Pass of clang-format * Fixed integration tests for JSON output * Updated example_client * Rename archive_file_name to archive_filename for coherence with the rest of the API * Updated migration guide * Added lint and format as Taskfile targets
1 parent ac39429 commit e7cdde6

File tree

118 files changed

+14733
-13900
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+14733
-13900
lines changed

.github/workflows/test.yaml

+13-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
- name: Install Go
2323
uses: actions/setup-go@v2
2424
with:
25-
go-version: "1.14"
25+
go-version: "1.16"
2626

2727
- name: Install Go deps
2828
# Since 10/23/2019 pwsh is the default shell
@@ -50,16 +50,27 @@ jobs:
5050
- name: Install Poetry
5151
run: pip install poetry
5252

53+
- name: Install buf (protoc linter)
54+
if: runner.os == 'Linux'
55+
run: |
56+
go install github.com/bufbuild/buf/cmd/buf@latest
57+
go install github.com/bufbuild/buf/cmd/protoc-gen-buf-breaking@latest
58+
go install github.com/bufbuild/buf/cmd/protoc-gen-buf-lint@latest
59+
shell: bash
60+
5361
- name: Check the code is good
62+
if: runner.os == 'Linux'
5463
run: task check
5564

5665
- name: Install protoc compiler
66+
if: runner.os == 'Linux'
5767
uses: arduino/setup-protoc@v1
5868
with:
5969
repo-token: ${{ secrets.GITHUB_TOKEN }}
6070

6171
- name: Check protocol buffers compile correctly
62-
run: task protoc
72+
if: runner.os == 'Linux'
73+
run: task protoc:compile
6374

6475
- name: Build the CLI
6576
run: task build

Taskfile.yml

+30-12
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ tasks:
1919
docs:gen:protobuf:
2020
desc: Generate markdown contents for protobuffers
2121
cmds:
22-
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,commands.md --proto_path=rpc ./rpc/commands/*.proto'
23-
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,monitor.md --proto_path=rpc ./rpc/monitor/*.proto'
24-
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,settings.md --proto_path=rpc ./rpc/settings/*.proto'
25-
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,debug.md --proto_path=rpc ./rpc/debug/*.proto'
22+
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,commands.md --proto_path=rpc ./rpc/cc/arduino/cli/commands/v1/*.proto'
23+
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,monitor.md --proto_path=rpc ./rpc/cc/arduino/cli/monitor/v1/*.proto'
24+
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,settings.md --proto_path=rpc ./rpc/cc/arduino/cli/settings/v1/*.proto'
25+
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,debug.md --proto_path=rpc ./rpc/cc/arduino/cli/debug/v1/*.proto'
2626
- task: docs:format
2727

2828
docs:gen:
@@ -77,20 +77,37 @@ tasks:
7777
- npx {{ .PRETTIER }} --write "**/*.md"
7878

7979
protoc:
80+
desc: Lint, format and compile protobuf definitions
81+
deps:
82+
- protoc:check
83+
- protoc:format
84+
- protoc:compile
85+
86+
protoc:compile:
8087
desc: Compile protobuf definitions
8188
cmds:
82-
- '{{ default "protoc" .PROTOC_BINARY }} --proto_path=rpc --go_out=plugins=grpc,paths=source_relative:rpc ./rpc/commands/*.proto'
83-
- '{{ default "protoc" .PROTOC_BINARY }} --proto_path=rpc --go_out=plugins=grpc,paths=source_relative:rpc ./rpc/monitor/*.proto'
84-
- '{{ default "protoc" .PROTOC_BINARY }} --proto_path=rpc --go_out=plugins=grpc,paths=source_relative:rpc ./rpc/settings/*.proto'
85-
- '{{ default "protoc" .PROTOC_BINARY }} --proto_path=rpc --go_out=plugins=grpc,paths=source_relative:rpc ./rpc/debug/*.proto'
89+
- '{{ default "protoc" .PROTOC_BINARY }} --proto_path=rpc --go_out=plugins=grpc,paths=source_relative:rpc ./rpc/cc/arduino/cli/commands/v1/*.proto'
90+
- '{{ default "protoc" .PROTOC_BINARY }} --proto_path=rpc --go_out=plugins=grpc,paths=source_relative:rpc ./rpc/cc/arduino/cli/monitor/v1/*.proto'
91+
- '{{ default "protoc" .PROTOC_BINARY }} --proto_path=rpc --go_out=plugins=grpc,paths=source_relative:rpc ./rpc/cc/arduino/cli/settings/v1/*.proto'
92+
- '{{ default "protoc" .PROTOC_BINARY }} --proto_path=rpc --go_out=plugins=grpc,paths=source_relative:rpc ./rpc/cc/arduino/cli/debug/v1/*.proto'
8693

8794
protoc:docs:
8895
desc: Generate docs for protobuf definitions
8996
cmds:
90-
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,commands.md --proto_path=rpc ./rpc/commands/*.proto'
91-
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,monitor.md --proto_path=rpc ./rpc/monitor/*.proto'
92-
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,settings.md --proto_path=rpc ./rpc/settings/*.proto'
93-
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,debug.md --proto_path=rpc ./rpc/debug/*.proto'
97+
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,commands.md --proto_path=rpc ./rpc/cc/arduino/cli/commands/v1/*.proto'
98+
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,monitor.md --proto_path=rpc ./rpc/cc/arduino/cli/monitor/v1/*.proto'
99+
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,settings.md --proto_path=rpc ./rpc/cc/arduino/cli/settings/v1/*.proto'
100+
- '{{ default "protoc" .PROTOC_BINARY }} --doc_out=./docs/rpc --doc_opt=markdown,debug.md --proto_path=rpc ./rpc/cc/arduino/cli/debug/v1/*.proto'
101+
102+
protoc:check:
103+
desc: Perform linting of the protobuf definitions
104+
cmds:
105+
- buf lint rpc
106+
107+
protoc:format:
108+
desc: Perform formatting of the protobuf definitions
109+
cmds:
110+
- clang-format -i rpc/cc/arduino/cli/*/*/*.proto
94111

95112
build:
96113
desc: Build the project
@@ -134,6 +151,7 @@ tasks:
134151
- task: python:check
135152
- task: docs:check
136153
- task: config:check
154+
- task: protoc:check
137155

138156
config:check:
139157
desc: Check linting of configuration and supporting files

arduino/libraries/libraries.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"fmt"
2020

2121
"github.com/arduino/arduino-cli/arduino/cores"
22-
rpc "github.com/arduino/arduino-cli/rpc/commands"
22+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
2323
paths "github.com/arduino/go-paths-helper"
2424
properties "github.com/arduino/go-properties-orderedmap"
2525
semver "go.bug.st/relaxed-semver"

arduino/libraries/libraries_layout.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"encoding/json"
2020
"fmt"
2121

22-
rpc "github.com/arduino/arduino-cli/rpc/commands"
22+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
2323
)
2424

2525
// LibraryLayout represents how the library source code is laid out in the library
@@ -72,9 +72,9 @@ func (d *LibraryLayout) UnmarshalJSON(b []byte) error {
7272
func (d *LibraryLayout) ToRPCLibraryLayout() rpc.LibraryLayout {
7373
switch *d {
7474
case FlatLayout:
75-
return rpc.LibraryLayout_flat_layout
75+
return rpc.LibraryLayout_LIBRARY_LAYOUT_FLAT
7676
case RecursiveLayout:
77-
return rpc.LibraryLayout_recursive_layout
77+
return rpc.LibraryLayout_LIBRARY_LAYOUT_RECURSIVE
7878
}
7979
panic(fmt.Sprintf("invalid LibraryLayout value %d", *d))
8080
}

arduino/libraries/libraries_location.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"encoding/json"
2020
"fmt"
2121

22-
rpc "github.com/arduino/arduino-cli/rpc/commands"
22+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
2323
)
2424

2525
// LibraryLocation represents where the library is installed
@@ -89,27 +89,27 @@ func (d *LibraryLocation) UnmarshalJSON(b []byte) error {
8989
func (d *LibraryLocation) ToRPCLibraryLocation() rpc.LibraryLocation {
9090
switch *d {
9191
case IDEBuiltIn:
92-
return rpc.LibraryLocation_ide_builtin
92+
return rpc.LibraryLocation_LIBRARY_LOCATION_IDE_BUILTIN
9393
case PlatformBuiltIn:
94-
return rpc.LibraryLocation_platform_builtin
94+
return rpc.LibraryLocation_LIBRARY_LOCATION_PLATFORM_BUILTIN
9595
case ReferencedPlatformBuiltIn:
96-
return rpc.LibraryLocation_referenced_platform_builtin
96+
return rpc.LibraryLocation_LIBRARY_LOCATION_REFERENCED_PLATFORM_BUILTIN
9797
case User:
98-
return rpc.LibraryLocation_user
98+
return rpc.LibraryLocation_LIBRARY_LOCATION_USER
9999
}
100100
panic(fmt.Sprintf("invalid LibraryLocation value %d", *d))
101101
}
102102

103103
// FromRPCLibraryLocation converts a rpc.LibraryLocation to a LibraryLocation
104104
func FromRPCLibraryLocation(l rpc.LibraryLocation) LibraryLocation {
105105
switch l {
106-
case rpc.LibraryLocation_ide_builtin:
106+
case rpc.LibraryLocation_LIBRARY_LOCATION_IDE_BUILTIN:
107107
return IDEBuiltIn
108-
case rpc.LibraryLocation_platform_builtin:
108+
case rpc.LibraryLocation_LIBRARY_LOCATION_PLATFORM_BUILTIN:
109109
return PlatformBuiltIn
110-
case rpc.LibraryLocation_referenced_platform_builtin:
110+
case rpc.LibraryLocation_LIBRARY_LOCATION_REFERENCED_PLATFORM_BUILTIN:
111111
return ReferencedPlatformBuiltIn
112-
case rpc.LibraryLocation_user:
112+
case rpc.LibraryLocation_LIBRARY_LOCATION_USER:
113113
return User
114114
}
115115
panic(fmt.Sprintf("invalid rpc.LibraryLocation value %d", l))

arduino/libraries/librariesindex/index.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020

2121
"github.com/arduino/arduino-cli/arduino/libraries"
2222
"github.com/arduino/arduino-cli/arduino/resources"
23-
rpc "github.com/arduino/arduino-cli/rpc/commands"
23+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
2424
semver "go.bug.st/relaxed-semver"
2525
)
2626

cli/board/attach.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
"github.com/arduino/arduino-cli/cli/instance"
2525
"github.com/arduino/arduino-cli/cli/output"
2626
"github.com/arduino/arduino-cli/commands/board"
27-
rpc "github.com/arduino/arduino-cli/rpc/commands"
27+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
2828
"github.com/arduino/go-paths-helper"
2929
"github.com/sirupsen/logrus"
3030
"github.com/spf13/cobra"
@@ -64,7 +64,7 @@ func runAttachCommand(cmd *cobra.Command, args []string) {
6464
path = initSketchPath(path)
6565
}
6666

67-
if _, err = board.Attach(context.Background(), &rpc.BoardAttachReq{
67+
if _, err = board.Attach(context.Background(), &rpc.BoardAttachRequest{
6868
Instance: instance,
6969
BoardUri: args[0],
7070
SketchPath: path.String(),

cli/board/details.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
"github.com/arduino/arduino-cli/cli/instance"
2626
"github.com/arduino/arduino-cli/commands/board"
2727
"github.com/arduino/arduino-cli/i18n"
28-
rpc "github.com/arduino/arduino-cli/rpc/commands"
28+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
2929
"github.com/arduino/arduino-cli/table"
3030
"github.com/fatih/color"
3131
"github.com/spf13/cobra"
@@ -66,7 +66,7 @@ func runDetailsCommand(cmd *cobra.Command, args []string) {
6666
fqbn = args[0]
6767
}
6868

69-
res, err := board.Details(context.Background(), &rpc.BoardDetailsReq{
69+
res, err := board.Details(context.Background(), &rpc.BoardDetailsRequest{
7070
Instance: inst,
7171
Fqbn: fqbn,
7272
})
@@ -82,7 +82,7 @@ func runDetailsCommand(cmd *cobra.Command, args []string) {
8282
// output from this command requires special formatting, let's create a dedicated
8383
// feedback.Result implementation
8484
type detailsResult struct {
85-
details *rpc.BoardDetailsResp
85+
details *rpc.BoardDetailsResponse
8686
}
8787

8888
func (dr detailsResult) Data() interface{} {
@@ -134,28 +134,28 @@ func (dr detailsResult) String() string {
134134
table.NewCell("✔", color.New(color.FgGreen)))
135135
}
136136

137-
for i, idp := range details.IdentificationPref {
137+
for i, idp := range details.IdentificationPrefs {
138138
if i == 0 {
139139
t.AddRow() // get some space from above
140-
t.AddRow(tr("Identification properties:"), "VID:"+idp.UsbID.VID+" PID:"+idp.UsbID.PID)
140+
t.AddRow(tr("Identification properties:"), "VID:"+idp.UsbId.Vid+" PID:"+idp.UsbId.Pid)
141141
continue
142142
}
143-
t.AddRow("", "VID:"+idp.UsbID.VID+" PID:"+idp.UsbID.PID)
143+
t.AddRow("", "VID:"+idp.UsbId.Vid+" PID:"+idp.UsbId.Pid)
144144
}
145145

146146
t.AddRow() // get some space from above
147147
addIfNotEmpty(tr("Package name:"), details.Package.Name)
148148
addIfNotEmpty(tr("Package maintainer:"), details.Package.Maintainer)
149149
addIfNotEmpty(tr("Package URL:"), details.Package.Url)
150-
addIfNotEmpty(tr("Package website:"), details.Package.WebsiteURL)
150+
addIfNotEmpty(tr("Package website:"), details.Package.WebsiteUrl)
151151
addIfNotEmpty(tr("Package online help:"), details.Package.Help.Online)
152152

153153
t.AddRow() // get some space from above
154154
addIfNotEmpty(tr("Platform name:"), details.Platform.Name)
155155
addIfNotEmpty(tr("Platform category:"), details.Platform.Category)
156156
addIfNotEmpty(tr("Platform architecture:"), details.Platform.Architecture)
157157
addIfNotEmpty(tr("Platform URL:"), details.Platform.Url)
158-
addIfNotEmpty(tr("Platform file name:"), details.Platform.ArchiveFileName)
158+
addIfNotEmpty(tr("Platform file name:"), details.Platform.ArchiveFilename)
159159
if details.Platform.Size != 0 {
160160
addIfNotEmpty(tr("Platform size (bytes):"), fmt.Sprint(details.Platform.Size))
161161
}
@@ -167,7 +167,7 @@ func (dr detailsResult) String() string {
167167
if showFullDetails {
168168
for _, sys := range tool.Systems {
169169
t.AddRow("", tr("OS:"), "", sys.Host)
170-
t.AddRow("", tr("File:"), "", sys.ArchiveFileName)
170+
t.AddRow("", tr("File:"), "", sys.ArchiveFilename)
171171
t.AddRow("", tr("Size (bytes):"), "", fmt.Sprint(sys.Size))
172172
t.AddRow("", tr("Checksum:"), "", sys.Checksum)
173173
t.AddRow("", "URL:", "", sys.Url)

cli/board/list.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
"github.com/arduino/arduino-cli/cli/feedback"
2727
"github.com/arduino/arduino-cli/cli/instance"
2828
"github.com/arduino/arduino-cli/commands/board"
29-
rpc "github.com/arduino/arduino-cli/rpc/commands"
29+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
3030
"github.com/arduino/arduino-cli/table"
3131
"github.com/spf13/cobra"
3232
)
@@ -147,15 +147,15 @@ func (dr result) String() string {
147147
if boards := port.GetBoards(); len(boards) > 0 {
148148
sort.Slice(boards, func(i, j int) bool {
149149
x, y := boards[i], boards[j]
150-
return x.GetName() < y.GetName() || (x.GetName() == y.GetName() && x.GetFQBN() < y.GetFQBN())
150+
return x.GetName() < y.GetName() || (x.GetName() == y.GetName() && x.GetFqbn() < y.GetFqbn())
151151
})
152152
for _, b := range boards {
153153
board := b.GetName()
154154

155155
// to improve the user experience, show on a dedicated column
156156
// the name of the core supporting the board detected
157157
var coreName = ""
158-
fqbn, err := cores.ParseFQBN(b.GetFQBN())
158+
fqbn, err := cores.ParseFQBN(b.GetFqbn())
159159
if err == nil {
160160
coreName = fmt.Sprintf("%s:%s", fqbn.Package, fqbn.PlatformArch)
161161
}
@@ -206,15 +206,15 @@ func (dr watchEvent) String() string {
206206
if boards := dr.Boards; len(boards) > 0 {
207207
sort.Slice(boards, func(i, j int) bool {
208208
x, y := boards[i], boards[j]
209-
return x.GetName() < y.GetName() || (x.GetName() == y.GetName() && x.GetFQBN() < y.GetFQBN())
209+
return x.GetName() < y.GetName() || (x.GetName() == y.GetName() && x.GetFqbn() < y.GetFqbn())
210210
})
211211
for _, b := range boards {
212212
board := b.GetName()
213213

214214
// to improve the user experience, show on a dedicated column
215215
// the name of the core supporting the board detected
216216
var coreName = ""
217-
fqbn, err := cores.ParseFQBN(b.GetFQBN())
217+
fqbn, err := cores.ParseFQBN(b.GetFqbn())
218218
if err == nil {
219219
coreName = fmt.Sprintf("%s:%s", fqbn.Package, fqbn.PlatformArch)
220220
}

cli/board/listall.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
"github.com/arduino/arduino-cli/cli/feedback"
2525
"github.com/arduino/arduino-cli/cli/instance"
2626
"github.com/arduino/arduino-cli/commands/board"
27-
rpc "github.com/arduino/arduino-cli/rpc/commands"
27+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
2828
"github.com/arduino/arduino-cli/table"
2929
"github.com/spf13/cobra"
3030
)
@@ -56,7 +56,7 @@ func runListAllCommand(cmd *cobra.Command, args []string) {
5656
os.Exit(errorcodes.ErrGeneric)
5757
}
5858

59-
list, err := board.ListAll(context.Background(), &rpc.BoardListAllReq{
59+
list, err := board.ListAll(context.Background(), &rpc.BoardListAllRequest{
6060
Instance: inst,
6161
SearchArgs: args,
6262
IncludeHiddenBoards: showHiddenBoard,
@@ -72,7 +72,7 @@ func runListAllCommand(cmd *cobra.Command, args []string) {
7272
// output from this command requires special formatting, let's create a dedicated
7373
// feedback.Result implementation
7474
type resultAll struct {
75-
list *rpc.BoardListAllResp
75+
list *rpc.BoardListAllResponse
7676
}
7777

7878
func (dr resultAll) Data() interface{} {
@@ -91,7 +91,7 @@ func (dr resultAll) String() string {
9191
if item.IsHidden {
9292
hidden = "(hidden)"
9393
}
94-
t.AddRow(item.GetName(), item.GetFQBN(), hidden)
94+
t.AddRow(item.GetName(), item.GetFqbn(), hidden)
9595
}
9696
return t.Render()
9797
}

cli/board/search.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
"github.com/arduino/arduino-cli/cli/feedback"
2626
"github.com/arduino/arduino-cli/cli/instance"
2727
"github.com/arduino/arduino-cli/commands/board"
28-
rpc "github.com/arduino/arduino-cli/rpc/commands"
28+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
2929
"github.com/arduino/arduino-cli/table"
3030
"github.com/spf13/cobra"
3131
)
@@ -58,7 +58,7 @@ func runSearchCommand(cmd *cobra.Command, args []string) {
5858
os.Exit(errorcodes.ErrGeneric)
5959
}
6060

61-
res, err := board.Search(context.Background(), &rpc.BoardSearchReq{
61+
res, err := board.Search(context.Background(), &rpc.BoardSearchRequest{
6262
Instance: inst,
6363
SearchArgs: strings.Join(args, " "),
6464
IncludeHiddenBoards: searchFlags.showHiddenBoard,
@@ -93,7 +93,7 @@ func (r searchResults) String() string {
9393
if item.IsHidden {
9494
hidden = "(hidden)"
9595
}
96-
t.AddRow(item.GetName(), item.GetFQBN(), item.Platform.ID, hidden)
96+
t.AddRow(item.GetName(), item.GetFqbn(), item.Platform.Id, hidden)
9797
}
9898
return t.Render()
9999
}

0 commit comments

Comments
 (0)