config/source/cli: fix default flag value loading (#1178)
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user