feat(encoding): drop HCL, Java properties and INI

Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
This commit is contained in:
Mark Sagi-Kazar 2024-06-24 15:10:56 +02:00 committed by Márk Sági-Kazár
parent e033c8e8dc
commit 6e630e548a
2 changed files with 15 additions and 259 deletions

View file

@ -6,9 +6,6 @@ import (
"sync" "sync"
"github.com/spf13/viper/internal/encoding/dotenv" "github.com/spf13/viper/internal/encoding/dotenv"
"github.com/spf13/viper/internal/encoding/hcl"
"github.com/spf13/viper/internal/encoding/ini"
"github.com/spf13/viper/internal/encoding/javaproperties"
"github.com/spf13/viper/internal/encoding/json" "github.com/spf13/viper/internal/encoding/json"
"github.com/spf13/viper/internal/encoding/toml" "github.com/spf13/viper/internal/encoding/toml"
"github.com/spf13/viper/internal/encoding/yaml" "github.com/spf13/viper/internal/encoding/yaml"
@ -113,20 +110,6 @@ func (r codecRegistry) codec(format string) (Codec, bool) {
case "toml": case "toml":
return toml.Codec{}, true return toml.Codec{}, true
case "hcl", "tfvars":
return hcl.Codec{}, true
case "ini":
return ini.Codec{
KeyDelimiter: r.v.keyDelim,
LoadOptions: r.v.iniLoadOptions,
}, true
case "properties", "props", "prop": // Note: This breaks writing a properties file.
return &javaproperties.Codec{
KeyDelimiter: v.keyDelim,
}, true
case "dotenv", "env": case "dotenv", "env":
return &dotenv.Codec{}, true return &dotenv.Codec{}, true
} }

View file

