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"
}
}