commit f9b351438b9c48dd0ddd527846babd1ef57140b6
parent c36fbab86fe574c28330462d43377cf02e7d5cd9
Author: Terin Stock <terinjokes@gmail.com>
Date: Fri, 29 Apr 2022 02:00:25 -0700
[feature] allow absolute path to templates (#507)
Only attempt to join the `WebTemplateBaseDir` with the current working
directory if the user has not configured an absolute path to the
template directory.
This changeset also makes a similar change to the testrig, allowing
tests to configure an alternative location for the templates directory.
Fixes #411
Signed-off-by: Terin Stock <terinjokes@gmail.com>
Diffstat:
3 files changed, 40 insertions(+), 28 deletions(-)
diff --git a/internal/email/util.go b/internal/email/util.go
@@ -28,14 +28,16 @@ import (
)
func loadTemplates(templateBaseDir string) (*template.Template, error) {
- cwd, err := os.Getwd()
- if err != nil {
- return nil, fmt.Errorf("error getting current working directory: %s", err)
+ if !filepath.IsAbs(templateBaseDir) {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return nil, fmt.Errorf("error getting current working directory: %s", err)
+ }
+ templateBaseDir = filepath.Join(cwd, templateBaseDir)
}
// look for all templates that start with 'email_'
- tmPath := filepath.Join(cwd, fmt.Sprintf("%semail_*", templateBaseDir))
- return template.ParseGlob(tmPath)
+ return template.ParseGlob(filepath.Join(templateBaseDir, "email_*"))
}
// https://datatracker.ietf.org/doc/html/rfc2822
diff --git a/internal/router/template.go b/internal/router/template.go
@@ -33,20 +33,22 @@ import (
// LoadTemplates loads html templates for use by the given engine
func loadTemplates(engine *gin.Engine) error {
- cwd, err := os.Getwd()
- if err != nil {
- return fmt.Errorf("error getting current working directory: %s", err)
- }
-
templateBaseDir := viper.GetString(config.Keys.WebTemplateBaseDir)
- _, err = os.Stat(filepath.Join(cwd, templateBaseDir, "index.tmpl"))
- if err != nil {
- return fmt.Errorf("%s doesn't seem to contain the templates; index.tmpl is missing: %s", filepath.Join(cwd, templateBaseDir), err)
+ if !filepath.IsAbs(templateBaseDir) {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return fmt.Errorf("error getting current working directory: %w", err)
+ }
+
+ templateBaseDir = filepath.Join(cwd, viper.GetString(config.Keys.WebTemplateBaseDir))
+ }
+
+ if _, err := os.Stat(filepath.Join(templateBaseDir, "index.tmpl")); err != nil {
+ return fmt.Errorf("%s doesn't seem to contain the templates; index.tmpl is missing: %w", templateBaseDir, err)
}
- tmPath := filepath.Join(cwd, fmt.Sprintf("%s*", templateBaseDir))
- engine.LoadHTMLGlob(tmPath)
+ engine.LoadHTMLGlob(fmt.Sprintf("%s*", templateBaseDir))
return nil
}
diff --git a/testrig/router.go b/testrig/router.go
@@ -33,7 +33,14 @@ import (
)
// NewTestRouter returns a Router suitable for testing
+//
+// If the environment variable GTS_WEB_TEMPLATE_BASE_DIR set, it will take that
+// value as the template base directory instead.
func NewTestRouter(db db.DB) router.Router {
+ if alternativeTemplateBaseDir := os.Getenv("GTS_WEB_TEMPLATE_BASE_DIR"); alternativeTemplateBaseDir != "" {
+ viper.Set(config.Keys.WebTemplateBaseDir, alternativeTemplateBaseDir)
+ }
+
r, err := router.New(context.Background(), db)
if err != nil {
panic(err)
@@ -43,23 +50,24 @@ func NewTestRouter(db db.DB) router.Router {
// ConfigureTemplatesWithGin will panic on any errors related to template loading during tests
func ConfigureTemplatesWithGin(engine *gin.Engine) {
-
router.LoadTemplateFunctions(engine)
- // https://stackoverflow.com/questions/31873396/is-it-possible-to-get-the-current-root-of-package-structure-as-a-string-in-golan
- _, runtimeCallerLocation, _, _ := runtime.Caller(0)
- projectRoot, err := filepath.Abs(filepath.Join(filepath.Dir(runtimeCallerLocation), "../"))
- if err != nil {
- panic(err)
- }
-
templateBaseDir := viper.GetString(config.Keys.WebTemplateBaseDir)
- _, err = os.Stat(filepath.Join(projectRoot, templateBaseDir, "index.tmpl"))
- if err != nil {
- panic(fmt.Errorf("%s doesn't seem to contain the templates; index.tmpl is missing: %s", filepath.Join(projectRoot, templateBaseDir), err))
+ if !filepath.IsAbs(templateBaseDir) {
+ // https://stackoverflow.com/questions/31873396/is-it-possible-to-get-the-current-root-of-package-structure-as-a-string-in-golan
+ _, runtimeCallerLocation, _, _ := runtime.Caller(0)
+ projectRoot, err := filepath.Abs(filepath.Join(filepath.Dir(runtimeCallerLocation), "../"))
+ if err != nil {
+ panic(err)
+ }
+
+ templateBaseDir = filepath.Join(projectRoot, templateBaseDir)
+ }
+
+ if _, err := os.Stat(filepath.Join(templateBaseDir, "index.tmpl")); err != nil {
+ panic(fmt.Errorf("%s doesn't seem to contain the templates; index.tmpl is missing: %w", templateBaseDir, err))
}
- tmPath := filepath.Join(projectRoot, fmt.Sprintf("%s*", templateBaseDir))
- engine.LoadHTMLGlob(tmPath)
+ engine.LoadHTMLGlob(filepath.Join(templateBaseDir, "*"))
}