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
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)
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
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)))) == []
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
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)
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]
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
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)
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
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
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
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
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
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
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, ), ]
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
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'))) }
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"
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
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)) == []
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", }]
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
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'))), ]
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" )
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)
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"
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