Skip to content

Commit

Permalink
treat '_.txt' as a default template for '*.txt'
Browse files Browse the repository at this point in the history
  • Loading branch information
Ryooooooga committed Apr 29, 2021
1 parent 9bea3e6 commit 32a77ca
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 44 deletions.
6 changes: 3 additions & 3 deletions pkg/commands/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@ func (cmd *Command) addFile(filename string) error {
return err
}

overwritten, err := cmd.Templates.AddTemplate(filename, content, cmd.Force)
templateFilename, overwritten, err := cmd.Templates.AddTemplate(filename, content, cmd.Force)
if err != nil {
return err
}

if overwritten {
cmd.Logger.Printf("%s <- %s (overwrite)\n", cmd.Templates.TemplatePathOf(filename), filename)
cmd.Logger.Printf("%s <- %s (overwrite)\n", templateFilename, filename)
} else {
cmd.Logger.Printf("%s <- %s\n", cmd.Templates.TemplatePathOf(filename), filename)
cmd.Logger.Printf("%s <- %s\n", templateFilename, filename)
}

return nil
Expand Down
50 changes: 28 additions & 22 deletions pkg/repositories/template_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,8 @@ type TemplateFile struct {

type TemplateRepository interface {
ListTemplates() ([]string, error)
AddTemplate(filename string, content []byte, overwrite bool) (overwritten bool, err error)
AddTemplate(filename string, content []byte, overwrite bool) (templateFilename string, overwritten bool, err error)
FindTemplate(filename string) (TemplateFile, error)
TemplatePathOf(filename string) string
}

type templateRepository struct {
Expand Down Expand Up @@ -58,55 +57,62 @@ func (r *templateRepository) ListTemplates() ([]string, error) {
return list, nil
}

func (r *templateRepository) AddTemplate(filename string, content []byte, overwrite bool) (bool, error) {
templatePath := r.TemplatePathOf(filename)
func (r *templateRepository) AddTemplate(filename string, content []byte, overwrite bool) (string, bool, error) {
basename := path.Base(filename)
templatePath := path.Join(r.templateDir, basename)

var overwritten bool
stat, err := os.Stat(templatePath)
if os.IsNotExist(err) {
// Template does not exist (ok)
overwritten = false
} else if err != nil {
return false, err
return "", false, err
} else if stat.IsDir() {
return false, fmt.Errorf("%s is a directory", templatePath)
return "", false, fmt.Errorf("%s is a directory", templatePath)
} else if !overwrite {
return false, errors.TemplateExistError("%s already exists", templatePath)
return "", false, errors.TemplateExistError("%s already exists", templatePath)
} else {
overwritten = true
}

if err := os.MkdirAll(path.Dir(templatePath), DirectoryPermission); err != nil {
return false, err
return "", false, err
}

if err := ioutil.WriteFile(templatePath, content, FilePermission); err != nil {
return false, err
return "", false, err
}

return overwritten, nil
return templatePath, overwritten, nil
}

func (r *templateRepository) FindTemplate(filename string) (TemplateFile, error) {
basename := path.Base(filename)
templatePath := path.Join(r.templateDir, basename)

content, err := ioutil.ReadFile(templatePath)
if os.IsNotExist(err) {
return TemplateFile{}, errors.TemplateNotExistError("%s does not exist", templatePath)
} else if err != nil {
if err == nil {
return TemplateFile{
Path: templatePath,
Content: content,
}, nil
} else if !os.IsNotExist(err) {
return TemplateFile{}, err
}

return TemplateFile{
Path: templatePath,
Content: content,
}, nil
}
ext := path.Ext(filename)
fallbackTemplatePath := path.Join(r.templateDir, "_"+ext)

func (r *templateRepository) TemplatePathOf(filename string) string {
basename := path.Base(filename)
templatePath := path.Join(r.templateDir, basename)
content, err = ioutil.ReadFile(fallbackTemplatePath)
if err == nil {
return TemplateFile{
Path: fallbackTemplatePath,
Content: content,
}, nil
} else if !os.IsNotExist(err) {
return TemplateFile{}, err
}

return templatePath
return TemplateFile{}, errors.TemplateNotExistError("%s does not exist", templatePath)
}
40 changes: 21 additions & 19 deletions pkg/repositories/template_repository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ func makeDir(t *testing.T, filename string) {
func TestTemplateRepository(t *testing.T) {
tempDir := t.TempDir()
writeFile(t, path.Join(tempDir, "test1.txt"), `Test Template {{ .Path }}`)
writeFile(t, path.Join(tempDir, "test2.txt"), `Today is {{ Now.Format "2006-01-02" }}!`)
writeFile(t, path.Join(tempDir, "test2.md"), `Today is {{ Now.Format "2006-01-02" }}!`)
writeFile(t, path.Join(tempDir, "_.md"), `Default markdown template`)
makeDir(t, path.Join(tempDir, "test-dir"))
writeFile(t, path.Join(tempDir, "test-dir", "test3.txt"), `hello`)

Expand All @@ -38,7 +39,7 @@ func TestTemplateRepository(t *testing.T) {
t.Fatalf("ListTemplates() returns an error %v", err)
}

expectedFiles := []string{"test1.txt", "test2.txt"}
expectedFiles := []string{"_.md", "test1.txt", "test2.md"}

if !reflect.DeepEqual(files, expectedFiles) {
t.Fatalf("files != %v, actual %v", expectedFiles, files)
Expand All @@ -61,10 +62,14 @@ func TestTemplateRepository(t *testing.T) {
t.Run("AddTemplate", func(t *testing.T) {
repo := repositories.NewTemplateRepository(tempDir)

overwritten, err := repo.AddTemplate("add-test1.txt", []byte("add-test1"), false)
templateFilename, overwritten, err := repo.AddTemplate("add-test1.txt", []byte("add-test1"), false)
expectedTemplateFilename := path.Join(tempDir, "add-test1.txt")
if err != nil {
t.Fatalf("AddTemplate() returns an error %v", err)
}
if templateFilename != expectedTemplateFilename {
t.Fatalf("templateFilename != %s, actual %s", expectedTemplateFilename, templateFilename)
}
if overwritten {
t.Fatalf("overwritten must be false")
}
Expand All @@ -75,20 +80,23 @@ func TestTemplateRepository(t *testing.T) {
t.Fatalf("ListTemplates() returns an error %v", err)
}

expectedFiles := []string{"add-test1.txt", "test1.txt", "test2.txt"}
expectedFiles := []string{"_.md", "add-test1.txt", "test1.txt", "test2.md"}
if !reflect.DeepEqual(files, expectedFiles) {
t.Fatalf("files != %v, actual %v", expectedFiles, files)
}

_, err = repo.AddTemplate("add-test1.txt", []byte("add-test1"), false)
_, _, err = repo.AddTemplate("add-test1.txt", []byte("add-test1"), false)
if err == nil || !errors.IsTemplateExistError(err) {
t.Fatalf("AddTemplate() returns TemplateExistError %v", err)
}

overwritten, err = repo.AddTemplate("add-test1.txt", []byte("add-test1"), true)
templateFilename, overwritten, err = repo.AddTemplate("add-test1.txt", []byte("add-test1"), true)
if err != nil {
t.Fatalf("AddTemplate() returns an error %v", err)
}
if templateFilename != expectedTemplateFilename {
t.Fatalf("templateFilename != %s, actual %s", expectedTemplateFilename, templateFilename)
}
if !overwritten {
t.Fatalf("overwritten must be true")
}
Expand All @@ -111,10 +119,15 @@ func TestTemplateRepository(t *testing.T) {
expectedContent: `Test Template {{ .Path }}`,
},
{
filename: "../test2.txt",
expectedPath: path.Join(tempDir, "test2.txt"),
filename: "../test2.md",
expectedPath: path.Join(tempDir, "test2.md"),
expectedContent: `Today is {{ Now.Format "2006-01-02" }}!`,
},
{
filename: "../fallback.md",
expectedPath: path.Join(tempDir, "_.md"),
expectedContent: `Default markdown template`,
},
}

for _, s := range scenarios {
Expand Down Expand Up @@ -154,15 +167,4 @@ func TestTemplateRepository(t *testing.T) {
t.Fatalf("FindTemplate() must return an error")
}
})

t.Run("TemplatePathOf", func(t *testing.T) {
repo := repositories.NewTemplateRepository(tempDir)

templatePath := repo.TemplatePathOf("./tests/file.md")
expectedTemplatePath := path.Join(tempDir, "file.md")

if templatePath != expectedTemplatePath {
t.Fatalf("templatePath != %s, actual %s", expectedTemplatePath, templatePath)
}
})
}

0 comments on commit 32a77ca

Please sign in to comment.