Skip to content

Commit

Permalink
hugolib: Fix output format handling of mix cased page kinds
Browse files Browse the repository at this point in the history
  • Loading branch information
bep committed Aug 5, 2019
1 parent 9ef4dca commit de87624
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 25 deletions.
16 changes: 16 additions & 0 deletions hugolib/page_kinds.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
package hugolib

import (
"strings"

"github.com/gohugoio/hugo/resources/page"
)

Expand All @@ -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)]
}
7 changes: 6 additions & 1 deletion hugolib/site_output.go
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand All @@ -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 {
Expand Down
68 changes: 44 additions & 24 deletions hugolib/site_output_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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])

})

}

Expand Down
15 changes: 15 additions & 0 deletions resources/page/page_kinds.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

package page

import "strings"

const (
KindPage = "page"

Expand All @@ -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)]
}
6 changes: 6 additions & 0 deletions resources/page/page_kinds_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"))

}

0 comments on commit de87624

Please sign in to comment.