Пример #1
0
def update_registry(registry,
                    yes=False,
                    user=False,
                    check=False,
                    latest=False,
                    interactive=False,
                    verbose=False):
    source = registry.source
    packages = registry.packages

    table = Table(
        header=["Name", "Current Version", "Latest Version", "Home Page"])
    dinfo = []  # Information DataFrame

    for package in packages:
        package.source = source
        package.installed = registry.installed

        if package.latest_version and package.current_version != package.latest_version:
            diff_type = None

            try:
                diff_type = semver.difference(package.current_version,
                                              package.latest_version)
            except (TypeError, ValueError):
                pass

            table.insert([
                cli_format(package.name,
                           _SEMVER_COLOR_MAP.get(diff_type, cli.CLEAR)),
                package.current_version or "na",
                _cli_format_semver(package.latest_version, diff_type),
                cli_format(package.home_page, cli.CYAN)
            ])

            package.diff_type = diff_type

            dinfo.append(package)

        if not registry.installed:
            _update_requirements(package.source, package)

    stitle = "Installed Distributions (%s)" % source if registry.installed else source

    if not table.empty:
        string = table.render()

        cli.echo("\nSource: %s\n" % stitle)

        if not interactive:
            cli.echo(string)
            cli.echo()

        if not check:
            packages = [p for p in dinfo if p.diff_type != "major" or latest]
            npackages = len(packages)

            spackages = pluralize("package", npackages)  # Packages "string"
            query = "Do you wish to update %s %s?" % (npackages, spackages)

            if npackages and (yes or interactive
                              or cli.confirm(query, quit_=True)):
                for i, package in enumerate(packages):
                    update = True

                    query = "%s (%s > %s)" % (cli_format(
                        package.name,
                        _SEMVER_COLOR_MAP.get(package.diff_type, cli.CLEAR)),
                                              package.current_version,
                                              _cli_format_semver(
                                                  package.latest_version,
                                                  package.diff_type))

                    if interactive:
                        update = yes or cli.confirm(query)

                    if update:
                        cli.echo(
                            cli_format(
                                "Updating %s of %s %s: %s" %
                                (i + 1, npackages, spackages,
                                 cli_format(package.name, cli.GREEN)),
                                cli.BOLD))

                        _pip.call("install",
                                  package.name,
                                  pip_exec=package.source,
                                  user=user,
                                  quiet=not verbose,
                                  no_cache_dir=True,
                                  upgrade=True)

                        if not package.installed:
                            _update_requirements(package.source, package)
    else:
        cli.echo("%s upto date." % cli_format(stitle, cli.CYAN))
Пример #2
0
def update_registry(registry,
                    yes=False,
                    user=False,
                    check=False,
                    latest=False,
                    interactive=False,
                    format_="table",
                    all=False,
                    filter_=[],
                    file=None,
                    raise_err=True,
                    verbose=False,
                    upgrade_type=("minor", "patch")):
    source = registry.source
    packages = registry.packages

    if filter_:
        packages = [p for p in packages if p["name"] in filter_]

    table = Table(
        header=["Name", "Current Version", "Latest Version", "Home Page"])
    nodes = []
    render = False
    dinfo = []  # Information DataFrame

    for package in packages:
        package.source = source
        package.installed = registry.installed

        current_version = package.current_version

        if all or current_version:
            current_version = current_version.replace("==", "")

        if all or (package.latest_version
                   and current_version != package.latest_version):
            render = True

            if format_ in _DEPENDENCY_FORMATS:
                nodes.append(package)
            else:
                table.insert([
                    cli_format(
                        package.name,
                        _SEMVER_COLOR_MAP.get(package.difference, cli.CLEAR)),
                    package.current_version or "na",
                    _cli_format_semver(package.latest_version,
                                       package.difference),
                    cli_format(package.home_page, cli.CYAN)
                ])

            dinfo.append(package)

    stitle = "Installed Distributions (%s)" % source if registry.installed else source

    if render:
        if format_ in _DEPENDENCY_FORMATS:
            nodes = _resolve_dependencies(nodes)
            dinfo = nodes

        if format_ == "tree":
            string = _render_dependency_tree(nodes)
        elif format_ == "json":
            string = _render_json(nodes)
        elif format_ == "yaml":
            string = _render_yaml(nodes)
        elif format_ == "table":
            string = table.render()

        cli.echo("\nSource: %s\n" % stitle, file=file)

        if not interactive or check:
            cli.echo(string, file=file)
            cli.echo(file=file)

        if not check:
            packages = [
                p for p in dinfo
                if p.difference in upgrade_type or p.difference == "major"
            ]
            packages = [
                p for p in dinfo if p.difference != "major"
                or getattr(p, "has_dependency_conflict", False) or latest
            ]

            npackages = len(packages)

            spackages = pluralize("package", npackages)  # Packages "string"
            query = "Do you wish to update %s %s?" % (npackages, spackages)

            if npackages and (yes or interactive
                              or cli.confirm(query, quit_=True)):
                for i, package in enumerate(packages):
                    update = True

                    query = "%s (%s) -> (%s)" % (cli_format(
                        package.name,
                        _SEMVER_COLOR_MAP.get(package.difference, cli.CLEAR)),
                                                 package.current_version,
                                                 _cli_format_semver(
                                                     package.latest_version,
                                                     package.difference))

                    if interactive:
                        update = yes or cli.confirm(query)

                    if update:
                        cli.echo(cli_format(
                            "Updating %s of %s %s: %s" %
                            (i + 1, npackages, spackages,
                             cli_format(package.name, cli.GREEN)), cli.BOLD),
                                 file=file)

                        if not package.installed:
                            _update_requirements(package.source, package)
                        else:
                            try:
                                _pip.call("install",
                                          package.name,
                                          pip_exec=package.source,
                                          user=user,
                                          quiet=not verbose,
                                          no_cache_dir=True,
                                          upgrade=True)
                            except PopenError as e:
                                if raise_err:
                                    raise
    else:
        cli.echo("%s upto date." % cli_format(stitle, cli.CYAN), file=file)
