Skip to content

Commit 6230255

Browse files
committed
Use importlib-metadata regardless of Python version
Fixes open-telemetry#3167
1 parent 2d9858f commit 6230255

File tree

4 files changed

+89
-26
lines changed

4 files changed

+89
-26
lines changed

opentelemetry-api/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ classifiers = [
2727
dependencies = [
2828
"Deprecated >= 1.2.6",
2929
"setuptools >= 16.0",
30-
"importlib-metadata >= 5.0.0; python_version=='3.7'"
30+
"importlib-metadata >= 5.0.0",
3131
]
3232
dynamic = [
3333
"version",

opentelemetry-api/src/opentelemetry/propagate/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def inject(
137137
propagators.append( # type: ignore
138138
next( # type: ignore
139139
iter( # type: ignore
140-
entry_points( # type: ignore
140+
entry_points( # type: ignore
141141
group="opentelemetry_propagator",
142142
name=propagator,
143143
)

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

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

15-
from sys import version_info
15+
from importlib_metadata import ( # type: ignore
16+
EntryPoint,
17+
EntryPoints,
18+
entry_points,
19+
version,
20+
)
1621

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
22+
# The importlib-metadata library has introduced breaking changes before to its
23+
# API, this module is kept just to act as a layer between the
24+
# importlib-metadata library and our project if in any case it is necessary to
25+
# do so.
2126

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"]
27+
__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)