Skip to content

Commit 960c210

Browse files
authored
lib deps command output sorted alphabetically (#1934)
* Change lib deps CLI command output to sorted alphabetically * Fix plain text output not sorted correctly * Simplify deps sorting * Reworked test to prevent future breakages
1 parent ecce29a commit 960c210

File tree

3 files changed

+79
-1
lines changed

3 files changed

+79
-1
lines changed

cli/lib/check_deps.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"context"
2020
"fmt"
2121
"os"
22+
"sort"
2223

2324
"github.com/arduino/arduino-cli/cli/arguments"
2425
"github.com/arduino/arduino-cli/cli/errorcodes"
@@ -81,7 +82,17 @@ func (dr checkDepResult) Data() interface{} {
8182

8283
func (dr checkDepResult) String() string {
8384
res := ""
84-
for _, dep := range dr.deps.GetDependencies() {
85+
deps := dr.deps.Dependencies
86+
87+
// Sort depedencies alphabetically and then puts installed ones on top
88+
sort.Slice(deps, func(i, j int) bool {
89+
return deps[i].Name < deps[j].Name
90+
})
91+
sort.SliceStable(deps, func(i, j int) bool {
92+
return deps[i].VersionInstalled != "" && deps[j].VersionInstalled == ""
93+
})
94+
95+
for _, dep := range deps {
8596
res += outputDep(dep)
8697
}
8798
return res

commands/lib/resolve_deps.go

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package lib
1818
import (
1919
"context"
2020
"errors"
21+
"sort"
2122

2223
"github.com/arduino/arduino-cli/arduino"
2324
"github.com/arduino/arduino-cli/arduino/libraries"
@@ -74,5 +75,8 @@ func LibraryResolveDependencies(ctx context.Context, req *rpc.LibraryResolveDepe
7475
VersionInstalled: installed,
7576
})
7677
}
78+
sort.Slice(res, func(i, j int) bool {
79+
return res[i].Name < res[j].Name
80+
})
7781
return &rpc.LibraryResolveDependenciesResponse{Dependencies: res}, nil
7882
}

internal/integrationtest/lib/lib_test.go

+63
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package lib_test
1717

1818
import (
19+
"encoding/json"
20+
"strings"
1921
"testing"
2022

2123
"github.com/arduino/arduino-cli/internal/integrationtest"
@@ -136,3 +138,64 @@ func TestDuplicateLibInstallDetection(t *testing.T) {
136138
require.Error(t, err)
137139
require.Contains(t, string(stdErr), "The library ArduinoOTA has multiple installations")
138140
}
141+
142+
func TestLibDepsOutput(t *testing.T) {
143+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
144+
defer env.CleanUp()
145+
146+
// Updates index for cores and libraries
147+
_, _, err := cli.Run("core", "update-index")
148+
require.NoError(t, err)
149+
_, _, err = cli.Run("lib", "update-index")
150+
require.NoError(t, err)
151+
152+
// Install some libraries that are dependencies of another library
153+
_, _, err = cli.Run("lib", "install", "Arduino_DebugUtils")
154+
require.NoError(t, err)
155+
_, _, err = cli.Run("lib", "install", "MKRGSM")
156+
require.NoError(t, err)
157+
_, _, err = cli.Run("lib", "install", "MKRNB")
158+
require.NoError(t, err)
159+
_, _, err = cli.Run("lib", "install", "WiFiNINA")
160+
require.NoError(t, err)
161+
162+
stdOut, _, err := cli.Run("lib", "deps", "Arduino_ConnectionHandler@0.6.6", "--no-color")
163+
require.NoError(t, err)
164+
lines := strings.Split(strings.TrimSpace(string(stdOut)), "\n")
165+
require.Len(t, lines, 7)
166+
require.Regexp(t, `^✓ Arduino_DebugUtils \d+\.\d+\.\d+ is already installed\.$`, lines[0])
167+
require.Regexp(t, `^✓ MKRGSM \d+\.\d+\.\d+ is already installed\.$`, lines[1])
168+
require.Regexp(t, `^✓ MKRNB \d+\.\d+\.\d+ is already installed\.$`, lines[2])
169+
require.Regexp(t, `^✓ WiFiNINA \d+\.\d+\.\d+ is already installed\.$`, lines[3])
170+
require.Regexp(t, `^✕ Arduino_ConnectionHandler \d+\.\d+\.\d+ must be installed\.$`, lines[4])
171+
require.Regexp(t, `^✕ MKRWAN \d+\.\d+\.\d+ must be installed\.$`, lines[5])
172+
require.Regexp(t, `^✕ WiFi101 \d+\.\d+\.\d+ must be installed\.$`, lines[6])
173+
174+
stdOut, _, err = cli.Run("lib", "deps", "Arduino_ConnectionHandler@0.6.6", "--format", "json")
175+
require.NoError(t, err)
176+
177+
var jsonDeps struct {
178+
Dependencies []struct {
179+
Name string `json:"name"`
180+
VersionRequired string `json:"version_required"`
181+
VersionInstalled string `json:"version_installed"`
182+
} `json:"dependencies"`
183+
}
184+
err = json.Unmarshal(stdOut, &jsonDeps)
185+
require.NoError(t, err)
186+
187+
require.Equal(t, "Arduino_ConnectionHandler", jsonDeps.Dependencies[0].Name)
188+
require.Empty(t, jsonDeps.Dependencies[0].VersionInstalled)
189+
require.Equal(t, "Arduino_DebugUtils", jsonDeps.Dependencies[1].Name)
190+
require.Equal(t, jsonDeps.Dependencies[1].VersionInstalled, jsonDeps.Dependencies[1].VersionRequired)
191+
require.Equal(t, "MKRGSM", jsonDeps.Dependencies[2].Name)
192+
require.Equal(t, jsonDeps.Dependencies[2].VersionInstalled, jsonDeps.Dependencies[2].VersionRequired)
193+
require.Equal(t, "MKRNB", jsonDeps.Dependencies[3].Name)
194+
require.Equal(t, jsonDeps.Dependencies[3].VersionInstalled, jsonDeps.Dependencies[3].VersionRequired)
195+
require.Equal(t, "MKRWAN", jsonDeps.Dependencies[4].Name)
196+
require.Empty(t, jsonDeps.Dependencies[4].VersionInstalled)
197+
require.Equal(t, "WiFi101", jsonDeps.Dependencies[5].Name)
198+
require.Empty(t, jsonDeps.Dependencies[5].VersionInstalled)
199+
require.Equal(t, "WiFiNINA", jsonDeps.Dependencies[6].Name)
200+
require.Equal(t, jsonDeps.Dependencies[6].VersionInstalled, jsonDeps.Dependencies[6].VersionRequired)
201+
}

0 commit comments

Comments
 (0)