pyproject-rpm-macros/pyproject_buildrequires.py
2019-07-05 11:28:55 +02:00

90 lines
2.5 KiB
Python

import sys
try:
import pytoml
from packaging.requirements import Requirement, InvalidRequirement
from packaging.utils import canonicalize_name, canonicalize_version
except ImportError:
# already echoed by the %pyproject_buildrequires macro
sys.exit(0)
try:
with open("pyproject.toml") as f:
pyproject_data = pytoml.load(f)
except FileNotFoundError:
pyproject_data = {}
except Exception as e:
sys.exit(e)
else:
import importlib
try:
backend = importlib.import_module(
pyproject_data["build-system"]["build-backend"]
)
except KeyError:
try:
import setuptools.build_meta
except ImportError:
print("python3dist(setuptools) >= 40.8")
print("python3dist(wheel)")
sys.exit(0)
backend = setuptools.build_meta
except ImportError:
backend = None
requirements = set()
rpm_requirements = set()
def add_requirement(requirement):
try:
requirements.add(Requirement(requirement))
except InvalidRequirement as e:
print(
f"WARNING: Skipping invalid requirement: {requirement}\n {e}",
file=sys.stderr,
)
if "requires" in pyproject_data.get("build-system", {}):
try:
for requirement in pyproject_data["build-system"]["requires"]:
add_requirement(requirement)
except Exception as e:
sys.exit(e)
if hasattr(backend, "get_requires_for_build_wheel"):
try:
for requirement in backend.get_requires_for_build_wheel():
add_requirement(requirement)
except Exception as e:
sys.exit(e)
for requirement in requirements:
name = canonicalize_name(requirement.name)
if requirement.marker is not None and not requirement.marker.evaluate():
continue
together = []
for specifier in requirement.specifier:
version = canonicalize_version(specifier.version)
if specifier.operator == "!=":
together.append(
f"(python3dist({name}) < {version} or python3dist({name}) >= {version}.0)"
)
else:
together.append(f"python3dist({name}) {specifier.operator} {version}")
if len(together) == 0:
rpm_requirements.add(f"python3dist({name})")
if len(together) == 1:
rpm_requirements.add(together[0])
elif len(together) > 1:
rpm_requirements.add(f"({' and '.join(together)})")
print(*sorted(rpm_requirements), sep="\n")