Skip to content

task_collection

TaskCollectCustomV2

Bases: BaseModel

Attributes:

Name Type Description
manifest ManifestV2

Manifest of a Fractal task package (this is typically the content of __FRACTAL_MANIFEST__.json).

python_interpreter str

Absolute path to the Python interpreter to be used for running tasks.

name str

A name identifying this package, that will fill the TaskGroupV2.pkg_name column.

package_root Optional[str]

The folder where the package is installed. If not provided, it will be extracted via pip show (requires package_name to be set).

package_name Optional[str]

Name of the package, as used for import <package_name>; this is then used to extract the package directory (package_root) via pip show <package_name>.

version Optional[str]

Optional version of tasks to be collected.

Source code in fractal_server/app/schemas/v2/task_collection.py
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
class TaskCollectCustomV2(BaseModel):
    """
    Attributes:
        manifest: Manifest of a Fractal task package (this is typically the
            content of `__FRACTAL_MANIFEST__.json`).
        python_interpreter: Absolute path to the Python interpreter to be used
            for running tasks.
        name: A name identifying this package, that will fill the
            `TaskGroupV2.pkg_name` column.
        package_root: The folder where the package is installed.
            If not provided, it will be extracted via `pip show`
            (requires `package_name` to be set).
        package_name: Name of the package, as used for `import <package_name>`;
            this is then used to extract the package directory (`package_root`)
            via `pip show <package_name>`.
        version: Optional version of tasks to be collected.
    """

    model_config = ConfigDict(extra="forbid")
    manifest: ManifestV2
    python_interpreter: str
    label: str
    package_root: Optional[str] = None
    package_name: Optional[str] = None
    version: Optional[str] = None

    # Valstr
    _python_interpreter = field_validator("python_interpreter")(
        classmethod(valstr("python_interpreter"))
    )
    _label = field_validator("label")(classmethod(valstr("label")))
    _package_root = field_validator("package_root")(
        classmethod(valstr("package_root", accept_none=True))
    )
    _package_name = field_validator("package_name")(
        classmethod(valstr("package_name", accept_none=True))
    )
    _version = field_validator("version")(
        classmethod(valstr("version", accept_none=True))
    )

    @model_validator(mode="before")
    @classmethod
    def one_of_package_root_or_name(cls, values):
        package_root = values.get("package_root")
        package_name = values.get("package_name")
        if (package_root is None and package_name is None) or (
            package_root is not None and package_name is not None
        ):
            raise ValueError(
                "One and only one must be set between "
                "'package_root' and 'package_name'"
            )
        return values

    @field_validator("package_name")
    @classmethod
    def package_name_validator(cls, value: str):
        """
        Remove all whitespace characters, then check for invalid code.
        """
        if value is not None:
            validate_cmd(value)
            value = valstr("package_name")(cls, value)
            value = value.replace(" ", "")
        return value

    @field_validator("package_root")
    @classmethod
    def package_root_validator(cls, value):
        if (value is not None) and (not Path(value).is_absolute()):
            raise ValueError(
                f"'package_root' must be an absolute path: (given {value})."
            )
        return value

    @field_validator("python_interpreter")
    @classmethod
    def python_interpreter_validator(cls, value):
        if not Path(value).is_absolute():
            raise ValueError(
                f"Python interpreter path must be absolute: (given {value})."
            )
        return value

package_name_validator(value) classmethod

Remove all whitespace characters, then check for invalid code.

Source code in fractal_server/app/schemas/v2/task_collection.py
160
161
162
163
164
165
166
167
168
169
170
@field_validator("package_name")
@classmethod
def package_name_validator(cls, value: str):
    """
    Remove all whitespace characters, then check for invalid code.
    """
    if value is not None:
        validate_cmd(value)
        value = valstr("package_name")(cls, value)
        value = value.replace(" ", "")
    return value

TaskCollectPipV2

Bases: BaseModel

TaskCollectPipV2 class

This class only encodes the attributes required to trigger a task-collection operation. Other attributes (that are assigned during task collection) are defined as part of fractal-server.

Two cases are supported:

1. `package` is the name of a package that can be installed via `pip`.
1. `package=None`, and a wheel file is uploaded within the API request.

Attributes:

Name Type Description
package Optional[str]

The name of a pip-installable package, or None.

package_version Optional[str]

Version of the package

package_extras Optional[str]

Package extras to include in the pip install command

python_version Optional[Literal['3.9', '3.10', '3.11', '3.12']]

Python version to install and run the package tasks

pinned_package_versions Optional[dict[str, str]]

dictionary 'package':'version' used to pin versions for specific packages.

Source code in fractal_server/app/schemas/v2/task_collection.py
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
class TaskCollectPipV2(BaseModel):
    """
    TaskCollectPipV2 class

    This class only encodes the attributes required to trigger a
    task-collection operation. Other attributes (that are assigned *during*
    task collection) are defined as part of fractal-server.

    Two cases are supported:

        1. `package` is the name of a package that can be installed via `pip`.
        1. `package=None`, and a wheel file is uploaded within the API request.

    Attributes:
        package: The name of a `pip`-installable package, or `None`.
        package_version: Version of the package
        package_extras: Package extras to include in the `pip install` command
        python_version: Python version to install and run the package tasks
        pinned_package_versions:
            dictionary 'package':'version' used to pin versions for specific
            packages.

    """

    model_config = ConfigDict(extra="forbid")
    package: Optional[str] = None
    package_version: Optional[str] = None
    package_extras: Optional[str] = None
    python_version: Optional[Literal["3.9", "3.10", "3.11", "3.12"]] = None
    pinned_package_versions: Optional[dict[str, str]] = None

    @field_validator("package")
    @classmethod
    def package_validator(cls, value: Optional[str]) -> Optional[str]:
        if value is None:
            return value
        value = valstr("package")(cls, value)
        validate_cmd(value, attribute_name="package")
        return value

    @field_validator("package_version")
    @classmethod
    def package_version_validator(cls, value: Optional[str]) -> Optional[str]:
        if value is None:
            return value
        value = valstr("package_version")(cls, value)
        validate_cmd(value, attribute_name="package_version")
        return value

    @field_validator("pinned_package_versions")
    @classmethod
    def pinned_package_versions_validator(cls, value):
        if value is None:
            return value
        old_keys = list(value.keys())
        new_keys = [
            valstr(f"pinned_package_versions[{key}]")(cls, key)
            for key in old_keys
        ]
        if len(new_keys) != len(set(new_keys)):
            raise ValueError(
                f"Dictionary contains multiple identical keys: {value}."
            )
        for old_key, new_key in zip(old_keys, new_keys):
            if new_key != old_key:
                value[new_key] = value.pop(old_key)
        for pkg, version in value.items():
            validate_cmd(pkg)
            validate_cmd(version)
        return value

    @field_validator("package_extras")
    @classmethod
    def package_extras_validator(cls, value: Optional[str]) -> Optional[str]:
        if value is None:
            return value
        value = valstr("package_extras")(cls, value)
        validate_cmd(value, attribute_name="package_extras")
        return value

WheelFile

Bases: BaseModel

Model for data sent from the endpoint to the background task.

Source code in fractal_server/app/schemas/v2/task_collection.py
15
16
17
18
19
20
21
class WheelFile(BaseModel):
    """
    Model for data sent from the endpoint to the background task.
    """

    filename: str
    contents: bytes