Skip to content

Commit 3a5f518

Browse files
committed
fixed either logic. new tests pass
1 parent b221db3 commit 3a5f518

File tree

3 files changed

+78
-11
lines changed

3 files changed

+78
-11
lines changed

opentelemetry-instrumentation/src/opentelemetry/instrumentation/dependencies.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ def get_dependency_conflicts(
147147
# TODO: add eval of deps_either
148148
if deps_either:
149149
# TODO: change to using DependencyConflict
150-
# is_dependency_conflict = True
150+
is_dependency_conflict = True
151151
required_either: Collection[str] = []
152152
found_either: Collection[str] = []
153153
for dep in deps_either:
@@ -177,19 +177,21 @@ def get_dependency_conflicts(
177177
continue
178178

179179
if req.specifier.contains(dist_version):
180-
# is_dependency_conflict = False
180+
is_dependency_conflict = False
181181
# Since only one of the instrumentation_either dependencies is required, there is no depdendency conflict.
182182
break
183183
else:
184184
required_either.append(str(dep))
185185
found_either.append(f"{req.name} {dist_version}")
186186

187-
# return DependencyConflict(dep, f"{req.name} {dist_version}")
188-
# print (f"required_either: {required_either}")
189-
# print (f"found_either: {found_either}")
190-
return DependencyConflict(
191-
required_either=required_either,
192-
found_either=found_either,
193-
)
187+
if is_dependency_conflict:
188+
# return DependencyConflict(dep, f"{req.name} {dist_version}")
189+
# print (f"required_either: {required_either}")
190+
# print (f"found_either: {found_either}")
191+
return DependencyConflict(
192+
required_either=required_either,
193+
found_either=found_either,
194+
)
195+
return None
194196

195197
return None

opentelemetry-instrumentation/tests/auto_instrumentation/test_load.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
)
2929
from opentelemetry.instrumentation.version import __version__
3030

31-
31+
# TODO: Revert changes from 6d5a5149d02fdec50d8053767b55bc91d80a9228
3232
class TestLoad(TestCase):
3333
@patch.dict(
3434
"os.environ", {OTEL_PYTHON_CONFIGURATOR: "custom_configurator2"}

opentelemetry-instrumentation/tests/test_dependencies.py

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@
1616

1717
import pytest
1818
from packaging.requirements import Requirement
19+
from unittest.mock import patch
1920

2021
from opentelemetry.instrumentation.dependencies import (
2122
DependencyConflict,
2223
get_dependency_conflicts,
2324
get_dist_dependency_conflicts,
2425
)
2526
from opentelemetry.test.test_base import TestBase
26-
from opentelemetry.util._importlib_metadata import Distribution
27+
from opentelemetry.util._importlib_metadata import (
28+
Distribution,
29+
PackageNotFoundError,
30+
)
2731

2832

2933
class TestDependencyConflicts(TestBase):
@@ -97,8 +101,69 @@ def read_text(self, filename):
97101

98102
@property
99103
def requires(self):
104+
# TODO: make another test for returning something with a blank list for both and and or
100105
return None
101106

102107
dist = MockDistribution()
103108
conflict = get_dist_dependency_conflicts(dist)
104109
self.assertTrue(conflict is None)
110+
111+
@patch("opentelemetry.instrumentation.dependencies.version")
112+
def test_get_dist_dependency_conflicts_either(self, version_mock):
113+
class MockDistribution(Distribution):
114+
def locate_file(self, path):
115+
pass
116+
117+
def read_text(self, filename):
118+
pass
119+
120+
@property
121+
def requires(self):
122+
return [
123+
'foo ~= 1.0; extra == "instruments_either"',
124+
'bar ~= 1.0; extra == "instruments_either"'
125+
]
126+
127+
dist = MockDistribution()
128+
129+
def version_side_effect(package_name):
130+
if package_name == "foo":
131+
raise PackageNotFoundError("foo not found")
132+
elif package_name == "bar":
133+
return "1.0.0"
134+
else:
135+
raise PackageNotFoundError(f"{package_name} not found")
136+
137+
version_mock.side_effect = version_side_effect
138+
conflict = get_dist_dependency_conflicts(dist)
139+
print("CONFLICT", conflict)
140+
self.assertIsNone(conflict)
141+
142+
@patch("opentelemetry.instrumentation.dependencies.version")
143+
def test_get_dist_dependency_conflicts_neither(self, version_mock):
144+
class MockDistribution(Distribution):
145+
def locate_file(self, path):
146+
pass
147+
148+
def read_text(self, filename):
149+
pass
150+
151+
@property
152+
def requires(self):
153+
return [
154+
'foo ~= 1.0; extra == "instruments_either"',
155+
'bar ~= 1.0; extra == "instruments_either"'
156+
]
157+
158+
dist = MockDistribution()
159+
# version_mock.side_effect = lambda x: "1.0.0" if x == "foo" else "2.0.0"
160+
# version_mock("foo").return_value = "2.0.0"
161+
version_mock.side_effect = PackageNotFoundError("not found")
162+
conflict = get_dist_dependency_conflicts(dist)
163+
self.assertTrue(conflict is not None)
164+
self.assertTrue(isinstance(conflict, DependencyConflict))
165+
self.assertEqual(
166+
str(conflict),
167+
# TODO: fix tests of either conflict
168+
'''DependencyConflict: requested any of the following: "['foo~=1.0; extra == "instruments-either"', 'bar~=1.0; extra == "instruments-either"']" but found: "[]"''',
169+
)

0 commit comments

Comments
 (0)