summaryrefslogtreecommitdiffstats
path: root/tpl
diff options
context:
space:
mode:
Diffstat (limited to 'tpl')
-rw-r--r--tpl/collections/apply.go2
-rw-r--r--tpl/collections/apply_test.go5
-rw-r--r--tpl/collections/collections.go7
-rw-r--r--tpl/collections/collections_test.go4
-rw-r--r--tpl/collections/integration_test.go7
-rw-r--r--tpl/collections/where.go4
-rw-r--r--tpl/data/data.go4
-rw-r--r--tpl/data/resources.go3
-rw-r--r--tpl/data/resources_test.go7
-rw-r--r--tpl/debug/integration_test.go4
-rw-r--r--tpl/diagrams/diagrams.go2
-rw-r--r--tpl/diagrams/goat.go2
-rw-r--r--tpl/diagrams/init.go2
-rw-r--r--tpl/fmt/integration_test.go3
-rw-r--r--tpl/images/integration_test.go2
-rw-r--r--tpl/internal/go_templates/staticcheck.conf1
-rw-r--r--tpl/internal/go_templates/texttemplate/hugo_template.go19
-rw-r--r--tpl/internal/go_templates/texttemplate/hugo_template_test.go4
-rw-r--r--tpl/internal/templatefuncsRegistry.go2
-rw-r--r--tpl/js/js.go1
-rw-r--r--tpl/lang/lang_test.go9
-rw-r--r--tpl/math/math_test.go4
-rw-r--r--tpl/openapi/openapi3/integration_test.go2
-rw-r--r--tpl/openapi/openapi3/openapi3.go28
-rw-r--r--tpl/os/integration_test.go2
-rw-r--r--tpl/page/init.go4
-rw-r--r--tpl/page/integration_test.go29
-rw-r--r--tpl/partials/integration_test.go5
-rw-r--r--tpl/partials/partials.go31
-rw-r--r--tpl/reflect/reflect_test.go2
-rw-r--r--tpl/resources/integration_test.go7
-rw-r--r--tpl/resources/resources.go16
-rw-r--r--tpl/safe/init.go5
-rw-r--r--tpl/safe/safe.go7
-rw-r--r--tpl/safe/safe_test.go27
-rw-r--r--tpl/site/init.go2
-rw-r--r--tpl/strings/strings.go12
-rw-r--r--tpl/template.go76
-rw-r--r--tpl/template_info.go14
-rw-r--r--tpl/template_test.go2
-rw-r--r--tpl/templates/integration_test.go2
-rw-r--r--tpl/time/init.go2
-rw-r--r--tpl/time/time.go42
-rw-r--r--tpl/tplimpl/template.go136
-rw-r--r--tpl/tplimpl/template_ast_transformers.go47
-rw-r--r--tpl/tplimpl/template_ast_transformers_test.go1
-rw-r--r--tpl/tplimpl/template_errors.go23
-rw-r--r--tpl/tplimpl/template_funcs.go70
-rw-r--r--tpl/transform/integration_test.go4
-rw-r--r--tpl/transform/transform.go22
-rw-r--r--tpl/transform/unmarshal.go43
-rw-r--r--tpl/transform/unmarshal_test.go9
52 files changed, 362 insertions, 408 deletions
diff --git a/tpl/collections/apply.go b/tpl/collections/apply.go
index 397ba0fdb..3d50395b9 100644
--- a/tpl/collections/apply.go
+++ b/tpl/collections/apply.go
@@ -67,7 +67,7 @@ func (ns *Namespace) Apply(ctx context.Context, c any, fname string, args ...any
func applyFnToThis(ctx context.Context, fn, this reflect.Value, args ...any) (reflect.Value, error) {
num := fn.Type().NumIn()
- if num > 0 && fn.Type().In(0).Implements(hreflect.ContextInterface) {
+ if num > 0 && hreflect.IsContextType(fn.Type().In(0)) {
args = append([]any{ctx}, args...)
}
diff --git a/tpl/collections/apply_test.go b/tpl/collections/apply_test.go
index aa39923b7..0a5764264 100644
--- a/tpl/collections/apply_test.go
+++ b/tpl/collections/apply_test.go
@@ -22,6 +22,7 @@ import (
qt "github.com/frankban/quicktest"
"github.com/gohugoio/hugo/config/testconfig"
+ "github.com/gohugoio/hugo/identity"
"github.com/gohugoio/hugo/output"
"github.com/gohugoio/hugo/output/layouts"
"github.com/gohugoio/hugo/tpl"
@@ -29,6 +30,10 @@ import (
type templateFinder int
+func (templateFinder) GetIdentity(string) (identity.Identity, bool) {
+ return identity.StringIdentity("test"), true
+}
+
func (templateFinder) Lookup(name string) (tpl.Template, bool) {
return nil, false
}
diff --git a/tpl/collections/collections.go b/tpl/collections/collections.go
index e34753f17..61fd138e9 100644
--- a/tpl/collections/collections.go
+++ b/tpl/collections/collections.go
@@ -35,11 +35,6 @@ import (
"github.com/spf13/cast"
)
-func init() {
- // htime.Now cannot be used here
- rand.Seed(time.Now().UTC().UnixNano())
-}
-
// New returns a new instance of the collections-namespaced template functions.
func New(deps *deps.Deps) *Namespace {
language := deps.Conf.Language()
@@ -149,7 +144,7 @@ func (ns *Namespace) Delimit(ctx context.Context, l, sep any, last ...any) (stri
}
default:
- return "", fmt.Errorf("can't iterate over %v", l)
+ return "", fmt.Errorf("can't iterate over %T", l)
}
return str, nil
diff --git a/tpl/collections/collections_test.go b/tpl/collections/collections_test.go
index dcdd3bd5c..7dd518759 100644
--- a/tpl/collections/collections_test.go
+++ b/tpl/collections/collections_test.go
@@ -699,7 +699,6 @@ func TestShuffleRandomising(t *testing.T) {
// of the sequence happens to be the same as the original sequence. However
// the probability of the event is 10^-158 which is negligible.
seqLen := 100
- rand.Seed(time.Now().UTC().UnixNano())
for _, test := range []struct {
seq []int
@@ -895,6 +894,7 @@ func (x TstX) TstRv2() string {
return "r" + x.B
}
+//lint:ignore U1000 reflect test
func (x TstX) unexportedMethod() string {
return x.unexported
}
@@ -923,7 +923,7 @@ func (x TstX) String() string {
type TstX struct {
A, B string
- unexported string
+ unexported string //lint:ignore U1000 reflect test
}
type TstParams struct {
diff --git a/tpl/collections/integration_test.go b/tpl/collections/integration_test.go
index a443755f8..24727a12c 100644
--- a/tpl/collections/integration_test.go
+++ b/tpl/collections/integration_test.go
@@ -1,4 +1,4 @@
-// Copyright 2022 The Hugo Authors. All rights reserved.
+// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -97,11 +97,9 @@ func TestAppendSliceToASliceOfSlices(t *testing.T) {
).Build()
b.AssertFileContent("public/index.html", "[[a] [b] [c]]")
-
}
func TestAppendNilToSlice(t *testing.T) {
-
t.Parallel()
files := `
@@ -123,11 +121,9 @@ func TestAppendNilToSlice(t *testing.T) {
).Build()
b.AssertFileContent("public/index.html", "[a <nil>]")
-
}
func TestAppendNilsToSliceWithNils(t *testing.T) {
-
t.Parallel()
files := `
@@ -153,7 +149,6 @@ func TestAppendNilsToSliceWithNils(t *testing.T) {
b.AssertFileContent("public/index.html", "[a <nil> c <nil>]")
}
-
}
// Issue 11234.
diff --git a/tpl/collections/where.go b/tpl/collections/where.go
index 07c2d3deb..bf3f75044 100644
--- a/tpl/collections/where.go
+++ b/tpl/collections/where.go
@@ -51,7 +51,7 @@ func (ns *Namespace) Where(ctx context.Context, c, key any, args ...any) (any, e
case reflect.Map:
return ns.checkWhereMap(ctxv, seqv, kv, mv, path, op)
default:
- return nil, fmt.Errorf("can't iterate over %v", c)
+ return nil, fmt.Errorf("can't iterate over %T", c)
}
}
@@ -320,7 +320,7 @@ func evaluateSubElem(ctx, obj reflect.Value, elemName string) (reflect.Value, er
mt := objPtr.Type().Method(index)
num := mt.Type.NumIn()
maxNumIn := 1
- if num > 1 && mt.Type.In(1).Implements(hreflect.ContextInterface) {
+ if num > 1 && hreflect.IsContextType(mt.Type.In(1)) {
args = []reflect.Value{ctx}
maxNumIn = 2
}
diff --git a/tpl/data/data.go b/tpl/data/data.go
index 380c25685..b6b0515e8 100644
--- a/tpl/data/data.go
+++ b/tpl/data/data.go
@@ -24,6 +24,7 @@ import (
"net/http"
"strings"
+ "github.com/gohugoio/hugo/cache/filecache"
"github.com/gohugoio/hugo/common/maps"
"github.com/gohugoio/hugo/config/security"
@@ -33,7 +34,6 @@ import (
"github.com/spf13/cast"
- "github.com/gohugoio/hugo/cache/filecache"
"github.com/gohugoio/hugo/deps"
)
@@ -108,7 +108,7 @@ func (ns *Namespace) GetJSON(args ...any) (any, error) {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
- return nil, fmt.Errorf("Failed to create request for getJSON resource %s: %w", url, err)
+ return nil, fmt.Errorf("failed to create request for getJSON resource %s: %w", url, err)
}
unmarshal := func(b []byte) (bool, error) {
diff --git a/tpl/data/resources.go b/tpl/data/resources.go
index 45764dae7..3a3701d60 100644
--- a/tpl/data/resources.go
+++ b/tpl/data/resources.go
@@ -23,7 +23,6 @@ import (
"time"
"github.com/gohugoio/hugo/cache/filecache"
-
"github.com/gohugoio/hugo/helpers"
"github.com/spf13/afero"
)
@@ -68,7 +67,7 @@ func (ns *Namespace) getRemote(cache *filecache.Cache, unmarshal func([]byte) (b
res.Body.Close()
if isHTTPError(res) {
- return nil, fmt.Errorf("Failed to retrieve remote file: %s, body: %q", http.StatusText(res.StatusCode), b)
+ return nil, fmt.Errorf("failed to retrieve remote file: %s, body: %q", http.StatusText(res.StatusCode), b)
}
retry, err = unmarshal(b)
diff --git a/tpl/data/resources_test.go b/tpl/data/resources_test.go
index d452a2a43..b8003bf43 100644
--- a/tpl/data/resources_test.go
+++ b/tpl/data/resources_test.go
@@ -15,9 +15,6 @@ package data
import (
"bytes"
-
- "github.com/gohugoio/hugo/common/loggers"
-
"net/http"
"net/http/httptest"
"net/url"
@@ -26,12 +23,14 @@ import (
"testing"
"time"
+ "github.com/gohugoio/hugo/cache/filecache"
+ "github.com/gohugoio/hugo/common/loggers"
+
"github.com/gohugoio/hugo/config/testconfig"
"github.com/gohugoio/hugo/helpers"
qt "github.com/frankban/quicktest"
- "github.com/gohugoio/hugo/cache/filecache"
"github.com/gohugoio/hugo/config"
"github.com/gohugoio/hugo/deps"
"github.com/gohugoio/hugo/hugofs"
diff --git a/tpl/debug/integration_test.go b/tpl/debug/integration_test.go
index 3d120580d..9a36e2d12 100644
--- a/tpl/debug/integration_test.go
+++ b/tpl/debug/integration_test.go
@@ -1,4 +1,4 @@
-// Copyright 2023 The Hugo Authors. All rights reserved.
+// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -41,5 +41,5 @@ disableKinds = ["taxonomy", "term"]
},
).Build()
- b.AssertLogContains("imer: name \"foo\" count '\\x05' duration")
+ b.AssertLogContains("timer: name foo count 5 duration")
}
diff --git a/tpl/diagrams/diagrams.go b/tpl/diagrams/diagrams.go
index dfa29a978..6a58bcfe4 100644
--- a/tpl/diagrams/diagrams.go
+++ b/tpl/diagrams/diagrams.go
@@ -1,4 +1,4 @@
-// Copyright 2022 The Hugo Authors. All rights reserved.
+// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
diff --git a/tpl/diagrams/goat.go b/tpl/diagrams/goat.go
index f3d4f4bfb..fe156f1e8 100644
--- a/tpl/diagrams/goat.go
+++ b/tpl/diagrams/goat.go
@@ -1,4 +1,4 @@
-// Copyright 2022 The Hugo Authors. All rights reserved.
+// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
diff --git a/tpl/diagrams/init.go b/tpl/diagrams/init.go
index e6356ce9c..0cbec7e1b 100644
--- a/tpl/diagrams/init.go
+++ b/tpl/diagrams/init.go
@@ -1,4 +1,4 @@
-// Copyright 2022 The Hugo Authors. All rights reserved.
+// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
diff --git a/tpl/fmt/integration_test.go b/tpl/fmt/integration_test.go
index 5010fa90e..40bfefcdc 100644
--- a/tpl/fmt/integration_test.go
+++ b/tpl/fmt/integration_test.go
@@ -1,4 +1,4 @@
-// Copyright 2023 The Hugo Authors. All rights reserved.
+// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -41,5 +41,4 @@ ignoreErrors = ['error-b']
b.BuildE()
b.AssertLogMatches(`^ERROR a\nYou can suppress this error by adding the following to your site configuration:\nignoreErrors = \['error-a'\]\n$`)
-
}
diff --git a/tpl/images/integration_test.go b/tpl/images/integration_test.go
index ad810ad92..81f35e39c 100644
--- a/tpl/images/integration_test.go
+++ b/tpl/images/integration_test.go
@@ -1,4 +1,4 @@
-// Copyright 2023 The Hugo Authors. All rights reserved.
+// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
diff --git a/tpl/internal/go_templates/staticcheck.conf b/tpl/internal/go_templates/staticcheck.conf
new file mode 100644
index 000000000..9cf5a78a4
--- /dev/null
+++ b/tpl/internal/go_templates/staticcheck.conf
@@ -0,0 +1 @@
+checks = ["none"] \ No newline at end of file
diff --git a/tpl/internal/go_templates/texttemplate/hugo_template.go b/tpl/internal/go_templates/texttemplate/hugo_template.go
index 78be55e18..4db40ce82 100644
--- a/tpl/internal/go_templates/texttemplate/hugo_template.go
+++ b/tpl/internal/go_templates/texttemplate/hugo_template.go
@@ -1,4 +1,4 @@
-// Copyright 2022 The Hugo Authors. All rights reserved.
+// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -59,23 +59,6 @@ func NewExecuter(helper ExecHelper) Executer {
return &executer{helper: helper}
}
-type (
- pageContextKeyType string
- hasLockContextKeyType string
- stackContextKeyType string
- callbackContextKeyType string
-)
-
-const (
- // The data page passed to ExecuteWithContext gets stored with this key.
- PageContextKey = pageContextKeyType("page")
- // Used in partialCached to signal to nested templates that a lock is already taken.
- HasLockContextKey = hasLockContextKeyType("hasLock")
-
- // Used to pass down a callback function to nested templates.
- CallbackContextKey = callbackContextKeyType("callback")
-)
-
// Note: The context is currently not fully implemented in Hugo. This is a work in progress.
func (t *executer) ExecuteWithContext(ctx context.Context, p Preparer, wr io.Writer, data any) error {
if ctx == nil {
diff --git a/tpl/internal/go_templates/texttemplate/hugo_template_test.go b/tpl/internal/go_templates/texttemplate/hugo_template_test.go
index cc88151e3..c68b747dd 100644
--- a/tpl/internal/go_templates/texttemplate/hugo_template_test.go
+++ b/tpl/internal/go_templates/texttemplate/hugo_template_test.go
@@ -1,4 +1,4 @@
-// Copyright 2022 The Hugo Authors. All rights reserved.
+// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@ func (e *execHelper) GetMapValue(ctx context.Context, tmpl Preparer, m, key refl
return m.MapIndex(key), true
}
-func (e *execHelper) GetMethod(ctx context.Context, tmpl Preparer, receiver reflect.Value, name string) (method reflect.Value, firstArg reflect.Value) {
+func (e *execHelper) GetMethod(ctx context.Context, tmpl Preparer, receiver reflect.Value, name string) (reflect.Value, reflect.Value) {
if name != "Hello1" {
return zero, zero
}
diff --git a/tpl/internal/templatefuncsRegistry.go b/tpl/internal/templatefuncsRegistry.go
index c1b01f5a5..fc02a6ef9 100644
--- a/tpl/internal/templatefuncsRegistry.go
+++ b/tpl/internal/templatefuncsRegistry.go
@@ -170,7 +170,7 @@ func (namespaces TemplateFuncsNamespaces) MarshalJSON() ([]byte, error) {
for i, ns := range namespaces {
- b, err := ns.toJSON(context.TODO())
+ b, err := ns.toJSON(context.Background())
if err != nil {
return nil, err
}
diff --git a/tpl/js/js.go b/tpl/js/js.go
index bb8d20966..63a676532 100644
--- a/tpl/js/js.go
+++ b/tpl/js/js.go
@@ -34,7 +34,6 @@ func New(deps *deps.Deps) *Namespace {
// Namespace provides template functions for the "js" namespace.
type Namespace struct {
- deps *deps.Deps
client *js.Client
}
diff --git a/tpl/lang/lang_test.go b/tpl/lang/lang_test.go
index 8d5430f6f..6ec40cab3 100644
--- a/tpl/lang/lang_test.go
+++ b/tpl/lang/lang_test.go
@@ -41,8 +41,8 @@ func TestNumFmt(t *testing.T) {
{6, -12345.6789, "-|,| ", "|", "-12 345,678900"},
// Arabic, ar_AE
- {6, -12345.6789, "‏- ٫ ٬", "", "‏-12٬345٫678900"},
- {6, -12345.6789, "‏-|٫| ", "|", "‏-12 345٫678900"},
+ {6, -12345.6789, "\u200f- ٫ ٬", "", "\u200f-12٬345٫678900"},
+ {6, -12345.6789, "\u200f-|٫| ", "|", "\u200f-12 345٫678900"},
}
for _, cas := range cases {
@@ -65,7 +65,6 @@ func TestNumFmt(t *testing.T) {
}
func TestFormatNumbers(t *testing.T) {
-
c := qt.New(t)
nsNn := New(&deps.Deps{}, translators.GetTranslator("nn"))
@@ -103,12 +102,10 @@ func TestFormatNumbers(t *testing.T) {
c.Assert(err, qt.IsNil)
c.Assert(got, qt.Equals, "$20,000.00")
})
-
}
// Issue 9446
func TestLanguageKeyFormat(t *testing.T) {
-
c := qt.New(t)
nsUnderscoreUpper := New(&deps.Deps{}, translators.GetTranslator("es_ES"))
@@ -134,7 +131,5 @@ func TestLanguageKeyFormat(t *testing.T) {
got, err = nsHyphenLower.FormatNumber(3, pi)
c.Assert(err, qt.IsNil)
c.Assert(got, qt.Equals, "3,142")
-
})
-
}
diff --git a/tpl/math/math_test.go b/tpl/math/math_test.go
index 5b54b6ac8..4cde3fb85 100644
--- a/tpl/math/math_test.go
+++ b/tpl/math/math_test.go
@@ -335,7 +335,7 @@ func TestRound(t *testing.T) {
{0.5, 1.0},
{1.1, 1.0},
{1.5, 2.0},
- {-0.1, -0.0},
+ {-0.1, 0.0},
{-0.5, -1.0},
{-1.1, -1.0},
{-1.5, -2.0},
@@ -524,7 +524,6 @@ func TestSum(t *testing.T) {
_, err := ns.Sum()
c.Assert(err, qt.Not(qt.IsNil))
-
}
func TestProduct(t *testing.T) {
@@ -547,5 +546,4 @@ func TestProduct(t *testing.T) {
_, err := ns.Product()
c.Assert(err, qt.Not(qt.IsNil))
-
}
diff --git a/tpl/openapi/openapi3/integration_test.go b/tpl/openapi/openapi3/integration_test.go
index d3be0eda9..6914a60b3 100644
--- a/tpl/openapi/openapi3/integration_test.go
+++ b/tpl/openapi/openapi3/integration_test.go
@@ -67,7 +67,7 @@ API: {{ $api.Info.Title | safeHTML }}
b.AssertFileContent("public/index.html", `API: Sample API`)
b.
- EditFileReplace("assets/api/myapi.yaml", func(s string) string { return strings.ReplaceAll(s, "Sample API", "Hugo API") }).
+ EditFileReplaceFunc("assets/api/myapi.yaml", func(s string) string { return strings.ReplaceAll(s, "Sample API", "Hugo API") }).
Build()
b.AssertFileContent("public/index.html", `API: Hugo API`)
diff --git a/tpl/openapi/openapi3/openapi3.go b/tpl/openapi/openapi3/openapi3.go
index 38857dd98..f929c7f62 100644
--- a/tpl/openapi/openapi3/openapi3.go
+++ b/tpl/openapi/openapi3/openapi3.go
@@ -15,44 +15,42 @@
package openapi3
import (
+ "errors"
"fmt"
"io"
gyaml "github.com/ghodss/yaml"
- "errors"
-
kopenapi3 "github.com/getkin/kin-openapi/openapi3"
- "github.com/gohugoio/hugo/cache/namedmemcache"
+ "github.com/gohugoio/hugo/cache/dynacache"