reqPackage.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import pkg_resources
  2. import utils
  3. from package import Package
  4. class ReqPackage(Package):
  5. """Wrapper class for Requirements instance
  6. :param obj: The `Requirements` instance to wrap over
  7. :param dist: optional `pkg_resources.Distribution` instance for
  8. this requirement
  9. """
  10. UNKNOWN_VERSION = '?'
  11. def __init__(self, obj, dist=None):
  12. super(ReqPackage, self).__init__(obj)
  13. self.dist = dist
  14. @property
  15. def version_spec(self):
  16. specs = self._obj.specs
  17. return ','.join([''.join(sp) for sp in specs]) if specs else None
  18. @property
  19. def installed_version(self):
  20. if not self.dist:
  21. return utils.guess_version(self.key, self.UNKNOWN_VERSION)
  22. return self.dist.version
  23. def is_conflicting(self):
  24. """If installed version conflicts with required version"""
  25. # unknown installed version is also considered conflicting
  26. if self.installed_version == self.UNKNOWN_VERSION:
  27. return True
  28. ver_spec = (self.version_spec if self.version_spec else '')
  29. req_version_str = '{0}{1}'.format(self.project_name, ver_spec)
  30. req_obj = pkg_resources.Requirement.parse(req_version_str)
  31. return self.installed_version not in req_obj
  32. def as_dict(self):
  33. return {'key': self.key,
  34. 'package_name': self.project_name,
  35. 'installed_version': self.installed_version,
  36. 'required_version': self.version_spec}