-
Notifications
You must be signed in to change notification settings - Fork 4.2k
fix(client/v2): fix short command description if not set and skip unsupported commands #18324
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 11 commits
3dd1900
c73e823
34acc51
40581b6
0c9c246
bf3b611
a3a2fe6
863b63d
21e6e8b
87a485d
ebef8d4
8114d66
66a586c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,17 +1,29 @@ | ||
| package util | ||
|
|
||
| import ( | ||
| "regexp" | ||
| "runtime/debug" | ||
| "strings" | ||
|
|
||
| "google.golang.org/protobuf/reflect/protoreflect" | ||
| "google.golang.org/protobuf/reflect/protoregistry" | ||
| "google.golang.org/protobuf/types/dynamicpb" | ||
|
|
||
| "cosmossdk.io/client/v2/internal/strcase" | ||
| ) | ||
|
|
||
| // get build info to verify later if comment is supported | ||
| // this is a hack in because of the global api module package | ||
| // later versions unsupported by the current version can be added | ||
| var buildInfo, _ = debug.ReadBuildInfo() | ||
|
julienrbrt marked this conversation as resolved.
|
||
|
|
||
| // DescriptorName returns the name of the descriptor in kebab case. | ||
| func DescriptorKebabName(descriptor protoreflect.Descriptor) string { | ||
| return strcase.ToKebab(string(descriptor.Name())) | ||
| } | ||
|
|
||
| // DescriptorDocs returns the leading comments of the descriptor. | ||
| // TODO this does not work, to fix. | ||
| func DescriptorDocs(descriptor protoreflect.Descriptor) string { | ||
| return descriptor.ParentFile().SourceLocations().ByDescriptor(descriptor).LeadingComments | ||
| } | ||
|
julienrbrt marked this conversation as resolved.
|
||
|
|
@@ -24,3 +36,56 @@ func ResolveMessageType(resolver protoregistry.MessageTypeResolver, descriptor p | |
|
|
||
| return dynamicpb.NewMessageType(descriptor) | ||
| } | ||
|
|
||
| // IsSupportedVersion is used to determine in which version of a module / sdk a rpc was introduced. | ||
| // It returns false if the rpc has comment for an higher version than the current one. | ||
| func IsSupportedVersion(input string) bool { | ||
| return isSupportedVersion(input, buildInfo) | ||
| } | ||
|
julienrbrt marked this conversation as resolved.
|
||
|
|
||
| // isSupportedVersion is used to determine in which version of a module / sdk a rpc was introduced. | ||
| // It returns false if the rpc has comment for an higher version than the current one. | ||
| // It takes a buildInfo as argument to be able to test it. | ||
| func isSupportedVersion(input string, buildInfo *debug.BuildInfo) bool { | ||
| if input == "" || buildInfo == nil { | ||
| return true | ||
| } | ||
|
|
||
| moduleName, version := parseSinceComment(input) | ||
| for _, dep := range buildInfo.Deps { | ||
| if !strings.Contains(dep.Path, moduleName) { | ||
| continue | ||
| } | ||
|
|
||
| if version <= dep.Version { | ||
|
julienrbrt marked this conversation as resolved.
Outdated
|
||
| return true | ||
| } | ||
|
|
||
| return false | ||
| } | ||
|
|
||
| return true // if cannot find the module consider it's supported | ||
| } | ||
|
julienrbrt marked this conversation as resolved.
julienrbrt marked this conversation as resolved.
|
||
|
|
||
| // parseSinceComment parses the `// Since: cosmos-sdk v0.xx` comment on rpc. | ||
| func parseSinceComment(input string) (string, string) { | ||
| var ( | ||
| moduleName string | ||
| version string | ||
| ) | ||
|
|
||
| input = strings.ToLower(input) | ||
| input = strings.ReplaceAll(input, "cosmos sdk", "cosmos-sdk") | ||
|
|
||
| re := regexp.MustCompile(`\/\/\s?since: (\S+) (\S+)`) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The comment above says "Since", yet this regex uses "since", but we aren't using the case insensitive flag "(?i)" We could simply use "[sS]ince". I highly recommend removing the strings.ToLower then simply using that regexp suggestion that I've made. This way if some module's name is for example PbValidator, it won't be returned as "pbvalidator"
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Case insensitive definitely makes sense, but I am getting that with strings.ToLower.
julienrbrt marked this conversation as resolved.
Outdated
|
||
| matches := re.FindStringSubmatch(input) | ||
| if len(matches) >= 3 { | ||
| moduleName, version = matches[1], matches[2] | ||
|
|
||
| if !strings.Contains(version, "v") { | ||
|
julienrbrt marked this conversation as resolved.
Outdated
|
||
| version = "v" + version | ||
| } | ||
| } | ||
|
|
||
| return moduleName, version | ||
| } | ||
|
julienrbrt marked this conversation as resolved.
julienrbrt marked this conversation as resolved.
julienrbrt marked this conversation as resolved.
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,151 @@ | ||
| package util | ||
|
|
||
| import ( | ||
| "runtime/debug" | ||
| "testing" | ||
| ) | ||
|
|
||
| func TestIsSupportedVersion(t *testing.T) { | ||
| mockBuildInfo := &debug.BuildInfo{ | ||
| Deps: []*debug.Module{ | ||
| { | ||
| Path: "github.com/cosmos/cosmos-sdk", | ||
| Version: "v0.50.0", | ||
| }, | ||
| { | ||
| Path: "cosmossdk.io/feegrant", | ||
| Version: "v0.1.0", | ||
| }, | ||
| }, | ||
| } | ||
|
|
||
| cases := []struct { | ||
| input string | ||
| expected bool | ||
| }{ | ||
| { | ||
| input: "", | ||
| expected: true, | ||
| }, | ||
| { | ||
| input: "not a since comment", | ||
| expected: true, | ||
| }, | ||
| { | ||
| input: "// Since: cosmos-sdk v0.47", | ||
| expected: true, | ||
| }, | ||
| { | ||
| input: "// since: Cosmos-SDK 0.50", | ||
| expected: true, | ||
| }, | ||
| { | ||
| input: "// Since: cosmos-sdk v0.51", | ||
| expected: false, | ||
| }, | ||
| { | ||
| input: "// Since: cosmos-sdk v1.0.0", | ||
| expected: false, | ||
| }, | ||
| { | ||
| input: "// since: x/feegrant v0.1.0", | ||
| expected: true, | ||
| }, | ||
| { | ||
| input: "// since: feegrant v0.0.1", | ||
| expected: true, | ||
| }, | ||
| { | ||
| input: "// since: feegrant v0.1.0", | ||
| expected: true, | ||
| }, | ||
| { | ||
| input: "// since: feegrant v0.1", | ||
| expected: true, | ||
| }, | ||
| { | ||
| input: "// since: feegrant v0.1.1", | ||
| expected: false, | ||
| }, | ||
| { | ||
| input: "// since: feegrant v0.2.0", | ||
| expected: false, | ||
| }, | ||
| } | ||
|
|
||
| for _, tc := range cases { | ||
| resp := isSupportedVersion(tc.input, mockBuildInfo) | ||
| if resp != tc.expected { | ||
| t.Errorf("expected %v, got %v", tc.expected, resp) | ||
| } | ||
|
|
||
| resp = isSupportedVersion(tc.input, &debug.BuildInfo{}) | ||
| if !resp { | ||
| t.Errorf("expected %v, got %v", true, resp) | ||
| } | ||
| } | ||
| } | ||
|
|
||
| func TestParseSinceComment(t *testing.T) { | ||
| cases := []struct { | ||
| input string | ||
| expectedModuleName string | ||
| expectedVersion string | ||
| }{ | ||
| { | ||
| input: "", | ||
| expectedModuleName: "", | ||
| expectedVersion: "", | ||
| }, | ||
| { | ||
| input: "not a since comment", | ||
| expectedModuleName: "", | ||
| expectedVersion: "", | ||
| }, | ||
| { | ||
| input: "// since: Cosmos SDK 0.50", | ||
| expectedModuleName: "cosmos-sdk", | ||
| expectedVersion: "v0.50", | ||
| }, | ||
| { | ||
| input: "// since: cosmos sdk 0.50", | ||
| expectedModuleName: "cosmos-sdk", | ||
| expectedVersion: "v0.50", | ||
| }, | ||
| { | ||
| input: "// since: Cosmos-SDK 0.50", | ||
| expectedModuleName: "cosmos-sdk", | ||
| expectedVersion: "v0.50", | ||
| }, | ||
| { | ||
| input: "// Since: cosmos-sdk v0.50", | ||
| expectedModuleName: "cosmos-sdk", | ||
| expectedVersion: "v0.50", | ||
| }, | ||
| { | ||
| input: "//since: cosmos-sdk v0.50.1", | ||
| expectedModuleName: "cosmos-sdk", | ||
| expectedVersion: "v0.50.1", | ||
| }, | ||
| { | ||
| input: "// Since: x/feegrant v0.1.0", | ||
| expectedModuleName: "x/feegrant", | ||
| expectedVersion: "v0.1.0", | ||
| }, | ||
| { | ||
| input: "// since: x/feegrant 0.1", | ||
| expectedModuleName: "x/feegrant", | ||
| expectedVersion: "v0.1", | ||
| }, | ||
| } | ||
|
|
||
| for _, tc := range cases { | ||
| moduleName, version := parseSinceComment(tc.input) | ||
| if moduleName != tc.expectedModuleName { | ||
| t.Errorf("expected module name %s, got %s", tc.expectedModuleName, moduleName) | ||
| } | ||
| if version != tc.expectedVersion { | ||
| t.Errorf("expected version %s, got %s", tc.expectedVersion, version) | ||
| } | ||
| } | ||
| } | ||
|
julienrbrt marked this conversation as resolved.
|
||
Uh oh!
There was an error while loading. Please reload this page.