tpl/collections: Log an error on unsupported types in IsSet
authorCameron Moore <moorereason@gmail.com>
Thu, 18 May 2017 02:29:35 +0000 (21:29 -0500)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 18 May 2017 18:54:42 +0000 (21:54 +0300)
Unsupported types are currently silently ignored by IsSet.  An earlier
attempt was made to solve the issue by returning an error.  That attempt
was reverted since it broke some existing themes.

So instead, we'll log an error.  Hopefully, people will stop using IsSet
in this way, and we can eventually return an error outright.

Updates #3092

tpl/collections/collections.go
tpl/collections/collections_test.go

index 081515ae57f233bd3f92895aa1deebee1cf95c7f..f2816e4f180ecb8897778e35fd995dba02a05194 100644 (file)
@@ -370,6 +370,8 @@ func (ns *Namespace) IsSet(a interface{}, key interface{}) (bool, error) {
                if kv.Type() == av.Type().Key() {
                        return av.MapIndex(kv).IsValid(), nil
                }
+       default:
+               ns.deps.Log.ERROR.Printf("calling IsSet with unsupported type %T will always return false", a)
        }
 
        return false, nil
index 07055de8665b2e4f6e0170b08cc4b7350ade3c3a..6a3d7b9e477bbc0a843230bce4c681818b4cc003 100644 (file)
@@ -17,12 +17,20 @@ import (
        "errors"
        "fmt"
        "html/template"
+       "io/ioutil"
+       "log"
        "math/rand"
+       "os"
        "reflect"
        "testing"
        "time"
 
+       "github.com/spf13/hugo/config"
        "github.com/spf13/hugo/deps"
+       "github.com/spf13/hugo/helpers"
+       "github.com/spf13/hugo/hugofs"
+       jww "github.com/spf13/jwalterweatherman"
+       "github.com/spf13/viper"
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/require"
 )
@@ -320,7 +328,7 @@ func TestIntersect(t *testing.T) {
 func TestIsSet(t *testing.T) {
        t.Parallel()
 
-       ns := New(&deps.Deps{})
+       ns := New(newDeps(viper.New()))
 
        for i, test := range []struct {
                a      interface{}
@@ -336,6 +344,7 @@ func TestIsSet(t *testing.T) {
                {map[string]interface{}{"a": 1, "b": 2}, "bc", false, false, ""},
 
                {time.Now(), "Day", false, false, ""},
+               {nil, "nil", false, false, ""},
        } {
                errMsg := fmt.Sprintf("[%d] %v", i, test)
 
@@ -632,3 +641,14 @@ type TstX struct {
        A, B       string
        unexported string
 }
+
+func newDeps(cfg config.Provider) *deps.Deps {
+       l := helpers.NewLanguage("en", cfg)
+       l.Set("i18nDir", "i18n")
+       return &deps.Deps{
+               Cfg:         cfg,
+               Fs:          hugofs.NewMem(l),
+               ContentSpec: helpers.NewContentSpec(l),
+               Log:         jww.NewNotepad(jww.LevelError, jww.LevelError, os.Stdout, ioutil.Discard, "", log.Ldate|log.Ltime),
+       }
+}