i'm easy to please

This commit is contained in:
Mark Bates 2019-10-18 15:16:53 -04:00
parent 38ea627cde
commit 57ff4f849b
15 changed files with 136 additions and 1169 deletions

Binary file not shown.

View File

@ -1,8 +0,0 @@
// +build !skippackr
// Code generated by github.com/gobuffalo/packr/v2. DO NOT EDIT.
// You can use the "packr clean" command to clean up this,
// and any other packr generated files.
package main
import _ "app/packrd"

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

5
go.mod
View File

@ -3,6 +3,9 @@ module github.com/markbates/pkger
go 1.13 go 1.13
require ( require (
github.com/gobuffalo/buffalo v0.14.11 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/stretchr/testify v1.4.0 github.com/stretchr/testify v1.4.0
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/yaml.v2 v2.2.4 // indirect
) )

1042
go.sum

File diff suppressed because it is too large Load Diff

View File

@ -11,10 +11,10 @@ import (
func Test_Parser_App(t *testing.T) { func Test_Parser_App(t *testing.T) {
r := require.New(t) r := require.New(t)
info, err := pkgtest.App() app, err := pkgtest.App()
r.NoError(err) r.NoError(err)
res, err := Parse(info) res, err := Parse(app.Info)
r.NoError(err) r.NoError(err)
@ -24,5 +24,5 @@ func Test_Parser_App(t *testing.T) {
} }
sort.Strings(act) sort.Strings(act)
r.Equal(pkgtest.AppPaths, act) r.Equal(app.Paths.Parser, act)
} }

View File

