Skip to content

Commit c2d6910

Browse files
committed
add tests
1 parent b2ab3a0 commit c2d6910

File tree

8 files changed

+65
-22
lines changed

8 files changed

+65
-22
lines changed

cli_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,32 @@ func Test_git(t *testing.T) {
180180
}
181181
},
182182
},
183+
"env var based flag is evaluated": {
184+
gitHandler: func(t *testing.T) Handler {
185+
called := ensureCalled(t)
186+
187+
return func(ctx context.Context) error {
188+
called()
189+
190+
globalGitignore, err := FlagValue[string](ctx, "global-gitignore")
191+
test.Nil(t, err)
192+
test.Equal(t, globalGitignore, "path/to/some/.gitignore")
193+
return nil
194+
}
195+
},
196+
},
183197
}
184198

185199
for name, testCase := range testCases {
186200
t.Run(name, func(t *testing.T) {
201+
t.Setenv("GLOBAL_GITIGNORE", "path/to/some/.gitignore")
202+
187203
command, err := NewCommand("git", "the stupid content tracker",
188204
SetVersion("v0.1.0"),
189205
AddFlag("git-dir", "Git directory to use"),
206+
AddFlag("global-gitignore", "Global .gitignore file to use.",
207+
SetFlagDefaultEnv("GLOBAL_GITIGNORE"),
208+
),
190209
AddSubCmd("commit", "Record changes to the repository",
191210
AddFlag("message", "commit message",
192211
AddFlagAlias("msg"),

command_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ func ExampleNewCommand() {
88
AddVersionFlag(AddFlagShort('V')),
99
AddHelpFlag(AddFlagShort('h')),
1010
AddFlag("port", "Port to run server on.",
11-
SetFlagDefault(3000),
1211
AddFlagShort('p'),
12+
SetFlagDefault(3000),
13+
SetFlagDefaultEnv("PORT"),
1314
),
1415
AddFlag("auth-required", "Whether to require authentication.",
1516
SetFlagDefault(true),
@@ -34,6 +35,6 @@ func ExampleNewCommand() {
3435
// Flags:
3536
// --version -V Print version. (type: bool, default: "false")
3637
// --help -h Print help. (type: bool, default: "false")
37-
// --port -p Port to run server on. (type: int, default: "3000")
38+
// --port -p Port to run server on. (type: int, default: $PORT, "3000")
3839
// --auth-required Whether to require authentication. (type: bool, default: "true")
3940
}

context.go

+10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cli
22

33
import (
44
"context"
5+
"os"
56

67
"github.com/bobg/errors"
78
)
@@ -29,6 +30,15 @@ func FlagValue[T any](ctx context.Context, name string) (T, error) {
2930
return flag.value.(T), nil
3031
}
3132

33+
if flag.defaultEnvName != "" {
34+
value, err := flag.parser.Parse(os.Getenv(flag.defaultEnvName))
35+
if err != nil {
36+
return zero, err
37+
}
38+
39+
return value.(T), nil
40+
}
41+
3242
return flag.defaultValue.(T), nil
3343
}
3444

flag_options.go

+2-14
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package cli
22

33
import (
4-
"os"
5-
6-
"github.com/bobg/errors"
74
"github.com/broothie/option"
85
)
96

@@ -49,7 +46,6 @@ func SetFlagDefault[T Parseable](defaultValue T) option.Func[*Flag] {
4946

5047
flag.parser = argParser
5148
flag.defaultValue = defaultValue
52-
flag.defaultEnvName = ""
5349
return flag, nil
5450
}
5551
}
@@ -59,21 +55,13 @@ func SetFlagDefaultAndParser[T any](defaultValue T, argParser ArgParser[T]) opti
5955
return func(flag *Flag) (*Flag, error) {
6056
flag.parser = argParser
6157
flag.defaultValue = defaultValue
62-
flag.defaultEnvName = ""
6358
return flag, nil
6459
}
6560
}
6661

67-
// SetFlagDefaultEnvAndParser sets the default value to that of the corresponding environment variable, and parser of the flag.
68-
func SetFlagDefaultEnvAndParser[T any](name string, argParser ArgParser[T]) option.Func[*Flag] {
62+
// SetFlagDefaultEnv sets the default value to that of the corresponding environment variable, and parser of the flag.
63+
func SetFlagDefaultEnv(name string) option.Func[*Flag] {
6964
return func(flag *Flag) (*Flag, error) {
70-
defaultValue, err := argParser(os.Getenv(name))
71-
if err != nil {
72-
return nil, errors.Wrapf(err, "parsing value of $%s", name)
73-
}
74-
75-
flag.parser = argParser
76-
flag.defaultValue = defaultValue
7765
flag.defaultEnvName = name
7866
return flag, nil
7967
}

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
github.com/MakeNowJust/heredoc/v2 v2.0.1
77
github.com/bobg/errors v1.1.0
88
github.com/broothie/option v0.1.0
9-
github.com/broothie/test v0.1.6
9+
github.com/broothie/test v0.1.8
1010
github.com/samber/lo v1.49.1
1111
)
1212

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ github.com/bobg/errors v1.1.0 h1:gsVanPzJMpZQpwY+27/GQYElZez5CuMYwiIpk2A3RGw=
44
github.com/bobg/errors v1.1.0/go.mod h1:Q4775qBZpnte7EGFJqmvnlB1U4pkI1XmU3qxqdp7Zcc=
55
github.com/broothie/option v0.1.0 h1:5l6qdv9g1Ajxn7821brKVzOZxIjlVB0gA1MU8QbW8Fw=
66
github.com/broothie/option v0.1.0/go.mod h1:doEn1r1TpaaBJRdHLZlsdjvnrnH0u1WW+FZA018hE2g=
7-
github.com/broothie/test v0.1.6 h1:lvGSA1O2lFdYJuKDgj9IDpX9AA+rQtY/eYGMvui3PyM=
8-
github.com/broothie/test v0.1.6/go.mod h1:txzDcP9OHro3y7goC+ZznIkASy8NJks4dUcdbwsP0HM=
7+
github.com/broothie/test v0.1.8 h1:II6ZE0z2ZV0y4GJlLl/oBinG6X58mwyioSd/jxNMea0=
8+
github.com/broothie/test v0.1.8/go.mod h1:txzDcP9OHro3y7goC+ZznIkASy8NJks4dUcdbwsP0HM=
99
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1010
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1111
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=

help.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,17 @@ func (h helpContext) FlagTable() (string, error) {
104104
shorts = fmt.Sprintf("-%s", string(flag.shorts))
105105
}
106106

107-
defaultValueHelp := fmt.Sprintf("%q", fmt.Sprint(flag.defaultValue))
107+
helpValues := []string{fmt.Sprintf("%q", fmt.Sprint(flag.defaultValue))}
108108
if flag.defaultEnvName != "" {
109-
defaultValueHelp = fmt.Sprintf("$%s", flag.defaultEnvName)
109+
helpValues = append([]string{fmt.Sprintf("$%s", flag.defaultEnvName)}, helpValues...)
110110
}
111111

112112
return []string{
113113
"",
114114
strings.Join(longs, " "),
115115
shorts,
116116
flag.description,
117-
fmt.Sprintf("(type: %T, default: %s)", flag.parser.Type(), defaultValueHelp),
117+
fmt.Sprintf("(type: %T, default: %s)", flag.parser.Type(), strings.Join(helpValues, ", ")),
118118
}, true
119119
}))
120120
}

options_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func Test_options(t *testing.T) {
1919
AddFlagAlias("addr"),
2020
AddFlagShort('p'),
2121
SetFlagDefault(3000),
22+
SetFlagDefaultEnv("PORT"),
2223
),
2324
AddSubCmd("proxy", "Proxy requests",
2425
AddAlias("p"),
@@ -59,6 +60,7 @@ func Test_options(t *testing.T) {
5960
test.DeepEqual(t, []string{"addr"}, portFlag.aliases)
6061
test.DeepEqual(t, []rune{'p'}, portFlag.shorts)
6162
test.Equal(t, 3000, portFlag.defaultValue)
63+
test.Equal(t, "PORT", portFlag.defaultEnvName)
6264
test.Nil(t, portFlag.value)
6365
test.Equal(t, reflect.ValueOf(IntParser).Pointer(), reflect.ValueOf(portFlag.parser).Pointer())
6466
test.False(t, portFlag.isBool())
@@ -151,6 +153,29 @@ func ExampleAddFlag() {
151153
// --port -p Port to run server on (type: int, default: "3000")
152154
}
153155

156+
func ExampleAddFlag_with_env() {
157+
os.Setenv("PORT", "8080")
158+
defer os.Unsetenv("PORT")
159+
160+
command, _ := NewCommand("server", "An http server.",
161+
AddFlag("port", "Port to run server on",
162+
AddFlagShort('p'),
163+
SetFlagDefault(3000),
164+
SetFlagDefaultEnv("PORT"),
165+
),
166+
)
167+
168+
command.renderHelp(os.Stdout)
169+
// Output:
170+
// server: An http server.
171+
//
172+
// Usage:
173+
// server [flags]
174+
//
175+
// Flags:
176+
// --port -p Port to run server on (type: int, default: $PORT, "3000")
177+
}
178+
154179
func ExampleAddArg() {
155180
command, _ := NewCommand("server", "An http server.",
156181
AddArg("port", "Port to run server on", SetArgParser(IntParser)),

0 commit comments

Comments
 (0)