Skip to content

Commit d4a03de

Browse files
committed
Improved library search
1 parent 6c3755c commit d4a03de

File tree

4 files changed

+513184
-18
lines changed

4 files changed

+513184
-18
lines changed

Diff for: commands/lib/search.go

+30-5
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ package lib
1717

1818
import (
1919
"context"
20+
"strings"
2021

2122
"github.com/arduino/arduino-cli/arduino"
2223
"github.com/arduino/arduino-cli/arduino/libraries/librariesindex"
2324
"github.com/arduino/arduino-cli/arduino/libraries/librariesmanager"
24-
"github.com/arduino/arduino-cli/arduino/utils"
2525
"github.com/arduino/arduino-cli/commands"
2626
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
2727
semver "go.bug.st/relaxed-semver"
@@ -40,12 +40,37 @@ func searchLibrary(req *rpc.LibrarySearchRequest, lm *librariesmanager.Libraries
4040
res := []*rpc.SearchedLibrary{}
4141
status := rpc.LibrarySearchStatus_LIBRARY_SEARCH_STATUS_SUCCESS
4242

43+
// Split on anything but 0-9, a-z or :
44+
queryTerms := strings.FieldsFunc(strings.ToLower(req.GetQuery()), func(r rune) bool {
45+
return !((r >= '0' && r <= '9') || (r >= 'a' && r <= 'z') || r == ':')
46+
})
47+
4348
for _, lib := range lm.Index.Libraries {
44-
toTest := []string{lib.Name, lib.Latest.Paragraph, lib.Latest.Sentence}
45-
if !utils.MatchAny(req.GetQuery(), toTest) {
46-
continue
49+
matchTerm := func(x string) bool {
50+
if strings.Contains(strings.ToLower(lib.Name), x) ||
51+
strings.Contains(strings.ToLower(lib.Latest.Paragraph), x) ||
52+
strings.Contains(strings.ToLower(lib.Latest.Sentence), x) ||
53+
strings.Contains(strings.ToLower(lib.Latest.Author), x) {
54+
return true
55+
}
56+
for _, include := range lib.Latest.ProvidesIncludes {
57+
if strings.Contains(strings.ToLower(include), x) {
58+
return true
59+
}
60+
}
61+
return false
62+
}
63+
match := func() bool {
64+
for _, term := range queryTerms {
65+
if !matchTerm(term) {
66+
return false
67+
}
68+
}
69+
return true
70+
}
71+
if match() {
72+
res = append(res, indexLibraryToRPCSearchLibrary(lib))
4773
}
48-
res = append(res, indexLibraryToRPCSearchLibrary(lib))
4974
}
5075

5176
return &rpc.LibrarySearchResponse{Libraries: res, Status: status}

Diff for: commands/lib/search_test.go

+41-13
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
package lib
22

33
import (
4+
"sort"
45
"strings"
56
"testing"
67

78
"github.com/arduino/arduino-cli/arduino/libraries/librariesmanager"
89
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
910
paths "github.com/arduino/go-paths-helper"
1011
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
1113
)
1214

13-
var customIndexPath = paths.New("testdata")
15+
var customIndexPath = paths.New("testdata", "test1")
16+
var fullIndexPath = paths.New("testdata", "full")
1417

1518
func TestSearchLibrary(t *testing.T) {
1619
lm := librariesmanager.NewLibraryManager(customIndexPath, nil)
1720
lm.LoadIndex()
1821

19-
req := &rpc.LibrarySearchRequest{
20-
Instance: &rpc.Instance{Id: 1},
21-
Query: "test",
22-
}
23-
24-
resp := searchLibrary(req, lm)
22+
resp := searchLibrary(&rpc.LibrarySearchRequest{Query: "test"}, lm)
2523
assert := assert.New(t)
2624
assert.Equal(resp.GetStatus(), rpc.LibrarySearchStatus_LIBRARY_SEARCH_STATUS_SUCCESS)
2725
assert.Equal(len(resp.GetLibraries()), 2)
@@ -33,12 +31,7 @@ func TestSearchLibrarySimilar(t *testing.T) {
3331
lm := librariesmanager.NewLibraryManager(customIndexPath, nil)
3432
lm.LoadIndex()
3533

36-
req := &rpc.LibrarySearchRequest{
37-
Instance: &rpc.Instance{Id: 1},
38-
Query: "arduino",
39-
}
40-
41-
resp := searchLibrary(req, lm)
34+
resp := searchLibrary(&rpc.LibrarySearchRequest{Query: "arduino"}, lm)
4235
assert := assert.New(t)
4336
assert.Equal(resp.GetStatus(), rpc.LibrarySearchStatus_LIBRARY_SEARCH_STATUS_SUCCESS)
4437
assert.Equal(len(resp.GetLibraries()), 2)
@@ -49,3 +42,38 @@ func TestSearchLibrarySimilar(t *testing.T) {
4942
assert.Contains(libs, "ArduinoTestPackage")
5043
assert.Contains(libs, "Arduino")
5144
}
45+
46+
func TestSearchLibraryFields(t *testing.T) {
47+
lm := librariesmanager.NewLibraryManager(fullIndexPath, nil)
48+
lm.LoadIndex()
49+
50+
query := func(q string) []string {
51+
libs := []string{}
52+
for _, lib := range searchLibrary(&rpc.LibrarySearchRequest{Query: q}, lm).Libraries {
53+
libs = append(libs, lib.Name)
54+
}
55+
sort.Strings(libs)
56+
return libs
57+
}
58+
59+
res := query("SparkFun_u-blox_GNSS")
60+
require.Len(t, res, 3)
61+
require.Equal(t, "SparkFun u-blox Arduino Library", res[0])
62+
require.Equal(t, "SparkFun u-blox GNSS Arduino Library", res[1])
63+
require.Equal(t, "SparkFun u-blox SARA-R5 Arduino Library", res[2])
64+
65+
res = query("SparkFun u-blox GNSS")
66+
require.Len(t, res, 3)
67+
require.Equal(t, "SparkFun u-blox Arduino Library", res[0])
68+
require.Equal(t, "SparkFun u-blox GNSS Arduino Library", res[1])
69+
require.Equal(t, "SparkFun u-blox SARA-R5 Arduino Library", res[2])
70+
71+
res = query("painlessMesh")
72+
require.Len(t, res, 1)
73+
require.Equal(t, "Painless Mesh", res[0])
74+
75+
res = query("cristian maglie")
76+
require.Len(t, res, 2)
77+
require.Equal(t, "Arduino_ConnectionHandler", res[0])
78+
require.Equal(t, "FlashStorage_SAMD", res[1])
79+
}

0 commit comments

Comments
 (0)