From 65cdc5301054a6726615c55ac1ce3bb2ee018b7b Mon Sep 17 00:00:00 2001 From: Gutti Narendra Date: Thu, 12 Nov 2026 13:17:03 +0530 Subject: [PATCH] Handle missing distribution metadata gracefully --- _appmap/configuration.py | 7 +++++-- _appmap/test/test_configuration.py | 27 ++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/_appmap/configuration.py b/_appmap/configuration.py index 8522e785..77c8da8a 100644 --- a/_appmap/configuration.py +++ b/_appmap/configuration.py @@ -392,8 +392,11 @@ class DistMatcher(PathMatcher): def __init__(self, dist, *args, **kwargs): super().__init__(*args, **kwargs) self.dist = dist - dist_files = importlib.metadata.files(dist) - self.files = [str(pp.locate()) for pp in dist_files] if dist_files is not None else [] + try: + dist_files = importlib.metadata.files(dist) + self.files = [str(pp.locate()) for pp in dist_files] if dist_files is not None else [] + except importlib.metadata.PackageNotFoundError: + self.files = [] def matches(self, filterable): try: diff --git a/_appmap/test/test_configuration.py b/_appmap/test/test_configuration.py index aaeb1add..14136554 100644 --- a/_appmap/test/test_configuration.py +++ b/_appmap/test/test_configuration.py @@ -1,6 +1,7 @@ """Test Configuration""" # pylint: disable=missing-function-docstring +import importlib.metadata from contextlib import contextmanager from shutil import copytree from pathlib import Path @@ -11,7 +12,14 @@ import _appmap import appmap -from _appmap.configuration import Config, ConfigFilter + +from _appmap.configuration import ( + Config, + ConfigFilter, + DistMatcher, + PathMatcher, + matcher_of_config, +) from _appmap.env import Env from _appmap.importer import Filterable, NullFilter @@ -340,3 +348,20 @@ def test_config_not_found_in_path_hierarchy(self, data_dir, tmpdir, monkeypatch) Config.current # pylint: disable=pointless-statement # No default config since we specified APPMAP_CONFIG assert not Env.current.enabled + + +def test_missing_distribution_does_not_stop_other_packages(mocker): + mocker.patch( + "importlib.metadata.files", + side_effect=importlib.metadata.PackageNotFoundError("missing-package"), + ) + + matchers = [ + matcher_of_config({"dist": "missing-package", "path": "missing_package"}), + matcher_of_config({"path": "other_package"}), + ] + + assert len(matchers) == 2 + assert isinstance(matchers[0], DistMatcher) + assert matchers[0].files == [] + assert isinstance(matchers[1], PathMatcher)