config/source/cli: fix default flag value loading (#1178)

Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
Василий Толстов 2020-02-08 02:14:34 +03:00 committed by GitHub
parent 99807a680c
commit 0bf6c9fc08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 8 deletions

View File

@ -21,7 +21,9 @@ type cliSource struct {
func (c *cliSource) Read() (*source.ChangeSet, error) { func (c *cliSource) Read() (*source.ChangeSet, error) {
var changes map[string]interface{} var changes map[string]interface{}
for _, name := range c.ctx.FlagNames() { // directly using app cli flags, to access default values of not specified options
for _, f := range c.ctx.App.Flags {
name := f.Names()[0]
tmp := toEntry(name, c.ctx.Generic(name)) tmp := toEntry(name, c.ctx.Generic(name))
mergo.Map(&changes, tmp) // need to sort error handling mergo.Map(&changes, tmp) // need to sort error handling
} }
@ -100,13 +102,10 @@ func NewSource(opts ...source.Option) source.Source {
var ctx *cli.Context var ctx *cli.Context
c, ok := options.Context.Value(contextKey{}).(*cli.Context) if c, ok := options.Context.Value(contextKey{}).(*cli.Context); ok {
if ok {
ctx = c ctx = c
} } else {
// no context // no context
if ctx == nil {
// get the default app/flags // get the default app/flags
app := cmd.App() app := cmd.App()
flags := app.Flags flags := app.Flags

View File

@ -6,10 +6,52 @@ import (
"testing" "testing"
"github.com/micro/cli/v2" "github.com/micro/cli/v2"
"github.com/micro/go-micro/v2"
"github.com/micro/go-micro/v2/config"
"github.com/micro/go-micro/v2/config/cmd" "github.com/micro/go-micro/v2/config/cmd"
"github.com/micro/go-micro/v2/config/source" "github.com/micro/go-micro/v2/config/source"
) )
func TestCliSourceDefault(t *testing.T) {
const expVal string = "flagvalue"
service := micro.NewService(
micro.Flags(
// to be able to run insude go test
&cli.StringFlag{
Name: "test.timeout",
},
&cli.BoolFlag{
Name: "test.v",
},
&cli.StringFlag{
Name: "test.run",
},
&cli.StringFlag{
Name: "flag",
Usage: "It changes something",
EnvVars: []string{"flag"},
Value: expVal,
},
),
)
var cliSrc source.Source
service.Init(
// Loads CLI configuration
micro.Action(func(c *cli.Context) error {
cliSrc = NewSource(
Context(c),
)
return nil
}),
)
config.Load(cliSrc)
if fval := config.Get("flag").String("default"); fval != expVal {
t.Fatalf("default flag value not loaded %v != %v", fval, expVal)
}
}
func test(t *testing.T, withContext bool) { func test(t *testing.T, withContext bool) {
var src source.Source var src source.Source
@ -17,7 +59,11 @@ func test(t *testing.T, withContext bool) {
app := cmd.App() app := cmd.App()
app.Name = "testapp" app.Name = "testapp"
app.Flags = []cli.Flag{ app.Flags = []cli.Flag{
&cli.StringFlag{Name: "db-host"}, &cli.StringFlag{
Name: "db-host",
EnvVars: []string{"db-host"},
Value: "myval",
},
} }
// with context // with context