diff --git a/betterproto/compile/importing.py b/betterproto/compile/importing.py index cdef91f..091812b 100644 --- a/betterproto/compile/importing.py +++ b/betterproto/compile/importing.py @@ -129,7 +129,8 @@ def import_ancestor(current_package, imports, py_package, py_type): distance_up = len(current_package) - len(py_package) if py_package: string_import = py_package[-1] - string_alias = f"__{'_' * distance_up}{string_import}" + # Add trailing __ to avoid name mangling (python.org/dev/peps/pep-0008/#id34) + string_alias = f"_{'_' * distance_up}{string_import}__" string_from = f"..{'.' * distance_up}" imports.add(f"from {string_from} import {string_import} as {string_alias}") return f"{string_alias}.{py_type}" @@ -152,8 +153,9 @@ def import_cousin(current_package, imports, py_package, py_type): py_package[len(shared_ancestry) : -1] ) string_import = py_package[-1] - alias = f"{'_' * distance_up}" + safe_snake_case( + # Add trailing __ to avoid name mangling (python.org/dev/peps/pep-0008/#id34) + string_alias = f"{'_' * distance_up}" + safe_snake_case( ".".join(py_package[len(shared_ancestry) :]) - ) - imports.add(f"from {string_from} import {string_import} as {alias}") - return f"{alias}.{py_type}" + ) + "__" + imports.add(f"from {string_from} import {string_import} as {string_alias}") + return f"{string_alias}.{py_type}" diff --git a/betterproto/tests/inputs/casing_message_field_uppercase/casing_message_field_uppercase.py b/betterproto/tests/inputs/casing_message_field_uppercase/casing_message_field_uppercase.py index d77119e..e0dee0c 100644 --- a/betterproto/tests/inputs/casing_message_field_uppercase/casing_message_field_uppercase.py +++ b/betterproto/tests/inputs/casing_message_field_uppercase/casing_message_field_uppercase.py @@ -1,6 +1,4 @@ -from betterproto.tests.output_betterproto.casing_message_field_uppercase.casing_message_field_uppercase import ( - Test, -) +from betterproto.tests.output_betterproto.casing_message_field_uppercase import Test def test_message_casing(): diff --git a/betterproto/tests/inputs/nested/nested.proto b/betterproto/tests/inputs/nested/nested.proto index 2eaef59..98bafd9 100644 --- a/betterproto/tests/inputs/nested/nested.proto +++ b/betterproto/tests/inputs/nested/nested.proto @@ -10,9 +10,9 @@ message Test { Nested nested = 1; Sibling sibling = 2; -// Sibling sibling2 = 3; + Sibling sibling2 = 3; } message Sibling { int32 foo = 1; -} +} \ No newline at end of file diff --git a/betterproto/tests/inputs/nested2/nested2.proto b/betterproto/tests/inputs/nested2/nested2.proto new file mode 100644 index 0000000..3e39918 --- /dev/null +++ b/betterproto/tests/inputs/nested2/nested2.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +import "package.proto"; + +message Game { + message Player { + enum Race { + human = 0; + orc = 1; + } + } +} + +message Test { + Game game = 1; + Game.Player GamePlayer = 2; + Game.Player.Race GamePlayerRace = 3; + equipment.Weapon Weapon = 4; +} \ No newline at end of file diff --git a/betterproto/tests/inputs/nested2/package.proto b/betterproto/tests/inputs/nested2/package.proto new file mode 100644 index 0000000..4466256 --- /dev/null +++ b/betterproto/tests/inputs/nested2/package.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package equipment; + +message Weapon { + +} \ No newline at end of file diff --git a/betterproto/tests/test_get_ref_type.py b/betterproto/tests/test_get_ref_type.py index a2d089d..412b4ed 100644 --- a/betterproto/tests/test_get_ref_type.py +++ b/betterproto/tests/test_get_ref_type.py @@ -174,8 +174,8 @@ def test_import_parent_package_from_child(): package="package.child", imports=imports, source_type="package.Message" ) - assert imports == {"from ... import package as ___package"} - assert name == "___package.Message" + assert imports == {"from ... import package as __package__"} + assert name == "__package__.Message" def test_import_parent_package_from_deeply_nested_child(): @@ -186,8 +186,8 @@ def test_import_parent_package_from_deeply_nested_child(): source_type="package.deeply.nested.Message", ) - assert imports == {"from ... import nested as ___nested"} - assert name == "___nested.Message" + assert imports == {"from ... import nested as __nested__"} + assert name == "__nested__.Message" def test_import_ancestor_package_from_nested_child(): @@ -198,8 +198,8 @@ def test_import_ancestor_package_from_nested_child(): source_type="package.ancestor.Message", ) - assert imports == {"from .... import ancestor as ____ancestor"} - assert name == "____ancestor.Message" + assert imports == {"from .... import ancestor as ___ancestor__"} + assert name == "___ancestor__.Message" def test_import_root_package_from_child(): @@ -224,16 +224,16 @@ def test_import_unrelated_package(): imports = set() name = get_ref_type(package="a", imports=imports, source_type="p.Message") - assert imports == {"from .. import p as _p"} - assert name == "_p.Message" + assert imports == {"from .. import p as _p__"} + assert name == "_p__.Message" def test_import_unrelated_nested_package(): imports = set() name = get_ref_type(package="a.b", imports=imports, source_type="p.q.Message") - assert imports == {"from ...p import q as __p_q"} - assert name == "__p_q.Message" + assert imports == {"from ...p import q as __p_q__"} + assert name == "__p_q__.Message" def test_import_unrelated_deeply_nested_package(): @@ -242,16 +242,16 @@ def test_import_unrelated_deeply_nested_package(): package="a.b.c.d", imports=imports, source_type="p.q.r.s.Message" ) - assert imports == {"from .....p.q.r import s as ____p_q_r_s"} - assert name == "____p_q_r_s.Message" + assert imports == {"from .....p.q.r import s as ____p_q_r_s__"} + assert name == "____p_q_r_s__.Message" def test_import_cousin_package(): imports = set() name = get_ref_type(package="a.x", imports=imports, source_type="a.y.Message") - assert imports == {"from .. import y as _y"} - assert name == "_y.Message" + assert imports == {"from .. import y as _y__"} + assert name == "_y__.Message" def test_import_cousin_package_different_name(): @@ -260,8 +260,8 @@ def test_import_cousin_package_different_name(): package="test.package1", imports=imports, source_type="cousin.package2.Message" ) - assert imports == {"from ...cousin import package2 as __cousin_package2"} - assert name == "__cousin_package2.Message" + assert imports == {"from ...cousin import package2 as __cousin_package2__"} + assert name == "__cousin_package2__.Message" def test_import_cousin_package_same_name(): @@ -270,16 +270,16 @@ def test_import_cousin_package_same_name(): package="test.package", imports=imports, source_type="cousin.package.Message" ) - assert imports == {"from ...cousin import package as __cousin_package"} - assert name == "__cousin_package.Message" + assert imports == {"from ...cousin import package as __cousin_package__"} + assert name == "__cousin_package__.Message" def test_import_far_cousin_package(): imports = set() name = get_ref_type(package="a.x.y", imports=imports, source_type="a.b.c.Message") - assert imports == {"from ...b import c as __b_c"} - assert name == "__b_c.Message" + assert imports == {"from ...b import c as __b_c__"} + assert name == "__b_c__.Message" def test_import_far_far_cousin_package(): @@ -288,8 +288,8 @@ def test_import_far_far_cousin_package(): package="a.x.y.z", imports=imports, source_type="a.b.c.d.Message" ) - assert imports == {"from ....b.c import d as ___b_c_d"} - assert name == "___b_c_d.Message" + assert imports == {"from ....b.c import d as ___b_c_d__"} + assert name == "___b_c_d__.Message" @pytest.mark.parametrize(