示例#1
0
def update_data(data_ext, data_rep, pkg):
    """Update the entry point data with current install state.

    This update is IN PLACE for both data_ext and data_rep.

    Uses 'pkg' as the main key for associating the data
    with the relevant package.

    """
    eps_ext = ilmd.entry_points().get("flake8.extension", {})
    eps_rep = ilmd.entry_points().get("flake8.report", {})

    try:
        version = canonicalize_version(ilmd.version(pkg))
        summary = ilmd.metadata(pkg).get("Summary")
    except ilmd.PackageNotFoundError:
        version = canonicalize_version("0.0")
        summary = "[no summary]"

    for data, eps in zip((data_ext, data_rep), (eps_ext, eps_rep)):
        data.update(
            {
                pkg: {
                    "version": version,
                    "summary": summary,
                    "eps": {
                        ep.name: {
                            "module": (val := ep.value.partition(":"))[0],
                            "callable": val[2],
                        }
                        for ep in eps
                    },
                }
            }
        )
示例#2
0
def find_wheel_dirs(namelist: List[str], project: str, version: str) \
        -> Tuple[str, Optional[str]]:
    """
    Given a list ``namelist`` of files in a wheel for a project ``project`` and
    version ``version``, find & return the name of the wheel's ``.dist-info``
    directory and (if it has one) its ``.data`` directory.

    :raises WheelValidationError: if there is no unique ``.dist-info``
        directory in the input
    :raises WheelValidationError: if the name & version of the ``.dist-info``
        directory are not normalization-equivalent to ``project`` & ``version``
    :raises WheelValidationError: if there is more than one ``.data`` directory
        in the input
    :raises WheelValidationError: if the name & version of the ``.data``
        directory are not normalization-equivalent to ``project`` & ``version``
    """
    canon_project = canonicalize_name(project)
    canon_version = canonicalize_version(version.replace('_', '-'))
    dist_info_dirs = set()
    data_dirs = set()
    for n in namelist:
        basename = n.rstrip('/').split('/')[0]
        if is_dist_info_dir(basename):
            dist_info_dirs.add(basename)
        if is_data_dir(basename):
            data_dirs.add(basename)
    if len(dist_info_dirs) > 1:
        raise WheelValidationError(
            'Wheel contains multiple .dist-info directories')
    elif len(dist_info_dirs) == 1:
        dist_info_dir = next(iter(dist_info_dirs))
        diname, _, diversion = dist_info_dir[:-len(".dist-info")].partition(
            '-')
        if (canonicalize_name(diname) != canon_project or canonicalize_version(
                diversion.replace('_', '-')) != canon_version):
            raise WheelValidationError(
                f"Project & version of wheel's .dist-info directory do not"
                f" match wheel name: {dist_info_dir!r}")
    else:
        raise WheelValidationError('No .dist-info directory in wheel')
    data_dir: Optional[str]
    if len(data_dirs) > 1:
        raise WheelValidationError('Wheel contains multiple .data directories')
    elif len(data_dirs) == 1:
        data_dir = next(iter(data_dirs))
        daname, _, daversion = data_dir[:-len(".data")].partition('-')
        if (canonicalize_name(daname) != canon_project or canonicalize_version(
                daversion.replace('_', '-')) != canon_version):
            raise WheelValidationError(
                f"Project & version of wheel's .data directory do not match"
                f" wheel name: {data_dir!r}")
    else:
        data_dir = None
    return (dist_info_dir, data_dir)
