Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 99c87b2

Browse files
committed
Improved library search
1 parent 6c3755c commit 99c87b2

File tree

4 files changed

+643333
-18
lines changed

4 files changed

+643333
-18
lines changed

‎commands/lib/search.go‎

Lines changed: 30 additions & 5 deletions
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}

‎commands/lib/search_test.go‎

Lines changed: 41 additions & 13 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /