From de017811d48180bd5c762513b08b846a51601c27 Mon Sep 17 00:00:00 2001 From: Simon Bray Date: Tue, 15 Feb 2022 10:26:35 +0100 Subject: [PATCH 1/6] create trs_id attribute to be set when workflow is imported --- lib/galaxy/managers/workflows.py | 16 ++++++++------ lib/galaxy/model/__init__.py | 1 + lib/galaxy/webapps/galaxy/api/workflows.py | 1 + lib/galaxy_test/api/test_workflows.py | 25 ++++++++++++++++++++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/lib/galaxy/managers/workflows.py b/lib/galaxy/managers/workflows.py index 2e827d23256..c4dec873e29 100644 --- a/lib/galaxy/managers/workflows.py +++ b/lib/galaxy/managers/workflows.py @@ -524,12 +524,10 @@ class WorkflowContentsManager(UsesAnnotations): workflow.reports_config = data["report"] workflow.license = data.get("license") workflow.creator_metadata = data.get("creator") - - if "license" in data: - workflow.license = data["license"] - - if "creator" in data: - workflow.creator_metadata = data["creator"] + if hasattr(workflow_state_resolution_options, "trs_id"): + if workflow_state_resolution_options.trs_id: + workflow.trs_id = workflow_state_resolution_options.trs_id + workflow_state_resolution_options.trs_id = None # so trs_id is not set for subworkflows # Assume no errors until we find a step that has some workflow.has_errors = False @@ -855,6 +853,7 @@ class WorkflowContentsManager(UsesAnnotations): data["report"] = workflow.reports_config or {} data["license"] = workflow.license data["creator"] = workflow.creator_metadata + data["trs_id"] = workflow.trs_id data["annotation"] = self.get_item_annotation_str(trans.sa_session, trans.user, stored) or "" output_label_index = set() @@ -1094,6 +1093,8 @@ class WorkflowContentsManager(UsesAnnotations): data["creator"] = workflow.creator_metadata if workflow.license: data["license"] = workflow.license + if workflow.trs_id: + data["trs_id"] = workflow.trs_id # For each step, rebuild the form and encode the state for step in workflow.steps: # Load from database representation @@ -1644,6 +1645,9 @@ class WorkflowCreateOptions(WorkflowStateResolutionOptions): tool_panel_section_mapping: Dict = {} shed_tool_conf: Optional[str] = None + # for workflows imported by trs id + trs_id: str = "" + @property def is_importable(self): # if self.importable is None, use self.publish that has a default. diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 8946a4435e3..9e2228c7d34 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -6608,6 +6608,7 @@ class Workflow(Base, Dictifiable, RepresentById): reports_config = Column(MutableJSONType) creator_metadata = Column(MutableJSONType) license = Column(TEXT) + trs_id = Column(TEXT) uuid = Column(UUIDType, nullable=True) steps = relationship( diff --git a/lib/galaxy/webapps/galaxy/api/workflows.py b/lib/galaxy/webapps/galaxy/api/workflows.py index 0cea440c1a8..544d839f34c 100644 --- a/lib/galaxy/webapps/galaxy/api/workflows.py +++ b/lib/galaxy/webapps/galaxy/api/workflows.py @@ -360,6 +360,7 @@ class WorkflowsAPIController(BaseGalaxyAPIController, UsesStoredWorkflowMixin, U trs_server = payload.get("trs_server") trs_tool_id = payload.get("trs_tool_id") trs_version_id = payload.get("trs_version_id") + payload["trs_id"] = ":".join((trs_tool_id, trs_version_id)) archive_data = self.app.trs_proxy.get_version_descriptor(trs_server, trs_tool_id, trs_version_id) else: try: diff --git a/lib/galaxy_test/api/test_workflows.py b/lib/galaxy_test/api/test_workflows.py index 2ec1936a698..05abdb1a232 100644 --- a/lib/galaxy_test/api/test_workflows.py +++ b/lib/galaxy_test/api/test_workflows.py @@ -645,6 +645,31 @@ steps: other_import_response = self.__import_workflow(workflow_id) self._assert_status_code_is(other_import_response, 403) + def test_trs_import(self): + trs_payload = { + "archive_source": "trs_tool", + "trs_server": "dockstore", + "trs_tool_id": "#workflow/github.com/jmchilton/galaxy-workflow-dockstore-example-1/mycoolworkflow", + "trs_version_id": "master", + } + workflow_id = self._post("workflows", data=trs_payload).json()["id"] + original_workflow = self._download_workflow(workflow_id) + assert "Test Workflow" in original_workflow["name"] + assert original_workflow.get("trs_id") == ":".join((trs_payload["trs_tool_id"], trs_payload["trs_version_id"])) + + # refactor workflow and check that the trs id is removed + actions = [ + {"action_type": "update_step_label", "step": {"order_index": 0}, "label": "new_label"}, + ] + self.workflow_populator.refactor_workflow(workflow_id, actions) + refactored_workflow = self._download_workflow(workflow_id) + assert refactored_workflow.get("trs_id") is None + + # reupload original_workflow and check that the trs id is removed + reuploaded_workflow_id = self.workflow_populator.create_workflow(original_workflow) + reuploaded_workflow = self._download_workflow(reuploaded_workflow_id) + assert reuploaded_workflow.get("trs_id") is None + def test_anonymous_published(self): def anonymous_published_workflows(): workflows_url = self._api_url("workflows?show_published=True") From 650d7d9a6e2255448ad347fcfdba7b4300fcd0a5 Mon Sep 17 00:00:00 2001 From: Simon Bray Date: Tue, 15 Feb 2022 10:32:07 +0100 Subject: [PATCH 2/6] add migrate script adding trs_id column to workflow table --- .../0181_add_trs_id_workflow_table.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py diff --git a/lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py b/lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py new file mode 100644 index 00000000000..011f699db2f --- /dev/null +++ b/lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py @@ -0,0 +1,35 @@ +""" +Migration script for adding trs_id column to workflow table. +""" + +import logging + +from sqlalchemy import ( + Column, + MetaData, + Text, +) + +from galaxy.model.migrate.versions.util import ( + add_column, + drop_column, +) + +log = logging.getLogger(__name__) +metadata = MetaData() + + +def upgrade(migrate_engine): + print(__doc__) + metadata.bind = migrate_engine + metadata.reflect() + + trs_id_column = Column("trs_id", Text) + add_column(trs_id_column, "workflow", metadata) + + +def downgrade(migrate_engine): + metadata.bind = migrate_engine + metadata.reflect() + + drop_column("trs_id", "workflow", metadata) From 380d370b6d47faab18024f3270e96b39a0641616 Mon Sep 17 00:00:00 2001 From: Simon Bray Date: Tue, 15 Feb 2022 11:59:00 +0100 Subject: [PATCH 3/6] store trs_tool_id and trs_version_id separately --- lib/galaxy/managers/workflows.py | 26 +++++++++++++------ lib/galaxy/model/__init__.py | 3 ++- .../0181_add_trs_id_workflow_table.py | 10 ++++--- lib/galaxy/webapps/galaxy/api/workflows.py | 1 - lib/galaxy_test/api/test_workflows.py | 7 ++--- 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/lib/galaxy/managers/workflows.py b/lib/galaxy/managers/workflows.py index c4dec873e29..e2ff8f83ae6 100644 --- a/lib/galaxy/managers/workflows.py +++ b/lib/galaxy/managers/workflows.py @@ -524,10 +524,16 @@ class WorkflowContentsManager(UsesAnnotations): workflow.reports_config = data["report"] workflow.license = data.get("license") workflow.creator_metadata = data.get("creator") - if hasattr(workflow_state_resolution_options, "trs_id"): - if workflow_state_resolution_options.trs_id: - workflow.trs_id = workflow_state_resolution_options.trs_id - workflow_state_resolution_options.trs_id = None # so trs_id is not set for subworkflows + if hasattr(workflow_state_resolution_options, "trs_tool_id") and hasattr( + workflow_state_resolution_options, "trs_version_id" + ): + if workflow_state_resolution_options.trs_tool_id and workflow_state_resolution_options.trs_version_id: + workflow.trs_tool_id = workflow_state_resolution_options.trs_tool_id + workflow.trs_version_id = workflow_state_resolution_options.trs_version_id + workflow_state_resolution_options.trs_tool_id, workflow_state_resolution_options.trs_version_id = ( + None, + None, + ) # so trs_id is not set for subworkflows # Assume no errors until we find a step that has some workflow.has_errors = False @@ -853,7 +859,8 @@ class WorkflowContentsManager(UsesAnnotations): data["report"] = workflow.reports_config or {} data["license"] = workflow.license data["creator"] = workflow.creator_metadata - data["trs_id"] = workflow.trs_id + data["trs_tool_id"] = workflow.trs_tool_id + data["trs_version_id"] = workflow.trs_version_id data["annotation"] = self.get_item_annotation_str(trans.sa_session, trans.user, stored) or "" output_label_index = set() @@ -1093,8 +1100,10 @@ class WorkflowContentsManager(UsesAnnotations): data["creator"] = workflow.creator_metadata if workflow.license: data["license"] = workflow.license - if workflow.trs_id: - data["trs_id"] = workflow.trs_id + if workflow.trs_tool_id: + data["trs_tool_id"] = workflow.trs_tool_id + if workflow.trs_version_id: + data["trs_version_id"] = workflow.trs_version_id # For each step, rebuild the form and encode the state for step in workflow.steps: # Load from database representation @@ -1646,7 +1655,8 @@ class WorkflowCreateOptions(WorkflowStateResolutionOptions): shed_tool_conf: Optional[str] = None # for workflows imported by trs id - trs_id: str = "" + trs_tool_id: str = "" + trs_version_id: str = "" @property def is_importable(self): diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 9e2228c7d34..976aa7a570d 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -6608,7 +6608,8 @@ class Workflow(Base, Dictifiable, RepresentById): reports_config = Column(MutableJSONType) creator_metadata = Column(MutableJSONType) license = Column(TEXT) - trs_id = Column(TEXT) + trs_tool_id = Column(TEXT) + trs_version_id = Column(TEXT) uuid = Column(UUIDType, nullable=True) steps = relationship( diff --git a/lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py b/lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py index 011f699db2f..b4a1b1c0709 100644 --- a/lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py +++ b/lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py @@ -24,12 +24,16 @@ def upgrade(migrate_engine): metadata.bind = migrate_engine metadata.reflect() - trs_id_column = Column("trs_id", Text) - add_column(trs_id_column, "workflow", metadata) + trs_tool_id_column = Column("trs_tool_id", Text) + add_column(trs_tool_id_column, "workflow", metadata) + + trs_version_id_column = Column("trs_version_id", Text) + add_column(trs_version_id_column, "workflow", metadata) def downgrade(migrate_engine): metadata.bind = migrate_engine metadata.reflect() - drop_column("trs_id", "workflow", metadata) + drop_column("trs_tool_id", "workflow", metadata) + drop_column("trs_version_id", "workflow", metadata) diff --git a/lib/galaxy/webapps/galaxy/api/workflows.py b/lib/galaxy/webapps/galaxy/api/workflows.py index 544d839f34c..0cea440c1a8 100644 --- a/lib/galaxy/webapps/galaxy/api/workflows.py +++ b/lib/galaxy/webapps/galaxy/api/workflows.py @@ -360,7 +360,6 @@ class WorkflowsAPIController(BaseGalaxyAPIController, UsesStoredWorkflowMixin, U trs_server = payload.get("trs_server") trs_tool_id = payload.get("trs_tool_id") trs_version_id = payload.get("trs_version_id") - payload["trs_id"] = ":".join((trs_tool_id, trs_version_id)) archive_data = self.app.trs_proxy.get_version_descriptor(trs_server, trs_tool_id, trs_version_id) else: try: diff --git a/lib/galaxy_test/api/test_workflows.py b/lib/galaxy_test/api/test_workflows.py index 05abdb1a232..c4a815353aa 100644 --- a/lib/galaxy_test/api/test_workflows.py +++ b/lib/galaxy_test/api/test_workflows.py @@ -655,7 +655,8 @@ steps: workflow_id = self._post("workflows", data=trs_payload).json()["id"] original_workflow = self._download_workflow(workflow_id) assert "Test Workflow" in original_workflow["name"] - assert original_workflow.get("trs_id") == ":".join((trs_payload["trs_tool_id"], trs_payload["trs_version_id"])) + assert original_workflow.get("trs_tool_id") == trs_payload["trs_tool_id"] + assert original_workflow.get("trs_version_id") == trs_payload["trs_version_id"] # refactor workflow and check that the trs id is removed actions = [ @@ -663,12 +664,12 @@ steps: ] self.workflow_populator.refactor_workflow(workflow_id, actions) refactored_workflow = self._download_workflow(workflow_id) - assert refactored_workflow.get("trs_id") is None + assert refactored_workflow.get("trs_tool_id") is None # reupload original_workflow and check that the trs id is removed reuploaded_workflow_id = self.workflow_populator.create_workflow(original_workflow) reuploaded_workflow = self._download_workflow(reuploaded_workflow_id) - assert reuploaded_workflow.get("trs_id") is None + assert reuploaded_workflow.get("trs_tool_id") is None def test_anonymous_published(self): def anonymous_published_workflows(): From e906565108e5cdf7fa01dcff9c98e3f7706f64c3 Mon Sep 17 00:00:00 2001 From: Simon Bray Date: Wed, 16 Feb 2022 11:54:00 +0100 Subject: [PATCH 4/6] generalize to source_metadata column and set for url uploads; add new column to test_model_mapping --- lib/galaxy/managers/workflows.py | 35 ++++++++++--------- lib/galaxy/model/__init__.py | 3 +- ...181_add_source_metadata_workflow_table.py} | 14 +++----- lib/galaxy_test/api/test_workflows.py | 17 ++++++--- .../data/model/mapping/test_model_mapping.py | 3 ++ 5 files changed, 40 insertions(+), 32 deletions(-) rename lib/galaxy/model/migrate/versions/{0181_add_trs_id_workflow_table.py => 0181_add_source_metadata_workflow_table.py} (50%) diff --git a/lib/galaxy/managers/workflows.py b/lib/galaxy/managers/workflows.py index e2ff8f83ae6..945fc2d3235 100644 --- a/lib/galaxy/managers/workflows.py +++ b/lib/galaxy/managers/workflows.py @@ -524,16 +524,18 @@ class WorkflowContentsManager(UsesAnnotations): workflow.reports_config = data["report"] workflow.license = data.get("license") workflow.creator_metadata = data.get("creator") - if hasattr(workflow_state_resolution_options, "trs_tool_id") and hasattr( - workflow_state_resolution_options, "trs_version_id" - ): - if workflow_state_resolution_options.trs_tool_id and workflow_state_resolution_options.trs_version_id: - workflow.trs_tool_id = workflow_state_resolution_options.trs_tool_id - workflow.trs_version_id = workflow_state_resolution_options.trs_version_id - workflow_state_resolution_options.trs_tool_id, workflow_state_resolution_options.trs_version_id = ( - None, - None, - ) # so trs_id is not set for subworkflows + + if hasattr(workflow_state_resolution_options, "archive_source"): + if workflow_state_resolution_options.archive_source: + source_metadata = {} + if workflow_state_resolution_options.archive_source == "trs_tool": + source_metadata["trs_tool_id"] = workflow_state_resolution_options.trs_tool_id + source_metadata["trs_version_id"] = workflow_state_resolution_options.trs_version_id + source_metadata["trs_server"] = workflow_state_resolution_options.trs_server + elif not workflow_state_resolution_options.archive_source.startswith("file://"): # URL import + source_metadata["url"] = workflow_state_resolution_options.archive_source + workflow_state_resolution_options.archive_source = None # so trs_id is not set for subworkflows + workflow.source_metadata = source_metadata # Assume no errors until we find a step that has some workflow.has_errors = False @@ -859,8 +861,7 @@ class WorkflowContentsManager(UsesAnnotations): data["report"] = workflow.reports_config or {} data["license"] = workflow.license data["creator"] = workflow.creator_metadata - data["trs_tool_id"] = workflow.trs_tool_id - data["trs_version_id"] = workflow.trs_version_id + data["source_metadata"] = workflow.source_metadata data["annotation"] = self.get_item_annotation_str(trans.sa_session, trans.user, stored) or "" output_label_index = set() @@ -1100,10 +1101,8 @@ class WorkflowContentsManager(UsesAnnotations): data["creator"] = workflow.creator_metadata if workflow.license: data["license"] = workflow.license - if workflow.trs_tool_id: - data["trs_tool_id"] = workflow.trs_tool_id - if workflow.trs_version_id: - data["trs_version_id"] = workflow.trs_version_id + if workflow.source_metadata: + data["source_metadata"] = workflow.source_metadata # For each step, rebuild the form and encode the state for step in workflow.steps: # Load from database representation @@ -1654,9 +1653,11 @@ class WorkflowCreateOptions(WorkflowStateResolutionOptions): tool_panel_section_mapping: Dict = {} shed_tool_conf: Optional[str] = None - # for workflows imported by trs id + # for workflows imported by archive source + archive_source: str = "" trs_tool_id: str = "" trs_version_id: str = "" + trs_server: str = "" @property def is_importable(self): diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 976aa7a570d..c49579d97d9 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -6608,8 +6608,7 @@ class Workflow(Base, Dictifiable, RepresentById): reports_config = Column(MutableJSONType) creator_metadata = Column(MutableJSONType) license = Column(TEXT) - trs_tool_id = Column(TEXT) - trs_version_id = Column(TEXT) + source_metadata = Column(MutableJSONType) uuid = Column(UUIDType, nullable=True) steps = relationship( diff --git a/lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py b/lib/galaxy/model/migrate/versions/0181_add_source_metadata_workflow_table.py similarity index 50% rename from lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py rename to lib/galaxy/model/migrate/versions/0181_add_source_metadata_workflow_table.py index b4a1b1c0709..59755972891 100644 --- a/lib/galaxy/model/migrate/versions/0181_add_trs_id_workflow_table.py +++ b/lib/galaxy/model/migrate/versions/0181_add_source_metadata_workflow_table.py @@ -1,5 +1,5 @@ """ -Migration script for adding trs_id column to workflow table. +Migration script for adding source_metadata column to workflow table. """ import logging @@ -7,9 +7,9 @@ import logging from sqlalchemy import ( Column, MetaData, - Text, ) +from galaxy.model.custom_types import JSONType from galaxy.model.migrate.versions.util import ( add_column, drop_column, @@ -24,16 +24,12 @@ def upgrade(migrate_engine): metadata.bind = migrate_engine metadata.reflect() - trs_tool_id_column = Column("trs_tool_id", Text) - add_column(trs_tool_id_column, "workflow", metadata) - - trs_version_id_column = Column("trs_version_id", Text) - add_column(trs_version_id_column, "workflow", metadata) + source_metadata_column = Column("source_metadata", JSONType) + add_column(source_metadata_column, "workflow", metadata) def downgrade(migrate_engine): metadata.bind = migrate_engine metadata.reflect() - drop_column("trs_tool_id", "workflow", metadata) - drop_column("trs_version_id", "workflow", metadata) + drop_column("source_metadata", "workflow", metadata) diff --git a/lib/galaxy_test/api/test_workflows.py b/lib/galaxy_test/api/test_workflows.py index c4a815353aa..d6865f9e70d 100644 --- a/lib/galaxy_test/api/test_workflows.py +++ b/lib/galaxy_test/api/test_workflows.py @@ -645,6 +645,15 @@ steps: other_import_response = self.__import_workflow(workflow_id) self._assert_status_code_is(other_import_response, 403) + def test_url_import(self): + url = "https://raw.githubusercontent.com/galaxyproject/galaxy/release_19.09/test/base/data/test_workflow_1.ga" + workflow_id = self._post("workflows", data={"archive_source": url}).json()["id"] + workflow = self._download_workflow(workflow_id) + assert "TestWorkflow1" in workflow["name"] + assert ( + workflow.get("source_metadata").get("url") == url + ) # disappearance of source_metadata on modification is tested in test_trs_import + def test_trs_import(self): trs_payload = { "archive_source": "trs_tool", @@ -655,8 +664,8 @@ steps: workflow_id = self._post("workflows", data=trs_payload).json()["id"] original_workflow = self._download_workflow(workflow_id) assert "Test Workflow" in original_workflow["name"] - assert original_workflow.get("trs_tool_id") == trs_payload["trs_tool_id"] - assert original_workflow.get("trs_version_id") == trs_payload["trs_version_id"] + assert original_workflow.get("source_metadata").get("trs_tool_id") == trs_payload["trs_tool_id"] + assert original_workflow.get("source_metadata").get("trs_version_id") == trs_payload["trs_version_id"] # refactor workflow and check that the trs id is removed actions = [ @@ -664,12 +673,12 @@ steps: ] self.workflow_populator.refactor_workflow(workflow_id, actions) refactored_workflow = self._download_workflow(workflow_id) - assert refactored_workflow.get("trs_tool_id") is None + assert refactored_workflow.get("source_metadata") is None # reupload original_workflow and check that the trs id is removed reuploaded_workflow_id = self.workflow_populator.create_workflow(original_workflow) reuploaded_workflow = self._download_workflow(reuploaded_workflow_id) - assert reuploaded_workflow.get("trs_tool_id") is None + assert reuploaded_workflow.get("source_metadata") is None def test_anonymous_published(self): def anonymous_published_workflows(): diff --git a/test/unit/data/model/mapping/test_model_mapping.py b/test/unit/data/model/mapping/test_model_mapping.py index 8db4c8eae9e..402e19a1001 100644 --- a/test/unit/data/model/mapping/test_model_mapping.py +++ b/test/unit/data/model/mapping/test_model_mapping.py @@ -5356,6 +5356,7 @@ class TestWorkflow(BaseTest): reports_config = "b" creator_metadata = "c" license = "d" + source_metadata = "e" uuid = uuid4() obj = cls_() @@ -5369,6 +5370,7 @@ class TestWorkflow(BaseTest): obj.reports_config = reports_config obj.creator_metadata = creator_metadata obj.license = license + obj.source_metadata = source_metadata obj.uuid = uuid with dbcleanup(session, obj) as obj_id: @@ -5384,6 +5386,7 @@ class TestWorkflow(BaseTest): assert stored_obj.reports_config == reports_config assert stored_obj.creator_metadata == creator_metadata assert stored_obj.license == license + assert stored_obj.source_metadata == source_metadata assert stored_obj.uuid == uuid def test_relationships(self, session, cls_, stored_workflow, workflow, workflow_step_factory): From f3c07cfceff7f06ccb1472dcf8a3392e9d79a95e Mon Sep 17 00:00:00 2001 From: Simon Bray Date: Wed, 16 Feb 2022 12:17:39 +0100 Subject: [PATCH 5/6] change workflow table MutableJSONType columns to JSONType --- lib/galaxy/model/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index c49579d97d9..6eb232e4622 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -6605,10 +6605,10 @@ class Workflow(Base, Dictifiable, RepresentById): name = Column(TEXT) has_cycles = Column(Boolean) has_errors = Column(Boolean) - reports_config = Column(MutableJSONType) - creator_metadata = Column(MutableJSONType) + reports_config = Column(JSONType) + creator_metadata = Column(JSONType) license = Column(TEXT) - source_metadata = Column(MutableJSONType) + source_metadata = Column(JSONType) uuid = Column(UUIDType, nullable=True) steps = relationship( From da88dedbf0f902a60cbb38683cf70a2842380de7 Mon Sep 17 00:00:00 2001 From: Simon Bray Date: Wed, 16 Feb 2022 13:14:23 +0100 Subject: [PATCH 6/6] fix test_metadata_mutable_column test --- test/unit/data/test_mutable_json_column.py | 66 +++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/test/unit/data/test_mutable_json_column.py b/test/unit/data/test_mutable_json_column.py index 95a36ec7934..81788af4bda 100644 --- a/test/unit/data/test_mutable_json_column.py +++ b/test/unit/data/test_mutable_json_column.py @@ -9,64 +9,64 @@ class MutableColumnTest(BaseModelTestCase): item_id = item.id self.model.session.flush() self.model.session.expunge_all() - return self.model.session.query(model.Workflow).get(item_id) + return self.model.session.query(model.DynamicTool).get(item_id) def test_metadata_mutable_column(self): - w = model.Workflow() + w = model.DynamicTool() self.model.session.add(w) self.model.session.flush() - w.reports_config = {"x": "z"} + w.value = {"x": "z"} persisted = self.persist_and_reload(w) - assert persisted.reports_config == {"x": "z"} - persisted.reports_config["x"] = "1" + assert persisted.value == {"x": "z"} + persisted.value["x"] = "1" persisted = self.persist_and_reload(persisted) - assert persisted.reports_config["x"] == "1" + assert persisted.value["x"] == "1" # test string - persisted.reports_config = "abcdefg" + persisted.value = "abcdefg" persisted = self.persist_and_reload(persisted) - assert persisted.reports_config == "abcdefg" + assert persisted.value == "abcdefg" # test int - persisted.reports_config = 1 + persisted.value = 1 persisted = self.persist_and_reload(persisted) - assert persisted.reports_config == 1 + assert persisted.value == 1 # test float - persisted.reports_config = 1.1 + persisted.value = 1.1 persisted = self.persist_and_reload(persisted) - assert persisted.reports_config == 1.1 + assert persisted.value == 1.1 # test bool - persisted.reports_config = True + persisted.value = True persisted = self.persist_and_reload(persisted) - assert persisted.reports_config is True + assert persisted.value is True # Test nested dict/list - persisted.reports_config = {"list": [[1, 2, 3]]} + persisted.value = {"list": [[1, 2, 3]]} persisted = self.persist_and_reload(persisted) - assert persisted.reports_config == {"list": [[1, 2, 3]]} - copy.deepcopy(persisted.reports_config) - assert persisted.reports_config.pop("list") == [[1, 2, 3]] + assert persisted.value == {"list": [[1, 2, 3]]} + copy.deepcopy(persisted.value) + assert persisted.value.pop("list") == [[1, 2, 3]] persisted = self.persist_and_reload(persisted) - assert persisted.reports_config == {} - persisted.reports_config.update({"x": "z"}) + assert persisted.value == {} + persisted.value.update({"x": "z"}) persisted = self.persist_and_reload(persisted) - assert persisted.reports_config == {"x": "z"} - del persisted.reports_config["x"] + assert persisted.value == {"x": "z"} + del persisted.value["x"] persisted = self.persist_and_reload(persisted) - assert persisted.reports_config == {} - persisted.reports_config = {"x": {"y": "z"}} + assert persisted.value == {} + persisted.value = {"x": {"y": "z"}} persisted = self.persist_and_reload(persisted) - assert persisted.reports_config == {"x": {"y": "z"}} + assert persisted.value == {"x": {"y": "z"}} # These tests are failing ... at least since 20.09, # but nested mutable change tracking might have # never worked - # persisted.reports_config['x']['y'] = 'x' + # persisted.value['x']['y'] = 'x' # persisted = self.persist_and_reload(persisted) - # assert persisted.reports_config == {'x': {'y': 'x'}} - # persisted.reports_config[0].append(2) + # assert persisted.value == {'x': {'y': 'x'}} + # persisted.value[0].append(2) # persisted = self.persist_and_reload(persisted) - # assert persisted.reports_config[0] == [1, 2] - # persisted.reports_config[0].extend([3, 4]) + # assert persisted.value[0] == [1, 2] + # persisted.value[0].extend([3, 4]) # persisted = self.persist_and_reload(persisted) - # assert persisted.reports_config[0] == [1, 2, 3, 4] - # persisted.reports_config[0].remove(4) + # assert persisted.value[0] == [1, 2, 3, 4] + # persisted.value[0].remove(4) # persisted = self.persist_and_reload(persisted) - # assert persisted.reports_config[0] == [1, 2, 3] + # assert persisted.value[0] == [1, 2, 3]