示例#3
0
def main(input, output, major, minor, patch, pre, local, canonicalize):

    config = configparser.RawConfigParser()
    config.read([".bump", "setup.cfg"])

    major = major or config.getboolean("bump", "major", fallback=False)
    minor = minor or config.getboolean("bump", "minor", fallback=False)
    patch = patch or config.getboolean("bump", "patch", fallback=True)
    input = input or click.File("rb")(config.get(
        "bump", "input", fallback="setup.py"))
    output = output or click.File("wb")(input.name)
    canonicalize = canonicalize or config.get(
        "bump", "canonicalize", fallback=False)

    contents = input.read().decode("utf-8")
    try:
        version_string = find_version(contents)
    except NoVersionFound:
        click.echo("No version found in ./{}.".format(input.name))
        sys.exit(1)

    version = SemVer.parse(version_string)
    version.bump(major, minor, patch, pre, local)
    version_string = str(version)
    if canonicalize:
        version_string = canonicalize_version(version_string)
    new = pattern.sub("\g<1>{}\g<3>".format(version_string), contents)
    output.write(new.encode())
    click.echo(version_string)
示例#4
0
def main(input, output, major, minor, patch, pre, local, canonicalize):

    config = configparser.RawConfigParser()
    config.read(['.bump', 'setup.cfg'])

    major = major or config.getboolean('bump', 'major', fallback=False)
    minor = minor or config.getboolean('bump', 'minor', fallback=False)
    patch = patch or config.getboolean('bump', 'patch', fallback=True)
    input = (input or click.File('rb')(config.get(
        'bump', 'input', fallback='setup.py')))
    output = output or click.File('wb')(input.name)
    canonicalize = (canonicalize
                    or config.get('bump', 'canonicalize', fallback=False))

    contents = input.read().decode('utf-8')
    try:
        version_string = find_version(contents)
    except NoVersionFound:
        click.echo('No version found in ./{}.'.format(input.name))
        sys.exit(1)

    version = SemVer.parse(version_string)
    version.bump(major, minor, patch, pre, local)
    version_string = str(version)
    if canonicalize:
        version_string = canonicalize_version(version_string)
    new = pattern.sub('\g<1>{}\g<3>'.format(version_string), contents)
    output.write(new.encode())
    click.echo(version_string)
示例#5
0
    def __init__(self, req_string, parent=None, index_url=None, env=None, extra_index_url=None):
        log = self.log = logger.bind(dist=req_string)
        log.info("init johnnydist", parent=parent and str(parent.req))
        self.parent = parent
        self.index_url = index_url
        self.env = env
        self.extra_index_url = extra_index_url
        self._recursed = False

        if req_string.endswith(".whl") and os.path.isfile(req_string):
            whl = distlib.wheel.Wheel(req_string)
            self.name = canonicalize_name(whl.name)
            self.specifier = "==" + canonicalize_version(whl.version)
            self.req = pkg_resources.Requirement.parse(self.name + self.specifier)
            self.import_names = _discover_import_names(req_string)
            self.metadata = _extract_metadata(req_string)
        else:
            self.req = pkg_resources.Requirement.parse(req_string)
            self.name = canonicalize_name(self.req.name)
            self.specifier = str(self.req.specifier)
            log.debug("fetching best wheel")
            self.import_names, self.metadata = _get_info(
                dist_name=req_string,
                index_url=index_url,
                env=env,
                extra_index_url=extra_index_url,
            )

        self.extras_requested = sorted(self.req.extras)
        if parent is None:
            if env:
                log.debug("root node target env", **dict(env))
            self.required_by = []
        else:
            self.required_by = [str(parent.req)]
示例#6
0
def get_pkg_pypi_version(pkg):
    req = rq.get(f"https://pypi.org/pypi/{pkg}/json")

    print(f"Retrieving '{pkg}' version...", end="")

    ver = canonicalize_version(req.json()["info"]["version"])

    print("OK.")

    return ver
示例#7
0
def upgrade():
    connection = op.get_bind()
    version_query = sa.select([releases.c.version]).distinct()

    for release in connection.execute(version_query):
        connection.execute(releases.update().where(
            sa.and_(
                releases.c.version == release.version,
                releases.c.canonical_version.is_(None),
            )).values(canonical_version=canonicalize_version(release.version)))

    op.alter_column("releases", "canonical_version", nullable=False)
