diff --git a/.changelog/5234.fixed b/.changelog/5234.fixed new file mode 100644 index 0000000000..4334bb3885 --- /dev/null +++ b/.changelog/5234.fixed @@ -0,0 +1 @@ +`opentelemetry-api`: avoid deprecated `SelectableGroups` dict access. diff --git a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py index be779f1137..0ae002d11f 100644 --- a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py +++ b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py @@ -28,6 +28,8 @@ def _as_entry_points(eps: Any) -> EntryPoints: if isinstance(eps, EntryPoints): return eps + if hasattr(eps, "select"): + return eps.select() # Handle Python 3.10 SelectableGroups (dict-like) return EntryPoints(ep for group_eps in eps.values() for ep in group_eps) diff --git a/opentelemetry-api/tests/util/test__importlib_metadata.py b/opentelemetry-api/tests/util/test__importlib_metadata.py index f7e5152467..d1b356a4ea 100644 --- a/opentelemetry-api/tests/util/test__importlib_metadata.py +++ b/opentelemetry-api/tests/util/test__importlib_metadata.py @@ -117,3 +117,18 @@ def test_as_entry_points_selectable_groups_compat(self): self.assertIsInstance(normalized, EntryPoints) self.assertEqual(len(normalized), 2) self.assertEqual(list(normalized), [ep1, ep2]) + + def test_as_entry_points_uses_selectable_groups_select(self): + """Test that SelectableGroups are normalized without the deprecated dict API.""" + entry_point = EntryPoint(name="foo", value="bar:baz", group="gp") + + class SelectableGroups: + def select(self): + return EntryPoints([entry_point]) + + def values(self): + raise AssertionError("deprecated dict interface used") + + normalized = _as_entry_points(SelectableGroups()) + self.assertIsInstance(normalized, EntryPoints) + self.assertEqual(list(normalized), [entry_point])