Don't require `setuptools_rust` at runtime (#13952)
This commit is contained in:
parent
15754d720f
commit
6f0c3e669d
|
@ -0,0 +1 @@
|
||||||
|
Fix a bug introduced in v1.68.0 where Synapse would require `setuptools_rust` at runtime, even though the package is only required at build time.
|
|
@ -66,6 +66,21 @@ def _is_dev_dependency(req: Requirement) -> bool:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _should_ignore_runtime_requirement(req: Requirement) -> bool:
|
||||||
|
# This is a build-time dependency. Irritatingly, `poetry build` ignores the
|
||||||
|
# requirements listed in the [build-system] section of pyproject.toml, so in order
|
||||||
|
# to support `poetry install --no-dev` we have to mark it as a runtime dependency.
|
||||||
|
# See discussion on https://github.com/python-poetry/poetry/issues/6154 (it sounds
|
||||||
|
# like the poetry authors don't consider this a bug?)
|
||||||
|
#
|
||||||
|
# In any case, workaround this by ignoring setuptools_rust here. (It might be
|
||||||
|
# slightly cleaner to put `setuptools_rust` in a `build` extra or similar, but for
|
||||||
|
# now let's do something quick and dirty.
|
||||||
|
if req.name == "setuptools_rust":
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
class Dependency(NamedTuple):
|
class Dependency(NamedTuple):
|
||||||
requirement: Requirement
|
requirement: Requirement
|
||||||
must_be_installed: bool
|
must_be_installed: bool
|
||||||
|
@ -77,7 +92,7 @@ def _generic_dependencies() -> Iterable[Dependency]:
|
||||||
assert requirements is not None
|
assert requirements is not None
|
||||||
for raw_requirement in requirements:
|
for raw_requirement in requirements:
|
||||||
req = Requirement(raw_requirement)
|
req = Requirement(raw_requirement)
|
||||||
if _is_dev_dependency(req):
|
if _is_dev_dependency(req) or _should_ignore_runtime_requirement(req):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# https://packaging.pypa.io/en/latest/markers.html#usage notes that
|
# https://packaging.pypa.io/en/latest/markers.html#usage notes that
|
||||||
|
|
|
@ -40,7 +40,10 @@ class TestDependencyChecker(TestCase):
|
||||||
def mock_installed_package(
|
def mock_installed_package(
|
||||||
self, distribution: Optional[DummyDistribution]
|
self, distribution: Optional[DummyDistribution]
|
||||||
) -> Generator[None, None, None]:
|
) -> Generator[None, None, None]:
|
||||||
"""Pretend that looking up any distribution yields the given `distribution`."""
|
"""Pretend that looking up any package yields the given `distribution`.
|
||||||
|
|
||||||
|
If `distribution = None`, we pretend that the package is not installed.
|
||||||
|
"""
|
||||||
|
|
||||||
def mock_distribution(name: str):
|
def mock_distribution(name: str):
|
||||||
if distribution is None:
|
if distribution is None:
|
||||||
|
@ -81,7 +84,7 @@ class TestDependencyChecker(TestCase):
|
||||||
self.assertRaises(DependencyException, check_requirements)
|
self.assertRaises(DependencyException, check_requirements)
|
||||||
|
|
||||||
def test_checks_ignore_dev_dependencies(self) -> None:
|
def test_checks_ignore_dev_dependencies(self) -> None:
|
||||||
"""Bot generic and per-extra checks should ignore dev dependencies."""
|
"""Both generic and per-extra checks should ignore dev dependencies."""
|
||||||
with patch(
|
with patch(
|
||||||
"synapse.util.check_dependencies.metadata.requires",
|
"synapse.util.check_dependencies.metadata.requires",
|
||||||
return_value=["dummypkg >= 1; extra == 'mypy'"],
|
return_value=["dummypkg >= 1; extra == 'mypy'"],
|
||||||
|
@ -142,3 +145,16 @@ class TestDependencyChecker(TestCase):
|
||||||
with self.mock_installed_package(new_release_candidate):
|
with self.mock_installed_package(new_release_candidate):
|
||||||
# should not raise
|
# should not raise
|
||||||
check_requirements()
|
check_requirements()
|
||||||
|
|
||||||
|
def test_setuptools_rust_ignored(self) -> None:
|
||||||
|
"""Test a workaround for a `poetry build` problem. Reproduces #13926."""
|
||||||
|
with patch(
|
||||||
|
"synapse.util.check_dependencies.metadata.requires",
|
||||||
|
return_value=["setuptools_rust >= 1.3"],
|
||||||
|
):
|
||||||
|
with self.mock_installed_package(None):
|
||||||
|
# should not raise, even if setuptools_rust is not installed
|
||||||
|
check_requirements()
|
||||||
|
with self.mock_installed_package(old):
|
||||||
|
# We also ignore old versions of setuptools_rust
|
||||||
|
check_requirements()
|
||||||
|
|
Loading…
Reference in New Issue