forked from mirror/pkger
it's just a dream
This commit is contained in:
parent
2978645721
commit
7ba3bfb8d2
57
here/info.go
57
here/info.go
|
@ -2,10 +2,8 @@ package here
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -96,58 +94,3 @@ func (i Info) String() string {
|
||||||
s := string(b)
|
s := string(b)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i Info) Parse(p string) (Path, error) {
|
|
||||||
p = strings.TrimSpace(p)
|
|
||||||
p = filepath.Clean(p)
|
|
||||||
p = strings.TrimPrefix(p, i.Dir)
|
|
||||||
|
|
||||||
p = strings.Replace(p, "\\", "/", -1)
|
|
||||||
p = strings.TrimSpace(p)
|
|
||||||
|
|
||||||
if len(p) == 0 || p == ":" {
|
|
||||||
return i.build("", "", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
res := pathrx.FindAllStringSubmatch(p, -1)
|
|
||||||
if len(res) == 0 {
|
|
||||||
return Path{}, fmt.Errorf("could not parse %q", p)
|
|
||||||
}
|
|
||||||
|
|
||||||
matches := res[0]
|
|
||||||
|
|
||||||
if len(matches) != 4 {
|
|
||||||
return Path{}, fmt.Errorf("could not parse %q", p)
|
|
||||||
}
|
|
||||||
|
|
||||||
return i.build(p, matches[1], matches[3])
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i Info) build(p, pkg, name string) (Path, error) {
|
|
||||||
pt := Path{
|
|
||||||
Pkg: pkg,
|
|
||||||
Name: name,
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.HasPrefix(pt.Pkg, "/") || len(pt.Pkg) == 0 {
|
|
||||||
pt.Name = pt.Pkg
|
|
||||||
pt.Pkg = i.ImportPath
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(pt.Name) == 0 {
|
|
||||||
pt.Name = "/"
|
|
||||||
}
|
|
||||||
|
|
||||||
if pt.Pkg == pt.Name {
|
|
||||||
pt.Pkg = i.ImportPath
|
|
||||||
pt.Name = "/"
|
|
||||||
}
|
|
||||||
|
|
||||||
if !strings.HasPrefix(pt.Name, "/") {
|
|
||||||
pt.Name = "/" + pt.Name
|
|
||||||
}
|
|
||||||
pt.Name = strings.TrimPrefix(pt.Name, i.Dir)
|
|
||||||
return pt, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var pathrx = regexp.MustCompile("([^:]+)(:(/.+))?")
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
package here
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (i Info) Parse(p string) (Path, error) {
|
||||||
|
p = strings.TrimSpace(p)
|
||||||
|
p = filepath.Clean(p)
|
||||||
|
p = strings.TrimPrefix(p, i.Dir)
|
||||||
|
|
||||||
|
p = strings.Replace(p, "\\", "/", -1)
|
||||||
|
p = strings.TrimSpace(p)
|
||||||
|
|
||||||
|
if len(p) == 0 || p == ":" || p == "." {
|
||||||
|
return i.build("", "", "")
|
||||||
|
}
|
||||||
|
|
||||||
|
res := pathrx.FindAllStringSubmatch(p, -1)
|
||||||
|
if len(res) == 0 {
|
||||||
|
return Path{}, fmt.Errorf("could not parse %q", p)
|
||||||
|
}
|
||||||
|
|
||||||
|
matches := res[0]
|
||||||
|
|
||||||
|
if len(matches) != 4 {
|
||||||
|
return Path{}, fmt.Errorf("could not parse %q", p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return i.build(p, matches[1], matches[3])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i Info) build(p, pkg, name string) (Path, error) {
|
||||||
|
pt := Path{
|
||||||
|
Pkg: pkg,
|
||||||
|
Name: name,
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(pt.Pkg, "/") || len(pt.Pkg) == 0 {
|
||||||
|
pt.Name = pt.Pkg
|
||||||
|
pt.Pkg = i.ImportPath
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(pt.Name) == 0 {
|
||||||
|
pt.Name = "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
if pt.Pkg == pt.Name {
|
||||||
|
pt.Pkg = i.ImportPath
|
||||||
|
pt.Name = "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasPrefix(pt.Name, "/") {
|
||||||
|
pt.Name = "/" + pt.Name
|
||||||
|
}
|
||||||
|
pt.Name = strings.TrimPrefix(pt.Name, i.Dir)
|
||||||
|
return pt, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var pathrx = regexp.MustCompile("([^:]+)(:(/.+))?")
|
|
@ -0,0 +1,60 @@
|
||||||
|
package here_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/markbates/pkger/here"
|
||||||
|
"github.com/markbates/pkger/pkging/pkgtest"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_Info_Parse(t *testing.T) {
|
||||||
|
const name = "/public/index.html"
|
||||||
|
|
||||||
|
r := require.New(t)
|
||||||
|
|
||||||
|
app, err := pkgtest.App()
|
||||||
|
r.NoError(err)
|
||||||
|
|
||||||
|
ip := app.Info.ImportPath
|
||||||
|
ip2 := "another/app"
|
||||||
|
|
||||||
|
table := []struct {
|
||||||
|
in string
|
||||||
|
exp here.Path
|
||||||
|
err bool
|
||||||
|
}{
|
||||||
|
{in: name, exp: here.Path{Pkg: ip, Name: name}},
|
||||||
|
{in: "", exp: here.Path{Pkg: ip, Name: "/"}},
|
||||||
|
{in: "/", exp: here.Path{Pkg: ip, Name: "/"}},
|
||||||
|
{in: filepath.Join(app.Info.Dir, name), exp: here.Path{Pkg: ip, Name: name}},
|
||||||
|
{in: ":" + name, exp: here.Path{Pkg: ip, Name: name}},
|
||||||
|
{in: ip + ":" + name, exp: here.Path{Pkg: ip, Name: name}},
|
||||||
|
{in: ip, exp: here.Path{Pkg: ip, Name: "/"}},
|
||||||
|
{in: ":", exp: here.Path{Pkg: ip, Name: "/"}},
|
||||||
|
{in: ip2 + ":" + name, exp: here.Path{Pkg: ip2, Name: name}},
|
||||||
|
{in: ip2, exp: here.Path{Pkg: ip2, Name: "/"}},
|
||||||
|
{in: ip2 + ":", exp: here.Path{Pkg: ip2, Name: "/"}},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range table {
|
||||||
|
for _, in := range []string{tt.in, strings.ReplaceAll(tt.in, "/", "\\")} {
|
||||||
|
t.Run(in, func(st *testing.T) {
|
||||||
|
r := require.New(st)
|
||||||
|
|
||||||
|
pt, err := app.Info.Parse(in)
|
||||||
|
|
||||||
|
if tt.err {
|
||||||
|
r.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
r.NoError(err)
|
||||||
|
|
||||||
|
r.Equal(tt.exp, pt)
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
here/path.go
25
here/path.go
|
@ -1,9 +1,7 @@
|
||||||
package here
|
package here
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Path struct {
|
type Path struct {
|
||||||
|
@ -15,25 +13,8 @@ func (p Path) String() string {
|
||||||
if p.Name == "" {
|
if p.Name == "" {
|
||||||
p.Name = "/"
|
p.Name = "/"
|
||||||
}
|
}
|
||||||
|
if p.Pkg == "" {
|
||||||
|
return p.Name
|
||||||
|
}
|
||||||
return fmt.Sprintf("%s:%s", p.Pkg, p.Name)
|
return fmt.Sprintf("%s:%s", p.Pkg, p.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Path) Format(st fmt.State, verb rune) {
|
|
||||||
switch verb {
|
|
||||||
case 'v':
|
|
||||||
if st.Flag('+') {
|
|
||||||
b, err := json.MarshalIndent(p, "", " ")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprint(os.Stderr, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Fprint(st, string(b))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Fprint(st, p.String())
|
|
||||||
case 'q':
|
|
||||||
fmt.Fprintf(st, "%q", p.String())
|
|
||||||
default:
|
|
||||||
fmt.Fprint(st, p.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -96,7 +96,6 @@ func (s Suite) LoadFolder(pkg pkging.Pkger) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Suite) Test_HTTP(t *testing.T) {
|
func (s Suite) Test_HTTP(t *testing.T) {
|
||||||
|
|
Loading…
Reference in New Issue