Skip to content

Commit 38a80a6

Browse files
authored
Show similar library names in lib search (#598)
* Show similar library names in lib search * make similarity threshold for lib search a package variable * Add library search tests * Redo name asserts in TestSearchLibrary Just check that the library names have "Test" in them instead of checking the names at each index, which won't always be the same
1 parent e8bb327 commit 38a80a6

File tree

8 files changed

+152
-13
lines changed

8 files changed

+152
-13
lines changed

Diff for: cli/lib/search.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ func (res result) Data() interface{} {
8888

8989
names := []LibName{}
9090
results := res.results.GetLibraries()
91-
for _, lsr := range results {
92-
names = append(names, LibName{lsr.Name})
91+
for _, lib := range results {
92+
names = append(names, LibName{lib.Name})
9393
}
9494

9595
return NamesOnly{
@@ -113,9 +113,18 @@ func (res result) String() string {
113113

114114
var out strings.Builder
115115

116+
if res.results.GetStatus() == rpc.LibrarySearchStatus_failed {
117+
out.WriteString("No libraries matching your search.\nDid you mean...\n")
118+
}
119+
116120
for _, lib := range results {
117-
out.WriteString(fmt.Sprintf("Name: \"%s\"\n", lib.Name))
118-
if res.namesOnly {
121+
if res.results.GetStatus() == rpc.LibrarySearchStatus_success {
122+
out.WriteString(fmt.Sprintf("Name: \"%s\"\n", lib.Name))
123+
if res.namesOnly {
124+
continue
125+
}
126+
} else {
127+
out.WriteString(fmt.Sprintf("%s\n", lib.Name))
119128
continue
120129
}
121130

Diff for: commands/lib/search.go

+23-3
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,28 @@ import (
2121
"strings"
2222

2323
"github.com/arduino/arduino-cli/arduino/libraries/librariesindex"
24+
"github.com/arduino/arduino-cli/arduino/libraries/librariesmanager"
2425
"github.com/arduino/arduino-cli/commands"
2526
rpc "github.com/arduino/arduino-cli/rpc/commands"
27+
"github.com/imjasonmiller/godice"
2628
semver "go.bug.st/relaxed-semver"
2729
)
2830

31+
var similarityThreshold = 0.7
32+
2933
// LibrarySearch FIXMEDOC
3034
func LibrarySearch(ctx context.Context, req *rpc.LibrarySearchReq) (*rpc.LibrarySearchResp, error) {
3135
lm := commands.GetLibraryManager(req.GetInstance().GetId())
3236
if lm == nil {
3337
return nil, errors.New("invalid instance")
3438
}
3539

40+
return searchLibrary(req, lm)
41+
}
42+
43+
func searchLibrary(req *rpc.LibrarySearchReq, lm *librariesmanager.LibrariesManager) (*rpc.LibrarySearchResp, error) {
3644
res := []*rpc.SearchedLibrary{}
45+
status := rpc.LibrarySearchStatus_success
3746

3847
for _, lib := range lm.Index.Libraries {
3948
qry := strings.ToLower(req.GetQuery())
@@ -46,16 +55,27 @@ func LibrarySearch(ctx context.Context, req *rpc.LibrarySearchReq) (*rpc.Library
4655
}
4756
latest := GetLibraryParameters(lib.Latest)
4857

49-
searchedlib := &rpc.SearchedLibrary{
58+
searchedLib := &rpc.SearchedLibrary{
5059
Name: lib.Name,
5160
Releases: releases,
5261
Latest: latest,
5362
}
54-
res = append(res, searchedlib)
63+
res = append(res, searchedLib)
64+
}
65+
}
66+
67+
if len(res) == 0 {
68+
status = rpc.LibrarySearchStatus_failed
69+
for _, lib := range lm.Index.Libraries {
70+
if godice.CompareString(req.GetQuery(), lib.Name) > similarityThreshold {
71+
res = append(res, &rpc.SearchedLibrary{
72+
Name: lib.Name,
73+
})
74+
}
5575
}
5676
}
5777

58-
return &rpc.LibrarySearchResp{Libraries: res}, nil
78+
return &rpc.LibrarySearchResp{Libraries: res, Status: status}, nil
5979
}
6080

6181
// GetLibraryParameters FIXMEDOC

Diff for: commands/lib/search_test.go

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package lib
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/arduino/arduino-cli/arduino/libraries/librariesmanager"
8+
rpc "github.com/arduino/arduino-cli/rpc/commands"
9+
paths "github.com/arduino/go-paths-helper"
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
var customIndexPath = paths.New("testdata")
14+
15+
func TestSearchLibrary(t *testing.T) {
16+
lm := librariesmanager.NewLibraryManager(customIndexPath, nil)
17+
lm.LoadIndex()
18+
19+
req := &rpc.LibrarySearchReq{
20+
Instance: &rpc.Instance{Id: 1},
21+
Query: "test",
22+
}
23+
24+
resp, err := searchLibrary(req, lm)
25+
if err != nil {
26+
t.Fatal(err)
27+
}
28+
29+
assert := assert.New(t)
30+
assert.Equal(resp.GetStatus(), rpc.LibrarySearchStatus_success)
31+
assert.Equal(len(resp.GetLibraries()), 2)
32+
assert.True(strings.Contains(resp.GetLibraries()[0].Name, "Test"))
33+
assert.True(strings.Contains(resp.GetLibraries()[1].Name, "Test"))
34+
}
35+
36+
func TestSearchLibrarySimilar(t *testing.T) {
37+
lm := librariesmanager.NewLibraryManager(customIndexPath, nil)
38+
lm.LoadIndex()
39+
40+
req := &rpc.LibrarySearchReq{
41+
Instance: &rpc.Instance{Id: 1},
42+
Query: "ardino",
43+
}
44+
45+
resp, err := searchLibrary(req, lm)
46+
if err != nil {
47+
t.Fatal(err)
48+
}
49+
50+
assert := assert.New(t)
51+
assert.Equal(resp.GetStatus(), rpc.LibrarySearchStatus_failed)
52+
assert.Equal(len(resp.GetLibraries()), 1)
53+
assert.Equal(resp.GetLibraries()[0].Name, "Arduino")
54+
}

Diff for: commands/lib/testdata/library_index.json

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"libraries": [
3+
{
4+
"name": "ArduinoTestPackage"
5+
},
6+
{
7+
"name": "Arduino"
8+
},
9+
{
10+
"name": "Test"
11+
}
12+
]
13+
}

Diff for: go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ require (
1919
github.com/gofrs/uuid v3.2.0+incompatible
2020
github.com/golang/protobuf v1.3.3
2121
github.com/h2non/filetype v1.0.8 // indirect
22+
github.com/imjasonmiller/godice v0.1.2
2223
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 // indirect
2324
github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 // indirect
2425
github.com/juju/testing v0.0.0-20190429233213-dfc56b8c09fc // indirect

Diff for: go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ github.com/h2non/filetype v1.0.8 h1:le8gpf+FQA0/DlDABbtisA1KiTS0Xi+YSC/E8yY3Y14=
8585
github.com/h2non/filetype v1.0.8/go.mod h1:isekKqOuhMj+s/7r3rIeTErIRy4Rub5uBWHfvMusLMU=
8686
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
8787
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
88+
github.com/imjasonmiller/godice v0.1.2 h1:T1/sW/HoDzFeuwzOOuQjmeMELz9CzZ53I2CnD+08zD4=
89+
github.com/imjasonmiller/godice v0.1.2/go.mod h1:8cTkdnVI+NglU2d6sv+ilYcNaJ5VSTBwvMbFULJd/QQ=
8890
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
8991
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
9092
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=

Diff for: rpc/commands/lib.pb.go

+40-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: rpc/commands/lib.proto

+6
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,14 @@ message LibrarySearchReq {
8282
string query = 2;
8383
}
8484

85+
enum LibrarySearchStatus {
86+
failed = 0;
87+
success = 1;
88+
}
89+
8590
message LibrarySearchResp {
8691
repeated SearchedLibrary libraries = 1;
92+
LibrarySearchStatus status = 2;
8793
}
8894

8995
message SearchedLibrary {

0 commit comments

Comments
 (0)