diff --git a/app.go b/app.go index 6f2f21f..f801fce 100644 --- a/app.go +++ b/app.go @@ -72,6 +72,8 @@ type App struct { Authors []*Author // Copyright of the binary if any Copyright string + // Reader reader to write input to (useful for tests) + Reader io.Reader // Writer writer to write output to Writer io.Writer // ErrWriter writes error output @@ -117,6 +119,7 @@ func NewApp() *App { BashComplete: DefaultAppComplete, Action: helpCommand.Action, Compiled: compileTime(), + Reader: os.Stdin, Writer: os.Stdout, ErrWriter: os.Stderr, } @@ -160,6 +163,10 @@ func (a *App) Setup() { a.Compiled = compileTime() } + if a.Reader == nil { + a.Reader = os.Stdin + } + if a.Writer == nil { a.Writer = os.Stdout } diff --git a/app_test.go b/app_test.go index 6c95faa..57c850d 100644 --- a/app_test.go +++ b/app_test.go @@ -433,6 +433,12 @@ func TestApp_Command(t *testing.T) { } } +func TestApp_Setup_defaultsReader(t *testing.T) { + app := &App{} + app.Setup() + expect(t, app.Reader, os.Stdin) +} + func TestApp_Setup_defaultsWriter(t *testing.T) { app := &App{} app.Setup() @@ -850,6 +856,15 @@ func TestApp_ParseSliceFlagsWithMissingValue(t *testing.T) { } } +func TestApp_DefaultStdin(t *testing.T) { + app := &App{} + app.Setup() + + if app.Reader != os.Stdin { + t.Error("Default input reader not set.") + } +} + func TestApp_DefaultStdout(t *testing.T) { app := &App{} app.Setup() @@ -859,6 +874,29 @@ func TestApp_DefaultStdout(t *testing.T) { } } +func TestApp_SetStdin(t *testing.T) { + buf := make([]byte, 12) + + app := &App{ + Name: "test", + Reader: strings.NewReader("Hello World!"), + Action: func(c *Context) error { + _, err := c.App.Reader.Read(buf) + return err + }, + } + + err := app.Run([]string{"help"}) + + if err != nil { + t.Fatalf("Run error: %s", err) + } + + if string(buf) != "Hello World!" { + t.Error("App did not read input from desired reader.") + } +} + func TestApp_SetStdout(t *testing.T) { var w bytes.Buffer diff --git a/docs/v2/manual.md b/docs/v2/manual.md index c39bfb9..266abd5 100644 --- a/docs/v2/manual.md +++ b/docs/v2/manual.md @@ -425,15 +425,17 @@ import ( func main() { app := &cli.App{ Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "Language for the greeting", - }, - &cli.StringFlag{ - Name: "config, c", - Usage: "Load configuration from `FILE`", - }, + &cli.StringFlag{ + Name: "lang", + Aliases: []string{"l"}, + Value: "english", + Usage: "Language for the greeting", + }, + &cli.StringFlag{ + Name: "config", + Aliases: []string{"c"}, + Usage: "Load configuration from `FILE`", + }, }, Commands: []*cli.Command{ { @@ -570,7 +572,8 @@ func main() { app.Flags = []cli.Flag { &cli.StringFlag{ - Name: "password, p", + Name: "password", + Aliases: []string{"p"}, Usage: "password for the mysql database", FilePath: "/etc/mysql/password", }, @@ -1309,7 +1312,8 @@ import ( func main() { cli.HelpFlag = &cli.BoolFlag{ - Name: "haaaaalp", Aliases: []string{"halp"}, + Name: "haaaaalp", + Aliases: []string{"halp"}, Usage: "HALP", EnvVars: []string{"SHOW_HALP", "HALPPLZ"}, } @@ -1344,7 +1348,8 @@ import ( func main() { cli.VersionFlag = &cli.BoolFlag{ - Name: "print-version", Aliases: []string{"V"}, + Name: "print-version", + Aliases: []string{"V"}, Usage: "print only the version", }