Пример #3
0
def test_pluralize():
    assert pluralize("package", 1) == "package"
    assert pluralize("package", 2) == "packages"
    assert pluralize("packages", 2) == "packages"
Пример #4
0
def command(pip_path=[],
            requirements=[],
            pipfile=[],
            project=None,
            pull_request=False,
            git_username=None,
            git_email=None,
            github_access_token=None,
            github_reponame=None,
            github_username=None,
            target_branch="master",
            latest=False,
            self=False,
            user=False,
            check=False,
            interactive=False,
            yes=False,
            no_color=True,
            verbose=False):
    cli.echo(cli_format("Checking...", cli.YELLOW))

    pip_path = pip_path or []
    pip_path = [which(p) for p in pip_path] or _pip._PIP_EXECUTABLES

    registries = []

    if self:
        package = __name__

        _pip.call("install",
                  package,
                  user=user,
                  quiet=not verbose,
                  no_cache=True,
                  upgrade=True)
        cli.echo("%s upto date." % cli_format(package, cli.CYAN))
    else:
        if project:
            requirements = requirements or []
            pipfile = pipfile or []

            for i, p in enumerate(project):
                project[i] = Project(osp.abspath(p))
                requirements += project[i].requirements
                pipfile += [project[i].pipfile]

        if requirements:
            for requirement in requirements:
                path = osp.realpath(requirement)

                if not osp.exists(path):
                    cli.echo(cli_format("{} not found.".format(path), cli.RED))
                    sys.exit(os.EX_NOINPUT)
                else:
                    requirements += _get_included_requirements(requirement)

            for requirement in requirements:
                path = osp.realpath(requirement)

                if not osp.exists(path):
                    cli.echo(cli_format("{} not found.".format(path), cli.RED))
                    sys.exit(os.EX_NOINPUT)
                else:
                    packages = _pip.parse_requirements(requirement,
                                                       session="hack")
                    registry = Registry(source=path, packages=packages)

                    registries.append(registry)
        else:
            for pip_ in pip_path:
                _, output, _ = _pip.call("list", outdated = True, \
                 format = "json", pip_exec = pip_)
                packages = json.loads(output)
                registry = Registry(source=pip_,
                                    packages=packages,
                                    installed=True)

                registries.append(registry)
                # _pip.get_installed_distributions() # https://github.com/achillesrasquinha/pipupgrade/issues/13

        for registry in registries:
            source = registry.source
            packages = registry.packages

            table = Table(header=[
                "Name", "Current Version", "Latest Version", "Home Page"
            ])
            dinfo = []  # Information DataFrame

            for package in packages:
                package = Package(package)
                package.source = source
                package.installed = registry.installed

                if package.latest_version and package.current_version != package.latest_version:
                    diff_type = None

                    try:
                        diff_type = semver.difference(package.current_version,
                                                      package.latest_version)
                    except (TypeError, ValueError):
                        pass

                    table.insert([
                        cli_format(package.name,
                                   _SEMVER_COLOR_MAP.get(diff_type,
                                                         cli.CLEAR)),
                        package.current_version or "na",
                        _cli_format_semver(package.latest_version, diff_type),
                        cli_format(package.home_page, cli.CYAN)
                    ])

                    package.diff_type = diff_type

                    dinfo.append(package)

                if not registry.installed:
                    _update_requirements(package.source, package)

            stitle = "Installed Distributions (%s)" % source if registry.installed else source

            if not table.empty:
                string = table.render()

                cli.echo("\nSource: %s\n" % stitle)

                if not interactive:
                    cli.echo(string)
                    cli.echo()

                if not check:
                    packages = [
                        p for p in dinfo if p.diff_type != "major" or latest
                    ]
                    npackages = len(packages)

                    spackages = pluralize("package",
                                          npackages)  # Packages "string"
                    query = "Do you wish to update %s %s?" % (npackages,
                                                              spackages)

                    if npackages and (yes or interactive
                                      or cli.confirm(query, quit_=True)):
                        for i, package in enumerate(packages):
                            update = True

                            query = "%s (%s > %s)" % (
                                cli_format(
                                    package.name,
                                    _SEMVER_COLOR_MAP.get(
                                        package.diff_type,
                                        cli.CLEAR)), package.current_version,
                                _cli_format_semver(package.latest_version,
                                                   package.diff_type))

                            if interactive:
                                update = yes or cli.confirm(query)

                            if update:
                                cli.echo(
                                    cli_format(
                                        "Updating %s of %s %s: %s" %
                                        (i + 1, npackages, spackages,
                                         cli_format(package.name, cli.GREEN)),
                                        cli.BOLD))

                                _pip.call("install",
                                          package.name,
                                          pip_exec=package.source,
                                          user=user,
                                          quiet=not verbose,
                                          no_cache_dir=True,
                                          upgrade=True)

                                if not package.installed:
                                    _update_requirements(
                                        package.source, package)
            else:
                cli.echo("%s upto date." % cli_format(stitle, cli.CYAN))

        if pipfile:
            for pipf in pipfile:
                realpath = osp.realpath(pipf)
                basepath = osp.dirname(realpath)

                pipenv = which("pipenv", raise_err=True)
                popen("%s update" % pipenv, quiet=not verbose, cwd=basepath)

                cli.echo("%s upto date." % cli_format(realpath, cli.CYAN))

        if project and pull_request:
            errstr = '%s not found. Use %s or the environment variable "%s" to set value.'

            if not git_username:
                raise ValueError(errstr % ("Git Username", "--git-username",
                                           getenvvar("GIT_USERNAME")))
            if not git_email:
                raise ValueError(
                    errstr %
                    ("Git Email", "--git-email", getenvvar("GIT_EMAIL")))

            for p in project:
                popen("git config user.name  %s" % git_username, cwd=p.path)
                popen("git config user.email %s" % git_email, cwd=p.path)

                _, output, _ = popen("git status -s", output=True)

                if output:
                    branch = get_timestamp_str(format_="%Y%m%d%H%M%S")
                    popen("git checkout -B %s" % branch, quiet=not verbose)

                    title = "fix(dependencies): Update dependencies to latest"
                    body = ""

                    # TODO: cross-check with "git add" ?
                    files = p.requirements + [p.pipfile]
                    popen("git add %s" % " ".join(files),
                          quiet=not verbose,
                          cwd=p.path)
                    popen("git commit -m '%s'" % title,
                          quiet=not verbose,
                          cwd=p.path)

                    popen("git push origin %s" % branch,
                          quiet=not verbose,
                          cwd=p.path)

                    if not github_reponame:
                        raise ValueError(
                            errstr % ("GitHub Reponame", "--github-reponame",
                                      getenvvar("GITHUB_REPONAME")))
                    if not github_username:
                        raise ValueError(
                            errstr % ("GitHub Username", "--github-username",
                                      getenvvar("GITHUB_USERNAME")))

                    url = "/".join([
                        "https://api.github.com", "repos", github_username,
                        github_reponame, "pulls"
                    ])
                    headers = dict({
                        "Content-Type":
                        "application/json",
                        "Authorization":
                        "token %s" % github_access_token
                    })
                    data = dict(head="%s:%s" % (git_username, branch),
                                base=target_branch,
                                title=title,
                                body=body)

                    # Although there's monkey patch support for the "requests"
                    # library, avoid using the "json" parameter which was
                    # added in requests 2.4.2+
                    response = req.post(url,
                                        data=json.dumps(data),
                                        headers=headers)

                    if response.ok:
                        response = response.json()
                        number = response["number"]

                        url = "/".join(
                            map(str, [
                                "https://github.com", github_username,
                                github_reponame, "pull", number
                            ]))
                        message = "Created a Pull Request at %s" % url

                        cli.echo(cli_format(message, cli.GREEN))
                    else:
                        response.raise_for_status()