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