Enable FindString to search dotD config files (#7323)

* Enable FindString to search dotD config files
* Address multiple arg cases

Signed-off-by: Derek Nola <derek.nola@suse.com>
This commit is contained in:
Derek Nola 2023-05-02 11:18:23 -07:00 committed by GitHub
parent 132b41c3bf
commit e1d4cff14c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 75 additions and 14 deletions

View File

@ -98,28 +98,46 @@ func (p *Parser) stripInvalidFlags(command string, args []string) ([]string, err
func (p *Parser) FindString(args []string, target string) (string, error) { func (p *Parser) FindString(args []string, target string) (string, error) {
configFile, isSet := p.findConfigFileFlag(args) configFile, isSet := p.findConfigFileFlag(args)
var lastVal string
if configFile != "" { if configFile != "" {
bytes, err := readConfigFileData(configFile)
_, err := os.Stat(configFile)
if !isSet && os.IsNotExist(err) { if !isSet && os.IsNotExist(err) {
return "", nil return "", nil
} else if err != nil { } else if err != nil {
return "", err return "", err
} }
data := yaml.MapSlice{} files, err := dotDFiles(configFile)
if err := yaml.Unmarshal(bytes, &data); err != nil { if err != nil {
return "", err return "", err
} }
files = append([]string{configFile}, files...)
for _, file := range files {
bytes, err := readConfigFileData(file)
if err != nil {
return "", err
}
for _, i := range data { data := yaml.MapSlice{}
k, v := convert.ToString(i.Key), convert.ToString(i.Value) if err := yaml.Unmarshal(bytes, &data); err != nil {
if k == target { return "", err
return v, nil }
for _, i := range data {
k, v := convert.ToString(i.Key), convert.ToString(i.Value)
isAppend := strings.HasSuffix(k, "+")
k = strings.TrimSuffix(k, "+")
if k == target {
if isAppend {
lastVal = lastVal + "," + v
} else {
lastVal = v
}
}
} }
} }
} }
return lastVal, nil
return "", nil
} }
func (p *Parser) findConfigFileFlag(args []string) (string, bool) { func (p *Parser) findConfigFileFlag(args []string) (string, bool) {

View File

@ -221,6 +221,7 @@ func Test_UnitParser_findConfigFileFlag(t *testing.T) {
func Test_UnitParser_Parse(t *testing.T) { func Test_UnitParser_Parse(t *testing.T) {
testDataOutput := []string{ testDataOutput := []string{
"--foo-bar=bar-foo", "--foo-bar=bar-foo",
"--alice=bob",
"--a-slice=1", "--a-slice=1",
"--a-slice=1.5", "--a-slice=1.5",
"--a-slice=2", "--a-slice=2",
@ -237,6 +238,7 @@ func Test_UnitParser_Parse(t *testing.T) {
"--c-slice=three", "--c-slice=three",
"--d-slice=three", "--d-slice=three",
"--d-slice=four", "--d-slice=four",
"--f-string=beta",
"--e-slice=one", "--e-slice=one",
"--e-slice=two", "--e-slice=two",
} }
@ -376,7 +378,7 @@ func Test_UnitParser_FindString(t *testing.T) {
want: "", want: "",
}, },
{ {
name: "A custom config yaml exists, target exists", name: "A custom config exists, target exists",
fields: fields{ fields: fields{
FlagNames: []string{"-c", "--config"}, FlagNames: []string{"-c", "--config"},
EnvName: "_TEST_ENV", EnvName: "_TEST_ENV",
@ -384,12 +386,12 @@ func Test_UnitParser_FindString(t *testing.T) {
}, },
args: args{ args: args{
osArgs: []string{"-c", "./testdata/data.yaml"}, osArgs: []string{"-c", "./testdata/data.yaml"},
target: "foo-bar", target: "alice",
}, },
want: "baz", want: "bob",
}, },
{ {
name: "A custom config yaml exists, target does not exist", name: "A custom config exists, target does not exist",
fields: fields{ fields: fields{
FlagNames: []string{"-c", "--config"}, FlagNames: []string{"-c", "--config"},
EnvName: "_TEST_ENV", EnvName: "_TEST_ENV",
@ -401,6 +403,45 @@ func Test_UnitParser_FindString(t *testing.T) {
}, },
want: "", want: "",
}, },
{
name: "Multiple custom configs exist, target exists in a secondary config",
fields: fields{
FlagNames: []string{"-c", "--config"},
EnvName: "_TEST_ENV",
DefaultConfig: "./testdata/data.yaml",
},
args: args{
osArgs: []string{"-c", "./testdata/data.yaml"},
target: "f-string",
},
want: "beta",
},
{
name: "Multiple custom configs exist, multiple targets exist in multiple secondary config, replacement",
fields: fields{
FlagNames: []string{"-c", "--config"},
EnvName: "_TEST_ENV",
DefaultConfig: "./testdata/data.yaml",
},
args: args{
osArgs: []string{"-c", "./testdata/data.yaml"},
target: "foo-bar",
},
want: "bar-foo",
},
{
name: "Multiple custom configs exist, multiple targets exist in multiple secondary config, appending",
fields: fields{
FlagNames: []string{"-c", "--config"},
EnvName: "_TEST_ENV",
DefaultConfig: "./testdata/data.yaml",
},
args: args{
osArgs: []string{"-c", "./testdata/data.yaml"},
target: "b-string",
},
want: "one,two",
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {

View File

@ -1,4 +1,5 @@
foo-bar: baz foo-bar: baz
alice: bob
a-slice: a-slice:
- 1 - 1
- "2" - "2"

View File

@ -11,4 +11,5 @@ c-slice:
- two - two
d-slice: d-slice:
- one - one
- two - two
f-string: beta