Fix documentation for nested enums (#351)

This commit is contained in:
Gabriel Pajot 2022-03-18 23:36:27 +01:00 committed by GitHub
parent 1aaf7728cc
commit 5f7e4d58ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 54 additions and 23 deletions

View File

@ -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:

View File

@ -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;
}

View 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