mirror of
https://github.com/gohugoio/hugo.git
synced 2025-04-28 22:50:35 +03:00
Create a struct with all of Hugo's config options
Primary motivation is documentation, but it will also hopefully simplify the code. Also, * Lower case the default output format names; this is in line with the custom ones (map keys) and how it's treated all the places. This avoids doing `stringds.EqualFold` everywhere. Closes #10896 Closes #10620
This commit is contained in:
parent
6aededf6b4
commit
241b21b0fd
337 changed files with 13377 additions and 14898 deletions
|
@ -1,4 +1,4 @@
|
|||
// Copyright 2018 The Hugo Authors. All rights reserved.
|
||||
// Copyright 2023 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.
|
||||
|
@ -13,140 +13,43 @@
|
|||
|
||||
package hugolib
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
import "testing"
|
||||
|
||||
"github.com/gohugoio/hugo/common/herrors"
|
||||
func TestConfigDir(t *testing.T) {
|
||||
|
||||
qt "github.com/frankban/quicktest"
|
||||
"github.com/gohugoio/hugo/htesting"
|
||||
"github.com/spf13/afero"
|
||||
)
|
||||
|
||||
func TestLoadConfigDir(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
c := qt.New(t)
|
||||
|
||||
configContent := `
|
||||
baseURL = "https://example.org"
|
||||
paginagePath = "pag_root"
|
||||
|
||||
[languages.en]
|
||||
weight = 0
|
||||
languageName = "English"
|
||||
|
||||
[languages.no]
|
||||
weight = 10
|
||||
languageName = "FOO"
|
||||
|
||||
files := `
|
||||
-- config/_default/params.toml --
|
||||
a = "acp1"
|
||||
d = "dcp1"
|
||||
-- config/_default/config.toml --
|
||||
[params]
|
||||
p1 = "p1_base"
|
||||
a = "ac1"
|
||||
b = "bc1"
|
||||
|
||||
-- hugo.toml --
|
||||
baseURL = "https://example.com"
|
||||
disableKinds = ["taxonomy", "term", "RSS", "sitemap", "robotsTXT", "page", "setion"]
|
||||
ignoreErrors = ["error-missing-instagram-accesstoken"]
|
||||
[params]
|
||||
a = "a1"
|
||||
b = "b1"
|
||||
c = "c1"
|
||||
-- layouts/index.html --
|
||||
Params: {{ site.Params}}
|
||||
`
|
||||
b := NewIntegrationTestBuilder(
|
||||
IntegrationTestConfig{
|
||||
T: t,
|
||||
TxtarString: files,
|
||||
},
|
||||
).Build()
|
||||
|
||||
mm := afero.NewMemMapFs()
|
||||
b.AssertFileContent("public/index.html", `
|
||||
Params: map[a:acp1 b:bc1 c:c1 d:dcp1]
|
||||
|
||||
writeToFs(t, mm, "hugo.toml", configContent)
|
||||
|
||||
fb := htesting.NewTestdataBuilder(mm, "config/_default", t)
|
||||
|
||||
fb.Add("config.toml", `paginatePath = "pag_default"`)
|
||||
|
||||
fb.Add("params.yaml", `
|
||||
p2: "p2params_default"
|
||||
p3: "p3params_default"
|
||||
p4: "p4params_default"
|
||||
`)
|
||||
fb.Add("menus.toml", `
|
||||
[[docs]]
|
||||
name = "About Hugo"
|
||||
weight = 1
|
||||
[[docs]]
|
||||
name = "Home"
|
||||
weight = 2
|
||||
`)
|
||||
|
||||
fb.Add("menus.no.toml", `
|
||||
[[docs]]
|
||||
name = "Om Hugo"
|
||||
weight = 1
|
||||
`)
|
||||
|
||||
fb.Add("params.no.toml",
|
||||
`
|
||||
p3 = "p3params_no_default"
|
||||
p4 = "p4params_no_default"`,
|
||||
)
|
||||
fb.Add("languages.no.toml", `languageName = "Norsk_no_default"`)
|
||||
|
||||
fb.Build()
|
||||
|
||||
fb = fb.WithWorkingDir("config/production")
|
||||
|
||||
fb.Add("config.toml", `paginatePath = "pag_production"`)
|
||||
|
||||
fb.Add("params.no.toml", `
|
||||
p2 = "p2params_no_production"
|
||||
p3 = "p3params_no_production"
|
||||
`)
|
||||
|
||||
fb.Build()
|
||||
|
||||
fb = fb.WithWorkingDir("config/development")
|
||||
|
||||
// This is set in all the config.toml variants above, but this will win.
|
||||
fb.Add("config.TOML", `paginatePath = "pag_development"`)
|
||||
// Issue #5646
|
||||
fb.Add("config.toml.swp", `p3 = "paginatePath = "nono"`)
|
||||
|
||||
fb.Add("params.no.toml", `p3 = "p3params_no_development"`)
|
||||
fb.Add("params.toml", `p3 = "p3params_development"`)
|
||||
|
||||
fb.Build()
|
||||
|
||||
cfg, _, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Environment: "development", Filename: "hugo.toml", AbsConfigDir: "config"})
|
||||
c.Assert(err, qt.IsNil)
|
||||
|
||||
c.Assert(cfg.GetString("paginatePath"), qt.Equals, "pag_development") // /config/development/config.toml
|
||||
|
||||
c.Assert(cfg.GetInt("languages.no.weight"), qt.Equals, 10) // /config.toml
|
||||
c.Assert(cfg.GetString("languages.no.languageName"), qt.Equals, "Norsk_no_default") // /config/_default/languages.no.toml
|
||||
|
||||
c.Assert(cfg.GetString("params.p1"), qt.Equals, "p1_base")
|
||||
c.Assert(cfg.GetString("params.p2"), qt.Equals, "p2params_default") // Is in both _default and production
|
||||
c.Assert(cfg.GetString("params.p3"), qt.Equals, "p3params_development")
|
||||
c.Assert(cfg.GetString("languages.no.params.p3"), qt.Equals, "p3params_no_development")
|
||||
|
||||
c.Assert(len(cfg.Get("menus.docs").([]any)), qt.Equals, 2)
|
||||
noMenus := cfg.Get("languages.no.menus.docs")
|
||||
c.Assert(noMenus, qt.Not(qt.IsNil))
|
||||
c.Assert(len(noMenus.([]any)), qt.Equals, 1)
|
||||
}
|
||||
|
||||
func TestLoadConfigDirError(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
c := qt.New(t)
|
||||
|
||||
configContent := `
|
||||
baseURL = "https://example.org"
|
||||
|
||||
`
|
||||
|
||||
mm := afero.NewMemMapFs()
|
||||
|
||||
writeToFs(t, mm, "hugo.toml", configContent)
|
||||
|
||||
fb := htesting.NewTestdataBuilder(mm, "config/development", t)
|
||||
|
||||
fb.Add("config.toml", `invalid & syntax`).Build()
|
||||
|
||||
_, _, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Environment: "development", Filename: "hugo.toml", AbsConfigDir: "config"})
|
||||
c.Assert(err, qt.Not(qt.IsNil))
|
||||
|
||||
fe := herrors.UnwrapFileError(err)
|
||||
c.Assert(fe, qt.Not(qt.IsNil))
|
||||
c.Assert(fe.Position().Filename, qt.Equals, filepath.FromSlash("config/development/config.toml"))
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue