parser: Add WARNING for integer YAML keys
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 12 Feb 2018 17:47:25 +0000 (18:47 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 12 Feb 2018 18:16:12 +0000 (19:16 +0100)
```bash
benchmark                                               old ns/op     new ns/op     delta
BenchmarkStringifyMapKeysStringsOnlyInterfaceMaps-4     3053          2015          -34.00%
BenchmarkStringifyMapKeysStringsOnlyStringMaps-4        5.23          5.18          -0.96%
BenchmarkStringifyMapKeysIntegers-4                     2320          5177          +123.15%

benchmark                                               old allocs     new allocs     delta
BenchmarkStringifyMapKeysStringsOnlyInterfaceMaps-4     6              6              +0.00%
BenchmarkStringifyMapKeysStringsOnlyStringMaps-4        0              0              +0.00%
BenchmarkStringifyMapKeysIntegers-4                     6              14             +133.33%

benchmark                                               old bytes     new bytes     delta
BenchmarkStringifyMapKeysStringsOnlyInterfaceMaps-4     1008          1008          +0.00%
BenchmarkStringifyMapKeysStringsOnlyStringMaps-4        0             0             +0.00%
BenchmarkStringifyMapKeysIntegers-4                     1008          1776          +76.19%
```
Closes #4393

parser/frontmatter.go

index 664cb6d5ca4c48fbf39681868b009e3fb8732a12..3716dc112ab0b83b708a7c150f7bd19c83311ee7 100644 (file)
@@ -23,6 +23,8 @@ import (
        "io"
        "strings"
 
+       "github.com/gohugoio/hugo/helpers"
+
        "github.com/spf13/cast"
 
        "github.com/BurntSushi/toml"
@@ -256,10 +258,20 @@ func stringifyMapKeys(in interface{}) (interface{}, bool) {
                }
        case map[interface{}]interface{}:
                res := make(map[string]interface{})
+               var (
+                       ok  bool
+                       err error
+               )
                for k, v := range in {
-                       ks, err := cast.ToStringE(k)
-                       if err != nil {
-                               ks = fmt.Sprintf("%v", k)
+                       var ks string
+
+                       if ks, ok = k.(string); !ok {
+                               ks, err = cast.ToStringE(k)
+                               if err != nil {
+                                       ks = fmt.Sprintf("%v", k)
+                               }
+                               // TODO(bep) added in Hugo 0.37, remove some time in the future.
+                               helpers.DistinctFeedbackLog.Printf("WARNING: YAML data/frontmatter with keys of type %T is since Hugo 0.37 converted to strings", k)
                        }
                        if vv, replaced := stringifyMapKeys(v); replaced {
                                res[ks] = vv