Commit 3224cfb9 authored by Cage, Gregory's avatar Cage, Gregory
Browse files

Add outputs class to hold tool outputs

parent 99df7735
Loading
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -6,7 +6,8 @@ as well as output data from Galaxy tools.

from abc import ABC, abstractmethod
from enum import Enum
from typing import Any, Dict, Union
from pathlib import Path
from typing import Any, Dict, Optional, Union

from bioblend.galaxy.dataset_collections import DatasetCollectionClient
from bioblend.galaxy.datasets import DatasetClient
@@ -62,8 +63,9 @@ class AbstractData(ABC):
class Dataset(AbstractData):
    """Singular file that can be uploaded and used in a Galaxy tool."""

    def __init__(self, path: str):
    def __init__(self, path: str, name: Optional[str] = None):
        self.path = path
        self.name = name or Path(path).name
        self.id: str
        self.store: Datastore

@@ -88,8 +90,9 @@ class Dataset(AbstractData):
class DatasetCollection(AbstractData):
    """A group of files that can be uploaded as a collection and collectively be used in a Galaxy tool."""

    def __init__(self, path: str):
    def __init__(self, path: str, name: Optional[str] = None):
        self.path = path
        self.name = name or Path(path).name
        self.id: str
        self.store: Datastore

+34 −0
Original line number Diff line number Diff line
"""Encapsulates the output datasets and collections for a Tool."""

from typing import Any, List

from .dataset import AbstractData, Dataset, DatasetCollection


class Outputs:
    """Contains the output datasets and collections for a Tool."""

    def __init__(self) -> None:
        self.data: List[AbstractData] = []

    def __iter__(self) -> Any:
        """Iterator."""
        self._iterator = 0
        return self

    def __next__(self) -> AbstractData:
        """Get next element for iterator."""
        if self._iterator >= len(self.data):
            raise StopIteration
        d = self.data[self._iterator]
        self._iterator += 1
        return d

    def add_output(self, data: AbstractData) -> None:
        self.data.append(data)

    def get_dataset(self, name: str) -> AbstractData:
        return next(filter(lambda x: isinstance(x, Dataset) and x.name == name, self.data))

    def get_collection(self, name: str) -> AbstractData:
        return next(filter(lambda x: isinstance(x, DatasetCollection) and x.name == name, self.data))
+8 −7
Original line number Diff line number Diff line
"""Contains classes to run tools in Galaxy via Nova."""

from typing import Any, Dict, List
from typing import List, Union

from bioblend import galaxy

from .data_store import Datastore
from .dataset import AbstractData, Dataset, DatasetCollection, upload_datasets
from .outputs import Outputs
from .parameters import Parameters


@@ -21,8 +22,8 @@ class AbstractWork:
    def get_inputs(self) -> List[Parameters]:
        return []

    def run(self, data_store: Datastore, params: Parameters) -> Dict[str, AbstractData]:
        return {}
    def run(self, data_store: Datastore, params: Parameters) -> Union[Outputs, None]:
        return None


class Tool(AbstractWork):
@@ -31,9 +32,9 @@ class Tool(AbstractWork):
    def __init__(self, id: str):
        super().__init__(id)

    def run(self, data_store: Datastore, params: Parameters) -> Dict[Any, AbstractData]:
    def run(self, data_store: Datastore, params: Parameters) -> Outputs:
        """Runs this tool in a blocking manner and returns a map of the output datasets and collections."""
        outputs: Dict[Any, AbstractData] = {}
        outputs = Outputs()
        galaxy_instance = data_store.nova.galaxy_instance
        datasets_to_upload = {}

@@ -65,12 +66,12 @@ class Tool(AbstractWork):
                d = Dataset(dataset["output_name"])
                d.id = dataset["id"]
                d.store = data_store
                outputs[dataset["output_name"]] = d
                outputs.add_output(d)
        if result_collections:
            for collection in result_collections:
                dc = DatasetCollection(collection["output_name"])
                dc.id = collection["id"]
                dc.store = data_store
                outputs[collection["output_name"]] = dc
                outputs.add_output(dc)

        return outputs