Skip to content

Commit 6379c1c

Browse files
authored
Use importlib-metadata regardless of Python version (#3217)
* Use importlib-metadata regardless of Python version Fixes #3167 * Fix lint * Add FIXME comment * Constraint importlib-metadata versions
1 parent a70e4a0 commit 6379c1c

File tree

3 files changed

+92
-25
lines changed

3 files changed

+92
-25
lines changed

opentelemetry-api/pyproject.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ classifiers = [
2727
dependencies = [
2828
"Deprecated >= 1.2.6",
2929
"setuptools >= 16.0",
30-
"importlib-metadata >= 5.0.0; python_version=='3.7'"
30+
# FIXME This should be able to be removed after 3.12 is released if there is a reliable API
31+
# in importlib.metadata.
32+
"importlib-metadata ~= 6.0.0",
3133
]
3234
dynamic = [
3335
"version",

opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,18 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from sys import version_info
15+
# FIXME: Use importlib.metadata when support for 3.11 is dropped if the rest of
16+
# the supported versions at that time have the same API.
17+
from importlib_metadata import ( # type: ignore
18+
EntryPoint,
19+
EntryPoints,
20+
entry_points,
21+
version,
22+
)
1623

17-
# FIXME remove this when support for 3.7 is dropped.
18-
if version_info.minor == 7:
19-
# pylint: disable=import-error
20-
from importlib_metadata import entry_points, version # type: ignore
24+
# The importlib-metadata library has introduced breaking changes before to its
25+
# API, this module is kept just to act as a layer between the
26+
# importlib-metadata library and our project if in any case it is necessary to
27+
# do so.
2128

22-
# FIXME remove this file when support for 3.9 is dropped.
23-
elif version_info.minor in (8, 9):
24-
# pylint: disable=import-error
25-
from importlib.metadata import (
26-
entry_points as importlib_metadata_entry_points,
27-
)
28-
from importlib.metadata import version
29-
30-
def entry_points(group: str, name: str): # type: ignore
31-
for entry_point in importlib_metadata_entry_points()[group]:
32-
if entry_point.name == name:
33-
yield entry_point
34-
35-
else:
36-
from importlib.metadata import entry_points, version
37-
38-
__all__ = ["entry_points", "version"]
29+
__all__ = ["entry_points", "version", "EntryPoint", "EntryPoints"]

opentelemetry-api/tests/util/test__importlib_metadata.py

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515
from unittest import TestCase
1616

1717
from opentelemetry.metrics import MeterProvider
18-
from opentelemetry.util._importlib_metadata import entry_points
18+
from opentelemetry.util._importlib_metadata import EntryPoint, EntryPoints
19+
from opentelemetry.util._importlib_metadata import (
20+
entry_points as importlib_metadata_entry_points,
21+
)
1922

2023

2124
class TestEntryPoints(TestCase):
@@ -24,11 +27,82 @@ def test_entry_points(self):
2427
self.assertIsInstance(
2528
next(
2629
iter(
27-
entry_points(
30+
importlib_metadata_entry_points(
2831
group="opentelemetry_meter_provider",
2932
name="default_meter_provider",
3033
)
3134
)
3235
).load()(),
3336
MeterProvider,
3437
)
38+
39+
def test_uniform_behavior(self):
40+
"""
41+
Test that entry_points behaves the same regardless of the Python
42+
version.
43+
"""
44+
45+
entry_points = importlib_metadata_entry_points()
46+
47+
self.assertIsInstance(entry_points, EntryPoints)
48+
49+
entry_points = entry_points.select(group="opentelemetry_propagator")
50+
self.assertIsInstance(entry_points, EntryPoints)
51+
52+
entry_points = entry_points.select(name="baggage")
53+
self.assertIsInstance(entry_points, EntryPoints)
54+
55+
entry_point = next(iter(entry_points))
56+
self.assertIsInstance(entry_point, EntryPoint)
57+
58+
self.assertEqual(entry_point.name, "baggage")
59+
self.assertEqual(entry_point.group, "opentelemetry_propagator")
60+
self.assertEqual(
61+
entry_point.value,
62+
"opentelemetry.baggage.propagation:W3CBaggagePropagator",
63+
)
64+
65+
entry_points = importlib_metadata_entry_points(
66+
group="opentelemetry_propagator"
67+
)
68+
self.assertIsInstance(entry_points, EntryPoints)
69+
70+
entry_points = entry_points.select(name="baggage")
71+
self.assertIsInstance(entry_points, EntryPoints)
72+
73+
entry_point = next(iter(entry_points))
74+
self.assertIsInstance(entry_point, EntryPoint)
75+
76+
self.assertEqual(entry_point.name, "baggage")
77+
self.assertEqual(entry_point.group, "opentelemetry_propagator")
78+
self.assertEqual(
79+
entry_point.value,
80+
"opentelemetry.baggage.propagation:W3CBaggagePropagator",
81+
)
82+
83+
entry_points = importlib_metadata_entry_points(name="baggage")
84+
self.assertIsInstance(entry_points, EntryPoints)
85+
86+
entry_point = next(iter(entry_points))
87+
self.assertIsInstance(entry_point, EntryPoint)
88+
89+
self.assertEqual(entry_point.name, "baggage")
90+
self.assertEqual(entry_point.group, "opentelemetry_propagator")
91+
self.assertEqual(
92+
entry_point.value,
93+
"opentelemetry.baggage.propagation:W3CBaggagePropagator",
94+
)
95+
96+
entry_points = importlib_metadata_entry_points(group="abc")
97+
self.assertIsInstance(entry_points, EntryPoints)
98+
self.assertEqual(len(entry_points), 0)
99+
100+
entry_points = importlib_metadata_entry_points(
101+
group="opentelemetry_propagator", name="abc"
102+
)
103+
self.assertIsInstance(entry_points, EntryPoints)
104+
self.assertEqual(len(entry_points), 0)
105+
106+
entry_points = importlib_metadata_entry_points(group="abc", name="abc")
107+
self.assertIsInstance(entry_points, EntryPoints)
108+
self.assertEqual(len(entry_points), 0)

0 commit comments

Comments
 (0)