Пример #1
0
    def test_no_tf_21(self, urllib3_version: str, tf_version: str) -> None:
        """Test no penalization for TensorFlow other than 2.1 by this pipeline step."""
        urllib3_package_version = PackageVersion(
            name="urllib3",
            version=f"=={urllib3_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        tf_package_version = PackageVersion(
            name="tensorflow",
            version=f"=={tf_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        state = State()
        state.resolved_dependencies[
            "tensorflow"] = tf_package_version.to_tuple()

        # Context is not used during the actual pipeline run.
        context = flexmock()
        with TensorFlow21Urllib3Step.assigned_context(context):
            unit = TensorFlow21Urllib3Step()
            assert unit.run(state, urllib3_package_version) is None
Пример #2
0
    def test_tf_21(self, context: Context, urllib3_version: str,
                   tf_version: str) -> None:
        """Test penalizing TensorFlow in version 2.1."""
        tf_package_version = PackageVersion(
            name="tensorflow",
            version=f"=={tf_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        urllib3_package_version = PackageVersion(
            name="urllib3",
            version=f"=={urllib3_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        state = State()
        state.resolved_dependencies[
            "tensorflow"] = tf_package_version.to_tuple()

        assert not context.stack_info

        with TensorFlow21Urllib3Step.assigned_context(context):
            unit = TensorFlow21Urllib3Step()
            unit.pre_run()
            assert unit._message_logged is False
            with pytest.raises(NotAcceptable):
                assert unit.run(state, urllib3_package_version)
                assert unit._message_logged is True

        assert context.stack_info
        assert self.verify_justification_schema(context.stack_info)
Пример #3
0
    def test_run_noop(self, context: Context, state: State, tf_name: str,
                      tf_version: str) -> None:
        """Test not removing scipy from a TensorFlow stack."""
        scipy_package_version = PackageVersion(
            name="scipy",
            version="==1.2.2",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )
        tf_package_version = PackageVersion(
            name=tf_name,
            version=f"=={tf_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        assert "tensorflow" not in state.resolved_dependencies
        state.resolved_dependencies[
            "tensorflow"] = tf_package_version.to_tuple()
        context.register_package_version(tf_package_version)
        context.dependents["scipy"] = {
            scipy_package_version.to_tuple():
            {(tf_package_version.to_tuple(), "rhel", "8", "3.6")}
        }

        unit = TensorFlowRemoveSciPyStep()
        with TensorFlowRemoveSciPyStep.assigned_context(context):
            assert unit.run(state, scipy_package_version) is None
Пример #4
0
    def test_sieve(self, context: "Context") -> None:
        """Test filtering out packages based on constraints configured."""
        package_version_1 = PackageVersion(
            name="pandas",
            version="==0.0.1",
            index=Source("https://pypi.org/simple"),
            develop=True)
        package_version_2 = PackageVersion(
            name="pandas",
            version="==0.0.2",
            index=Source("https://pypi.org/simple"),
            develop=True)

        unit = self.UNIT_TESTED()
        unit.update_configuration({
            "package_name": "pandas",
            "specifier": ">=1.0"
        })

        with unit.assigned_context(context):
            unit.pre_run()
            assert list(
                unit.run(
                    (pv
                     for pv in (package_version_1, package_version_2)))) == []
Пример #5
0
    def test_no_filter(self) -> None:
        """Test not filtering packages that can be included."""
        pkg1 = PackageVersion(
            name="setuptools",
            version="==17.0",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )
        pkg2 = PackageVersion(
            name="setuptools",
            version="==49.1.0",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )
        pkg3 = PackageVersion(
            name="setuptools",
            version="==50.30.8",
            develop=False,
            index=Source("https://thoth-station.ninja/simple"),
        )

        pkgs = [pkg1, pkg2, pkg3]

        context = flexmock()
        with Py36SetuptoolsSieve.assigned_context(context):
            unit = Py36SetuptoolsSieve()
            assert list(unit.run(p for p in pkgs)) == pkgs
Пример #6
0
    def test_tf_21(self, context: Context, tf_version: str, h5py_version: str) -> None:
        """Test blocking resolution of h5py with TensorFlow==2.1 or TensorFlow==2.3.1."""
        tf_package_version = PackageVersion(
            name="tensorflow",
            version=f"=={tf_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        h5py_package_version = PackageVersion(
            name="h5py",
            version=f"=={h5py_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        state = State()
        state.resolved_dependencies["tensorflow"] = tf_package_version.to_tuple()
        context.register_package_version(tf_package_version)

        assert not context.stack_info

        with self.UNIT_TESTED.assigned_context(context):
            unit = self.UNIT_TESTED()
            unit.pre_run()
            assert unit._message_logged is False
            with pytest.raises(NotAcceptable):
                unit.run(state, h5py_package_version)
            assert unit._message_logged is True

        assert context.stack_info
        assert self.verify_justification_schema(context.stack_info)
Пример #7
0
    def test_remove_latest_versions(self):
        """Test removing direct dependencies based on latest version limitation."""
        tf_1_1_0 = PackageVersion(
            name="tensorflow",
            version="==1.1.0",
            index=Source(
                "https://tensorflow.pypi.thoth-station.ninja/index/os/fedora/30/jemalloc/simple/"
            ),
            develop=False,
        )
        tf_1_9_0 = PackageVersion(
            name="tensorflow",
            version="==1.9.0",
            index=Source("https://pypi.org/simple"),
            develop=False,
        )
        tf_2_0_0 = PackageVersion(
            name="tensorflow",
            version="==2.0.0",
            index=Source(
                "https://tensorflow.pypi.thoth-station.ninja/index/manylinux2010/jemalloc/simple/"
            ),
            develop=False,
        )

        sieve = LimitLatestVersionsSieve(graph=None, project=None)
        sieve.update_parameters(dict([("limit_latest_versions", 1)]))

        sieve_context = SieveContext.from_package_versions(
            [tf_1_1_0, tf_1_9_0, tf_2_0_0])

        sieve.run(sieve_context)

        result = list(sieve_context.iter_direct_dependencies())
        assert result == [tf_2_0_0]
Пример #8
0
    def test_sort_packages(self):
        """Test sorting direct dependencies based on semver."""
        tf_1_9_0 = PackageVersion(
            name="tensorflow",
            version="==1.9.0",
            index=Source("https://pypi.org/simple"),
            develop=False,
        )
        tf_2_0_0 = PackageVersion(
            name="tensorflow",
            version="==2.0.0",
            index=Source(
                "https://tensorflow.pypi.thoth-station.ninja/index/manylinux2010/jemalloc/simple/"
            ),
            develop=False,
        )
        tf_1_1_0 = PackageVersion(
            name="tensorflow",
            version="==1.1.0",
            index=Source(
                "https://tensorflow.pypi.thoth-station.ninja/index/os/fedora/30/jemalloc/simple/"
            ),
            develop=False,
        )
        package_versions = [tf_1_9_0, tf_2_0_0, tf_1_1_0]
        sieve_context = SieveContext.from_package_versions(package_versions)

        sieve = SemverSortSieve(graph=None, project=None)
        sieve.run(sieve_context)

        result = sieve_context.iter_direct_dependencies()
        assert list(result) == [tf_1_1_0, tf_1_9_0, tf_2_0_0]
    def test_run_not_acceptable(self, context: Context, tf_name: str,
                                tf_version: str, gast_version: str) -> None:
        """Test not acceptable TensorFlow<=1.14 with gast>0.2.2."""
        gast_package_version = PackageVersion(
            name="gast",
            version=f"=={gast_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )
        tf_package_version = PackageVersion(
            name=tf_name,
            version=f"=={tf_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        state = State()
        state.add_resolved_dependency(tf_package_version.to_tuple())
        context.register_package_version(tf_package_version)

        unit = TensorFlow114GastStep()

        with unit.assigned_context(context):
            assert unit._message_logged is False
            with pytest.raises(NotAcceptable):
                unit.run(state, gast_package_version)

        assert unit._message_logged is True
Пример #10
0
def main() -> None:
    """Obtain symbols provided by TensorFlow in various releases."""
    pypi = Source("https://pypi.org/simple")

    os.makedirs("data", exist_ok=True)

    for tensorflow_version in pypi.get_package_versions("tensorflow"):
        print(
            f"Obtaining info for TensorFlow in version {tensorflow_version!r}")
        artifacts = [
            a for a in pypi.get_package_artifacts("tensorflow",
                                                  tensorflow_version)
            if "manylinux" in a.artifact_name
        ]
        if len(artifacts) == 0:
            print(
                f"!!! no artifacts to download for TensorFlow in version {tensorflow_version}"
            )
            continue

        artifacts[0]._extract_py_module()
        symbols = gather_symbols_provided(artifacts[0].dir_name,
                                          ignore_errors=True)

        with open(f"data/tensorflow-{tensorflow_version}.json", "w") as f:
            json.dump(symbols, f, sort_keys=True, indent=2)
Пример #11
0
def _schedule_default_packages_solver_jobs(packages: List[str],
                                           index_urls: List[str]) -> int:
    """Run solver jobs for Python packages list selected."""
    openshift = OpenShift()

    counter = 0
    for index_url in index_urls:
        _LOGGER.debug("consider index %r", index_url)
        source = Source(index_url)

        for package_name in packages:
            _LOGGER.debug("Obtaining %r versions", package_name)

            versions = []

            try:
                versions = source.get_package_versions(package_name)

            except Exception as exc:
                _LOGGER.exception(str(exc))

            if versions:

                for version in versions:
                    _LOGGER.info(
                        "Scheduling package_name %r in package_version %r",
                        package_name, version)
                    number_workflows = _do_schedule_solver_jobs(
                        openshift, index_urls, package_name, version)

                    counter += number_workflows

            _LOGGER.info(f"Already scheduled {counter} solver workflows...")

    return counter
Пример #12
0
    def test_run_noop(self, context: Context, tf_name: str, tf_version: str,
                      gast_version: str) -> None:
        """Test no operation performed when not invalid combination is seen."""
        gast_package_version = PackageVersion(
            name="gast",
            version=f"=={gast_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )
        tf_package_version = PackageVersion(
            name=tf_name,
            version=f"=={tf_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        state = State()
        state.add_resolved_dependency(tf_package_version.to_tuple())
        context.register_package_version(tf_package_version)

        unit = TensorFlow114GastStep()

        with unit.assigned_context(context):
            assert unit._message_logged is False
            assert unit.run(state, gast_package_version) is None
            assert unit._message_logged is False
Пример #13
0
    def test_run_acceptable_tf(self) -> None:
        """Test noop for this pipeline unit."""
        package_version_1 = PackageVersion(
            name="tensorflow-probability",
            version="==0.11.0",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        package_version_2 = PackageVersion(
            name="flask",
            version="==0.12",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        state = State()
        unit = TensorFlow22ProbabilityStep()

        assert unit.run(state, package_version_1) is None
        assert unit.run(state, package_version_2) is None

        state.add_resolved_dependency(("tensorflow", "2.3.0", "https://pypi.org/simple"))
        assert unit.run(state, package_version_1) is None
        assert unit.run(state, package_version_2) is None
Пример #14
0
def _create_entry(entry: dict, source: Source = None) -> dict:
    """Filter and normalize the output of pipdeptree entry."""
    entry["package_name"] = entry["package"].pop("package_name")
    entry["package_version"] = entry["package"].pop("installed_version")
    entry["requested_package_version"] = entry["package"].pop(
        "requested_package_version", entry["package_version"])

    if source:
        entry["index_url"] = source.url
        entry["sha256"] = []
        try:
            package_hashes = source.get_package_hashes(
                entry["package_name"], entry["package_version"])
        except NotFound:
            package_hashes = source.get_package_hashes(
                entry["package_name"], entry["requested_package_version"])
        for item in package_hashes:
            entry["sha256"].append(item["sha256"])

    entry.pop("package")
    for dependency in entry["dependencies"]:
        dependency.pop("key", None)
        dependency.pop("installed_version", None)

    return entry
Пример #15
0
    def test_no_filter(self) -> None:
        """Test not filtering packages that can be included."""
        pkg1 = PackageVersion(
            name="pandas",
            version="==1.1.2",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )
        pkg2 = PackageVersion(
            name="pandas",
            version="==1.0.0",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )
        pkg3 = PackageVersion(
            name="pandas",
            version="==0.24.2",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        pkgs = [pkg1, pkg2, pkg3]

        context = flexmock()
        unit = PandasPy36Sieve()
        unit.pre_run()
        with PandasPy36Sieve.assigned_context(context):
            assert unit._message_logged is False
            assert list(unit.run(p for p in pkgs)) == pkgs
            assert unit._message_logged is False
Пример #16
0
    def test_run_not_acceptable(self, context: Context, tf_name: str,
                                tf_version: str, np_version: str) -> None:
        """Test resolutions that are not acceptable."""
        package_version = PackageVersion(
            name="numpy",
            version=f"=={np_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        tf_package_version = PackageVersion(
            name=tf_name,
            version=f"=={tf_version}",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        state = State()
        state.add_resolved_dependency(tf_package_version.to_tuple())
        context.register_package_version(tf_package_version)

        unit = TensorFlow22NumPyStep()
        unit.pre_run()

        with unit.assigned_context(context):
            assert unit._message_logged is False
            with pytest.raises(NotAcceptable):
                unit.run(state, package_version)

        assert unit._message_logged is True
Пример #17
0
 def test_parse_requirements(self) -> None:
     """Test parsing requirements file."""
     requirements_path = os.path.join(self.data_dir, "requirements",
                                      "parse_requirements.txt")
     parsed = parse_requirements(requirements_path)
     assert isinstance(parsed, tuple)
     assert len(parsed) == 2
     assert parsed[0] == [
         Source(url="https://pypi.org/simple",
                name="pypi-org",
                verify_ssl=True,
                warehouse=True,
                warehouse_api_url=None),
         Source(
             url="https://tensorflow.pypi.thoth-station.ninja/simple",
             name="tensorflow-pypi-thoth-station-ninja",
             verify_ssl=True,
             warehouse=False,
             warehouse_api_url=None,
         ),
     ]
     assert parsed[1] == [
         PackageVersion(
             name="click",
             version="==7.0",
             develop=False,
             index=None,
             hashes=[
                 "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13"
             ],
             markers=None,
             extras=["cool"],
         ),
         PackageVersion(
             name="flask",
             version="<=1.1.1>0.12",
             develop=False,
             index=None,
             hashes=[
                 "sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6"
             ],
             markers='python_version >= "2.7"',
         ),
         PackageVersion(
             name="werkzeug",
             version="==0.16.0",
             develop=False,
             index=None,
             hashes=[
                 "sha256:7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7"
             ],
             markers=None,
         ),
     ]
Пример #18
0
def _retrieve_latest_version() -> Optional[Any]:
    """Retrieve storages latest version."""
    python_package_name = "thoth-storages"
    python_package_index = "https://pypi.org/simple"
    source = Source(python_package_index)

    try:
        latest_version = source.get_latest_package_version(python_package_name)
    except Exception as exc:
        _LOGGER.warning("Could not retrieve version for package %r from %r", python_package_name, python_package_index)

    return latest_version
Пример #19
0
    def test_sort_packages(self):
        a_pkg = PackageVersion(
            name="a",
            version="==1.0.0",
            index=Source("https://pypi.org/simple"),
            develop=False,
        )
        b_pkg = PackageVersion(
            name="b",
            version="==2.0.0",
            index=Source("https://tensorflow.pypi.thoth-station.ninja/simple"),
            develop=False,
        )
        c_pkg = PackageVersion(
            name="c",
            version="==1.0.0",
            index=Source("https://pypi.org/simple"),
            develop=False,
        )
        packages = [a_pkg, c_pkg, b_pkg]

        sieve_context = SieveContext.from_package_versions(packages)
        # (a.name > b.name) - (a.name < b.name) is idiom for C-style like strcmp()
        sieve_context.sort_packages(lambda a, b: (a.name > b.name) -
                                    (a.name < b.name),
                                    reverse=True)
        assert list(
            sieve_context.iter_direct_dependencies()) == [c_pkg, b_pkg, a_pkg]

        sieve_context.sort_packages(lambda a, b: (a.name > b.name) -
                                    (a.name < b.name),
                                    reverse=False)
        result = list(sieve_context.iter_direct_dependencies())
        assert result == [a_pkg, b_pkg, c_pkg]

        # Now we sort based on version - as sorting is stable, we should preserve relative order of a and c.
        sieve_context.sort_packages(
            lambda a, b: (a.semantic_version > b.semantic_version) -
            (a.semantic_version < b.semantic_version),
            reverse=False,
        )
        result = list(sieve_context.iter_direct_dependencies())
        assert result == [a_pkg, c_pkg,
                          b_pkg], "Sorting of packages is not stable"

        sieve_context.sort_packages(
            lambda a, b: (a.semantic_version > b.semantic_version) -
            (a.semantic_version < b.semantic_version),
            reverse=True,
        )
        result = list(sieve_context.iter_direct_dependencies())
        assert result == [b_pkg, a_pkg,
                          c_pkg], "Sorting of packages is not stable"
    def test_no_observation_latest(self):
        """Test that we always end up with the latest version possible if no observations are found."""
        source = Source("https://pypi.org/simple")
        direct_dependencies = {
            ("tensorflow", "2.0.0", source.url):
            PackageVersion(
                name="tensorflow",
                version="==2.0.0",
                index=Source("https://pypi.org/simple"),
                develop=False,
            ),
            ("tensorflow", "1.9.0", source.url):
            PackageVersion(
                name="tensorflow",
                version="==1.9.0",
                index=Source("https://pypi.org/simple"),
                develop=False,
            ),
        }

        paths = {
            ("tensorflow", "1.9.0", "https://pypi.org/simple"): [
                (("tensorflow", "1.9.0", "https://pypi.org/simple"),
                 ("numpy", "1.0.0", "https://pypi.org/simple")),
                (("tensorflow", "1.9.0", "https://pypi.org/simple"),
                 ("numpy", "2.0.0", "https://pypi.org/simple")),
            ],
            ("tensorflow", "2.0.0", "https://pypi.org/simple"): [
                (("tensorflow", "2.0.0", "https://pypi.org/simple"),
                 ("numpy", "2.0.0", "https://pypi.org/simple")),
                (("tensorflow", "2.0.0", "https://pypi.org/simple"),
                 ("numpy", "1.0.0", "https://pypi.org/simple")),
            ],
        }

        step_context = StepContext.from_paths(direct_dependencies, paths=paths)

        observation_reduction = ObservationReduction(
            graph=None,
            project=None,
            library_usage=None,
        )

        observation_reduction.run(step_context)

        observation_reduced = step_context.dependency_graph_adaptation.to_scored_package_tuple_pairs(
        )
        assert set(observation_reduced) == {
            (0.0, (None, ('tensorflow', '2.0.0', 'https://pypi.org/simple'))),
            (0.0, (('tensorflow', '2.0.0', 'https://pypi.org/simple'),
                   ('numpy', '2.0.0', 'https://pypi.org/simple')))
        }
Пример #21
0
    def test_remove2(self):
        """Test removal of both, direct and transitive dependencies in one run."""
        direct_dependencies = {
            ("tensorflow", "2.0.0", "https://pypi.org/simple"):
            PackageVersion(
                name="tensorflow",
                version="==2.0.0",
                index=Source("https://pypi.org/simple"),
                develop=False,
            ),
            ("tensorflow", "1.9.0", "https://thoth-station.ninja/simple"):
            PackageVersion(
                name="tensorflow",
                version="==1.9.0",
                index=Source("https://thoth-station.ninja/simple"),
                develop=False,
            ),
        }

        paths = {
            ("tensorflow", "2.0.0", "https://pypi.org/simple"): [
                (("tensorflow", "2.0.0", "https://pypi.org/simple"),
                 ("numpy", "1.0.0", "https://pypi.org/simple")),
                (("tensorflow", "2.0.0", "https://pypi.org/simple"),
                 ("numpy", "2.0.0", "https://thoth-station.ninja/simple")),
            ],
            ("tensorflow", "1.9.0", "https://thoth-station.ninja/simple"): [
                (("tensorflow", "1.9.0", "https://thoth-station.ninja/simple"),
                 ("numpy", "2.0.0", "https://thoth-station.ninja/simple")),
                (("tensorflow", "1.9.0", "https://thoth-station.ninja/simple"),
                 ("numpy", "1.0.0", "https://pypi.org/simple")),
            ],
        }

        step_context = StepContext.from_paths(direct_dependencies, paths)

        project = Project.from_strings(self._CASE_PIPFILE)
        restrict_indexes = RestrictIndexes(
            graph=None,
            project=project,
            library_usage=None,
        )
        restrict_indexes.run(step_context)

        assert step_context.dependency_graph_adaptation.to_scored_package_tuple_pairs(
        ) == [(0.0, (None, ('tensorflow', '2.0.0',
                            'https://pypi.org/simple'))),
              (0.0, (('tensorflow', '2.0.0', 'https://pypi.org/simple'),
                     ('numpy', '1.0.0', 'https://pypi.org/simple')))]
        assert (len(list(step_context.iter_direct_dependencies())) == 1
                ), "Wrong number of direct dependencies"
Пример #22
0
    def test_run_develop_state_match(self, context: Context, state: State,
                                     develop: bool,
                                     state_develop: bool) -> None:
        """Test not running the prescription if develop flag is set also on the state match."""
        prescription_str = f"""
name: StepUnit
type: step
should_include:
  times: 1
  adviser_pipeline: true
match:
  package_version:
    name: numpy
    develop: {'true' if develop else 'false'}
  state:
    resolved_dependencies:
    - name: pytest
      develop: {'true' if state_develop else 'false'}
run:
  score: 0.5
"""
        prescription = yaml.safe_load(prescription_str)
        PRESCRIPTION_STEP_SCHEMA(prescription)
        StepPrescription.set_prescription(prescription)
        package_version = PackageVersion(
            name="numpy",
            version="==1.19.1",
            index=Source("https://pypi.org/simple"),
            develop=develop,
        )

        state_package_version = PackageVersion(
            name="pytest",
            version="==6.2.4",
            index=Source("https://pypi.org/simple"),
            develop=state_develop,
        )
        state.add_resolved_dependency(state_package_version.to_tuple())
        context.register_package_version(state_package_version)

        unit = StepPrescription()
        unit.pre_run()
        with unit.assigned_context(context):
            result = unit.run(state, package_version)

        assert isinstance(result, tuple)
        assert result[0] == 0.5
        assert result[1] is None
Пример #23
0
    def test_run_noop(self, context: Context, tf_versions: List[str]) -> None:
        """Test not adding a pseudonym for TensorFlow if no alternative releases found."""
        unit = self.UNIT_TESTED()

        package_version = PackageVersion(
            name=unit.configuration["package_name"],
            version="==1.0.0",
            develop=False,
            index=Source("https://pypi.org/simple"),
        )

        context.graph.should_receive(
            "get_solved_python_package_versions_all"
        ).with_args(
            package_name="tensorflow-gpu",
            package_version=None,
            index_url="https://pypi.org/simple",
            count=None,
            os_name=context.project.runtime_environment.operating_system.name,
            os_version=context.project.runtime_environment.operating_system.
            version,
            python_version=context.project.runtime_environment.python_version,
            distinct=True,
            is_missing=False,
        ).and_return(tf_versions).once()

        with unit.assigned_context(context):
            unit.pre_run()
            assert list(unit.run(package_version)) == []
Пример #24
0
    def test_indexes_in_meta(self):
        """Check indexes being adjusted when inserting a new package."""
        package_version = PackageVersion(
            name="tensorflow",
            version="==1.9.0",
            develop=False,
            index=Source(
                "http://tensorflow.pypi.thoth-station.ninja/index/fedora28/jemalloc/simple/tensorflow/"
            ),
        )

        project = Project.from_package_versions([package_version])

        project_dict = project.to_dict()
        pipfile_dict = project_dict["requirements"]
        pipfile_lock_dict = project_dict["requirements_locked"]

        assert pipfile_lock_dict is None

        assert len(pipfile_dict["source"]) == 1
        assert pipfile_dict["source"] == [{
            "url":
            "http://tensorflow.pypi.thoth-station.ninja/index/fedora28/jemalloc/simple/tensorflow/",
            "verify_ssl":
            True,
            "name":
            "tensorflow-pypi-thoth-station-ninja",
        }]
Пример #25
0
    def test_sieve_multiple(self, context: Context) -> None:
        """Test proper implementation of the filtering mechanism."""
        context.project.runtime_environment.python_version = "3.9"
        source = Source("https://pypi.org/simple")
        pv_1 = PackageVersion(
            name="tensorflow-gpu",
            version="==1.12.0",
            develop=False,
            index=source,
        )
        pv_2 = PackageVersion(
            name="tensorflow",
            version="==2.0.0",
            develop=False,
            index=source,
        )
        pv_3 = PackageVersion(
            name="intel-tensorflow",
            version="==1.13.0",
            develop=False,
            index=source,
        )

        unit = self.UNIT_TESTED()
        with unit.assigned_context(context):
            unit.pre_run()
            result = list(unit.run((pv for pv in (pv_1, pv_2, pv_3))))
            assert len(result) == 0
Пример #26
0
    def test_no_remove(self):
        """Make sure packages which are not toolchain do not get removed."""
        direct_dependencies = {
            ("goblinoid", "1.0.0", "https://pypi.org/simple"): PackageVersion(
                name="goblinoid",
                version="==1.0.0",
                index=Source("https://pypi.org/simple"),
                develop=False,
            )
        }

        paths = {
            ("goblinoid", "1.0.0", "https://pypi.org/simple"): [
                (("goblinoid", "1.0.0", "https://pypi.org/simple"),
                 ("foo", "1.0.0", "https://pypi.org/simple")),
            ]
        }

        step_context = StepContext.from_paths(direct_dependencies, paths)

        cut_toolchain = CutToolchain(
            graph=None,
            project=None,
            library_usage=None,
        )
        cut_toolchain.run(step_context)

        assert step_context.dependency_graph_adaptation.to_scored_package_tuple_pairs() == [
            (0.0, (None, ('goblinoid', '1.0.0', 'https://pypi.org/simple'))),
            (0.0, (('goblinoid', '1.0.0', 'https://pypi.org/simple'),
                   ('foo', '1.0.0', 'https://pypi.org/simple'))),
        ]
Пример #27
0
    def test_run(self, state: State, context: Context) -> None:
        """Test running this wrap."""
        state = State()
        assert not state.justification

        state.resolved_dependencies["tensorflow"] = ("tensorflow", "2.3.0",
                                                     "https://pypi.org/simple")
        unit = self.UNIT_TESTED()

        tf_package_version = PackageVersion(
            name="tensorflow",
            version="==2.3.0",
            index=Source("https://pypi.org/simple"),
            develop=False,
        )

        context.register_package_version(tf_package_version)

        with unit.assigned_context(context):
            unit.run(state)

        assert len(state.justification) == 1
        assert set(
            state.justification[0].keys()) == {"type", "message", "link"}
        assert state.justification[0][
            "link"], "Empty link to justification document provided"
        assert state.justification[0]["type"] == "WARNING"
        assert (
            state.justification[0]["message"] ==
            "TensorFlow in version <=2.4 is slow when tf.keras.layers.Embedding is used"
        )
Пример #28
0
    def test_pre_releases_disallowed_removal(self, context: Context,
                                             package_name: str,
                                             package_version: str) -> None:
        """Test no removals if pre-releases are allowed."""
        pv = PackageVersion(
            name=package_name,
            version=f"=={package_version}",
            index=Source("https://pypi.org/simple"),
            develop=False,
        )

        project = Project.from_strings(self._CASE_GLOBAL_DISALLOWED_PIPFILE)
        context.project = project
        sieve = self.UNIT_TESTED()
        sieve.update_configuration({
            "package_name":
            None,
            "allow_prereleases":
            project.pipfile.thoth.allow_prereleases
        })

        assert not context.stack_info
        with self.UNIT_TESTED.assigned_context(context):
            assert list(sieve.run(p for p in [pv])) == []

        assert len(context.stack_info) == 1
        assert self.verify_justification_schema(context.stack_info)
Пример #29
0
    def test_remove_pre_releases_disallowed_noop(self, context: Context,
                                                 package_name: str,
                                                 package_version: str) -> None:
        """Test NOT removing dependencies based on pre-release configuration."""
        pv = PackageVersion(
            name=package_name,
            version=f"=={package_version}",
            index=Source("https://pypi.org/simple"),
            develop=False,
        )

        project = Project.from_strings(self._CASE_GLOBAL_DISALLOWED_PIPFILE)
        context.project = project
        sieve = self.UNIT_TESTED()
        sieve.update_configuration({
            "package_name":
            None,
            "allow_prereleases":
            project.pipfile.thoth.allow_prereleases
        })

        assert not context.stack_info
        with self.UNIT_TESTED.assigned_context(context):
            assert list(sieve.run(p for p in [pv])) == [pv]

        assert not context.stack_info, "No stack information should be provided"
Пример #30
0
    def test_add_package_develop(self):
        """Test add package develop."""
        pipfile = Pipfile.from_file(
            os.path.join(self.data_dir, "pipfiles", "Pipfile_test1"))
        pipfile_lock = PipfileLock.from_file(
            os.path.join(self.data_dir, "pipfiles", "Pipfile_test1.lock"))
        project = Project(pipfile=pipfile, pipfile_lock=pipfile_lock)

        source = Source(name="foo",
                        url="https://foo.bar",
                        verify_ssl=True,
                        warehouse=False)

        assert "selinon" not in project.pipfile.dev_packages.packages

        with pytest.raises(InternalError):
            # Trying to add package with source but source is not present in the meta.
            project.add_package("selinon",
                                "==1.0.0",
                                develop=True,
                                source=source)

        source = project.add_source(url="https://foo.bar")
        project.add_package("selinon", "==1.0.0", develop=True, source=source)

        assert "selinon" in project.pipfile.dev_packages.packages
        assert project.pipfile.dev_packages["selinon"].version == "==1.0.0"
        assert project.pipfile.dev_packages["selinon"].index.name == "foo-bar"
        assert project.pipfile.dev_packages["selinon"].develop is True
        # Do not add the package to the lock - lock has to be explicitly done.
        assert "selinon" not in project.pipfile_lock.dev_packages.packages