Source code for ssg.requirement_specs

import pkg_resources
import re

from ssg import utils

# Monkey-patch pkg_resources.safe_name function to keep underscores intact
# Setuptools recognize the issue: https://github.com/pypa/setuptools/issues/2522
pkg_resources.safe_name = lambda name: re.sub('[^A-Za-z0-9_.]+', '-', name)
# Monkey-patch pkg_resources.safe_extras function to keep dashes intact
# Setuptools recognize the issue: https://github.com/pypa/setuptools/pull/732
pkg_resources.safe_extra = lambda extra: re.sub('[^A-Za-z0-9.-]+', '_', extra).lower()


def _parse_version_into_evr(version):
    evr = {"epoch": None, "version": None, "release": None}
    match_version = re.match(r'^(?:(\d+):)?(\d[\d\.]*)(?:-(\d*))?$', version)
    if not match_version:
        raise ValueError("Invalid version specifier {0}".format(version))
    evr["epoch"] = match_version.groups()[0]
    evr["version"] = match_version.groups()[1]
    evr["release"] = match_version.groups()[2]
    return evr


def _spec_to_version_specifier(spec):
    op, ver = spec
    evr = _parse_version_into_evr(ver)
    return utils.VersionSpecifier(op, evr)


[docs] class Requirement: def __init__(self, obj): self._req = pkg_resources.Requirement.parse(obj) self._specs = utils.VersionSpecifierSet( [_spec_to_version_specifier(spec) for spec in self._req.specs] ) def __contains__(self, item): return item in self._req def __str__(self): return str(self._req)
[docs] def has_version_specs(self): return bool(self._req.specs)
@property def ver_specs(self): return self._specs @property def name(self): return self._req.project_name @property def arg(self): return self._req.extras[0] if self._req.extras else None
[docs] @staticmethod def is_parametrized(name): return bool(pkg_resources.Requirement.parse(name).extras)
[docs] @staticmethod def get_base_for_parametrized(name): return pkg_resources.Requirement.parse(name).project_name