Skip to content

Ruby code generation can generate invalid Ruby code #18726

Closed
@dorner

Description

@dorner

What version of protobuf and what language are you using?
3.25.3
Language: Ruby

What operating system (Linux, Windows, ...) and version?
Mac OSX 13.4.1

What runtime / compiler are you using (e.g., python version or gcc version)
MRuby

What did you do?

Using the following proto file:

syntax = "proto3";

package services.Test.v1;

import "google/api/annotations.proto";
import "protoc-gen-openapiv2/options/annotations.proto";

message GetWidgetRequest {
  string id = 1;
}

message GetWidgetResponse {
  string id = 1;
}

service TestService {

  rpc GetWidget (GetWidgetRequest) returns (GetWidgetResponse) {
    option (google.api.http) = {
      get: "/v1/widgets/{id}"
    };

    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
      summary: "Get Widget"
      operation_id: "WidgetService_GetWidget"
      tags: "Widget"
      responses: {
        key: "default"
        value: {
          examples: {
            key: "application/json"
            value: "{\"Widget\":{\"globalId\":\"1\",\"details\":{\"name\":\"1\",\"1\":\"1\",\"1\":\"http://some-image.com\",\"additionalMedia\":[],\"additionalInfo\":{},\"backgroundImageUrl\":\"\",\"backgroundColor\":\"\"},\"distributionContext\":{\"geo\":{\"data\":[]},\"segment\":{\"data\":[]}},\"language\":\"en\",\"merchantId\":2018,\"dates\":{\"availableFrom\":\"2023-12-01T12:00:00Z\",\"availableTo\":\"2024-12-31T12:00:00Z\",\"validFrom\":\"2023-12-01T12:00:00Z\",\"validTo\":\"2024-12-31T12:00:00Z\"},\"source\":\"\",\"legacyIds\":{\"flyerTypeId\":0,\"flyerRunId\":0,\"flyerId\":0},\"sections\":[{\"atoms\":[{\"details\":{\"name\":\"BLUEDRAGONCOCONUTMILK,400ML\",\"description\":\"Selectedvarieties\",\"imageUrl\":\"https://flipp-image-retrieval.flipp.com/api/aHR0cDovL2Yud2lzaGFiaS5uZXQvcGFnZV9wZGZfaW1hZ2VzLzE4ODI5NTY1LzBjZWMzODVhLTQwZGUtMTFlZi1iZmViLTBlZmFlOTgzZDY5NC94X2xhcmdl?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9mbGlwcC1pbWFnZS1yZXRyaWV2YWwuZmxpcHAuY29tL2FwaS9hSFIwY0RvdkwyWXVkMmx6YUdGaWFTNXVaWFF2Y0dGblpWOXdaR1pmYVcxaFoyVnpMekU0T0RJNU5UWTFMekJqWldNek9EVmhMVFF3WkdVdE1URmxaaTFpWm1WaUxUQmxabUZsT1RnelpEWTVOQzk0WDJ4aGNtZGw~KiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyMTkzNTU0MH19fV19&Signature=lEvoTfo4MyccvGKOhI6c-DM-YkCj96W1z1BIesh5~hpVjZHfLcameWI8tUkHDYaqJNlc4~daLZSI~0NIVPxw8vBBnacRtEI7mZ7fKdMR5wja~B87jxyO3SvPQuEYV4b06n5lRNrM52olXzGrTmQN8M1uVKHPVhQPiKc7XQgQ2Gn7t7Rd5eRCE8lgGldLes1ehe3EJUFvCcozHMRhhkrEJmWVgoDGvPbpIZCBXP6ghzoqSeVZQpWohWwQLKZfRJ96dNyhdr2~~EN4Rv-TUfQgrA3Ou22c7xpIsfCU-ZYHjpYZDIevcjsVsJJkP2Ywcp8OUas9Gt6RP8-otxMspPJC7w__&Key-Pair-Id=KDIF3067XOLU0\",\"additionalMedia\":[],\"additionalInfo\":{\"flyerRunId\":954196,\"flyerRunPageDiffGroupId\":220553827,\"id1\":\"20712986_EA\",\"keywords\":\"\",\"pageItemId\":343183970,\"sentAt\":\"2024-07-1713:00:47-0400\",\"sku\":\"20712986_EA\"},\"backgroundImageUrl\":\"\",\"backgroundColor\":\"\"},\"globalId\":\"01J2VA8GX6764ZEJYRWE14QNZK\",\"labels\":[],\"ttmUrl\":\"https://www.loblaws.ca/p/20712986_EA\",\"offerDetails\":{\"disclaimer\":\"\",\"saleStory\":\"PCOptimum500pts\",\"prePriceText\":\"\",\"postPriceText\":\"\",\"keywords\":[],\"unit\":\"\",\"unitAmount\":0},\"dates\":{\"availableFrom\":\"2024-07-17T04:00:00Z\",\"availableTo\":\"2024-07-25T03:59:59Z\",\"validFrom\":\"2024-07-18T04:00:00Z\",\"validTo\":\"2024-07-25T03:59:59Z\"},\"pricing\":{\"offerType\":\"UNSPECIFIED\",\"price\":2.99,\"purchaseMethods\":[\"UNSPECIFIED\"],\"condition\":\"UNSPECIFIED\"}},{\"details\":{\"name\":\"KELLOGG'SCEREALS,480-650G\",\"description\":\"SELECTEDVARIETIES\",\"imageUrl\":\"https://flipp-image-retrieval.flipp.com/api/aHR0cDovL2Yud2lzaGFiaS5uZXQvcGFnZV9wZGZfaW1hZ2VzLzE4ODI5NTUzLzA0NjMyYTJjLTQwZGUtMTFlZi1iM2Q3LTBlMWJhODZhOGRiNC94X2xhcmdl?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9mbGlwcC1pbWFnZS1yZXRyaWV2YWwuZmxpcHAuY29tL2FwaS9hSFIwY0RvdkwyWXVkMmx6YUdGaWFTNXVaWFF2Y0dGblpWOXdaR1pmYVcxaFoyVnpMekU0T0RJNU5UVXpMekEwTmpNeVlUSmpMVFF3WkdVdE1URmxaaTFpTTJRM0xUQmxNV0poT0RaaE9HUmlOQzk0WDJ4aGNtZGw~KiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyMTkzNTU0MH19fV19&Signature=EISm6-FkZ~64WLU4NkQHT64IFrGkzGj0Ye47eF7q~DX5zSgIVLDa9EkX5t0S6IJTl1IYk94c4Pbtg6U9srHqmjEtEZ-2z8wMkXU1cnr5Tk0rzLKbeAhGja58dBhfeK9Ypzc77kCXNhveeDTUrfzPrs-TakyooEY2lRnVSVbNnzA4vCXEyhNx9sfsfHaYLhb9oo8eIn-Iux2TS2-rhlVjeJSQ00sBeIMfL8zB6oXb53ns-jH92WwJNPorBtYRyTBKUVozxXN3gS8BmZPUsXJcwuzIp2~6BScp5gaQJ7FGFueFYLahoSLM3fB~VS2ybbR~77k9DRYOiHh3uUtTq8Mduw__&Key-Pair-Id=KDIF3067XOLU0\",\"additionalMedia\":[],\"additionalInfo\":{\"flyerRunId\":954196,\"flyerRunPageDiffGroupId\":220553613,\"id1\":\"21430738_EA\",\"id2\":\"21430755_EA\",\"id3\":\"20047439_EA\",\"id4\":\"20188873_EA\",\"keywords\":\"\",\"pageItemId\":343183764,\"sentAt\":\"2024-07-1713:00:46-0400\",\"sku\":\"21430738_EA\"},\"backgroundImageUrl\":\"\",\"backgroundColor\":\"\"},\"globalId\":\"01J2VA8GVCT8C07126GDVBE7YA\",\"labels\":[],\"ttmUrl\":\"https://www.loblaws.ca/p/21430738_EA\",\"offerDetails\":{\"disclaimer\":\"\",\"saleStory\":\"BUY2KELLOGG'SCEREALS,480-650GGET1FREENEILSONMILK1%,2%,SKIMORHOMOGENIZED3.25%4L\",\"prePriceText\":\"\",\"postPriceText\":\"\",\"keywords\":[],\"unit\":\"\",\"unitAmount\":0},\"dates\":{\"availableFrom\":\"2024-07-17T04:00:00Z\",\"availableTo\":\"2024-07-25T03:59:59Z\",\"validFrom\":\"2024-07-18T04:00:00Z\",\"validTo\":\"2024-07-25T03:59:59Z\"},\"pricing\":{\"offerType\":\"UNSPECIFIED\",\"price\":5.99,\"purchaseMethods\":[\"UNSPECIFIED\"],\"condition\":\"UNSPECIFIED\"}}],\"details\":{\"name\":\"\",\"description\":\"\",\"imageUrl\":\"\",\"additionalMedia\":[],\"additionalInfo\":{},\"backgroundImageUrl\":\"\",\"backgroundColor\":\"\"},\"distributionContext\":{\"geo\":{\"data\":[]},\"segment\":{\"data\":[]}},\"globalId\":\"01J33MMD7FFB1T1HQVSVBFH5WA\",\"labels\":[]}],\"rendering\":{\"renderingType\":\"RENDERING_TYPE_SVG\",\"11111111111\":\"https://some-template.url\"}}}"
          }
        }
      }
    };
  }
}

