Example #1
0
def test_parameters_and_defaults():
    ctx = context_manager.FlyteContext.current_context()

    def z(a: int, b: str) -> typing.Tuple[int, str]:
        ...

    our_interface = transform_signature_to_interface(inspect.signature(z))
    params = transform_inputs_to_parameters(ctx, our_interface)
    assert params.parameters["a"].required
    assert params.parameters["a"].default is None
    assert params.parameters["b"].required
    assert params.parameters["b"].default is None

    def z(a: int, b: str = "hello") -> typing.Tuple[int, str]:
        ...

    our_interface = transform_signature_to_interface(inspect.signature(z))
    params = transform_inputs_to_parameters(ctx, our_interface)
    assert params.parameters["a"].required
    assert params.parameters["a"].default is None
    assert not params.parameters["b"].required
    assert params.parameters[
        "b"].default.scalar.primitive.string_value == "hello"

    def z(a: int = 7, b: str = "eleven") -> typing.Tuple[int, str]:
        ...

    our_interface = transform_signature_to_interface(inspect.signature(z))
    params = transform_inputs_to_parameters(ctx, our_interface)
    assert not params.parameters["a"].required
    assert params.parameters["a"].default.scalar.primitive.integer == 7
    assert not params.parameters["b"].required
    assert params.parameters[
        "b"].default.scalar.primitive.string_value == "eleven"
 def __init__(
     self,
     task_config: T,
     task_function: Callable,
     task_type="python-task",
     ignore_input_vars: Optional[List[str]] = None,
     execution_mode: Optional[ExecutionBehavior] = ExecutionBehavior.DEFAULT,
     **kwargs,
 ):
     """
     :param task_config: Configuration object for Task. Should be a unique type for that specific Task
     :param task_function: Python function that has type annotations and works for the task
     :param ignore_input_vars: When supplied, these input variables will be removed from the interface. This
                               can be used to inject some client side variables only. Prefer using ExecutionParams
     :param task_type: String task type to be associated with this Task
     """
     if task_function is None:
         raise ValueError("TaskFunction is a required parameter for PythonFunctionTask")
     if not istestfunction(func=task_function) and isnested(func=task_function):
         raise ValueError(
             "TaskFunction cannot be a nested/inner or local function. "
             "It should be accessible at a module level for Flyte to execute it. Test modules with "
             "names begining with `test_` are allowed to have nested tasks"
         )
     self._native_interface = transform_signature_to_interface(inspect.signature(task_function))
     mutated_interface = self._native_interface.remove_inputs(ignore_input_vars)
     super().__init__(
         task_type=task_type,
         name=f"{task_function.__module__}.{task_function.__name__}",
         interface=mutated_interface,
         task_config=task_config,
         **kwargs,
     )
     self._task_function = task_function
     self._execution_mode = execution_mode
Example #3
0
    def __init__(
        self,
        workflow_function: Callable,
        metadata: Optional[WorkflowMetadata],
        default_metadata: Optional[WorkflowMetadataDefaults],
    ):
        name = f"{workflow_function.__module__}.{workflow_function.__name__}"
        self._workflow_function = workflow_function
        native_interface = transform_signature_to_interface(inspect.signature(workflow_function))

        # TODO do we need this - can this not be in launchplan only?
        #    This can be in launch plan only, but is here only so that we don't have to re-evaluate. Or
        #    we can re-evaluate.
        self._input_parameters = None
        super().__init__(
            name=name,
            workflow_metadata=metadata,
            workflow_metadata_defaults=default_metadata,
            python_interface=native_interface,
        )
Example #4
0
    def __init__(
        self,
        workflow_function: Callable,
        metadata: Optional[WorkflowMetadata],
        default_metadata: Optional[WorkflowMetadataDefaults],
    ):
        self._name = f"{workflow_function.__module__}.{workflow_function.__name__}"
        self._workflow_function = workflow_function
        self._native_interface = transform_signature_to_interface(
            inspect.signature(workflow_function))
        self._interface = transform_interface_to_typed_interface(
            self._native_interface)
        # These will get populated on compile only
        self._nodes = None
        self._output_bindings: Optional[List[_literal_models.Binding]] = None
        self._workflow_metadata = metadata
        self._workflow_metadata_defaults = default_metadata

        # TODO do we need this - can this not be in launchplan only?
        #    This can be in launch plan only, but is here only so that we don't have to re-evaluate. Or
        #    we can re-evaluate.
        self._input_parameters = None
        FlyteEntities.entities.append(self)
Example #5
0
 def wrapper(fn) -> ReferenceTask:
     interface = transform_signature_to_interface(inspect.signature(fn))
     return ReferenceTask(project, domain, name, version, interface.inputs,
                          interface.outputs)