hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit de87624241daa86660f205cc72a745409b9c9238
parent 9ef4dca361727a78e0f66f8f4e54c64e4c4781cb
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Mon,  5 Aug 2019 10:19:55 +0200

hugolib: Fix output format handling of mix cased page kinds

Fixes #4528

Diffstat:
Mhugolib/page_kinds.go | 16++++++++++++++++
Mhugolib/site_output.go | 7++++++-
Mhugolib/site_output_test.go | 68++++++++++++++++++++++++++++++++++++++++++++------------------------
Mresources/page/page_kinds.go | 15+++++++++++++++
Mresources/page/page_kinds_test.go | 6++++++
5 files changed, 87 insertions(+), 25 deletions(-)
diff --git a/hugolib/page_kinds.go b/hugolib/page_kinds.go
@@ -14,6 +14,8 @@
 package hugolib
 
 import (
+	"strings"
+
 	"github.com/gohugoio/hugo/resources/page"
 )
 
@@ -38,3 +40,17 @@ const (
 
 	pageResourceType = "page"
 )
+
+var kindMap = map[string]string{
+	strings.ToLower(kindRSS):       kindRSS,
+	strings.ToLower(kindSitemap):   kindSitemap,
+	strings.ToLower(kindRobotsTXT): kindRobotsTXT,
+	strings.ToLower(kind404):       kind404,
+}
+
+func getKind(s string) string {
+	if pkind := page.GetKind(s); pkind != "" {
+		return pkind
+	}
+	return kindMap[strings.ToLower(s)]
+}
diff --git a/hugolib/site_output.go b/hugolib/site_output.go
@@ -34,7 +34,7 @@ func createDefaultOutputFormats(allFormats output.Formats, cfg config.Provider) 
 		page.KindSection:      {htmlOut, rssOut},
 		page.KindTaxonomy:     {htmlOut, rssOut},
 		page.KindTaxonomyTerm: {htmlOut, rssOut},
-		// Below are for conistency. They are currently not used during rendering.
+		// Below are for consistency. They are currently not used during rendering.
 		kindRSS:       {rssOut},
 		kindSitemap:   {sitemapOut},
 		kindRobotsTXT: {robotsOut},