示例#8
0
def _get_pypi_version(special_version, release_dict):
    """
    Loop over the pypi release dictionary looking for an equivalent version string. Return the alternative version
    if found, otherwise return None.
    :param special_version: The version string that failed to match against the Pypi versions.
    :param release_dict: Pypi's releases dictionary for a given module.
    :return: The matching version string or None if it not matched.
    """
    for release in release_dict:
        pypi_version = canonicalize_version(release)
        if special_version == pypi_version or special_version == release:
            return release
    return None
示例#9
0
def find_dist_info_dir(
    namelist: List[str], project: str, version: str
) -> Tuple[str, Optional[str]]:
    """
    Given a list ``namelist`` of files in a wheel for a project ``project`` and
    version ``version``, find & return the name of the wheel's ``.dist-info``
    directory.

    :raises DistInfoError: if there is no unique ``.dist-info`` directory in
        the input
    :raises DistInfoError: if the name & version of the ``.dist-info``
        directory are not normalization-equivalent to ``project`` & ``version``
    """
    canon_project = canonicalize_name(project)
    canon_version = canonicalize_version(version.replace("_", "-"))
    dist_info_dirs = set()
    for n in namelist:
        basename = n.rstrip("/").split("/")[0]
        if is_dist_info_dir(basename):
            dist_info_dirs.add(basename)
    if len(dist_info_dirs) > 1:
        raise DistInfoError("Wheel contains multiple .dist-info directories")
    elif len(dist_info_dirs) == 1:
        dist_info_dir = next(iter(dist_info_dirs))
        diname, _, diversion = dist_info_dir[: -len(".dist-info")].partition("-")
        if (
            canonicalize_name(diname) != canon_project
            or canonicalize_version(diversion.replace("_", "-")) != canon_version
        ):
            raise DistInfoError(
                f"Project & version of wheel's .dist-info directory do not"
                f" match wheel name: {dist_info_dir!r}"
            )
        return dist_info_dir
    else:
        raise DistInfoError("No .dist-info directory in wheel")
def upgrade():
    connection = op.get_bind()
    version_query = sa.select([releases.c.version]).distinct()

    for release in connection.execute(version_query):
        connection.execute(
            releases.update()
            .where(
                sa.and_(
                    releases.c.version == release.version,
                    releases.c.canonical_version.is_(None),
                )
            )
            .values(canonical_version=canonicalize_version(release.version))
        )

    op.alter_column("releases", "canonical_version", nullable=False)
示例#11
0
    def __init__(self, req_string, parent=None, index_url=None, env=None, extra_index_url=None):
        self.dist_path = None
        if req_string.endswith(".whl") and os.path.isfile(req_string):
            self.dist_path = req_string
            whl = WheelFile(req_string)
            whl_name_info = whl.parsed_filename.groupdict()
            self.name = canonicalize_name(whl_name_info["name"])
            self.specifier = "==" + canonicalize_version(whl_name_info["ver"])
            self.req = pkg_resources.Requirement.parse(self.name + self.specifier)
        else:
            self.req = pkg_resources.Requirement.parse(req_string)
            self.name = canonicalize_name(self.req.name)
            self.specifier = str(self.req.specifier)

        self.extras_requested = sorted(self.req.extras)
        log = self.log = logger.bind(dist=str(self.req))
        log.info("init johnnydist", parent=parent and str(parent.req))
        if parent is not None:
            self.index_url = parent.index_url
            self.extra_index_url = parent.extra_index_url
            self.required_by = [str(parent.req)]
            self.env = parent.env
            self.env_data = parent.env_data
        else:
            self.index_url = index_url
            self.extra_index_url = extra_index_url
            self.required_by = []
            self.env = env
            if self.env is None:
                self.env_data = default_environment()
            else:
                self.env_data = dict(self.env)
            log.debug("target env", **self.env_data)
        if self.dist_path is None:
            log.debug("fetching best wheel")
            with wimpy.working_directory(self.tmp()):
                data = pipper.get(
                    req_string,
                    index_url=self.index_url,
                    env=self.env,
                    extra_index_url=self.extra_index_url,
                )
                self.dist_path = data["path"]
        self.parent = parent
        self._recursed = False
