danielgtaylor / danielgtaylor/python-betterproto
ProtoContentBase.proto_file is always the first file of a package
- Vorherrschende Sprache
- Python
- Sterne
- 1.8k
- Forks
- 234
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
I have a large protobuf package whose messages, etc. are defined over multiple files. However, `ProtoContentBase.proto_file` always refers to the *first* file of the package passed to `protoc`. As a result, when I run `protoc` the comments attached to each class and field are from the first file.
I hacked a solution to this by adding `proto_input_file` to `ProtoContentBase` and passing this as an argument all the way from `generate_code` through `read_protobuf_type`/`read_protobuf_service`, then adding:
- To `OutputTempate`:
```python
@property
def input_files_dict(self) -> Dict[str, FileDescriptorProto]:
"""Dictionary mapping filenames to their FileDescriptorProto objects
Returns
-------
Dict[str, FileDescriptorProto]
Dictionary mapping filenames to their FileDescriptorProto objects
"""
return {f.name: f for f in self.input_files}
```
- to `ProtoContentBase`
```python
@property
def proto_file(self) -> FieldDescriptorProto:
template = self.output_file
return template.input_files_dict[self.proto_input_file]
```
I'd be delighted to contribute a proper fix and open a PR for it, but it'd be good to hear if there's a better approach to solving the problem.
Beitragsleitfaden
Rechercherichtung
Trace how generate_code passes context into read_protobuf_type and read_protobuf_service, then inspect ProtoContentBase.proto_file and OutputTempate. Confirm how a multi-file package selects the source descriptor for each message and field. Done means generated comments come from the file defining each item rather than always from the first input file.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100