Exemplo n.º 1
0
    def test_run_package_version_from_with_resolved(
        self,
        context: Context,
        state: State,
        package_version_from_version: str,
        package_version_from_index: str,
        package_version_from_develop: str,
        resolved_version: str,
        resolved_index: str,
        resolved_develop: str,
        add_resolved: bool,
        pipeline_run: bool,
    ) -> None:
        """Test running the add package unit."""
        prescription_str = f"""
name: AddPackageStep
type: step.AddPackage
should_include:
  times: 1
  adviser_pipeline: true
match:
  package_version:
    name: numpy
  state:
    package_version_from:
    - name: scikit-learn
      version: "{package_version_from_version}"
      develop: {package_version_from_develop}
      index_url: {package_version_from_index}
    resolved_dependencies:
    - name: click
      version: "{resolved_version}"
      develop: {resolved_develop}
      index_url: {resolved_index}
run:
  package_version:
    name: daiquiri
    locked_version: ==2.0.0
    index_url: https://pypi.org/simple
    develop: true
  stack_info:
    - type: INFO
      message: "Hello, Thoth!"
      link: https://thoth-station.ninja
"""
        prescription = yaml.safe_load(prescription_str)
        PRESCRIPTION_ADD_PACKAGE_STEP_SCHEMA(prescription)
        AddPackageStepPrescription.set_prescription(prescription)

        pypi = Source("https://pypi.org/simple")
        package_version = PackageVersion(
            name="numpy",
            version="==1.19.1",
            index=pypi,
            develop=False,
        )

        package_version_from = PackageVersion(
            name="scikit-learn",
            version="==0.24.2",
            index=pypi,
            develop=False,
        )

        package_version_resolved = PackageVersion(
            name="click",
            version="==8.0.0",
            index=pypi,
            develop=False,
        )

        assert "dauiqiri" not in state.resolved_dependencies

        state.add_resolved_dependency(package_version_from.to_tuple())
        context.register_package_version(package_version_from)

        if add_resolved:
            state.add_resolved_dependency(package_version_resolved.to_tuple())
            context.register_package_version(package_version_resolved)

        runtime_env = context.project.runtime_environment
        runtime_env.operating_system.name = "rhel"
        runtime_env.operating_system.version = "8"
        runtime_env.python_version = "3.8"

        context.register_package_tuple(
            package_version.to_tuple(),
            dependent_tuple=package_version_from.to_tuple(),
            develop=False,
            extras=None,
            os_name=runtime_env.operating_system.name,
            os_version=runtime_env.operating_system.version,
            python_version=runtime_env.python_version,
        )

        pv_tuple = ("daiquiri", "2.0.0", "https://pypi.org/simple")

        if pipeline_run:
            context.graph.should_receive(
                "python_package_version_exists").with_args(
                    *pv_tuple,
                    solver_name="solver-rhel-8-py38").and_return(True).once()
            context.graph.should_receive(
                "is_python_package_index_enabled").with_args(
                    "https://pypi.org/simple").and_return(True).once()

        unit = AddPackageStepPrescription()
        unit.pre_run()
        with unit.assigned_context(context):
            assert unit.run(state, package_version) is None

        if pipeline_run:
            assert "daiquiri" in state.unresolved_dependencies
            assert set(
                state.unresolved_dependencies.get("daiquiri").values()) == {
                    pv_tuple
                }
            pv = context.get_package_version(pv_tuple, graceful=True)
            assert pv is not None
            assert pv.to_tuple() == pv_tuple
            assert pv.develop is True
        else:
            assert "daiquiri" not in state.unresolved_dependencies
            assert state.unresolved_dependencies.get("daiquiri") is None
