Exemplo n.º 1
0
    def test_single_constraint(self):
        # Given
        request = Request()
        request.install(Requirement._from_string("numpy < 1.8"))
        r_php_parts = [
            ('install', 'numpy', ('VersionConstraint("<", "1.8.0.0")',)),
        ]

        # When
        php_parts = request_to_php_parts(request)

        # Then
        self.assertEqual(php_parts, r_php_parts)
Exemplo n.º 2
0
    def test_no_constraints(self):
        # Given
        request = Request()
        request.install(Requirement._from_string("numpy"))
        r_php_parts = [
            ('install', 'numpy', tuple()),
        ]

        # When
        php_parts = request_to_php_parts(request)

        # Then
        self.assertEqual(php_parts, r_php_parts)
Exemplo n.º 3
0
def generate_rules_for_requirement(pool, requirement, installed_map=None):
    """Generate CNF rules for a requirement.

    Parameters
    ----------
    pool: Pool
        Package constraints.
    requirement: Requirement
        Package to be installed.

    Returns
    -------
    rules: list
        Package rules describing the given scenario.
    """
    request = Request()
    request.install(requirement)

    rules_generator = RulesGenerator(pool, request, installed_map)
    rules = list(rules_generator.iter_rules())
    return rules
Exemplo n.º 4
0
def generate_rules_for_requirement(pool, requirement, installed_map=None):
    """Generate CNF rules for a requirement.

    Parameters
    ----------
    pool: Pool
        Package constraints.
    requirement: Requirement
        Package to be installed.

    Returns
    -------
    rules: list
        Package rules describing the given scenario.
    """
    request = Request()
    request.install(requirement)

    rules_generator = RulesGenerator(pool, request, installed_map)
    rules = list(rules_generator.iter_rules())
    return rules
Exemplo n.º 5
0
    # Step 2: recurse
    for dependency in best_dependencies:
        solution = optimize_at_level(pool, dependency, new_rules, solution)

    return solution


def optimize(pool, requirement, rules):
    best_package = find_best_candidate(pool, requirement, rules)
    solution = [best_package]
    return optimize_at_level(pool, best_package, rules, solution)


if __name__ == '__main__':
    repository = repository_from_index("full_index.json")
    pool = Pool([repository])

    requirement_str = "scikit_learn < 0.14"
    requirement = Requirement._from_string(requirement_str)

    request = Request()
    request.install(requirement)

    rules_generator = RulesGenerator(pool, request)
    rules = list(rules_generator.iter_rules())

    solution = optimize(pool, requirement, rules)
    for decision in solution:
        print(decision.name, str(decision.version))
Exemplo n.º 6
0
    # Step 2: recurse
    for dependency in best_dependencies:
        solution = optimize_at_level(pool, dependency, new_rules, solution)

    return solution


def optimize(pool, requirement, rules):
    best_package = find_best_candidate(pool, requirement, rules)
    solution = [best_package]
    return optimize_at_level(pool, best_package, rules, solution)


if __name__ == '__main__':
    repository = repository_from_index("full_index.json")
    pool = Pool([repository])

    requirement_str = "scikit_learn < 0.14"
    requirement = Requirement._from_string(requirement_str)

    request = Request()
    request.install(requirement)

    rules_generator = RulesGenerator(pool, request)
    rules = list(rules_generator.iter_rules())

    solution = optimize(pool, requirement, rules)
    for decision in solution:
        print(decision.name, str(decision.version))
Exemplo n.º 7
0
def install_req(enpkg, config, req, opts):
    """
    Try to execute the install actions.
    """
    # Unix exit-status codes
    FAILURE = 1
    req = Requirement.from_anything(req)
    request = Request()
    request.install(req)

    def _done(exit_status):
        sys.exit(exit_status)

    def _get_unsupported_packages(actions):
        ret = []
        for opcode, egg in actions:
            if opcode == "install":
                name, version = egg_name_to_name_version(egg)
                package = enpkg._remote_repository.find_package(name, version)
                if package.product == "pypi":
                    ret.append(package)
        return ret

    def _ask_pypi_confirmation(package_list_string):
        msg = textwrap.dedent("""\
        The following packages/requirements are coming from the PyPi repo:

        {0}

        The PyPi repository which contains >10,000 untested ("as is")
        packages. Some packages are licensed under GPL or other licenses
        which are prohibited for some users. Dependencies may not be
        provided. If you need an updated version or if the installation
        fails due to unmet dependencies, the Knowledge Base article
        Installing external packages into Canopy Python
        (https://support.enthought.com/entries/23389761) may help you with
        installing it.
        """.format(package_list_string))
        print(msg)

        msg = "Are you sure that you wish to proceed?  (y/[n])"
        if not prompt_yes_no(msg, opts.yes):
            sys.exit(0)

    def _ask_pypi_confirmation_from_actions(actions):
        unsupported_packages = _get_unsupported_packages(actions)
        if len(unsupported_packages) > 0:
            package_list = sorted("'{0}-{1}'".format(p.name, p.full_version)
                                  for p in unsupported_packages)
            package_list_string = "\n".join(package_list)
            _ask_pypi_confirmation(package_list_string)

    try:
        mode = 'root' if opts.no_deps else 'recur'
        pypi_asked = False
        solver = enpkg._solver_factory(mode, opts.force, opts.forceall)

        pypi_requirements = _requirement_from_pypi(request,
                                                   enpkg._remote_repository)

        try:
            actions = solver.resolve(request)
        except MissingDependency as e:
            if len(pypi_requirements) > 0:
                msg = _BROKEN_PYPI_TEMPLATE.format(requested=e.requester,
                                                   dependency=e.requirement)
                print(msg)
            else:
                print("One of the requested package has broken dependencies")
                print("(Dependency solving error: {0})".format(e))
            _done(FAILURE)

        if len(pypi_requirements) > 0:
            package_list = sorted(str(p) for p in pypi_requirements)
            _ask_pypi_confirmation("\n".join(package_list))
            pypi_asked = True

        installed = (egg for opcode, egg in actions if opcode == "install")
        actions = [("fetch", egg) for egg in installed] + actions

        if _is_any_package_unavailable(enpkg._remote_repository, actions):
            _notify_unavailable_package(config, req, enpkg._session)
            _done(FAILURE)
        if not pypi_asked:
            _ask_pypi_confirmation_from_actions(actions)
        enpkg.execute(actions)
        if len(actions) == 0:
            print("No update necessary, %r is up-to-date." % req.name)
            print(install_time_string(enpkg._installed_repository,
                                      req.name))
    except NoPackageFound as e:
        print(str(e))
        _done(FAILURE)
    except OSError as e:
        if e.errno == errno.EACCES and sys.platform == 'darwin':
            print("Install failed. OSX install requires admin privileges.")
            print("You should add 'sudo ' before the 'enpkg' command.")
            _done(FAILURE)
        else:
            raise
