From d1e93c82e676933fca7009d07a06dd619efb604d Mon Sep 17 00:00:00 2001 From: Gabe Goodhart Date: Thu, 23 Dec 2021 14:40:31 -0700 Subject: [PATCH 1/4] PassThroughEnv: Pass the full env through in TRACKING mode --- import_tracker/import_tracker.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/import_tracker/import_tracker.py b/import_tracker/import_tracker.py index b5d0f5c..3ce9e86 100644 --- a/import_tracker/import_tracker.py +++ b/import_tracker/import_tracker.py @@ -7,6 +7,7 @@ from contextlib import contextmanager from types import ModuleType from typing import Dict, List, Optional +import copy import importlib import inspect import json @@ -210,14 +211,10 @@ def _track_deps(name: str, package: Optional[str] = None): ) if package is not None: cmd += f" --package {package}" - res = subprocess.run( - shlex.split(cmd), - stdout=subprocess.PIPE, - env={ - MODE_ENV_VAR: LAZY, - "PYTHONPATH": ":".join(sys.path), - }, - ) + env = dict(copy.deepcopy(os.environ)) + env[MODE_ENV_VAR] = LAZY + env["PYTHONPATH"] = ":".join(sys.path) + res = subprocess.run(shlex.split(cmd), stdout=subprocess.PIPE, env=env) assert res.returncode == 0, f"Failed to track {name}" deps = json.loads(res.stdout) From 8b085341a8baac6277b54c6bfb54be196bbff8f8 Mon Sep 17 00:00:00 2001 From: Gabe Goodhart Date: Thu, 23 Dec 2021 14:51:35 -0700 Subject: [PATCH 2/4] PassThroughEnv: Fix tests that now have pytest deps It seems that passing the env through makes it so that these modules show up in the list which is fine as long as we handle it --- test/helpers.py | 11 +++++++++++ test/test_import_tracker.py | 7 +++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/test/helpers.py b/test/helpers.py index 1019c12..52af2e8 100644 --- a/test/helpers.py +++ b/test/helpers.py @@ -77,6 +77,17 @@ def TRACKING_MODE(): yield +def remove_test_deps(deps): + """If running with pytest coverage enabled, these deps will show up. We + don't want run-env-dependent tests, so we just pop them out. + """ + for test_dep in ["pytest_cov", "coverage"]: + try: + deps.remove(test_dep) + except ValueError: + continue + return deps + ## Implementations ############################################################# diff --git a/test/test_import_tracker.py b/test/test_import_tracker.py index 2cbc63e..da9318e 100644 --- a/test/test_import_tracker.py +++ b/test/test_import_tracker.py @@ -19,6 +19,7 @@ LAZY_MODE, PROACTIVE_MODE, TRACKING_MODE, + remove_test_deps, reset_static_trackers, reset_sys_modules, ) @@ -300,10 +301,12 @@ def test_import_module_tracking_direct(TRACKING_MODE): """ submod1 = import_tracker.import_module("sample_lib.submod1") submod2 = import_tracker.import_module("sample_lib.submod2") - assert import_tracker.get_required_imports("sample_lib.submod1") == [ + assert remove_test_deps(import_tracker.get_required_imports("sample_lib.submod1")) == [ "conditional_deps" ] - assert import_tracker.get_required_imports("sample_lib.submod2") == ["alog"] + assert remove_test_deps(import_tracker.get_required_imports("sample_lib.submod2")) == [ + "alog" + ] def test_import_module_tracking_update_static(TRACKING_MODE): From ed4bdb951fb5878661a727cb46008165d2399060 Mon Sep 17 00:00:00 2001 From: Gabe Goodhart Date: Thu, 23 Dec 2021 14:51:53 -0700 Subject: [PATCH 3/4] PassThroughEnv: Add a test that requires an import-time env var --- test/sample_libs/env_import/__init__.py | 7 +++++++ test/test_import_tracker.py | 8 ++++++++ 2 files changed, 15 insertions(+) create mode 100644 test/sample_libs/env_import/__init__.py diff --git a/test/sample_libs/env_import/__init__.py b/test/sample_libs/env_import/__init__.py new file mode 100644 index 0000000..9c72e9b --- /dev/null +++ b/test/sample_libs/env_import/__init__.py @@ -0,0 +1,7 @@ +""" +This is a sample library that requires an env var at import time +""" + +import os + +assert "SAMPLE_ENV_VAR" in os.environ diff --git a/test/test_import_tracker.py b/test/test_import_tracker.py index da9318e..9b1250d 100644 --- a/test/test_import_tracker.py +++ b/test/test_import_tracker.py @@ -331,3 +331,11 @@ def test_import_module_tracking_with_package(TRACKING_MODE): expected (this is mostly for coverage) """ import_tracker.import_module(".submod1", "sample_lib") + + +def test_import_module_tracking_env_passthrough(TRACKING_MODE): + """Test that performing tracking when the submodule has a package works as + expected (this is mostly for coverage) + """ + os.environ["SAMPLE_ENV_VAR"] = "something" + import_tracker.import_module("env_import") From 5e245bac5bb5c726ee064713293b7873700a34de Mon Sep 17 00:00:00 2001 From: Gabe Goodhart Date: Thu, 23 Dec 2021 14:53:41 -0700 Subject: [PATCH 4/4] PassThroughEnv: Fix fmt --- test/helpers.py | 1 + test/sample_libs/env_import/__init__.py | 1 + test/test_import_tracker.py | 12 ++++++------ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/test/helpers.py b/test/helpers.py index 52af2e8..b92044e 100644 --- a/test/helpers.py +++ b/test/helpers.py @@ -88,6 +88,7 @@ def remove_test_deps(deps): continue return deps + ## Implementations ############################################################# diff --git a/test/sample_libs/env_import/__init__.py b/test/sample_libs/env_import/__init__.py index 9c72e9b..e04e4ca 100644 --- a/test/sample_libs/env_import/__init__.py +++ b/test/sample_libs/env_import/__init__.py @@ -2,6 +2,7 @@ This is a sample library that requires an env var at import time """ +# Standard import os assert "SAMPLE_ENV_VAR" in os.environ diff --git a/test/test_import_tracker.py b/test/test_import_tracker.py index 9b1250d..bf3c4f9 100644 --- a/test/test_import_tracker.py +++ b/test/test_import_tracker.py @@ -301,12 +301,12 @@ def test_import_module_tracking_direct(TRACKING_MODE): """ submod1 = import_tracker.import_module("sample_lib.submod1") submod2 = import_tracker.import_module("sample_lib.submod2") - assert remove_test_deps(import_tracker.get_required_imports("sample_lib.submod1")) == [ - "conditional_deps" - ] - assert remove_test_deps(import_tracker.get_required_imports("sample_lib.submod2")) == [ - "alog" - ] + assert remove_test_deps( + import_tracker.get_required_imports("sample_lib.submod1") + ) == ["conditional_deps"] + assert remove_test_deps( + import_tracker.get_required_imports("sample_lib.submod2") + ) == ["alog"] def test_import_module_tracking_update_static(TRACKING_MODE):