# --------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # --------------------------------------------------------- # pylint: disable=protected-access from typing import Any, Callable, List, Mapping from azure.ai.ml.dsl._dynamic import KwParameter, create_kw_function_from_parameters from azure.ai.ml.entities import Component as ComponentEntity from azure.ai.ml.entities._builders import Command from azure.ai.ml.entities._component.datatransfer_component import DataTransferImportComponent def get_dynamic_input_parameter(inputs: Mapping) -> List: """Return the dynamic parameter of the definition's input ports. :param inputs: The mapping of input names to input objects. :type inputs: Mapping :return: The list of dynamic parameters. :rtype: List[~azure.ai.ml.dsl._dynamic.KwParameter] """ return [ KwParameter( name=name, annotation=input._get_python_builtin_type_str(), default=None, _type=input._get_python_builtin_type_str(), ) for name, input in inputs.items() ] def get_dynamic_source_parameter(source: Any) -> List: """Return the dynamic parameter of the definition's source port. :param source: The source object. :type source: Any :return: The list of dynamic parameters. :rtype: List[~azure.ai.ml.dsl._dynamic.KwParameter] """ return [ KwParameter( name="source", annotation=source.type, default=None, _type=source.type, ) ] def to_component_func(entity: ComponentEntity, component_creation_func: Callable) -> Callable[..., Command]: """Convert a ComponentEntity to a callable component function. :param entity: The ComponentEntity to convert. :type entity: ~azure.ai.ml.entities.Component :param component_creation_func: The function for creating a component. :type component_creation_func: Callable :return: The callable component function. :rtype: Callable[..., ~azure.ai.ml.entities._builders.Command] """ func_name = "[component] {}".format(entity.display_name) func_docstring_lines = [] if entity.description is not None: func_docstring_lines.append(entity.description.strip()) if isinstance(entity, DataTransferImportComponent): all_params = get_dynamic_source_parameter(entity.source) else: all_params = get_dynamic_input_parameter(entity.inputs) flattened_group_keys = [] # Flatten all group parameters, for function parameter validation. from azure.ai.ml.entities._inputs_outputs import GroupInput for name, item in entity.inputs.items(): if isinstance(item, GroupInput): flattened_group_keys.extend(list(item.flatten(group_parameter_name=name).keys())) doc_string = entity.description # Try add yaml to doc string try: yaml_str = entity._yaml_str if entity._yaml_str else entity._to_yaml() doc_string = "{0}\n\nComponent yaml:\n```yaml\n{1}\n```".format(doc_string, yaml_str) except Exception: # pylint: disable=W0718 pass params_assignment_str = ", ".join([f"{param.name}=xxx" for param in all_params]) example = f"component_func({params_assignment_str})" dynamic_func = create_kw_function_from_parameters( component_creation_func, documentation=str(doc_string), parameters=all_params, func_name=func_name, flattened_group_keys=flattened_group_keys, ) # Bug Item number: 2883188 dynamic_func._func_calling_example = example # type: ignore dynamic_func._has_parameters = bool(all_params) # type: ignore return dynamic_func