Exemplo n.º 8
0
def install_req(enpkg, config, req, opts):
    """
    Try to execute the install actions.
    """
    # Unix exit-status codes
    FAILURE = 1
    req = Requirement.from_anything(req)
    request = Request()
    request.install(req)

    def _done(exit_status):
        sys.exit(exit_status)

    def _get_unsupported_packages(actions):
        ret = []
        for opcode, egg in actions:
            if opcode == "install":
                name, version = egg_name_to_name_version(egg)
                package = enpkg._remote_repository.find_package(name, version)
                if package.product == "pypi":
                    ret.append(package)
        return ret

    def _ask_pypi_confirmation(package_list_string):
        msg = textwrap.dedent("""\
        The following packages/requirements are coming from the PyPi repo:

        {0}

        The PyPi repository which contains >10,000 untested ("as is")
        packages. Some packages are licensed under GPL or other licenses
        which are prohibited for some users. Dependencies may not be
        provided. If you need an updated version or if the installation
        fails due to unmet dependencies, the Knowledge Base article
        Installing external packages into Canopy Python
        (https://support.enthought.com/entries/23389761) may help you with
        installing it.
        """.format(package_list_string))
        print(msg)

        msg = "Are you sure that you wish to proceed?  (y/[n])"
        if not prompt_yes_no(msg, opts.yes):
            sys.exit(0)

    def _ask_pypi_confirmation_from_actions(actions):
        unsupported_packages = _get_unsupported_packages(actions)
        if len(unsupported_packages) > 0:
            package_list = sorted("'{0}-{1}'".format(p.name, p.full_version)
                                  for p in unsupported_packages)
            package_list_string = "\n".join(package_list)
            _ask_pypi_confirmation(package_list_string)

    try:
        mode = 'root' if opts.no_deps else 'recur'
        pypi_asked = False
        solver = enpkg._solver_factory(mode, opts.force, opts.forceall)

        pypi_requirements = _requirement_from_pypi(request,
                                                   enpkg._remote_repository)

        try:
            actions = solver.resolve(request)
        except MissingDependency as e:
            if len(pypi_requirements) > 0:
                msg = _BROKEN_PYPI_TEMPLATE.format(requested=e.requester,
                                                   dependency=e.requirement)
                print(msg)
            else:
                print("One of the requested package has broken dependencies")
                print("(Dependency solving error: {0})".format(e))
            _done(FAILURE)

        if len(pypi_requirements) > 0:
            package_list = sorted(str(p) for p in pypi_requirements)
            _ask_pypi_confirmation("\n".join(package_list))
            pypi_asked = True

        installed = (egg for opcode, egg in actions if opcode == "install")
        actions = [("fetch", egg) for egg in installed] + actions

        if _is_any_package_unavailable(enpkg._remote_repository, actions):
            _notify_unavailable_package(config, req, enpkg._session)
            _done(FAILURE)
        if not pypi_asked:
            _ask_pypi_confirmation_from_actions(actions)
        enpkg.execute(actions)
        if len(actions) == 0:
            print("No update necessary, %r is up-to-date." % req.name)
            print(install_time_string(enpkg._installed_repository, req.name))
    except NoPackageFound as e:
        print(str(e))
        _done(FAILURE)
    except OSError as e:
        if e.errno == errno.EACCES and sys.platform == 'darwin':
            print("Install failed. OSX install requires admin privileges.")
            print("You should add 'sudo ' before the 'enpkg' command.")
            _done(FAILURE)
        else:
            raise