From 82c96257c1c9a44a19140bdab68a6148df42d38a Mon Sep 17 00:00:00 2001 From: Laila Los <44241786+ElectronicBlueberry@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:55:01 +0100 Subject: [PATCH 01/17] fallback to test_param.name --- client/src/components/Form/FormInputs.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/Form/FormInputs.vue b/client/src/components/Form/FormInputs.vue index dd3ab93c4c3..c6524ab671d 100644 --- a/client/src/components/Form/FormInputs.vue +++ b/client/src/components/Form/FormInputs.vue @@ -3,7 +3,7 @@
- {{ input.test_param.label }} + {{ input.test_param.label || input.test_param.name }}
Date: Wed, 1 Nov 2023 11:34:06 +0100 Subject: [PATCH 02/17] adds `biii` as supported xref reference type --- lib/galaxy/tool_util/xsd/galaxy.xsd | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/tool_util/xsd/galaxy.xsd b/lib/galaxy/tool_util/xsd/galaxy.xsd index d73ea5f9062..d0cc160e073 100644 --- a/lib/galaxy/tool_util/xsd/galaxy.xsd +++ b/lib/galaxy/tool_util/xsd/galaxy.xsd @@ -7275,6 +7275,7 @@ A tool can refer multiple reference IDs. dada2 dada2 + dada2 ``` @@ -7295,7 +7296,7 @@ information according to a catalog. - Type of reference - currently ``bio.tools`` and ``bioconductor`` are + Type of reference - currently ``bio.tools``, ``bioconductor``, and ``biii`` are the only supported options. @@ -7309,6 +7310,7 @@ the only supported options. + From 055afb6b3709e8e7d09d8957150cd1bc950b8304 Mon Sep 17 00:00:00 2001 From: Leonid Kostrykin Date: Wed, 1 Nov 2023 12:01:31 +0100 Subject: [PATCH 03/17] fixes example for xref references --- lib/galaxy/tool_util/xsd/galaxy.xsd | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/galaxy/tool_util/xsd/galaxy.xsd b/lib/galaxy/tool_util/xsd/galaxy.xsd index d0cc160e073..01ac39775ac 100644 --- a/lib/galaxy/tool_util/xsd/galaxy.xsd +++ b/lib/galaxy/tool_util/xsd/galaxy.xsd @@ -7275,7 +7275,6 @@ A tool can refer multiple reference IDs. dada2 dada2 - dada2 ``` From bc5aca07a6a5891254d61248c0d6f100548644ac Mon Sep 17 00:00:00 2001 From: Ahmed Awan Date: Wed, 1 Nov 2023 17:54:52 -0500 Subject: [PATCH 04/17] [23.1] Prevent Singular external auth users from disconnecting identity Added a `fixed_delegated_path` variable to the `ConfigSerializer` that lets us reroute users to home if we have a Galaxy set up with: ``` config.enable_oidc and len(config.oidc) == 1 and len(auth_manager.authenticators) == 0 ``` as in; we only have 1 external auth and no local authenticator, hence, we don't want users to be disconnecting the external provider. --- .../src/components/User/UserPreferences.vue | 2 +- client/src/entry/analysis/router.js | 2 +- lib/galaxy/authnz/custos_authnz.py | 28 +++++++++++-------- lib/galaxy/managers/configuration.py | 6 ++++ 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/client/src/components/User/UserPreferences.vue b/client/src/components/User/UserPreferences.vue index ba1e72b31cb..65004f54af4 100644 --- a/client/src/components/User/UserPreferences.vue +++ b/client/src/components/User/UserPreferences.vue @@ -49,7 +49,7 @@ to="/user/cloud_auth" /> Date: Thu, 2 Nov 2023 13:35:21 -0500 Subject: [PATCH 05/17] generate `fixed_delegated_auth` in core config, instead of serializer --- lib/galaxy/app.py | 7 +++++++ lib/galaxy/authnz/custos_authnz.py | 16 ++-------------- lib/galaxy/config/__init__.py | 1 + lib/galaxy/managers/configuration.py | 7 +------ 4 files changed, 11 insertions(+), 20 deletions(-) diff --git a/lib/galaxy/app.py b/lib/galaxy/app.py index e7abc7c35ee..9351167634e 100644 --- a/lib/galaxy/app.py +++ b/lib/galaxy/app.py @@ -709,6 +709,13 @@ class UniverseApplication(StructuredApp, GalaxyManagerApplication): self, self.config.oidc_config_file, self.config.oidc_backends_config_file ) + # If there is only a single external authentication provider in use + # TODO: Future work will expand on this and provide an interface for + # multiple auth providers allowing explicit authenticated association. + self.config.fixed_delegated_auth = ( + len(list(self.config.oidc)) == 1 and len(list(self.auth_manager.authenticators)) == 0 + ) + if not self.config.enable_celery_tasks and self.config.history_audit_table_prune_interval > 0: self.prune_history_audit_task = IntervalTask( func=lambda: galaxy.model.HistoryAudit.prune(self.model.session), diff --git a/lib/galaxy/authnz/custos_authnz.py b/lib/galaxy/authnz/custos_authnz.py index aba22d2649f..c066fb0d1e5 100644 --- a/lib/galaxy/authnz/custos_authnz.py +++ b/lib/galaxy/authnz/custos_authnz.py @@ -189,21 +189,9 @@ class CustosAuthnz(IdentityProvider): if custos_authnz_token is None: user = trans.user existing_user = trans.sa_session.query(User).filter_by(email=email).first() - # If there is only a single external authentication - # provider in use, trust the user provided and - # automatically associate. - # Equivalent to `fixed_delegated_auth` from `ConfigSerializer` - # TODO: Future work will expand on this and provide an - # interface for when there are multiple auth providers - # allowing explicit authenticated association. - fixed_delegated_auth = ( - trans.app.config.enable_oidc - and len(trans.app.config.oidc) == 1 - and len(trans.app.auth_manager.authenticators) == 0 - ) if not user: if existing_user: - if fixed_delegated_auth: + if trans.app.config.fixed_delegated_auth: user = existing_user else: message = f"There already exists a user with email {email}. To associate this external login, you must first be logged in as that existing account." @@ -235,7 +223,7 @@ class CustosAuthnz(IdentityProvider): refresh_expiration_time=refresh_expiration_time, ) label = self.config["label"] - if fixed_delegated_auth: + if trans.app.config.fixed_delegated_auth: redirect_url = login_redirect_url elif existing_user and existing_user != user: redirect_url = ( diff --git a/lib/galaxy/config/__init__.py b/lib/galaxy/config/__init__.py index 2cc29a02743..4601fe34151 100644 --- a/lib/galaxy/config/__init__.py +++ b/lib/galaxy/config/__init__.py @@ -857,6 +857,7 @@ class GalaxyAppConfiguration(BaseAppConfiguration, CommonConfigurationMixin): self.builds_file_path = os.path.join(self.tool_data_path, self.builds_file_path) self.len_file_path = os.path.join(self.tool_data_path, self.len_file_path) self.oidc: Dict[str, Dict] = {} + self.fixed_delegated_auth: bool = False self.integrated_tool_panel_config = self._in_managed_config_dir(self.integrated_tool_panel_config) integrated_tool_panel_tracking_directory = kwargs.get("integrated_tool_panel_tracking_directory") if integrated_tool_panel_tracking_directory: diff --git a/lib/galaxy/managers/configuration.py b/lib/galaxy/managers/configuration.py index 46e6112f82f..f1e149c869a 100644 --- a/lib/galaxy/managers/configuration.py +++ b/lib/galaxy/managers/configuration.py @@ -113,7 +113,6 @@ class ConfigSerializer(base.ModelSerializer): return True if item.get(key) else False object_store = self.app.object_store - auth_manager = self.app.auth_manager self.serializers: Dict[str, base.Serializer] = { # TODO: this is available from user data, remove "is_admin_user": lambda *a, **c: False, @@ -209,11 +208,7 @@ class ConfigSerializer(base.ModelSerializer): "tool_training_recommendations_link": _use_config, "tool_training_recommendations_api_url": _use_config, "enable_notification_system": _use_config, - "fixed_delegated_auth": lambda item, key, **context: ( - bool(item.get("enable_oidc")) - and len(list(_use_config(item, "oidc", **context))) == 1 - and len(list(auth_manager.authenticators)) == 0 - ), + "fixed_delegated_auth": _defaults_to(False), } From c169add894bc4ab87b6b12e47110a2995b8d551d Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Thu, 2 Nov 2023 14:59:32 -0400 Subject: [PATCH 06/17] Update mocked app config for custos tests --- test/unit/app/authnz/test_custos_authnz.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unit/app/authnz/test_custos_authnz.py b/test/unit/app/authnz/test_custos_authnz.py index fd73e3bb2f0..6f49c453eb5 100644 --- a/test/unit/app/authnz/test_custos_authnz.py +++ b/test/unit/app/authnz/test_custos_authnz.py @@ -97,6 +97,7 @@ class TestCustosAuthnz(TestCase): self.trans.app.config.enable_oidc = True self.trans.app.config.oidc = [] self.trans.app.auth_manager.authenticators = [] + self.trans.app.config.fixed_delegated_auth = False @property def test_id_token(self): From d8f490ff4adf7d9efde34eb844b118a831415d19 Mon Sep 17 00:00:00 2001 From: Nicola Soranzo Date: Mon, 6 Nov 2023 14:52:31 +0000 Subject: [PATCH 07/17] Workaround issue in routes Fix the following traceback: ``` Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: uvicorn.access INFO 2023-06-30 10:28:03,573 [pN:main.1,p:3528860,tN:MainThread] 193.156.42.8:0 - "HEAD /root/login HTTP/1.0" 500 Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: Exception in supplement: Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: Traceback (most recent call last): Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: File "/cluster/galaxy-test/srv/galaxy/server/lib/galaxy/web/framework/middleware/error.py", line 165, in __call__ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: app_iter = self.application(environ, sr_checker) Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: File "/cluster/galaxy-test/srv/galaxy/venv/lib64/python3.11/site-packages/paste/recursive.py", line 85, in __call__ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: return self.application(environ, start_response) Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: File "/cluster/galaxy-test/srv/galaxy/venv/lib64/python3.11/site-packages/paste/httpexceptions.py", line 640, in __call__ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: return self.application(environ, start_response) Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: File "/cluster/galaxy-test/srv/galaxy/server/lib/galaxy/web/framework/base.py", line 167, in __call__ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: return self.handle_request(environ, start_response) Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: File "/cluster/galaxy-test/srv/galaxy/server/lib/galaxy/web/framework/base.py", line 221, in handle_request Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: rc.environ = environ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: ^^^^^^^^^^ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: File "/cluster/galaxy-test/srv/galaxy/venv/lib64/python3.11/site-packages/routes/__init__.py", line 23, in __setattr__ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: self.load_wsgi_environ(value) Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: File "/cluster/galaxy-test/srv/galaxy/venv/lib64/python3.11/site-packages/routes/__init__.py", line 73, in load_wsgi_environ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: self.__shared_state.host += ':' + environ['SERVER_PORT'] Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: ~~~~^~~~~~~~~~~~~~~~~~~~~~~~ Jun 30 10:28:03 galaxy01-test.educloud.no galaxyctl[3528286]: TypeError: can only concatenate str (not "int") to str ``` Reported by @vazovn : https://matrix.to/#/!rfLDbcWEWZapZrujix:gitter.im/$McOyd5Kmp-w-Z-bYbRUV42K30YhVvwRJtrCaxru-yf4?via=gitter.im&via=matrix.org --- lib/galaxy/web/framework/base.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/galaxy/web/framework/base.py b/lib/galaxy/web/framework/base.py index fef6c377cc6..70b5bb769e2 100644 --- a/lib/galaxy/web/framework/base.py +++ b/lib/galaxy/web/framework/base.py @@ -222,6 +222,12 @@ class WebApplication: rc = routes.request_config() rc.mapper = self.mapper rc.mapper_dict = map_match + server_port = environ["SERVER_PORT"] + if isinstance(server_port, int): + # Workaround bug in the routes package, which would concatenate this + # without casting to str in + # https://github.com/bbangert/routes/blob/c4d5a5fb693ce8dc7cf5dbc591861acfc49d5c23/routes/__init__.py#L73 + environ["SERVER_PORT"] = str(server_port) rc.environ = environ # Setup the transaction trans = self.transaction_factory(environ) From 4e15e6929ef241d4d6428f84be14955f98c29cc4 Mon Sep 17 00:00:00 2001 From: Lucille Delisle Date: Fri, 3 Nov 2023 08:35:06 +0100 Subject: [PATCH 08/17] Fix maf_thread_for_species.py --- tools/maf/maf_thread_for_species.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tools/maf/maf_thread_for_species.py b/tools/maf/maf_thread_for_species.py index 6da4c522b9d..67a53394790 100644 --- a/tools/maf/maf_thread_for_species.py +++ b/tools/maf/maf_thread_for_species.py @@ -14,10 +14,7 @@ import sys import bx.align.maf from bx.align.tools.fuse import FusingAlignmentWriter -from bx.align.tools.thread import ( - get_components_for_species, - remove_all_gap_columns, -) +from bx.align.tools.thread import get_components_for_species def main(): @@ -41,9 +38,9 @@ def main(): if species != ["None"]: new_components = get_components_for_species(m, species) if new_components: - remove_all_gap_columns(new_components) m.components = new_components m.score = 0.0 + m.remove_all_gap_columns() maf_writer.write(m) except Exception as e: print("Error steping through MAF File: %s" % e, file=sys.stderr) From 496ecc22b230a78f3e1d1e94506771a6c9477211 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Tue, 7 Nov 2023 10:46:45 -0500 Subject: [PATCH 09/17] Fixes rendering of an empty page by ensuring default content, even if empty. --- client/src/components/Markdown/Markdown.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/Markdown/Markdown.vue b/client/src/components/Markdown/Markdown.vue index 3ea876b4167..75a3afdbdfd 100644 --- a/client/src/components/Markdown/Markdown.vue +++ b/client/src/components/Markdown/Markdown.vue @@ -167,7 +167,7 @@ export default { initConfig() { if (Object.keys(this.markdownConfig).length) { const config = this.markdownConfig; - const markdown = config.content || config.markdown; + const markdown = config.content || config.markdown || ""; this.markdownErrors = config.errors || []; this.markdownObjects = this.splitMarkdown(markdown); this.datasets = config.history_datasets || {}; From 5566be02ab85fb7ef1217e31b12555a21b9ed16b Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 2 Nov 2023 14:08:56 +0100 Subject: [PATCH 10/17] Don't store job in JobIO instance attributes and invalidate `_output_hdas_and_paths` when current session is not the same session that was used to populate `_output_hdas_and_paths`. The Job instance may originate from a session that is associated to another thread, and when that thread closes the session the instance (along with other instances retrieved through loading relationships) becomes detached. I am not sure at all if this will fix ``` DetachedInstanceError: Instance is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/14/bhk3) File "galaxy/jobs/runners/__init__.py", line 291, in prepare_job job_wrapper.prepare() File "galaxy/jobs/__init__.py", line 1248, in prepare tool_evaluator.set_compute_environment(compute_environment, get_special=get_special) File "galaxy/tools/evaluation.py", line 162, in set_compute_environment self.param_dict = self.build_param_dict( File "galaxy/tools/evaluation.py", line 204, in build_param_dict self.__populate_output_dataset_wrappers(param_dict, output_datasets, job_working_directory) File "galaxy/tools/evaluation.py", line 447, in __populate_output_dataset_wrappers param_dict[name] = DatasetFilenameWrapper( File "galaxy/tools/wrappers.py", line 403, in __init__ path_rewrite = compute_environment and compute_environment.output_path_rewrite(dataset_instance) File "galaxy/job_execution/compute_environment.py", line 132, in output_path_rewrite return str(self.job_io.get_output_path(dataset)) File "galaxy/job_execution/setup.py", line 226, in get_output_path if hda.id == dataset.id: File "sqlalchemy/orm/attributes.py", line 487, in __get__ return self.impl.get(state, dict_) File "sqlalchemy/orm/attributes.py", line 959, in get value = self._fire_loader_callables(state, key, passive) File "sqlalchemy/orm/attributes.py", line 990, in _fire_loader_callables return state._load_expired(state, passive) File "sqlalchemy/orm/state.py", line 712, in _load_expired self.manager.expired_attribute_loader(self, toload, passive) File "sqlalchemy/orm/loading.py", line 1369, in load_scalar_attributes raise orm_exc.DetachedInstanceError( ``` but it seems to make some sense. JobIO crosses thread boundaries as part of the job wrapper getting put into threading queues. Ideally we'd make sure that no ORM instance crosses the thread boundary (or we systematically re-associated with a session). I also tried flagging these patterns automatically using something like: ``` @event.listens_for(session, "persistent_to_detached") def on_detach(sess, instance): if not getattr(instance, "allow_detatch", False): raise Exception(f"{instance} detached. This ain't good for how we do things ?") ``` but it seems tricky to figure out when this is fine and when it is not. --- lib/galaxy/job_execution/setup.py | 65 ++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/lib/galaxy/job_execution/setup.py b/lib/galaxy/job_execution/setup.py index cfa281a329c..0bfb5e87825 100644 --- a/lib/galaxy/job_execution/setup.py +++ b/lib/galaxy/job_execution/setup.py @@ -1,11 +1,13 @@ """Utilities to help job and tool code setup jobs.""" import json import os +import threading from typing import ( Any, cast, Dict, List, + NamedTuple, Optional, Tuple, Union, @@ -38,6 +40,27 @@ OutputHdasAndType = Dict[str, Tuple[DatasetInstance, DatasetPath]] OutputPaths = List[DatasetPath] +class JobOutput(NamedTuple): + output_name: str + dataset: DatasetInstance + dataset_path: DatasetPath + + +class JobOutputs(threading.local): + def __init__(self) -> None: + super().__init__() + self.output_hdas_and_paths: Optional[OutputHdasAndType] = None + self.output_paths: Optional[OutputPaths] = None + + @property + def populated(self) -> bool: + return self.output_hdas_and_paths is not None + + def set_job_outputs(self, job_outputs: List[JobOutput]) -> None: + self.output_paths = [t[2] for t in job_outputs] + self.output_hdas_and_paths = {t.output_name: (t.dataset, t.dataset_path) for t in job_outputs} + + class JobIO(Dictifiable): dict_collection_visible_keys = ( "job_id", @@ -99,7 +122,6 @@ class JobIO(Dictifiable): user_context_instance = user_context self.user_context = user_context_instance self.sa_session = sa_session - self.job = job self.job_id = job.id self.working_directory = working_directory self.outputs_directory = outputs_directory @@ -121,25 +143,33 @@ class JobIO(Dictifiable): self.is_task = is_task self.tool_source = tool_source self.tool_source_class = tool_source_class - self._output_paths: Optional[OutputPaths] = None - self._output_hdas_and_paths: Optional[OutputHdasAndType] = None + self.job_outputs = JobOutputs() self._dataset_path_rewriter: Optional[DatasetPathRewriter] = None + @property + def job(self): + return self.sa_session.query(Job).get(self.job_id) + @classmethod def from_json(cls, path, sa_session): with open(path) as job_io_serialized: io_dict = json.load(job_io_serialized) - return cls.from_dict(io_dict=io_dict, sa_session=sa_session) - - @classmethod - def from_dict(cls, io_dict, sa_session): - io_dict.pop("model_class") + # Drop in 24.0 + io_dict.pop("model_class", None) job_id = io_dict.pop("job_id") job = sa_session.query(Job).get(job_id) return cls(sa_session=sa_session, job=job, **io_dict) + @classmethod + def from_dict(cls, io_dict, sa_session): + # Drop in 24.0 + io_dict.pop("model_class", None) + return cls(sa_session=sa_session, **io_dict) + def to_dict(self): io_dict = super().to_dict() + # dict_for will always add `model_class`, we don't need or want it + io_dict.pop("model_class") io_dict["user_context"] = self.user_context.to_dict() return io_dict @@ -165,15 +195,15 @@ class JobIO(Dictifiable): @property def output_paths(self) -> OutputPaths: - if self._output_paths is None: + if not self.job_outputs.populated: self.compute_outputs() - return cast(OutputPaths, self._output_paths) + return cast(OutputPaths, self.job_outputs.output_paths) @property def output_hdas_and_paths(self) -> OutputHdasAndType: - if self._output_hdas_and_paths is None: + if not self.job_outputs.populated: self.compute_outputs() - return cast(OutputHdasAndType, self._output_hdas_and_paths) + return cast(OutputHdasAndType, self.job_outputs.output_hdas_and_paths) def get_input_dataset_fnames(self, ds: DatasetInstance) -> List[str]: filenames = [ds.file_name] @@ -241,22 +271,21 @@ class JobIO(Dictifiable): special = self.sa_session.query(JobExportHistoryArchive).filter_by(job=job).first() false_path = None - results = [] + job_outputs = [] for da in job.output_datasets + job.output_library_datasets: da_false_path = dataset_path_rewriter.rewrite_dataset_path(da.dataset, "output") mutable = da.dataset.dataset.external_filename is None dataset_path = DatasetPath( da.dataset.dataset.id, da.dataset.file_name, false_path=da_false_path, mutable=mutable ) - results.append((da.name, da.dataset, dataset_path)) + job_outputs.append(JobOutput(da.name, da.dataset, dataset_path)) - self._output_paths = [t[2] for t in results] - self._output_hdas_and_paths = {t[0]: t[1:] for t in results} if special: false_path = dataset_path_rewriter.rewrite_dataset_path(special, "output") dsp = DatasetPath(special.dataset.id, special.dataset.file_name, false_path) - self._output_paths.append(dsp) - self._output_hdas_and_paths["output_file"] = (special.fda, dsp) + job_outputs.append(JobOutput("output_file", special.fda, dsp)) + + self.job_outputs.set_job_outputs(job_outputs) def get_output_file_id(self, file: str) -> Optional[int]: for dp in self.output_paths: From 2af38ac03e6c883457a863281202c3d2a69c9a7e Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 8 Nov 2023 16:29:24 -0500 Subject: [PATCH 11/17] Update 23.1 client package version. --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index fbeefeb1b59..d7d4acc39a3 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@galaxyproject/galaxy-client", - "version": "23.0.0", + "version": "23.1.0", "description": "Galaxy client application build system", "keywords": [ "galaxy" From 97d09ce3978e35e315d5c8f8da0a8c188cdfb90a Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 8 Nov 2023 16:29:42 -0500 Subject: [PATCH 12/17] Update Galaxy client installer package version for 23.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cefe179d0bc..d12d61d37f5 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "homepage": "https://github.com/galaxyproject/galaxy#readme", "dependencies": { - "@galaxyproject/galaxy-client": "^23.0.0", + "@galaxyproject/galaxy-client": "^23.1.0", "cpy-cli": "^4.2.0", "vuedraggable": "^2.24.3" } From cb5d18ddf3166e174fd51b835e9bb5ec44c1e23a Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 8 Nov 2023 16:34:27 -0500 Subject: [PATCH 13/17] Drop unused, unintentionally added package from galaxy client installer --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index d12d61d37f5..969f7686650 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "homepage": "https://github.com/galaxyproject/galaxy#readme", "dependencies": { "@galaxyproject/galaxy-client": "^23.1.0", - "cpy-cli": "^4.2.0", - "vuedraggable": "^2.24.3" + "cpy-cli": "^4.2.0" } } From dc6af21ed85ea4675d77df752f2f665aa79485f3 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 8 Nov 2023 16:37:10 -0500 Subject: [PATCH 14/17] Link installer package to galaxy release version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 969f7686650..5a88c66c170 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@galaxyproject/galaxy", - "version": "1.0.0", + "version": "23.1.0", "description": ".. figure:: https://galaxyproject.org/images/galaxy-logos/galaxy_project_logo.jpg :alt: Galaxy Logo", "main": "index.js", "devDependencies": {}, From 4a2dc9ebe08f49398d4fc9a5001c97cf0d8b6d7d Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 8 Nov 2023 16:51:06 -0500 Subject: [PATCH 15/17] Clean rebuild and publish --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index d7d4acc39a3..d58aa811266 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@galaxyproject/galaxy-client", - "version": "23.1.0", + "version": "23.1.1", "description": "Galaxy client application build system", "keywords": [ "galaxy" From f0c5024fe961a78ffa2fcab0ad811980f24ca2fd Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 8 Nov 2023 16:53:28 -0500 Subject: [PATCH 16/17] Update installer package to 23.1.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5a88c66c170..77fc944216d 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "homepage": "https://github.com/galaxyproject/galaxy#readme", "dependencies": { - "@galaxyproject/galaxy-client": "^23.1.0", + "@galaxyproject/galaxy-client": "^23.1.1", "cpy-cli": "^4.2.0" } } From 2e92765e1bd93b8f063d2bb36b9d8954bb9a1ae1 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 8 Nov 2023 16:58:47 -0500 Subject: [PATCH 17/17] Update cpy-cli utility. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 77fc944216d..8f48deaef7e 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,6 @@ "homepage": "https://github.com/galaxyproject/galaxy#readme", "dependencies": { "@galaxyproject/galaxy-client": "^23.1.1", - "cpy-cli": "^4.2.0" + "cpy-cli": "^5.0.0" } }