@ -3,6 +3,7 @@ package mem_test
import ( import (
"bytes" "bytes"
"os" "os"
"sort"
"testing" "testing"
"github.com/markbates/pkger/parser" "github.com/markbates/pkger/parser"
@ -16,10 +17,10 @@ import (
func Test_Pkger_Embedding(t *testing.T) { func Test_Pkger_Embedding(t *testing.T) {
r := require.New(t) r := require.New(t)
info, err := pkgtest.App() app, err := pkgtest.App()
r.NoError(err) r.NoError(err)
paths, err := parser.Parse(info) paths, err := parser.Parse(app.Info)
r.NoError(err) r.NoError(err)
ps := make([]string, len(paths)) ps := make([]string, len(paths))
@ -27,12 +28,12 @@ func Test_Pkger_Embedding(t *testing.T) {
ps[i] = p.String() ps[i] = p.String()
} }
r.Equal(pkgtest.AppPaths, ps) r.Equal(app.Paths.Parser, ps)
base, err := mem.New(info) base, err := mem.New(app.Info)
r.NoError(err) r.NoError(err)
disk, err := stdos.New(info) disk, err := stdos.New(app.Info)
r.NoError(err) r.NoError(err)
err = disk.Walk("/", func(path string, info os.FileInfo, err error) error { err = disk.Walk("/", func(path string, info os.FileInfo, err error) error {
@ -63,7 +64,7 @@ func Test_Pkger_Embedding(t *testing.T) {
}) })
r.NoError(err) r.NoError(err)
r.Equal(rootWalk, res) r.Equal(app.Paths.Root, res)
res = []string{} res = []string{}
err = base.Walk("/public", func(path string, info os.FileInfo, err error) error { err = base.Walk("/public", func(path string, info os.FileInfo, err error) error {
@ -75,11 +76,11 @@ func Test_Pkger_Embedding(t *testing.T) {
}) })
r.NoError(err) r.NoError(err)
r.Equal(pubWalk[1:], res) r.Equal(app.Paths.Public, res)
bb := &bytes.Buffer{} bb := &bytes.Buffer{}
err = stuffing.Stuff(bb, info, paths) err = stuffing.Stuff(bb, app.Info, paths)
r.NoError(err) r.NoError(err)
pkg, err := mem.UnmarshalEmbed(bb.Bytes()) pkg, err := mem.UnmarshalEmbed(bb.Bytes())
@ -95,7 +96,10 @@ func Test_Pkger_Embedding(t *testing.T) {
}) })
r.NoError(err) r.NoError(err)
r.Equal(rootWalk, res)
exp := append(app.Paths.Public, "app:/")
sort.Strings(exp)
r.Equal(exp, res)
res = []string{} res = []string{}
err = pkg.Walk("/public", func(path string, info os.FileInfo, err error) error { err = pkg.Walk("/public", func(path string, info os.FileInfo, err error) error {
@ -107,29 +111,5 @@ func Test_Pkger_Embedding(t *testing.T) {
}) })
r.NoError(err) r.NoError(err)
r.Equal(pubWalk, res) r.Equal(app.Paths.Public, res)
}
var pubWalk = []string{
"app:/",
"app:/public",
"app:/public/images",
"app:/public/images/img1.png",
"app:/public/images/img2.png",
"app:/public/index.html",
}
var rootWalk = []string{
"app:/",
"app:/go.mod",
"app:/main.go",
"app:/public",
"app:/public/images",
"app:/public/images/img1.png",
"app:/public/images/img2.png",
"app:/public/index.html",
"app:/templates",
"app:/templates/a.txt",
"app:/templates/b",
"app:/templates/b/b.txt",
} }

View File

@ -25,7 +25,6 @@ func New(info here.Info) (*Pkger, error) {
Here: info, Here: info,
} }
f.infos.Store(info.ImportPath, info) f.infos.Store(info.ImportPath, info)
f.MkdirAll("/", 0755)
return f, nil return f, nil
} }
@ -152,17 +151,19 @@ func (fx *Pkger) RemoveAll(name string) error {
// Add copies the pkging.File into the *Pkger // Add copies the pkging.File into the *Pkger
func (fx *Pkger) Add(f pkging.File) error { func (fx *Pkger) Add(f pkging.File) error {
fx.MkdirAll("/", 0755)
info, err := f.Stat() info, err := f.Stat()
if err != nil { if err != nil {
return err return err
} }
if f.Path().Pkg == fx.Here.ImportPath { if f.Path().Pkg == fx.Here.ImportPath {
if err := fx.MkdirAll(filepath.Dir(f.Name()), 0755); err != nil { dir := filepath.Dir(f.Name())
if dir != "/" {
if err := fx.MkdirAll(dir, 0755); err != nil {
return err return err
} }
} }
}
mf := &File{ mf := &File{
her: f.Info(), her: f.Info(),
@ -187,7 +188,6 @@ func (fx *Pkger) Add(f pkging.File) error {
// Create creates the named file with mode 0666 (before umask) - It's actually 0644, truncating it if it already exists. If successful, methods on the returned File can be used for I/O; the associated file descriptor has mode O_RDWR. // Create creates the named file with mode 0666 (before umask) - It's actually 0644, truncating it if it already exists. If successful, methods on the returned File can be used for I/O; the associated file descriptor has mode O_RDWR.
func (fx *Pkger) Create(name string) (pkging.File, error) { func (fx *Pkger) Create(name string) (pkging.File, error) {
fx.MkdirAll("/", 0755)
pt, err := fx.Parse(name) pt, err := fx.Parse(name)
if err != nil { if err != nil {
return nil, err return nil, err
@ -199,9 +199,11 @@ func (fx *Pkger) Create(name string) (pkging.File, error) {
} }
dir := filepath.Dir(pt.Name) dir := filepath.Dir(pt.Name)
if dir != "/" {
if _, err := fx.Stat(dir); err != nil { if _, err := fx.Stat(dir); err != nil {
return nil, err return nil, err
} }
}
f := &File{ f := &File{
path: pt, path: pt,
@ -328,22 +330,28 @@ func (f *Pkger) Walk(p string, wf filepath.WalkFunc) error {
skip := "!" skip := "!"
for _, k := range keys { for _, k := range keys {
if k.Pkg != pt.Pkg {
continue
}
if !strings.HasPrefix(k.Name, pt.Name) { if !strings.HasPrefix(k.Name, pt.Name) {
continue continue
} }
if strings.HasPrefix(k.Name, skip) { if strings.HasPrefix(k.Name, skip) {
continue continue
} }
fl, ok := f.files.Load(k) fl, ok := f.files.Load(k)
if !ok { if !ok {
return fmt.Errorf("could not find %s", k) return os.ErrNotExist
} }
fi, err := fl.Stat() fi, err := fl.Stat()
if err != nil { if err != nil {
return err return err
} }
fi = pkging.WithName(strings.TrimPrefix(k.Name, pt.Name), fi) fi = pkging.WithName(strings.TrimPrefix(k.Name, pt.Name), fi)
err = wf(k.String(), fi, nil) err = wf(k.String(), fi, nil)
if err == filepath.SkipDir { if err == filepath.SkipDir {

View File

@ -9,12 +9,12 @@ import (
func Test_Pkger(t *testing.T) { func Test_Pkger(t *testing.T) {
suite, err := pkgtest.NewSuite("memos", func() (pkging.Pkger, error) { suite, err := pkgtest.NewSuite("memos", func() (pkging.Pkger, error) {
info, err := pkgtest.App() app, err := pkgtest.App()
if err != nil { if err != nil {
return nil, err return nil, err
} }
pkg, err := New(info) pkg, err := New(app.Info)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -6,15 +6,41 @@ import (
"github.com/markbates/pkger/here" "github.com/markbates/pkger/here"
) )
type AppDetails struct {
here.Info
Paths struct {
Root []string
Parser []string
Public []string
}
}
// App returns here.info that represents the // App returns here.info that represents the
// ./internal/testdata/app. This should be used // ./internal/testdata/app. This should be used
// by tests. // by tests.
func App() (here.Info, error) { func App() (AppDetails, error) {
var app AppDetails
her, err := here.Package("github.com/markbates/pkger") her, err := here.Package("github.com/markbates/pkger")
if err != nil { if err != nil {
return her, err return app, err
} }
var info here.Info
info := here.Info{
ImportPath: "app",
}
x := make([]string, len(rootPaths))
copy(x, rootPaths)
app.Paths.Root = x
x = make([]string, len(parserPaths))
copy(x, parserPaths)
app.Paths.Parser = x
x = make([]string, len(publicPaths))
copy(x, publicPaths)
app.Paths.Public = x
ch := filepath.Join( ch := filepath.Join(
her.Dir, her.Dir,
@ -25,13 +51,41 @@ func App() (here.Info, error) {
"app") "app")
info.Dir = ch info.Dir = ch
info.ImportPath = "app"
return here.Cache(info.ImportPath, func(s string) (here.Info, error) { info, err = here.Cache(info.ImportPath, func(s string) (here.Info, error) {
return info, nil return info, nil
}) })
if err != nil {
return app, err
}
app.Info = info
return app, nil
} }
var AppPaths = []string{ var rootPaths = []string{
"app:/",
"app:/go.mod",
"app:/main.go",
"app:/public",
"app:/public/images",
"app:/public/images/img1.png",
"app:/public/images/img2.png",
"app:/public/index.html",
"app:/templates",
"app:/templates/a.txt",
"app:/templates/b",
"app:/templates/b/b.txt",
}
var publicPaths = []string{
"app:/public",
"app:/public/images",
"app:/public/images/img1.png",
"app:/public/images/img2.png",
"app:/public/index.html",
}
var parserPaths = []string{
"app:/", "app:/",
"app:/public", "app:/public",
"app:/public/images", "app:/public/images",

View File

@ -445,25 +445,49 @@ func (s Suite) Test_Walk(t *testing.T) {
r.NoError(s.LoadFolder(pkg)) r.NoError(s.LoadFolder(pkg))
cur, err := pkg.Current() app, err := App()
r.NoError(err) r.NoError(err)
ip := cur.ImportPath
table := []struct { table := []struct {
in string in string
exp []string
}{ }{
{in: ip}, {in: "/", exp: app.Paths.Root},
{in: "/"}, {in: "/public", exp: app.Paths.Public},
{in: ":/"},
{in: ip + ":/"},
} }
for _, tt := range table { for _, tt := range table {
s.Run(t, tt.in, func(st *testing.T) { s.Run(t, tt.in, func(st *testing.T) {
tdir, err := ioutil.TempDir("", "")
r.NoError(err)
defer os.RemoveAll(tdir)
r.NoError(s.WriteFolder(tdir))
var goact []string
err = filepath.Walk(filepath.Join(tdir, tt.in), func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
path = strings.TrimPrefix(path, tdir)
if path == "" || path == "." {
path = "/"
}
pt, err := pkg.Parse(path)
if err != nil {
return err
}
goact = append(goact, pt.String())
return nil
})
r.NoError(err)
r.Equal(tt.exp, goact)
r := require.New(st) r := require.New(st)
var act []string var act []string
err := pkg.Walk(tt.in, func(path string, info os.FileInfo, err error) error { err = pkg.Walk(tt.in, func(path string, info os.FileInfo, err error) error {
if err != nil { if err != nil {
return err return err
} }
@ -472,21 +496,7 @@ func (s Suite) Test_Walk(t *testing.T) {
}) })
r.NoError(err) r.NoError(err)
exp := []string{ r.Equal(tt.exp, act)
"app:/",
"app:/go.mod",
"app:/main.go",
"app:/public",
"app:/public/images",
"app:/public/images/img1.png",
"app:/public/images/img2.png",
"app:/public/index.html",
"app:/templates",
"app:/templates/a.txt",
"app:/templates/b",
"app:/templates/b/b.txt",
}
r.Equal(exp, act)
}) })
} }

View File

@ -10,7 +10,7 @@ import (
func Test_Pkger(t *testing.T) { func Test_Pkger(t *testing.T) {
suite, err := pkgtest.NewSuite("stdos", func() (pkging.Pkger, error) { suite, err := pkgtest.NewSuite("stdos", func() (pkging.Pkger, error) {
info, err := pkgtest.App() app, err := pkgtest.App()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -20,9 +20,9 @@ func Test_Pkger(t *testing.T) {
return nil, err return nil, err
} }
info.Dir = dir app.Dir = dir
mypkging, err := New(info) mypkging, err := New(app.Info)
if err != nil { if err != nil {
return nil, err return nil, err
} }