Skip to content

Commit a60da87

Browse files
committed
Added globals.ParseLibraryReferenceArgs method
1 parent 4c32595 commit a60da87

File tree

5 files changed

+70
-14
lines changed

5 files changed

+70
-14
lines changed

cli/globals/args.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,45 @@ func ParseReferenceArg(arg string, parseArch bool) (*ReferenceArg, error) {
7272

7373
return ret, nil
7474
}
75+
76+
// LibraryReferenceArg is a command line argument that reference a library.
77+
type LibraryReferenceArg struct {
78+
Name string
79+
Version string
80+
}
81+
82+
func (r *LibraryReferenceArg) String() string {
83+
if r.Version != "" {
84+
return r.Name + "@" + r.Version
85+
}
86+
return r.Name
87+
}
88+
89+
// ParseLibraryReferenceArg parse a command line argument that reference a
90+
// library in the form "LibName@Version" or just "LibName".
91+
func ParseLibraryReferenceArg(arg string) (*LibraryReferenceArg, error) {
92+
tokens := strings.SplitN(arg, "@", 2)
93+
94+
ret := &LibraryReferenceArg{}
95+
// TODO: check library Name constraints
96+
// TODO: check library Version constraints
97+
ret.Name = tokens[0]
98+
if len(tokens) > 1 {
99+
ret.Version = tokens[1]
100+
}
101+
return ret, nil
102+
}
103+
104+
// ParseLibraryReferenceArgs is a convenient wrapper that operates on a slice of strings and
105+
// calls ParseLibraryReferenceArg for each of them. It returns at the first invalid argument.
106+
func ParseLibraryReferenceArgs(args []string) ([]*LibraryReferenceArg, error) {
107+
ret := []*LibraryReferenceArg{}
108+
for _, arg := range args {
109+
if reference, err := ParseLibraryReferenceArg(arg); err == nil {
110+
ret = append(ret, reference)
111+
} else {
112+
return nil, err
113+
}
114+
}
115+
return ret, nil
116+
}

cli/globals/args_test.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
"github.com/arduino/arduino-cli/cli/globals"
2424
"github.com/stretchr/testify/assert"
25+
"github.com/stretchr/testify/require"
2526
)
2627

2728
var goodCores = []struct {
@@ -35,11 +36,11 @@ var goodCores = []struct {
3536

3637
var goodLibs = []struct {
3738
in string
38-
expected *globals.ReferenceArg
39+
expected *globals.LibraryReferenceArg
3940
}{
40-
{"mylib", &globals.ReferenceArg{"mylib", "", ""}},
41-
{"mylib@1.0", &globals.ReferenceArg{"mylib", "", "1.0"}},
42-
{"mylib@", &globals.ReferenceArg{"mylib", "", ""}},
41+
{"mylib", &globals.LibraryReferenceArg{"mylib", ""}},
42+
{"mylib@1.0", &globals.LibraryReferenceArg{"mylib", "1.0"}},
43+
{"mylib@", &globals.LibraryReferenceArg{"mylib", ""}},
4344
}
4445

4546
var badCores = []struct {
@@ -51,6 +52,12 @@ var badCores = []struct {
5152
{"arduino:avr:avr@1.6.20", nil},
5253
}
5354

55+
func TestArgsStringify(t *testing.T) {
56+
for _, lib := range goodLibs {
57+
require.Equal(t, lib.in, lib.expected.String())
58+
}
59+
}
60+
5461
func TestParseReferenceArgCores(t *testing.T) {
5562
for _, tt := range goodCores {
5663
actual, err := globals.ParseReferenceArg(tt.in, true)
@@ -73,15 +80,22 @@ func TestParseReferenceArgCores(t *testing.T) {
7380

7481
func TestParseReferenceArgLibs(t *testing.T) {
7582
for _, tt := range goodLibs {
76-
actual, err := globals.ParseReferenceArg(tt.in, false)
83+
actual, err := globals.ParseLibraryReferenceArg(tt.in)
7784
assert.Nil(t, err)
7885
assert.Equal(t, tt.expected, actual)
7986
}
87+
}
8088

81-
// good libs are bad when requiring Arch to be present
89+
func TestParseLibraryReferenceArgs(t *testing.T) {
90+
args := []string{}
8291
for _, tt := range goodLibs {
83-
_, err := globals.ParseReferenceArg(tt.in, true)
84-
assert.NotNil(t, err)
92+
args = append(args, tt.in)
93+
}
94+
refs, err := globals.ParseLibraryReferenceArgs(args)
95+
require.Nil(t, err)
96+
require.Len(t, refs, len(goodLibs))
97+
for i, tt := range goodLibs {
98+
assert.Equal(t, tt.expected, refs[i])
8599
}
86100
}
87101

cli/lib/download.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func initDownloadCommand() *cobra.Command {
4747

4848
func runDownloadCommand(cmd *cobra.Command, args []string) {
4949
instance := instance.CreateInstaceIgnorePlatformIndexErrors()
50-
refs, err := globals.ParseReferenceArgs(args, false)
50+
refs, err := globals.ParseLibraryReferenceArgs(args)
5151
if err != nil {
5252
feedback.Errorf("Invalid argument passed: %v", err)
5353
os.Exit(errorcodes.ErrBadArgument)
@@ -56,7 +56,7 @@ func runDownloadCommand(cmd *cobra.Command, args []string) {
5656
for _, library := range refs {
5757
libraryDownloadReq := &rpc.LibraryDownloadReq{
5858
Instance: instance,
59-
Name: library.PackageName,
59+
Name: library.Name,
6060
Version: library.Version,
6161
}
6262
_, err := lib.LibraryDownload(context.Background(), libraryDownloadReq, output.ProgressBar(),

cli/lib/install.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func initInstallCommand() *cobra.Command {
4747

4848
func runInstallCommand(cmd *cobra.Command, args []string) {
4949
instance := instance.CreateInstaceIgnorePlatformIndexErrors()
50-
refs, err := globals.ParseReferenceArgs(args, false)
50+
refs, err := globals.ParseLibraryReferenceArgs(args)
5151
if err != nil {
5252
feedback.Errorf("Arguments error: %v", err)
5353
os.Exit(errorcodes.ErrBadArgument)
@@ -56,7 +56,7 @@ func runInstallCommand(cmd *cobra.Command, args []string) {
5656
for _, library := range refs {
5757
libraryInstallReq := &rpc.LibraryInstallReq{
5858
Instance: instance,
59-
Name: library.PackageName,
59+
Name: library.Name,
6060
Version: library.Version,
6161
}
6262
err := lib.LibraryInstall(context.Background(), libraryInstallReq, output.ProgressBar(),

cli/lib/uninstall.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func runUninstallCommand(cmd *cobra.Command, args []string) {
4848
logrus.Info("Executing `arduino lib uninstall`")
4949

5050
instance := instance.CreateInstaceIgnorePlatformIndexErrors()
51-
refs, err := globals.ParseReferenceArgs(args, false)
51+
refs, err := globals.ParseLibraryReferenceArgs(args)
5252
if err != nil {
5353
feedback.Errorf("Invalid argument passed: %v", err)
5454
os.Exit(errorcodes.ErrBadArgument)
@@ -57,7 +57,7 @@ func runUninstallCommand(cmd *cobra.Command, args []string) {
5757
for _, library := range refs {
5858
err := lib.LibraryUninstall(context.Background(), &rpc.LibraryUninstallReq{
5959
Instance: instance,
60-
Name: library.PackageName,
60+
Name: library.Name,
6161
Version: library.Version,
6262
}, output.TaskProgress())
6363
if err != nil {

0 commit comments

Comments
 (0)