Skip to content

Commit

Permalink
fix: Don't overwrite existing (lower) members when expanding wildcards
Browse files Browse the repository at this point in the history
  • Loading branch information
pawamoy committed Apr 8, 2022
1 parent 8d8a46f commit 9ff86e3
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/griffe/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,10 @@ def expand_wildcards( # noqa: WPS231
del obj[name] # noqa: WPS420

for new_member, alias_lineno, alias_endlineno in expanded:
obj[new_member.name] = Alias(new_member.name, new_member, lineno=alias_lineno, endlineno=alias_endlineno)
if new_member.name not in obj.members or obj[new_member.name].lineno < alias_lineno:
obj[new_member.name] = Alias(
new_member.name, new_member, lineno=alias_lineno, endlineno=alias_endlineno
)

def resolve_module_aliases( # noqa: WPS231
self,
Expand Down
16 changes: 16 additions & 0 deletions tests/test_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,19 @@ def test_dont_shortcut_alias_chain_after_expanding_wildcards():
assert isinstance(base, Name)
assert base.source == "Base"
assert base.full == "package.mod_b.Base"


def test_dont_overwrite_lower_member_when_expanding_wildcard():
"""Check that we don't overwrite a member defined after the import when expanding a wildcard."""
with temporary_pypackage("package", ["mod_a.py", "mod_b.py"]) as tmp_package:
mod_a = tmp_package.path / "mod_a.py"
mod_b = tmp_package.path / "mod_b.py"

mod_a.write_text("overwritten = 0\nfrom package.mod_b import *\nnot_overwritten = 0\n")
mod_b.write_text("overwritten = 1\nnot_overwritten = 1\n")

loader = GriffeLoader(search_paths=[tmp_package.tmpdir])
package = loader.load_module(tmp_package.name)
loader.resolve_aliases()
assert package["mod_a.overwritten"].value == "1"
assert package["mod_a.not_overwritten"].value == "0"

0 comments on commit 9ff86e3

Please sign in to comment.