Source code for ml_orchestrator.comp_parser

"""Module for parsing ML components into Kubeflow Pipeline components.

This module provides a ComponentParser class that extends FunctionParser to create
and manage components for Kubeflow Pipelines (KFP), handling decorators and
serialized representations.
"""

import dataclasses
from typing import List

from ml_orchestrator.comp_protocol.func_parser import FunctionParser
from ml_orchestrator.env_params import EnvironmentParams
from ml_orchestrator.meta_comp import MetaComponent, _MetaComponent


[docs] @dataclasses.dataclass class ComponentParser(FunctionParser): """A parser class that extends FunctionParser to create and manage components. This class handles components for Kubeflow pipelines (KFP), including decorators and serialized representations. Attributes: add_imports (List[str]): Additional import statements to prepend to output files. only_function (bool): Whether to generate only the function body. """ add_imports: List[str] = dataclasses.field(default_factory=lambda: []) only_function: bool = False @classmethod def _create_decorator(cls, env: EnvironmentParams) -> str: """Create a component decorator string based on environment parameters. Args: env (EnvironmentParams): The environment parameters object containing variable definitions. Returns: str: A formatted string representing the component decorator. """ dec_vars = env.comp_vars() prams = cls.get_func_params(dec_vars, with_typing=False) override_params = cls._get_decorator_override_params(prams) dec_scope = "(\n\t" + ",\n\t".join(override_params) + "\n)" dec_scope = cls.convert_to_format_str(dec_scope) func_definition = f"@component{dec_scope}" return func_definition
[docs] @classmethod def create_decorator(cls, component: MetaComponent) -> str: """Create a decorator string for a given MetaComponent. Args: component (MetaComponent): The component object used to generate a decorator. Returns: str: A decorator string for use in Kubeflow components. """ if isinstance(component, MetaComponent): return cls._create_decorator(component.env) return cls._create_decorator(component.env())
def _create_kfp_str(self, component: _MetaComponent) -> str: # type: ignore """Generate a serialized Kubeflow Pipeline (KFP) component string. Args: component (_MetaComponent): The component object to serialize. Returns: str: A string representation of the KFP component, including decorators. """ function_str = super()._create_kfp_str(component) # type: ignore if self.only_function: return function_str decorator_str = self.create_decorator(component) # type: ignore decorator_str = decorator_str.replace(" = ", "=") kfp_component_str = f"{decorator_str}\n{function_str}" kfp_component_str = kfp_component_str.replace("\t", " ") return kfp_component_str + "\n" def _write_to_file(self, filename: str, file_content: str) -> None: """Write component string content to a file, including additional imports. Args: filename (str): The name of the file to write to. file_content (str): The content to write to the file. Returns: None """ for imp in self.add_imports: file_content = f"{imp}\n{file_content}" return super()._write_to_file(filename, file_content)