From 242d2d65e73f6c487a5c167520869cac755c5541 Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Tue, 21 Oct 2025 06:55:56 -0400 Subject: [PATCH 1/6] Fix: Remove reflection in getFlagDefaultValue --- docs.go | 19 +++++++++++-------- go.mod | 4 ++-- go.sum | 4 ++++ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/docs.go b/docs.go index 0c352b0..5b7ccf3 100644 --- a/docs.go +++ b/docs.go @@ -6,7 +6,6 @@ import ( "fmt" "io" "os" - "reflect" "regexp" "runtime" "sort" @@ -567,13 +566,11 @@ func (tabularTemplate) Prettify(s string) string { // getFlagDefaultValue returns the default text or default value of a flag. // cli.BoolFlag will always return an default. func getFlagDefaultValue(f cli.DocGenerationFlag) (value, text string) { - // GetDefaultText also returns GetValue so we have to use reflection - if ref := reflect.ValueOf(f); ref.Kind() == reflect.Ptr && ref.Elem().Kind() == reflect.Struct { - if val := ref.Elem().FieldByName("DefaultText"); val.IsValid() && val.Type().Kind() == reflect.String { - if defaultText := val.Interface().(string); defaultText != "" { - return "", defaultText - } + if defaultText := f.GetDefaultText(); defaultText != "" { + if strings.HasPrefix(defaultText, "\"") && strings.HasSuffix(defaultText, "\"") { + defaultText = defaultText[1 : len(defaultText)-1] } + return "", defaultText } if !f.TakesValue() { @@ -583,5 +580,11 @@ func getFlagDefaultValue(f cli.DocGenerationFlag) (value, text string) { return "", "" } - return f.GetValue(), "" + if value := f.GetValue(); value != "" { + if strings.HasPrefix(value, "\"") && strings.HasSuffix(value, "\"") { + value = value[1 : len(value)-1] + } + return value, "" + } + return "", "" } diff --git a/go.mod b/go.mod index 56f0087..0c2dc0d 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.24.4 require ( github.com/cpuguy83/go-md2man/v2 v2.0.2 - github.com/stretchr/testify v1.10.0 - github.com/urfave/cli/v3 v3.4.1 + github.com/stretchr/testify v1.11.1 + github.com/urfave/cli/v3 v3.5.0 ) require ( diff --git a/go.sum b/go.sum index c4bbf44..83f6a87 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,12 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/urfave/cli/v3 v3.4.1 h1:1M9UOCy5bLmGnuu1yn3t3CB4rG79Rtoxuv1sPhnm6qM= github.com/urfave/cli/v3 v3.4.1/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= +github.com/urfave/cli/v3 v3.5.0 h1:qCuFMmdayTF3zmjG8TSsoBzrDqszNrklYg2x3g4MSgw= +github.com/urfave/cli/v3 v3.5.0/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 8abc358c829578caef04ae91f77f6d0fd3884f70 Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Wed, 22 Oct 2025 06:49:19 -0400 Subject: [PATCH 2/6] Use strings.Trim --- docs.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/docs.go b/docs.go index 5b7ccf3..2bfc3ea 100644 --- a/docs.go +++ b/docs.go @@ -567,10 +567,7 @@ func (tabularTemplate) Prettify(s string) string { // cli.BoolFlag will always return an default. func getFlagDefaultValue(f cli.DocGenerationFlag) (value, text string) { if defaultText := f.GetDefaultText(); defaultText != "" { - if strings.HasPrefix(defaultText, "\"") && strings.HasSuffix(defaultText, "\"") { - defaultText = defaultText[1 : len(defaultText)-1] - } - return "", defaultText + return "", strings.Trim(defaultText, "\"") } if !f.TakesValue() { @@ -581,10 +578,7 @@ func getFlagDefaultValue(f cli.DocGenerationFlag) (value, text string) { } if value := f.GetValue(); value != "" { - if strings.HasPrefix(value, "\"") && strings.HasSuffix(value, "\"") { - value = value[1 : len(value)-1] - } - return value, "" + return strings.Trim(value, "\""), "" } return "", "" } From ddcf57181961479fa406b9c715c5e77ac473886d Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Wed, 22 Oct 2025 06:52:51 -0400 Subject: [PATCH 3/6] Use strings.Trim --- docs.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs.go b/docs.go index 2bfc3ea..c3a264b 100644 --- a/docs.go +++ b/docs.go @@ -567,7 +567,11 @@ func (tabularTemplate) Prettify(s string) string { // cli.BoolFlag will always return an default. func getFlagDefaultValue(f cli.DocGenerationFlag) (value, text string) { if defaultText := f.GetDefaultText(); defaultText != "" { - return "", strings.Trim(defaultText, "\"") + if _, ok := f.(*cli.StringFlag); ok { + return "", strings.Trim(defaultText, "\"") + } else { + return "", defaultText + } } if !f.TakesValue() { @@ -578,7 +582,11 @@ func getFlagDefaultValue(f cli.DocGenerationFlag) (value, text string) { } if value := f.GetValue(); value != "" { - return strings.Trim(value, "\""), "" + if _, ok := f.(*cli.StringFlag); ok { + return strings.Trim(value, "\""), "" + } else { + return value, "" + } } return "", "" } From 866e8b9dcb621cb2db7208d42e196d7df8310f8b Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Wed, 22 Oct 2025 06:57:32 -0400 Subject: [PATCH 4/6] Use strings.Trim --- docs.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs.go b/docs.go index c3a264b..3d72121 100644 --- a/docs.go +++ b/docs.go @@ -567,11 +567,7 @@ func (tabularTemplate) Prettify(s string) string { // cli.BoolFlag will always return an default. func getFlagDefaultValue(f cli.DocGenerationFlag) (value, text string) { if defaultText := f.GetDefaultText(); defaultText != "" { - if _, ok := f.(*cli.StringFlag); ok { - return "", strings.Trim(defaultText, "\"") - } else { - return "", defaultText - } + return "", defaultText } if !f.TakesValue() { From c883f4b5dc35190db82d86032b46862646ce6929 Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Wed, 22 Oct 2025 06:59:29 -0400 Subject: [PATCH 5/6] Run go mod tidy --- go.sum | 4 ---- 1 file changed, 4 deletions(-) diff --git a/go.sum b/go.sum index 83f6a87..4a68359 100644 --- a/go.sum +++ b/go.sum @@ -6,12 +6,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/urfave/cli/v3 v3.4.1 h1:1M9UOCy5bLmGnuu1yn3t3CB4rG79Rtoxuv1sPhnm6qM= -github.com/urfave/cli/v3 v3.4.1/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= github.com/urfave/cli/v3 v3.5.0 h1:qCuFMmdayTF3zmjG8TSsoBzrDqszNrklYg2x3g4MSgw= github.com/urfave/cli/v3 v3.5.0/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= From 771733ad90c6eed238c6ce9926efdd362831e02d Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Wed, 22 Oct 2025 07:31:31 -0400 Subject: [PATCH 6/6] Fix tests --- docs_test.go | 20 +++++----- testdata/expected-doc-all-flag-types.md | 52 ++++++++++++------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/docs_test.go b/docs_test.go index e4e47d7..cdad29b 100644 --- a/docs_test.go +++ b/docs_test.go @@ -51,16 +51,16 @@ func buildFlagTest(t *testing.T) *cli.Command { &cli.StringMapFlag{Name: "string-map-set", Value: map[string]string{"a": "b"}}, &cli.StringSliceFlag{Name: "string-slice-empty"}, &cli.StringSliceFlag{Name: "string-slice-set", Value: []string{"a", "b"}}, - &cli.IntFlag{Name: "string-empty"}, - &cli.IntFlag{Name: "string-set", Value: 42}, - &cli.UintFlag{Name: "string-empty"}, - &cli.UintFlag{Name: "string-set", Value: 21}, - &cli.FloatFlag{Name: "string-empty"}, - &cli.FloatFlag{Name: "string-set", Value: 88.32}, - &cli.DurationFlag{Name: "string-empty"}, - &cli.DurationFlag{Name: "string-set", Value: 12 * time.Minute}, - &cli.TimestampFlag{Name: "string-empty"}, - &cli.TimestampFlag{Name: "string-set", Value: time.Unix(1729456800, 0).UTC()}, + &cli.IntFlag{Name: "int-empty"}, + &cli.IntFlag{Name: "int-set", Value: 42}, + &cli.UintFlag{Name: "uint-empty"}, + &cli.UintFlag{Name: "uint-set", Value: 21}, + &cli.FloatFlag{Name: "float-empty"}, + &cli.FloatFlag{Name: "float-set", Value: 88.32}, + &cli.DurationFlag{Name: "duration-empty"}, + &cli.DurationFlag{Name: "duration-set", Value: 12 * time.Minute}, + &cli.TimestampFlag{Name: "timestamp-empty"}, + &cli.TimestampFlag{Name: "timestamp-set", Value: time.Unix(1729456800, 0).UTC()}, }} } diff --git a/testdata/expected-doc-all-flag-types.md b/testdata/expected-doc-all-flag-types.md index 74d1078..e6e8142 100644 --- a/testdata/expected-doc-all-flag-types.md +++ b/testdata/expected-doc-all-flag-types.md @@ -9,22 +9,22 @@ main ``` [--bool-false] [--bool-true] -[--string-empty]=[value] -[--string-empty]=[value] -[--string-empty]=[value] -[--string-empty]=[value] -[--string-empty]=[value] +[--duration-empty]=[value] +[--duration-set]=[value] +[--float-empty]=[value] +[--float-set]=[value] +[--int-empty]=[value] +[--int-set]=[value] [--string-empty]=[value] [--string-map-empty]=[value] [--string-map-set]=[value] [--string-set]=[value] -[--string-set]=[value] -[--string-set]=[value] -[--string-set]=[value] -[--string-set]=[value] -[--string-set]=[value] [--string-slice-empty]=[value] [--string-slice-set]=[value] +[--timestamp-empty]=[value] +[--timestamp-set]=[value] +[--uint-empty]=[value] +[--uint-set]=[value] ``` **Usage**: @@ -39,35 +39,35 @@ main [GLOBAL OPTIONS] [command [COMMAND OPTIONS]] [ARGUMENTS...] **--bool-true**: (default: true) -**--string-empty**="": +**--duration-empty**="": (default: 0s) -**--string-empty**="": (default: 0) +**--duration-set**="": (default: 12m0s) -**--string-empty**="": (default: 0) +**--float-empty**="": (default: 0) -**--string-empty**="": (default: 0) +**--float-set**="": (default: 88.32) -**--string-empty**="": (default: 0001-01-01 00:00:00 +0000 UTC) +**--int-empty**="": (default: 0) -**--string-empty**="": (default: 0s) +**--int-set**="": (default: 42) -**--string-map-empty**="": (default: map[]) +**--string-empty**="": -**--string-map-set**="": (default: map[a:b]) +**--string-map-empty**="": -**--string-set**="": (default: 12m0s) +**--string-map-set**="": (default: a="b") -**--string-set**="": (default: 2024-10-20 20:40:00 +0000 UTC) +**--string-set**="": (default: a string) -**--string-set**="": (default: 21) +**--string-slice-empty**="": -**--string-set**="": (default: 42) +**--string-slice-set**="": (default: "a", "b") -**--string-set**="": (default: 88.32) +**--timestamp-empty**="": -**--string-set**="": (default: a string) +**--timestamp-set**="": (default: 2024-10-20 20:40:00 +0000 UTC) -**--string-slice-empty**="": (default: []) +**--uint-empty**="": (default: 0) -**--string-slice-set**="": (default: [a b]) +**--uint-set**="": (default: 21)