@@ -61,6 +61,11 @@ func createSiteOutputFormats(allFormats output.Formats, cfg config.Provider) (ma
 	seen := make(map[string]bool)
 
 	for k, v := range outputs {
+		k = getKind(k)
+		if k == "" {
+			// Invalid kind
+			continue
+		}
 		var formats output.Formats
 		vals := cast.ToStringSlice(v)
 		for _, format := range vals {
diff --git a/hugolib/site_output_test.go b/hugolib/site_output_test.go
@@ -327,33 +327,53 @@ baseName = "customdelimbase"
 }
 
 func TestCreateSiteOutputFormats(t *testing.T) {
-	assert := require.New(t)
 
-	outputsConfig := map[string]interface{}{
-		page.KindHome:    []string{"HTML", "JSON"},
-		page.KindSection: []string{"JSON"},
-	}
+	t.Run("Basic", func(t *testing.T) {
+		assert := require.New(t)
 
-	cfg := viper.New()
-	cfg.Set("outputs", outputsConfig)
+		outputsConfig := map[string]interface{}{
+			page.KindHome:    []string{"HTML", "JSON"},
+			page.KindSection: []string{"JSON"},
+		}
 
-	outputs, err := createSiteOutputFormats(output.DefaultFormats, cfg)
-	assert.NoError(err)
-	assert.Equal(output.Formats{output.JSONFormat}, outputs[page.KindSection])
-	assert.Equal(output.Formats{output.HTMLFormat, output.JSONFormat}, outputs[page.KindHome])
-
-	// Defaults
-	assert.Equal(output.Formats{output.HTMLFormat, output.RSSFormat}, outputs[page.KindTaxonomy])
-	assert.Equal(output.Formats{output.HTMLFormat, output.RSSFormat}, outputs[page.KindTaxonomyTerm])
-	assert.Equal(output.Formats{output.HTMLFormat}, outputs[page.KindPage])
-
-	// These aren't (currently) in use when rendering in Hugo,
-	// but the pages needs to be assigned an output format,
-	// so these should also be correct/sensible.
-	assert.Equal(output.Formats{output.RSSFormat}, outputs[kindRSS])
-	assert.Equal(output.Formats{output.SitemapFormat}, outputs[kindSitemap])
-	assert.Equal(output.Formats{output.RobotsTxtFormat}, outputs[kindRobotsTXT])
-	assert.Equal(output.Formats{output.HTMLFormat}, outputs[kind404])
+		cfg := viper.New()
+		cfg.Set("outputs", outputsConfig)
+
+		outputs, err := createSiteOutputFormats(output.DefaultFormats, cfg)
+		assert.NoError(err)
+		assert.Equal(output.Formats{output.JSONFormat}, outputs[page.KindSection])
+		assert.Equal(output.Formats{output.HTMLFormat, output.JSONFormat}, outputs[page.KindHome])
+
+		// Defaults
+		assert.Equal(output.Formats{output.HTMLFormat, output.RSSFormat}, outputs[page.KindTaxonomy])
+		assert.Equal(output.Formats{output.HTMLFormat, output.RSSFormat}, outputs[page.KindTaxonomyTerm])
+		assert.Equal(output.Formats{output.HTMLFormat}, outputs[page.KindPage])
+
+		// These aren't (currently) in use when rendering in Hugo,
+		// but the pages needs to be assigned an output format,
+		// so these should also be correct/sensible.
+		assert.Equal(output.Formats{output.RSSFormat}, outputs[kindRSS])
+		assert.Equal(output.Formats{output.SitemapFormat}, outputs[kindSitemap])
+		assert.Equal(output.Formats{output.RobotsTxtFormat}, outputs[kindRobotsTXT])
+		assert.Equal(output.Formats{output.HTMLFormat}, outputs[kind404])
+
+	})
+
+	// Issue #4528
+	t.Run("Mixed case", func(t *testing.T) {
+		assert := require.New(t)
+		cfg := viper.New()
+
+		outputsConfig := map[string]interface{}{
+			"taxonomyterm": []string{"JSON"},
+		}
+		cfg.Set("outputs", outputsConfig)
+
+		outputs, err := createSiteOutputFormats(output.DefaultFormats, cfg)
+		assert.NoError(err)
+		assert.Equal(output.Formats{output.JSONFormat}, outputs[page.KindTaxonomyTerm])
+
+	})
 
 }
 
diff --git a/resources/page/page_kinds.go b/resources/page/page_kinds.go
@@ -13,6 +13,8 @@
 
 package page
 
+import "strings"
+
 const (
 	KindPage = "page"
 
@@ -23,3 +25,16 @@ const (
 	KindTaxonomy     = "taxonomy"
 	KindTaxonomyTerm = "taxonomyTerm"
 )
+
+var kindMap = map[string]string{
+	strings.ToLower(KindPage):         KindPage,
+	strings.ToLower(KindHome):         KindHome,
+	strings.ToLower(KindSection):      KindSection,
+	strings.ToLower(KindTaxonomy):     KindTaxonomy,
+	strings.ToLower(KindTaxonomyTerm): KindTaxonomyTerm,
+}
+
+// GetKind gets the page kind given a string, empty if not found.
+func GetKind(s string) string {
+	return kindMap[strings.ToLower(s)]
+}
diff --git a/resources/page/page_kinds_test.go b/resources/page/page_kinds_test.go
@@ -28,4 +28,10 @@ func TestKind(t *testing.T) {
 	require.Equal(t, "taxonomy", KindTaxonomy)
 	require.Equal(t, "taxonomyTerm", KindTaxonomyTerm)
 
+	require.Equal(t, KindTaxonomyTerm, GetKind("TAXONOMYTERM"))
+	require.Equal(t, KindTaxonomy, GetKind("Taxonomy"))
+	require.Equal(t, KindPage, GetKind("Page"))
+	require.Equal(t, KindHome, GetKind("Home"))
+	require.Equal(t, KindSection, GetKind("SEction"))
+
 }