Files
galaxy/test/unit/data/test_dataset_materialization.py
T

679 lines
29 KiB
Python

from sqlalchemy import select
from galaxy.files.unittest_utils import TestPosixConfiguredFileSources
from galaxy.model import (
DatasetCollection,
DatasetCollectionElement,
HistoryDatasetAssociation,
HistoryDatasetCollectionAssociation,
LibraryDatasetDatasetAssociation,
store,
)
from galaxy.model.deferred import (
materialize_collection_instance,
materializer_factory,
)
from galaxy.model.unittest_utils.store_fixtures import (
deferred_hda_model_store_dict,
deferred_hda_model_store_dict_space_to_tab,
one_ld_library_deferred_model_store_dict,
)
from galaxy.util.resources import resource_string
from .model.test_model_store import (
perform_import_from_store_dict,
setup_fixture_context_with_history,
StoreFixtureContextWithHistory,
)
from .test_model_copy import _create_hda
CONTENTS_2_BED = resource_string(__name__, "model/2.bed")
def test_undeferred_hdas_untouched(tmpdir):
app, sa_session, user, history = setup_fixture_context_with_history()
hda_fh = tmpdir.join("file.txt")
hda_fh.write("Moo Cow")
hda = _create_hda(sa_session, app.object_store, history, hda_fh, include_metadata_file=False)
sa_session.commit()
materializer = materializer_factory(True, object_store=app.object_store, datatypes_registry=app.datatypes_registry)
assert materializer.ensure_materialized(hda) == hda
def test_deferred_hdas_basic_attached():
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
_assert_2_bed_metadata(deferred_hda)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "ok"
# only detached datasets would be created with an external_filename
assert not materialized_dataset.external_filename
object_store = fixture_context.app.object_store
path = object_store.get_filename(materialized_dataset)
assert path
_assert_path_contains_2_bed(path)
_assert_2_bed_metadata(materialized_hda)
def test_hash_validate():
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
_assert_2_bed_metadata(deferred_hda)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "ok"
def test_hash_invalid():
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
store_dict["datasets"][0]["file_metadata"]["hashes"][0]["hash_value"] = "invalidhash"
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
_assert_2_bed_metadata(deferred_hda)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "error"
def test_legacy_transform_actions_on_deferred_hdas_become_requested_actions():
# pre 25.1 we didn't have the distinction between requested and applied transforms,
# so we need to ensure that legacy transforms are converted to requested transforms for
# deferred datasets. In 25.1 - deferred datasets should always have empty transforms as
# no actions have been applied yet.
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
store_dict["datasets"][0]["file_metadata"]["sources"][0]["transform"] = [{"action": "spaces_to_tabs"}]
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
deferred_dataset = deferred_hda.dataset
assert deferred_dataset is not None
assert deferred_dataset.sources[0].transform is None
assert deferred_dataset.sources[0].requested_transform == [{"action": "spaces_to_tabs"}]
def test_requested_transform_actions_on_deferred_hdas_preserved():
# Continued from previous comment, in 25.1 - deferred datasets should have transforms saved
# as requested transforms, so we need to ensure that these are preserved during store import.
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
store_dict["datasets"][0]["file_metadata"]["sources"][0]["requested_transform"] = [{"action": "spaces_to_tabs"}]
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
deferred_dataset = deferred_hda.dataset
assert deferred_dataset is not None
assert deferred_dataset.sources[0].transform is None
assert deferred_dataset.sources[0].requested_transform == [{"action": "spaces_to_tabs"}]
def test_hash_validate_source_of_download():
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
store_dict["datasets"][0]["file_metadata"]["sources"][0]["hashes"] = [
{"model_class": "DatasetSourceHash", "hash_function": "MD5", "hash_value": "f568c29421792b1b1df4474dafae01f1"}
]
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
_assert_2_bed_metadata(deferred_hda)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "ok", materialized_hda.info
def test_hash_invalid_source_of_download():
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
store_dict["datasets"][0]["file_metadata"]["sources"][0]["hashes"] = [
{"model_class": "DatasetSourceHash", "hash_function": "MD5", "hash_value": "invalidhash"}
]
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
_assert_2_bed_metadata(deferred_hda)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "error", materialized_hda.info
def test_deferred_hdas_basic_attached_store_by_uuid():
# skip a flush here so this is a different path...
fixture_context = setup_fixture_context_with_history(store_by="uuid")
store_dict = deferred_hda_model_store_dict()
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
_assert_2_bed_metadata(deferred_hda)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "ok"
# only detached datasets would be created with an external_filename
assert not materialized_dataset.external_filename
object_store = fixture_context.app.object_store
path = object_store.get_filename(materialized_dataset)
assert path
_assert_path_contains_2_bed(path)
def test_deferred_hdas_basic_detached(tmpdir):
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
_assert_2_bed_metadata(deferred_hda)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
False,
transient_directory=tmpdir,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "ok"
external_filename = materialized_dataset.external_filename
assert external_filename
assert external_filename.startswith(str(tmpdir))
_assert_path_contains_2_bed(external_filename)
_assert_2_bed_metadata(materialized_hda)
def test_deferred_datasets_with_legacy_transforms_respect_transform(tmpdir):
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict_space_to_tab("legacy")
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
assert deferred_hda.dataset.sources[0].transform is None
assert deferred_hda.dataset.sources[0].requested_transform == [{"action": "spaces_to_tabs"}]
materializer = materializer_factory(
False,
transient_directory=tmpdir,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.sources[0].transform == [{"action": "spaces_to_tabs"}]
assert materialized_dataset.sources[0].requested_transform == [{"action": "spaces_to_tabs"}]
assert materialized_dataset.state == "ok"
external_filename = materialized_dataset.external_filename
assert external_filename
assert external_filename.startswith(str(tmpdir))
_assert_path_contains_simple_lines_as_tsv(external_filename)
def test_deferred_datasets_with_requested_transforms_respect_transform(tmpdir):
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict_space_to_tab("25.1")
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
assert deferred_hda.dataset.sources[0].transform is None
assert deferred_hda.dataset.sources[0].requested_transform == [
{"action": "datatype_groom"},
{"action": "spaces_to_tabs"},
]
materializer = materializer_factory(
False,
transient_directory=tmpdir,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.sources[0].transform == [{"action": "spaces_to_tabs"}]
assert materialized_dataset.sources[0].requested_transform == [
{"action": "datatype_groom"},
{"action": "spaces_to_tabs"},
]
assert materialized_dataset.state == "ok"
external_filename = materialized_dataset.external_filename
assert external_filename
assert external_filename.startswith(str(tmpdir))
_assert_path_contains_simple_lines_as_tsv(external_filename)
def test_deferred_datasets_do_not_apply_unspecified_transforms_legacy(tmpdir):
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict_space_to_tab("legacy", apply_transform=False)
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
assert deferred_hda.dataset.sources[0].transform is None
assert deferred_hda.dataset.sources[0].requested_transform == []
materializer = materializer_factory(
False,
transient_directory=tmpdir,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.sources[0].transform == []
assert materialized_dataset.sources[0].requested_transform == []
assert materialized_dataset.state == "ok"
external_filename = materialized_dataset.external_filename
assert external_filename
assert external_filename.startswith(str(tmpdir))
_assert_path_contains_simple_lines_as_text(external_filename)
def test_deferred_datasets_do_not_apply_unspecified_transforms(tmpdir):
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict_space_to_tab("25.1", apply_transform=False)
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
assert deferred_hda.dataset.sources[0].transform is None
assert deferred_hda.dataset.sources[0].requested_transform == [{"action": "datatype_groom"}]
materializer = materializer_factory(
False,
transient_directory=tmpdir,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.sources[0].transform == []
assert materialized_dataset.sources[0].requested_transform == [{"action": "datatype_groom"}]
assert materialized_dataset.state == "ok"
external_filename = materialized_dataset.external_filename
assert external_filename
assert external_filename.startswith(str(tmpdir))
_assert_path_contains_simple_lines_as_text(external_filename)
def test_deferred_hdas_basic_detached_from_detached_hda(tmpdir):
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
_ensure_relations_attached_and_expunge(deferred_hda, fixture_context)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
False,
transient_directory=tmpdir,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "ok"
external_filename = materialized_dataset.external_filename
assert external_filename
assert external_filename.startswith(str(tmpdir))
_assert_path_contains_2_bed(external_filename)
_assert_2_bed_metadata(materialized_hda)
def test_deferred_hdas_basic_attached_from_detached_hda():
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
_ensure_relations_attached_and_expunge(deferred_hda, fixture_context)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
sa_session=fixture_context.sa_session(),
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "ok"
# only detached datasets would be created with an external_filename
assert not materialized_dataset.external_filename
object_store = fixture_context.app.object_store
path = object_store.get_filename(materialized_dataset)
assert path
_assert_path_contains_2_bed(path)
_assert_2_bed_metadata(materialized_hda)
def test_deferred_ldda_basic_attached():
import_options = store.ImportOptions(
allow_library_creation=True,
)
fixture_context = setup_fixture_context_with_history()
store_dict = one_ld_library_deferred_model_store_dict()
perform_import_from_store_dict(fixture_context, store_dict, import_options=import_options)
deferred_ldda = fixture_context.sa_session.scalars(select(LibraryDatasetDatasetAssociation)).all()[0]
assert deferred_ldda
assert deferred_ldda.dataset is not None
assert deferred_ldda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_ldda)
assert materialized_hda.history is None
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "ok"
# only detached datasets would be created with an external_filename
assert not materialized_dataset.external_filename
object_store = fixture_context.app.object_store
path = object_store.get_filename(materialized_dataset)
assert path
_assert_path_contains_2_bed(path)
def test_deferred_hdas_basic_attached_file_sources(tmpdir):
root = tmpdir / "root"
root.mkdir()
content_path = root / "2.bed"
content_path.write_text(CONTENTS_2_BED, encoding="utf-8")
file_sources = TestPosixConfiguredFileSources(str(root))
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict(
source_uri="gxfiles://test1/2.bed",
)
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
file_sources=file_sources,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert materialized_dataset.state == "ok"
# only detached datasets would be created with an external_filename
assert not materialized_dataset.external_filename
object_store = fixture_context.app.object_store
path = object_store.get_filename(materialized_dataset)
assert path
_assert_path_contains_2_bed(path)
_assert_2_bed_metadata(materialized_hda)
def test_deferred_hdas_with_deferred_metadata():
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict(metadata_deferred=True)
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
materialized_dataset = materialized_hda.dataset
assert materialized_dataset is not None
assert not materialized_hda.metadata_deferred
assert materialized_dataset.state == "ok"
# only detached datasets would be created with an external_filename
assert not materialized_dataset.external_filename
object_store = fixture_context.app.object_store
path = object_store.get_filename(materialized_dataset)
assert path
_assert_path_contains_2_bed(path)
_assert_2_bed_metadata(materialized_hda)
def test_deferred_hda_with_auto_extension_gets_sniffed_from_content():
# Scenario: a deferred fetch/upload with no explicit ``ext`` is stored as
# extension="auto" because the bytes aren't available to sniff at request time
# (data_fetch.py: ``requested_ext = item.get("ext", "auto")``). When the dataset is
# later materialized for a tool run, the real type is sniffed from the downloaded
# content. Requires a datatypes_registry.
fixture_context = setup_fixture_context_with_history()
store_dict = deferred_hda_model_store_dict()
store_dict["datasets"][0]["extension"] = "auto"
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
assert deferred_hda.extension == "auto"
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
materialized_hda = materializer.ensure_materialized(deferred_hda)
assert materialized_hda.dataset is not None
assert materialized_hda.dataset.state == "ok"
# The fixture source is a .bed file; content sniffing must upgrade "auto" to "bed".
assert materialized_hda.extension == "bed"
def test_materialize_attached_hdcas_unimplemented(tmpdir):
fixture_context = setup_fixture_context_with_history()
materializer = materializer_factory(
True,
object_store=fixture_context.app.object_store,
datatypes_registry=fixture_context.app.datatypes_registry,
)
hdca = _test_hdca(tmpdir, fixture_context)
exception_found = False
try:
materialize_collection_instance(hdca, materializer)
except NotImplementedError:
exception_found = True
assert exception_found
def test_materialize_unattached_undeferred_hdcas_noop(tmpdir):
fixture_context = setup_fixture_context_with_history()
materializer = materializer_factory(
False,
transient_directory=tmpdir,
datatypes_registry=fixture_context.app.datatypes_registry,
)
input_hdca = _test_hdca(tmpdir, fixture_context, include_element_deferred=False)
materialized_hdca = materialize_collection_instance(input_hdca, materializer)
assert input_hdca == materialized_hdca # doesn't have deferred data so just assert it is input.
def test_materialize_unattached_deferred_hdcas(tmpdir):
fixture_context = setup_fixture_context_with_history()
materializer = materializer_factory(
False,
transient_directory=tmpdir,
datatypes_registry=fixture_context.app.datatypes_registry,
)
deferred_hdca = _test_hdca(tmpdir, fixture_context)
assert deferred_hdca.has_deferred_data
assert len(deferred_hdca.collection.elements) == 2
assert _deferred_element_count(deferred_hdca.collection) == 1
materialized_hdca = materialize_collection_instance(deferred_hdca, materializer)
assert not materialized_hdca.has_deferred_data
assert materialized_hdca.name == deferred_hdca.name
materialized_collection = materialized_hdca.collection
assert materialized_collection
materialized_elements = materialized_collection.elements
assert len(materialized_elements) == 2
assert _deferred_element_count(materialized_collection) == 0
def _test_hdca(
tmpdir,
fixture_context: StoreFixtureContextWithHistory,
include_element_deferred: bool = True,
include_element_ok: bool = True,
) -> HistoryDatasetCollectionAssociation:
app, sa_session, _, history = fixture_context
store_dict = deferred_hda_model_store_dict()
perform_import_from_store_dict(fixture_context, store_dict)
deferred_hda = fixture_context.history.datasets[0]
sa_session.add(deferred_hda)
assert deferred_hda.dataset is not None
assert deferred_hda.dataset.state == "deferred"
hda_fh = tmpdir.join("file.txt")
hda_fh.write("Moo Cow")
hda = _create_hda(sa_session, app.object_store, history, hda_fh, include_metadata_file=False)
elements = []
element_index = 0
if include_element_deferred:
elements.append(
DatasetCollectionElement(
element=deferred_hda,
element_identifier="deferred_hda",
element_index=element_index,
)
)
element_index += 1
if include_element_ok:
elements.append(
DatasetCollectionElement(
element=hda,
element_identifier="ok_hda",
element_index=element_index,
)
)
element_index += 1
collection = DatasetCollection(collection_type="list", populated=True)
collection.elements = elements
hdca = HistoryDatasetCollectionAssociation(
history=history,
hid=1,
collection=collection,
name="HistoryCollectionTest1",
)
sa_session.add(hdca)
sa_session.add(collection)
sa_session.commit()
return hdca
def _deferred_element_count(dataset_collection: DatasetCollection) -> int:
count = 0
for element in dataset_collection.elements:
if element.is_collection:
assert element.child_collection
count += _deferred_element_count(element.child_collection)
else:
dataset_instance = element.dataset_instance
print(dataset_instance.dataset.state)
if dataset_instance.dataset.state == "deferred":
count += 1
return count
def _ensure_relations_attached_and_expunge(deferred_hda: HistoryDatasetAssociation, fixture_context) -> None:
# make sure everything needed is in session (sources, hashes, and metadata)...
# point here is exercise deferred_hda.history throws a detached error.
assert deferred_hda.dataset is not None
[s.hashes for s in deferred_hda.dataset.sources]
deferred_hda.dataset.hashes # noqa: B018
deferred_hda._metadata # noqa: B018
sa_session = fixture_context.sa_session
sa_session.expunge_all()
def _assert_2_bed_metadata(hda: HistoryDatasetAssociation) -> None:
assert hda.metadata.columns == 6
assert hda.metadata.data_lines == 68
assert hda.metadata.comment_lines == 0
assert hda.metadata.chromCol == 1
assert hda.metadata.startCol == 2
assert hda.metadata.endCol == 3
assert hda.metadata.viz_filter_cols == [4]
def _assert_path_contains_2_bed(path) -> None:
with open(path) as f:
contents = f.read()
assert contents == CONTENTS_2_BED
def _assert_path_contains_simple_lines_as_tsv(path) -> None:
with open(path) as f:
contents = f.read()
assert contents == "This\tis\ta\tline\tof\ttext.\n" # simple lines as TSV
def _assert_path_contains_simple_lines_as_text(path) -> None:
with open(path) as f:
contents = f.read()
assert contents == "This is a line of text.\n" # simple lines as text