Skip to content

Commit

Permalink
Support template variables in filenames + directories
Browse files Browse the repository at this point in the history
  • Loading branch information
leaanthony committed May 19, 2024
1 parent 6e7fc65 commit 949b03c
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 25 deletions.
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
module github.com/leaanthony/gosod

go 1.16
go 1.18

require (
github.com/leaanthony/debme v1.2.1
github.com/matryer/is v1.4.0
github.com/matryer/is v1.4.1
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0H
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
39 changes: 30 additions & 9 deletions internal/templatedir/templatedir.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package templatedir

import (
"bytes"
"io"
"io/fs"
"log"
Expand Down Expand Up @@ -85,7 +86,7 @@ func (t *TemplateDir) processTemplateDirFiles(targetDirectory string, data inter
}

// Create all directories
err = t.createDirectories(targetDirectory)
err = t.createDirectories(targetDirectory, data)
if err != nil {
return err
}
Expand All @@ -97,7 +98,7 @@ func (t *TemplateDir) processTemplateDirFiles(targetDirectory string, data inter
}

// Copy files
err = t.copyFiles(targetDirectory)
err = t.copyFiles(targetDirectory, data)
if err != nil {
return err
}
Expand Down Expand Up @@ -147,16 +148,36 @@ func (t *TemplateDir) categoriseFile(path string, info fs.DirEntry, err error) e
return nil
}

func (t *TemplateDir) convertPathTarget(path string, targetDirectory string) string {
return filepath.Join(targetDirectory, path)
func (t *TemplateDir) convertPathTarget(path string, targetDirectory string, data any) string {

result := filepath.Join(targetDirectory, path)
if data == nil {
return result
}

// Load the filename as a template
tmpl, err := template.New("filename").Parse(result)
if err != nil {
return result
}

// Execute the template
var buf bytes.Buffer
err = tmpl.Execute(&buf, data)
if err != nil {
return result
}

// Return the result
return buf.String()
}

func (t *TemplateDir) createDirectories(targetDirectory string) error {
func (t *TemplateDir) createDirectories(targetDirectory string, data any) error {

// Iterate all directories and attempt to create them
for _, dirPath := range t.dirs {

targetDir := t.convertPathTarget(dirPath, targetDirectory)
targetDir := t.convertPathTarget(dirPath, targetDirectory, data)

// Create the directory
err := os.MkdirAll(targetDir, 0755)
Expand All @@ -182,7 +203,7 @@ func (t *TemplateDir) processTemplateDirs(targetDirectory string, data interface
}

// Convert path to target path
targetFile := t.convertPathTarget(templateFile, targetDirectory)
targetFile := t.convertPathTarget(templateFile, targetDirectory, data)

// update filename
baseDir := filepath.Dir(targetFile)
Expand Down Expand Up @@ -220,7 +241,7 @@ func (t *TemplateDir) processTemplateDirs(targetDirectory string, data interface
return nil
}

func (t *TemplateDir) copyFiles(targetDirectory string) error {
func (t *TemplateDir) copyFiles(targetDirectory string, data any) error {

// Iterate over files
for _, filename := range t.standardFiles {
Expand All @@ -230,7 +251,7 @@ func (t *TemplateDir) copyFiles(targetDirectory string) error {
targetFile = renamedFile
}

targetFilename := t.convertPathTarget(targetFile, targetDirectory)
targetFilename := t.convertPathTarget(targetFile, targetDirectory, data)
err := t.copyFile(filename, targetFilename)
if err != nil {
return err
Expand Down
86 changes: 72 additions & 14 deletions internal/templatedir/templatedir_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@ import (
"embed"
"github.com/leaanthony/debme"
"github.com/matryer/is"
"io/ioutil"
"os"
"path/filepath"
"testing"
"testing/fstest"
)

//go:embed testdata/embedded
//go:embed testdata/**
var embeddedData embed.FS

func TestNew(t *testing.T) {
Expand All @@ -19,13 +18,15 @@ func TestNew(t *testing.T) {
fs, err := debme.FS(embeddedData, "testdata/embedded")
is2.NoErr(err)
templDir := New(fs)
targetDir, err := ioutil.TempDir(".", "test_results")
targetDir, err := os.MkdirTemp(".", "test_results")
is2.NoErr(err)
defer func(path string) {
err := os.RemoveAll(path)
is2.NoErr(err)
}(targetDir)

defer os.RemoveAll(targetDir)

templDir.IgnoreFile("ignored.txt")
templDir.SetTemplateFilters([]string{".filtername", ".tmpl"})

Expand All @@ -43,29 +44,86 @@ func TestNew(t *testing.T) {
"custom.txt",
}

err = fstest.TestFS(os.DirFS(targetDir), expectedFiles...)
is2.NoErr(err)
// Check that the files are there as expected
for _, file := range expectedFiles {
td, err := filepath.Abs(targetDir)
is2.NoErr(err)
_, err = os.Stat(filepath.Join(td, file))
is2.NoErr(err)
}
}

func TestBad(t *testing.T) {
func TestNewNamed(t *testing.T) {
is2 := is.New(t)
// We want an FS further down the embedded data
fs, err := debme.FS(embeddedData, "testdata/embedded")
fs, err := debme.FS(embeddedData, "testdata/filenames")
is2.NoErr(err)
templDir := New(fs)
targetDir, err := os.MkdirTemp(".", "test_results")
is2.NoErr(err)
defer func(path string) {
err := os.RemoveAll(path)
is2.NoErr(err)
}(targetDir)

defer os.RemoveAll(targetDir)

templDir.IgnoreFile("ignored.txt")
templDir.SetTemplateFilters([]string{".filtername", ".tmpl"})

type TestData struct {
Name string
}
// Try to extract to non-writable directory
err = os.Mkdir("/tmp/readonly", 0444)
err = templDir.Extract(targetDir, &TestData{
Name: "newname",
})
is2.NoErr(err)
err = templDir.Extract("/tmp/readonly", &TestData{
Name: "Roger Mellie",
expectedFiles := []string{
"newname.go",
}

// Check that the files are there as expected
for _, file := range expectedFiles {
td, err := filepath.Abs(targetDir)
is2.NoErr(err)
_, err = os.Stat(filepath.Join(td, file))
is2.NoErr(err)
}
}
func TestNewNamed2(t *testing.T) {
is2 := is.New(t)
// We want an FS further down the embedded data
fs, err := debme.FS(embeddedData, "testdata/dirnames")
is2.NoErr(err)
templDir := New(fs)
targetDir, err := os.MkdirTemp(".", "test_results")
is2.NoErr(err)
defer func(path string) {
err := os.RemoveAll(path)
is2.NoErr(err)
}(targetDir)

defer os.RemoveAll(targetDir)

templDir.IgnoreFile("ignored.txt")
templDir.SetTemplateFilters([]string{".filtername", ".tmpl"})

type TestData struct {
Name string
}
err = templDir.Extract(targetDir, &TestData{
Name: "newname",
})
is2.True(err != nil)
err = os.RemoveAll("/tmp/readonly")
is2.NoErr(err)
expectedFiles := []string{
"newname/normal.go",
}

// Check that the files are there as expected
for _, file := range expectedFiles {
td, err := filepath.Abs(targetDir)
is2.NoErr(err)
_, err = os.Stat(filepath.Join(td, file))
is2.NoErr(err)
}
}
1 change: 1 addition & 0 deletions internal/templatedir/testdata/dirnames/{{.Name}}/normal.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package dirname
1 change: 1 addition & 0 deletions internal/templatedir/testdata/filenames/{{.Name}}.tmpl.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package filenames

0 comments on commit 949b03c

Please sign in to comment.