Merge pull request #1361 from urfave/dearchap-remove_reflect
Remove reflect calls for doc generation (#1259)
This commit is contained in:
commit
f04607a18b
60
flag.go
60
flag.go
@ -117,6 +117,12 @@ type DocGenerationFlag interface {
|
|||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
GetValue() string
|
GetValue() string
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
GetDefaultText() string
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
GetEnvVars() []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// VisibleFlag is an interface that allows to check if a flag is visible
|
// VisibleFlag is an interface that allows to check if a flag is visible
|
||||||
@ -299,55 +305,29 @@ func formatDefault(format string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func stringifyFlag(f Flag) string {
|
func stringifyFlag(f Flag) string {
|
||||||
fv := flagValue(f)
|
// enforce DocGeneration interface on flags to avoid reflection
|
||||||
|
df, ok := f.(DocGenerationFlag)
|
||||||
switch f := f.(type) {
|
if !ok {
|
||||||
case *IntSliceFlag:
|
return ""
|
||||||
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
|
||||||
stringifyIntSliceFlag(f))
|
|
||||||
case *Int64SliceFlag:
|
|
||||||
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
|
||||||
stringifyInt64SliceFlag(f))
|
|
||||||
case *Float64SliceFlag:
|
|
||||||
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
|
||||||
stringifyFloat64SliceFlag(f))
|
|
||||||
case *StringSliceFlag:
|
|
||||||
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
|
||||||
stringifyStringSliceFlag(f))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String())
|
placeholder, usage := unquoteUsage(df.GetUsage())
|
||||||
|
needsPlaceholder := df.TakesValue()
|
||||||
needsPlaceholder := false
|
|
||||||
defaultValueString := ""
|
|
||||||
val := fv.FieldByName("Value")
|
|
||||||
if val.IsValid() {
|
|
||||||
needsPlaceholder = val.Kind() != reflect.Bool
|
|
||||||
defaultValueString = fmt.Sprintf(formatDefault("%v"), val.Interface())
|
|
||||||
|
|
||||||
if val.Kind() == reflect.String && val.String() != "" {
|
|
||||||
defaultValueString = fmt.Sprintf(formatDefault("%q"), val.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
helpText := fv.FieldByName("DefaultText")
|
|
||||||
if helpText.IsValid() && helpText.String() != "" {
|
|
||||||
needsPlaceholder = val.Kind() != reflect.Bool
|
|
||||||
defaultValueString = fmt.Sprintf(formatDefault("%s"), helpText.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
if defaultValueString == formatDefault("") {
|
|
||||||
defaultValueString = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
if needsPlaceholder && placeholder == "" {
|
if needsPlaceholder && placeholder == "" {
|
||||||
placeholder = defaultPlaceholder
|
placeholder = defaultPlaceholder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defaultValueString := ""
|
||||||
|
|
||||||
|
if s := df.GetDefaultText(); s != "" {
|
||||||
|
defaultValueString = fmt.Sprintf(formatDefault("%s"), s)
|
||||||
|
}
|
||||||
|
|
||||||
usageWithDefault := strings.TrimSpace(usage + defaultValueString)
|
usageWithDefault := strings.TrimSpace(usage + defaultValueString)
|
||||||
|
|
||||||
return withEnvHint(flagStringSliceField(f, "EnvVars"),
|
return withEnvHint(df.GetEnvVars(),
|
||||||
fmt.Sprintf("%s\t%s", prefixedNames(f.Names(), placeholder), usageWithDefault))
|
fmt.Sprintf("%s\t%s", prefixedNames(df.Names(), placeholder), usageWithDefault))
|
||||||
}
|
}
|
||||||
|
|
||||||
func stringifyIntSliceFlag(f *IntSliceFlag) string {
|
func stringifyIntSliceFlag(f *IntSliceFlag) string {
|
||||||
|
13
flag_bool.go
13
flag_bool.go
@ -63,6 +63,19 @@ func (f *BoolFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *BoolFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%v", f.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *BoolFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *BoolFlag) Apply(set *flag.FlagSet) error {
|
func (f *BoolFlag) Apply(set *flag.FlagSet) error {
|
||||||
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
@ -63,6 +63,19 @@ func (f *DurationFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *DurationFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *DurationFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *DurationFlag) Apply(set *flag.FlagSet) error {
|
func (f *DurationFlag) Apply(set *flag.FlagSet) error {
|
||||||
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
@ -55,7 +55,20 @@ func (f *Float64Flag) GetUsage() string {
|
|||||||
// GetValue returns the flags value as string representation and an empty
|
// GetValue returns the flags value as string representation and an empty
|
||||||
// string if the flag takes no value at all.
|
// string if the flag takes no value at all.
|
||||||
func (f *Float64Flag) GetValue() string {
|
func (f *Float64Flag) GetValue() string {
|
||||||
return fmt.Sprintf("%f", f.Value)
|
return fmt.Sprintf("%v", f.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *Float64Flag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *Float64Flag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsVisible returns true if the flag is not hidden, otherwise false
|
// IsVisible returns true if the flag is not hidden, otherwise false
|
||||||
|
@ -95,7 +95,7 @@ func (f *Float64SliceFlag) IsSet() bool {
|
|||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f *Float64SliceFlag) String() string {
|
func (f *Float64SliceFlag) String() string {
|
||||||
return FlagStringer(f)
|
return withEnvHint(f.GetEnvVars(), stringifyFloat64SliceFlag(f))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Names returns the names of the flag
|
// Names returns the names of the flag
|
||||||
@ -132,6 +132,19 @@ func (f *Float64SliceFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *Float64SliceFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *Float64SliceFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error {
|
func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error {
|
||||||
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
@ -71,6 +71,19 @@ func (f *GenericFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *GenericFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *GenericFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply takes the flagset and calls Set on the generic flag with the value
|
// Apply takes the flagset and calls Set on the generic flag with the value
|
||||||
// provided by the user for parsing by the flag
|
// provided by the user for parsing by the flag
|
||||||
func (f GenericFlag) Apply(set *flag.FlagSet) error {
|
func (f GenericFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
13
flag_int.go
13
flag_int.go
@ -63,6 +63,19 @@ func (f *IntFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *IntFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *IntFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *IntFlag) Apply(set *flag.FlagSet) error {
|
func (f *IntFlag) Apply(set *flag.FlagSet) error {
|
||||||
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
@ -63,6 +63,19 @@ func (f *Int64Flag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *Int64Flag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *Int64Flag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *Int64Flag) Apply(set *flag.FlagSet) error {
|
func (f *Int64Flag) Apply(set *flag.FlagSet) error {
|
||||||
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
@ -96,7 +96,7 @@ func (f *Int64SliceFlag) IsSet() bool {
|
|||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f *Int64SliceFlag) String() string {
|
func (f *Int64SliceFlag) String() string {
|
||||||
return FlagStringer(f)
|
return withEnvHint(f.GetEnvVars(), stringifyInt64SliceFlag(f))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Names returns the names of the flag
|
// Names returns the names of the flag
|
||||||
@ -133,6 +133,19 @@ func (f *Int64SliceFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *Int64SliceFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *Int64SliceFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error {
|
func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error {
|
||||||
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
@ -107,7 +107,7 @@ func (f *IntSliceFlag) IsSet() bool {
|
|||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f *IntSliceFlag) String() string {
|
func (f *IntSliceFlag) String() string {
|
||||||
return FlagStringer(f)
|
return withEnvHint(f.GetEnvVars(), stringifyIntSliceFlag(f))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Names returns the names of the flag
|
// Names returns the names of the flag
|
||||||
@ -144,6 +144,19 @@ func (f *IntSliceFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *IntSliceFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *IntSliceFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *IntSliceFlag) Apply(set *flag.FlagSet) error {
|
func (f *IntSliceFlag) Apply(set *flag.FlagSet) error {
|
||||||
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
21
flag_path.go
21
flag_path.go
@ -1,6 +1,9 @@
|
|||||||
package cli
|
package cli
|
||||||
|
|
||||||
import "flag"
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
type PathFlag struct {
|
type PathFlag struct {
|
||||||
Name string
|
Name string
|
||||||
@ -59,6 +62,22 @@ func (f *PathFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *PathFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
if f.Value == "" {
|
||||||
|
return f.Value
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%q", f.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *PathFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *PathFlag) Apply(set *flag.FlagSet) error {
|
func (f *PathFlag) Apply(set *flag.FlagSet) error {
|
||||||
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package cli
|
package cli
|
||||||
|
|
||||||
import "flag"
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
// StringFlag is a flag with type string
|
// StringFlag is a flag with type string
|
||||||
type StringFlag struct {
|
type StringFlag struct {
|
||||||
@ -60,6 +63,22 @@ func (f *StringFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *StringFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
if f.Value == "" {
|
||||||
|
return f.Value
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%q", f.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *StringFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *StringFlag) Apply(set *flag.FlagSet) error {
|
func (f *StringFlag) Apply(set *flag.FlagSet) error {
|
||||||
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
|
||||||
|
@ -92,7 +92,7 @@ func (f *StringSliceFlag) IsSet() bool {
|
|||||||
// String returns a readable representation of this value
|
// String returns a readable representation of this value
|
||||||
// (for usage defaults)
|
// (for usage defaults)
|
||||||
func (f *StringSliceFlag) String() string {
|
func (f *StringSliceFlag) String() string {
|
||||||
return FlagStringer(f)
|
return withEnvHint(f.GetEnvVars(), stringifyStringSliceFlag(f))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Names returns the names of the flag
|
// Names returns the names of the flag
|
||||||
@ -129,6 +129,19 @@ func (f *StringSliceFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *StringSliceFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *StringSliceFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *StringSliceFlag) Apply(set *flag.FlagSet) error {
|
func (f *StringSliceFlag) Apply(set *flag.FlagSet) error {
|
||||||
|
|
||||||
|
186
flag_test.go
186
flag_test.go
@ -132,8 +132,13 @@ func TestFlagsFromEnv(t *testing.T) {
|
|||||||
for i, test := range flagTests {
|
for i, test := range flagTests {
|
||||||
defer resetEnv(os.Environ())
|
defer resetEnv(os.Environ())
|
||||||
os.Clearenv()
|
os.Clearenv()
|
||||||
envVarSlice := reflect.Indirect(reflect.ValueOf(test.flag)).FieldByName("EnvVars").Slice(0, 1)
|
|
||||||
_ = os.Setenv(envVarSlice.Index(0).String(), test.input)
|
f, ok := test.flag.(DocGenerationFlag)
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("flag %v needs to implement DocGenerationFlag to retrieve env vars", test.flag)
|
||||||
|
}
|
||||||
|
envVarSlice := f.GetEnvVars()
|
||||||
|
_ = os.Setenv(envVarSlice[0], test.input)
|
||||||
|
|
||||||
a := App{
|
a := App{
|
||||||
Flags: []Flag{test.flag},
|
Flags: []Flag{test.flag},
|
||||||
@ -163,6 +168,183 @@ func TestFlagsFromEnv(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type nodocFlag struct {
|
||||||
|
Flag
|
||||||
|
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFlagStringifying(t *testing.T) {
|
||||||
|
for _, tc := range []struct {
|
||||||
|
name string
|
||||||
|
fl Flag
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "bool-flag",
|
||||||
|
fl: &BoolFlag{Name: "vividly"},
|
||||||
|
expected: "--vividly\t(default: false)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "bool-flag-with-default-text",
|
||||||
|
fl: &BoolFlag{Name: "wildly", DefaultText: "scrambled"},
|
||||||
|
expected: "--wildly\t(default: scrambled)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "duration-flag",
|
||||||
|
fl: &DurationFlag{Name: "scream-for"},
|
||||||
|
expected: "--scream-for value\t(default: 0s)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "duration-flag-with-default-text",
|
||||||
|
fl: &DurationFlag{Name: "feels-about", DefaultText: "whimsically"},
|
||||||
|
expected: "--feels-about value\t(default: whimsically)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "float64-flag",
|
||||||
|
fl: &Float64Flag{Name: "arduous"},
|
||||||
|
expected: "--arduous value\t(default: 0)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "float64-flag-with-default-text",
|
||||||
|
fl: &Float64Flag{Name: "filibuster", DefaultText: "42"},
|
||||||
|
expected: "--filibuster value\t(default: 42)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "float64-slice-flag",
|
||||||
|
fl: &Float64SliceFlag{Name: "pizzas"},
|
||||||
|
expected: "--pizzas value\t",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "float64-slice-flag-with-default-text",
|
||||||
|
fl: &Float64SliceFlag{Name: "pepperonis", DefaultText: "shaved"},
|
||||||
|
expected: "--pepperonis value\t(default: shaved)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "generic-flag",
|
||||||
|
fl: &GenericFlag{Name: "yogurt"},
|
||||||
|
expected: "--yogurt value\t",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "generic-flag-with-default-text",
|
||||||
|
fl: &GenericFlag{Name: "ricotta", DefaultText: "plops"},
|
||||||
|
expected: "--ricotta value\t(default: plops)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "int-flag",
|
||||||
|
fl: &IntFlag{Name: "grubs"},
|
||||||
|
expected: "--grubs value\t(default: 0)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "int-flag-with-default-text",
|
||||||
|
fl: &IntFlag{Name: "poisons", DefaultText: "11ty"},
|
||||||
|
expected: "--poisons value\t(default: 11ty)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "int-slice-flag",
|
||||||
|
fl: &IntSliceFlag{Name: "pencils"},
|
||||||
|
expected: "--pencils value\t",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "int-slice-flag-with-default-text",
|
||||||
|
fl: &IntFlag{Name: "pens", DefaultText: "-19"},
|
||||||
|
expected: "--pens value\t(default: -19)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "int64-flag",
|
||||||
|
fl: &Int64Flag{Name: "flume"},
|
||||||
|
expected: "--flume value\t(default: 0)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "int64-flag-with-default-text",
|
||||||
|
fl: &Int64Flag{Name: "shattering", DefaultText: "22"},
|
||||||
|
expected: "--shattering value\t(default: 22)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "int64-slice-flag",
|
||||||
|
fl: &Int64SliceFlag{Name: "drawers"},
|
||||||
|
expected: "--drawers value\t",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "int64-slice-flag-with-default-text",
|
||||||
|
fl: &Int64SliceFlag{Name: "handles", DefaultText: "-2"},
|
||||||
|
expected: "--handles value\t(default: -2)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "path-flag",
|
||||||
|
fl: &PathFlag{Name: "soup"},
|
||||||
|
expected: "--soup value\t",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "path-flag-with-default-text",
|
||||||
|
fl: &PathFlag{Name: "stew", DefaultText: "charred/beans"},
|
||||||
|
expected: "--stew value\t(default: charred/beans)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "string-flag",
|
||||||
|
fl: &StringFlag{Name: "arf-sound"},
|
||||||
|
expected: "--arf-sound value\t",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "string-flag-with-default-text",
|
||||||
|
fl: &StringFlag{Name: "woof-sound", DefaultText: "urp"},
|
||||||
|
expected: "--woof-sound value\t(default: urp)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "string-slice-flag",
|
||||||
|
fl: &StringSliceFlag{Name: "meow-sounds"},
|
||||||
|
expected: "--meow-sounds value\t",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "string-slice-flag-with-default-text",
|
||||||
|
fl: &StringSliceFlag{Name: "moo-sounds", DefaultText: "awoo"},
|
||||||
|
expected: "--moo-sounds value\t(default: awoo)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "timestamp-flag",
|
||||||
|
fl: &TimestampFlag{Name: "eating"},
|
||||||
|
expected: "--eating value\t",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "timestamp-flag-with-default-text",
|
||||||
|
fl: &TimestampFlag{Name: "sleeping", DefaultText: "earlier"},
|
||||||
|
expected: "--sleeping value\t(default: earlier)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "uint-flag",
|
||||||
|
fl: &UintFlag{Name: "jars"},
|
||||||
|
expected: "--jars value\t(default: 0)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "uint-flag-with-default-text",
|
||||||
|
fl: &UintFlag{Name: "bottles", DefaultText: "99"},
|
||||||
|
expected: "--bottles value\t(default: 99)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "uint64-flag",
|
||||||
|
fl: &Uint64Flag{Name: "cans"},
|
||||||
|
expected: "--cans value\t(default: 0)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "uint64-flag-with-default-text",
|
||||||
|
fl: &UintFlag{Name: "tubes", DefaultText: "13"},
|
||||||
|
expected: "--tubes value\t(default: 13)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "nodoc-flag",
|
||||||
|
fl: &nodocFlag{Name: "scarecrow"},
|
||||||
|
expected: "",
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Run(tc.name, func(ct *testing.T) {
|
||||||
|
s := stringifyFlag(tc.fl)
|
||||||
|
if s != tc.expected {
|
||||||
|
ct.Errorf("stringified flag %q does not match expected %q", s, tc.expected)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var stringFlagTests = []struct {
|
var stringFlagTests = []struct {
|
||||||
name string
|
name string
|
||||||
aliases []string
|
aliases []string
|
||||||
|
@ -119,6 +119,19 @@ func (f *TimestampFlag) IsVisible() bool {
|
|||||||
return !f.Hidden
|
return !f.Hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *TimestampFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *TimestampFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Apply populates the flag given the flag set and environment
|
// Apply populates the flag given the flag set and environment
|
||||||
func (f *TimestampFlag) Apply(set *flag.FlagSet) error {
|
func (f *TimestampFlag) Apply(set *flag.FlagSet) error {
|
||||||
if f.Layout == "" {
|
if f.Layout == "" {
|
||||||
|
13
flag_uint.go
13
flag_uint.go
@ -88,6 +88,19 @@ func (f *UintFlag) GetValue() string {
|
|||||||
return fmt.Sprintf("%d", f.Value)
|
return fmt.Sprintf("%d", f.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *UintFlag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *UintFlag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Uint looks up the value of a local UintFlag, returns
|
// Uint looks up the value of a local UintFlag, returns
|
||||||
// 0 if not found
|
// 0 if not found
|
||||||
func (c *Context) Uint(name string) uint {
|
func (c *Context) Uint(name string) uint {
|
||||||
|
@ -88,6 +88,19 @@ func (f *Uint64Flag) GetValue() string {
|
|||||||
return fmt.Sprintf("%d", f.Value)
|
return fmt.Sprintf("%d", f.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultText returns the default text for this flag
|
||||||
|
func (f *Uint64Flag) GetDefaultText() string {
|
||||||
|
if f.DefaultText != "" {
|
||||||
|
return f.DefaultText
|
||||||
|
}
|
||||||
|
return f.GetValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvVars returns the env vars for this flag
|
||||||
|
func (f *Uint64Flag) GetEnvVars() []string {
|
||||||
|
return f.EnvVars
|
||||||
|
}
|
||||||
|
|
||||||
// Uint64 looks up the value of a local Uint64Flag, returns
|
// Uint64 looks up the value of a local Uint64Flag, returns
|
||||||
// 0 if not found
|
// 0 if not found
|
||||||
func (c *Context) Uint64(name string) uint64 {
|
func (c *Context) Uint64(name string) uint64 {
|
||||||
|
@ -193,7 +193,7 @@ func checkBinarySizeActionFunc(c *cli.Context) (err error) {
|
|||||||
cliBuiltFilePath = "./internal/example-cli/built-example"
|
cliBuiltFilePath = "./internal/example-cli/built-example"
|
||||||
helloSourceFilePath = "./internal/example-hello-world/example-hello-world.go"
|
helloSourceFilePath = "./internal/example-hello-world/example-hello-world.go"
|
||||||
helloBuiltFilePath = "./internal/example-hello-world/built-example"
|
helloBuiltFilePath = "./internal/example-hello-world/built-example"
|
||||||
desiredMinBinarySize = 1.9
|
desiredMinBinarySize = 1.675
|
||||||
desiredMaxBinarySize = 2.2
|
desiredMaxBinarySize = 2.2
|
||||||
badNewsEmoji = "🚨"
|
badNewsEmoji = "🚨"
|
||||||
goodNewsEmoji = "✨"
|
goodNewsEmoji = "✨"
|
||||||
|
Loading…
Reference in New Issue
Block a user