# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html # For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE # Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt from __future__ import annotations import os import sys from pathlib import Path from astroid import builder from astroid.manager import AstroidManager from astroid.nodes.scoped_nodes import Module DATA_DIR = Path("testdata") / "python3" RESOURCE_PATH = Path(__file__).parent / DATA_DIR / "data" def find(name: str) -> str: return os.path.normpath(os.path.join(os.path.dirname(__file__), DATA_DIR, name)) def build_file(path: str, modname: str | None = None) -> Module: return builder.AstroidBuilder().file_build(find(path), modname) class SysPathSetup: def setUp(self) -> None: sys.path.insert(0, find("")) def tearDown(self) -> None: del sys.path[0] datadir = find("") for key in list(sys.path_importer_cache): if key.startswith(datadir): del sys.path_importer_cache[key] class AstroidCacheSetupMixin: """Mixin for handling test isolation issues with the astroid cache. When clearing the astroid cache, some tests fail due to cache inconsistencies, where some objects had a different builtins object referenced. This saves the builtins module and TransformVisitor and replaces them after the tests finish. The builtins module is special, since some of the transforms for a couple of its objects (str, bytes etc) are executed only once, so astroid_bootstrapping will be useless for retrieving the original builtins module. """ @classmethod def setup_class(cls): cls._builtins = AstroidManager().astroid_cache.get("builtins") cls._transforms = AstroidManager.brain["_transform"] @classmethod def teardown_class(cls): AstroidManager().astroid_cache["builtins"] = cls._builtins AstroidManager.brain["_transform"] = cls._transforms