1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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 103 104 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
|
"""Modern pydantic based descriptions of Galaxy tool output objects.
output_objects.py is still used for internals and contain references to the actual tool object
but the goal here is to switch to using these overtime at least for external APIs and in library
code where actual tool objects aren't created.
"""
from typing import (
Generic,
List,
Optional,
Union,
)
from pydantic import Field
from typing_extensions import (
Annotated,
Literal,
TypeVar,
)
from ._base import ToolSourceBaseModel
AnyT = TypeVar("AnyT")
NotRequired = Annotated[Optional[AnyT], Field(None)]
IncomingNotRequiredBoolT = TypeVar("IncomingNotRequiredBoolT")
IncomingNotRequiredStringT = TypeVar("IncomingNotRequiredStringT")
# Use IncomingNotRequired when concrete key: Optional[str] = None would be incorrect
class GenericToolOutputBaseModel(ToolSourceBaseModel, Generic[IncomingNotRequiredBoolT, IncomingNotRequiredStringT]):
name: Annotated[
IncomingNotRequiredStringT, Field(description="Parameter name. Used when referencing parameter in workflows.")
]
label: Annotated[Optional[str], Field(description="Output label. Will be used as dataset name in history.")] = None
hidden: Annotated[
IncomingNotRequiredBoolT, Field(description="If true, the output will not be shown in the history.")
]
DiscoverViaT = Literal["tool_provided_metadata", "pattern"]
SortKeyT = Literal["filename", "name", "designation", "dbkey"]
SortCompT = Literal["lexical", "numeric"]
class DatasetCollectionDescription(ToolSourceBaseModel):
discover_via: DiscoverViaT
format: Optional[str]
visible: bool
assign_primary_output: bool
directory: Optional[str]
recurse: bool
match_relative_path: bool
class ToolProvidedMetadataDatasetCollection(DatasetCollectionDescription):
discover_via: Literal["tool_provided_metadata"]
class FilePatternDatasetCollectionDescription(DatasetCollectionDescription):
discover_via: Literal["pattern"]
sort_key: SortKeyT
sort_comp: SortCompT
sort_reverse: bool = False
pattern: str
DatasetCollectionDescriptionT = Union[FilePatternDatasetCollectionDescription, ToolProvidedMetadataDatasetCollection]
class GenericToolOutputDataset(
GenericToolOutputBaseModel[IncomingNotRequiredBoolT, IncomingNotRequiredStringT],
Generic[IncomingNotRequiredBoolT, IncomingNotRequiredStringT],
):
type: Literal["data"]
format: Annotated[IncomingNotRequiredStringT, Field(description="The short name for the output datatype.")]
format_source: Annotated[
Optional[str],
Field(
description="This sets the data type of the output dataset(s) to be the same format as that of the specified tool input."
),
] = None
metadata_source: Annotated[
Optional[str],
Field(
description="This copies the metadata information from the tool’s input dataset to serve as default for information that cannot be detected from the output. One prominent use case is interval data with a non-standard column order that cannot be deduced from a header line, but which is known to be identical in the input and output datasets."
),
] = None
discover_datasets: Optional[List[DatasetCollectionDescriptionT]] = None
from_work_dir: Annotated[
Optional[str],
Field(
title="from_work_dir",
description="Relative path to a file produced by the tool in its working directory. Output’s contents are set to this file’s contents.",
),
] = None
precreate_directory: Optional[bool] = False
class ToolOutputDataset(GenericToolOutputDataset[bool, str]): ...
class IncomingToolOutputDataset(
GenericToolOutputDataset[
NotRequired[bool],
NotRequired[str],
]
): ...
class ToolOutputCollectionStructure(ToolSourceBaseModel):
collection_type: Optional[str] = None
collection_type_source: Optional[str] = None
collection_type_from_rules: Optional[str] = None
structured_like: Optional[str] = None
discover_datasets: Optional[List[DatasetCollectionDescriptionT]] = None
class GenericToolOutputCollection(
GenericToolOutputBaseModel[IncomingNotRequiredBoolT, IncomingNotRequiredStringT],
Generic[IncomingNotRequiredBoolT, IncomingNotRequiredStringT],
):
type: Literal["collection"]
structure: ToolOutputCollectionStructure
class ToolOutputCollection(GenericToolOutputCollection[bool, str]): ...
class IncomingToolOutputCollection(GenericToolOutputCollection[NotRequired[bool], NotRequired[str]]): ...
class ToolOutputSimple(GenericToolOutputBaseModel):
pass
class ToolOutputText(ToolOutputSimple):
type: Literal["text"]
class ToolOutputInteger(ToolOutputSimple):
type: Literal["integer"]
class ToolOutputFloat(ToolOutputSimple):
type: Literal["float"]
class ToolOutputBoolean(ToolOutputSimple):
type: Literal["boolean"]
IncomingToolOutputT = Union[
IncomingToolOutputDataset,
IncomingToolOutputCollection,
ToolOutputText,
ToolOutputInteger,
ToolOutputFloat,
ToolOutputBoolean,
]
IncomingToolOutput = Annotated[IncomingToolOutputT, Field(discriminator="type")]
ToolOutputT = Union[
ToolOutputDataset, ToolOutputCollection, ToolOutputText, ToolOutputInteger, ToolOutputFloat, ToolOutputBoolean
]
ToolOutput = Annotated[ToolOutputT, Field(discriminator="type")]
|