grpc-ecosystem / grpc-gateway

gRPC to JSON proxy generator following the gRPC HTTP spec
https://grpc-ecosystem.github.io/grpc-gateway/
BSD 3-Clause "New" or "Revised" License
18.19k stars 2.24k forks source link

Spurious Tags emitted when tags list is specified #3052

Open eccles opened 1 year ago

eccles commented 1 year ago

🐛 Bug Report

Specifying a list of tags with descriptions in the swagger options results in an extra duplicate tag without a description being emitted.

To Reproduce

At top of file add a list of tags to the options:

option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
    info: {
        title: "Locations API"
        description: "API to manage locations."
        version: "1.0"
        contact: {
            name: "RKVST"
            url: "https://www.rkvst.com"
        }
    };
    base_path: "/_api";
    schemes: HTTPS;
    consumes: "application/json";
    produces: "application/json";
    tags: [
        {
            name: "Locations",
            description: "Read and modify Locations"
        },
        {
            name: "Unsupported",
            description: "Internal APIs that are unstable and should not be used in a production setting."
        }
    ];
};

Execute:

   protoc -I . {{.PROTOC_INC}}
        --go_out=paths=source_relative:.
        --go-grpc_out=paths=source_relative:.
        --validate_out=lang=go,paths=source_relative:.
        --openapiv2_out=.
        --openapiv2_opt disable_default_errors=true
        --openapiv2_opt json_names_for_fields=false
        --openapiv2_opt logtostderr=true
        --grpc-gateway_out=paths=source_relative,logtostderr=true:.
        --plugin /go/bin/protoc-gen-doc
        --doc_out=api/{{.API}}/
        --doc_opt=api/confluence_doc.tmpl,confluence.storage
        api/{{.API}}/*.proto

Expected behavior

Swagger looks like this:

{
  "swagger": "2.0",
  "info": {
    "title": "Locations API",
    "description": "API to manage locations.",
    "version": "1.0",
    "contact": {
      "name": "RKVST",
      "url": "https://www.rkvst.com"
    }
  },
  "tags": [
    {
      "name": "Locations",
      "description": "Read and modify Locations"
    },
    {
      "name": "Unsupported",
      "description": "Internal APIs that are unstable and should not be used in a production setting."
    }
  ],
  "basePath": "/_api",
  "schemes": [
    "https"
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],

Actual Behavior

but actually gets this:

{
  "swagger": "2.0",
  "info": {
    "title": "Locations API",
    "description": "API to manage locations.",
    "version": "1.0",
    "contact": {
      "name": "RKVST",
      "url": "https://www.rkvst.com"
    }
  },
  "tags": [
    {
          "name": "Locations"
    },
    {
      "name": "Locations",
      "description": "Read and modify Locations"
    },
    {
      "name": "Unsupported",
      "description": "Internal APIs that are unstable and should not be used in a production setting."
    }
  ],
  "basePath": "/_api",
  "schemes": [
    "https"
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],

Your Environment

grpc gateway version 2.14.0 protoc 21.9

johanbrandhorst commented 1 year ago

Is this tag not based on the package or protobuf file name? Otherwise, this certainly seems like a silly bug, thanks for reporting it!

eyasy1217 commented 9 months ago

Are you defining the Locations service in the proto and generating it with the disable_service_tags=false (default) option?