Add all kinds of comments (#632)

* Add all kinds of comments

* Format

* Fix get_comment

* Improve test

* Lint
This commit is contained in:
Adrien 2024-11-07 04:11:53 +01:00 committed by GitHub
parent 1a23f09c16
commit 1741a126b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 78 additions and 24 deletions

View File

@ -153,11 +153,33 @@ def get_comment(
) -> str: ) -> str:
pad = " " * indent pad = " " * indent
for sci_loc in proto_file.source_code_info.location: for sci_loc in proto_file.source_code_info.location:
if list(sci_loc.path) == path and sci_loc.leading_comments: if list(sci_loc.path) == path:
lines = sci_loc.leading_comments.strip().split("\n") all_comments = list(sci_loc.leading_detached_comments)
if sci_loc.leading_comments:
all_comments.append(sci_loc.leading_comments)
if sci_loc.trailing_comments:
all_comments.append(sci_loc.trailing_comments)
lines = []
for comment in all_comments:
lines += comment.split("\n")
lines.append("")
# Remove consecutive empty lines
lines = [
line for i, line in enumerate(lines) if line or (i == 0 or lines[i - 1])
]
if lines and not lines[-1]:
lines.pop() # Remove the last empty line
# It is common for one line comments to start with a space, for example: // comment
# We don't add this space to the generated file.
lines = [line[1:] if line and line[0] == " " else line for line in lines]
# This is a field, message, enum, service, or method # This is a field, message, enum, service, or method
if len(lines) == 1 and len(lines[0]) < 79 - indent - 6: if len(lines) == 1 and len(lines[0]) < 79 - indent - 6:
lines[0] = lines[0].strip('"')
return f'{pad}"""{lines[0]}"""' return f'{pad}"""{lines[0]}"""'
else: else:
joined = f"\n{pad}".join(lines) joined = f"\n{pad}".join(lines)

View File

@ -1,20 +1,44 @@
syntax = "proto3"; syntax = "proto3";
package documentation; package documentation;
// Documentation of message // Documentation of message 1
message Test { // other line 1
// Documentation of field
uint32 x = 1; // Documentation of message 2
// other line 2
message Test { // Documentation of message 3
// Documentation of field 1
// other line 1
// Documentation of field 2
// other line 2
uint32 x = 1; // Documentation of field 3
} }
// Documentation of enum // Documentation of enum 1
enum Enum { // other line 1
// Documentation of variant
Enum_Variant = 0; // Documentation of enum 2
// other line 2
enum Enum { // Documentation of enum 3
// Documentation of variant 1
// other line 1
// Documentation of variant 2
// other line 2
Enum_Variant = 0; // Documentation of variant 3
} }
// Documentation of service // Documentation of service 1
service Service { // other line 1
// Documentation of method
rpc get(Test) returns (Test); // Documentation of service 2
// other line 2
service Service { // Documentation of service 3
// Documentation of method 1
// other line 1
// Documentation of method 2
// other line 2
rpc get(Test) returns (Test); // Documentation of method 3
} }

View File

@ -2,7 +2,15 @@ import ast
import inspect import inspect
def test_documentation(): def check(generated_doc: str, type: str) -> None:
assert f"Documentation of {type} 1" in generated_doc
assert "other line 1" in generated_doc
assert f"Documentation of {type} 2" in generated_doc
assert "other line 2" in generated_doc
assert f"Documentation of {type} 3" in generated_doc
def test_documentation() -> None:
from .output_betterproto.documentation import ( from .output_betterproto.documentation import (
Enum, Enum,
ServiceBase, ServiceBase,
@ -10,20 +18,20 @@ def test_documentation():
Test, Test,
) )
assert Test.__doc__ == "Documentation of message" check(Test.__doc__, "message")
source = inspect.getsource(Test) source = inspect.getsource(Test)
tree = ast.parse(source) tree = ast.parse(source)
assert tree.body[0].body[2].value.value == "Documentation of field" check(tree.body[0].body[2].value.value, "field")
assert Enum.__doc__ == "Documentation of enum" check(Enum.__doc__, "enum")
source = inspect.getsource(Enum) source = inspect.getsource(Enum)
tree = ast.parse(source) tree = ast.parse(source)
assert tree.body[0].body[2].value.value == "Documentation of variant" check(tree.body[0].body[2].value.value, "variant")
assert ServiceBase.__doc__ == "Documentation of service" check(ServiceBase.__doc__, "service")
assert ServiceBase.get.__doc__ == "Documentation of method" check(ServiceBase.get.__doc__, "method")
assert ServiceStub.__doc__ == "Documentation of service" check(ServiceStub.__doc__, "service")
assert ServiceStub.get.__doc__ == "Documentation of method" check(ServiceStub.get.__doc__, "method")