More complex python requirement parsing.

This commit is contained in:
Jelmer Vernooij 2021-03-01 15:22:28 +00:00
parent 78b59759c9
commit a8663e0eaa
No known key found for this signature in database
GPG key ID: 579C160D4C9E23E8
3 changed files with 22 additions and 8 deletions

View file

@ -194,15 +194,15 @@ class SetupPy(BuildSystem):
if self.result is None:
raise NotImplementedError
for require in self.result.get_requires():
yield "build", PythonPackageRequirement(require)
yield "build", PythonPackageRequirement.from_requirement_str(require)
# Not present for distutils-only packages
if getattr(self.result, 'install_requires', []):
for require in self.result.install_requires:
yield "install", PythonPackageRequirement(require)
yield "install", PythonPackageRequirement.from_requirement_str(require)
# Not present for distutils-only packages
if getattr(self.result, 'tests_require', []):
for require in self.result.tests_require:
yield "test", PythonPackageRequirement(require)
yield "test", PythonPackageRequirement.from_requirement_str(require)
def get_declared_outputs(self):
if self.result is None:

View file

@ -26,19 +26,32 @@ class PythonPackageRequirement(Requirement):
package: str
def __init__(self, package, python_version=None, minimum_version=None):
def __init__(self, package, python_version=None, specs=None,
minimum_version=None):
super(PythonPackageRequirement, self).__init__('python-package')
self.package = package
self.python_version = python_version
self.minimum_version = minimum_version
if minimum_version is not None:
specs = [('>=', minimum_version)]
self.specs = specs
def __repr__(self):
return "%s(%r, python_version=%r, minimum_version=%r)" % (
return "%s(%r, python_version=%r, specs=%r)" % (
type(self).__name__, self.package, self.python_version,
self.minimum_version)
self.specs)
def __str__(self):
return "python package: %s" % self.package
if self.specs:
return "python package: %s (%r)" % (self.package, self.specs)
else:
return "python package: %s" % (self.package, )
@classmethod
def from_requirement_str(cls, text):
from requirements.requirement import Requirement
req = Requirement.parse(text)
return cls(package=req.name, specs=req.specs)
class BinaryRequirement(Requirement):

View file

@ -30,6 +30,7 @@ setup(name="ognibuild",
install_requires=[
'breezy',
'buildlog-consultant',
'requirements-parser',
],
extras_require={
'debian': ['debmutate', 'python_debian', 'python_apt'],