From 8c83f71b0d5229b6e88976a5cb3d6ab239f64a10 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 24 Jan 2023 18:45:41 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Added=20ini=20file=20extender=20sup?= =?UTF-8?q?port?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 1 + go.sum | 2 ++ pkg/extras/extender.go | 59 +++++++++++++++++++++++++++++++ pkg/extras/extender_test.go | 45 +++++++++++++++++++++++ pkg/extras/extendertype_string.go | 5 +-- 5 files changed, 110 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 388b4b0..fa7aa89 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( github.com/go-errors/errors v1.4.2 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.4.0 // indirect + github.com/go-ini/ini v1.67.0 github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.19.5 // indirect github.com/go-openapi/swag v0.22.3 // indirect diff --git a/go.sum b/go.sum index eb4f259..c88ca1f 100644 --- a/go.sum +++ b/go.sum @@ -50,6 +50,8 @@ github.com/go-git/go-git-fixtures/v4 v4.3.1 h1:y5z6dd3qi8Hl+stezc8p3JxDkoTRqMAlK github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= github.com/go-git/go-git/v5 v5.5.2 h1:v8lgZa5k9ylUw+OR/roJHTxR4QItsNFI5nKtAXFuynw= github.com/go-git/go-git/v5 v5.5.2/go.mod h1:BE5hUJ5yaV2YMxhmaP4l6RBQ08kMxKSPD4BlxtH7OjI= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= diff --git a/pkg/extras/extender.go b/pkg/extras/extender.go index 2853c3c..fd451ae 100644 --- a/pkg/extras/extender.go +++ b/pkg/extras/extender.go @@ -9,6 +9,7 @@ import ( "strconv" "strings" + "github.com/go-ini/ini" "github.com/pelletier/go-toml/v2" "golang.org/x/text/cases" "golang.org/x/text/language" @@ -50,6 +51,7 @@ const ( RegexExtender JsonExtender TomlExtender + IniExtender ) var stringToExtenderTypeMap map[string]ExtenderType @@ -442,6 +444,62 @@ func NewTomlExtender() Extender { return &tomlExtender{} } +/////// +// TOML +/////// + +type iniExtender struct { + file *ini.File +} + +func (e *iniExtender) SetPayload(payload []byte) (err error) { + + e.file, err = ini.Load(payload) + return err +} + +func (e *iniExtender) GetPayload() ([]byte, error) { + var b bytes.Buffer + _, err := e.file.WriteTo(&b) + return b.Bytes(), err +} + +func (e *iniExtender) keyFromPath(path []string) (*ini.Key, error) { + if len(path) < 1 || len(path) > 2 { + return nil, fmt.Errorf("invalid path length: %d", len(path)) + } + section := "" + key := path[0] + if len(path) == 2 { + section = key + key = path[1] + } + return e.file.Section(section).Key(key), nil +} + +func (e *iniExtender) Get(path []string) ([]byte, error) { + k, err := e.keyFromPath(path) + if err != nil { + return nil, fmt.Errorf("while getting key at path %s", strings.Join(path, ".")) + } + return []byte(k.String()), nil +} + +func (e *iniExtender) Set(path []string, value any) error { + k, err := e.keyFromPath(path) + if err != nil { + return fmt.Errorf("while getting key at path %s", strings.Join(path, ".")) + } + + k.SetValue(string(GetByteValue(value))) + + return nil +} + +func NewIniExtender() Extender { + return &iniExtender{} +} + //////////// // Factories //////////// @@ -452,6 +510,7 @@ var ExtenderFactories = map[ExtenderType]func() Extender{ RegexExtender: NewRegexExtender, JsonExtender: NewJsonExtender, TomlExtender: NewTomlExtender, + IniExtender: NewIniExtender, } func (path *ExtendedSegment) Extender(payload []byte) (Extender, error) { diff --git a/pkg/extras/extender_test.go b/pkg/extras/extender_test.go index a9661c6..88bdb60 100644 --- a/pkg/extras/extender_test.go +++ b/pkg/extras/extender_test.go @@ -418,6 +418,51 @@ targetRevision = 'deploy/citest' require.Equal("deploy/citest", string(value), "error fetching changed value") } +func (s *ExtenderTestSuite) TestIniExtender() { + require := s.Require() + source := ` +uninode = true +[common] +targetRevision = main +[apps] +enabled = true +` + expected := `uninode = true + +[common] +targetRevision = deploy/citest + +[apps] +enabled = true +` + + p := `!!ini.common.targetRevision` + path := kyaml_utils.SmarterPathSplitter(p, ".") + + extensions := []*ExtendedSegment{} + prefix, err := splitExtendedPath(path, &extensions) + require.NoError(err) + require.Len(prefix, 0, "There should be no prefix") + require.Len(extensions, 1, "There should be 2 extensions") + require.Equal("ini", extensions[0].Encoding, "The first extension should be ini") + + iniXP := extensions[0] + iniExt, err := iniXP.Extender([]byte(source)) + require.NoError(err) + value, err := iniExt.Get(iniXP.Path) + require.NoError(err) + require.Equal("main", string(value), "error fetching value") + require.NoError(iniExt.Set(iniXP.Path, []byte("deploy/citest"))) + + modified, err := iniExt.GetPayload() + require.NoError(err) + require.Equal(expected, string(modified), "final ini") + + value, err = iniExt.Get(iniXP.Path) + require.NoError(err) + require.Equal("deploy/citest", string(value), "error fetching changed value") +} + func TestExtender(t *testing.T) { suite.Run(t, new(ExtenderTestSuite)) } diff --git a/pkg/extras/extendertype_string.go b/pkg/extras/extendertype_string.go index 0988f23..76aaeda 100644 --- a/pkg/extras/extendertype_string.go +++ b/pkg/extras/extendertype_string.go @@ -14,11 +14,12 @@ func _() { _ = x[RegexExtender-3] _ = x[JsonExtender-4] _ = x[TomlExtender-5] + _ = x[IniExtender-6] } -const _ExtenderType_name = "UnknownYamlExtenderBase64ExtenderRegexExtenderJsonExtenderTomlExtender" +const _ExtenderType_name = "UnknownYamlExtenderBase64ExtenderRegexExtenderJsonExtenderTomlExtenderIniExtender" -var _ExtenderType_index = [...]uint8{0, 7, 19, 33, 46, 58, 70} +var _ExtenderType_index = [...]uint8{0, 7, 19, 33, 46, 58, 70, 81} func (i ExtenderType) String() string { if i < 0 || i >= ExtenderType(len(_ExtenderType_index)-1) {