Skip to content

Commit 9087bb8

Browse files
xin-aujohanbrandhorst
authored andcommitted
Support reserved json name and add tests (#1085)
* Support reserved json name and add tests * Correct some variable names * Optimize a logic for assigning a reserved json name to jsonCamelCaseName * Put a logic for checking if there is a reseved json name in the method of lowerCamelCase Fixes #1084
1 parent f712043 commit 9087bb8

File tree

2 files changed

+32
-16
lines changed

2 files changed

+32
-16
lines changed

protoc-gen-swagger/genswagger/template.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ import (
1717
"github.com/golang/glog"
1818
"github.com/golang/protobuf/jsonpb"
1919
"github.com/golang/protobuf/proto"
20-
structpb "github.com/golang/protobuf/ptypes/struct"
2120
pbdescriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
2221
gogen "github.com/golang/protobuf/protoc-gen-go/generator"
22+
structpb "github.com/golang/protobuf/ptypes/struct"
2323
"github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway/descriptor"
2424
swagger_options "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"
2525
)
@@ -621,7 +621,7 @@ func resolveFullyQualifiedNameToSwaggerNames(messages []string, useFQNForSwagger
621621
var canRegexp = regexp.MustCompile("{([a-zA-Z][a-zA-Z0-9_.]*).*}")
622622

623623
// Swagger expects paths of the form /path/{string_value} but grpc-gateway paths are expected to be of the form /path/{string_value=strprefix/*}. This should reformat it correctly.
624-
func templateToSwaggerPath(path string, reg *descriptor.Registry) string {
624+
func templateToSwaggerPath(path string, reg *descriptor.Registry, fields []*descriptor.Field) string {
625625
// It seems like the right thing to do here is to just use
626626
// strings.Split(path, "/") but that breaks badly when you hit a url like
627627
// /{my_field=prefix/*}/ and end up with 2 sections representing my_field.
@@ -650,7 +650,7 @@ func templateToSwaggerPath(path string, reg *descriptor.Registry) string {
650650
if reg.GetUseJSONNamesForFields() &&
651651
len(jsonBuffer) > 1 {
652652
jsonSnakeCaseName := string(jsonBuffer[1:])
653-
jsonCamelCaseName := string(lowerCamelCase(jsonSnakeCaseName))
653+
jsonCamelCaseName := string(lowerCamelCase(jsonSnakeCaseName, fields))
654654
prev := string(buffer[:len(buffer)-len(jsonSnakeCaseName)-2])
655655
buffer = strings.Join([]string{prev, "{", jsonCamelCaseName, "}"}, "")
656656
jsonBuffer = ""
@@ -769,7 +769,7 @@ func renderServices(services []*descriptor.Service, paths swaggerPathsObject, re
769769
}
770770
parameterString := parameter.String()
771771
if reg.GetUseJSONNamesForFields() {
772-
parameterString = lowerCamelCase(parameterString)
772+
parameterString = lowerCamelCase(parameterString, meth.RequestType.Fields)
773773
}
774774
parameters = append(parameters, swaggerParameterObject{
775775
Name: parameterString,
@@ -836,7 +836,7 @@ func renderServices(services []*descriptor.Service, paths swaggerPathsObject, re
836836
parameters = append(parameters, queryParams...)
837837
}
838838

839-
pathItemObject, ok := paths[templateToSwaggerPath(b.PathTmpl.Template, reg)]
839+
pathItemObject, ok := paths[templateToSwaggerPath(b.PathTmpl.Template, reg, meth.RequestType.Fields)]
840840
if !ok {
841841
pathItemObject = swaggerPathItemObject{}
842842
}
@@ -1002,7 +1002,7 @@ func renderServices(services []*descriptor.Service, paths swaggerPathsObject, re
10021002
pathItemObject.Patch = operationObject
10031003
break
10041004
}
1005-
paths[templateToSwaggerPath(b.PathTmpl.Template, reg)] = pathItemObject
1005+
paths[templateToSwaggerPath(b.PathTmpl.Template, reg, meth.RequestType.Fields)] = pathItemObject
10061006
}
10071007
}
10081008
}
@@ -1802,8 +1802,13 @@ func addCustomRefs(d swaggerDefinitionsObject, reg *descriptor.Registry, refs re
18021802
addCustomRefs(d, reg, refs)
18031803
}
18041804

1805-
func lowerCamelCase(parameter string) string {
1806-
parameterString := gogen.CamelCase(parameter)
1805+
func lowerCamelCase(fieldName string, fields []*descriptor.Field) string {
1806+
for _, oneField := range fields {
1807+
if oneField.GetName() == fieldName {
1808+
return oneField.GetJsonName()
1809+
}
1810+
}
1811+
parameterString := gogen.CamelCase(fieldName)
18071812
builder := &strings.Builder{}
18081813
builder.WriteString(strings.ToLower(string(parameterString[0])))
18091814
builder.WriteString(parameterString[1:])

protoc-gen-swagger/genswagger/template_test.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,15 @@ func TestApplyTemplateRequestWithUnusedReferences(t *testing.T) {
986986
}
987987
}
988988

989+
func generateFieldsForJSONReservedName() []*descriptor.Field {
990+
fields := make([]*descriptor.Field, 0)
991+
fieldName := string("json_name")
992+
fieldJSONName := string("jsonNAME")
993+
fieldDescriptor := protodescriptor.FieldDescriptorProto{Name: &fieldName, JsonName: &fieldJSONName}
994+
field := &descriptor.Field{FieldDescriptorProto: &fieldDescriptor}
995+
return append(fields, field)
996+
}
997+
989998
func TestTemplateWithJsonCamelCase(t *testing.T) {
990999
var tests = []struct {
9911000
input string
@@ -1002,11 +1011,12 @@ func TestTemplateWithJsonCamelCase(t *testing.T) {
10021011
{"test/{ab}", "test/{ab}"},
10031012
{"test/{a_a}", "test/{aA}"},
10041013
{"test/{ab_c}", "test/{abC}"},
1014+
{"test/{json_name}", "test/{jsonNAME}"},
10051015
}
10061016
reg := descriptor.NewRegistry()
10071017
reg.SetUseJSONNamesForFields(true)
10081018
for _, data := range tests {
1009-
actual := templateToSwaggerPath(data.input, reg)
1019+
actual := templateToSwaggerPath(data.input, reg, generateFieldsForJSONReservedName())
10101020
if data.expected != actual {
10111021
t.Errorf("Expected templateToSwaggerPath(%v) = %v, actual: %v", data.input, data.expected, actual)
10121022
}
@@ -1028,11 +1038,12 @@ func TestTemplateWithoutJsonCamelCase(t *testing.T) {
10281038
{"test/{a}", "test/{a}"},
10291039
{"test/{ab}", "test/{ab}"},
10301040
{"test/{a_a}", "test/{a_a}"},
1041+
{"test/{json_name}", "test/{json_name}"},
10311042
}
10321043
reg := descriptor.NewRegistry()
10331044
reg.SetUseJSONNamesForFields(false)
10341045
for _, data := range tests {
1035-
actual := templateToSwaggerPath(data.input, reg)
1046+
actual := templateToSwaggerPath(data.input, reg, generateFieldsForJSONReservedName())
10361047
if data.expected != actual {
10371048
t.Errorf("Expected templateToSwaggerPath(%v) = %v, actual: %v", data.input, data.expected, actual)
10381049
}
@@ -1064,14 +1075,14 @@ func TestTemplateToSwaggerPath(t *testing.T) {
10641075
reg := descriptor.NewRegistry()
10651076
reg.SetUseJSONNamesForFields(false)
10661077
for _, data := range tests {
1067-
actual := templateToSwaggerPath(data.input, reg)
1078+
actual := templateToSwaggerPath(data.input, reg, generateFieldsForJSONReservedName())
10681079
if data.expected != actual {
10691080
t.Errorf("Expected templateToSwaggerPath(%v) = %v, actual: %v", data.input, data.expected, actual)
10701081
}
10711082
}
10721083
reg.SetUseJSONNamesForFields(true)
10731084
for _, data := range tests {
1074-
actual := templateToSwaggerPath(data.input, reg)
1085+
actual := templateToSwaggerPath(data.input, reg, generateFieldsForJSONReservedName())
10751086
if data.expected != actual {
10761087
t.Errorf("Expected templateToSwaggerPath(%v) = %v, actual: %v", data.input, data.expected, actual)
10771088
}
@@ -1086,7 +1097,7 @@ func BenchmarkTemplateToSwaggerPath(b *testing.B) {
10861097
reg.SetUseJSONNamesForFields(false)
10871098

10881099
for i := 0; i < b.N; i++ {
1089-
_ = templateToSwaggerPath(input, reg)
1100+
_ = templateToSwaggerPath(input, reg, generateFieldsForJSONReservedName())
10901101
}
10911102
})
10921103

@@ -1095,7 +1106,7 @@ func BenchmarkTemplateToSwaggerPath(b *testing.B) {
10951106
reg.SetUseJSONNamesForFields(true)
10961107

10971108
for i := 0; i < b.N; i++ {
1098-
_ = templateToSwaggerPath(input, reg)
1109+
_ = templateToSwaggerPath(input, reg, generateFieldsForJSONReservedName())
10991110
}
11001111
})
11011112
}
@@ -1171,14 +1182,14 @@ func TestFQMNtoSwaggerName(t *testing.T) {
11711182
reg := descriptor.NewRegistry()
11721183
reg.SetUseJSONNamesForFields(false)
11731184
for _, data := range tests {
1174-
actual := templateToSwaggerPath(data.input, reg)
1185+
actual := templateToSwaggerPath(data.input, reg, generateFieldsForJSONReservedName())
11751186
if data.expected != actual {
11761187
t.Errorf("Expected templateToSwaggerPath(%v) = %v, actual: %v", data.input, data.expected, actual)
11771188
}
11781189
}
11791190
reg.SetUseJSONNamesForFields(true)
11801191
for _, data := range tests {
1181-
actual := templateToSwaggerPath(data.input, reg)
1192+
actual := templateToSwaggerPath(data.input, reg, generateFieldsForJSONReservedName())
11821193
if data.expected != actual {
11831194
t.Errorf("Expected templateToSwaggerPath(%v) = %v, actual: %v", data.input, data.expected, actual)
11841195
}

0 commit comments

Comments
 (0)