hugolib: Add ConfigSourceDescriptor
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 18 Mar 2018 09:32:29 +0000 (10:32 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 20 Mar 2018 20:30:43 +0000 (21:30 +0100)
To prepare for config in themes

See #4490

commands/hugo.go
hugolib/case_insensitive_test.go
hugolib/config.go
hugolib/config_test.go
hugolib/disableKinds_test.go
hugolib/testhelpers_test.go

index 60244b099362504f4cd5f6a5420196b772cacfcd..b041fad38307a4e724f44766c29caaed3eaa1711 100644 (file)
@@ -306,7 +306,7 @@ func InitializeConfig(running bool, doWithCommandeer func(c *commandeer) error,
        // Init file systems. This may be changed at a later point.
        osFs := hugofs.Os
 
-       config, err := hugolib.LoadConfig(osFs, source, cfgFile)
+       config, err := hugolib.LoadConfig(hugolib.ConfigSourceDescriptor{Fs: osFs, Src: source, Name: cfgFile})
        if err != nil {
                return nil, err
        }
index ca63196b3a2b684c81554fd1c25b2b760e3a8c1b..680a701aa8d1575432522a4ad9b6764f177ddd00 100644 (file)
@@ -149,7 +149,7 @@ func TestCaseInsensitiveConfigurationVariations(t *testing.T) {
 
        caseMixingTestsWriteCommonSources(t, mm)
 
-       cfg, err := LoadConfig(mm, "", "config.toml")
+       cfg, err := LoadConfig(ConfigSourceDescriptor{Fs: mm})
        require.NoError(t, err)
 
        fs := hugofs.NewFrom(mm, cfg)
@@ -260,7 +260,7 @@ func doTestCaseInsensitiveConfigurationForTemplateEngine(t *testing.T, suffix st
 
        caseMixingTestsWriteCommonSources(t, mm)
 
-       cfg, err := LoadConfig(mm, "", "config.toml")
+       cfg, err := LoadConfigDefault(mm)
        require.NoError(t, err)
 
        fs := hugofs.NewFrom(mm, cfg)
index 678ebf669214250c1fe40d22c1f678b69b9ee3bd..e47e65435b1c11a4e995c477e5a11316af5cdceb 100644 (file)
@@ -26,24 +26,43 @@ import (
        "github.com/spf13/viper"
 )
 
+// ConfigSourceDescriptor describes where to find the config (e.g. config.toml etc.).
+type ConfigSourceDescriptor struct {
+       Fs   afero.Fs
+       Src  string
+       Name string
+}
+
+func (d ConfigSourceDescriptor) configFilenames() []string {
+       return strings.Split(d.Name, ",")
+}
+
+// LoadConfigDefault is a convenience method to load the default "config.toml" config.
+func LoadConfigDefault(fs afero.Fs) (*viper.Viper, error) {
+       return LoadConfig(ConfigSourceDescriptor{Fs: fs, Name: "config.toml"})
+}
+
 // LoadConfig loads Hugo configuration into a new Viper and then adds
 // a set of defaults.
-func LoadConfig(fs afero.Fs, relativeSourcePath, configFilename string) (*viper.Viper, error) {
+func LoadConfig(d ConfigSourceDescriptor) (*viper.Viper, error) {
+       fs := d.Fs
        v := viper.New()
        v.SetFs(fs)
-       if relativeSourcePath == "" {
-               relativeSourcePath = "."
+
+       if d.Name == "" {
+               d.Name = "config.toml"
+       }
+
+       if d.Src == "" {
+               d.Src = "."
        }
-       configFilenames := strings.Split(configFilename, ",")
+
+       configFilenames := d.configFilenames()
        v.AutomaticEnv()
        v.SetEnvPrefix("hugo")
        v.SetConfigFile(configFilenames[0])
-       // See https://github.com/spf13/viper/issues/73#issuecomment-126970794
-       if relativeSourcePath == "" {
-               v.AddConfigPath(".")
-       } else {
-               v.AddConfigPath(relativeSourcePath)
-       }
+       v.AddConfigPath(d.Src)
+
        err := v.ReadInConfig()
        if err != nil {
                if _, ok := err.(viper.ConfigParseError); ok {
@@ -62,8 +81,6 @@ func LoadConfig(fs afero.Fs, relativeSourcePath, configFilename string) (*viper.
                }
        }
 
-       v.RegisterAlias("indexes", "taxonomies")
-
        if err := loadDefaultSettingsFor(v); err != nil {
                return v, err
        }
@@ -191,6 +208,8 @@ func loadDefaultSettingsFor(v *viper.Viper) error {
                return err
        }
 
+       v.RegisterAlias("indexes", "taxonomies")
+
        v.SetDefault("cleanDestinationDir", false)
        v.SetDefault("watch", false)
        v.SetDefault("metaDataFormat", "toml")
index 874416b9d0efc4dc1df90902cb5cbdafb7afcfdb..ec543d93dc6a07066e02827e40f02385d80bb7a0 100644 (file)
@@ -34,7 +34,7 @@ func TestLoadConfig(t *testing.T) {
 
        writeToFs(t, mm, "hugo.toml", configContent)
 
-       cfg, err := LoadConfig(mm, "", "hugo.toml")
+       cfg, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Name: "hugo.toml"})
        require.NoError(t, err)
 
        assert.Equal(t, "side", cfg.GetString("paginatePath"))
@@ -59,7 +59,7 @@ func TestLoadMultiConfig(t *testing.T) {
 
        writeToFs(t, mm, "override.toml", configContentSub)
 
-       cfg, err := LoadConfig(mm, "", "base.toml,override.toml")
+       cfg, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Name: "base.toml,override.toml"})
        require.NoError(t, err)
 
        assert.Equal(t, "top", cfg.GetString("paginatePath"))
index 736d461db2905bf4fdde50994164f7cf0cfb3221..d689f9dcc6271f1d8d93e6068482924a26d8d14b 100644 (file)
@@ -90,7 +90,7 @@ categories:
        siteConfig := fmt.Sprintf(siteConfigTemplate, disabledStr)
        writeToFs(t, mf, "config.toml", siteConfig)
 
-       cfg, err := LoadConfig(mf, "", "config.toml")
+       cfg, err := LoadConfigDefault(mf)
        require.NoError(t, err)
 
        fs := hugofs.NewFrom(mf, cfg)
index b6394f6d8a0a50379526d0f70dbe707722c73e71..ab23b343cf7aaa781ea762c06bca434130418c31 100644 (file)
@@ -229,7 +229,7 @@ func (s *sitesBuilder) CreateSites() *sitesBuilder {
        s.writeFilePairs("i18n", s.i18nFilePairsAdded)
 
        if s.Cfg == nil {
-               cfg, err := LoadConfig(s.Fs.Source, "", "config."+s.configFormat)
+               cfg, err := LoadConfig(ConfigSourceDescriptor{Fs: s.Fs.Source, Name: "config." + s.configFormat})
                if err != nil {
                        s.Fatalf("Failed to load config: %s", err)
                }
@@ -460,7 +460,7 @@ func newTestSitesFromConfig(t testing.TB, afs afero.Fs, tomlConfig string, layou
 
        writeToFs(t, afs, "config.toml", tomlConfig)
 
-       cfg, err := LoadConfig(afs, "", "config.toml")
+       cfg, err := LoadConfigDefault(afs)
        require.NoError(t, err)
 
        fs := hugofs.NewFrom(afs, cfg)