def get_registrable_entities( ctx: flyte_context.FlyteContext, options: typing.Optional[Options] = None ) -> typing.List[RegistrableEntity]: """ Returns all entities that can be serialized and should be sent over to Flyte backend. This will filter any entities that are not known to Admin """ new_api_serializable_entities = OrderedDict() # TODO: Clean up the copy() - it's here because we call get_default_launch_plan, which may create a LaunchPlan # object, which gets added to the FlyteEntities.entities list, which we're iterating over. for entity in flyte_context.FlyteEntities.entities.copy(): if isinstance(entity, PythonTask) or isinstance( entity, WorkflowBase) or isinstance(entity, LaunchPlan): get_serializable(new_api_serializable_entities, ctx.serialization_settings, entity, options=options) if isinstance(entity, WorkflowBase): lp = LaunchPlan.get_default_launch_plan(ctx, entity) get_serializable(new_api_serializable_entities, ctx.serialization_settings, lp, options) new_api_model_values = list(new_api_serializable_entities.values()) entities_to_be_serialized = list( filter(_should_register_with_admin, new_api_model_values)) serializable_tasks: typing.List[task_models.TaskSpec] = [ entity for entity in entities_to_be_serialized if isinstance(entity, task_models.TaskSpec) ] # Detect if any of the tasks is duplicated. Duplicate tasks are defined as having the same # metadata identifiers (see :py:class:`flytekit.common.core.identifier.Identifier`). Duplicate # tasks are considered invalid at registration # time and usually indicate user error, so we catch this common mistake at serialization time. duplicate_tasks = _find_duplicate_tasks(serializable_tasks) if len(duplicate_tasks) > 0: duplicate_task_names = [ task.template.id.name for task in duplicate_tasks ] raise FlyteValidationException( f"Multiple definitions of the following tasks were found: {duplicate_task_names}" ) return [v.to_flyte_idl() for v in entities_to_be_serialized]
y=alt.Y('new_cases_smoothed_per_million:Q', stack=None), color=alt.Color('continent:N', scale=alt.Scale(scheme='set1')), tooltip='continent:N').interactive().properties(width='container') dp.Report(dp.Plot(plot), dp.DataTable(df)).save(path='report.html',open=True) @task def transform_data(url: str) -> pandas.DataFrame: dataset = pd.read_csv(url) df = dataset.groupby( ['continent', 'date'])['new_cases_smoothed_per_million'].mean().reset_index() return df @workflow def datapane_workflow(url: str): df = transform_data(url=url) publish_report(df=df) print(f"Report is published for {url}") default_lp = LaunchPlan.get_default_launch_plan( current_context(), datapane_workflow) if __name__ == "__main__": print(default_lp(url="https://covid.ourworldindata.org/data/owid-covid-data.csv"))
from flytekit import task, LaunchPlan, workflow, current_context @task def square(val: int) -> int: return val * val @workflow def my_wf(val: int) -> int: result = square(val=val) return result default_lp = LaunchPlan.get_default_launch_plan(current_context(), my_wf) square_3 = default_lp(val=3) # %% # The following shows how to specify a user-defined launch plan that defaults the value of 'val' to 4. my_lp = LaunchPlan.create("default_4_lp", my_wf, default_inputs={"val": 4}) square_4 = my_lp() square_5 = my_lp(val=5) # %% # In some cases you may want to **fix** launch plan inputs, such that they can't be overridden at execution call time. my_fixed_lp = LaunchPlan.create("always_2_lp", my_wf, fixed_inputs={"val": 4}) square_2 = my_fixed_lp() # error: # square_1 = my_fixed_lp(val=1)