示例#12
0
def test_canonicalize_version(version, expected):
    assert canonicalize_version(version) == expected
示例#13
0
    def __init__(self,
                 req_string,
                 parent=None,
                 index_url=None,
                 env=None,
                 extra_index_url=None):
        self.dist_path = None
        if req_string.endswith(".whl") and os.path.isfile(req_string):
            self.dist_path = req_string
            whl = WheelFile(req_string)
            whl_name_info = whl.parsed_filename.groupdict()
            self.name = canonicalize_name(whl_name_info["name"])
            self.specifier = "==" + canonicalize_version(whl_name_info["ver"])
            self.req = pkg_resources.Requirement.parse(self.name +
                                                       self.specifier)
        else:
            self.req = pkg_resources.Requirement.parse(req_string)
            self.name = canonicalize_name(self.req.name)
            self.specifier = str(self.req.specifier)

        self.extras_requested = sorted(self.req.extras)
        log = self.log = logger.bind(dist=str(self.req))
        log.info("init johnnydist", parent=parent and str(parent.req))
        if parent is not None:
            self.index_url = parent.index_url
            self.extra_index_url = parent.extra_index_url
            self.required_by = [str(parent.req)]
            self.env = parent.env
            self.env_data = parent.env_data
        else:
            self.index_url = index_url
            self.extra_index_url = extra_index_url
            self.required_by = []
            self.env = env
            if self.env is None:
                self.env_data = default_environment()
            else:
                self.env_data = dict(self.env)
            log.debug("target env", **self.env_data)
        if self.dist_path is None:
            log.debug("fetching best wheel")
            tmpdir = tempfile.mkdtemp()
            log.debug("created scratch", tmpdir=tmpdir)
            try:
                with wimpy.working_directory(tmpdir):
                    data = pipper.get(
                        req_string,
                        index_url=self.index_url,
                        env=self.env,
                        extra_index_url=self.extra_index_url,
                        tmpdir=tmpdir,
                    )
                self.dist_path = data["path"]
                # triggers retrieval of any info we need from downloaded dist
                self.import_names
                self.metadata
            finally:
                log.debug("removing scratch", tmpdir=tmpdir)
                shutil.rmtree(tmpdir)
        self.parent = parent
        self._recursed = False
示例#14
0
def get_or_default_pkg_version(pkg):
    try:
        return get_pkg_pypi_version(pkg)
    except Exception:
        print("Not found, using dummy v0.0")
        return canonicalize_version("0.0")
        pass
    except Exception as e:
        sys.exit(e)

if backend is not None:
    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)
    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)})")

# Will need pip to build and install the wheel
示例#16
0
        is_installed = False

    # Query the Web for the needed version
    request = ".".join(version.base_version.split(".")[0:1])
    url = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{}".format(
        request
    )
    response = requests.get(url)
    if response.status_code != 200:
        raise RuntimeError(
            "Error getting chrome driver version {}".format(response.status_code)
        )
    needed_version = parse_version(response.text)

    if is_installed and (
        canonicalize_version(str(needed_version))
        == canonicalize_version(str(current_version))
    ):
        print("The version currently installed is correct.")
    else:
        # Remove the current version
        subprocess.check_call(
            [sys.executable, "-m", "pip", "uninstall", "-y", "chromedriver-binary"]
        )
        is_installed = False

    if not is_installed:
        # Remove the current version
        subprocess.check_call(
            [
                sys.executable,
示例#17
0
def test_canonicalize_version(version, expected):
    assert canonicalize_version(version) == expected
示例#18
0
def test_canonicalize_version_no_strip_trailing_zero(version):
    assert canonicalize_version(version, strip_trailing_zero=False) == version
示例#19
0
文件: packages.py 项目: jurelou/pypis
def canonicalize_package_version(version: str) -> str:
    """Return the normalized form of the version."""
    return str(canonicalize_version(version))