shithub: hugo

Download patch

ref: 4ddcf52ccc7af3e23109ebaac1f0486087a212ba
parent: 353148c2bc2cdb9f2eb8ee967ba756ce09323801
author: Bjørn Erik Pedersen <[email protected]>
date: Tue May 22 10:40:06 EDT 2018

Add an unified .Site.Config with a services section

Fixes #4751

--- /dev/null
+++ b/config/services/servicesConfig.go
@@ -1,0 +1,61 @@
+// Copyright 2018 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.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package services
+
+import (
+	"github.com/gohugoio/hugo/config"
+	"github.com/mitchellh/mapstructure"
+)
+
+const (
+	servicesConfigKey = "services"
+
+	disqusShortnameKey = "disqusshortname"
+	googleAnalyticsKey = "googleanalytics"
+)
+
+// Config is a privacy configuration for all the relevant services in Hugo.
+type Config struct {
+	Disqus          Disqus
+	GoogleAnalytics GoogleAnalytics
+}
+
+// Disqus holds the functional configuration settings related to the Disqus template.
+type Disqus struct {
+	// A Shortname is the unique identifier assigned to a Disqus site.
+	Shortname string
+}
+
+// GoogleAnalytics holds the functional configuration settings related to the Google Analytics template.
+type GoogleAnalytics struct {
+	// The GA tracking ID.
+	ID string
+}
+
+func DecodeConfig(cfg config.Provider) (c Config, err error) {
+	m := cfg.GetStringMap(servicesConfigKey)
+
+	err = mapstructure.WeakDecode(m, &c)
+
+	// Keep backwards compability.
+	if c.GoogleAnalytics.ID == "" {
+		// Try the global config
+		c.GoogleAnalytics.ID = cfg.GetString(googleAnalyticsKey)
+	}
+	if c.Disqus.Shortname == "" {
+		c.Disqus.Shortname = cfg.GetString(disqusShortnameKey)
+	}
+
+	return
+}
--- /dev/null
+++ b/config/services/servicesConfig_test.go
@@ -1,0 +1,64 @@
+// Copyright 2018 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.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package services
+
+import (
+	"testing"
+
+	"github.com/gohugoio/hugo/config"
+	"github.com/spf13/viper"
+	"github.com/stretchr/testify/require"
+)
+
+func TestDecodeConfigFromTOML(t *testing.T) {
+	assert := require.New(t)
+
+	tomlConfig := `
+
+someOtherValue = "foo"
+
+[services]
+[services.disqus]
+shortname = "DS"
+[services.googleAnalytics]
+id = "ga_id"
+`
+	cfg, err := config.FromConfigString(tomlConfig, "toml")
+	assert.NoError(err)
+
+	config, err := DecodeConfig(cfg)
+	assert.NoError(err)
+	assert.NotNil(config)
+
+	assert.Equal("DS", config.Disqus.Shortname)
+	assert.Equal("ga_id", config.GoogleAnalytics.ID)
+
+}
+
+// Support old root-level GA settings etc.
+func TestUseSettingsFromRootIfSet(t *testing.T) {
+	assert := require.New(t)
+
+	cfg := viper.New()
+	cfg.Set("disqusShortname", "root_short")
+	cfg.Set("googleAnalytics", "ga_root")
+
+	config, err := DecodeConfig(cfg)
+	assert.NoError(err)
+	assert.NotNil(config)
+
+	assert.Equal("root_short", config.Disqus.Shortname)
+	assert.Equal("ga_root", config.GoogleAnalytics.ID)
+
+}
--- a/hugolib/config.go
+++ b/hugolib/config.go
@@ -23,6 +23,7 @@
 
 	"github.com/gohugoio/hugo/config"
 	"github.com/gohugoio/hugo/config/privacy"
+	"github.com/gohugoio/hugo/config/services"
 	"github.com/gohugoio/hugo/helpers"
 	"github.com/spf13/afero"
 	"github.com/spf13/viper"
@@ -33,6 +34,26 @@
 	// This contains all privacy related settings that can be used to
 	// make the YouTube template etc. GDPR compliant.
 	Privacy privacy.Config
+
+	// Services contains config for services such as Google Analytics etc.
+	Services services.Config
+}
+
+func loadSiteConfig(cfg config.Provider) (scfg SiteConfig, err error) {
+	privacyConfig, err := privacy.DecodeConfig(cfg)
+	if err != nil {
+		return
+	}
+
+	servicesConfig, err := services.DecodeConfig(cfg)
+	if err != nil {
+		return
+	}
+
+	scfg.Privacy = privacyConfig
+	scfg.Services = servicesConfig
+
+	return
 }
 
 // ConfigSourceDescriptor describes where to find the config (e.g. config.toml etc.).
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -27,8 +27,6 @@
 	"strings"
 	"time"
 
-	"github.com/gohugoio/hugo/config/privacy"
-
 	"github.com/gohugoio/hugo/resource"
 
 	"golang.org/x/sync/errgroup"
@@ -375,8 +373,6 @@
 	RSSLink               string
 	Author                map[string]interface{}
 	LanguageCode          string
-	DisqusShortname       string
-	GoogleAnalytics       string
 	Copyright             string
 	LastChange            time.Time
 	Permalinks            PermalinkOverrides
@@ -421,6 +417,17 @@
 	return p
 }
 
+// GoogleAnalytics is kept here for historic reasons.
+func (s *SiteInfo) GoogleAnalytics() string {
+	return s.Config.Services.GoogleAnalytics.ID
+
+}
+
+// DisqusShortname is kept here for historic reasons.
+func (s *SiteInfo) DisqusShortname() string {
+	return s.Config.Services.Disqus.Shortname
+}
+
 // Used in tests.
 
 type siteBuilderCfg struct {
@@ -1116,7 +1123,7 @@
 		}
 	}
 
-	privacyConfig, err := privacy.DecodeConfig(lang)
+	siteConfig, err := loadSiteConfig(lang)
 	if err != nil {
 		return err
 	}
@@ -1127,7 +1134,6 @@
 		Social:                         lang.GetStringMapString("social"),
 		LanguageCode:                   lang.GetString("languageCode"),
 		Copyright:                      lang.GetString("copyright"),
-		DisqusShortname:                lang.GetString("disqusShortname"),
 		multilingual:                   multilingual,
 		Language:                       lang,
 		LanguagePrefix:                 languagePrefix,
@@ -1134,7 +1140,6 @@
 		Languages:                      languages,
 		defaultContentLanguageInSubdir: defaultContentInSubDir,
 		sectionPagesMenu:               lang.GetString("sectionPagesMenu"),
-		GoogleAnalytics:                lang.GetString("googleAnalytics"),
 		BuildDrafts:                    s.Cfg.GetBool("buildDrafts"),
 		canonifyURLs:                   s.Cfg.GetBool("canonifyURLs"),
 		relativeURLs:                   s.Cfg.GetBool("relativeURLs"),
@@ -1147,7 +1152,7 @@
 		Data:                           &s.Data,
 		owner:                          s.owner,
 		s:                              s,
-		Config:                         SiteConfig{Privacy: privacyConfig},
+		Config:                         siteConfig,
 	}
 
 	rssOutputFormat, found := s.outputFormats[KindHome].GetByName(output.RSSFormat.Name)