b.Assert(err, qt.Not(qt.IsNil))
b.Assert(err.Error(), qt.Contains, `failed to load config: invalid timeZone for language "en": unknown time zone America/LosAngeles`)
}
+
+// Issue 8835
+func TestTimeOnError(t *testing.T) {
+ b := newTestSitesBuilder(t)
+
+ b.WithTemplates("index.html", `time: {{ time "2020-10-20" "invalid-timezone" }}`)
+ b.WithContent("p1.md", "")
+
+ b.Assert(b.BuildE(BuildCfg{}), qt.Not(qt.IsNil))
+
+}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.ToInt,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.After,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Default,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.MD5,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.GetCSV,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Dump,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Base64Decode,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Print,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return h },
+ Context: func(args ...interface{}) (interface{}, error) { return h, nil },
}
// We just add the Hugo struct as the namespace here. No method mappings.
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, s.Hugo())
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, s.Hugo())
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Config,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Humanize,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
Name string
// This is the method receiver.
- Context func(v ...interface{}) interface{}
+ Context func(v ...interface{}) (interface{}, error)
// Additional info, aliases and examples, per method name.
MethodMappings map[string]TemplateFuncMethodMapping
buf.WriteString(fmt.Sprintf(`%q: {`, t.Name))
- ctx := t.Context()
+ ctx, err := t.Context()
+ if err != nil {
+ return nil, err
+ }
ctxType := reflect.TypeOf(ctx)
for i := 0; i < ctxType.NumMethod(); i++ {
method := ctxType.Method(i)
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
return ns
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Translate,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Add,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Unmarshal,
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Getenv,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Include,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Split,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.IsMap,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Get,
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.CSS,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
s := d.Site
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return s },
+ Context: func(args ...interface{}) (interface{}, error) { return s, nil },
}
if s == nil {
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, s)
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, s)
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Chomp,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Exists,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
package time
import (
+ "errors"
+
"github.com/gohugoio/hugo/deps"
"github.com/gohugoio/hugo/langs"
"github.com/gohugoio/hugo/tpl/internal"
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} {
+ Context: func(args ...interface{}) (interface{}, error) {
// Handle overlapping "time" namespace and func.
//
// If no args are passed to `time`, assume namespace usage and
switch len(args) {
case 0:
- return ctx
+ return ctx, nil
case 1:
- t, err := ctx.AsTime(args[0])
- if err != nil {
- return err
- }
- return t
+ return ctx.AsTime(args[0])
case 2:
- t, err := ctx.AsTime(args[0], args[1])
- if err != nil {
- return err
- }
- return t
+ return ctx.AsTime(args[0], args[1])
// 3 or more arguments. Currently not supported.
default:
- return "Invalid arguments supplied to `time`. Refer to time documentation: https://gohugo.io/functions/time/"
+ return nil, errors.New("Invalid arguments supplied to `time`. Refer to time documentation: https://gohugo.io/functions/time/")
}
},
}
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.Emojify,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
}
ns := &internal.TemplateFuncsNamespace{
Name: name,
- Context: func(args ...interface{}) interface{} { return ctx },
+ Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
}
ns.AddMethodMapping(ctx.AbsURL,
}
c.Assert(found, qt.Equals, true)
- c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+ ctx, err := ns.Context()
+ c.Assert(err, qt.IsNil)
+ c.Assert(ctx, hqt.IsSameType, &Namespace{})
+
}