Exemplo n.º 2
0
    def test_run_package_version_already_resolved_same_name(
            self, context: Context, state: State) -> None:
        """Test running the prescription when the given package is already in the resolved state (same name)."""
        prescription_str = """
name: AddPackageStep
type: step.AddPackage
should_include:
  times: 1
  adviser_pipeline: true
match:
  package_version:
    name: numpy
    version: "~=1.19.0"
  state:
    package_version_from:
    - name: scikit-learn
      version: "<=0.25.0"
      develop: false
      index_url: "https://pypi.org/simple"
    resolved_dependencies:
    - name: click
      version: "==8.0.0"
      develop: false
      index_url: https://pypi.org/simple
run:
  package_version:
    name: daiquiri
    locked_version: ==2.0.0
    index_url: https://pypi.org/simple
    develop: true
  stack_info:
    - type: INFO
      message: "Hello, Thoth!"
      link: https://thoth-station.ninja
"""
        prescription = yaml.safe_load(prescription_str)
        PRESCRIPTION_ADD_PACKAGE_STEP_SCHEMA(prescription)
        AddPackageStepPrescription.set_prescription(prescription)

        pypi = Source("https://pypi.org/simple")
        package_version = PackageVersion(
            name="numpy",
            version="==1.19.1",
            index=pypi,
            develop=False,
        )

        package_version_from = PackageVersion(
            name="scikit-learn",
            version="==0.24.2",
            index=pypi,
            develop=False,
        )

        package_version_resolved = PackageVersion(
            name="click",
            version="==8.0.0",
            index=pypi,
            develop=False,
        )

        pv_daiquiri = PackageVersion(
            name="daiquiri",
            version="==2.5.0",
            index=pypi,
            develop=False,
        )

        pv_tuple = ("daiquiri", "2.5.0", "https://pypi.org/simple")

        state.add_resolved_dependency(pv_tuple)
        context.register_package_version(pv_daiquiri)

        state.add_resolved_dependency(package_version_from.to_tuple())
        context.register_package_version(package_version_from)

        state.add_resolved_dependency(package_version_resolved.to_tuple())
        context.register_package_version(package_version_resolved)

        runtime_env = context.project.runtime_environment
        runtime_env.operating_system.name = "rhel"
        runtime_env.operating_system.version = "8"
        runtime_env.python_version = "3.8"

        context.register_package_tuple(
            package_version.to_tuple(),
            dependent_tuple=package_version_from.to_tuple(),
            develop=False,
            extras=None,
            os_name=runtime_env.operating_system.name,
            os_version=runtime_env.operating_system.version,
            python_version=runtime_env.python_version,
        )

        unit = AddPackageStepPrescription()
        unit.pre_run()
        with unit.assigned_context(context):
            assert unit.run(state, package_version) is None

        assert "daiquiri" not in state.unresolved_dependencies
        assert "daiquiri" in state.resolved_dependencies
        assert set(state.resolved_dependencies["daiquiri"]) == set(pv_tuple)
Exemplo n.º 3
0
    def test_run_package_version_add_package_multi(self, context: Context,
                                                   state: State) -> None:
        """Test running the unit multiple times with stack info and justification reported once."""
        prescription_str = """
name: AddPackageStep
type: step.AddPackage
should_include:
  adviser_pipeline: true
match:
  package_version:
    name: numpy
run:
  package_version:
    name: daiquiri
    locked_version: ==2.0.0
    index_url: https://pypi.org/simple
    develop: true
  stack_info:
  - type: INFO
    message: "Hello, Thoth!"
    link: https://thoth-station.ninja
"""
        prescription = yaml.safe_load(prescription_str)
        PRESCRIPTION_ADD_PACKAGE_STEP_SCHEMA(prescription)
        AddPackageStepPrescription.set_prescription(prescription)

        pypi = Source("https://pypi.org/simple")
        package_version_np = PackageVersion(
            name="numpy",
            version="==1.19.1",
            index=pypi,
            develop=False,
        )

        context.stack_info.clear()

        context.graph.should_receive(
            "python_package_version_exists").with_args(
                "daiquiri",
                "2.0.0",
                "https://pypi.org/simple",
                solver_name="solver-rhel-8-py38").and_return(True).once()
        context.graph.should_receive(
            "is_python_package_index_enabled").with_args(
                "https://pypi.org/simple").and_return(True).once()

        state.resolved_dependencies.clear()

        runtime_env = context.project.runtime_environment
        runtime_env.operating_system.name = "rhel"
        runtime_env.operating_system.version = "8"
        runtime_env.python_version = "3.8"

        unit = AddPackageStepPrescription()
        unit.pre_run()
        with unit.assigned_context(context):
            assert unit.run(state, package_version_np) is None

        assert "daiquiri" in state.unresolved_dependencies
        assert set(state.unresolved_dependencies["daiquiri"].values()) == {
            ("daiquiri", "2.0.0", "https://pypi.org/simple")
        }

        assert context.stack_info == [{
            "type": "INFO",
            "message": "Hello, Thoth!",
            "link": "https://thoth-station.ninja"
        }]

        package_version_np2 = PackageVersion(
            name="numpy",
            version="==2.0.0",
            index=pypi,
            develop=False,
        )

        context.graph.should_receive(
            "python_package_version_exists").with_args(
                "daiquiri",
                "2.0.0",
                "https://pypi.org/simple",
                solver_name="solver-rhel-8-py38").and_return(True).once()
        context.graph.should_receive(
            "is_python_package_index_enabled").with_args(
                "https://pypi.org/simple").and_return(True).once()

        state.resolved_dependencies.clear()

        runtime_env = context.project.runtime_environment
        runtime_env.operating_system.name = "rhel"
        runtime_env.operating_system.version = "8"
        runtime_env.python_version = "3.8"

        with unit.assigned_context(context):
            assert unit.run(state, package_version_np2) is None

        assert set(state.unresolved_dependencies["daiquiri"].values()) == {
            ("daiquiri", "2.0.0", "https://pypi.org/simple")
        }
        assert context.stack_info == [{
            "type": "INFO",
            "message": "Hello, Thoth!",
            "link": "https://thoth-station.ninja"
        }]
