Fix documentation for nested enums (#351)
This commit is contained in:
parent
1aaf7728cc
commit
5f7e4d58ef
@ -1,9 +1,7 @@
|
||||
import itertools
|
||||
import pathlib
|
||||
import sys
|
||||
from typing import (
|
||||
TYPE_CHECKING,
|
||||
Iterator,
|
||||
Generator,
|
||||
List,
|
||||
Set,
|
||||
Tuple,
|
||||
@ -13,7 +11,6 @@ from typing import (
|
||||
from betterproto.lib.google.protobuf import (
|
||||
DescriptorProto,
|
||||
EnumDescriptorProto,
|
||||
FieldDescriptorProto,
|
||||
FileDescriptorProto,
|
||||
ServiceDescriptorProto,
|
||||
)
|
||||
@ -40,35 +37,32 @@ from .models import (
|
||||
)
|
||||
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from google.protobuf.descriptor import Descriptor
|
||||
|
||||
|
||||
def traverse(
|
||||
proto_file: FieldDescriptorProto,
|
||||
) -> "itertools.chain[Tuple[Union[str, EnumDescriptorProto], List[int]]]":
|
||||
proto_file: FileDescriptorProto,
|
||||
) -> Generator[
|
||||
Tuple[Union[EnumDescriptorProto, DescriptorProto], List[int]], None, None
|
||||
]:
|
||||
# Todo: Keep information about nested hierarchy
|
||||
def _traverse(
|
||||
path: List[int], items: List["EnumDescriptorProto"], prefix=""
|
||||
) -> Iterator[Tuple[Union[str, EnumDescriptorProto], List[int]]]:
|
||||
path: List[int],
|
||||
items: Union[List[EnumDescriptorProto], List[DescriptorProto]],
|
||||
prefix: str = "",
|
||||
) -> Generator[
|
||||
Tuple[Union[EnumDescriptorProto, DescriptorProto], List[int]], None, None
|
||||
]:
|
||||
for i, item in enumerate(items):
|
||||
# Adjust the name since we flatten the hierarchy.
|
||||
# Todo: don't change the name, but include full name in returned tuple
|
||||
item.name = next_prefix = f"{prefix}_{item.name}"
|
||||
yield item, path + [i]
|
||||
yield item, [*path, i]
|
||||
|
||||
if isinstance(item, DescriptorProto):
|
||||
for enum in item.enum_type:
|
||||
enum.name = f"{next_prefix}_{enum.name}"
|
||||
yield enum, path + [i, 4]
|
||||
# Get nested types.
|
||||
yield from _traverse([*path, i, 4], item.enum_type, next_prefix)
|
||||
yield from _traverse([*path, i, 3], item.nested_type, next_prefix)
|
||||
|
||||
if item.nested_type:
|
||||
for n, p in _traverse(path + [i, 3], item.nested_type, next_prefix):
|
||||
yield n, p
|
||||
|
||||
return itertools.chain(
|
||||
_traverse([5], proto_file.enum_type), _traverse([4], proto_file.message_type)
|
||||
)
|
||||
yield from _traverse([5], proto_file.enum_type)
|
||||
yield from _traverse([4], proto_file.message_type)
|
||||
|
||||
|
||||
def generate_code(request: CodeGeneratorRequest) -> CodeGeneratorResponse:
|
||||
|
@ -2,27 +2,39 @@ syntax = "proto3";
|
||||
|
||||
package nestedtwice;
|
||||
|
||||
/* Test doc. */
|
||||
message Test {
|
||||
/* Top doc. */
|
||||
message Top {
|
||||
/* Middle doc. */
|
||||
message Middle {
|
||||
/* TopMiddleBottom doc.*/
|
||||
message TopMiddleBottom {
|
||||
// TopMiddleBottom.a doc.
|
||||
string a = 1;
|
||||
}
|
||||
/* EnumBottom doc. */
|
||||
enum EnumBottom{
|
||||
/* EnumBottom.A doc. */
|
||||
A = 0;
|
||||
B = 1;
|
||||
}
|
||||
/* Bottom doc. */
|
||||
message Bottom {
|
||||
/* Bottom.foo doc. */
|
||||
string foo = 1;
|
||||
}
|
||||
reserved 1;
|
||||
/* Middle.bottom doc. */
|
||||
repeated Bottom bottom = 2;
|
||||
repeated EnumBottom enumBottom=3;
|
||||
repeated TopMiddleBottom topMiddleBottom=4;
|
||||
bool bar = 5;
|
||||
}
|
||||
/* Top.name doc. */
|
||||
string name = 1;
|
||||
Middle middle = 2;
|
||||
}
|
||||
/* Test.top doc. */
|
||||
Top top = 1;
|
||||
}
|
||||
|
25
tests/inputs/nestedtwice/test_nestedtwice.py
Normal file
25
tests/inputs/nestedtwice/test_nestedtwice.py
Normal file
@ -0,0 +1,25 @@
|
||||
import pytest
|
||||
|
||||
from tests.output_betterproto.nestedtwice import (
|
||||
Test,
|
||||
TestTop,
|
||||
TestTopMiddle,
|
||||
TestTopMiddleBottom,
|
||||
TestTopMiddleEnumBottom,
|
||||
TestTopMiddleTopMiddleBottom,
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("cls", "expected_comment"),
|
||||
[
|
||||
(Test, "Test doc."),
|
||||
(TestTopMiddleEnumBottom, "EnumBottom doc."),
|
||||
(TestTop, "Top doc."),
|
||||
(TestTopMiddle, "Middle doc."),
|
||||
(TestTopMiddleTopMiddleBottom, "TopMiddleBottom doc."),
|
||||
(TestTopMiddleBottom, "Bottom doc."),
|
||||
],
|
||||
)
|
||||
def test_comment(cls, expected_comment):
|
||||
assert cls.__doc__ == expected_comment
|
Loading…
x
Reference in New Issue
Block a user