Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.schema.fetch_data
import json
from enum import Enum
from typing import (
Annotated,
Any,
Optional,
Union,
)
from pydantic import (
AliasChoices,
ConfigDict,
Field,
field_validator,
HttpUrl,
Json,
TypeAdapter,
UUID4,
)
from typing_extensions import Literal
from galaxy.schema.fields import DecodedDatabaseIdField
from galaxy.schema.schema import (
Model,
SampleSheetColumnDefinitions,
SampleSheetRow,
)
from galaxy.schema.terms import HelpTerms
from galaxy.schema.types import CoercedStringType
from galaxy.tool_util_models.parameters import FileOrCollectionRequest
from galaxy.util.hash_util import HashFunctionNames
HELP_TERMS = HelpTerms()
[docs]
class ElementsFromType(str, Enum):
archive = "archive"
bagit = "bagit"
bagit_archive = "bagit_archive"
directory = "directory"
AutoDecompressField = Field(False, description=HELP_TERMS.get_term("galaxy.dataFetch.auto_decompress"))
[docs]
class ItemsFromSrc(str, Enum):
url = "url"
files = "files"
path = "path"
ftp_import = "ftp_import"
server_dir = "server_dir"
[docs]
class Src(str, Enum):
url = "url"
pasted = "pasted"
files = "files"
path = "path"
composite = "composite"
ftp_import = "ftp_import"
server_dir = "server_dir"
[docs]
class DestinationType(str, Enum):
library = "library"
library_folder = "library_folder"
hdcas = "hdcas"
hdas = "hdas"
[docs]
class LibraryFolderDestination(FetchBaseModel):
type: Literal["library_folder"]
library_folder_id: DecodedDatabaseIdField # For some reason this folder ID must NOT have the 'F' prefix
[docs]
class BaseCollectionTarget(BaseFetchDataTarget):
destination: HdcaDestination
collection_type: Optional[str] = None
tags: Optional[list[str]] = None
name: Optional[str] = None
column_definitions: Optional[SampleSheetColumnDefinitions] = None
[docs]
class LibraryDestination(FetchBaseModel):
type: Literal["library"]
name: str = Field(..., description="Must specify a library name")
description: Optional[str] = Field(None, description="Description for library to create")
synopsis: Optional[str] = Field(None, description="Description for library to create")
[docs]
class ExtraFiles(FetchBaseModel):
items_from: Optional[str] = None
src: Src
fuzzy_root: Optional[bool] = Field(
True,
description="Prevent Galaxy from checking for a single file in a directory and re-interpreting the archive",
)
[docs]
class FetchDatasetHash(Model):
hash_function: HashFunctionNames
hash_value: str
model_config = ConfigDict(extra="forbid")
[docs]
class BaseDataElement(FetchBaseModel):
name: Optional[CoercedStringType] = None
dbkey: str = Field("?", description=HELP_TERMS.get_term("galaxy.dataFetch.dbkey"))
info: Optional[str] = Field(None, description=HELP_TERMS.get_term("galaxy.dataFetch.info"))
ext: str = Field("auto", description=HELP_TERMS.get_term("galaxy.dataFetch.ext"))
space_to_tab: bool = Field(False, description=HELP_TERMS.get_term("galaxy.dataFetch.space_to_tab"))
to_posix_lines: bool = Field(False, description=HELP_TERMS.get_term("galaxy.dataFetch.to_posix_lines"))
deferred: bool = Field(False, description=HELP_TERMS.get_term("galaxy.dataFetch.deferred"))
tags: Optional[list[str]] = Field(None, description=HELP_TERMS.get_term("galaxy.dataFetch.tags"))
created_from_basename: Optional[str] = None
extra_files: Optional[ExtraFiles] = None
auto_decompress: bool = AutoDecompressField
items_from: Optional[ElementsFromType] = Field(None, validation_alias=AliasChoices("items_from", "elements_from"))
collection_type: Optional[str] = None
MD5: Optional[str] = Field(None, description=HELP_TERMS.get_term("galaxy.dataFetch.MD5"))
SHA1: Optional[str] = Field(None, alias="SHA-1", description=HELP_TERMS.get_term("galaxy.dataFetch.SHA1"))
SHA256: Optional[str] = Field(None, alias="SHA-256", description=HELP_TERMS.get_term("galaxy.dataFetch.SHA256"))
SHA512: Optional[str] = Field(None, alias="SHA-512", description=HELP_TERMS.get_term("galaxy.dataFetch.SHA512"))
hashes: Optional[list[FetchDatasetHash]] = None
description: Optional[str] = None
model_config = ConfigDict(extra="forbid")
# It'd be nice to restrict this to just the top level and only if creating a collection
row: Optional[SampleSheetRow] = None
[docs]
class PastedDataElement(BaseDataElement):
src: Literal["pasted"]
paste_content: CoercedStringType = Field(..., description=HELP_TERMS.get_term("galaxy.dataFetch.paste_content"))
[docs]
class UrlDataElement(BaseDataElement):
src: Literal["url"]
url: str = Field(..., description="URL to upload")
[docs]
class ServerDirElement(BaseDataElement):
src: Literal["server_dir"]
server_dir: str
link_data_only: Optional[bool] = None
[docs]
class FtpImportElement(BaseDataElement):
src: Literal["ftp_import"]
ftp_path: str
collection_type: Optional[str] = None
[docs]
class ItemsFromModel(Model):
src: ItemsFromSrc
path: Optional[str] = None
ftp_path: Optional[str] = None
server_dir: Optional[str] = None
url: Optional[str] = None
[docs]
class FtpImportTarget(BaseCollectionTarget):
src: Literal["ftp_import"]
ftp_path: str
items_from: Optional[ElementsFromType] = Field(None, validation_alias=AliasChoices("items_from", "elements_from"))
[docs]
class PathDataElement(BaseDataElement):
src: Literal["path"]
path: str
items_from: Optional[ElementsFromType] = Field(None, validation_alias=AliasChoices("items_from", "elements_from"))
link_data_only: Optional[bool] = None
[docs]
class CompositeDataElement(BaseDataElement):
src: Literal["composite"]
composite: "CompositeItems"
metadata: Optional[dict[str, Any]] = None
[docs]
class CompositeItems(FetchBaseModel):
elements: list[
Union[FileDataElement, PastedDataElement, UrlDataElement, PathDataElement, ServerDirElement, FtpImportElement]
] = Field(..., validation_alias=AliasChoices("elements", "items"))
CompositeDataElement.model_rebuild()
[docs]
class NestedElement(BaseDataElement):
elements: list[Union["AnyElement", "NestedElement"]] = Field(
..., validation_alias=AliasChoices("elements", "items")
)
AnyElement = Annotated[
Union[
FileDataElement,
PastedDataElement,
UrlDataElement,
PathDataElement,
ServerDirElement,
FtpImportElement,
CompositeDataElement,
],
Field(default_factory=None, discriminator="src"),
]
# Seems to be a bug in pydantic ... can't reuse AnyElement in more than one model
AnyElement2 = Annotated[
Union[
FileDataElement,
PastedDataElement,
UrlDataElement,
PathDataElement,
ServerDirElement,
FtpImportElement,
CompositeDataElement,
],
Field(default_factory=None, discriminator="src"),
]
NestedElement.model_rebuild()
[docs]
class BaseDataTarget(BaseFetchDataTarget):
destination: Union[HdaDestination, LibraryFolderDestination, LibraryDestination] = Field(..., discriminator="type")
[docs]
class DataElementsTarget(BaseDataTarget):
elements: list[Union[AnyElement, NestedElement]] = Field(..., validation_alias=AliasChoices("elements", "items"))
[docs]
class DataElementsFromTarget(BaseDataTarget, ItemsFromModel):
items_from: ElementsFromType = Field(..., alias="elements_from")
[docs]
class HdcaDataItemsTarget(BaseCollectionTarget):
elements: list[Union[AnyElement2, NestedElement]] = Field(..., validation_alias=AliasChoices("elements", "items"))
[docs]
class HdcaDataItemsFromTarget(BaseCollectionTarget, ItemsFromModel):
items_from: ElementsFromType = Field(..., validation_alias=AliasChoices("items_from", "elements_from"))
[docs]
class BaseDataPayload(FetchBaseModel):
history_id: DecodedDatabaseIdField
model_config = ConfigDict(extra="allow")
landing_uuid: Optional[UUID4] = None
[docs]
@field_validator("targets", mode="before", check_fields=False)
@classmethod
def targets_string_to_json(cls, v):
if isinstance(v, str):
return json.loads(v)
return v
Targets = list[
Union[
DataElementsTarget,
HdcaDataItemsTarget,
DataElementsFromTarget,
HdcaDataItemsFromTarget,
FtpImportTarget,
]
]
TargetsAdapter = TypeAdapter(Targets)
FileOrCollectionRequests = list[FileOrCollectionRequest]
FileOrCollectionRequestsAdapter = TypeAdapter(FileOrCollectionRequests)
# Vaguely matches the schema.schema.ToolLandingState but we don't allow data_fetch to be called directly
# via the tool API so we have a more specific model here.
[docs]
class CreateDataLandingPayload(Model):
request_state: DataLandingRequestState
client_secret: Optional[str] = None
public: bool = False
origin: Optional[HttpUrl] = None
model_config = ConfigDict(extra="forbid")
[docs]
class CreateFileLandingPayload(Model):
request_state: FileOrCollectionRequests
client_secret: Optional[str] = None
public: bool = False
origin: Optional[HttpUrl] = None
model_config = ConfigDict(extra="forbid")