@ -84,58 +84,12 @@ var jsonExample = []byte(`{
} }
}`) }`)
var hclExample = []byte(`
id = "0001"
type = "donut"
name = "Cake"
ppu = 0.55
foos {
foo {
key = 1
}
foo {
key = 2
}
foo {
key = 3
}
foo {
key = 4
}
}`)
var propertiesExample = []byte(`
p_id: 0001
p_type: donut
p_name: Cake
p_ppu: 0.55
p_batters.batter.type: Regular
`)
var remoteExample = []byte(`{ var remoteExample = []byte(`{
"id":"0002", "id":"0002",
"type":"cronut", "type":"cronut",
"newkey":"remote" "newkey":"remote"
}`) }`)
var iniExample = []byte(`; Package name
NAME = ini
; Package version
VERSION = v1
; Package import path
IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s
# Information about package author
# Bio can be written in multiple lines.
[author]
NAME = Unknown ; Succeeding comment
E-MAIL = fake@localhost
GITHUB = https://github.com/%(NAME)s
BIO = """Gopher.
Coding addict.
Good man.
""" # Succeeding comment`)
func initConfigs(v *Viper) { func initConfigs(v *Viper) {
var r io.Reader var r io.Reader
v.SetConfigType("yaml") v.SetConfigType("yaml")
@ -146,14 +100,6 @@ func initConfigs(v *Viper) {
r = bytes.NewReader(jsonExample) r = bytes.NewReader(jsonExample)
v.unmarshalReader(r, v.config) v.unmarshalReader(r, v.config)
v.SetConfigType("hcl")
r = bytes.NewReader(hclExample)
v.unmarshalReader(r, v.config)
v.SetConfigType("properties")
r = bytes.NewReader(propertiesExample)
v.unmarshalReader(r, v.config)
v.SetConfigType("toml") v.SetConfigType("toml")
r = bytes.NewReader(tomlExample) r = bytes.NewReader(tomlExample)
v.unmarshalReader(r, v.config) v.unmarshalReader(r, v.config)
@ -165,10 +111,6 @@ func initConfigs(v *Viper) {
v.SetConfigType("json") v.SetConfigType("json")
remote := bytes.NewReader(remoteExample) remote := bytes.NewReader(remoteExample)
v.unmarshalReader(remote, v.kvstore) v.unmarshalReader(remote, v.kvstore)
v.SetConfigType("ini")
r = bytes.NewReader(iniExample)
v.unmarshalReader(r, v.config)
} }
func initConfig(typ, config string, v *Viper) { func initConfig(typ, config string, v *Viper) {
@ -622,22 +564,11 @@ func TestJSON(t *testing.T) {
assert.Equal(t, "0001", v.Get("id")) assert.Equal(t, "0001", v.Get("id"))
} }
func TestProperties(t *testing.T) {
v := New()
v.SetConfigType("properties")
// Read the properties data into Viper configuration
require.NoError(t, v.ReadConfig(bytes.NewBuffer(propertiesExample)), "Error reading properties data")
assert.Equal(t, "0001", v.Get("p_id"))
}
func TestTOML(t *testing.T) { func TestTOML(t *testing.T) {
v := New() v := New()
v.SetConfigType("toml") v.SetConfigType("toml")
// Read the properties data into Viper configuration // Read the TOML data into Viper configuration
require.NoError(t, v.ReadConfig(bytes.NewBuffer(tomlExample)), "Error reading toml data") require.NoError(t, v.ReadConfig(bytes.NewBuffer(tomlExample)), "Error reading toml data")
assert.Equal(t, "TOML Example", v.Get("title")) assert.Equal(t, "TOML Example", v.Get("title"))
@ -646,42 +577,16 @@ func TestTOML(t *testing.T) {
func TestDotEnv(t *testing.T) { func TestDotEnv(t *testing.T) {
v := New() v := New()
v.SetConfigType("env") v.SetConfigType("env")
// Read the properties data into Viper configuration // Read the dotenv data into Viper configuration
require.NoError(t, v.ReadConfig(bytes.NewBuffer(dotenvExample)), "Error reading env data") require.NoError(t, v.ReadConfig(bytes.NewBuffer(dotenvExample)), "Error reading env data")
assert.Equal(t, "DotEnv Example", v.Get("title_dotenv")) assert.Equal(t, "DotEnv Example", v.Get("title_dotenv"))
} }
func TestHCL(t *testing.T) {
v := New()
v.SetConfigType("hcl")
// Read the properties data into Viper configuration
require.NoError(t, v.ReadConfig(bytes.NewBuffer(hclExample)), "Error reading hcl data")
// initHcl()
assert.Equal(t, "0001", v.Get("id"))
assert.Equal(t, 0.55, v.Get("ppu"))
assert.Equal(t, "donut", v.Get("type"))
assert.Equal(t, "Cake", v.Get("name"))
v.Set("id", "0002")
assert.Equal(t, "0002", v.Get("id"))
assert.NotEqual(t, "cronut", v.Get("type"))
}
func TestIni(t *testing.T) {
// initIni()
v := New()
v.SetConfigType("ini")
// Read the properties data into Viper configuration
require.NoError(t, v.ReadConfig(bytes.NewBuffer(iniExample)), "Error reading ini data")
assert.Equal(t, "ini", v.Get("default.name"))
}
func TestRemotePrecedence(t *testing.T) { func TestRemotePrecedence(t *testing.T) {
v := New() v := New()
v.SetConfigType("json") v.SetConfigType("json")
// Read the properties data into Viper configuration v.config // Read the remote data into Viper configuration v.config
require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data") require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data")
assert.Equal(t, "0001", v.Get("id")) assert.Equal(t, "0001", v.Get("id"))
@ -701,7 +606,7 @@ func TestRemotePrecedence(t *testing.T) {
func TestEnv(t *testing.T) { func TestEnv(t *testing.T) {
v := New() v := New()
v.SetConfigType("json") v.SetConfigType("json")
// Read the properties data into Viper configuration v.config // Read the JSON data into Viper configuration v.config
require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data") require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data")
v.BindEnv("id") v.BindEnv("id")
@ -724,7 +629,7 @@ func TestEnv(t *testing.T) {
func TestMultipleEnv(t *testing.T) { func TestMultipleEnv(t *testing.T) {
v := New() v := New()
v.SetConfigType("json") v.SetConfigType("json")
// Read the properties data into Viper configuration v.config // Read the JSON data into Viper configuration v.config
require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data") require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data")
v.BindEnv("f", "FOOD", "OLD_FOOD") v.BindEnv("f", "FOOD", "OLD_FOOD")
@ -737,7 +642,7 @@ func TestMultipleEnv(t *testing.T) {
func TestEmptyEnv(t *testing.T) { func TestEmptyEnv(t *testing.T) {
v := New() v := New()
v.SetConfigType("json") v.SetConfigType("json")
// Read the properties data into Viper configuration v.config // Read the JSON data into Viper configuration v.config
require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data") require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data")
v.BindEnv("type") // Empty environment variable v.BindEnv("type") // Empty environment variable
@ -752,7 +657,7 @@ func TestEmptyEnv(t *testing.T) {
func TestEmptyEnv_Allowed(t *testing.T) { func TestEmptyEnv_Allowed(t *testing.T) {
v := New() v := New()
v.SetConfigType("json") v.SetConfigType("json")
// Read the properties data into Viper configuration v.config // Read the JSON data into Viper configuration v.config
require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data") require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data")
v.AllowEmptyEnv(true) v.AllowEmptyEnv(true)
@ -769,7 +674,7 @@ func TestEmptyEnv_Allowed(t *testing.T) {
func TestEnvPrefix(t *testing.T) { func TestEnvPrefix(t *testing.T) {
v := New() v := New()
v.SetConfigType("json") v.SetConfigType("json")
// Read the properties data into Viper configuration v.config // Read the JSON data into Viper configuration v.config
require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data") require.NoError(t, v.ReadConfig(bytes.NewBuffer(jsonExample)), "Error reading json data")
v.SetEnvPrefix("foo") // will be uppercased automatically v.SetEnvPrefix("foo") // will be uppercased automatically
@ -829,7 +734,7 @@ func TestEnvKeyReplacer(t *testing.T) {
func TestEnvSubConfig(t *testing.T) { func TestEnvSubConfig(t *testing.T) {
v := New() v := New()
v.SetConfigType("yaml") v.SetConfigType("yaml")
// Read the properties data into Viper configuration v.config // Read the YAML data into Viper configuration v.config
require.NoError(t, v.ReadConfig(bytes.NewBuffer(yamlExample)), "Error reading json data") require.NoError(t, v.ReadConfig(bytes.NewBuffer(yamlExample)), "Error reading json data")
v.AutomaticEnv() v.AutomaticEnv()
v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
@ -851,10 +756,6 @@ func TestAllKeys(t *testing.T) {
ks := []string{ ks := []string{
"title", "title",
"author.bio",
"author.e-mail",
"author.github",
"author.name",
"newkey", "newkey",
"owner.organization", "owner.organization",
"owner.dob", "owner.dob",
@ -866,21 +767,12 @@ func TestAllKeys(t *testing.T) {
"hobbies", "hobbies",
"clothing.jacket", "clothing.jacket",
"clothing.trousers", "clothing.trousers",
"default.import_path",
"default.name",
"default.version",
"clothing.pants.size", "clothing.pants.size",
"age", "age",
"hacker", "hacker",
"id", "id",
"type", "type",
"eyes", "eyes",
"p_id",
"p_ppu",
"p_batters.batter.type",
"p_type",
"p_name",
"foos",
"title_dotenv", "title_dotenv",
"type_dotenv", "type_dotenv",
"name_dotenv", "name_dotenv",
@ -893,24 +785,13 @@ func TestAllKeys(t *testing.T) {
"dob": dob, "dob": dob,
}, },
"title": "TOML Example", "title": "TOML Example",
"author": map[string]any{ "ppu": 0.55,
"e-mail": "fake@localhost", "eyes": "brown",
"github": "https://github.com/Unknown",
"name": "Unknown",
"bio": "Gopher.\nCoding addict.\nGood man.\n",
},
"ppu": 0.55,
"eyes": "brown",
"clothing": map[string]any{ "clothing": map[string]any{
"trousers": "denim", "trousers": "denim",
"jacket": "leather", "jacket": "leather",
"pants": map[string]any{"size": "large"}, "pants": map[string]any{"size": "large"},
}, },
"default": map[string]any{
"import_path": "gopkg.in/ini.v1",
"name": "ini",
"version": "v1",
},
"id": "0001", "id": "0001",
"batters": map[string]any{ "batters": map[string]any{
"batter": []any{ "batter": []any{
@ -927,27 +808,10 @@ func TestAllKeys(t *testing.T) {
"snowboarding", "snowboarding",
"go", "go",
}, },
"age": 35, "age": 35,
"type": "donut", "type": "donut",
"newkey": "remote", "newkey": "remote",
"name": "Cake", "name": "Cake",
"p_id": "0001",
"p_ppu": "0.55",
"p_name": "Cake",
"p_batters": map[string]any{
"batter": map[string]any{"type": "Regular"},
},
"p_type": "donut",
"foos": []map[string]any{
{
"foo": []map[string]any{
{"key": 1},
{"key": 2},
{"key": 3},
{"key": 4},
},
},
},
"title_dotenv": "DotEnv Example", "title_dotenv": "DotEnv Example",
"type_dotenv": "donut", "type_dotenv": "donut",
"name_dotenv": "Cake", "name_dotenv": "Cake",
@ -1611,24 +1475,6 @@ func TestFindsNestedKeys(t *testing.T) {
"clothing.trousers": "denim", "clothing.trousers": "denim",
"owner.dob": dob, "owner.dob": dob,
"beard": true, "beard": true,
"foos": []map[string]any{
{
"foo": []map[string]any{
{
"key": 1,
},
{
"key": 2,
},
{
"key": 3,
},
{
"key": 4,
},
},
},
},
} }
for key, expectedValue := range expected { for key, expectedValue := range expected {
@ -1800,32 +1646,6 @@ func TestSub(t *testing.T) {
assert.Equal(t, []string{"clothing", "pants"}, subv.parents) assert.Equal(t, []string{"clothing", "pants"}, subv.parents)
} }
var hclWriteExpected = []byte(`"foos" = {
"foo" = {
"key" = 1
}
"foo" = {
"key" = 2
}
"foo" = {
"key" = 3
}
"foo" = {
"key" = 4
}
}
"id" = "0001"
"name" = "Cake"
"ppu" = 0.55
"type" = "donut"`)
var jsonWriteExpected = []byte(`{ var jsonWriteExpected = []byte(`{
"batters": { "batters": {
"batter": [ "batter": [
@ -1849,13 +1669,6 @@ var jsonWriteExpected = []byte(`{
"type": "donut" "type": "donut"
}`) }`)
var propertiesWriteExpected = []byte(`p_batters.batter.type = Regular
p_id = 0001
p_name = Cake
p_ppu = 0.55
p_type = donut
`)
// var yamlWriteExpected = []byte(`age: 35 // var yamlWriteExpected = []byte(`age: 35
// beard: true // beard: true
// clothing: // clothing:
@ -1882,30 +1695,6 @@ func TestWriteConfig(t *testing.T) {
input []byte input []byte
expectedContent []byte expectedContent []byte
}{ }{
"hcl with file extension": {
configName: "c",
inConfigType: "hcl",
outConfigType: "hcl",
fileName: "c.hcl",
input: hclExample,
expectedContent: hclWriteExpected,
},
"hcl without file extension": {
configName: "c",
inConfigType: "hcl",
outConfigType: "hcl",
fileName: "c",
input: hclExample,
expectedContent: hclWriteExpected,
},
"hcl with file extension and mismatch type": {
configName: "c",
inConfigType: "hcl",
outConfigType: "json",
fileName: "c.hcl",
input: hclExample,
expectedContent: hclWriteExpected,
},
"json with file extension": { "json with file extension": {
configName: "c", configName: "c",
inConfigType: "json", inConfigType: "json",
@ -1930,22 +1719,6 @@ func TestWriteConfig(t *testing.T) {
input: jsonExample, input: jsonExample,
expectedContent: jsonWriteExpected, expectedContent: jsonWriteExpected,
}, },
"properties with file extension": {
configName: "c",
inConfigType: "properties",
outConfigType: "properties",
fileName: "c.properties",
input: propertiesExample,
expectedContent: propertiesWriteExpected,
},
"properties without file extension": {
configName: "c",
inConfigType: "properties",
outConfigType: "properties",
fileName: "c",
input: propertiesExample,
expectedContent: propertiesWriteExpected,
},
"yaml with file extension": { "yaml with file extension": {
configName: "c", configName: "c",
inConfigType: "yaml", inConfigType: "yaml",