summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--complete.go4
-rw-r--r--match/file.go19
-rw-r--r--match/match.go32
-rw-r--r--match/prefix.go9
-rw-r--r--predict_files.go20
-rw-r--r--predict_test.go102
6 files changed, 153 insertions, 33 deletions
diff --git a/complete.go b/complete.go
index 991bdea..423cbec 100644
--- a/complete.go
+++ b/complete.go
@@ -6,9 +6,9 @@ import (
"io"
"os"
"strconv"
+ "strings"
"github.com/posener/complete/cmd"
- "github.com/posener/complete/match"
)
const (
@@ -72,7 +72,7 @@ func (c *Complete) Complete() bool {
// filter only options that match the last argument
matches := []string{}
for _, option := range options {
- if match.Prefix(option, a.Last) {
+ if strings.HasPrefix(option, a.Last) {
matches = append(matches, option)
}
}
diff --git a/match/file.go b/match/file.go
deleted file mode 100644
index 051171e..0000000
--- a/match/file.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package match
-
-import "strings"
-
-// File returns true if prefix can match the file
-func File(file, prefix string) bool {
- // special case for current directory completion
- if file == "./" && (prefix == "." || prefix == "") {
- return true
- }
- if prefix == "." && strings.HasPrefix(file, ".") {
- return true
- }
-
- file = strings.TrimPrefix(file, "./")
- prefix = strings.TrimPrefix(prefix, "./")
-
- return strings.HasPrefix(file, prefix)
-}
diff --git a/match/match.go b/match/match.go
index b9c0973..b5f1814 100644
--- a/match/match.go
+++ b/match/match.go
@@ -1,7 +1,39 @@
// Package match contains matchers that decide if to apply completion.
+//
+// This package is deprecated.
package match
+import "strings"
+
// Match matches two strings
// it is used for comparing a term to the last typed
// word, the prefix, and see if it is a possible auto complete option.
+//
+// Deprecated.
type Match func(term, prefix string) bool
+
+// Prefix is a simple Matcher, if the word is it's prefix, there is a match
+// Match returns true if a has the prefix as prefix
+//
+// Deprecated.
+func Prefix(long, prefix string) bool {
+ return strings.HasPrefix(long, prefix)
+}
+
+// File returns true if prefix can match the file
+//
+// Deprecated.
+func File(file, prefix string) bool {
+ // special case for current directory completion
+ if file == "./" && (prefix == "." || prefix == "") {
+ return true
+ }
+ if prefix == "." && strings.HasPrefix(file, ".") {
+ return true
+ }
+
+ file = strings.TrimPrefix(file, "./")
+ prefix = strings.TrimPrefix(prefix, "./")
+
+ return strings.HasPrefix(file, prefix)
+}
diff --git a/match/prefix.go b/match/prefix.go
deleted file mode 100644
index 9a01ba6..0000000
--- a/match/prefix.go
+++ /dev/null
@@ -1,9 +0,0 @@
-package match
-
-import "strings"
-
-// Prefix is a simple Matcher, if the word is it's prefix, there is a match
-// Match returns true if a has the prefix as prefix
-func Prefix(long, prefix string) bool {
- return strings.HasPrefix(long, prefix)
-}
diff --git a/predict_files.go b/predict_files.go
index c8adf7e..c8baec1 100644
--- a/predict_files.go
+++ b/predict_files.go
@@ -5,8 +5,6 @@ import (
"os"
"path/filepath"
"strings"
-
- "github.com/posener/complete/match"
)
// PredictDirs will search for directories in the given started to be typed
@@ -70,7 +68,7 @@ func PredictFilesSet(files []string) PredictFunc {
f = fixPathForm(a.Last, f)
// test matching of file to the argument
- if match.File(f, a.Last) {
+ if matchFile(f, a.Last) {
prediction = append(prediction, f)
}
}
@@ -106,3 +104,19 @@ func listFiles(dir, pattern string, allowFiles bool) []string {
}
return list
}
+
+// MatchFile returns true if prefix can match the file
+func matchFile(file, prefix string) bool {
+ // special case for current directory completion
+ if file == "./" && (prefix == "." || prefix == "") {
+ return true
+ }
+ if prefix == "." && strings.HasPrefix(file, ".") {
+ return true
+ }
+
+ file = strings.TrimPrefix(file, "./")
+ prefix = strings.TrimPrefix(prefix, "./")
+
+ return strings.HasPrefix(file, prefix)
+}
diff --git a/predict_test.go b/predict_test.go
index 24df78d..c376207 100644
--- a/predict_test.go
+++ b/predict_test.go
@@ -1,6 +1,8 @@
package complete
import (
+ "fmt"
+ "os"
"sort"
"strings"
"testing"
@@ -167,3 +169,103 @@ func TestPredicate(t *testing.T) {
}
}
}
+
+func TestMatchFile(t *testing.T) {
+ t.Parallel()
+
+ // Change to tests directory for testing completion of
+ // files and directories
+ err := os.Chdir("../tests")
+ if err != nil {
+ panic(err)
+ }
+
+ type matcherTest struct {
+ prefix string
+ want bool
+ }
+
+ tests := []struct {
+ long string
+ tests []matcherTest
+ }{
+ {
+ long: "file.txt",
+ tests: []matcherTest{
+ {prefix: "", want: true},
+ {prefix: "f", want: true},
+ {prefix: "./f", want: true},
+ {prefix: "./.", want: false},
+ {prefix: "file.", want: true},
+ {prefix: "./file.", want: true},
+ {prefix: "file.txt", want: true},
+ {prefix: "./file.txt", want: true},
+ {prefix: "other.txt", want: false},
+ {prefix: "/other.txt", want: false},
+ {prefix: "/file.txt", want: false},
+ {prefix: "/fil", want: false},
+ {prefix: "/file.txt2", want: false},
+ {prefix: "/.", want: false},
+ },
+ },
+ {
+ long: "./file.txt",
+ tests: []matcherTest{
+ {prefix: "", want: true},
+ {prefix: "f", want: true},
+ {prefix: "./f", want: true},
+ {prefix: "./.", want: false},
+ {prefix: "file.", want: true},
+ {prefix: "./file.", want: true},
+ {prefix: "file.txt", want: true},
+ {prefix: "./file.txt", want: true},
+ {prefix: "other.txt", want: false},
+ {prefix: "/other.txt", want: false},
+ {prefix: "/file.txt", want: false},
+ {prefix: "/fil", want: false},
+ {prefix: "/file.txt2", want: false},
+ {prefix: "/.", want: false},
+ },
+ },
+ {
+ long: "/file.txt",
+ tests: []matcherTest{
+ {prefix: "", want: true},
+ {prefix: "f", want: false},
+ {prefix: "./f", want: false},
+ {prefix: "./.", want: false},
+ {prefix: "file.", want: false},
+ {prefix: "./file.", want: false},
+ {prefix: "file.txt", want: false},
+ {prefix: "./file.txt", want: false},
+ {prefix: "other.txt", want: false},
+ {prefix: "/other.txt", want: false},
+ {prefix: "/file.txt", want: true},
+ {prefix: "/fil", want: true},
+ {prefix: "/file.txt2", want: false},
+ {prefix: "/.", want: false},
+ },
+ },
+ {
+ long: "./",
+ tests: []matcherTest{
+ {prefix: "", want: true},
+ {prefix: ".", want: true},
+ {prefix: "./", want: true},
+ {prefix: "./.", want: false},
+ },
+ },
+ }
+
+ for _, tt := range tests {
+ for _, ttt := range tt.tests {
+ name := fmt.Sprintf("long=%q&prefix=%q", tt.long, ttt.prefix)
+ t.Run(name, func(t *testing.T) {
+ got := matchFile(tt.long, ttt.prefix)
+ if got != ttt.want {
+ t.Errorf("Failed %s: got = %t, want: %t", name, got, ttt.want)
+ }
+ })
+ }
+ }
+}