|
|
@@ -49,6 +49,7 @@ type Configuration struct {
|
|
|
CircularDepth *int
|
|
|
DefaultResponse *bool
|
|
|
OutputMode *string
|
|
|
+ PreserveInfo *bool
|
|
|
}
|
|
|
|
|
|
const (
|
|
|
@@ -166,6 +167,14 @@ func (g *OpenAPIv3Generator) buildDocumentV3() *v3.Document {
|
|
|
d.Tags[0].Description = ""
|
|
|
}
|
|
|
|
|
|
+ if g.conf.PreserveInfo != nil && *g.conf.PreserveInfo {
|
|
|
+ d.Info = &v3.Info{
|
|
|
+ Version: *g.conf.Version,
|
|
|
+ Title: *g.conf.Title,
|
|
|
+ Description: *g.conf.Description,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
allServers := []string{}
|
|
|
|
|
|
// If paths methods has servers, but they're all the same, then move servers to path level
|
|
|
@@ -175,35 +184,35 @@ func (g *OpenAPIv3Generator) buildDocumentV3() *v3.Document {
|
|
|
|
|
|
if path.Value.Get != nil && len(path.Value.Get.Servers) == 1 {
|
|
|
servers = appendUnique(servers, path.Value.Get.Servers[0].Url)
|
|
|
- allServers = appendUnique(servers, path.Value.Get.Servers[0].Url)
|
|
|
+ allServers = appendUnique(allServers, path.Value.Get.Servers[0].Url)
|
|
|
}
|
|
|
if path.Value.Post != nil && len(path.Value.Post.Servers) == 1 {
|
|
|
servers = appendUnique(servers, path.Value.Post.Servers[0].Url)
|
|
|
- allServers = appendUnique(servers, path.Value.Post.Servers[0].Url)
|
|
|
+ allServers = appendUnique(allServers, path.Value.Post.Servers[0].Url)
|
|
|
}
|
|
|
if path.Value.Put != nil && len(path.Value.Put.Servers) == 1 {
|
|
|
servers = appendUnique(servers, path.Value.Put.Servers[0].Url)
|
|
|
- allServers = appendUnique(servers, path.Value.Put.Servers[0].Url)
|
|
|
+ allServers = appendUnique(allServers, path.Value.Put.Servers[0].Url)
|
|
|
}
|
|
|
if path.Value.Delete != nil && len(path.Value.Delete.Servers) == 1 {
|
|
|
servers = appendUnique(servers, path.Value.Delete.Servers[0].Url)
|
|
|
- allServers = appendUnique(servers, path.Value.Delete.Servers[0].Url)
|
|
|
+ allServers = appendUnique(allServers, path.Value.Delete.Servers[0].Url)
|
|
|
}
|
|
|
if path.Value.Patch != nil && len(path.Value.Patch.Servers) == 1 {
|
|
|
servers = appendUnique(servers, path.Value.Patch.Servers[0].Url)
|
|
|
- allServers = appendUnique(servers, path.Value.Patch.Servers[0].Url)
|
|
|
+ allServers = appendUnique(allServers, path.Value.Patch.Servers[0].Url)
|
|
|
}
|
|
|
if path.Value.Head != nil && len(path.Value.Head.Servers) == 1 {
|
|
|
servers = appendUnique(servers, path.Value.Head.Servers[0].Url)
|
|
|
- allServers = appendUnique(servers, path.Value.Head.Servers[0].Url)
|
|
|
+ allServers = appendUnique(allServers, path.Value.Head.Servers[0].Url)
|
|
|
}
|
|
|
if path.Value.Options != nil && len(path.Value.Options.Servers) == 1 {
|
|
|
servers = appendUnique(servers, path.Value.Options.Servers[0].Url)
|
|
|
- allServers = appendUnique(servers, path.Value.Options.Servers[0].Url)
|
|
|
+ allServers = appendUnique(allServers, path.Value.Options.Servers[0].Url)
|
|
|
}
|
|
|
if path.Value.Trace != nil && len(path.Value.Trace.Servers) == 1 {
|
|
|
servers = appendUnique(servers, path.Value.Trace.Servers[0].Url)
|
|
|
- allServers = appendUnique(servers, path.Value.Trace.Servers[0].Url)
|
|
|
+ allServers = appendUnique(allServers, path.Value.Trace.Servers[0].Url)
|
|
|
}
|
|
|
|
|
|
if len(servers) == 1 {
|
|
|
@@ -275,6 +284,93 @@ func (g *OpenAPIv3Generator) buildDocumentV3() *v3.Document {
|
|
|
})
|
|
|
d.Components.Schemas.AdditionalProperties = pairs
|
|
|
}
|
|
|
+ // Deduplicate and sort security schemes.
|
|
|
+ if d.Components.SecuritySchemes != nil && d.Components.SecuritySchemes.AdditionalProperties != nil {
|
|
|
+ seen := make(map[string]bool)
|
|
|
+ unique := make([]*v3.NamedSecuritySchemeOrReference, 0)
|
|
|
+ for _, scheme := range d.Components.SecuritySchemes.AdditionalProperties {
|
|
|
+ if !seen[scheme.Name] {
|
|
|
+ seen[scheme.Name] = true
|
|
|
+ unique = append(unique, scheme)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sort.Slice(unique, func(i, j int) bool {
|
|
|
+ return unique[i].Name < unique[j].Name
|
|
|
+ })
|
|
|
+ d.Components.SecuritySchemes.AdditionalProperties = unique
|
|
|
+ }
|
|
|
+ // Deduplicate and sort responses.
|
|
|
+ if d.Components.Responses != nil && d.Components.Responses.AdditionalProperties != nil {
|
|
|
+ seen := make(map[string]bool)
|
|
|
+ unique := make([]*v3.NamedResponseOrReference, 0)
|
|
|
+ for _, resp := range d.Components.Responses.AdditionalProperties {
|
|
|
+ if !seen[resp.Name] {
|
|
|
+ seen[resp.Name] = true
|
|
|
+ unique = append(unique, resp)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sort.Slice(unique, func(i, j int) bool {
|
|
|
+ return unique[i].Name < unique[j].Name
|
|
|
+ })
|
|
|
+ d.Components.Responses.AdditionalProperties = unique
|
|
|
+ }
|
|
|
+ // Deduplicate and sort parameters.
|
|
|
+ if d.Components.Parameters != nil && d.Components.Parameters.AdditionalProperties != nil {
|
|
|
+ seen := make(map[string]bool)
|
|
|
+ unique := make([]*v3.NamedParameterOrReference, 0)
|
|
|
+ for _, param := range d.Components.Parameters.AdditionalProperties {
|
|
|
+ if !seen[param.Name] {
|
|
|
+ seen[param.Name] = true
|
|
|
+ unique = append(unique, param)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sort.Slice(unique, func(i, j int) bool {
|
|
|
+ return unique[i].Name < unique[j].Name
|
|
|
+ })
|
|
|
+ d.Components.Parameters.AdditionalProperties = unique
|
|
|
+ }
|
|
|
+ // Deduplicate and sort request bodies.
|
|
|
+ if d.Components.RequestBodies != nil && d.Components.RequestBodies.AdditionalProperties != nil {
|
|
|
+ seen := make(map[string]bool)
|
|
|
+ unique := make([]*v3.NamedRequestBodyOrReference, 0)
|
|
|
+ for _, body := range d.Components.RequestBodies.AdditionalProperties {
|
|
|
+ if !seen[body.Name] {
|
|
|
+ seen[body.Name] = true
|
|
|
+ unique = append(unique, body)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sort.Slice(unique, func(i, j int) bool {
|
|
|
+ return unique[i].Name < unique[j].Name
|
|
|
+ })
|
|
|
+ d.Components.RequestBodies.AdditionalProperties = unique
|
|
|
+ }
|
|
|
+ // Deduplicate and sort headers.
|
|
|
+ if d.Components.Headers != nil && d.Components.Headers.AdditionalProperties != nil {
|
|
|
+ seen := make(map[string]bool)
|
|
|
+ unique := make([]*v3.NamedHeaderOrReference, 0)
|
|
|
+ for _, header := range d.Components.Headers.AdditionalProperties {
|
|
|
+ if !seen[header.Name] {
|
|
|
+ seen[header.Name] = true
|
|
|
+ unique = append(unique, header)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sort.Slice(unique, func(i, j int) bool {
|
|
|
+ return unique[i].Name < unique[j].Name
|
|
|
+ })
|
|
|
+ d.Components.Headers.AdditionalProperties = unique
|
|
|
+ }
|
|
|
+ // Deduplicate servers by URL.
|
|
|
+ if d.Servers != nil && len(d.Servers) > 0 {
|
|
|
+ seen := make(map[string]bool)
|
|
|
+ unique := make([]*v3.Server, 0)
|
|
|
+ for _, server := range d.Servers {
|
|
|
+ if !seen[server.Url] {
|
|
|
+ seen[server.Url] = true
|
|
|
+ unique = append(unique, server)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ d.Servers = unique
|
|
|
+ }
|
|
|
return d
|
|
|
}
|
|
|
|
|
|
@@ -807,7 +903,7 @@ func (g *OpenAPIv3Generator) addPathsToDocumentV3(d *v3.Document, services []*pr
|
|
|
defaultHost := proto.GetExtension(service.Desc.Options(), annotations.E_DefaultHost).(string)
|
|
|
|
|
|
op, path2 := g.buildOperationV3(
|
|
|
- d, operationID, service.GoName, comment, defaultHost, path, bodyField, inputMessage, outputMessage)
|
|
|
+ d, operationID, d.Info.Title, comment, defaultHost, path, bodyField, inputMessage, outputMessage)
|
|
|
|
|
|
// Merge any `Operation` annotations with the current
|
|
|
proto.Merge(op, extOperation.(*v3.Operation))
|
|
|
@@ -816,8 +912,7 @@ func (g *OpenAPIv3Generator) addPathsToDocumentV3(d *v3.Document, services []*pr
|
|
|
}
|
|
|
|
|
|
if annotationsCount > 0 {
|
|
|
- comment := g.filterCommentString(service.Comments.Leading)
|
|
|
- d.Tags = append(d.Tags, &v3.Tag{Name: service.GoName, Description: comment})
|
|
|
+ d.Tags = append(d.Tags, &v3.Tag{Name: d.Info.Title, Description: d.Info.Description})
|
|
|
}
|
|
|
}
|
|
|
}
|