What did you expect to see

Valid generated Ruby code.

What did you see instead?

The generated code puts a # sign next to a { in the encoded file:

descriptor_data = "\n)services/curator/v1/curator_service.proto\x12\x10services.Test.v1\x1a\x1cgoogle/api/annotations.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\"\"\n\x10GetWidgetRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\"#\n\x11GetWidgetResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id2\xdc$\n\x0bTestService\x12\xcc$\n\tGetWidget\x12\".services.Test.v1.GetWidgetRequest\x1a#.services.Test.v1.GetWidgetResponse\"\xf5#\x92\x41\xd9#\n\x06Widget\x12\nGet Widget*\x17WidgetService_GetWidgetJ\xa9#\n\x07\x64\x65\x66\x61ult\x12\x9d#\"\x9a#\n\x10\x61pplication/json\x12\x85#{\"Widget\":{\"globalId\":\"1\",\"details\":{\"name\":\"1\",\"1\":\"1\",\"1\":\"http://some-image.com\",\"additionalMedia\":[],\"additionalInfo\":{},\"backgroundImageUrl\":\"\",\"backgroundColor\":\"\"},\"distributionContext\":{\"geo\":{\"data\":[]},\"segment\":{\"data\":[]}},\"language\":\"en\",\"merchantId\":2018,\"dates\":{\"availableFrom\":\"2023-12-01T12:00:00Z\",\"availableTo\":\"2024-12-31T12:00:00Z\",\"validFrom\":\"2023-12-01T12:00:00Z\",\"validTo\":\"2024-12-31T12:00:00Z\"},\"source\":\"\",\"legacyIds\":{\"flyerTypeId\":0,\"flyerRunId\":0,\"flyerId\":0},\"sections\":[{\"atoms\":[{\"details\":{\"name\":\"BLUEDRAGONCOCONUTMILK,400ML\",\"description\":\"Selectedvarieties\",\"imageUrl\":\"https://flipp-image-retrieval.flipp.com/api/aHR0cDovL2Yud2lzaGFiaS5uZXQvcGFnZV9wZGZfaW1hZ2VzLzE4ODI5NTY1LzBjZWMzODVhLTQwZGUtMTFlZi1iZmViLTBlZmFlOTgzZDY5NC94X2xhcmdl?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9mbGlwcC1pbWFnZS1yZXRyaWV2YWwuZmxpcHAuY29tL2FwaS9hSFIwY0RvdkwyWXVkMmx6YUdGaWFTNXVaWFF2Y0dGblpWOXdaR1pmYVcxaFoyVnpMekU0T0RJNU5UWTFMekJqWldNek9EVmhMVFF3WkdVdE1URmxaaTFpWm1WaUxUQmxabUZsT1RnelpEWTVOQzk0WDJ4aGNtZGw~KiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyMTkzNTU0MH19fV19&Signature=lEvoTfo4MyccvGKOhI6c-DM-YkCj96W1z1BIesh5~hpVjZHfLcameWI8tUkHDYaqJNlc4~daLZSI~0NIVPxw8vBBnacRtEI7mZ7fKdMR5wja~B87jxyO3SvPQuEYV4b06n5lRNrM52olXzGrTmQN8M1uVKHPVhQPiKc7XQgQ2Gn7t7Rd5eRCE8lgGldLes1ehe3EJUFvCcozHMRhhkrEJmWVgoDGvPbpIZCBXP6ghzoqSeVZQpWohWwQLKZfRJ96dNyhdr2~~EN4Rv-TUfQgrA3Ou22c7xpIsfCU-ZYHjpYZDIevcjsVsJJkP2Ywcp8OUas9Gt6RP8-otxMspPJC7w__&Key-Pair-Id=KDIF3067XOLU0\",\"additionalMedia\":[],\"additionalInfo\":{\"flyerRunId\":954196,\"flyerRunPageDiffGroupId\":220553827,\"id1\":\"20712986_EA\",\"keywords\":\"\",\"pageItemId\":343183970,\"sentAt\":\"2024-07-1713:00:47-0400\",\"sku\":\"20712986_EA\"},\"backgroundImageUrl\":\"\",\"backgroundColor\":\"\"},\"globalId\":\"01J2VA8GX6764ZEJYRWE14QNZK\",\"labels\":[],\"ttmUrl\":\"https://www.loblaws.ca/p/20712986_EA\",\"offerDetails\":{\"disclaimer\":\"\",\"saleStory\":\"PCOptimum500pts\",\"prePriceText\":\"\",\"postPriceText\":\"\",\"keywords\":[],\"unit\":\"\",\"unitAmount\":0},\"dates\":{\"availableFrom\":\"2024-07-17T04:00:00Z\",\"availableTo\":\"2024-07-25T03:59:59Z\",\"validFrom\":\"2024-07-18T04:00:00Z\",\"validTo\":\"2024-07-25T03:59:59Z\"},\"pricing\":{\"offerType\":\"UNSPECIFIED\",\"price\":2.99,\"purchaseMethods\":[\"UNSPECIFIED\"],\"condition\":\"UNSPECIFIED\"}},{\"details\":{\"name\":\"KELLOGG\'SCEREALS,480-650G\",\"description\":\"SELECTEDVARIETIES\",\"imageUrl\":\"https://flipp-image-retrieval.flipp.com/api/aHR0cDovL2Yud2lzaGFiaS5uZXQvcGFnZV9wZGZfaW1hZ2VzLzE4ODI5NTUzLzA0NjMyYTJjLTQwZGUtMTFlZi1iM2Q3LTBlMWJhODZhOGRiNC94X2xhcmdl?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9mbGlwcC1pbWFnZS1yZXRyaWV2YWwuZmxpcHAuY29tL2FwaS9hSFIwY0RvdkwyWXVkMmx6YUdGaWFTNXVaWFF2Y0dGblpWOXdaR1pmYVcxaFoyVnpMekU0T0RJNU5UVXpMekEwTmpNeVlUSmpMVFF3WkdVdE1URmxaaTFpTTJRM0xUQmxNV0poT0RaaE9HUmlOQzk0WDJ4aGNtZGw~KiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyMTkzNTU0MH19fV19&Signature=EISm6-FkZ~64WLU4NkQHT64IFrGkzGj0Ye47eF7q~DX5zSgIVLDa9EkX5t0S6IJTl1IYk94c4Pbtg6U9srHqmjEtEZ-2z8wMkXU1cnr5Tk0rzLKbeAhGja58dBhfeK9Ypzc77kCXNhveeDTUrfzPrs-TakyooEY2lRnVSVbNnzA4vCXEyhNx9sfsfHaYLhb9oo8eIn-Iux2TS2-rhlVjeJSQ00sBeIMfL8zB6oXb53ns-jH92WwJNPorBtYRyTBKUVozxXN3gS8BmZPUsXJcwuzIp2~6BScp5gaQJ7FGFueFYLahoSLM3fB~VS2ybbR~77k9DRYOiHh3uUtTq8Mduw__&Key-Pair-Id=KDIF3067XOLU0\",\"additionalMedia\":[],\"additionalInfo\":{\"flyerRunId\":954196,\"flyerRunPageDiffGroupId\":220553613,\"id1\":\"21430738_EA\",\"id2\":\"21430755_EA\",\"id3\":\"20047439_EA\",\"id4\":\"20188873_EA\",\"keywords\":\"\",\"pageItemId\":343183764,\"sentAt\":\"2024-07-1713:00:46-0400\",\"sku\":\"21430738_EA\"},\"backgroundImageUrl\":\"\",\"backgroundColor\":\"\"},\"globalId\":\"01J2VA8GVCT8C07126GDVBE7YA\",\"labels\":[],\"ttmUrl\":\"https://www.loblaws.ca/p/21430738_EA\",\"offerDetails\":{\"disclaimer\":\"\",\"saleStory\":\"BUY2KELLOGG\'SCEREALS,480-650GGET1FREENEILSONMILK1%,2%,SKIMORHOMOGENIZED3.25%4L\",\"prePriceText\":\"\",\"postPriceText\":\"\",\"keywords\":[],\"unit\":\"\",\"unitAmount\":0},\"dates\":{\"availableFrom\":\"2024-07-17T04:00:00Z\",\"availableTo\":\"2024-07-25T03:59:59Z\",\"validFrom\":\"2024-07-18T04:00:00Z\",\"validTo\":\"2024-07-25T03:59:59Z\"},\"pricing\":{\"offerType\":\"UNSPECIFIED\",\"price\":5.99,\"purchaseMethods\":[\"UNSPECIFIED\"],\"condition\":\"UNSPECIFIED\"}}],\"details\":{\"name\":\"\",\"description\":\"\",\"imageUrl\":\"\",\"additionalMedia\":[],\"additionalInfo\":{},\"backgroundImageUrl\":\"\",\"backgroundColor\":\"\"},\"distributionContext\":{\"geo\":{\"data\":[]},\"segment\":{\"data\":[]}},\"globalId\":\"01J33MMD7FFB1T1HQVSVBFH5WA\",\"labels\":[]}],\"rendering\":{\"renderingType\":\"RENDERING_TYPE_SVG\",\"11111111111\":\"https://some-template.url\"}}}\x82\xd3\xe4\x93\x02\x12\x12\x10/v1/widgets/{id}B\x8d\x01\n\x14\x63om.services.Test.v1B\x13\x43uratorServiceProtoP\x01\xa2\x02\x03STX\xaa\x02\x10Services.Test.V1\xca\x02\x10Services\\Test\\V1\xe2\x02\x1cServices\\Test\\V1\\GPBMetadata\xea\x02\x12Services::Test::V1b\x06proto3"

...n\x12\x85#{\"Wid...

This makes Ruby treat it like string interpolation, and the generated file doesn't compile. (I tried changing the options above to make them smaller or do more obfuscation, but this bug only happens when it encodes particular string values it seems.)

Any instance of #{ needs to be escaped.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions