From 0bf6c9fc0817db96c864c7279c8fe3435f9697d8 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Sat, 8 Feb 2020 02:14:34 +0300 Subject: [PATCH] config/source/cli: fix default flag value loading (#1178) Signed-off-by: Vasiliy Tolstov --- config/source/cli/cli.go | 13 +++++----- config/source/cli/cli_test.go | 48 ++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/config/source/cli/cli.go b/config/source/cli/cli.go index 6ca71709..30e1adaf 100644 --- a/config/source/cli/cli.go +++ b/config/source/cli/cli.go @@ -21,7 +21,9 @@ type cliSource struct { func (c *cliSource) Read() (*source.ChangeSet, error) { 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)) mergo.Map(&changes, tmp) // need to sort error handling } @@ -100,13 +102,10 @@ func NewSource(opts ...source.Option) source.Source { var ctx *cli.Context - c, ok := options.Context.Value(contextKey{}).(*cli.Context) - if ok { + if c, ok := options.Context.Value(contextKey{}).(*cli.Context); ok { ctx = c - } - - // no context - if ctx == nil { + } else { + // no context // get the default app/flags app := cmd.App() flags := app.Flags diff --git a/config/source/cli/cli_test.go b/config/source/cli/cli_test.go index 45022a95..1a752a2e 100644 --- a/config/source/cli/cli_test.go +++ b/config/source/cli/cli_test.go @@ -6,10 +6,52 @@ import ( "testing" "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/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) { var src source.Source @@ -17,7 +59,11 @@ func test(t *testing.T, withContext bool) { app := cmd.App() app.Name = "testapp" app.Flags = []cli.Flag{ - &cli.StringFlag{Name: "db-host"}, + &cli.StringFlag{ + Name: "db-host", + EnvVars: []string{"db-host"}, + Value: "myval", + }, } // with context