"""Optional test configuration for mocking heavy dependencies. Enable with: pytest --mock-heavy-deps tests/test_residue_constraints.py By default no mocking is performed, so integration tests run against real dependencies. """ import sys from unittest.mock import MagicMock def _install_mock(name: str) -> None: """Install a mock module (and parent packages) into sys.modules.""" parts = name.split(".") for i in range(len(parts)): mod_name = ".".join(parts[: i + 1]) if mod_name not in sys.modules: sys.modules[mod_name] = MagicMock() # Heavy dependencies that schema.py imports transitively but are NOT # needed by the three constraint-parsing functions under test. _MOCK_MODULES = [ "torch", "torch.nn", "torch.nn.functional", "torch.utils", "torch.utils.data", "pytorch_lightning", "hydra", "hydra.core", "hydra.core.config_store", "einops", "einx", "mashumaro", "biotite", "biotite.structure", "biotite.structure.io", "biotite.structure.io.pdbx", "pydssp", "logomaker", "hydride", "gemmi", "pdbeccdutils", "pdbeccdutils.core", "pdbeccdutils.core.ccd_reader", "edit_distance", "huggingface_hub", "nvidia_ml_py", "cuequivariance_ops_cu12", "cuequivariance_ops_torch_cu12", "cuequivariance_torch", "numba", "sklearn", "sklearn.cluster", "sklearn.neighbors", "pandas", "matplotlib", "matplotlib.pyplot", "tqdm", "Bio", "Bio.PDB", ] def pytest_addoption(parser) -> None: parser.addoption( "--mock-heavy-deps", action="store_true", default=False, help="Mock heavy optional dependencies for parser-only unit tests.", ) def pytest_configure(config) -> None: if config.getoption("--mock-heavy-deps"): for mod in _MOCK_MODULES: _install_mock(mod)