protobuf icon indicating copy to clipboard operation
protobuf copied to clipboard

Auto-generated python files for protos with FileOptions/MessageOptions/FieldOptions don't have `DESCRIPTOR._options` set

Open raj-karthik opened this issue 4 years ago • 1 comments

What version of protobuf and what language are you using? Version: master/v3.6.0/v3.5.0 etc. Language: Python

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

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

What did you do? Steps to reproduce the behavior:

metadata3.proto

syntax = "proto3";

import "google/protobuf/descriptor.proto";

package metas3;

message MessageOptionsMetadata3 {
  optional string message_options_field1 = 1;
  optional string message_options_field2 = 2;
  optional string message_options_field3 = 3;
}

extend google.protobuf.MessageOptions {
  MessageOptionsMetadata3 message_options_metadata3 = 50000;
}

message FileOptionsMetadata3 {
  optional string file_options_field1 = 1;
  optional string file_options_field2 = 2;
  optional string file_options_field3 = 3;
  optional string file_options_field4 = 4;
}

extend google.protobuf.FileOptions {
  FileOptionsMetadata3 file_options_metadata3 = 60000;
}

extend google.protobuf.FieldOptions {
  repeated string event_type = 70000;
}

event.proto

syntax = "proto3";

import "metadata3.proto";

package events;

option (metas3.file_options_metadata3).file_options_field1 = "file_option1";
option (metas3.file_options_metadata3).file_options_field2 = "file_option2";

message Event {
  string id = 1;
  string name = 2 [(metas3.event_type) = "sample_field_type1"];
  string someData = 3;
  option (metas3.message_options_metadata3).message_options_field1 = "placeholder1";
  option (metas3.message_options_metadata3).message_options_field2 = "placeholder2";
}

event_pb2.py

# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: event.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


import metadata3_pb2 as metadata3__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='event.proto',
  package='events',
  syntax='proto3',
  serialized_options=b'\202\246\035\016\n\014file_option1\202\246\035\016\022\014file_option2',
  create_key=_descriptor._internal_create_key,
  serialized_pb=b'\n\x0b\x65vent.proto\x12\x06\x65vents\x1a\x0fmetadata3.proto\"q\n\x05\x45vent\x12\n\n\x02id\x18\x01 \x01(\t\x12$\n\x04name\x18\x02 \x01(\tB\x16\x82\x97\"\x12sample_field_type1\x12\x10\n\x08someData\x18\x03 \x01(\t:$\x82\xb5\x18\x0e\n\x0cplaceholder1\x82\xb5\x18\x0e\x12\x0cplaceholder2B$\x82\xa6\x1d\x0e\n\x0c\x66ile_option1\x82\xa6\x1d\x0e\x12\x0c\x66ile_option2b\x06proto3'
  ,
  dependencies=[metadata3__pb2.DESCRIPTOR,])

_EVENT = _descriptor.Descriptor(
  name='Event',
  full_name='events.Event',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
    _descriptor.FieldDescriptor(
      name='id', full_name='events.Event.id', index=0,
      number=1, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='name', full_name='events.Event.name', index=1,
      number=2, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=b'\202\227\"\022sample_field_type1', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='someData', full_name='events.Event.someData', index=2,
      number=3, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=b'\202\265\030\016\n\014placeholder1\202\265\030\016\022\014placeholder2',
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=40,
  serialized_end=153,
)

DESCRIPTOR.message_types_by_name['Event'] = _EVENT
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

Event = _reflection.GeneratedProtocolMessageType('Event', (_message.Message,), {
  'DESCRIPTOR' : _EVENT,
  '__module__' : 'event_pb2'
  # @@protoc_insertion_point(class_scope:events.Event)
  })
_sym_db.RegisterMessage(Event)


DESCRIPTOR._options = None
_EVENT.fields_by_name['name']._options = None
_EVENT._options = None
# @@protoc_insertion_point(module_scope)

What did you expect to see Corresponding FileOptions/MessageOptions/FieldOptions set as applicable.

What did you see instead? DESCRIPTOR._options = None _EVENT.fields_by_name['name']._options = None _EVENT._options = None

Make sure you include information that can help us debug (full error message, exception listing, stack trace, logs).

Anything else we should know about your project / environment

raj-karthik avatar Nov 25 '21 00:11 raj-karthik

it's been almost a year, perhaps a "me too" just to nudge this a bit

FirefighterBlu3 avatar Sep 14 '22 17:09 FirefighterBlu3

The DESCRIPTOR._options symbol is prefix-underscored and therefore internal to the implementation.

To get file options, you should use public APIs like DESCRIPTOR.GetOptions(): https://googleapis.dev/python/protobuf/latest/google/protobuf/descriptor.html#google.protobuf.descriptor.FileDescriptor.GetOptions

If you have a case where the public APIs are not returning the correct data, please open a new issue.

haberman avatar Feb 01 '24 18:02 haberman