Exemplo n.º 4
0
    def test_run_package_version_index_url_not_known(self, context: Context,
                                                     state: State) -> None:
        """Test running the prescription based on the dependency introduced when index_url is not known."""
        prescription_str = """
name: AddPackageStep
type: step.AddPackage
should_include:
  times: 1
  adviser_pipeline: true
match:
  package_version:
    name: numpy
    version: "~=1.19.0"
  state:
    package_version_from:
    - name: scikit-learn
      version: "<=0.25.0"
      develop: false
      index_url: "https://pypi.org/simple"
    resolved_dependencies:
    - name: click
      version: "==8.0.0"
      develop: false
      index_url: https://pypi.org/simple
run:
  package_version:
    name: daiquiri
    locked_version: ==2.0.0
    index_url: https://pypi.org/simple
    develop: true
  stack_info:
    - type: INFO
      message: "Hello, Thoth!"
      link: https://thoth-station.ninja
"""
        prescription = yaml.safe_load(prescription_str)
        PRESCRIPTION_ADD_PACKAGE_STEP_SCHEMA(prescription)
        AddPackageStepPrescription.set_prescription(prescription)

        pypi = Source("https://pypi.org/simple")
        package_version = PackageVersion(
            name="numpy",
            version="==1.19.1",
            index=pypi,
            develop=False,
        )

        package_version_from = PackageVersion(
            name="scikit-learn",
            version="==0.24.2",
            index=pypi,
            develop=False,
        )

        package_version_resolved = PackageVersion(
            name="click",
            version="==8.0.0",
            index=pypi,
            develop=False,
        )

        assert "dauiqiri" not in state.resolved_dependencies

        state.add_resolved_dependency(package_version_from.to_tuple())
        context.register_package_version(package_version_from)

        state.add_resolved_dependency(package_version_resolved.to_tuple())
        context.register_package_version(package_version_resolved)

        runtime_env = context.project.runtime_environment
        runtime_env.operating_system.name = "rhel"
        runtime_env.operating_system.version = "8"
        runtime_env.python_version = "3.8"

        context.register_package_tuple(
            package_version.to_tuple(),
            dependent_tuple=package_version_from.to_tuple(),
            develop=False,
            extras=None,
            os_name=runtime_env.operating_system.name,
            os_version=runtime_env.operating_system.version,
            python_version=runtime_env.python_version,
        )

        pv_tuple = ("daiquiri", "2.0.0", "https://pypi.org/simple")

        context.graph.should_receive(
            "python_package_version_exists").with_args(
                *pv_tuple,
                solver_name="solver-rhel-8-py38").and_return(True).once()
        context.graph.should_receive(
            "is_python_package_index_enabled").with_args(
                "https://pypi.org/simple").and_raise(NotFoundError).once()

        unit = AddPackageStepPrescription()
        unit.pre_run()
        with unit.assigned_context(context):
            assert unit.run(state, package_version) is None

        assert "daiquiri" not in state.unresolved_dependencies
        assert state.unresolved_dependencies.get("daiquiri") is None