From 6657b70385ca8af17e44057899c69d06bbac7be7 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 09:56:54 +0100 Subject: [PATCH 01/14] cli: board list --- internal/cli/board/list.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/cli/board/list.go b/internal/cli/board/list.go index 82f2b9b74d2..a3872708d44 100644 --- a/internal/cli/board/list.go +++ b/internal/cli/board/list.go @@ -114,27 +114,27 @@ func watchList(inst *rpc.Instance) { // output from this command requires special formatting, let's create a dedicated // feedback.Result implementation type listResult struct { - ports []*result.DetectedPort + Ports []*result.DetectedPort `json:"detected_ports"` } func (dr listResult) Data() interface{} { - return dr.ports + return dr } func (dr listResult) String() string { - if len(dr.ports) == 0 { + if len(dr.Ports) == 0 { return tr("No boards found.") } - sort.Slice(dr.ports, func(i, j int) bool { - x, y := dr.ports[i].Port, dr.ports[j].Port + sort.Slice(dr.Ports, func(i, j int) bool { + x, y := dr.Ports[i].Port, dr.Ports[j].Port return x.Protocol < y.Protocol || (x.Protocol == y.Protocol && x.Address < y.Address) }) t := table.New() t.SetHeader(tr("Port"), tr("Protocol"), tr("Type"), tr("Board Name"), tr("FQBN"), tr("Core")) - for _, detectedPort := range dr.ports { + for _, detectedPort := range dr.Ports { port := detectedPort.Port protocol := port.Protocol address := port.Address From c76722136b866945d809e4533f9e86d4eca4dd4d Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 10:04:10 +0100 Subject: [PATCH 02/14] cli: board search --- internal/cli/board/search.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/cli/board/search.go b/internal/cli/board/search.go index 9f8133fd80c..4688bd5b953 100644 --- a/internal/cli/board/search.go +++ b/internal/cli/board/search.go @@ -67,26 +67,26 @@ func runSearchCommand(cmd *cobra.Command, args []string) { // output from this command requires special formatting so we create a dedicated // feedback.Result implementation type searchResults struct { - boards []*fResult.BoardListItem + Boards []*fResult.BoardListItem `json:"boards"` } func (r searchResults) Data() interface{} { - return r.boards + return r } func (r searchResults) String() string { - if len(r.boards) == 0 { + if len(r.Boards) == 0 { return "" } t := table.New() t.SetHeader(tr("Board Name"), tr("FQBN"), tr("Platform ID"), "") - sort.Slice(r.boards, func(i, j int) bool { - return r.boards[i].Name < r.boards[j].Name + sort.Slice(r.Boards, func(i, j int) bool { + return r.Boards[i].Name < r.Boards[j].Name }) - for _, item := range r.boards { + for _, item := range r.Boards { hidden := "" if item.IsHidden { hidden = tr("(hidden)") From fc9f65b82a0dde1f6227d956f9d6685b795a044a Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 10:05:09 +0100 Subject: [PATCH 03/14] rename feedback/result import names --- internal/cli/board/listall.go | 6 +++--- internal/cli/board/search.go | 6 +++--- internal/cli/lib/check_deps.go | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/internal/cli/board/listall.go b/internal/cli/board/listall.go index 74167c2014d..8d85d81c28b 100644 --- a/internal/cli/board/listall.go +++ b/internal/cli/board/listall.go @@ -23,7 +23,7 @@ import ( "github.com/arduino/arduino-cli/commands/board" "github.com/arduino/arduino-cli/internal/cli/feedback" - fResult "github.com/arduino/arduino-cli/internal/cli/feedback/result" + "github.com/arduino/arduino-cli/internal/cli/feedback/result" "github.com/arduino/arduino-cli/internal/cli/instance" rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1" "github.com/arduino/arduino-cli/table" @@ -64,13 +64,13 @@ func runListAllCommand(cmd *cobra.Command, args []string) { feedback.Fatal(tr("Error listing boards: %v", err), feedback.ErrGeneric) } - feedback.PrintResult(resultAll{fResult.NewBoardListAllResponse(list)}) + feedback.PrintResult(resultAll{result.NewBoardListAllResponse(list)}) } // output from this command requires special formatting, let's create a dedicated // feedback.Result implementation type resultAll struct { - list *fResult.BoardListAllResponse + list *result.BoardListAllResponse } func (dr resultAll) Data() interface{} { diff --git a/internal/cli/board/search.go b/internal/cli/board/search.go index 4688bd5b953..068dd0d0019 100644 --- a/internal/cli/board/search.go +++ b/internal/cli/board/search.go @@ -24,7 +24,7 @@ import ( "github.com/arduino/arduino-cli/commands/board" "github.com/arduino/arduino-cli/internal/cli/feedback" - fResult "github.com/arduino/arduino-cli/internal/cli/feedback/result" + "github.com/arduino/arduino-cli/internal/cli/feedback/result" "github.com/arduino/arduino-cli/internal/cli/instance" rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1" "github.com/arduino/arduino-cli/table" @@ -61,13 +61,13 @@ func runSearchCommand(cmd *cobra.Command, args []string) { feedback.Fatal(tr("Error searching boards: %v", err), feedback.ErrGeneric) } - feedback.PrintResult(searchResults{fResult.NewBoardListItems(res.Boards)}) + feedback.PrintResult(searchResults{result.NewBoardListItems(res.Boards)}) } // output from this command requires special formatting so we create a dedicated // feedback.Result implementation type searchResults struct { - Boards []*fResult.BoardListItem `json:"boards"` + Boards []*result.BoardListItem `json:"boards"` } func (r searchResults) Data() interface{} { diff --git a/internal/cli/lib/check_deps.go b/internal/cli/lib/check_deps.go index 9a5666cd101..ce30c8df828 100644 --- a/internal/cli/lib/check_deps.go +++ b/internal/cli/lib/check_deps.go @@ -24,7 +24,7 @@ import ( "github.com/arduino/arduino-cli/commands/lib" "github.com/arduino/arduino-cli/internal/cli/arguments" "github.com/arduino/arduino-cli/internal/cli/feedback" - fResult "github.com/arduino/arduino-cli/internal/cli/feedback/result" + "github.com/arduino/arduino-cli/internal/cli/feedback/result" "github.com/arduino/arduino-cli/internal/cli/instance" rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1" "github.com/fatih/color" @@ -66,13 +66,13 @@ func runDepsCommand(cmd *cobra.Command, args []string) { feedback.Fatal(tr("Error resolving dependencies for %[1]s: %[2]s", libRef, err), feedback.ErrGeneric) } - feedback.PrintResult(&checkDepResult{deps: fResult.NewLibraryResolveDependenciesResponse(deps)}) + feedback.PrintResult(&checkDepResult{deps: result.NewLibraryResolveDependenciesResponse(deps)}) } // output from this command requires special formatting, let's create a dedicated // feedback.Result implementation type checkDepResult struct { - deps *fResult.LibraryResolveDependenciesResponse + deps *result.LibraryResolveDependenciesResponse } func (dr checkDepResult) Data() interface{} { @@ -103,7 +103,7 @@ func (dr checkDepResult) String() string { return res } -func outputDep(dep *fResult.LibraryDependencyStatus) string { +func outputDep(dep *result.LibraryDependencyStatus) string { res := "" green := color.New(color.FgGreen) red := color.New(color.FgRed) From 7f697fcfee65c975f8e987bff401245dc26df520 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 10:10:32 +0100 Subject: [PATCH 04/14] use generic impl of uniquify --- internal/cli/config/add.go | 31 ++++--------------------------- internal/cli/config/set.go | 2 +- 2 files changed, 5 insertions(+), 28 deletions(-) diff --git a/internal/cli/config/add.go b/internal/cli/config/add.go index d375a0c578e..fe853df467e 100644 --- a/internal/cli/config/add.go +++ b/internal/cli/config/add.go @@ -25,33 +25,10 @@ import ( "github.com/spf13/cobra" ) -// // TODO: When update to go 1.18 or later, convert to generic -// // to allow uniquify() on any slice that supports -// // `comparable` -// // See https://gosamples.dev/generics-remove-duplicates-slice/ -// func uniquify[T comparable](s []T) []T { -// // use a map, which enforces unique keys -// inResult := make(map[T]bool) -// var result []T -// // loop through input slice **in order**, -// // to ensure output retains that order -// // (except that it removes duplicates) -// for i := 0; i < len(s); i++ { -// // attempt to use the element as a key -// if _, ok := inResult[s[i]]; !ok { -// // if key didn't exist in map, -// // add to map and append to result -// inResult[s[i]] = true -// result = append(result, s[i]) -// } -// } -// return result -// } - -func uniquifyStringSlice(s []string) []string { +func uniquify[T comparable](s []T) []T { // use a map, which enforces unique keys - inResult := make(map[string]bool) - var result []string + inResult := make(map[T]bool) + var result []T // loop through input slice **in order**, // to ensure output retains that order // (except that it removes duplicates) @@ -96,7 +73,7 @@ func runAddCommand(cmd *cobra.Command, args []string) { v := configuration.Settings.GetStringSlice(key) v = append(v, args[1:]...) - v = uniquifyStringSlice(v) + v = uniquify(v) configuration.Settings.Set(key, v) if err := configuration.Settings.WriteConfig(); err != nil { diff --git a/internal/cli/config/set.go b/internal/cli/config/set.go index f620fa183f5..339128c38f1 100644 --- a/internal/cli/config/set.go +++ b/internal/cli/config/set.go @@ -57,7 +57,7 @@ func runSetCommand(cmd *cobra.Command, args []string) { var value interface{} switch kind { case reflect.Slice: - value = uniquifyStringSlice(args[1:]) + value = uniquify(args[1:]) case reflect.String: value = args[1] case reflect.Bool: From fe08033f721a516ad0f07fb5c9433298cb22cd00 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 10:29:30 +0100 Subject: [PATCH 05/14] cli: config dump --- internal/cli/config/dump.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/cli/config/dump.go b/internal/cli/config/dump.go index 9e36a6f577a..b7636f68c4a 100644 --- a/internal/cli/config/dump.go +++ b/internal/cli/config/dump.go @@ -45,15 +45,15 @@ func runDumpCommand(cmd *cobra.Command, args []string) { // output from this command requires special formatting, let's create a dedicated // feedback.Result implementation type dumpResult struct { - data map[string]interface{} + Config map[string]interface{} `json:"config"` } func (dr dumpResult) Data() interface{} { - return dr.data + return dr } func (dr dumpResult) String() string { - bs, err := yaml.Marshal(dr.data) + bs, err := yaml.Marshal(dr.Config) if err != nil { // Should never happen panic(tr("unable to marshal config to YAML: %v", err)) From a66fb99fb8c242366d23d2ce2d05a8c6025cb336 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 10:38:53 +0100 Subject: [PATCH 06/14] cli: config init --- internal/cli/config/init.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/internal/cli/config/init.go b/internal/cli/config/init.go index 471905c54cc..f2ef1effa46 100644 --- a/internal/cli/config/init.go +++ b/internal/cli/config/init.go @@ -108,8 +108,21 @@ func runInitCommand(cmd *cobra.Command, args []string) { if err := newSettings.WriteConfigAs(configFileAbsPath.String()); err != nil { feedback.Fatal(tr("Cannot create config file: %v", err), feedback.ErrGeneric) } + feedback.PrintResult(initResult{ConfigFileAbsPath: configFileAbsPath}) +} + +// output from this command requires special formatting, let's create a dedicated +// feedback.Result implementation +type initResult struct { + ConfigFileAbsPath *paths.Path `json:"config_path"` +} + +func (dr initResult) Data() interface{} { + return dr +} - msg := tr("Config file written to: %s", configFileAbsPath.String()) +func (dr initResult) String() string { + msg := tr("Config file written to: %s", dr.ConfigFileAbsPath.String()) logrus.Info(msg) - feedback.Print(msg) + return msg } From 567577a1aa14efb928f0f8702bfd9d0a1f09dc48 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 10:41:03 +0100 Subject: [PATCH 07/14] cli: core list --- internal/cli/core/list.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/cli/core/list.go b/internal/cli/core/list.go index 40ac933f027..6ef5c14b451 100644 --- a/internal/cli/core/list.go +++ b/internal/cli/core/list.go @@ -89,24 +89,24 @@ func GetList(inst *rpc.Instance, all bool, updatableOnly bool) []*rpc.PlatformSu func newCoreListResult(in []*rpc.PlatformSummary, updatableOnly bool) *coreListResult { res := &coreListResult{updatableOnly: updatableOnly} for _, platformSummary := range in { - res.platforms = append(res.platforms, result.NewPlatformSummary(platformSummary)) + res.Platforms = append(res.Platforms, result.NewPlatformSummary(platformSummary)) } return res } type coreListResult struct { - platforms []*result.PlatformSummary + Platforms []*result.PlatformSummary `json:"platforms"` updatableOnly bool } // Data implements Result interface func (ir coreListResult) Data() interface{} { - return ir.platforms + return ir } // String implements Result interface func (ir coreListResult) String() string { - if len(ir.platforms) == 0 { + if len(ir.Platforms) == 0 { if ir.updatableOnly { return tr("All platforms are up to date.") } @@ -114,7 +114,7 @@ func (ir coreListResult) String() string { } t := table.New() t.SetHeader(tr("ID"), tr("Installed"), tr("Latest"), tr("Name")) - for _, platform := range ir.platforms { + for _, platform := range ir.Platforms { latestVersion := platform.LatestVersion.String() if latestVersion == "" { latestVersion = "n/a" From c0d4e405e8c5b52056cd42f9f5d7918d709e3cd8 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 10:42:09 +0100 Subject: [PATCH 08/14] cli: core search --- internal/cli/core/search.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/cli/core/search.go b/internal/cli/core/search.go index 0fc2389cdd8..fc2f247524c 100644 --- a/internal/cli/core/search.go +++ b/internal/cli/core/search.go @@ -86,27 +86,27 @@ func runSearchCommand(cmd *cobra.Command, args []string, allVersions bool) { // output from this command requires special formatting, let's create a dedicated // feedback.Result implementation type searchResults struct { - platforms []*result.PlatformSummary + Platforms []*result.PlatformSummary `json:"platforms"` allVersions bool } func newSearchResult(in []*rpc.PlatformSummary, allVersions bool) *searchResults { res := &searchResults{ - platforms: make([]*result.PlatformSummary, len(in)), + Platforms: make([]*result.PlatformSummary, len(in)), allVersions: allVersions, } for i, platformSummary := range in { - res.platforms[i] = result.NewPlatformSummary(platformSummary) + res.Platforms[i] = result.NewPlatformSummary(platformSummary) } return res } func (sr searchResults) Data() interface{} { - return sr.platforms + return sr } func (sr searchResults) String() string { - if len(sr.platforms) == 0 { + if len(sr.Platforms) == 0 { return tr("No platforms matching your search.") } @@ -121,7 +121,7 @@ func (sr searchResults) String() string { t.AddRow(platform.Id, release.Version, release.FormatName()) } - for _, platform := range sr.platforms { + for _, platform := range sr.Platforms { // When allVersions is not requested we only show the latest compatible version if !sr.allVersions { addRow(platform, platform.GetLatestRelease()) From db0e167d77f882f05cc95456f6d91bedf429e259 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 10:46:33 +0100 Subject: [PATCH 09/14] cli: lib examples --- internal/cli/lib/examples.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/cli/lib/examples.go b/internal/cli/lib/examples.go index 17852f4003a..729a202d98b 100644 --- a/internal/cli/lib/examples.go +++ b/internal/cli/lib/examples.go @@ -94,11 +94,11 @@ type libraryExamples struct { } type libraryExamplesResult struct { - Examples []*libraryExamples + Examples []*libraryExamples `json:"examples"` } func (ir libraryExamplesResult) Data() interface{} { - return ir.Examples + return ir } func (ir libraryExamplesResult) String() string { From 146048f79ef61a23e02cd2a4d728f1e66f779715 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 10:47:53 +0100 Subject: [PATCH 10/14] cli: lib list --- internal/cli/lib/list.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/cli/lib/list.go b/internal/cli/lib/list.go index 75547a93d6d..8c489b102f5 100644 --- a/internal/cli/lib/list.go +++ b/internal/cli/lib/list.go @@ -67,7 +67,7 @@ func List(instance *rpc.Instance, args []string, all bool, updatable bool) { } feedback.PrintResult(installedResult{ onlyUpdates: updatable, - installedLibs: installedLibsResult, + InstalledLibs: installedLibsResult, }) logrus.Info("Done") } @@ -118,24 +118,24 @@ func GetList( // output from this command requires special formatting, let's create a dedicated // feedback.Result implementation type installedResult struct { + InstalledLibs []*result.InstalledLibrary `json:"installed_libraries"` onlyUpdates bool - installedLibs []*result.InstalledLibrary } func (ir installedResult) Data() interface{} { - return ir.installedLibs + return ir } func (ir installedResult) String() string { - if len(ir.installedLibs) == 0 { + if len(ir.InstalledLibs) == 0 { if ir.onlyUpdates { return tr("No libraries update is available.") } return tr("No libraries installed.") } - sort.Slice(ir.installedLibs, func(i, j int) bool { - return strings.ToLower(ir.installedLibs[i].Library.Name) < strings.ToLower(ir.installedLibs[j].Library.Name) || - strings.ToLower(ir.installedLibs[i].Library.ContainerPlatform) < strings.ToLower(ir.installedLibs[j].Library.ContainerPlatform) + sort.Slice(ir.InstalledLibs, func(i, j int) bool { + return strings.ToLower(ir.InstalledLibs[i].Library.Name) < strings.ToLower(ir.InstalledLibs[j].Library.Name) || + strings.ToLower(ir.InstalledLibs[i].Library.ContainerPlatform) < strings.ToLower(ir.InstalledLibs[j].Library.ContainerPlatform) }) t := table.New() @@ -145,7 +145,7 @@ func (ir installedResult) String() string { t.SetColumnWidthMode(4, table.Average) lastName := "" - for _, libMeta := range ir.installedLibs { + for _, libMeta := range ir.InstalledLibs { lib := libMeta.Library name := lib.Name if name == lastName { From c9e06f7a56579ef37818b848c861031cb9921d18 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 11:25:42 +0100 Subject: [PATCH 11/14] fix tests --- .../integrationtest/compile_1/compile_test.go | 14 +- .../integrationtest/config/config_test.go | 170 ++++++++-------- internal/integrationtest/core/core_test.go | 184 +++++++++--------- internal/integrationtest/lib/lib_test.go | 124 ++++++------ 4 files changed, 255 insertions(+), 237 deletions(-) diff --git a/internal/integrationtest/compile_1/compile_test.go b/internal/integrationtest/compile_1/compile_test.go index 78ceb5ca63c..7ab7ab97f5e 100644 --- a/internal/integrationtest/compile_1/compile_test.go +++ b/internal/integrationtest/compile_1/compile_test.go @@ -499,9 +499,11 @@ func compileWithExportBinariesConfig(t *testing.T, env *integrationtest.Environm require.NoError(t, err) requirejson.Contains(t, stdout, ` { - "sketch": { - "always_export_binaries": "true" - } + "config": { + "sketch": { + "always_export_binaries": "true" + } + } }`) // Test compilation with export binaries env var set @@ -824,10 +826,8 @@ func TestCompileWithArchivesAndLongPaths(t *testing.T) { stdout, _, err := cli.Run("lib", "examples", "ArduinoIoTCloud", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - var libOutput []map[string]interface{} - err = json.Unmarshal(stdout, &libOutput) - require.NoError(t, err) - sketchPath := paths.New(libOutput[0]["library"].(map[string]interface{})["install_dir"].(string)) + libOutput := strings.Trim(requirejson.Parse(t, stdout).Query(`.examples.[0].library.install_dir`).String(), `"`) + sketchPath := paths.New(libOutput) sketchPath = sketchPath.Join("examples", "ArduinoIoTCloud-Advanced") _, _, err = cli.Run("compile", "-b", "esp8266:esp8266:huzzah", sketchPath.String(), "--config-file", "arduino-cli.yaml") diff --git a/internal/integrationtest/config/config_test.go b/internal/integrationtest/config/config_test.go index e21d6db55dc..4ccb5460acc 100644 --- a/internal/integrationtest/config/config_test.go +++ b/internal/integrationtest/config/config_test.go @@ -239,7 +239,7 @@ func TestDump(t *testing.T) { stdout, _, err := cli.Run("config", "dump", "--config-file", configFile.String(), "--format", "json") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]") stdout, _, err = cli.Run("config", "init", "--additional-urls", "https://example.com") require.NoError(t, err) @@ -249,7 +249,7 @@ func TestDump(t *testing.T) { stdout, _, err = cli.Run("config", "dump", "--format", "json") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com\"]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com\"]") } func TestDumpWithConfigFileFlag(t *testing.T) { @@ -265,7 +265,7 @@ func TestDumpWithConfigFileFlag(t *testing.T) { stdout, _, err := cli.Run("config", "dump", "--config-file", configFile.String(), "--format", "json") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com\"]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com\"]") stdout, _, err = cli.Run( "config", @@ -277,7 +277,7 @@ func TestDumpWithConfigFileFlag(t *testing.T) { "json", ) require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://another-url.com\"]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://another-url.com\"]") } func TestAddRemoveSetDeleteOnUnexistingKey(t *testing.T) { @@ -316,7 +316,7 @@ func TestAddSingleArgument(t *testing.T) { // Verifies no additional urls are present stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]") // Adds one URL url := "https://example.com" @@ -326,7 +326,7 @@ func TestAddSingleArgument(t *testing.T) { // Verifies URL has been saved stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com\"]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com\"]") // Adds the same URL (should not error) _, _, err = cli.Run("config", "add", @@ -337,7 +337,7 @@ func TestAddSingleArgument(t *testing.T) { // Verifies a second copy has NOT been added stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com\"]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com\"]") } func TestAddMultipleArguments(t *testing.T) { @@ -351,7 +351,7 @@ func TestAddMultipleArguments(t *testing.T) { // Verifies no additional urls are present stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]") // Adds multiple URLs at the same time urls := [3]string{ @@ -366,14 +366,16 @@ func TestAddMultipleArguments(t *testing.T) { // Verifies URL has been saved stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2") requirejson.Contains(t, stdout, ` { - "board_manager": { - "additional_urls": [ - "https://example.com/package_example_index.json", - "https://example.com/yet_another_package_example_index.json" - ] + "config": { + "board_manager": { + "additional_urls": [ + "https://example.com/package_example_index.json", + "https://example.com/yet_another_package_example_index.json" + ] + } } }`) @@ -384,14 +386,16 @@ func TestAddMultipleArguments(t *testing.T) { // Verifies no change in result array stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2") requirejson.Contains(t, stdout, ` { - "board_manager": { - "additional_urls": [ - "https://example.com/package_example_index.json", - "https://example.com/yet_another_package_example_index.json" - ] + "config": { + "board_manager": { + "additional_urls": [ + "https://example.com/package_example_index.json", + "https://example.com/yet_another_package_example_index.json" + ] + } } }`) @@ -407,15 +411,17 @@ func TestAddMultipleArguments(t *testing.T) { // Verifies URL has been saved stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "3") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "3") requirejson.Contains(t, stdout, ` { - "board_manager": { - "additional_urls": [ - "https://example.com/package_example_index.json", - "https://example.com/a_third_package_example_index.json", - "https://example.com/yet_another_package_example_index.json" - ] + "config": { + "board_manager": { + "additional_urls": [ + "https://example.com/package_example_index.json", + "https://example.com/a_third_package_example_index.json", + "https://example.com/yet_another_package_example_index.json" + ] + } } }`) } @@ -431,7 +437,7 @@ func TestAddOnUnsupportedKey(t *testing.T) { // Verifies default value stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".daemon | .port", "\"50051\"") + requirejson.Query(t, stdout, ".config | .daemon | .port", "\"50051\"") // Tries and fails to add a new item _, stderr, err := cli.Run("config", "add", "daemon.port", "50000", "--config-file", "arduino-cli.yaml") @@ -441,7 +447,7 @@ func TestAddOnUnsupportedKey(t *testing.T) { // Verifies value is not changed stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".daemon | .port", "\"50051\"") + requirejson.Query(t, stdout, ".config | .daemon | .port", "\"50051\"") } func TestRemoveSingleArgument(t *testing.T) { @@ -463,14 +469,16 @@ func TestRemoveSingleArgument(t *testing.T) { // Verifies default state stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2") requirejson.Contains(t, stdout, ` { - "board_manager": { - "additional_urls": [ - "https://example.com/package_example_index.json", - "https://example.com/yet_another_package_example_index.json" - ] + "config": { + "board_manager": { + "additional_urls": [ + "https://example.com/package_example_index.json", + "https://example.com/yet_another_package_example_index.json" + ] + } } }`) @@ -481,7 +489,7 @@ func TestRemoveSingleArgument(t *testing.T) { // Verifies URLs has been removed stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com/yet_another_package_example_index.json\"]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com/yet_another_package_example_index.json\"]") } func TestRemoveMultipleArguments(t *testing.T) { @@ -503,14 +511,16 @@ func TestRemoveMultipleArguments(t *testing.T) { // Verifies default state stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2") requirejson.Contains(t, stdout, ` { - "board_manager": { - "additional_urls": [ - "https://example.com/package_example_index.json", - "https://example.com/yet_another_package_example_index.json" - ] + "config": { + "board_manager": { + "additional_urls": [ + "https://example.com/package_example_index.json", + "https://example.com/yet_another_package_example_index.json" + ] + } } }`) @@ -521,7 +531,7 @@ func TestRemoveMultipleArguments(t *testing.T) { // Verifies all URLs have been removed stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]") } func TestRemoveOnUnsupportedKey(t *testing.T) { @@ -535,7 +545,7 @@ func TestRemoveOnUnsupportedKey(t *testing.T) { // Verifies default value stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".daemon | .port", "\"50051\"") + requirejson.Query(t, stdout, ".config | .daemon | .port", "\"50051\"") // Tries and fails to remove an item _, stderr, err := cli.Run("config", "remove", "daemon.port", "50051", "--config-file", "arduino-cli.yaml") @@ -545,7 +555,7 @@ func TestRemoveOnUnsupportedKey(t *testing.T) { // Verifies value is not changed stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".daemon | .port", "\"50051\"") + requirejson.Query(t, stdout, ".config | .daemon | .port", "\"50051\"") } func TestSetSliceWithSingleArgument(t *testing.T) { @@ -559,7 +569,7 @@ func TestSetSliceWithSingleArgument(t *testing.T) { // Verifies default state stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]") // Set an URL in the list url := "https://example.com/package_example_index.json" @@ -569,7 +579,7 @@ func TestSetSliceWithSingleArgument(t *testing.T) { // Verifies value is changed stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com/package_example_index.json\"]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com/package_example_index.json\"]") // Set an URL in the list url = "https://example.com/yet_another_package_example_index.json" @@ -579,7 +589,7 @@ func TestSetSliceWithSingleArgument(t *testing.T) { // Verifies value is changed stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com/yet_another_package_example_index.json\"]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com/yet_another_package_example_index.json\"]") } func TestSetSliceWithMultipleArguments(t *testing.T) { @@ -593,7 +603,7 @@ func TestSetSliceWithMultipleArguments(t *testing.T) { // Verifies default state stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]") // Set some URLs in the list urls := [7]string{ @@ -606,14 +616,16 @@ func TestSetSliceWithMultipleArguments(t *testing.T) { // Verifies value is changed stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2") requirejson.Contains(t, stdout, ` { - "board_manager": { - "additional_urls": [ - "https://example.com/first_package_index.json", - "https://example.com/second_package_index.json" - ] + "config": { + "board_manager": { + "additional_urls": [ + "https://example.com/first_package_index.json", + "https://example.com/second_package_index.json" + ] + } } }`) @@ -628,14 +640,16 @@ func TestSetSliceWithMultipleArguments(t *testing.T) { // Verifies previous value is overwritten stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2") requirejson.Contains(t, stdout, ` { - "board_manager": { - "additional_urls": [ - "https://example.com/third_package_index.json", - "https://example.com/fourth_package_index.json" - ] + "config": { + "board_manager": { + "additional_urls": [ + "https://example.com/third_package_index.json", + "https://example.com/fourth_package_index.json" + ] + } } }`) @@ -658,16 +672,18 @@ func TestSetSliceWithMultipleArguments(t *testing.T) { // Verifies all unique values exist in config stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "4") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "4") requirejson.Contains(t, stdout, ` { - "board_manager": { - "additional_urls": [ - "https://example.com/first_package_index.json", - "https://example.com/second_package_index.json", - "https://example.com/fifth_package_index.json", - "https://example.com/sixth_package_index.json" - ] + "config": { + "board_manager": { + "additional_urls": [ + "https://example.com/first_package_index.json", + "https://example.com/second_package_index.json", + "https://example.com/fifth_package_index.json", + "https://example.com/sixth_package_index.json" + ] + } } }`) } @@ -683,7 +699,7 @@ func TestSetStringWithSingleArgument(t *testing.T) { // Verifies default state stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".logging | .level", "\"info\"") + requirejson.Query(t, stdout, ".config | .logging | .level", "\"info\"") // Changes value _, _, err = cli.Run("config", "set", "logging.level", "trace", "--config-file", "arduino-cli.yaml") @@ -692,7 +708,7 @@ func TestSetStringWithSingleArgument(t *testing.T) { // Verifies value is changed stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".logging | .level", "\"trace\"") + requirejson.Query(t, stdout, ".config | .logging | .level", "\"trace\"") } func TestSetStringWithMultipleArguments(t *testing.T) { @@ -706,7 +722,7 @@ func TestSetStringWithMultipleArguments(t *testing.T) { // Verifies default state stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".logging | .level", "\"info\"") + requirejson.Query(t, stdout, ".config | .logging | .level", "\"info\"") // Tries to change value _, stderr, err := cli.Run("config", "set", "logging.level", "trace", "debug") @@ -725,7 +741,7 @@ func TestSetBoolWithSingleArgument(t *testing.T) { // Verifies default state stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".library | .enable_unsafe_install", "false") + requirejson.Query(t, stdout, ".config | .library | .enable_unsafe_install", "false") // Changes value _, _, err = cli.Run("config", "set", "library.enable_unsafe_install", "true", "--config-file", "arduino-cli.yaml") @@ -734,7 +750,7 @@ func TestSetBoolWithSingleArgument(t *testing.T) { // Verifies value is changed stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".library | .enable_unsafe_install", "true") + requirejson.Query(t, stdout, ".config | .library | .enable_unsafe_install", "true") } func TestSetBoolWithMultipleArguments(t *testing.T) { @@ -748,7 +764,7 @@ func TestSetBoolWithMultipleArguments(t *testing.T) { // Verifies default state stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".library | .enable_unsafe_install", "false") + requirejson.Query(t, stdout, ".config | .library | .enable_unsafe_install", "false") // Changes value _, stderr, err := cli.Run("config", "set", "library.enable_unsafe_install", "true", "foo", "--config-file", "arduino-cli.yaml") @@ -767,7 +783,7 @@ func TestDelete(t *testing.T) { // Verifies default state stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".library | .enable_unsafe_install", "false") + requirejson.Query(t, stdout, ".config | .library | .enable_unsafe_install", "false") // Delete config key _, _, err = cli.Run("config", "delete", "library.enable_unsafe_install", "--config-file", "arduino-cli.yaml") @@ -784,7 +800,7 @@ func TestDelete(t *testing.T) { // Verifies default state stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml") require.NoError(t, err) - requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]") + requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]") // Delete config key and sub keys _, _, err = cli.Run("config", "delete", "board_manager", "--config-file", "arduino-cli.yaml") diff --git a/internal/integrationtest/core/core_test.go b/internal/integrationtest/core/core_test.go index c9db2e7701e..e8b7c4ad3be 100644 --- a/internal/integrationtest/core/core_test.go +++ b/internal/integrationtest/core/core_test.go @@ -48,17 +48,19 @@ func TestCorrectHandlingOfPlatformVersionProperty(t *testing.T) { // Trigger problematic call out, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Contains(t, out, `[ - { - "id":"DxCore-dev:megaavr", - "installed_version":"1.4.10", - "releases": { - "1.4.10": { - "name":"DxCore" + requirejson.Contains(t, out, `{ + "platforms": [ + { + "id":"DxCore-dev:megaavr", + "installed_version":"1.4.10", + "releases": { + "1.4.10": { + "name":"DxCore" + } } } - } - ]`) + ] + }`) } func TestCoreSearch(t *testing.T) { @@ -84,20 +86,20 @@ func TestCoreSearch(t *testing.T) { require.NoError(t, err) requirejson.NotEmpty(t, out) // Verify that "installed_version" is set - requirejson.Contains(t, out, `[{installed_version: "1.8.6"}]`) + requirejson.Contains(t, out, `{"platforms":[{installed_version: "1.8.6"}]}`) // additional URL out, _, err = cli.Run("core", "search", "test_core", "--format", "json", "--additional-urls="+url.String()) require.NoError(t, err) - requirejson.Len(t, out, 1) + requirejson.Query(t, out, `.platforms | length`, `1`) // show all versions out, _, err = cli.Run("core", "search", "test_core", "--all", "--format", "json", "--additional-urls="+url.String()) require.NoError(t, err) - requirejson.Query(t, out, `.[].releases | length`, "3") + requirejson.Query(t, out, `.platforms.[].releases | length`, "3") checkPlatformIsInJSONOutput := func(stdout []byte, id, version string) { - jqquery := fmt.Sprintf(`[{id:"%s", releases:{"%s":{}}}]`, id, version) + jqquery := fmt.Sprintf(`{"platforms":[{id:"%s", releases:{"%s":{}}}]}`, id, version) requirejson.Contains(t, out, jqquery, "platform %s@%s is missing from the output", id, version) } @@ -131,7 +133,7 @@ func TestCoreSearch(t *testing.T) { require.NoError(t, err) for _, id := range expectedIDs { - jqquery := fmt.Sprintf(`[{id:"%s"}]`, id) + jqquery := fmt.Sprintf(`{"platforms":[{id:"%s"}]}`, id) requirejson.Contains(t, out, jqquery, "platform %s is missing from the output", id) } } @@ -181,8 +183,8 @@ func TestCoreSearchNoArgs(t *testing.T) { // Same thing in JSON format, also check the number of platforms found is the same stdout, _, err = cli.Run("core", "search", "--format", "json") require.NoError(t, err) - requirejson.Contains(t, stdout, `[{"id": "test:x86", "releases": { "2.0.0": {"name":"test_core"}}}]`) - requirejson.Len(t, stdout, numPlatforms) + requirejson.Contains(t, stdout, `{"platforms":[{"id": "test:x86", "releases": { "2.0.0": {"name":"test_core"}}}]}`) + requirejson.Query(t, stdout, ".platforms | length", fmt.Sprint(numPlatforms)) // list all with additional urls, check the test core is there stdout, _, err = cli.Run("core", "search", "--additional-urls="+url.String()) @@ -199,19 +201,20 @@ func TestCoreSearchNoArgs(t *testing.T) { // same thing in JSON format, also check the number of platforms found is the same stdout, _, err = cli.Run("core", "search", "--format", "json", "--additional-urls="+url.String()) require.NoError(t, err) - requirejson.Contains(t, stdout, `[ - { - "id": "test:x86", - "installed_version": "2.0.0", - "latest_version": "2.0.0", - "releases": { - "1.0.0": {"name":"test_core", "compatible": true}, - "2.0.0": {"name":"test_core", "compatible": true}, - "3.0.0": {"name":"test_core", "compatible": false} + requirejson.Contains(t, stdout, `{ + "platforms": [ + { + "id": "test:x86", + "installed_version": "2.0.0", + "latest_version": "2.0.0", + "releases": { + "1.0.0": {"name":"test_core", "compatible": true}, + "2.0.0": {"name":"test_core", "compatible": true}, + "3.0.0": {"name":"test_core", "compatible": false} + } } - } - ]`) - requirejson.Len(t, stdout, numPlatforms) + ]}`) + requirejson.Query(t, stdout, `.platforms | length`, fmt.Sprint(numPlatforms)) } func TestCoreUpdateIndexUrlNotFound(t *testing.T) { @@ -325,7 +328,7 @@ func TestCoreInstall(t *testing.T) { require.NoError(t, err) stdout, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Query(t, stdout, `.[] | select(.id == "arduino:avr") | .installed_version`, `"1.6.16"`) + requirejson.Query(t, stdout, `.platforms.[] | select(.id == "arduino:avr") | .installed_version`, `"1.6.16"`) // Replace it with the same with --no-overwrite (should NOT fail) _, _, err = cli.Run("core", "install", "arduino:avr@1.6.16", "--no-overwrite") @@ -340,13 +343,13 @@ func TestCoreInstall(t *testing.T) { require.NoError(t, err) stdout, _, err = cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Query(t, stdout, `.[] | select(.id == "arduino:avr") | .installed_version`, `"1.6.17"`) + requirejson.Query(t, stdout, `.platforms.[] | select(.id == "arduino:avr") | .installed_version`, `"1.6.17"`) // Confirm core is listed as "updatable" stdout, _, err = cli.Run("core", "list", "--updatable", "--format", "json") require.NoError(t, err) jsonout := requirejson.Parse(t, stdout) - q := jsonout.Query(`.[] | select(.id == "arduino:avr")`) + q := jsonout.Query(`.platforms.[] | select(.id == "arduino:avr")`) q.Query(".installed_version").MustEqual(`"1.6.17"`) latest := q.Query(".latest_version") @@ -355,12 +358,12 @@ func TestCoreInstall(t *testing.T) { require.NoError(t, err) stdout, _, err = cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Query(t, stdout, `.[] | select(.id == "arduino:avr") | .installed_version`, latest.String()) + requirejson.Query(t, stdout, `.platforms.[] | select(.id == "arduino:avr") | .installed_version`, latest.String()) // double check the core isn't updatable anymore stdout, _, err = cli.Run("core", "list", "--updatable", "--format", "json") require.NoError(t, err) - requirejson.Empty(t, stdout) + requirejson.Query(t, stdout, `.platforms | length`, `0`) } func TestCoreUninstall(t *testing.T) { @@ -373,12 +376,12 @@ func TestCoreUninstall(t *testing.T) { require.NoError(t, err) stdout, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Contains(t, stdout, `[ { "id": "arduino:avr" } ]`) + requirejson.Contains(t, stdout, `{"platforms":[ { "id": "arduino:avr" } ]}`) _, _, err = cli.Run("core", "uninstall", "arduino:avr") require.NoError(t, err) stdout, _, err = cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Empty(t, stdout) + requirejson.Query(t, stdout, `.platforms | length`, `0`) } func TestCoreUninstallToolDependencyRemoval(t *testing.T) { @@ -456,7 +459,7 @@ func TestCoreSearchManuallyInstalledCoresNotPrinted(t *testing.T) { // Verifies only cores in board manager are shown stdout, _, err := cli.Run("core", "search", "--format", "json") require.NoError(t, err) - requirejson.NotEmpty(t, stdout) + requirejson.Query(t, stdout, `.platforms | length > 0`, `true`) oldJson := stdout // Manually installs a core in sketchbooks hardware folder @@ -471,7 +474,7 @@ func TestCoreSearchManuallyInstalledCoresNotPrinted(t *testing.T) { // Verifies manually installed core is not shown stdout, _, err = cli.Run("core", "search", "--format", "json") require.NoError(t, err) - requirejson.NotContains(t, stdout, `[{"id": "arduino-beta-development:avr"}]`) + requirejson.NotContains(t, stdout, `{"platforms":[{"id": "arduino-beta-development:avr"}]}`) require.Equal(t, oldJson, stdout) } @@ -485,8 +488,8 @@ func TestCoreListAllManuallyInstalledCore(t *testing.T) { // Verifies only cores in board manager are shown stdout, _, err := cli.Run("core", "list", "--all", "--format", "json") require.NoError(t, err) - requirejson.NotEmpty(t, stdout) - length, err := strconv.Atoi(requirejson.Parse(t, stdout).Query("length").String()) + requirejson.Query(t, stdout, `.platforms | length > 0`, `true`) + length, err := strconv.Atoi(requirejson.Parse(t, stdout).Query(".platforms | length").String()) require.NoError(t, err) // Manually installs a core in sketchbooks hardware folder @@ -501,8 +504,8 @@ func TestCoreListAllManuallyInstalledCore(t *testing.T) { // Verifies manually installed core is shown stdout, _, err = cli.Run("core", "list", "--all", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, length+1) - requirejson.Contains(t, stdout, `[ + requirejson.Query(t, stdout, `.platforms | length`, fmt.Sprint(length+1)) + requirejson.Contains(t, stdout, `{"platforms":[ { "id": "arduino-beta-development:avr", "latest_version": "1.8.3", @@ -512,7 +515,7 @@ func TestCoreListAllManuallyInstalledCore(t *testing.T) { } } } - ]`) + ]}`) } func TestCoreListUpdatableAllFlags(t *testing.T) { @@ -525,8 +528,8 @@ func TestCoreListUpdatableAllFlags(t *testing.T) { // Verifies only cores in board manager are shown stdout, _, err := cli.Run("core", "list", "--all", "--updatable", "--format", "json") require.NoError(t, err) - requirejson.NotEmpty(t, stdout) - length, err := strconv.Atoi(requirejson.Parse(t, stdout).Query("length").String()) + requirejson.Query(t, stdout, `.platforms | length > 0`, `true`) + length, err := strconv.Atoi(requirejson.Parse(t, stdout).Query(".platforms | length").String()) require.NoError(t, err) // Manually installs a core in sketchbooks hardware folder @@ -541,8 +544,8 @@ func TestCoreListUpdatableAllFlags(t *testing.T) { // Verifies using both --updatable and --all flags --all takes precedence stdout, _, err = cli.Run("core", "list", "--all", "--updatable", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, length+1) - requirejson.Contains(t, stdout, `[ + requirejson.Query(t, stdout, `.platforms | length`, fmt.Sprint(length+1)) + requirejson.Contains(t, stdout, `{"platforms":[ { "id": "arduino-beta-development:avr", "latest_version": "1.8.3", @@ -552,7 +555,7 @@ func TestCoreListUpdatableAllFlags(t *testing.T) { } } } - ]`) + ]}`) } func TestCoreUpgradeRemovesUnusedTools(t *testing.T) { @@ -618,8 +621,8 @@ func TestCoreListWithInstalledJson(t *testing.T) { // Verifies installed core is correctly found and name is set stdout, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - requirejson.Contains(t, stdout, `[ + requirejson.Query(t, stdout, `.platforms | length`, `1`) + requirejson.Contains(t, stdout, `{"platforms":[ { "id": "adafruit:avr", "releases": { @@ -628,7 +631,7 @@ func TestCoreListWithInstalledJson(t *testing.T) { } } } - ]`) + ]}`) // Deletes installed.json file, this file stores information about the core, // that is used mostly when removing package indexes and their cores are still installed; @@ -641,11 +644,11 @@ func TestCoreListWithInstalledJson(t *testing.T) { // Verifies installed core is still found and name is set stdout, _, err = cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) + requirejson.Query(t, stdout, `.platforms | length`, `1`) // Name for this core changes since if there's installed.json file we read it from // platform.txt, turns out that this core has different names used in different files // thus the change. - requirejson.Contains(t, stdout, `[ + requirejson.Contains(t, stdout, `{"platforms":[ { "id": "adafruit:avr", "releases": { @@ -654,7 +657,7 @@ func TestCoreListWithInstalledJson(t *testing.T) { } } } - ]`) + ]}`) } func TestCoreSearchUpdateIndexDelay(t *testing.T) { @@ -737,20 +740,20 @@ func TestCoreSearchSortedResults(t *testing.T) { // verify that results are already sorted correctly sortedDeprecated := requirejson.Parse(t, stdout).Query( - "[ .[] | select(.deprecated == true) | .id |=ascii_downcase | .id] | sort").String() + "[ .platforms.[] | select(.deprecated == true) | .id |=ascii_downcase | .id] | sort").String() notSortedDeprecated := requirejson.Parse(t, stdout).Query( - "[ .[] | select(.deprecated == true) | .id |=ascii_downcase | .id]").String() + "[ .platforms.[] | select(.deprecated == true) | .id |=ascii_downcase | .id]").String() require.Equal(t, sortedDeprecated, notSortedDeprecated) sortedNotDeprecated := requirejson.Parse(t, stdout).Query( - "[ .[] | select(.deprecated != true) | .id |=ascii_downcase | .id] | sort").String() + "[ .platforms.[] | select(.deprecated != true) | .id |=ascii_downcase | .id] | sort").String() notSortedNotDeprecated := requirejson.Parse(t, stdout).Query( - "[ .[] | select(.deprecated != true) | .id |=ascii_downcase | .id]").String() + "[ .platforms.[] | select(.deprecated != true) | .id |=ascii_downcase | .id]").String() require.Equal(t, sortedNotDeprecated, notSortedNotDeprecated) // verify that deprecated platforms are the last ones platform := requirejson.Parse(t, stdout).Query( - "[ .[] | .id |=ascii_downcase | .id]").String() + "[ .platforms.[] | .id |=ascii_downcase | .id]").String() require.Equal(t, platform, strings.TrimRight(notSortedNotDeprecated, "]")+","+strings.TrimLeft(notSortedDeprecated, "[")) } @@ -805,24 +808,23 @@ func TestCoreListSortedResults(t *testing.T) { // test same behaviour with json output stdout, _, err = cli.Run("core", "list", "--additional-urls="+url.String(), "--format=json") require.NoError(t, err) - requirejson.Len(t, stdout, 3) + requirejson.Query(t, stdout, `.platforms | length`, `3`) // verify that results are already sorted correctly sortedDeprecated := requirejson.Parse(t, stdout).Query( - "[ .[] | select(.deprecated == true) | .id |=ascii_downcase | .id] | sort").String() + "[ .platforms.[] | select(.deprecated == true) | .id |=ascii_downcase | .id] | sort").String() notSortedDeprecated := requirejson.Parse(t, stdout).Query( - "[ .[] | select(.deprecated == true) | .id |=ascii_downcase | .id]").String() + "[ .platforms.[] | select(.deprecated == true) | .id |=ascii_downcase | .id]").String() require.Equal(t, sortedDeprecated, notSortedDeprecated) sortedNotDeprecated := requirejson.Parse(t, stdout).Query( - "[ .[] | select(.deprecated != true) | .id |=ascii_downcase | .id] | sort").String() + "[ .platforms.[] | select(.deprecated != true) | .id |=ascii_downcase | .id] | sort").String() notSortedNotDeprecated := requirejson.Parse(t, stdout).Query( - "[ .[] | select(.deprecated != true) | .id |=ascii_downcase | .id]").String() + "[ .platforms.[] | select(.deprecated != true) | .id |=ascii_downcase | .id]").String() require.Equal(t, sortedNotDeprecated, notSortedNotDeprecated) // verify that deprecated platforms are the last ones - platform := requirejson.Parse(t, stdout).Query( - "[ .[] | .id |=ascii_downcase | .id]").String() + platform := requirejson.Parse(t, stdout).Query("[ .platforms.[] | .id |=ascii_downcase | .id]").String() require.Equal(t, platform, strings.TrimRight(notSortedNotDeprecated, "]")+","+strings.TrimLeft(notSortedDeprecated, "[")) } @@ -854,8 +856,8 @@ func TestCoreListDeprecatedPlatformWithInstalledJson(t *testing.T) { stdout, _, err := cli.Run("core", "list", "--additional-urls="+url.String(), "--format=json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - requirejson.Query(t, stdout, ".[] | .deprecated", "true") + requirejson.Query(t, stdout, `.platforms | length`, `1`) + requirejson.Query(t, stdout, ".platforms.[] | .deprecated", "true") } func TestCoreListPlatformWithoutPlatformTxt(t *testing.T) { @@ -867,7 +869,7 @@ func TestCoreListPlatformWithoutPlatformTxt(t *testing.T) { stdout, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 0) + requirejson.Query(t, stdout, `.platforms | length`, `0`) // Simulates creation of a new core in the sketchbook hardware folder // without a platforms.txt @@ -879,9 +881,9 @@ func TestCoreListPlatformWithoutPlatformTxt(t *testing.T) { // Verifies no core is installed stdout, _, err = cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - requirejson.Query(t, stdout, ".[] | .id", `"some-packager:some-arch"`) - requirejson.Query(t, stdout, ".[] | .releases[.installed_version].name", `"some-packager-some-arch"`) + requirejson.Query(t, stdout, `.platforms | length`, `1`) + requirejson.Query(t, stdout, ".platforms.[] | .id", `"some-packager:some-arch"`) + requirejson.Query(t, stdout, ".platforms.[] | .releases[.installed_version].name", `"some-packager-some-arch"`) } func TestCoreDownloadMultiplePlatforms(t *testing.T) { @@ -899,7 +901,7 @@ func TestCoreDownloadMultiplePlatforms(t *testing.T) { // Verifies no core is installed stdout, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 0) + requirejson.Query(t, stdout, `.platforms | length`, `0`) // Simulates creation of two new cores in the sketchbook hardware folder wd, _ := paths.Getwd() @@ -915,7 +917,7 @@ func TestCoreDownloadMultiplePlatforms(t *testing.T) { // Verifies the two cores are detected stdout, _, err = cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 2) + requirejson.Query(t, stdout, `.platforms | length`, `2`) // Try to do an operation on the fake cores. // The cli should not allow it since optimizing the casing results in finding two cores @@ -939,13 +941,13 @@ func TestCoreWithMissingCustomBoardOptionsIsLoaded(t *testing.T) { stdout, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) + requirejson.Query(t, stdout, `.platforms | length`, `1`) // Verifies platform is loaded except excluding board with missing options - requirejson.Contains(t, stdout, `[{"id": "arduino-beta-dev:platform_with_missing_custom_board_options"}]`) - requirejson.Query(t, stdout, ".[] | select(.id == \"arduino-beta-dev:platform_with_missing_custom_board_options\") | .releases[.installed_version].boards | length", "2") + requirejson.Contains(t, stdout, `{"platforms":[{"id": "arduino-beta-dev:platform_with_missing_custom_board_options"}]}`) + requirejson.Query(t, stdout, ".platforms.[] | select(.id == \"arduino-beta-dev:platform_with_missing_custom_board_options\") | .releases[.installed_version].boards | length", "2") // Verify board with malformed options is not loaded // while other board is loaded - requirejson.Contains(t, stdout, `[ + requirejson.Contains(t, stdout, `{"platforms":[ { "id": "arduino-beta-dev:platform_with_missing_custom_board_options", "releases": { @@ -961,7 +963,7 @@ func TestCoreWithMissingCustomBoardOptionsIsLoaded(t *testing.T) { } } } - ]`) + ]}`) } func TestCoreListOutdatedCore(t *testing.T) { @@ -977,11 +979,11 @@ func TestCoreListOutdatedCore(t *testing.T) { stdout, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - requirejson.Query(t, stdout, ".[0] | .installed_version", "\"1.8.6\"") - installedVersion, err := semver.Parse(strings.Trim(requirejson.Parse(t, stdout).Query(".[0] | .installed_version").String(), "\"")) + requirejson.Query(t, stdout, `.platforms | length`, `1`) + requirejson.Query(t, stdout, ".platforms.[0] | .installed_version", "\"1.8.6\"") + installedVersion, err := semver.Parse(strings.Trim(requirejson.Parse(t, stdout).Query(".platforms.[0] | .installed_version").String(), "\"")) require.NoError(t, err) - latestVersion, err := semver.Parse(strings.Trim(requirejson.Parse(t, stdout).Query(".[0] | .latest_version").String(), "\"")) + latestVersion, err := semver.Parse(strings.Trim(requirejson.Parse(t, stdout).Query(".platforms.[0] | .latest_version").String(), "\"")) require.NoError(t, err) // Installed version must be older than latest require.True(t, installedVersion.LessThan(latestVersion)) @@ -1115,7 +1117,7 @@ func TestCoreListWhenNoPlatformAreInstalled(t *testing.T) { stdout, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) - requirejson.Empty(t, stdout) + requirejson.Query(t, stdout, `.platforms | length`, `0`) stdout, _, err = cli.Run("core", "list") require.NoError(t, err) @@ -1136,7 +1138,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) { stdout, _, err := cli.Run("core", "list", "--all", "--format", "json", additionalURLs) require.NoError(t, err) requirejson.Parse(t, stdout). - Query(`.[] | select(.id == "foo_vendor:avr")`). + Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`). MustContain(`{ "installed_version": "", "latest_version": "1.0.1", @@ -1153,7 +1155,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) { stdout, _, err = cli.Run("core", "list", "--all", "--format", "json", additionalURLs) require.NoError(t, err) requirejson.Parse(t, stdout). - Query(`.[] | select(.id == "foo_vendor:avr")`). + Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`). MustContain(`{ "latest_version": "1.0.1", "installed_version": "1.0.1", @@ -1171,14 +1173,14 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) { stdout, _, err = cli.Run("core", "list", "--format", "json", additionalURLs) require.NoError(t, err) requirejson.Parse(t, stdout). - Query(`.[] | select(.id == "foo_vendor:avr")`). + Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`). MustContain(`{"installed_version": "1.0.0", "releases": {"1.0.0": {"compatible": true}}}`) // Lists all updatable cores stdout, _, err = cli.Run("core", "list", "--updatable", "--format", "json", additionalURLs) require.NoError(t, err) requirejson.Parse(t, stdout). - Query(`.[] | select(.id == "foo_vendor:avr")`). + Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`). MustContain(`{"latest_version": "1.0.1", "releases": {"1.0.1": {"compatible": true}}}`) // Show outdated cores, must show latest compatible @@ -1194,7 +1196,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) { stdout, _, err = cli.Run("core", "list", "--format", "json", additionalURLs) require.NoError(t, err) requirejson.Parse(t, stdout). - Query(`.[] | select(.id == "foo_vendor:avr") | .releases[.installed_version]`). + Query(`.platforms | .[] | select(.id == "foo_vendor:avr") | .releases[.installed_version]`). MustContain(`{"version": "1.0.1", "compatible": true}`) // upgrade to latest incompatible not possible (1.0.1 -> 1.0.2) @@ -1202,7 +1204,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) { require.NoError(t, err) stdout, _, err = cli.Run("core", "list", "--format", "json", additionalURLs) require.NoError(t, err) - requirejson.Query(t, stdout, `.[] | select(.id == "foo_vendor:avr") | .installed_version`, `"1.0.1"`) + requirejson.Query(t, stdout, `.platforms | .[] | select(.id == "foo_vendor:avr") | .installed_version`, `"1.0.1"`) // When no compatible version are found return error // When trying to install a platform with no compatible version fails @@ -1220,7 +1222,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) { require.Equal(t, stdoutSearchAll, stdoutSearch) for _, stdout := range [][]byte{stdoutSearchAll, stdoutSearch} { requirejson.Parse(t, stdout). - Query(`.[] | select(.id == "foo_vendor:avr")`). + Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`). MustContain(`{ "latest_version": "1.0.1", "releases": { @@ -1230,7 +1232,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) { } }`) requirejson.Parse(t, stdout). - Query(`.[] | select(.id == "incompatible_vendor:avr")`). + Query(`.platforms | .[] | select(.id == "incompatible_vendor:avr")`). MustContain(`{"latest_version": "", "releases": { "1.0.0": {"compatible": false}}}`) } // In text mode, core search shows `n/a` for core that doesn't have any compatible version diff --git a/internal/integrationtest/lib/lib_test.go b/internal/integrationtest/lib/lib_test.go index b00948a0c4c..868f3f2097c 100644 --- a/internal/integrationtest/lib/lib_test.go +++ b/internal/integrationtest/lib/lib_test.go @@ -57,22 +57,22 @@ func TestLibUpgradeCommand(t *testing.T) { require.NoError(t, err) stdOut, _, err := cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Contains(t, stdOut, `[ { "library":{ "name":"Servo", "version": "1.1.6" } } ]`) + requirejson.Contains(t, stdOut, `{"installed_libraries": [ { "library":{ "name":"Servo", "version": "1.1.6" } } ]}`) _, _, err = cli.Run("lib", "upgrade", "Servo") require.NoError(t, err) stdOut, _, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) jsonOut := requirejson.Parse(t, stdOut) - jsonOut.MustNotContain(`[ { "library":{ "name":"Servo", "version": "1.1.6" } } ]`) - servoVersion := jsonOut.Query(`.[].library | select(.name=="Servo") | .version`).String() + jsonOut.MustNotContain(`{"installed_libraries": [{"library":{ "name":"Servo", "version": "1.1.6" }}]}`) + servoVersion := jsonOut.Query(`.installed_libraries.[].library | select(.name=="Servo") | .version`).String() // Upgrade of already up-to-date library _, _, err = cli.Run("lib", "upgrade", "Servo") require.NoError(t, err) stdOut, _, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Query(t, stdOut, `.[].library | select(.name=="Servo") | .version`, servoVersion) + requirejson.Query(t, stdOut, `.installed_libraries.[].library | select(.name=="Servo") | .version`, servoVersion) } func TestLibCommandsUsingNameInsteadOfDirName(t *testing.T) { @@ -107,7 +107,7 @@ func TestLibInstallMultipleSameLibrary(t *testing.T) { require.NoError(t, err) // Count how many libraries with the name "Arduino SigFox for MKRFox1200" are installed requirejson.Parse(t, jsonOut). - Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). + Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'") // Check that 'lib upgrade' didn't create a double install @@ -122,7 +122,7 @@ func TestLibInstallMultipleSameLibrary(t *testing.T) { require.NoError(t, err) // Count how many libraries with the name "Arduino SigFox for MKRFox1200" are installed requirejson.Parse(t, jsonOut). - Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). + Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'") } @@ -140,7 +140,7 @@ func TestDuplicateLibInstallDetection(t *testing.T) { require.NoError(t, err) jsonOut, _, err := cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, jsonOut, 2, "Duplicate library install is not detected by the CLI") + requirejson.Query(t, jsonOut, `.installed_libraries | length`, `2`, "Duplicate library install is not detected by the CLI") _, stdErr, err := cli.Run("lib", "install", "ArduinoOTA") require.Error(t, err) @@ -170,7 +170,7 @@ func TestDuplicateLibInstallFromGitDetection(t *testing.T) { require.NoError(t, err) // Count how many libraries with the name "Arduino SigFox for MKRFox1200" are installed requirejson.Parse(t, jsonOut). - Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). + Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'") // Try to make a double install by upgrade @@ -181,7 +181,7 @@ func TestDuplicateLibInstallFromGitDetection(t *testing.T) { jsonOut, _, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) requirejson.Parse(t, jsonOut). - Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). + Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'") // Try to make a double install by zip-installing @@ -206,7 +206,7 @@ func TestDuplicateLibInstallFromGitDetection(t *testing.T) { jsonOut, _, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) requirejson.Parse(t, jsonOut). - Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). + Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`). LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'") } @@ -332,7 +332,7 @@ func TestList(t *testing.T) { stdout, stderr, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) require.Empty(t, stderr) - requirejson.Empty(t, stdout) + requirejson.Query(t, stdout, `.installed_libraries | length`, `0`) // Install something we can list at a version older than latest _, _, err = cli.Run("lib", "install", "ArduinoJson@6.11.0") @@ -358,9 +358,9 @@ func TestList(t *testing.T) { stdout, stderr, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) require.Empty(t, stderr) - requirejson.Len(t, stdout, 1) + requirejson.Query(t, stdout, `.installed_libraries | length`, `1`) // be sure data contains the available version - requirejson.Query(t, stdout, `.[0] | .release | .version != ""`, "true") + requirejson.Query(t, stdout, `.installed_libraries.[0] | .release | .version != ""`, "true") // Install something we can list without provides_includes field given in library.properties _, _, err = cli.Run("lib", "install", "Arduino_APDS9960@1.0.3") @@ -369,9 +369,9 @@ func TestList(t *testing.T) { stdout, stderr, err = cli.Run("lib", "list", "Arduino_APDS9960", "--format", "json") require.NoError(t, err) require.Empty(t, stderr) - requirejson.Len(t, stdout, 1) + requirejson.Query(t, stdout, `.installed_libraries | length`, `1`) // be sure data contains the correct provides_includes field - requirejson.Query(t, stdout, ".[0] | .library | .provides_includes | .[0]", `"Arduino_APDS9960.h"`) + requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .provides_includes | .[0]", `"Arduino_APDS9960.h"`) } func TestListExitCode(t *testing.T) { @@ -451,14 +451,14 @@ func TestListWithFqbn(t *testing.T) { stdout, stderr, err = cli.Run("lib", "list", "-b", "arduino:avr:uno", "--format", "json") require.NoError(t, err) require.Empty(t, stderr) - requirejson.Len(t, stdout, 6) + requirejson.Query(t, stdout, `.installed_libraries | length`, `6`) // Verifies library is compatible - requirejson.Query(t, stdout, `sort_by(.library | .name) | .[0] | .library | .name`, `"ArduinoJson"`) - requirejson.Query(t, stdout, `sort_by(.library | .name) | .[0] | .library | .compatible_with | ."arduino:avr:uno"`, `true`) + requirejson.Query(t, stdout, `.installed_libraries | sort_by(.library | .name) | .[0] | .library | .name`, `"ArduinoJson"`) + requirejson.Query(t, stdout, `.installed_libraries | sort_by(.library | .name) | .[0] | .library | .compatible_with | ."arduino:avr:uno"`, `true`) // Verifies bundled libs are shown if -b flag is used - requirejson.Parse(t, stdout).Query(`.[] | .library | select(.container_platform=="arduino:avr@1.8.6")`).MustNotBeEmpty() + requirejson.Parse(t, stdout).Query(`.installed_libraries.[] | .library | select(.container_platform=="arduino:avr@1.8.6")`).MustNotBeEmpty() } func TestListProvidesIncludesFallback(t *testing.T) { @@ -481,9 +481,9 @@ func TestListProvidesIncludesFallback(t *testing.T) { require.NoError(t, err) require.Empty(t, stderr) - requirejson.Len(t, stdout, 6) + requirejson.Query(t, stdout, `.installed_libraries | length`, `6`) - requirejson.Query(t, stdout, "[.[] | .library | { (.name): .provides_includes }] | add", + requirejson.Query(t, stdout, "[.installed_libraries.[] | .library | { (.name): .provides_includes }] | add", `{ "SPI": [ "SPI.h" @@ -548,7 +548,7 @@ func TestInstall(t *testing.T) { require.NoError(t, err) stdout, _, err := cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Parse(t, stdout).Query(`.[] | select(.library.name == "ILI9341_t3") | .library.version`).MustEqual(`"1.0"`) + requirejson.Parse(t, stdout).Query(`.installed_libraries.[] | select(.library.name == "ILI9341_t3") | .library.version`).MustEqual(`"1.0"`) _, _, err = cli.Run("lib", "install", "ILI9341_t3@1") require.NoError(t, err) _, _, err = cli.Run("lib", "install", "ILI9341_t3@1.0.0") @@ -565,7 +565,7 @@ func TestInstallLibraryWithDependencies(t *testing.T) { // Verifies libraries are not installed stdout, _, err := cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Empty(t, stdout) + requirejson.Query(t, stdout, `.installed_libraries | length`, `0`) // Install library _, _, err = cli.Run("lib", "install", "MD_Parola@3.5.5") @@ -574,7 +574,7 @@ func TestInstallLibraryWithDependencies(t *testing.T) { // Verifies library's dependencies are correctly installed stdout, _, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Query(t, stdout, `[ .[] | .library | .name ] | sort`, `["MD_MAX72XX","MD_Parola"]`) + requirejson.Query(t, stdout, `[.installed_libraries.[] | .library | .name ] | sort`, `["MD_MAX72XX","MD_Parola"]`) // Try upgrading with --no-overwrite (should fail) and without --no-overwrite (should succeed) _, _, err = cli.Run("lib", "install", "MD_Parola@3.6.1", "--no-overwrite") @@ -603,7 +603,7 @@ func TestInstallNoDeps(t *testing.T) { // Verifies libraries are not installed stdout, _, err := cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Empty(t, stdout) + requirejson.Query(t, stdout, `.installed_libraries | length`, `0`) // Install library skipping dependencies installation _, _, err = cli.Run("lib", "install", "MD_Parola@3.5.5", "--no-deps") @@ -612,7 +612,7 @@ func TestInstallNoDeps(t *testing.T) { // Verifies library's dependencies are not installed stdout, _, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Query(t, stdout, `.[] | .library | .name`, `"MD_Parola"`) + requirejson.Query(t, stdout, `.installed_libraries.[] | .library | .name`, `"MD_Parola"`) } func TestInstallWithGitUrl(t *testing.T) { @@ -712,7 +712,7 @@ func TestUninstallSpaces(t *testing.T) { require.NoError(t, err) stdout, _, err := cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 0) + requirejson.Query(t, stdout, `.installed_libraries | length`, `0`) } func TestLibOpsCaseInsensitive(t *testing.T) { @@ -740,7 +740,7 @@ func TestLibOpsCaseInsensitive(t *testing.T) { require.NoError(t, err) stdout, _, err := cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 0) + requirejson.Query(t, stdout, `.installed_libraries | length`, `0`) } func TestSearch(t *testing.T) { @@ -847,7 +847,7 @@ func TestLibListWithUpdatableFlag(t *testing.T) { stdout, stderr, err = cli.Run("lib", "list", "--updatable", "--format", "json") require.NoError(t, err) require.Empty(t, stderr) - requirejson.Empty(t, stdout) + requirejson.Query(t, stdout, `.installed_libraries | length`, `0`) // Install outdated library _, _, err = cli.Run("lib", "install", "ArduinoJson@6.11.0") @@ -877,11 +877,11 @@ func TestLibListWithUpdatableFlag(t *testing.T) { stdout, stderr, err = cli.Run("lib", "list", "--updatable", "--format", "json") require.NoError(t, err) require.Empty(t, stderr) - requirejson.Len(t, stdout, 1) + requirejson.Query(t, stdout, `.installed_libraries | length`, `1`) // be sure data contains the available version - requirejson.Query(t, stdout, `.[0] | .library | .version`, `"6.11.0"`) - requirejson.Query(t, stdout, `.[0] | .release | .version != "6.11.0"`, `true`) - requirejson.Query(t, stdout, `.[0] | .release | .version != ""`, `true`) + requirejson.Query(t, stdout, `.installed_libraries.[0] | .library | .version`, `"6.11.0"`) + requirejson.Query(t, stdout, `.installed_libraries.[0] | .release | .version != "6.11.0"`, `true`) + requirejson.Query(t, stdout, `.installed_libraries.[0] | .release | .version != ""`, `true`) } func TestInstallWithGitUrlFromCurrentDirectory(t *testing.T) { @@ -1041,8 +1041,8 @@ func TestLibExamples(t *testing.T) { stdout, _, err := cli.Run("lib", "examples", "Arduino_JSON", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - examples := requirejson.Parse(t, stdout).Query(".[0] | .examples").String() + requirejson.Query(t, stdout, `.examples | length`, `1`) + examples := requirejson.Parse(t, stdout).Query(".examples.[0] | .examples").String() examples = strings.ReplaceAll(examples, "\\\\", "\\") require.Contains(t, examples, cli.SketchbookDir().Join("libraries", "Arduino_JSON", "examples", "JSONArray").String()) require.Contains(t, examples, cli.SketchbookDir().Join("libraries", "Arduino_JSON", "examples", "JSONKitchenSink").String()) @@ -1061,8 +1061,8 @@ func TestLibExamplesWithPdeFile(t *testing.T) { stdout, _, err := cli.Run("lib", "examples", "Encoder", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - examples := requirejson.Parse(t, stdout).Query(".[0] | .examples").String() + requirejson.Query(t, stdout, `.examples | length`, `1`) + examples := requirejson.Parse(t, stdout).Query(".examples.[0] | .examples").String() examples = strings.ReplaceAll(examples, "\\\\", "\\") require.Contains(t, examples, cli.SketchbookDir().Join("libraries", "Encoder", "examples", "Basic").String()) require.Contains(t, examples, cli.SketchbookDir().Join("libraries", "Encoder", "examples", "NoInterrupts").String()) @@ -1082,10 +1082,10 @@ func TestLibExamplesWithCaseMismatch(t *testing.T) { stdout, _, err := cli.Run("lib", "examples", "WiFiManager", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - requirejson.Query(t, stdout, ".[0] | .examples | length", "14") + requirejson.Query(t, stdout, `.examples | length`, `1`) + requirejson.Query(t, stdout, ".examples.[0] | .examples | length", "14") - examples := requirejson.Parse(t, stdout).Query(".[0] | .examples").String() + examples := requirejson.Parse(t, stdout).Query(".examples.[0] | .examples").String() examples = strings.ReplaceAll(examples, "\\\\", "\\") examplesPath := cli.SketchbookDir().Join("libraries", "WiFiManager", "examples") // Verifies sketches with correct casing are listed @@ -1122,8 +1122,8 @@ func TestLibCommandsWithLibraryHavingInvalidVersion(t *testing.T) { // Verifies library is correctly returned stdout, _, err := cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - requirejson.Query(t, stdout, ".[0] | .library | .version", `"0.16.1"`) + requirejson.Query(t, stdout, `.installed_libraries | length`, `1`) + requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .version", `"0.16.1"`) // Changes the version of the currently installed library so that it's // invalid @@ -1133,8 +1133,8 @@ func TestLibCommandsWithLibraryHavingInvalidVersion(t *testing.T) { // Verifies version is now empty stdout, _, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - requirejson.Query(t, stdout, ".[0] | .library | .version", "null") + requirejson.Query(t, stdout, `.installed_libraries | length`, `1`) + requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .version", "null") // Upgrade library _, _, err = cli.Run("lib", "upgrade", "WiFi101") @@ -1143,8 +1143,8 @@ func TestLibCommandsWithLibraryHavingInvalidVersion(t *testing.T) { // Verifies library has been updated stdout, _, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) - requirejson.Query(t, stdout, ".[0] | .library | .version != \"\"", "true") + requirejson.Query(t, stdout, `.installed_libraries | length`, `1`) + requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .version != \"\"", "true") } func TestInstallZipLibWithMacosMetadata(t *testing.T) { @@ -1301,10 +1301,10 @@ func TestUpgradeDoesNotTryToUpgradeBundledCoreLibrariesInSketchbook(t *testing.T stdout, _, err := cli.Run("lib", "list", "--all", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 2) + requirejson.Query(t, stdout, `.installed_libraries | length`, `2`) // Verify both libraries have the same name - requirejson.Query(t, stdout, ".[0] | .library | .name", `"USBHost"`) - requirejson.Query(t, stdout, ".[1] | .library | .name", `"USBHost"`) + requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .name", `"USBHost"`) + requirejson.Query(t, stdout, ".installed_libraries.[1] | .library | .name", `"USBHost"`) stdout, _, err = cli.Run("lib", "upgrade") require.NoError(t, err) @@ -1333,10 +1333,10 @@ func TestUpgradeDoesNotTryToUpgradeBundledCoreLibraries(t *testing.T) { stdout, _, err := cli.Run("lib", "list", "--all", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 2) + requirejson.Query(t, stdout, `.installed_libraries | length`, `2`) // Verify both libraries have the same name - requirejson.Query(t, stdout, ".[0] | .library | .name", `"USBHost"`) - requirejson.Query(t, stdout, ".[1] | .library | .name", `"USBHost"`) + requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .name", `"USBHost"`) + requirejson.Query(t, stdout, ".installed_libraries.[1] | .library | .name", `"USBHost"`) stdout, _, err = cli.Run("lib", "upgrade") require.NoError(t, err) @@ -1581,8 +1581,8 @@ func TestLibBundlesWhenLibWithTheSameNameIsInstalledGlobally(t *testing.T) { stdout, _, err := cli.Run("lib", "list", "--all", "--fqbn", "arduino:samd:mkrzero", "USBHost", "--format", "json") require.NoError(t, err) j := requirejson.Parse(t, stdout) - j.Query(`.[0].library.name`).MustEqual(`"USBHost"`) - j.Query(`.[0].library.compatible_with."arduino:samd:mkrzero"`).MustEqual(`true`) + j.Query(`.installed_libraries.[0].library.name`).MustEqual(`"USBHost"`) + j.Query(`.installed_libraries.[0].library.compatible_with."arduino:samd:mkrzero"`).MustEqual(`true`) } _, _, err = cli.Run("lib", "install", "USBHost@1.0.5") require.NoError(t, err) @@ -1591,8 +1591,8 @@ func TestLibBundlesWhenLibWithTheSameNameIsInstalledGlobally(t *testing.T) { stdout, _, err := cli.Run("lib", "list", "--all", "--fqbn", "arduino:samd:mkrzero", "USBHost", "--format", "json") require.NoError(t, err) j := requirejson.Parse(t, stdout) - j.Query(`.[0].library.name`).MustEqual(`"USBHost"`) - j.Query(`.[0].library.compatible_with."arduino:samd:mkrzero"`).MustEqual(`true`) + j.Query(`.installed_libraries.[0].library.name`).MustEqual(`"USBHost"`) + j.Query(`.installed_libraries.[0].library.compatible_with."arduino:samd:mkrzero"`).MustEqual(`true`) } // See: https://github.com/arduino/arduino-cli/issues/1656 @@ -1605,8 +1605,8 @@ func TestLibBundlesWhenLibWithTheSameNameIsInstalledGlobally(t *testing.T) { require.NoError(t, err) stdout, _, err := cli.Run("lib", "examples", "--fqbn", "esp8266:esp8266:generic", "ArduinoOTA", "--format", "json") require.NoError(t, err) - requirejson.Parse(t, stdout).Query(`.[].library.examples[0]`).MustContain(`"BasicOTA"`) - requirejson.Parse(t, stdout).Query(`.[].library.examples[1]`).MustContain(`"OTALeds"`) + requirejson.Parse(t, stdout).Query(`.examples.[].library.examples[0]`).MustContain(`"BasicOTA"`) + requirejson.Parse(t, stdout).Query(`.examples.[].library.examples[1]`).MustContain(`"OTALeds"`) } } @@ -1624,11 +1624,11 @@ func TestLibListDoesNotIncludeEmptyLibraries(t *testing.T) { // Check that the output of lib list and lib examples is empty stdout, _, err := cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Empty(t, stdout) + requirejson.Query(t, stdout, `.installed_libraries | length`, `0`) stdout, _, err = cli.Run("lib", "examples", "--format", "json") require.NoError(t, err) - requirejson.Empty(t, stdout) + requirejson.Query(t, stdout, `.examples | length`, `0`) // Create a library with a header libWithHeader := cli.SketchbookDir().Join("libraries", "libWithHeader") @@ -1640,11 +1640,11 @@ func TestLibListDoesNotIncludeEmptyLibraries(t *testing.T) { // Check that the output of lib list and lib examples contains the library stdout, _, err = cli.Run("lib", "list", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) + requirejson.Query(t, stdout, `.installed_libraries | length`, `1`) stdout, _, err = cli.Run("lib", "examples", "--format", "json") require.NoError(t, err) - requirejson.Len(t, stdout, 1) + requirejson.Query(t, stdout, `.examples | length`, `1`) } func TestDependencyResolver(t *testing.T) { From d9f4fc68a91c65facb894fac103802f415c859a8 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 7 Nov 2023 15:01:51 +0100 Subject: [PATCH 12/14] update docs --- docs/UPGRADING.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/docs/UPGRADING.md b/docs/UPGRADING.md index 8b8ebcf7790..53eb83b0931 100644 --- a/docs/UPGRADING.md +++ b/docs/UPGRADING.md @@ -4,6 +4,56 @@ Here you can find a list of migration guides to handle breaking changes between ## 0.36.0 +### CLI changed JSON output for some `lib`, `core`, `config`, `board`, and `sketch` commands. + +- `arduino-cli lib list` results are wrapped under `installed_libraries` key + + ``` + { "installed_libraries": [ {...}, {...} ] } + ``` + +- `arduino-cli lib list` results are wrapped under `examples` key + + ``` + { "examples": [ {...}, {...} ] } + ``` + +- `arduino-cli core search` and `arduino-cli core list` results are wrapped under `platforms` key + + ``` + { "platforms": [ {...}, {...} ] } + ``` + +- `arduino-cli config init` now correctly returns a json containg the config path + + ``` + { "config_path": "/home/user/.arduino15/arduino-cli.yaml" } + ``` + +- `arduino-cli core dump` results are wrapped under `config` key + + ``` + { "config": { ... } } + ``` + +- `arduino-cli board search` results are wrapped under `boards` key + + ``` + { "boards": [ {...}, {...} ] } + ``` + +- `arduino-cli board list` results are wrapped under `detected_ports` key + + ``` + { "detected_ports": [ {...}, {...} ] } + ``` + +- `arduino-cli sketch new` now correctly returns a json containing the sketch path + + ``` + { "sketch_path": "/tmp/my_sketch" } + ``` + ### The gRPC `cc.arduino.cli.commands.v1.PlatformRelease` has been changed. We've added a new field called `compatible`. This field indicates if the current platform release is installable or not. From 0e1f3f22718f3dee65f2933ef726616d3194abbe Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Fri, 10 Nov 2023 14:49:10 +0100 Subject: [PATCH 13/14] fix post rebase --- internal/integrationtest/board/board_test.go | 187 +++++++++--------- .../board/hardware_loading_test.go | 134 +++++++------ 2 files changed, 166 insertions(+), 155 deletions(-) diff --git a/internal/integrationtest/board/board_test.go b/internal/integrationtest/board/board_test.go index 46581575ca7..f4759f5b861 100644 --- a/internal/integrationtest/board/board_test.go +++ b/internal/integrationtest/board/board_test.go @@ -86,7 +86,7 @@ func TestBoardList(t *testing.T) { require.NoError(t, err) // check is a valid json and contains a list of ports requirejson.Parse(t, stdout). - Query(`[ .[].port | select(.protocol == null or .protocol_label == null) ]`). + Query(`[ .detected_ports | .[].port | select(.protocol == null or .protocol_label == null) ]`). MustBeEmpty() } @@ -103,29 +103,30 @@ func TestBoardListMock(t *testing.T) { require.NoError(t, err) // check is a valid json and contains a list of ports - requirejson.Contains(t, stdout, `[ - { - "matching_boards": [ + requirejson.Contains(t, stdout, `{ + "detected_ports": [ { - "name": "Arduino Yún", - "fqbn": "arduino:avr:yun" + "matching_boards": [ + { + "name": "Arduino Yún", + "fqbn": "arduino:avr:yun" + } + ], + "port": { + "address": "/dev/ttyCIAO", + "label": "Mocked Serial port", + "protocol": "serial", + "protocol_label": "Serial", + "properties": { + "pid": "0x0041", + "serial": "123456", + "vid": "0x2341" + }, + "hardware_id": "123456" + } } - ], - "port": { - "address": "/dev/ttyCIAO", - "label": "Mocked Serial port", - "protocol": "serial", - "protocol_label": "Serial", - "properties": { - "pid": "0x0041", - "serial": "123456", - "vid": "0x2341" - }, - "hardware_id": "123456" - } - } - ] - `) + ] + }`) } func TestBoardListWithFqbnFilter(t *testing.T) { @@ -144,8 +145,7 @@ func TestBoardListWithFqbnFilter(t *testing.T) { // but it would succeed even if the filtering wasn't working properly // TODO: find a way to simulate connected boards or create a unit test which // mocks or initializes multiple components - requirejson.Parse(t, stdout). - MustBeEmpty() + requirejson.Query(t, stdout, `.boards | length`, `0`) } func TestBoardListWithFqbnFilterInvalid(t *testing.T) { @@ -434,14 +434,15 @@ func TestBoardSearch(t *testing.T) { // Verifies boards are returned requirejson.NotEmpty(t, stdout) // Verifies no board has FQBN set since no platform is installed - requirejson.Query(t, stdout, "[ .[] | select(.fqbn) ] | length", "0") - requirejson.Contains(t, stdout, `[ - {"name": "Arduino UNO"}, - {"name": "Arduino Yún"}, - {"name": "Arduino Zero"}, - {"name": "Arduino Nano 33 BLE"}, - {"name": "Arduino Portenta H7"} - ]`) + requirejson.Query(t, stdout, "[ .boards[] | select(.fqbn) ] | length", "0") + requirejson.Contains(t, stdout, `{ + "boards": [ + {"name": "Arduino UNO"}, + {"name": "Arduino Yún"}, + {"name": "Arduino Zero"}, + {"name": "Arduino Nano 33 BLE"}, + {"name": "Arduino Portenta H7"} + ]}`) // Search in non installed boards stdout, _, err = cli.Run("board", "search", "--format", "json", "nano", "33") @@ -449,11 +450,12 @@ func TestBoardSearch(t *testing.T) { // Verifies boards are returned requirejson.NotEmpty(t, stdout) // Verifies no board has FQBN set since no platform is installed - requirejson.Query(t, stdout, "[ .[] | select(.fqbn) ] | length", "0") - requirejson.Contains(t, stdout, `[ - {"name": "Arduino Nano 33 BLE"}, - {"name": "Arduino Nano 33 IoT"} - ]`) + requirejson.Query(t, stdout, "[ .boards[] | select(.fqbn) ] | length", "0") + requirejson.Contains(t, stdout, `{ + "boards": [ + {"name": "Arduino Nano 33 BLE"}, + {"name": "Arduino Nano 33 IoT"} + ]}`) // Install a platform from index _, _, err = cli.Run("core", "install", "arduino:avr@1.8.3") @@ -463,27 +465,29 @@ func TestBoardSearch(t *testing.T) { require.NoError(t, err) requirejson.NotEmpty(t, stdout) // Verifies some FQBNs are now returned after installing a platform - requirejson.Query(t, stdout, "[ .[] | select(.fqbn) ] | length", "26") - requirejson.Contains(t, stdout, `[ - { - "name": "Arduino Yún", - "fqbn": "arduino:avr:yun" - }, - { - "name": "Arduino Uno", - "fqbn": "arduino:avr:uno" - } - ]`) + requirejson.Query(t, stdout, "[ .boards[] | select(.fqbn) ] | length", "26") + requirejson.Contains(t, stdout, `{ + "boards": [ + { + "name": "Arduino Yún", + "fqbn": "arduino:avr:yun" + }, + { + "name": "Arduino Uno", + "fqbn": "arduino:avr:uno" + } + ]}`) stdout, _, err = cli.Run("board", "search", "--format", "json", "arduino", "yun") require.NoError(t, err) requirejson.NotEmpty(t, stdout) - requirejson.Contains(t, stdout, `[ - { - "name": "Arduino Yún", - "fqbn": "arduino:avr:yun" - } - ]`) + requirejson.Contains(t, stdout, `{ + "boards": [ + { + "name": "Arduino Yún", + "fqbn": "arduino:avr:yun" + } + ]}`) // Manually installs a core in sketchbooks hardware folder gitUrl := "https://github.com/arduino/ArduinoCore-samd.git" @@ -498,47 +502,50 @@ func TestBoardSearch(t *testing.T) { require.NoError(t, err) requirejson.NotEmpty(t, stdout) // Verifies some FQBNs are now returned after installing a platform - requirejson.Query(t, stdout, "[ .[] | select(.fqbn) ] | length", "43") - requirejson.Contains(t, stdout, `[ - { - "name": "Arduino Uno", - "fqbn": "arduino:avr:uno" - }, - { - "name": "Arduino Yún", - "fqbn": "arduino:avr:yun" - }, - { - "name": "Arduino MKR WiFi 1010", - "fqbn": "arduino-beta-development:samd:mkrwifi1010" - }, - { - "name": "Arduino MKR1000", - "fqbn": "arduino-beta-development:samd:mkr1000" - }, - { - "name": "Arduino MKRZERO", - "fqbn": "arduino-beta-development:samd:mkrzero" - }, - { - "name": "Arduino NANO 33 IoT", - "fqbn": "arduino-beta-development:samd:nano_33_iot" - }, - { - "fqbn": "arduino-beta-development:samd:arduino_zero_native" - } - ]`) + requirejson.Query(t, stdout, "[ .boards[] | select(.fqbn) ] | length", "43") + requirejson.Contains(t, stdout, `{ + "boards": + [ + { + "name": "Arduino Uno", + "fqbn": "arduino:avr:uno" + }, + { + "name": "Arduino Yún", + "fqbn": "arduino:avr:yun" + }, + { + "name": "Arduino MKR WiFi 1010", + "fqbn": "arduino-beta-development:samd:mkrwifi1010" + }, + { + "name": "Arduino MKR1000", + "fqbn": "arduino-beta-development:samd:mkr1000" + }, + { + "name": "Arduino MKRZERO", + "fqbn": "arduino-beta-development:samd:mkrzero" + }, + { + "name": "Arduino NANO 33 IoT", + "fqbn": "arduino-beta-development:samd:nano_33_iot" + }, + { + "fqbn": "arduino-beta-development:samd:arduino_zero_native" + } + ]}`) stdout, _, err = cli.Run("board", "search", "--format", "json", "mkr1000") require.NoError(t, err) requirejson.NotEmpty(t, stdout) // Verifies some FQBNs are now returned after installing a platform - requirejson.Contains(t, stdout, `[ - { - "name": "Arduino MKR1000", - "fqbn": "arduino-beta-development:samd:mkr1000" - } - ]`) + requirejson.Contains(t, stdout, `{ + "boards": [ + { + "name": "Arduino MKR1000", + "fqbn": "arduino-beta-development:samd:mkr1000" + } + ]}`) } func TestBoardAttach(t *testing.T) { diff --git a/internal/integrationtest/board/hardware_loading_test.go b/internal/integrationtest/board/hardware_loading_test.go index 9b4a3345c0c..a5daacdd71c 100644 --- a/internal/integrationtest/board/hardware_loading_test.go +++ b/internal/integrationtest/board/hardware_loading_test.go @@ -47,27 +47,28 @@ func TestHardwareLoading(t *testing.T) { require.NoError(t, err) jsonOut := requirejson.Parse(t, out) jsonOut.LengthMustEqualTo(1) - jsonOut.MustContain(`[ - { - "id": "arduino:avr", - "installed_version": "1.8.6", - "releases": { - "1.8.6": { - "name": "Arduino AVR Boards", - "boards": [ - { - "name": "Arduino Uno", - "fqbn": "arduino:avr:uno" - }, - { - "name": "Arduino Yún", - "fqbn": "arduino:avr:yun" - } - ] + jsonOut.MustContain(`{ + "platforms": [ + { + "id": "arduino:avr", + "installed_version": "1.8.6", + "releases": { + "1.8.6": { + "name": "Arduino AVR Boards", + "boards": [ + { + "name": "Arduino Uno", + "fqbn": "arduino:avr:uno" + }, + { + "name": "Arduino Yún", + "fqbn": "arduino:avr:yun" + } + ] + } } } - } - ]`) + ]}`) } { @@ -154,60 +155,63 @@ func TestHardwareLoading(t *testing.T) { out, _, err := cli.Run("core", "list", "--format", "json") require.NoError(t, err) jsonOut := requirejson.Parse(t, out) - jsonOut.LengthMustEqualTo(3) - jsonOut.MustContain(`[ - { - "id": "arduino:avr", - "installed_version": "1.8.6", - "releases": { - "1.8.6": { - "name": "Arduino AVR Boards", - "boards": [ - { - "name": "Arduino Uno", - "fqbn": "arduino:avr:uno" - }, - { - "name": "Arduino Yún", - "fqbn": "arduino:avr:yun" - } - ] + jsonOut.Query(`.platforms | length`).LengthMustEqualTo(3) + jsonOut.MustContain(`{ + "platforms": [ + { + "id": "arduino:avr", + "installed_version": "1.8.6", + "releases": { + "1.8.6": { + "name": "Arduino AVR Boards", + "boards": [ + { + "name": "Arduino Uno", + "fqbn": "arduino:avr:uno" + }, + { + "name": "Arduino Yún", + "fqbn": "arduino:avr:yun" + } + ] + } } } - } - ]`) - jsonOut.MustContain(`[ - { - "id": "my_avr_platform:avr", - "installed_version": "9.9.9", - "releases": { - "9.9.9": { - "name": "My AVR Boards", - "boards": [ - { - "name": "Arduino Yún", - "fqbn": "my_avr_platform:avr:custom_yun" - } - ] - } - }, - "manually_installed": true - } - ]`) + ]}`) + jsonOut.MustContain(`{ + "platforms": [ + { + "id": "my_avr_platform:avr", + "installed_version": "9.9.9", + "releases": { + "9.9.9": { + "name": "My AVR Boards", + "boards": [ + { + "name": "Arduino Yún", + "fqbn": "my_avr_platform:avr:custom_yun" + } + ] + } + }, + "manually_installed": true + } + ]}`) // require.False(t, myAVRPlatformAvrArch.Properties.ContainsKey("preproc.includes.flags")) if runtime.GOOS != "windows" { - jsonOut.MustContain(`[ - { - "id": "my_symlinked_avr_platform:avr", - "manually_installed": true, - "releases": { - "9.9.9": { + jsonOut.MustContain(`{ + "platforms": [ + { + "id": "my_symlinked_avr_platform:avr", + "manually_installed": true, + "releases": { + "9.9.9": { + } } } - } - ]`) + ]}`) } } From 72a06b48653405ae0b00f2e1c993af1089b07862 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 10 Nov 2023 16:13:11 +0100 Subject: [PATCH 14/14] Fixed docs typos --- docs/UPGRADING.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/UPGRADING.md b/docs/UPGRADING.md index 53eb83b0931..30cf55a9e42 100644 --- a/docs/UPGRADING.md +++ b/docs/UPGRADING.md @@ -6,49 +6,50 @@ Here you can find a list of migration guides to handle breaking changes between ### CLI changed JSON output for some `lib`, `core`, `config`, `board`, and `sketch` commands. -- `arduino-cli lib list` results are wrapped under `installed_libraries` key +- `arduino-cli lib list --format json` results are now wrapped under `installed_libraries` key ``` { "installed_libraries": [ {...}, {...} ] } ``` -- `arduino-cli lib list` results are wrapped under `examples` key +- `arduino-cli lib examples --format json` results are now wrapped under `examples` key ``` { "examples": [ {...}, {...} ] } ``` -- `arduino-cli core search` and `arduino-cli core list` results are wrapped under `platforms` key +- `arduino-cli core search --format json` and `arduino-cli core list --format json` results are now wrapped under + `platforms` key ``` { "platforms": [ {...}, {...} ] } ``` -- `arduino-cli config init` now correctly returns a json containg the config path +- `arduino-cli config init --format json` now correctly returns a json object containg the config path ``` { "config_path": "/home/user/.arduino15/arduino-cli.yaml" } ``` -- `arduino-cli core dump` results are wrapped under `config` key +- `arduino-cli config dump --format json` results are now wrapped under `config` key ``` { "config": { ... } } ``` -- `arduino-cli board search` results are wrapped under `boards` key +- `arduino-cli board search --format json` results are now wrapped under `boards` key ``` { "boards": [ {...}, {...} ] } ``` -- `arduino-cli board list` results are wrapped under `detected_ports` key +- `arduino-cli board list --format json` results are now wrapped under `detected_ports` key ``` { "detected_ports": [ {...}, {...} ] } ``` -- `arduino-cli sketch new` now correctly returns a json containing the sketch path +- `arduino-cli sketch new` now correctly returns a json object containing the sketch path ``` { "sketch_path": "/tmp/my_sketch" }