コード例 #1
0
    def test_exclusive_environment_markers(
            self, monkeypatch: pytest.MonkeyPatch) -> None:
        """Make sure excluding environment markers are handled correctly."""
        # GIVEN
        resolver = make_test_resolver(monkeypatch, [])
        requirement_set = RequirementSet(check_supported_wheels=True)

        eq36 = install_req_from_line(
            "Django>=1.6.10,<1.7 ; python_version == '3.6'")
        eq36.user_supplied = True
        ne36 = install_req_from_line(
            "Django>=1.6.10,<1.8 ; python_version != '3.6'")
        ne36.user_supplied = True

        # WHEN
        resolver._add_requirement_to_set(requirement_set, eq36)
        resolver._add_requirement_to_set(requirement_set, ne36)

        # THEN
        assert requirement_set.has_requirement("Django")
        assert len(requirement_set.all_requirements) == 1
コード例 #2
0
    def _resolve_one(
        self,
        requirement_set: RequirementSet,
        req_to_install: InstallRequirement,
    ) -> List[InstallRequirement]:
        """Prepare a single requirements file.

        :return: A list of additional InstallRequirements to also install.
        """
        # Tell user what we are doing for this requirement:
        # obtain (editable), skipping, processing (local url), collecting
        # (remote url or package name)
        if req_to_install.constraint or req_to_install.prepared:
            return []

        req_to_install.prepared = True

        # Parse and return dependencies
        dist = self._get_dist_for(req_to_install)
        # This will raise UnsupportedPythonVersion if the given Python
        # version isn't compatible with the distribution's Requires-Python.
        _check_dist_requires_python(
            dist,
            version_info=self._py_version_info,
            ignore_requires_python=self.ignore_requires_python,
        )

        more_reqs: List[InstallRequirement] = []

        def add_req(subreq: Distribution,
                    extras_requested: Iterable[str]) -> None:
            sub_install_req = self._make_install_req(
                str(subreq),
                req_to_install,
            )
            parent_req_name = req_to_install.name
            to_scan_again, add_to_parent = requirement_set.add_requirement(
                sub_install_req,
                parent_req_name=parent_req_name,
                extras_requested=extras_requested,
            )
            if parent_req_name and add_to_parent:
                self._discovered_dependencies[parent_req_name].append(
                    add_to_parent)
            more_reqs.extend(to_scan_again)

        with indent_log():
            # We add req_to_install before its dependencies, so that we
            # can refer to it when adding dependencies.
            if not requirement_set.has_requirement(req_to_install.name):
                # 'unnamed' requirements will get added here
                # 'unnamed' requirements can only come from being directly
                # provided by the user.
                assert req_to_install.user_supplied
                requirement_set.add_requirement(req_to_install,
                                                parent_req_name=None)

            if not self.ignore_dependencies:
                if req_to_install.extras:
                    logger.debug(
                        "Installing extra requirements: %r",
                        ",".join(req_to_install.extras),
                    )
                missing_requested = sorted(
                    set(req_to_install.extras) - set(dist.extras))
                for missing in missing_requested:
                    logger.warning("%s does not provide the extra '%s'", dist,
                                   missing)

                available_requested = sorted(
                    set(dist.extras) & set(req_to_install.extras))
                for subreq in dist.requires(available_requested):
                    add_req(subreq, extras_requested=available_requested)

        return more_reqs