Skip to content

Commit 062911d

Browse files
committed
Look up each module name without a package version only once
1 parent 8f35368 commit 062911d

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

‎aikido_zen/sinks/builtins_import.py‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
running_import_scan = contextvars.ContextVar("running_import_scan", default=False)
88

9+
# version() scans all of sys.path, so names it cannot find (re, json) are looked up once.
10+
names_without_version = set()
11+
912

1013
@after
1114
def _import(func, instance, args, kwargs, return_value):
@@ -30,7 +33,7 @@ def _import(func, instance, args, kwargs, return_value):
3033
# Avoid circular dependencies, this is a double safety-check for if contextvar check fails.
3134
return
3235

33-
if PackagesStore.get_package(name):
36+
if name in names_without_version or PackagesStore.get_package(name):
3437
return
3538

3639
version = None
@@ -40,6 +43,8 @@ def _import(func, instance, args, kwargs, return_value):
4043
pass
4144
if version:
4245
PackagesStore.add_package(name, version)
46+
else:
47+
names_without_version.add(name)
4348
finally:
4449
running_import_scan.set(False)
4550

‎aikido_zen/sinks/tests/builtins_import_test.py‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1+
import importlib.metadata
2+
from unittest.mock import patch
3+
14
import pytest
25

36
import aikido_zen
47

58
aikido_zen.protect()
69

10+
import aikido_zen.sinks.builtins_import as builtins_import
711
from aikido_zen.background_process.packages import PackagesStore
812

913

1014
@pytest.fixture(autouse=True)
1115
def run_around_tests():
1216
PackagesStore.clear()
17+
builtins_import.names_without_version.clear()
1318

1419

1520
def test_flask_import():
@@ -24,6 +29,17 @@ def test_django_import():
2429
assert PackagesStore.get_package("django")["version"] == "4.0"
2530

2631

32+
def test_name_without_a_distribution_is_looked_up_once():
33+
with patch(
34+
"importlib.metadata.version", wraps=importlib.metadata.version
35+
) as version:
36+
for _ in range(10):
37+
import json
38+
39+
assert [c.args for c in version.call_args_list] == [("json",)]
40+
assert PackagesStore.get_package("json") is None
41+
42+
2743
def test_recursive_package_store(monkeypatch):
2844
"""Test that recursive imports during package scanning don't cause max recursion depth errors."""
2945

0 commit comments

Comments
 (0)