mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-08-30 16:58:03 +08:00
Merge branch 'release_26.1' into dev
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
import { getLocalVue } from "@tests/vitest/helpers";
|
||||
import { mount } from "@vue/test-utils";
|
||||
import flushPromises from "flush-promises";
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
import Webhook from "./Webhook.vue";
|
||||
|
||||
const { WEBHOOK, targetExistsAtInjection } = vi.hoisted(() => ({
|
||||
WEBHOOK: { id: "phdcomics", type: ["tool"], weight: 1, script: "/* noop */", styles: "" },
|
||||
// Records whether the target mount point existed in the document at the
|
||||
// moment the webhook script would have been injected.
|
||||
targetExistsAtInjection: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock("@/utils/webhooks", () => ({
|
||||
loadWebhooks: vi.fn().mockResolvedValue([WEBHOOK]),
|
||||
pickWebhook: vi.fn().mockReturnValue(WEBHOOK),
|
||||
}));
|
||||
|
||||
vi.mock("@/utils/utils", () => ({
|
||||
appendScriptStyle: (data: { id?: string }) => {
|
||||
targetExistsAtInjection(Boolean(data.id && document.getElementById(data.id)));
|
||||
},
|
||||
}));
|
||||
|
||||
const localVue = getLocalVue();
|
||||
|
||||
describe("Webhook.vue", () => {
|
||||
beforeEach(() => {
|
||||
targetExistsAtInjection.mockClear();
|
||||
});
|
||||
|
||||
it("renders the webhook mount point before injecting its script", async () => {
|
||||
mount(Webhook as object, {
|
||||
localVue,
|
||||
propsData: { type: "tool", toolId: "cat1", toolVersion: "1.0" },
|
||||
attachTo: document.body,
|
||||
});
|
||||
|
||||
await flushPromises();
|
||||
|
||||
expect(targetExistsAtInjection).toHaveBeenCalledTimes(1);
|
||||
// Injected script queries `#<webhookId>`; that div must exist when it runs.
|
||||
expect(targetExistsAtInjection).toHaveBeenCalledWith(true);
|
||||
});
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
<script setup lang="ts">
|
||||
import { onMounted, ref } from "vue";
|
||||
import { nextTick, onMounted, ref } from "vue";
|
||||
|
||||
import { appendScriptStyle } from "@/utils/utils";
|
||||
import { loadWebhooks, pickWebhook } from "@/utils/webhooks";
|
||||
@@ -28,6 +28,9 @@ onMounted(async () => {
|
||||
if (webhooks.length > 0) {
|
||||
const model = pickWebhook(webhooks);
|
||||
webhookId.value = model.id;
|
||||
// Wait for the `#<webhookId>` mount point to render before injecting the
|
||||
// webhook script, which targets that element as soon as it executes.
|
||||
await nextTick();
|
||||
appendScriptStyle(model);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -46,6 +46,8 @@ const props = withDefaults(defineProps<Props>(), {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
.progress-container {
|
||||
position: relative;
|
||||
|
||||
@@ -300,8 +300,7 @@ watch(
|
||||
.delete-terminal-button {
|
||||
position: absolute;
|
||||
left: calc(-0.65rem - 5px);
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
top: 0.25rem;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 0;
|
||||
|
||||
@@ -108,9 +108,17 @@ const isVisible = computed(() => {
|
||||
|
||||
const visibleHint = computed(() => {
|
||||
if (isVisible.value) {
|
||||
return `Output will be visible in history. Click to hide output.`;
|
||||
return `Output will be visible in history.${!props.readonly ? " Click to hide output." : ""}`;
|
||||
} else {
|
||||
return `Output will be hidden in history. Click to make output visible.`;
|
||||
return `Output will be hidden in history.${!props.readonly ? " Click to make output visible." : ""}`;
|
||||
}
|
||||
});
|
||||
|
||||
const activeOutputHint = computed(() => {
|
||||
if (!props.readonly) {
|
||||
return "Checked outputs will become primary workflow outputs and are available as subworkflow outputs.";
|
||||
} else {
|
||||
return "Checked outputs are primary workflow outputs and are available as subworkflow outputs.";
|
||||
}
|
||||
});
|
||||
|
||||
@@ -350,13 +358,13 @@ const removeTagsAction = computed(() => {
|
||||
<template>
|
||||
<div class="node-output" :class="rowClass" :data-output-name="output.name">
|
||||
<div v-if="!props.blank" class="d-flex flex-column w-100">
|
||||
<div class="node-output-buttons">
|
||||
<div class="node-output-buttons align-items-start">
|
||||
<button
|
||||
v-if="showCalloutActiveOutput"
|
||||
v-g-tooltip
|
||||
class="callout-terminal inline-icon-button mark-terminal"
|
||||
:class="{ 'mark-terminal-active': workflowOutput }"
|
||||
title="Checked outputs will become primary workflow outputs and are available as subworkflow outputs."
|
||||
:class="{ 'mark-terminal-active': workflowOutput, 'readonly-button': readonly }"
|
||||
:title="activeOutputHint"
|
||||
@click="onToggleActive">
|
||||
<FontAwesomeIcon v-if="workflowOutput" fixed-width :icon="faCheckSquare" />
|
||||
<FontAwesomeIcon v-else fixed-width :icon="faSquare" />
|
||||
@@ -365,7 +373,11 @@ const removeTagsAction = computed(() => {
|
||||
v-if="showCalloutVisible"
|
||||
v-g-tooltip
|
||||
class="callout-terminal inline-icon-button mark-terminal"
|
||||
:class="{ 'mark-terminal-visible': isVisible, 'mark-terminal-hidden': !isVisible }"
|
||||
:class="{
|
||||
'mark-terminal-visible': isVisible,
|
||||
'mark-terminal-hidden': !isVisible,
|
||||
'readonly-button': readonly,
|
||||
}"
|
||||
:title="visibleHint"
|
||||
@click="onToggleVisible">
|
||||
<FontAwesomeIcon v-if="isVisible" fixed-width :icon="faEye" />
|
||||
@@ -453,6 +465,18 @@ const removeTagsAction = computed(() => {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-left: -0.2rem;
|
||||
|
||||
.readonly-button {
|
||||
cursor: default !important;
|
||||
|
||||
&:hover,
|
||||
&:focus,
|
||||
&:active,
|
||||
&:focus-visible {
|
||||
background-color: unset !important;
|
||||
color: $brand-primary !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.output-terminal {
|
||||
|
||||
@@ -121,6 +121,13 @@ static files
|
||||
- script.js - all JavaScript code (with all third-party dependencies) must be here
|
||||
- styles.css - all CSS styles, used by the plugin
|
||||
|
||||
script.js must be self-contained, modern vanilla JavaScript. The client no longer
|
||||
exposes Backbone, underscore or jQuery as globals, so webhook scripts cannot rely
|
||||
on them; use standard DOM APIs (``document.getElementById``, ``fetch``, etc.). Each
|
||||
script is wrapped in an IIFE and injected only after its ``#<webhook-id>`` mount
|
||||
point has rendered, so it may query that element immediately. The *phdcomics* and
|
||||
*xkcd* example plugins in ``test/functional/webhooks/`` show the expected style.
|
||||
|
||||
|
||||
Plugin dependencies
|
||||
-------------------
|
||||
|
||||
@@ -1,6 +1,276 @@
|
||||
|
||||
:orphan:
|
||||
|
||||
===========================================================
|
||||
26.1 Galaxy Release
|
||||
26.1 Galaxy Release (July 2026)
|
||||
===========================================================
|
||||
|
||||
.. include:: _header.rst
|
||||
|
||||
Please see the `26.1 user release notes <26.1_announce_user.html>`__ for a summary of new user features.
|
||||
The `GitHub Release Notes <https://github.com/galaxyproject/galaxy/releases/tag/v26.1.0>`__ provide a comprehensive overview of all changes.
|
||||
|
||||
Get Galaxy
|
||||
===========================================================
|
||||
|
||||
The code lives at `GitHub <https://github.com/galaxyproject/galaxy>`__ and you should have `Git <https://git-scm.com/>`__ to obtain it.
|
||||
|
||||
To get a new Galaxy repository run:
|
||||
.. code-block:: shell
|
||||
|
||||
$ git clone -b release_26.1 https://github.com/galaxyproject/galaxy.git
|
||||
|
||||
To update an existing Galaxy repository run:
|
||||
.. code-block:: shell
|
||||
|
||||
$ git fetch origin && git checkout release_26.1 && git pull --ff-only origin release_26.1
|
||||
|
||||
See the `community hub <https://galaxyproject.org/develop/source-code/>`__ for additional details on source code locations.
|
||||
|
||||
|
||||
Configuration Changes
|
||||
=====================
|
||||
|
||||
Added
|
||||
-----
|
||||
|
||||
The following configuration options are new
|
||||
|
||||
config/user_preferences_extra_conf.yml.sample
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- preferences.sentry_replay
|
||||
|
||||
config/galaxy.yml.sample:galaxy
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- mapping.galaxy.mapping.agent_model_capabilities_file
|
||||
- mapping.galaxy.mapping.bulk_storage_operation_completed_run_retention_days
|
||||
- mapping.galaxy.mapping.bulk_storage_operation_dataset_minimum_days_to_expiration
|
||||
- mapping.galaxy.mapping.celery_user_concurrency_limit
|
||||
- mapping.galaxy.mapping.enable_mcp_server
|
||||
- mapping.galaxy.mapping.enable_sse_connection_metrics
|
||||
- mapping.galaxy.mapping.enable_sse_updates
|
||||
- mapping.galaxy.mapping.enable_statsd_middleware
|
||||
- mapping.galaxy.mapping.enable_tool_requests
|
||||
- mapping.galaxy.mapping.gtn_database_path
|
||||
- mapping.galaxy.mapping.gtn_database_refresh_interval
|
||||
- mapping.galaxy.mapping.gtn_database_url
|
||||
- mapping.galaxy.mapping.history_audit_monitor_poll_interval
|
||||
- mapping.galaxy.mapping.iwc_manifest_refresh_interval
|
||||
- mapping.galaxy.mapping.kombu_sqla_transport_cleanup_interval
|
||||
- mapping.galaxy.mapping.mcp_server_path
|
||||
- mapping.galaxy.mapping.prune_expired_bulk_storage_operations_interval
|
||||
- mapping.galaxy.mapping.queue_metrics_interval
|
||||
- mapping.galaxy.mapping.recover_stale_bulk_storage_operation_runs_interval
|
||||
- mapping.galaxy.mapping.sentry_client_traces_sample_rate
|
||||
- mapping.galaxy.mapping.tool_tag_mappings_file
|
||||
- mapping.galaxy.mapping.vault_token_renewal_interval
|
||||
|
||||
|
||||
Changed
|
||||
-------
|
||||
|
||||
The following configuration options have been changed
|
||||
|
||||
config/file_sources_conf.yml.sample
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- has changed from
|
||||
|
||||
::
|
||||
|
||||
{'type': 'dropbox', 'id': 'dropbox1', 'label': 'Dropbox files (configure access in user preferences)', 'doc': 'Your Dropbox files - configure an access token via the user preferences', 'access_token': "${user.preferences['dropbox|access_token']}"}
|
||||
{'type': 'webdav', 'id': 'owncloud1', 'label': 'OwnCloud', 'doc': 'External OwnCloud files (configure access in user preferences)', 'url': "${user.preferences['owncloud|url']}", 'root': "${user.preferences['owncloud|root']}", 'login': "${user.preferences['owncloud|username']}", 'password': "${user.preferences['owncloud|password']}", 'temp_path': '/your/temp/path', 'writable': False}
|
||||
{'type': 'posix', 'root': '/data/5/galaxy_import/galaxy_user_data/covid-19/data/sequences/', 'id': 'covid19-raw-sequences', 'label': 'COVID-19 FASTQ', 'doc': 'COVID-19 RAW sequences in FASTQ format'}
|
||||
{'type': 'posix', 'root': '/data/db/databases/pdb/pdb/', 'id': 'pdb-gzip', 'doc': 'Protein Data Bank (PDB)', 'label': 'PDB'}
|
||||
{'type': 'ftp', 'id': 'ebi-ftp', 'label': 'EBI FTP server', 'doc': 'European Bioinformatic Institute FTP server', 'host': 'ftp.ebi.ac.uk', 'user': 'anonymous', 'passwd': '', 'timeout': 10, 'port': 21}
|
||||
{'type': 'ftp', 'id': 'ncbi-ftp', 'label': 'NCBI FTP server', 'doc': 'NCBI FTP server', 'host': 'ftp.ncbi.nlm.nih.gov', 'user': 'anonymous', 'passwd': '', 'timeout': 10, 'port': 21}
|
||||
{'type': 'ftp', 'id': 'ensembl-ftp', 'label': 'ENSEMBL FTP server', 'doc': 'ENSEMBL FTP server', 'host': 'ftp.ensemblgenomes.org/vol1/pub/', 'user': 'anonymous', 'passwd': '', 'timeout': 10, 'port': 21}
|
||||
{'type': 'ascp', 'id': 'ebi_aspera', 'label': 'EBI Aspera Downloads', 'doc': 'High-speed downloads from EBI SRA using Aspera FASP protocol', 'ascp_path': 'ascp', 'user': 'era-fasp', 'host': 'fasp.sra.ebi.ac.uk', 'port': 33001, 'rate_limit': '300m', 'disable_encryption': True, 'max_retries': 3, 'retry_base_delay': 2.0, 'retry_max_delay': 60.0, 'enable_resume': True, 'ssh_key_content': '-----BEGIN RSA PRIVATE KEY-----\n<YOUR ACTUAL SSH PRIVATE KEY CONTENT>\n-----END RSA PRIVATE KEY-----\n', 'ssh_key_passphrase': 'sample_passphrase'}
|
||||
{'type': 'ssh', 'id': 'writeable-ssh-dir', 'requires_roles': 'writeable-galaxy-role', 'writable': True, 'label': 'Push your files to me', 'doc': 'This is an example of a writeable SSH dir', 'host': 'coolhost', 'user': 'user', 'passwd': 'passwd', 'timeout': 10, 'path': '/home/cooluser/', 'config_path': '', 'port': 2222}
|
||||
{'type': 's3fs', 'label': 'My MinIO storage', 'endpoint_url': 'https://minio.usegalaxy.eu', 'id': 'galaxy-minio-storage', 'doc': 'Galaxy MinIO S3 storage', 'anon': False, 'secret': 'UHAJ6asd6asdhasd', 'key': 'MCJU76agdt98GGFAROIP7'}
|
||||
{'type': 's3fs', 'label': 'Genome Ark', 'id': 'genomeark', 'doc': 'Access to Genome Ark open data on AWS.', 'bucket': 'genomeark', 'anon': True}
|
||||
{'type': 's3fs', 'label': '1000 Genomes', 'id': '1000genomes', 'doc': 'Access to the 1000 Genomes Project with human genetic variation, including SNPs, structural variants, and their haplotype context.', 'bucket': '1000genomes', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'The Cancer Genome Atlas', 'id': 'tcga-2-open', 'doc': 'Access to the Cancer Genome Atlas (TCGA)', 'bucket': 'tcga-2-open', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'COVID-19 Data Lake', 'id': 'covid19-lake', 'doc': 'A centralized repository of up-to-date and curated datasets on or related to the spread and characteristics of the novel corona virus (SARS-CoV-2) and its associated illness, COVID-19', 'bucket': 'covid19-lake', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Encyclopedia of DNA Elements (ENCODE)', 'id': 'encode-public', 'doc': 'The Encyclopedia of DNA Elements (ENCODE) Consortium is an international collaboration of research groups funded by the National Human Genome Research Institute (NHGRI)', 'bucket': 'encode-public', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Sentinel-3', 'id': 'meeo-s3-nrt', 'doc': 'European Commission’s Copernicus Earth Observation Programme. Sentinel-3 is a polar orbiting satellite that completes 14 orbits of the Earth a day.', 'bucket': 'meeo-s3/NRT/', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Sentinel-5P Level 2', 'id': 'meeo-s5p-nrti', 'doc': 'Observations from the Sentinel-5 Precursor satellite of the Copernicus Earth Observation Programme. It contains a polar orbiting satellite that completes 14 orbits of the Earth a day.', 'bucket': 'meeo-s5p/RPRO/', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Coupled Model Intercomparison Project 6', 'id': 'esgf-world', 'doc': 'The sixth phase of global coupled ocean-atmosphere general circulation model ensemble', 'bucket': 'esgf-world', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'CMIP6 GCMs downscaled using WRF', 'id': 'wrf-cmip6-noversioning', 'doc': 'High-resolution historical and future climate simulations from 1980-2100', 'bucket': 'wrf-cmip6-noversioning', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'NOAA Global Forecast System (GFS)', 'id': 'noaa-gfs-bdp-pds', 'doc': 'The Global Forecast System (GFS) is a weather forecast model produced by the National Centers for Environmental Prediction (NCEP).', 'bucket': 'noaa-gfs-bdp-pds', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'NOAA Unified Forecast System Subseasonal to Seasonal Prototype 5', 'id': 'noaa-ufs-prototype5-pds', 'doc': 'The Unified Forecast System Subseasonal to Seasonal prototype 5 (UFS S2Sp5) dataset is reforecast data from the UFS atmosphere-ocean.', 'bucket': 'noaa-ufs-prototype5-pds', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Copernicus Digital Elevation Model (DEM)', 'id': 'copernicus-dem-30m', 'doc': 'The Copernicus DEM is a Digital Surface Model (DSM) which represents the surface of the Earth including buildings, infrastructure and vegetation.', 'bucket': 'copernicus-dem-30m', 'anon': True}
|
||||
{'type': 'http', 'label': 'Custom http filesource', 'id': 'httpcustom', 'url_regex': '^https?://myprotectedsite.org/', 'http_headers': {'Authorization': '#import base64\nBasic ${base64.b64encode(str.encode(user.preferences[\'myprotectedsite|username\'] + ":" + user.preferences[\'myprotectedsite|password\'])).decode()}'}, 'doc': 'Only define this if you want custom control over http downloads. You should also define a stock http source (below) or only downloads from this site will be allowed.'}
|
||||
{'type': 'http', 'label': 'Stock http filesource', 'id': 'httpstock', 'doc': 'Make sure to define this generic http file source if you have defined any other http file sources, or stock http download capability will be disabled.'}
|
||||
{'type': 'drs', 'label': 'Custom DRS filesource', 'id': 'drscustom', 'url_regex': '^drs://mydrssite.org/', 'http_headers': {'Authorization': '#import base64\nBasic ${base64.b64encode(str.encode(user.preferences[\'mydrssite|username\'] + ":" + user.preferences[\'mydrssite|password\'])).decode()}'}, 'doc': 'Define this if you want custom control over drs downloads. You should also define a stock drs source (below) or only downloads from this drs server will be allowed.'}
|
||||
{'type': 'drs', 'label': 'Stock DRS filesource', 'id': 'drsstock', 'doc': 'Make sure to define this generic drs file source if you have defined any other drs file sources, or stock drs download capability will be disabled.'}
|
||||
{'type': 'inveniordm', 'id': 'invenio_sandbox', 'doc': 'This is the Sandbox instance of Invenio. It is used for testing purposes only, content is NOT preserved. DOIs created in this instance are not real and will not resolve.', 'label': 'Invenio RDM Sandbox Repository (TESTING ONLY)', 'url': 'https://inveniordm.web.cern.ch/', 'token': "${user.user_vault.read_secret('preferences/invenio_sandbox/token')}", 'public_name': "${user.preferences['invenio_sandbox|public_name']}", 'writable': True}
|
||||
{'type': 'zenodo', 'id': 'zenodo', 'doc': 'Zenodo is a general-purpose open-access repository developed under the European OpenAIRE program and operated by CERN. It allows researchers to deposit data sets, research software, reports, and any other research-related digital artifacts. For each submission, a persistent digital object identifier (DOI) is minted, which makes the stored items easily citeable.', 'label': 'Zenodo', 'url': 'https://zenodo.org', 'token': "${user.user_vault.read_secret('preferences/zenodo/token')}", 'public_name': "${user.preferences['zenodo|public_name']}", 'writable': True}
|
||||
{'type': 'zenodo', 'id': 'zenodo_sandbox', 'doc': 'This is the Sandbox instance of Zenodo. It is used for testing purposes only, content is NOT preserved. DOIs created in this instance are not real and will not resolve.', 'label': 'Zenodo Sandbox (TESTING ONLY)', 'url': 'https://sandbox.zenodo.org', 'token': "${user.user_vault.read_secret('preferences/zenodo_sandbox/token')}", 'public_name': "${user.preferences['zenodo_sandbox|public_name']}", 'writable': True}
|
||||
{'type': 'dataverse', 'id': 'dataverse', 'doc': 'Dataverse is an open-source data repository platform designed for sharing, preserving, and managing research data, offering tools for data citation, exploration, and collaboration.', 'label': 'Dataverse', 'url': 'https://dataverse.org', 'token': "${user.user_vault.read_secret('preferences/dataverse/token')}", 'public_name': "${user.preferences['dataverse|public_name']}", 'writable': True}
|
||||
{'type': 'dataverse', 'id': 'dataverse_sandbox', 'doc': 'This is the sandbox instance of Dataverse. It is used for testing purposes only, content is NOT preserved. DOIs created in this instance are not real and will not resolve.', 'label': 'Dataverse Sandbox (use only for testing purposes)', 'url': 'https://demo.dataverse.org', 'token': "${user.user_vault.read_secret('preferences/dataverse_sandbox/token')}", 'public_name': "${user.preferences['dataverse_sandbox|public_name']}", 'writable': True}
|
||||
{'type': 'onedata', 'id': 'onedata1', 'label': 'Onedata', 'doc': 'Your Onedata files - configure an access token via user preferences', 'access_token': "${user.preferences['onedata|access_token']}", 'onezone_domain': "${user.preferences['onedata|onezone_domain']}", 'disable_tls_certificate_validation': "${user.preferences['onedata|disable_tls_certificate_validation']}"}
|
||||
{'type': 'elabftw', 'id': 'elabftw', 'label': 'eLabFTW', 'doc': 'Import/export files from an eLabFTW instance.', 'api_key': "${user.user_vault.read_secret('preferences/elabftw/api_key')}", 'writable': True, 'endpoint': "${user.preferences['elabftw|endpoint']}"}
|
||||
|
||||
to
|
||||
|
||||
::
|
||||
|
||||
{'type': 'dropbox', 'id': 'dropbox1', 'label': 'Dropbox files (configure access in user preferences)', 'doc': 'Your Dropbox files - configure an access token via the user preferences', 'access_token': "${user.preferences['dropbox|access_token']}"}
|
||||
{'type': 'webdav', 'id': 'owncloud1', 'label': 'OwnCloud', 'doc': 'External OwnCloud files (configure access in user preferences)', 'url': "${user.preferences['owncloud|url']}", 'root': "${user.preferences['owncloud|root']}", 'login': "${user.preferences['owncloud|username']}", 'password': "${user.preferences['owncloud|password']}", 'temp_path': '/your/temp/path', 'writable': False}
|
||||
{'type': 'posix', 'root': '/data/5/galaxy_import/galaxy_user_data/covid-19/data/sequences/', 'id': 'covid19-raw-sequences', 'label': 'COVID-19 FASTQ', 'doc': 'COVID-19 RAW sequences in FASTQ format'}
|
||||
{'type': 'posix', 'root': '/data/db/databases/pdb/pdb/', 'id': 'pdb-gzip', 'doc': 'Protein Data Bank (PDB)', 'label': 'PDB'}
|
||||
{'type': 'ftp', 'id': 'ebi-ftp', 'label': 'EBI FTP server', 'doc': 'European Bioinformatic Institute FTP server', 'host': 'ftp.ebi.ac.uk', 'user': 'anonymous', 'passwd': '', 'timeout': 10, 'port': 21}
|
||||
{'type': 'ftp', 'id': 'ncbi-ftp', 'label': 'NCBI FTP server', 'doc': 'NCBI FTP server', 'host': 'ftp.ncbi.nlm.nih.gov', 'user': 'anonymous', 'passwd': '', 'timeout': 10, 'port': 21}
|
||||
{'type': 'ftp', 'id': 'ensembl-ftp', 'label': 'ENSEMBL FTP server', 'doc': 'ENSEMBL FTP server', 'host': 'ftp.ensemblgenomes.org/vol1/pub/', 'user': 'anonymous', 'passwd': '', 'timeout': 10, 'port': 21}
|
||||
{'type': 'ascp', 'id': 'ebi_aspera', 'label': 'EBI Aspera Downloads', 'doc': 'High-speed downloads from EBI SRA using Aspera FASP protocol', 'ascp_path': 'ascp', 'user': 'era-fasp', 'host': 'fasp.sra.ebi.ac.uk', 'port': 33001, 'rate_limit': '300m', 'disable_encryption': True, 'max_retries': 3, 'retry_base_delay': 2.0, 'retry_max_delay': 60.0, 'enable_resume': True, 'ssh_key_content': '-----BEGIN RSA PRIVATE KEY-----\n<YOUR ACTUAL SSH PRIVATE KEY CONTENT>\n-----END RSA PRIVATE KEY-----\n', 'ssh_key_passphrase': 'sample_passphrase'}
|
||||
{'type': 'ssh', 'id': 'writeable-ssh-dir', 'requires_roles': 'writeable-galaxy-role', 'writable': True, 'label': 'Push your files to me', 'doc': 'This is an example of a writeable SSH dir', 'host': 'coolhost', 'user': 'user', 'passwd': 'passwd', 'timeout': 10, 'path': '/home/cooluser/', 'config_path': '', 'port': 2222}
|
||||
{'type': 's3fs', 'label': 'My MinIO storage', 'endpoint_url': 'https://minio.usegalaxy.eu', 'id': 'galaxy-minio-storage', 'doc': 'Galaxy MinIO S3 storage', 'anon': False, 'secret': 'UHAJ6asd6asdhasd', 'key': 'MCJU76agdt98GGFAROIP7'}
|
||||
{'type': 's3fs', 'label': 'Genome Ark', 'id': 'genomeark', 'doc': 'Access to Genome Ark open data on AWS.', 'bucket': 'genomeark', 'anon': True}
|
||||
{'type': 's3fs', 'label': '1000 Genomes', 'id': '1000genomes', 'doc': 'Access to the 1000 Genomes Project with human genetic variation, including SNPs, structural variants, and their haplotype context.', 'bucket': '1000genomes', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'The Cancer Genome Atlas', 'id': 'tcga-2-open', 'doc': 'Access to the Cancer Genome Atlas (TCGA)', 'bucket': 'tcga-2-open', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'COVID-19 Data Lake', 'id': 'covid19-lake', 'doc': 'A centralized repository of up-to-date and curated datasets on or related to the spread and characteristics of the novel corona virus (SARS-CoV-2) and its associated illness, COVID-19', 'bucket': 'covid19-lake', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Encyclopedia of DNA Elements (ENCODE)', 'id': 'encode-public', 'doc': 'The Encyclopedia of DNA Elements (ENCODE) Consortium is an international collaboration of research groups funded by the National Human Genome Research Institute (NHGRI)', 'bucket': 'encode-public', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Sentinel-3', 'id': 'meeo-s3-nrt', 'doc': 'European Commission’s Copernicus Earth Observation Programme. Sentinel-3 is a polar orbiting satellite that completes 14 orbits of the Earth a day.', 'bucket': 'meeo-s3/NRT/', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Sentinel-5P Level 2', 'id': 'meeo-s5p-nrti', 'doc': 'Observations from the Sentinel-5 Precursor satellite of the Copernicus Earth Observation Programme. It contains a polar orbiting satellite that completes 14 orbits of the Earth a day.', 'bucket': 'meeo-s5p/RPRO/', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Coupled Model Intercomparison Project 6', 'id': 'esgf-world', 'doc': 'The sixth phase of global coupled ocean-atmosphere general circulation model ensemble', 'bucket': 'esgf-world', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'CMIP6 GCMs downscaled using WRF', 'id': 'wrf-cmip6-noversioning', 'doc': 'High-resolution historical and future climate simulations from 1980-2100', 'bucket': 'wrf-cmip6-noversioning', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'NOAA Global Forecast System (GFS)', 'id': 'noaa-gfs-bdp-pds', 'doc': 'The Global Forecast System (GFS) is a weather forecast model produced by the National Centers for Environmental Prediction (NCEP).', 'bucket': 'noaa-gfs-bdp-pds', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'NOAA Unified Forecast System Subseasonal to Seasonal Prototype 5', 'id': 'noaa-ufs-prototype5-pds', 'doc': 'The Unified Forecast System Subseasonal to Seasonal prototype 5 (UFS S2Sp5) dataset is reforecast data from the UFS atmosphere-ocean.', 'bucket': 'noaa-ufs-prototype5-pds', 'anon': True}
|
||||
{'type': 's3fs', 'label': 'Copernicus Digital Elevation Model (DEM)', 'id': 'copernicus-dem-30m', 'doc': 'The Copernicus DEM is a Digital Surface Model (DSM) which represents the surface of the Earth including buildings, infrastructure and vegetation.', 'bucket': 'copernicus-dem-30m', 'anon': True}
|
||||
{'type': 'http', 'label': 'Custom http filesource', 'id': 'httpcustom', 'url_regex': '^https?://myprotectedsite.org/', 'http_headers': {'Authorization': '#import base64\nBasic ${base64.b64encode(str.encode(user.preferences[\'myprotectedsite|username\'] + ":" + user.preferences[\'myprotectedsite|password\'])).decode()}'}, 'doc': 'Only define this if you want custom control over http downloads. You should also define a stock http source (below) or only downloads from this site will be allowed.'}
|
||||
{'type': 'http', 'label': 'Stock http filesource', 'id': 'httpstock', 'doc': 'Make sure to define this generic http file source if you have defined any other http file sources, or stock http download capability will be disabled.'}
|
||||
{'type': 'drs', 'label': 'Custom DRS filesource', 'id': 'drscustom', 'url_regex': '^drs://mydrssite.org/', 'http_headers': {'Authorization': '#import base64\nBasic ${base64.b64encode(str.encode(user.preferences[\'mydrssite|username\'] + ":" + user.preferences[\'mydrssite|password\'])).decode()}'}, 'doc': 'Define this if you want custom control over drs downloads. You should also define a stock drs source (below) or only downloads from this drs server will be allowed.'}
|
||||
{'type': 'drs', 'label': 'Stock DRS filesource', 'id': 'drsstock', 'doc': 'Make sure to define this generic drs file source if you have defined any other drs file sources, or stock drs download capability will be disabled.'}
|
||||
{'type': 'inveniordm', 'id': 'invenio_sandbox', 'doc': 'This is the Sandbox instance of Invenio. It is used for testing purposes only, content is NOT preserved. DOIs created in this instance are not real and will not resolve.', 'label': 'Invenio RDM Sandbox Repository (TESTING ONLY)', 'url': 'https://inveniordm.web.cern.ch/', 'token': "${user.user_vault.read_secret('preferences/invenio_sandbox/token')}", 'public_name': "${user.preferences['invenio_sandbox|public_name']}", 'writable': True}
|
||||
{'type': 'zenodo', 'id': 'zenodo', 'doc': 'Zenodo is a general-purpose open-access repository developed under the European OpenAIRE program and operated by CERN. It allows researchers to deposit data sets, research software, reports, and any other research-related digital artifacts. For each submission, a persistent digital object identifier (DOI) is minted, which makes the stored items easily citeable.', 'label': 'Zenodo', 'url': 'https://zenodo.org', 'token': "${user.user_vault.read_secret('preferences/zenodo/token')}", 'public_name': "${user.preferences['zenodo|public_name']}", 'writable': True}
|
||||
{'type': 'zenodo', 'id': 'zenodo_sandbox', 'doc': 'This is the Sandbox instance of Zenodo. It is used for testing purposes only, content is NOT preserved. DOIs created in this instance are not real and will not resolve.', 'label': 'Zenodo Sandbox (TESTING ONLY)', 'url': 'https://sandbox.zenodo.org', 'token': "${user.user_vault.read_secret('preferences/zenodo_sandbox/token')}", 'public_name': "${user.preferences['zenodo_sandbox|public_name']}", 'writable': True}
|
||||
{'type': 'dataverse', 'id': 'dataverse', 'doc': 'Dataverse is an open-source data repository platform designed for sharing, preserving, and managing research data, offering tools for data citation, exploration, and collaboration.', 'label': 'Dataverse', 'url': 'https://dataverse.org', 'token': "${user.user_vault.read_secret('preferences/dataverse/token')}", 'public_name': "${user.preferences['dataverse|public_name']}", 'writable': True}
|
||||
{'type': 'dataverse', 'id': 'dataverse_sandbox', 'doc': 'This is the sandbox instance of Dataverse. It is used for testing purposes only, content is NOT preserved. DOIs created in this instance are not real and will not resolve.', 'label': 'Dataverse Sandbox (use only for testing purposes)', 'url': 'https://demo.dataverse.org', 'token': "${user.user_vault.read_secret('preferences/dataverse_sandbox/token')}", 'public_name': "${user.preferences['dataverse_sandbox|public_name']}", 'writable': True}
|
||||
{'type': 'onedata', 'id': 'onedata1', 'label': 'Onedata', 'doc': 'Your Onedata files - configure an access token via user preferences', 'access_token': "${user.preferences['onedata|access_token']}", 'onezone_domain': "${user.preferences['onedata|onezone_domain']}", 'disable_tls_certificate_validation': "${user.preferences['onedata|disable_tls_certificate_validation']}"}
|
||||
{'type': 'elabftw', 'id': 'elabftw', 'label': 'eLabFTW', 'doc': 'Import/export files from an eLabFTW instance.', 'api_key': "${user.user_vault.read_secret('preferences/elabftw/api_key')}", 'writable': True, 'endpoint': "${user.preferences['elabftw|endpoint']}"}
|
||||
{'type': 'iiif', 'id': 'iiif-cambridge-scientific-instrument', 'label': 'Cambridge Scientific Instrument Company', 'doc': 'Browse and import canvases from the Cambridge Digital Library', 'manifest_url': 'https://cudl.lib.cam.ac.uk/iiif/collection/csic', 'writable': False}
|
||||
|
||||
|
||||
|
||||
config/galaxy.yml.sample:galaxy
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- mapping.galaxy.mapping.enable_notification_system.desc has changed from
|
||||
|
||||
::
|
||||
|
||||
Enables the Notification System integrated in Galaxy.
|
||||
|
||||
Users can receive automatic notifications when a certain resource is shared with them or when some long running operations have finished, etc.
|
||||
|
||||
The system allows notification scheduling and expiration, and users can opt-out of specific notification categories or channels.
|
||||
|
||||
Admins can schedule and broadcast notifications that will be visible to all users, including special server-wide announcements such as scheduled maintenance, high load warnings, and event announcements, to name a few examples.
|
||||
|
||||
to
|
||||
|
||||
::
|
||||
|
||||
Enables the Notification System integrated in Galaxy.
|
||||
|
||||
Users can receive automatic notifications when a certain resource is shared with them or when some long running operations have finished, etc.
|
||||
|
||||
The system allows notification scheduling and expiration, and users can opt-out of specific notification categories or channels.
|
||||
|
||||
Delivery is push-based via Server-Sent Events when ``enable_sse_updates``
|
||||
is also true, and falls back to 30-second polling against
|
||||
``/api/notifications/status`` otherwise.
|
||||
|
||||
Admins can schedule and broadcast notifications that will be visible to all users, including special server-wide announcements such as scheduled maintenance, high load warnings, and event announcements, to name a few examples.
|
||||
|
||||
|
||||
- mapping.galaxy.mapping.file_source_webdav_use_temp_files.desc has changed from
|
||||
|
||||
::
|
||||
|
||||
Default value for use_temp_files for webdav plugins that don't explicitly declare this.
|
||||
|
||||
to
|
||||
|
||||
::
|
||||
|
||||
Deprecated. This option is ignored by the fsspec-based WebDAV file source.
|
||||
|
||||
|
||||
- mapping.galaxy.mapping.inference_services.desc has changed from
|
||||
|
||||
::
|
||||
|
||||
Configuration for AI inference services used by agents and visualization plugins.
|
||||
Supports per-agent or per-plugin model, temperature, and token settings.
|
||||
Valid keys include agent types (e.g. router, error_analysis) and plugin names (e.g. jupyterlite).
|
||||
Agents and plugins inherit from 'default' configuration, which itself falls back to global ai_model/ai_api_key settings.
|
||||
Example: inference_services: { default: { model: gpt-4o-mini }, jupyterlite: { model: gpt-4o } }
|
||||
|
||||
to
|
||||
|
||||
::
|
||||
|
||||
Configuration for AI inference services used by agents and visualization plugins.
|
||||
Supports per-agent or per-plugin model, temperature, max_tokens, retries, api_key, api_base_url, and enabled settings.
|
||||
Valid keys include agent types (e.g. router, error_analysis) and plugin names (e.g. jupyterlite).
|
||||
Agents and plugins inherit from 'default' configuration, which itself falls back to global ai_model/ai_api_key settings.
|
||||
All agents are enabled by default.
|
||||
Example: inference_services: { default: { model: gpt-4o-mini, temperature: 0.7 }, custom_tool: { enabled: false }, jupyterlite: { model: gpt-4o } }
|
||||
Set static_responses to a YAML file path to replace all LLM calls with
|
||||
deterministic responses for testing:
|
||||
inference_services: { static_responses: test/integration/static_agents.yml }
|
||||
Per-agent or default-block ``structured_output_override: true|false``
|
||||
beats the model capability table -- see ``agent_model_capabilities_file``
|
||||
for the table's location and contents.
|
||||
Per-agent or default-block ``retries`` sets the pydantic-ai retry budget
|
||||
(tool calls and output validation); it defaults to 3. Raise it if a model
|
||||
intermittently fails to produce conforming output ("Exceeded maximum output
|
||||
retries"). custom_tool's producer keeps a budget of 0 because it runs its
|
||||
own reflection loop; a shared ``default`` block does not change that -- set
|
||||
``custom_tool.retries`` explicitly to override it.
|
||||
custom_tool also accepts ``quality_critic_enabled`` (default false) to turn on the
|
||||
LLM clarity/idiomaticity critic, and ``container_recommendation_enabled`` (default
|
||||
false) to resolve the produced tool's container to a verified quay.io biocontainer.
|
||||
Container recommendation runs a dedicated container critic that infers the tool's
|
||||
conda packages from its command and config files, independently of
|
||||
``quality_critic_enabled``; it adds an extra model call plus an outbound network
|
||||
call to quay.io during the agent turn. Example:
|
||||
inference_services: { custom_tool: { quality_critic_enabled: true, container_recommendation_enabled: true } }
|
||||
|
||||
|
||||
Removed
|
||||
-------
|
||||
|
||||
The following configuration options have been completely removed
|
||||
|
||||
config/galaxy.yml.sample:galaxy
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- mapping.galaxy.mapping.enable_beta_workflow_modules
|
||||
|
||||
|
||||
Release Team
|
||||
===========================================================
|
||||
|
||||
Release manager: `Marius van den Beek <https://github.com/mvdbeek>`__, `Aysam Guerler <https://github.com/guerler>`__
|
||||
|
||||
Release testing:
|
||||
|
||||
* `Amirhossein Nilchi <https://github.com/nilchia>`__
|
||||
* `Keith Suderman <https://github.com/ksuderman>`__
|
||||
* `Junhao Qiu <https://github.com/qchiujunhao>`__
|
||||
|
||||
See: `Release Guardians <https://galaxyproject.org/events/2026-06-01-release-guardians-26-1/>`__
|
||||
|
||||
Communications:
|
||||
|
||||
* `Natalie Whitaker-Allen <https://github.com/natalie-wa>`__
|
||||
* `Scott Cain <https://github.com/scottcain>`__
|
||||
|
||||
A special thank you goes to everyone who helped test the new release after its deployment on usegalaxy.org.
|
||||
|
||||
----
|
||||
|
||||
.. include:: _thanks.rst
|
||||
|
||||
@@ -0,0 +1,246 @@
|
||||
|
||||
===========================================================
|
||||
26.1 Galaxy Release (July 2026)
|
||||
===========================================================
|
||||
|
||||
.. include:: _header.rst
|
||||
|
||||
Please see the full `release notes <https://github.com/galaxyproject/galaxy/releases/tag/v26.1.0>`__ for more details.
|
||||
|
||||
Highlights
|
||||
===========================================================
|
||||
|
||||
Discover some of the exciting new features, enhancements, and improvements in Galaxy 26.1.
|
||||
|
||||
Galaxy Notebooks
|
||||
----------------
|
||||
|
||||
Turn every Galaxy history into a living scientific notebook.
|
||||
|
||||
- **Unified workspace**. Combine narrative, datasets, visualizations, and AI-assisted writing in a single collaborative space.
|
||||
- **Document as you go**. Capture the reasoning behind your analysis and record results while you work.
|
||||
- **Reproducible reports**. Create rich reports that stay connected to the data they describe.
|
||||
- **Assistant on hand**. GalaxyAI works inside a notebook with that notebook's own context, drafting and proposing content in place.
|
||||
|
||||
Galaxy Notebooks make it easy to capture, share, and reproduce the full story behind an analysis.
|
||||
[`#22361 <https://github.com/galaxyproject/galaxy/pull/22361>`__]
|
||||
[`#22807 <https://github.com/galaxyproject/galaxy/pull/22807>`__]
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<iframe width="100%" height="360" style="margin-bottom: 1em;" src="https://www.youtube.com/embed/B7rQQ-4kjAk" title="Galaxy 26.1 - Galaxy Notebooks" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
GalaxyAI: Specialized Agents and Context-Aware Help
|
||||
---------------------------------------------------
|
||||
|
||||
GalaxyAI now knows where you are and routes your question to the right specialist.
|
||||
|
||||
- **Context-aware panel**. A dockable assistant that knows which tool form, job, history, or notebook you are viewing.
|
||||
- **Specialized agents**. Purpose-built agents for error analysis, tool recommendations, GTN tutorials, and IWC workflows.
|
||||
- **Asks instead of guessing**. Ambiguous requests get a clarifying question with quick replies.
|
||||
- **Report drafting**. Draft a workflow invocation report from the run itself.
|
||||
- **Safer custom tools**. The custom tool agent resolves verified containers rather than inventing one.
|
||||
|
||||
Each answer is labeled with the agent that produced it.
|
||||
[`#22096 <https://github.com/galaxyproject/galaxy/pull/22096>`__]
|
||||
[`#22097 <https://github.com/galaxyproject/galaxy/pull/22097>`__]
|
||||
[`#22791 <https://github.com/galaxyproject/galaxy/pull/22791>`__]
|
||||
[`#21934 <https://github.com/galaxyproject/galaxy/pull/21934>`__]
|
||||
[`#22981 <https://github.com/galaxyproject/galaxy/pull/22981>`__]
|
||||
|
||||
Connect Your Own AI Tools with MCP
|
||||
----------------------------------
|
||||
|
||||
Galaxy now speaks the Model Context Protocol, so AI clients outside Galaxy can work with your data.
|
||||
|
||||
- **Bring your own client**. Any MCP-compatible client can connect to a Galaxy server.
|
||||
- **Real Galaxy operations**. Search and run tools, inspect histories and datasets, invoke workflows, and monitor jobs.
|
||||
- **Community workflows**. Find and import vetted Intergalactic Workflow Commission (IWC) workflows without leaving your client.
|
||||
- **Same rules as any client**. External agents route through Galaxy's service layer, inheriting the same authorization and validation.
|
||||
- **Administrator opt-in**. Disabled by default; enabled with ``enable_mcp_server``.
|
||||
|
||||
The same operations layer powers GalaxyAI in the application, so both surfaces stay in step.
|
||||
[`#21942 <https://github.com/galaxyproject/galaxy/pull/21942>`__]
|
||||
[`#22626 <https://github.com/galaxyproject/galaxy/pull/22626>`__]
|
||||
[`#22906 <https://github.com/galaxyproject/galaxy/pull/22906>`__]
|
||||
|
||||
Bulk Dataset Storage Migration
|
||||
------------------------------
|
||||
|
||||
Managing storage at scale just got much easier.
|
||||
|
||||
- **Bulk moves**. Move multiple datasets and collections between storage locations in a single operation.
|
||||
- **Preview the impact**. Review what will change before you begin.
|
||||
- **Progress tracking**. Follow migrations from start to finish with detailed status updates.
|
||||
- **Optional notifications**. Get notified when large migrations complete.
|
||||
|
||||
These improvements make large storage migrations safer, simpler, and more transparent.
|
||||
[`#22606 <https://github.com/galaxyproject/galaxy/pull/22606>`__]
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<iframe width="100%" height="360" style="margin-bottom: 1em;" src="https://www.youtube.com/embed/1irTcAI4yW8" title="Galaxy 26.1 - Bulk Dataset Storage Migration" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
Modern Workflow Extraction Interface
|
||||
------------------------------------
|
||||
|
||||
The history-to-workflow extraction interface has been rebuilt in Vue with a modern card-based design.
|
||||
|
||||
- **Clear step distinction**. Tool steps and workflow inputs are clearly separated.
|
||||
- **Rename before extraction**. Give inputs meaningful names before the workflow is created.
|
||||
- **Direct job access**. Open related jobs directly from the extraction view.
|
||||
- **Immediate results**. The newly created workflow is displayed as soon as extraction finishes.
|
||||
|
||||
Extracting a workflow from your history is now clearer and more intuitive.
|
||||
[`#21935 <https://github.com/galaxyproject/galaxy/pull/21935>`__]
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<iframe width="100%" height="360" style="margin-bottom: 1em;" src="https://www.youtube.com/embed/NFUxEZeBnlw" title="Galaxy 26.1 - Modern Workflow Extraction Interface" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
Favorite and Recent Tools Panel
|
||||
-------------------------------
|
||||
|
||||
Galaxy now includes an optional tool panel focused on faster access to the tools you use the most.
|
||||
|
||||
- **Favorites at hand**. Highlight and quickly access your favorite tools.
|
||||
- **Automatic recents**. Recently executed tools are automatically tracked.
|
||||
- **Keyboard navigation**. Move through the panel without leaving the keyboard.
|
||||
- **Integrated search**. Search tools with quick favorite and unfavorite actions.
|
||||
- **Guided discovery**. When no favorites are configured, the panel helps you discover and organize tools through the redesigned tool discovery interface.
|
||||
|
||||
The result is faster, more personalized access to your everyday tools.
|
||||
[`#21600 <https://github.com/galaxyproject/galaxy/pull/21600>`__]
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<iframe width="100%" height="360" style="margin-bottom: 1em;" src="https://www.youtube.com/embed/LWiEQpuNJFY" title="Galaxy 26.1 - Favorite and Recent Tools Panel" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
View Workflow Step Configuration During Execution
|
||||
-------------------------------------------------
|
||||
|
||||
No more switching back to the workflow editor to inspect a running workflow.
|
||||
|
||||
- **In-context inspection**. View the full configuration of any workflow step directly from the invocation graph.
|
||||
- **Understand settings at a glance**. See tool settings, inputs, and parameters while an analysis runs.
|
||||
- **Stay in the monitor**. Review step details without interrupting execution.
|
||||
|
||||
Monitoring a running workflow is now more transparent and informative.
|
||||
[`#22144 <https://github.com/galaxyproject/galaxy/pull/22144>`__]
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<iframe width="100%" height="360" style="margin-bottom: 1em;" src="https://www.youtube.com/embed/k8O4JAbmB50" title="Galaxy 26.1 - View Workflow Step Configuration During Execution" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
----
|
||||
|
||||
Visualizations Updates
|
||||
===========================================================
|
||||
|
||||
.. visualizations
|
||||
* Update locuszoom package version to 0.0.9
|
||||
(thanks to `@elmedjadjirayane <https://github.com/elmedjadjirayane>`__).
|
||||
`Pull Request 21658`_
|
||||
* Update Vintent
|
||||
(thanks to `@guerler <https://github.com/guerler>`__).
|
||||
`Pull Request 22660`_
|
||||
* Update tiffviewer to v0.0.5
|
||||
(thanks to `@davelopez <https://github.com/davelopez>`__).
|
||||
`Pull Request 22866`_
|
||||
* Fix table header column handling in plotly and tabulator
|
||||
(thanks to `@guerler <https://github.com/guerler>`__).
|
||||
`Pull Request 22893`_
|
||||
|
||||
Datatypes Updates
|
||||
===========================================================
|
||||
|
||||
.. datatypes
|
||||
* Add bwa_index datatype
|
||||
(thanks to `@Delphine-L <https://github.com/Delphine-L>`__).
|
||||
`Pull Request 22310`_
|
||||
* adding egapx_local_cache, a subclass of Directory
|
||||
(thanks to `@richard-burhans <https://github.com/richard-burhans>`__).
|
||||
`Pull Request 22268`_
|
||||
* Show file size for CRAM datasets and in download tooltip
|
||||
(thanks to `@dannon <https://github.com/dannon>`__).
|
||||
`Pull Request 22273`_
|
||||
* Merge 26.0 into dev
|
||||
(thanks to `@mvdbeek <https://github.com/mvdbeek>`__).
|
||||
`Pull Request 22368`_
|
||||
* Added file type ascii raster .asc
|
||||
(thanks to `@tStehling <https://github.com/tStehling>`__).
|
||||
`Pull Request 21937`_
|
||||
* Fix display of BAMs with large headers
|
||||
(thanks to `@wm75 <https://github.com/wm75>`__).
|
||||
`Pull Request 22516`_
|
||||
* Speed up integration tests
|
||||
(thanks to `@mvdbeek <https://github.com/mvdbeek>`__).
|
||||
`Pull Request 22538`_
|
||||
* add TEI XML datatype
|
||||
(thanks to `@bgruening <https://github.com/bgruening>`__).
|
||||
`Pull Request 22718`_
|
||||
* Harden access control for user-defined tools
|
||||
(thanks to `@mvdbeek <https://github.com/mvdbeek>`__).
|
||||
`Pull Request 22704`_
|
||||
* Add sheet_names metadata to XLSX datatype
|
||||
(thanks to `@Anthony96pi <https://github.com/Anthony96pi>`__).
|
||||
`Pull Request 22327`_
|
||||
* update the binary.py for spatialdata so it also works if the file has…
|
||||
(thanks to `@nilchia <https://github.com/nilchia>`__).
|
||||
`Pull Request 22802`_
|
||||
* Migrate Python packages to \`src\` layout and pure namespace packages
|
||||
(thanks to `@mr-c <https://github.com/mr-c>`__).
|
||||
`Pull Request 21977`_
|
||||
* Add new datatypes for the tool vg giraffe
|
||||
(thanks to `@Maed0x <https://github.com/Maed0x>`__).
|
||||
`Pull Request 22935`_
|
||||
* update spatialdata datatype
|
||||
(thanks to `@nilchia <https://github.com/nilchia>`__).
|
||||
`Pull Request 23087`_
|
||||
* Bound memory use in h5grove structured content endpoint
|
||||
(thanks to `@mvdbeek <https://github.com/mvdbeek>`__).
|
||||
`Pull Request 23089`_
|
||||
* Add new datatypes for the tool vg
|
||||
(thanks to `@Maed0x <https://github.com/Maed0x>`__).
|
||||
`Pull Request 23111`_
|
||||
* Add PAGE XML, AbbyyXML, hOCR, mlmodel, Apache Arrow IPC datatype support in datatypes_conf.xml.sample
|
||||
(thanks to `@IvoLeist <https://github.com/IvoLeist>`__).
|
||||
`Pull Request 23088`_
|
||||
* Hide generated headers for tabular previews
|
||||
(thanks to `@qchiujunhao <https://github.com/qchiujunhao>`__).
|
||||
`Pull Request 22947`_
|
||||
|
||||
Builtin Tool Updates
|
||||
===========================================================
|
||||
|
||||
.. tools
|
||||
* First pass in unifying and clarifying collection operation interfaces and help sections
|
||||
(thanks to `@nekrut <https://github.com/nekrut>`__).
|
||||
`Pull Request 21939`_
|
||||
* Fix tool id handling for shed-installed tools
|
||||
(thanks to `@guerler <https://github.com/guerler>`__).
|
||||
`Pull Request 22553`_
|
||||
* Update label for invert parameter in grep.xml for clarity
|
||||
(thanks to `@Sch-Da <https://github.com/Sch-Da>`__).
|
||||
`Pull Request 22550`_
|
||||
* patch bar_chart
|
||||
(thanks to `@gsaudade99 <https://github.com/gsaudade99>`__).
|
||||
`Pull Request 22597`_
|
||||
* Fix recent tools for My Tools default panel
|
||||
(thanks to `@itisAliRH <https://github.com/itisAliRH>`__).
|
||||
`Pull Request 23075`_
|
||||
* Fix discover tool count fallback for My Tools default panels
|
||||
(thanks to `@itisAliRH <https://github.com/itisAliRH>`__).
|
||||
`Pull Request 23074`_
|
||||
* Fix Markdown help rendering in tools list
|
||||
(thanks to `@itisAliRH <https://github.com/itisAliRH>`__).
|
||||
`Pull Request 23106`_
|
||||
|
||||
Please see the full `release notes <https://github.com/galaxyproject/galaxy/releases/tag/v26.1.0>`__ for more details.
|
||||
The admin-facing release notes are available :doc:`here <26.1_announce>`.
|
||||
|
||||
.. include:: 26.1_prs.rst
|
||||
|
||||
----
|
||||
|
||||
.. include:: _thanks.rst
|
||||
@@ -0,0 +1,523 @@
|
||||
|
||||
.. github_links
|
||||
.. _Pull Request 21634: https://github.com/galaxyproject/galaxy/pull/21634
|
||||
.. _Pull Request 21616: https://github.com/galaxyproject/galaxy/pull/21616
|
||||
.. _Pull Request 21653: https://github.com/galaxyproject/galaxy/pull/21653
|
||||
.. _Pull Request 21663: https://github.com/galaxyproject/galaxy/pull/21663
|
||||
.. _Pull Request 20819: https://github.com/galaxyproject/galaxy/pull/20819
|
||||
.. _Pull Request 21669: https://github.com/galaxyproject/galaxy/pull/21669
|
||||
.. _Pull Request 21658: https://github.com/galaxyproject/galaxy/pull/21658
|
||||
.. _Pull Request 21700: https://github.com/galaxyproject/galaxy/pull/21700
|
||||
.. _Pull Request 21705: https://github.com/galaxyproject/galaxy/pull/21705
|
||||
.. _Pull Request 21710: https://github.com/galaxyproject/galaxy/pull/21710
|
||||
.. _Pull Request 21702: https://github.com/galaxyproject/galaxy/pull/21702
|
||||
.. _Pull Request 21694: https://github.com/galaxyproject/galaxy/pull/21694
|
||||
.. _Pull Request 21707: https://github.com/galaxyproject/galaxy/pull/21707
|
||||
.. _Pull Request 21725: https://github.com/galaxyproject/galaxy/pull/21725
|
||||
.. _Pull Request 21731: https://github.com/galaxyproject/galaxy/pull/21731
|
||||
.. _Pull Request 21044: https://github.com/galaxyproject/galaxy/pull/21044
|
||||
.. _Pull Request 21727: https://github.com/galaxyproject/galaxy/pull/21727
|
||||
.. _Pull Request 21673: https://github.com/galaxyproject/galaxy/pull/21673
|
||||
.. _Pull Request 21745: https://github.com/galaxyproject/galaxy/pull/21745
|
||||
.. _Pull Request 21738: https://github.com/galaxyproject/galaxy/pull/21738
|
||||
.. _Pull Request 21746: https://github.com/galaxyproject/galaxy/pull/21746
|
||||
.. _Pull Request 21655: https://github.com/galaxyproject/galaxy/pull/21655
|
||||
.. _Pull Request 21728: https://github.com/galaxyproject/galaxy/pull/21728
|
||||
.. _Pull Request 21729: https://github.com/galaxyproject/galaxy/pull/21729
|
||||
.. _Pull Request 21761: https://github.com/galaxyproject/galaxy/pull/21761
|
||||
.. _Pull Request 21787: https://github.com/galaxyproject/galaxy/pull/21787
|
||||
.. _Pull Request 21792: https://github.com/galaxyproject/galaxy/pull/21792
|
||||
.. _Pull Request 21793: https://github.com/galaxyproject/galaxy/pull/21793
|
||||
.. _Pull Request 21779: https://github.com/galaxyproject/galaxy/pull/21779
|
||||
.. _Pull Request 21803: https://github.com/galaxyproject/galaxy/pull/21803
|
||||
.. _Pull Request 21800: https://github.com/galaxyproject/galaxy/pull/21800
|
||||
.. _Pull Request 21718: https://github.com/galaxyproject/galaxy/pull/21718
|
||||
.. _Pull Request 21734: https://github.com/galaxyproject/galaxy/pull/21734
|
||||
.. _Pull Request 21786: https://github.com/galaxyproject/galaxy/pull/21786
|
||||
.. _Pull Request 21815: https://github.com/galaxyproject/galaxy/pull/21815
|
||||
.. _Pull Request 21782: https://github.com/galaxyproject/galaxy/pull/21782
|
||||
.. _Pull Request 21824: https://github.com/galaxyproject/galaxy/pull/21824
|
||||
.. _Pull Request 21825: https://github.com/galaxyproject/galaxy/pull/21825
|
||||
.. _Pull Request 21820: https://github.com/galaxyproject/galaxy/pull/21820
|
||||
.. _Pull Request 21836: https://github.com/galaxyproject/galaxy/pull/21836
|
||||
.. _Pull Request 21828: https://github.com/galaxyproject/galaxy/pull/21828
|
||||
.. _Pull Request 21841: https://github.com/galaxyproject/galaxy/pull/21841
|
||||
.. _Pull Request 21733: https://github.com/galaxyproject/galaxy/pull/21733
|
||||
.. _Pull Request 21853: https://github.com/galaxyproject/galaxy/pull/21853
|
||||
.. _Pull Request 21858: https://github.com/galaxyproject/galaxy/pull/21858
|
||||
.. _Pull Request 19546: https://github.com/galaxyproject/galaxy/pull/19546
|
||||
.. _Pull Request 21807: https://github.com/galaxyproject/galaxy/pull/21807
|
||||
.. _Pull Request 21754: https://github.com/galaxyproject/galaxy/pull/21754
|
||||
.. _Pull Request 21852: https://github.com/galaxyproject/galaxy/pull/21852
|
||||
.. _Pull Request 21386: https://github.com/galaxyproject/galaxy/pull/21386
|
||||
.. _Pull Request 21855: https://github.com/galaxyproject/galaxy/pull/21855
|
||||
.. _Pull Request 21874: https://github.com/galaxyproject/galaxy/pull/21874
|
||||
.. _Pull Request 21885: https://github.com/galaxyproject/galaxy/pull/21885
|
||||
.. _Pull Request 21890: https://github.com/galaxyproject/galaxy/pull/21890
|
||||
.. _Pull Request 21893: https://github.com/galaxyproject/galaxy/pull/21893
|
||||
.. _Pull Request 21895: https://github.com/galaxyproject/galaxy/pull/21895
|
||||
.. _Pull Request 21899: https://github.com/galaxyproject/galaxy/pull/21899
|
||||
.. _Pull Request 21905: https://github.com/galaxyproject/galaxy/pull/21905
|
||||
.. _Pull Request 21864: https://github.com/galaxyproject/galaxy/pull/21864
|
||||
.. _Pull Request 21910: https://github.com/galaxyproject/galaxy/pull/21910
|
||||
.. _Pull Request 21817: https://github.com/galaxyproject/galaxy/pull/21817
|
||||
.. _Pull Request 21906: https://github.com/galaxyproject/galaxy/pull/21906
|
||||
.. _Pull Request 21300: https://github.com/galaxyproject/galaxy/pull/21300
|
||||
.. _Pull Request 21898: https://github.com/galaxyproject/galaxy/pull/21898
|
||||
.. _Pull Request 21907: https://github.com/galaxyproject/galaxy/pull/21907
|
||||
.. _Pull Request 21805: https://github.com/galaxyproject/galaxy/pull/21805
|
||||
.. _Pull Request 21897: https://github.com/galaxyproject/galaxy/pull/21897
|
||||
.. _Pull Request 21922: https://github.com/galaxyproject/galaxy/pull/21922
|
||||
.. _Pull Request 16970: https://github.com/galaxyproject/galaxy/pull/16970
|
||||
.. _Pull Request 21916: https://github.com/galaxyproject/galaxy/pull/21916
|
||||
.. _Pull Request 21914: https://github.com/galaxyproject/galaxy/pull/21914
|
||||
.. _Pull Request 21909: https://github.com/galaxyproject/galaxy/pull/21909
|
||||
.. _Pull Request 21780: https://github.com/galaxyproject/galaxy/pull/21780
|
||||
.. _Pull Request 21933: https://github.com/galaxyproject/galaxy/pull/21933
|
||||
.. _Pull Request 21940: https://github.com/galaxyproject/galaxy/pull/21940
|
||||
.. _Pull Request 21894: https://github.com/galaxyproject/galaxy/pull/21894
|
||||
.. _Pull Request 21954: https://github.com/galaxyproject/galaxy/pull/21954
|
||||
.. _Pull Request 21927: https://github.com/galaxyproject/galaxy/pull/21927
|
||||
.. _Pull Request 21749: https://github.com/galaxyproject/galaxy/pull/21749
|
||||
.. _Pull Request 21951: https://github.com/galaxyproject/galaxy/pull/21951
|
||||
.. _Pull Request 21953: https://github.com/galaxyproject/galaxy/pull/21953
|
||||
.. _Pull Request 21960: https://github.com/galaxyproject/galaxy/pull/21960
|
||||
.. _Pull Request 21929: https://github.com/galaxyproject/galaxy/pull/21929
|
||||
.. _Pull Request 21957: https://github.com/galaxyproject/galaxy/pull/21957
|
||||
.. _Pull Request 21950: https://github.com/galaxyproject/galaxy/pull/21950
|
||||
.. _Pull Request 21678: https://github.com/galaxyproject/galaxy/pull/21678
|
||||
.. _Pull Request 21970: https://github.com/galaxyproject/galaxy/pull/21970
|
||||
.. _Pull Request 21967: https://github.com/galaxyproject/galaxy/pull/21967
|
||||
.. _Pull Request 21924: https://github.com/galaxyproject/galaxy/pull/21924
|
||||
.. _Pull Request 16708: https://github.com/galaxyproject/galaxy/pull/16708
|
||||
.. _Pull Request 21915: https://github.com/galaxyproject/galaxy/pull/21915
|
||||
.. _Pull Request 21965: https://github.com/galaxyproject/galaxy/pull/21965
|
||||
.. _Pull Request 21983: https://github.com/galaxyproject/galaxy/pull/21983
|
||||
.. _Pull Request 21928: https://github.com/galaxyproject/galaxy/pull/21928
|
||||
.. _Pull Request 22005: https://github.com/galaxyproject/galaxy/pull/22005
|
||||
.. _Pull Request 22004: https://github.com/galaxyproject/galaxy/pull/22004
|
||||
.. _Pull Request 22003: https://github.com/galaxyproject/galaxy/pull/22003
|
||||
.. _Pull Request 21903: https://github.com/galaxyproject/galaxy/pull/21903
|
||||
.. _Pull Request 21724: https://github.com/galaxyproject/galaxy/pull/21724
|
||||
.. _Pull Request 21975: https://github.com/galaxyproject/galaxy/pull/21975
|
||||
.. _Pull Request 21920: https://github.com/galaxyproject/galaxy/pull/21920
|
||||
.. _Pull Request 21685: https://github.com/galaxyproject/galaxy/pull/21685
|
||||
.. _Pull Request 21629: https://github.com/galaxyproject/galaxy/pull/21629
|
||||
.. _Pull Request 22022: https://github.com/galaxyproject/galaxy/pull/22022
|
||||
.. _Pull Request 22023: https://github.com/galaxyproject/galaxy/pull/22023
|
||||
.. _Pull Request 22021: https://github.com/galaxyproject/galaxy/pull/22021
|
||||
.. _Pull Request 22024: https://github.com/galaxyproject/galaxy/pull/22024
|
||||
.. _Pull Request 22007: https://github.com/galaxyproject/galaxy/pull/22007
|
||||
.. _Pull Request 21991: https://github.com/galaxyproject/galaxy/pull/21991
|
||||
.. _Pull Request 22037: https://github.com/galaxyproject/galaxy/pull/22037
|
||||
.. _Pull Request 22049: https://github.com/galaxyproject/galaxy/pull/22049
|
||||
.. _Pull Request 22050: https://github.com/galaxyproject/galaxy/pull/22050
|
||||
.. _Pull Request 22020: https://github.com/galaxyproject/galaxy/pull/22020
|
||||
.. _Pull Request 22048: https://github.com/galaxyproject/galaxy/pull/22048
|
||||
.. _Pull Request 22010: https://github.com/galaxyproject/galaxy/pull/22010
|
||||
.. _Pull Request 22090: https://github.com/galaxyproject/galaxy/pull/22090
|
||||
.. _Pull Request 22072: https://github.com/galaxyproject/galaxy/pull/22072
|
||||
.. _Pull Request 22092: https://github.com/galaxyproject/galaxy/pull/22092
|
||||
.. _Pull Request 21997: https://github.com/galaxyproject/galaxy/pull/21997
|
||||
.. _Pull Request 22111: https://github.com/galaxyproject/galaxy/pull/22111
|
||||
.. _Pull Request 22118: https://github.com/galaxyproject/galaxy/pull/22118
|
||||
.. _Pull Request 22105: https://github.com/galaxyproject/galaxy/pull/22105
|
||||
.. _Pull Request 22088: https://github.com/galaxyproject/galaxy/pull/22088
|
||||
.. _Pull Request 22102: https://github.com/galaxyproject/galaxy/pull/22102
|
||||
.. _Pull Request 22110: https://github.com/galaxyproject/galaxy/pull/22110
|
||||
.. _Pull Request 22139: https://github.com/galaxyproject/galaxy/pull/22139
|
||||
.. _Pull Request 22134: https://github.com/galaxyproject/galaxy/pull/22134
|
||||
.. _Pull Request 22039: https://github.com/galaxyproject/galaxy/pull/22039
|
||||
.. _Pull Request 20375: https://github.com/galaxyproject/galaxy/pull/20375
|
||||
.. _Pull Request 22138: https://github.com/galaxyproject/galaxy/pull/22138
|
||||
.. _Pull Request 22155: https://github.com/galaxyproject/galaxy/pull/22155
|
||||
.. _Pull Request 22160: https://github.com/galaxyproject/galaxy/pull/22160
|
||||
.. _Pull Request 22078: https://github.com/galaxyproject/galaxy/pull/22078
|
||||
.. _Pull Request 22161: https://github.com/galaxyproject/galaxy/pull/22161
|
||||
.. _Pull Request 22141: https://github.com/galaxyproject/galaxy/pull/22141
|
||||
.. _Pull Request 22011: https://github.com/galaxyproject/galaxy/pull/22011
|
||||
.. _Pull Request 22172: https://github.com/galaxyproject/galaxy/pull/22172
|
||||
.. _Pull Request 22070: https://github.com/galaxyproject/galaxy/pull/22070
|
||||
.. _Pull Request 22170: https://github.com/galaxyproject/galaxy/pull/22170
|
||||
.. _Pull Request 22112: https://github.com/galaxyproject/galaxy/pull/22112
|
||||
.. _Pull Request 22157: https://github.com/galaxyproject/galaxy/pull/22157
|
||||
.. _Pull Request 22164: https://github.com/galaxyproject/galaxy/pull/22164
|
||||
.. _Pull Request 22094: https://github.com/galaxyproject/galaxy/pull/22094
|
||||
.. _Pull Request 21887: https://github.com/galaxyproject/galaxy/pull/21887
|
||||
.. _Pull Request 22235: https://github.com/galaxyproject/galaxy/pull/22235
|
||||
.. _Pull Request 21944: https://github.com/galaxyproject/galaxy/pull/21944
|
||||
.. _Pull Request 22216: https://github.com/galaxyproject/galaxy/pull/22216
|
||||
.. _Pull Request 21992: https://github.com/galaxyproject/galaxy/pull/21992
|
||||
.. _Pull Request 22220: https://github.com/galaxyproject/galaxy/pull/22220
|
||||
.. _Pull Request 22199: https://github.com/galaxyproject/galaxy/pull/22199
|
||||
.. _Pull Request 22165: https://github.com/galaxyproject/galaxy/pull/22165
|
||||
.. _Pull Request 21939: https://github.com/galaxyproject/galaxy/pull/21939
|
||||
.. _Pull Request 22237: https://github.com/galaxyproject/galaxy/pull/22237
|
||||
.. _Pull Request 22169: https://github.com/galaxyproject/galaxy/pull/22169
|
||||
.. _Pull Request 22226: https://github.com/galaxyproject/galaxy/pull/22226
|
||||
.. _Pull Request 22153: https://github.com/galaxyproject/galaxy/pull/22153
|
||||
.. _Pull Request 22176: https://github.com/galaxyproject/galaxy/pull/22176
|
||||
.. _Pull Request 22109: https://github.com/galaxyproject/galaxy/pull/22109
|
||||
.. _Pull Request 22152: https://github.com/galaxyproject/galaxy/pull/22152
|
||||
.. _Pull Request 22148: https://github.com/galaxyproject/galaxy/pull/22148
|
||||
.. _Pull Request 22249: https://github.com/galaxyproject/galaxy/pull/22249
|
||||
.. _Pull Request 21962: https://github.com/galaxyproject/galaxy/pull/21962
|
||||
.. _Pull Request 22210: https://github.com/galaxyproject/galaxy/pull/22210
|
||||
.. _Pull Request 22270: https://github.com/galaxyproject/galaxy/pull/22270
|
||||
.. _Pull Request 22289: https://github.com/galaxyproject/galaxy/pull/22289
|
||||
.. _Pull Request 22266: https://github.com/galaxyproject/galaxy/pull/22266
|
||||
.. _Pull Request 22218: https://github.com/galaxyproject/galaxy/pull/22218
|
||||
.. _Pull Request 21643: https://github.com/galaxyproject/galaxy/pull/21643
|
||||
.. _Pull Request 22233: https://github.com/galaxyproject/galaxy/pull/22233
|
||||
.. _Pull Request 22301: https://github.com/galaxyproject/galaxy/pull/22301
|
||||
.. _Pull Request 22281: https://github.com/galaxyproject/galaxy/pull/22281
|
||||
.. _Pull Request 22241: https://github.com/galaxyproject/galaxy/pull/22241
|
||||
.. _Pull Request 22310: https://github.com/galaxyproject/galaxy/pull/22310
|
||||
.. _Pull Request 22268: https://github.com/galaxyproject/galaxy/pull/22268
|
||||
.. _Pull Request 21979: https://github.com/galaxyproject/galaxy/pull/21979
|
||||
.. _Pull Request 22222: https://github.com/galaxyproject/galaxy/pull/22222
|
||||
.. _Pull Request 22308: https://github.com/galaxyproject/galaxy/pull/22308
|
||||
.. _Pull Request 22334: https://github.com/galaxyproject/galaxy/pull/22334
|
||||
.. _Pull Request 22273: https://github.com/galaxyproject/galaxy/pull/22273
|
||||
.. _Pull Request 21687: https://github.com/galaxyproject/galaxy/pull/21687
|
||||
.. _Pull Request 22355: https://github.com/galaxyproject/galaxy/pull/22355
|
||||
.. _Pull Request 22363: https://github.com/galaxyproject/galaxy/pull/22363
|
||||
.. _Pull Request 22306: https://github.com/galaxyproject/galaxy/pull/22306
|
||||
.. _Pull Request 22365: https://github.com/galaxyproject/galaxy/pull/22365
|
||||
.. _Pull Request 22142: https://github.com/galaxyproject/galaxy/pull/22142
|
||||
.. _Pull Request 22368: https://github.com/galaxyproject/galaxy/pull/22368
|
||||
.. _Pull Request 21942: https://github.com/galaxyproject/galaxy/pull/21942
|
||||
.. _Pull Request 22356: https://github.com/galaxyproject/galaxy/pull/22356
|
||||
.. _Pull Request 22114: https://github.com/galaxyproject/galaxy/pull/22114
|
||||
.. _Pull Request 22336: https://github.com/galaxyproject/galaxy/pull/22336
|
||||
.. _Pull Request 22374: https://github.com/galaxyproject/galaxy/pull/22374
|
||||
.. _Pull Request 22362: https://github.com/galaxyproject/galaxy/pull/22362
|
||||
.. _Pull Request 22295: https://github.com/galaxyproject/galaxy/pull/22295
|
||||
.. _Pull Request 22330: https://github.com/galaxyproject/galaxy/pull/22330
|
||||
.. _Pull Request 21993: https://github.com/galaxyproject/galaxy/pull/21993
|
||||
.. _Pull Request 22390: https://github.com/galaxyproject/galaxy/pull/22390
|
||||
.. _Pull Request 22357: https://github.com/galaxyproject/galaxy/pull/22357
|
||||
.. _Pull Request 22228: https://github.com/galaxyproject/galaxy/pull/22228
|
||||
.. _Pull Request 22189: https://github.com/galaxyproject/galaxy/pull/22189
|
||||
.. _Pull Request 22311: https://github.com/galaxyproject/galaxy/pull/22311
|
||||
.. _Pull Request 22424: https://github.com/galaxyproject/galaxy/pull/22424
|
||||
.. _Pull Request 22367: https://github.com/galaxyproject/galaxy/pull/22367
|
||||
.. _Pull Request 22412: https://github.com/galaxyproject/galaxy/pull/22412
|
||||
.. _Pull Request 22206: https://github.com/galaxyproject/galaxy/pull/22206
|
||||
.. _Pull Request 22442: https://github.com/galaxyproject/galaxy/pull/22442
|
||||
.. _Pull Request 22459: https://github.com/galaxyproject/galaxy/pull/22459
|
||||
.. _Pull Request 22439: https://github.com/galaxyproject/galaxy/pull/22439
|
||||
.. _Pull Request 22465: https://github.com/galaxyproject/galaxy/pull/22465
|
||||
.. _Pull Request 22454: https://github.com/galaxyproject/galaxy/pull/22454
|
||||
.. _Pull Request 22409: https://github.com/galaxyproject/galaxy/pull/22409
|
||||
.. _Pull Request 22443: https://github.com/galaxyproject/galaxy/pull/22443
|
||||
.. _Pull Request 22436: https://github.com/galaxyproject/galaxy/pull/22436
|
||||
.. _Pull Request 22425: https://github.com/galaxyproject/galaxy/pull/22425
|
||||
.. _Pull Request 22420: https://github.com/galaxyproject/galaxy/pull/22420
|
||||
.. _Pull Request 22422: https://github.com/galaxyproject/galaxy/pull/22422
|
||||
.. _Pull Request 22469: https://github.com/galaxyproject/galaxy/pull/22469
|
||||
.. _Pull Request 22462: https://github.com/galaxyproject/galaxy/pull/22462
|
||||
.. _Pull Request 22474: https://github.com/galaxyproject/galaxy/pull/22474
|
||||
.. _Pull Request 22466: https://github.com/galaxyproject/galaxy/pull/22466
|
||||
.. _Pull Request 22471: https://github.com/galaxyproject/galaxy/pull/22471
|
||||
.. _Pull Request 22478: https://github.com/galaxyproject/galaxy/pull/22478
|
||||
.. _Pull Request 22473: https://github.com/galaxyproject/galaxy/pull/22473
|
||||
.. _Pull Request 22434: https://github.com/galaxyproject/galaxy/pull/22434
|
||||
.. _Pull Request 22467: https://github.com/galaxyproject/galaxy/pull/22467
|
||||
.. _Pull Request 22264: https://github.com/galaxyproject/galaxy/pull/22264
|
||||
.. _Pull Request 17504: https://github.com/galaxyproject/galaxy/pull/17504
|
||||
.. _Pull Request 22426: https://github.com/galaxyproject/galaxy/pull/22426
|
||||
.. _Pull Request 22472: https://github.com/galaxyproject/galaxy/pull/22472
|
||||
.. _Pull Request 22476: https://github.com/galaxyproject/galaxy/pull/22476
|
||||
.. _Pull Request 22335: https://github.com/galaxyproject/galaxy/pull/22335
|
||||
.. _Pull Request 21937: https://github.com/galaxyproject/galaxy/pull/21937
|
||||
.. _Pull Request 22446: https://github.com/galaxyproject/galaxy/pull/22446
|
||||
.. _Pull Request 21958: https://github.com/galaxyproject/galaxy/pull/21958
|
||||
.. _Pull Request 22458: https://github.com/galaxyproject/galaxy/pull/22458
|
||||
.. _Pull Request 22486: https://github.com/galaxyproject/galaxy/pull/22486
|
||||
.. _Pull Request 22494: https://github.com/galaxyproject/galaxy/pull/22494
|
||||
.. _Pull Request 22488: https://github.com/galaxyproject/galaxy/pull/22488
|
||||
.. _Pull Request 22490: https://github.com/galaxyproject/galaxy/pull/22490
|
||||
.. _Pull Request 22453: https://github.com/galaxyproject/galaxy/pull/22453
|
||||
.. _Pull Request 22463: https://github.com/galaxyproject/galaxy/pull/22463
|
||||
.. _Pull Request 22512: https://github.com/galaxyproject/galaxy/pull/22512
|
||||
.. _Pull Request 22509: https://github.com/galaxyproject/galaxy/pull/22509
|
||||
.. _Pull Request 22510: https://github.com/galaxyproject/galaxy/pull/22510
|
||||
.. _Pull Request 22514: https://github.com/galaxyproject/galaxy/pull/22514
|
||||
.. _Pull Request 22508: https://github.com/galaxyproject/galaxy/pull/22508
|
||||
.. _Pull Request 21972: https://github.com/galaxyproject/galaxy/pull/21972
|
||||
.. _Pull Request 22506: https://github.com/galaxyproject/galaxy/pull/22506
|
||||
.. _Pull Request 22518: https://github.com/galaxyproject/galaxy/pull/22518
|
||||
.. _Pull Request 22511: https://github.com/galaxyproject/galaxy/pull/22511
|
||||
.. _Pull Request 22526: https://github.com/galaxyproject/galaxy/pull/22526
|
||||
.. _Pull Request 22483: https://github.com/galaxyproject/galaxy/pull/22483
|
||||
.. _Pull Request 22525: https://github.com/galaxyproject/galaxy/pull/22525
|
||||
.. _Pull Request 22507: https://github.com/galaxyproject/galaxy/pull/22507
|
||||
.. _Pull Request 22516: https://github.com/galaxyproject/galaxy/pull/22516
|
||||
.. _Pull Request 22529: https://github.com/galaxyproject/galaxy/pull/22529
|
||||
.. _Pull Request 22207: https://github.com/galaxyproject/galaxy/pull/22207
|
||||
.. _Pull Request 22530: https://github.com/galaxyproject/galaxy/pull/22530
|
||||
.. _Pull Request 22537: https://github.com/galaxyproject/galaxy/pull/22537
|
||||
.. _Pull Request 22542: https://github.com/galaxyproject/galaxy/pull/22542
|
||||
.. _Pull Request 22539: https://github.com/galaxyproject/galaxy/pull/22539
|
||||
.. _Pull Request 22517: https://github.com/galaxyproject/galaxy/pull/22517
|
||||
.. _Pull Request 22545: https://github.com/galaxyproject/galaxy/pull/22545
|
||||
.. _Pull Request 22540: https://github.com/galaxyproject/galaxy/pull/22540
|
||||
.. _Pull Request 22538: https://github.com/galaxyproject/galaxy/pull/22538
|
||||
.. _Pull Request 22532: https://github.com/galaxyproject/galaxy/pull/22532
|
||||
.. _Pull Request 22215: https://github.com/galaxyproject/galaxy/pull/22215
|
||||
.. _Pull Request 22553: https://github.com/galaxyproject/galaxy/pull/22553
|
||||
.. _Pull Request 22557: https://github.com/galaxyproject/galaxy/pull/22557
|
||||
.. _Pull Request 22564: https://github.com/galaxyproject/galaxy/pull/22564
|
||||
.. _Pull Request 22556: https://github.com/galaxyproject/galaxy/pull/22556
|
||||
.. _Pull Request 22568: https://github.com/galaxyproject/galaxy/pull/22568
|
||||
.. _Pull Request 22546: https://github.com/galaxyproject/galaxy/pull/22546
|
||||
.. _Pull Request 22569: https://github.com/galaxyproject/galaxy/pull/22569
|
||||
.. _Pull Request 22501: https://github.com/galaxyproject/galaxy/pull/22501
|
||||
.. _Pull Request 22548: https://github.com/galaxyproject/galaxy/pull/22548
|
||||
.. _Pull Request 22573: https://github.com/galaxyproject/galaxy/pull/22573
|
||||
.. _Pull Request 22572: https://github.com/galaxyproject/galaxy/pull/22572
|
||||
.. _Pull Request 22445: https://github.com/galaxyproject/galaxy/pull/22445
|
||||
.. _Pull Request 22567: https://github.com/galaxyproject/galaxy/pull/22567
|
||||
.. _Pull Request 22559: https://github.com/galaxyproject/galaxy/pull/22559
|
||||
.. _Pull Request 22547: https://github.com/galaxyproject/galaxy/pull/22547
|
||||
.. _Pull Request 22566: https://github.com/galaxyproject/galaxy/pull/22566
|
||||
.. _Pull Request 22449: https://github.com/galaxyproject/galaxy/pull/22449
|
||||
.. _Pull Request 22614: https://github.com/galaxyproject/galaxy/pull/22614
|
||||
.. _Pull Request 22618: https://github.com/galaxyproject/galaxy/pull/22618
|
||||
.. _Pull Request 21766: https://github.com/galaxyproject/galaxy/pull/21766
|
||||
.. _Pull Request 21822: https://github.com/galaxyproject/galaxy/pull/21822
|
||||
.. _Pull Request 21775: https://github.com/galaxyproject/galaxy/pull/21775
|
||||
.. _Pull Request 22107: https://github.com/galaxyproject/galaxy/pull/22107
|
||||
.. _Pull Request 22513: https://github.com/galaxyproject/galaxy/pull/22513
|
||||
.. _Pull Request 22601: https://github.com/galaxyproject/galaxy/pull/22601
|
||||
.. _Pull Request 22608: https://github.com/galaxyproject/galaxy/pull/22608
|
||||
.. _Pull Request 22610: https://github.com/galaxyproject/galaxy/pull/22610
|
||||
.. _Pull Request 22607: https://github.com/galaxyproject/galaxy/pull/22607
|
||||
.. _Pull Request 22563: https://github.com/galaxyproject/galaxy/pull/22563
|
||||
.. _Pull Request 22628: https://github.com/galaxyproject/galaxy/pull/22628
|
||||
.. _Pull Request 22630: https://github.com/galaxyproject/galaxy/pull/22630
|
||||
.. _Pull Request 22621: https://github.com/galaxyproject/galaxy/pull/22621
|
||||
.. _Pull Request 22636: https://github.com/galaxyproject/galaxy/pull/22636
|
||||
.. _Pull Request 22550: https://github.com/galaxyproject/galaxy/pull/22550
|
||||
.. _Pull Request 22570: https://github.com/galaxyproject/galaxy/pull/22570
|
||||
.. _Pull Request 21921: https://github.com/galaxyproject/galaxy/pull/21921
|
||||
.. _Pull Request 22629: https://github.com/galaxyproject/galaxy/pull/22629
|
||||
.. _Pull Request 22642: https://github.com/galaxyproject/galaxy/pull/22642
|
||||
.. _Pull Request 22637: https://github.com/galaxyproject/galaxy/pull/22637
|
||||
.. _Pull Request 22645: https://github.com/galaxyproject/galaxy/pull/22645
|
||||
.. _Pull Request 22635: https://github.com/galaxyproject/galaxy/pull/22635
|
||||
.. _Pull Request 22651: https://github.com/galaxyproject/galaxy/pull/22651
|
||||
.. _Pull Request 22653: https://github.com/galaxyproject/galaxy/pull/22653
|
||||
.. _Pull Request 22654: https://github.com/galaxyproject/galaxy/pull/22654
|
||||
.. _Pull Request 22655: https://github.com/galaxyproject/galaxy/pull/22655
|
||||
.. _Pull Request 22652: https://github.com/galaxyproject/galaxy/pull/22652
|
||||
.. _Pull Request 22657: https://github.com/galaxyproject/galaxy/pull/22657
|
||||
.. _Pull Request 22669: https://github.com/galaxyproject/galaxy/pull/22669
|
||||
.. _Pull Request 21645: https://github.com/galaxyproject/galaxy/pull/21645
|
||||
.. _Pull Request 22619: https://github.com/galaxyproject/galaxy/pull/22619
|
||||
.. _Pull Request 22673: https://github.com/galaxyproject/galaxy/pull/22673
|
||||
.. _Pull Request 22667: https://github.com/galaxyproject/galaxy/pull/22667
|
||||
.. _Pull Request 22663: https://github.com/galaxyproject/galaxy/pull/22663
|
||||
.. _Pull Request 22623: https://github.com/galaxyproject/galaxy/pull/22623
|
||||
.. _Pull Request 22687: https://github.com/galaxyproject/galaxy/pull/22687
|
||||
.. _Pull Request 22690: https://github.com/galaxyproject/galaxy/pull/22690
|
||||
.. _Pull Request 22691: https://github.com/galaxyproject/galaxy/pull/22691
|
||||
.. _Pull Request 22145: https://github.com/galaxyproject/galaxy/pull/22145
|
||||
.. _Pull Request 22697: https://github.com/galaxyproject/galaxy/pull/22697
|
||||
.. _Pull Request 22699: https://github.com/galaxyproject/galaxy/pull/22699
|
||||
.. _Pull Request 21842: https://github.com/galaxyproject/galaxy/pull/21842
|
||||
.. _Pull Request 22624: https://github.com/galaxyproject/galaxy/pull/22624
|
||||
.. _Pull Request 22565: https://github.com/galaxyproject/galaxy/pull/22565
|
||||
.. _Pull Request 22693: https://github.com/galaxyproject/galaxy/pull/22693
|
||||
.. _Pull Request 22664: https://github.com/galaxyproject/galaxy/pull/22664
|
||||
.. _Pull Request 22282: https://github.com/galaxyproject/galaxy/pull/22282
|
||||
.. _Pull Request 22718: https://github.com/galaxyproject/galaxy/pull/22718
|
||||
.. _Pull Request 22696: https://github.com/galaxyproject/galaxy/pull/22696
|
||||
.. _Pull Request 22702: https://github.com/galaxyproject/galaxy/pull/22702
|
||||
.. _Pull Request 22627: https://github.com/galaxyproject/galaxy/pull/22627
|
||||
.. _Pull Request 22555: https://github.com/galaxyproject/galaxy/pull/22555
|
||||
.. _Pull Request 22711: https://github.com/galaxyproject/galaxy/pull/22711
|
||||
.. _Pull Request 22574: https://github.com/galaxyproject/galaxy/pull/22574
|
||||
.. _Pull Request 22670: https://github.com/galaxyproject/galaxy/pull/22670
|
||||
.. _Pull Request 22704: https://github.com/galaxyproject/galaxy/pull/22704
|
||||
.. _Pull Request 22097: https://github.com/galaxyproject/galaxy/pull/22097
|
||||
.. _Pull Request 21736: https://github.com/galaxyproject/galaxy/pull/21736
|
||||
.. _Pull Request 22721: https://github.com/galaxyproject/galaxy/pull/22721
|
||||
.. _Pull Request 22622: https://github.com/galaxyproject/galaxy/pull/22622
|
||||
.. _Pull Request 22694: https://github.com/galaxyproject/galaxy/pull/22694
|
||||
.. _Pull Request 22638: https://github.com/galaxyproject/galaxy/pull/22638
|
||||
.. _Pull Request 22552: https://github.com/galaxyproject/galaxy/pull/22552
|
||||
.. _Pull Request 22212: https://github.com/galaxyproject/galaxy/pull/22212
|
||||
.. _Pull Request 22579: https://github.com/galaxyproject/galaxy/pull/22579
|
||||
.. _Pull Request 22683: https://github.com/galaxyproject/galaxy/pull/22683
|
||||
.. _Pull Request 22597: https://github.com/galaxyproject/galaxy/pull/22597
|
||||
.. _Pull Request 21008: https://github.com/galaxyproject/galaxy/pull/21008
|
||||
.. _Pull Request 22679: https://github.com/galaxyproject/galaxy/pull/22679
|
||||
.. _Pull Request 22609: https://github.com/galaxyproject/galaxy/pull/22609
|
||||
.. _Pull Request 21934: https://github.com/galaxyproject/galaxy/pull/21934
|
||||
.. _Pull Request 22707: https://github.com/galaxyproject/galaxy/pull/22707
|
||||
.. _Pull Request 22604: https://github.com/galaxyproject/galaxy/pull/22604
|
||||
.. _Pull Request 22724: https://github.com/galaxyproject/galaxy/pull/22724
|
||||
.. _Pull Request 22732: https://github.com/galaxyproject/galaxy/pull/22732
|
||||
.. _Pull Request 22727: https://github.com/galaxyproject/galaxy/pull/22727
|
||||
.. _Pull Request 22726: https://github.com/galaxyproject/galaxy/pull/22726
|
||||
.. _Pull Request 22692: https://github.com/galaxyproject/galaxy/pull/22692
|
||||
.. _Pull Request 22554: https://github.com/galaxyproject/galaxy/pull/22554
|
||||
.. _Pull Request 22660: https://github.com/galaxyproject/galaxy/pull/22660
|
||||
.. _Pull Request 21794: https://github.com/galaxyproject/galaxy/pull/21794
|
||||
.. _Pull Request 22417: https://github.com/galaxyproject/galaxy/pull/22417
|
||||
.. _Pull Request 22626: https://github.com/galaxyproject/galaxy/pull/22626
|
||||
.. _Pull Request 22603: https://github.com/galaxyproject/galaxy/pull/22603
|
||||
.. _Pull Request 22484: https://github.com/galaxyproject/galaxy/pull/22484
|
||||
.. _Pull Request 22327: https://github.com/galaxyproject/galaxy/pull/22327
|
||||
.. _Pull Request 22617: https://github.com/galaxyproject/galaxy/pull/22617
|
||||
.. _Pull Request 22612: https://github.com/galaxyproject/galaxy/pull/22612
|
||||
.. _Pull Request 22733: https://github.com/galaxyproject/galaxy/pull/22733
|
||||
.. _Pull Request 22706: https://github.com/galaxyproject/galaxy/pull/22706
|
||||
.. _Pull Request 21528: https://github.com/galaxyproject/galaxy/pull/21528
|
||||
.. _Pull Request 22643: https://github.com/galaxyproject/galaxy/pull/22643
|
||||
.. _Pull Request 22625: https://github.com/galaxyproject/galaxy/pull/22625
|
||||
.. _Pull Request 21932: https://github.com/galaxyproject/galaxy/pull/21932
|
||||
.. _Pull Request 22772: https://github.com/galaxyproject/galaxy/pull/22772
|
||||
.. _Pull Request 22779: https://github.com/galaxyproject/galaxy/pull/22779
|
||||
.. _Pull Request 22776: https://github.com/galaxyproject/galaxy/pull/22776
|
||||
.. _Pull Request 22788: https://github.com/galaxyproject/galaxy/pull/22788
|
||||
.. _Pull Request 22716: https://github.com/galaxyproject/galaxy/pull/22716
|
||||
.. _Pull Request 22065: https://github.com/galaxyproject/galaxy/pull/22065
|
||||
.. _Pull Request 21635: https://github.com/galaxyproject/galaxy/pull/21635
|
||||
.. _Pull Request 22756: https://github.com/galaxyproject/galaxy/pull/22756
|
||||
.. _Pull Request 22767: https://github.com/galaxyproject/galaxy/pull/22767
|
||||
.. _Pull Request 22477: https://github.com/galaxyproject/galaxy/pull/22477
|
||||
.. _Pull Request 22799: https://github.com/galaxyproject/galaxy/pull/22799
|
||||
.. _Pull Request 22144: https://github.com/galaxyproject/galaxy/pull/22144
|
||||
.. _Pull Request 21935: https://github.com/galaxyproject/galaxy/pull/21935
|
||||
.. _Pull Request 22361: https://github.com/galaxyproject/galaxy/pull/22361
|
||||
.. _Pull Request 21600: https://github.com/galaxyproject/galaxy/pull/21600
|
||||
.. _Pull Request 21516: https://github.com/galaxyproject/galaxy/pull/21516
|
||||
.. _Pull Request 22096: https://github.com/galaxyproject/galaxy/pull/22096
|
||||
.. _Pull Request 22500: https://github.com/galaxyproject/galaxy/pull/22500
|
||||
.. _Pull Request 22802: https://github.com/galaxyproject/galaxy/pull/22802
|
||||
.. _Pull Request 22639: https://github.com/galaxyproject/galaxy/pull/22639
|
||||
.. _Pull Request 22606: https://github.com/galaxyproject/galaxy/pull/22606
|
||||
.. _Pull Request 22804: https://github.com/galaxyproject/galaxy/pull/22804
|
||||
.. _Pull Request 22159: https://github.com/galaxyproject/galaxy/pull/22159
|
||||
.. _Pull Request 22091: https://github.com/galaxyproject/galaxy/pull/22091
|
||||
.. _Pull Request 22793: https://github.com/galaxyproject/galaxy/pull/22793
|
||||
.. _Pull Request 22095: https://github.com/galaxyproject/galaxy/pull/22095
|
||||
.. _Pull Request 22810: https://github.com/galaxyproject/galaxy/pull/22810
|
||||
.. _Pull Request 22720: https://github.com/galaxyproject/galaxy/pull/22720
|
||||
.. _Pull Request 22815: https://github.com/galaxyproject/galaxy/pull/22815
|
||||
.. _Pull Request 22682: https://github.com/galaxyproject/galaxy/pull/22682
|
||||
.. _Pull Request 22846: https://github.com/galaxyproject/galaxy/pull/22846
|
||||
.. _Pull Request 22834: https://github.com/galaxyproject/galaxy/pull/22834
|
||||
.. _Pull Request 22825: https://github.com/galaxyproject/galaxy/pull/22825
|
||||
.. _Pull Request 22820: https://github.com/galaxyproject/galaxy/pull/22820
|
||||
.. _Pull Request 22785: https://github.com/galaxyproject/galaxy/pull/22785
|
||||
.. _Pull Request 22808: https://github.com/galaxyproject/galaxy/pull/22808
|
||||
.. _Pull Request 21977: https://github.com/galaxyproject/galaxy/pull/21977
|
||||
.. _Pull Request 22847: https://github.com/galaxyproject/galaxy/pull/22847
|
||||
.. _Pull Request 22813: https://github.com/galaxyproject/galaxy/pull/22813
|
||||
.. _Pull Request 22816: https://github.com/galaxyproject/galaxy/pull/22816
|
||||
.. _Pull Request 22823: https://github.com/galaxyproject/galaxy/pull/22823
|
||||
.. _Pull Request 22831: https://github.com/galaxyproject/galaxy/pull/22831
|
||||
.. _Pull Request 22832: https://github.com/galaxyproject/galaxy/pull/22832
|
||||
.. _Pull Request 22833: https://github.com/galaxyproject/galaxy/pull/22833
|
||||
.. _Pull Request 22862: https://github.com/galaxyproject/galaxy/pull/22862
|
||||
.. _Pull Request 22866: https://github.com/galaxyproject/galaxy/pull/22866
|
||||
.. _Pull Request 22640: https://github.com/galaxyproject/galaxy/pull/22640
|
||||
.. _Pull Request 22872: https://github.com/galaxyproject/galaxy/pull/22872
|
||||
.. _Pull Request 22874: https://github.com/galaxyproject/galaxy/pull/22874
|
||||
.. _Pull Request 22801: https://github.com/galaxyproject/galaxy/pull/22801
|
||||
.. _Pull Request 22877: https://github.com/galaxyproject/galaxy/pull/22877
|
||||
.. _Pull Request 22870: https://github.com/galaxyproject/galaxy/pull/22870
|
||||
.. _Pull Request 22886: https://github.com/galaxyproject/galaxy/pull/22886
|
||||
.. _Pull Request 22880: https://github.com/galaxyproject/galaxy/pull/22880
|
||||
.. _Pull Request 22807: https://github.com/galaxyproject/galaxy/pull/22807
|
||||
.. _Pull Request 22891: https://github.com/galaxyproject/galaxy/pull/22891
|
||||
.. _Pull Request 22893: https://github.com/galaxyproject/galaxy/pull/22893
|
||||
.. _Pull Request 22892: https://github.com/galaxyproject/galaxy/pull/22892
|
||||
.. _Pull Request 22890: https://github.com/galaxyproject/galaxy/pull/22890
|
||||
.. _Pull Request 22871: https://github.com/galaxyproject/galaxy/pull/22871
|
||||
.. _Pull Request 22878: https://github.com/galaxyproject/galaxy/pull/22878
|
||||
.. _Pull Request 22881: https://github.com/galaxyproject/galaxy/pull/22881
|
||||
.. _Pull Request 22869: https://github.com/galaxyproject/galaxy/pull/22869
|
||||
.. _Pull Request 22901: https://github.com/galaxyproject/galaxy/pull/22901
|
||||
.. _Pull Request 22905: https://github.com/galaxyproject/galaxy/pull/22905
|
||||
.. _Pull Request 22909: https://github.com/galaxyproject/galaxy/pull/22909
|
||||
.. _Pull Request 22908: https://github.com/galaxyproject/galaxy/pull/22908
|
||||
.. _Pull Request 22896: https://github.com/galaxyproject/galaxy/pull/22896
|
||||
.. _Pull Request 22769: https://github.com/galaxyproject/galaxy/pull/22769
|
||||
.. _Pull Request 22783: https://github.com/galaxyproject/galaxy/pull/22783
|
||||
.. _Pull Request 22791: https://github.com/galaxyproject/galaxy/pull/22791
|
||||
.. _Pull Request 22858: https://github.com/galaxyproject/galaxy/pull/22858
|
||||
.. _Pull Request 22911: https://github.com/galaxyproject/galaxy/pull/22911
|
||||
.. _Pull Request 22920: https://github.com/galaxyproject/galaxy/pull/22920
|
||||
.. _Pull Request 22919: https://github.com/galaxyproject/galaxy/pull/22919
|
||||
.. _Pull Request 22924: https://github.com/galaxyproject/galaxy/pull/22924
|
||||
.. _Pull Request 22922: https://github.com/galaxyproject/galaxy/pull/22922
|
||||
.. _Pull Request 22897: https://github.com/galaxyproject/galaxy/pull/22897
|
||||
.. _Pull Request 22926: https://github.com/galaxyproject/galaxy/pull/22926
|
||||
.. _Pull Request 22912: https://github.com/galaxyproject/galaxy/pull/22912
|
||||
.. _Pull Request 22882: https://github.com/galaxyproject/galaxy/pull/22882
|
||||
.. _Pull Request 22873: https://github.com/galaxyproject/galaxy/pull/22873
|
||||
.. _Pull Request 22943: https://github.com/galaxyproject/galaxy/pull/22943
|
||||
.. _Pull Request 22932: https://github.com/galaxyproject/galaxy/pull/22932
|
||||
.. _Pull Request 22940: https://github.com/galaxyproject/galaxy/pull/22940
|
||||
.. _Pull Request 22944: https://github.com/galaxyproject/galaxy/pull/22944
|
||||
.. _Pull Request 22894: https://github.com/galaxyproject/galaxy/pull/22894
|
||||
.. _Pull Request 22935: https://github.com/galaxyproject/galaxy/pull/22935
|
||||
.. _Pull Request 22956: https://github.com/galaxyproject/galaxy/pull/22956
|
||||
.. _Pull Request 22957: https://github.com/galaxyproject/galaxy/pull/22957
|
||||
.. _Pull Request 22942: https://github.com/galaxyproject/galaxy/pull/22942
|
||||
.. _Pull Request 22432: https://github.com/galaxyproject/galaxy/pull/22432
|
||||
.. _Pull Request 22961: https://github.com/galaxyproject/galaxy/pull/22961
|
||||
.. _Pull Request 22960: https://github.com/galaxyproject/galaxy/pull/22960
|
||||
.. _Pull Request 22968: https://github.com/galaxyproject/galaxy/pull/22968
|
||||
.. _Pull Request 22962: https://github.com/galaxyproject/galaxy/pull/22962
|
||||
.. _Pull Request 22963: https://github.com/galaxyproject/galaxy/pull/22963
|
||||
.. _Pull Request 22904: https://github.com/galaxyproject/galaxy/pull/22904
|
||||
.. _Pull Request 22995: https://github.com/galaxyproject/galaxy/pull/22995
|
||||
.. _Pull Request 22992: https://github.com/galaxyproject/galaxy/pull/22992
|
||||
.. _Pull Request 23035: https://github.com/galaxyproject/galaxy/pull/23035
|
||||
.. _Pull Request 23040: https://github.com/galaxyproject/galaxy/pull/23040
|
||||
.. _Pull Request 23032: https://github.com/galaxyproject/galaxy/pull/23032
|
||||
.. _Pull Request 23034: https://github.com/galaxyproject/galaxy/pull/23034
|
||||
.. _Pull Request 22975: https://github.com/galaxyproject/galaxy/pull/22975
|
||||
.. _Pull Request 21646: https://github.com/galaxyproject/galaxy/pull/21646
|
||||
.. _Pull Request 23050: https://github.com/galaxyproject/galaxy/pull/23050
|
||||
.. _Pull Request 23053: https://github.com/galaxyproject/galaxy/pull/23053
|
||||
.. _Pull Request 22958: https://github.com/galaxyproject/galaxy/pull/22958
|
||||
.. _Pull Request 23045: https://github.com/galaxyproject/galaxy/pull/23045
|
||||
.. _Pull Request 23070: https://github.com/galaxyproject/galaxy/pull/23070
|
||||
.. _Pull Request 23057: https://github.com/galaxyproject/galaxy/pull/23057
|
||||
.. _Pull Request 23048: https://github.com/galaxyproject/galaxy/pull/23048
|
||||
.. _Pull Request 23073: https://github.com/galaxyproject/galaxy/pull/23073
|
||||
.. _Pull Request 23062: https://github.com/galaxyproject/galaxy/pull/23062
|
||||
.. _Pull Request 23075: https://github.com/galaxyproject/galaxy/pull/23075
|
||||
.. _Pull Request 23074: https://github.com/galaxyproject/galaxy/pull/23074
|
||||
.. _Pull Request 22972: https://github.com/galaxyproject/galaxy/pull/22972
|
||||
.. _Pull Request 22977: https://github.com/galaxyproject/galaxy/pull/22977
|
||||
.. _Pull Request 22980: https://github.com/galaxyproject/galaxy/pull/22980
|
||||
.. _Pull Request 23066: https://github.com/galaxyproject/galaxy/pull/23066
|
||||
.. _Pull Request 23087: https://github.com/galaxyproject/galaxy/pull/23087
|
||||
.. _Pull Request 23089: https://github.com/galaxyproject/galaxy/pull/23089
|
||||
.. _Pull Request 23096: https://github.com/galaxyproject/galaxy/pull/23096
|
||||
.. _Pull Request 22981: https://github.com/galaxyproject/galaxy/pull/22981
|
||||
.. _Pull Request 23108: https://github.com/galaxyproject/galaxy/pull/23108
|
||||
.. _Pull Request 23106: https://github.com/galaxyproject/galaxy/pull/23106
|
||||
.. _Pull Request 23111: https://github.com/galaxyproject/galaxy/pull/23111
|
||||
.. _Pull Request 23088: https://github.com/galaxyproject/galaxy/pull/23088
|
||||
.. _Pull Request 23109: https://github.com/galaxyproject/galaxy/pull/23109
|
||||
.. _Pull Request 23113: https://github.com/galaxyproject/galaxy/pull/23113
|
||||
.. _Pull Request 23117: https://github.com/galaxyproject/galaxy/pull/23117
|
||||
.. _Pull Request 23124: https://github.com/galaxyproject/galaxy/pull/23124
|
||||
.. _Pull Request 23130: https://github.com/galaxyproject/galaxy/pull/23130
|
||||
.. _Pull Request 23119: https://github.com/galaxyproject/galaxy/pull/23119
|
||||
.. _Pull Request 22615: https://github.com/galaxyproject/galaxy/pull/22615
|
||||
.. _Pull Request 23134: https://github.com/galaxyproject/galaxy/pull/23134
|
||||
.. _Pull Request 23136: https://github.com/galaxyproject/galaxy/pull/23136
|
||||
.. _Pull Request 23121: https://github.com/galaxyproject/galaxy/pull/23121
|
||||
.. _Pull Request 23118: https://github.com/galaxyproject/galaxy/pull/23118
|
||||
.. _Pull Request 22947: https://github.com/galaxyproject/galaxy/pull/22947
|
||||
.. _Pull Request 23143: https://github.com/galaxyproject/galaxy/pull/23143
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
:orphan:
|
||||
|
||||
===========================================================
|
||||
26.2 Galaxy Release
|
||||
===========================================================
|
||||
@@ -4,6 +4,7 @@ Releases
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
26.1_announce_user
|
||||
26.0_announce_user
|
||||
25.1_announce_user
|
||||
25.0_announce_user
|
||||
|
||||
@@ -59,6 +59,18 @@ BINARY_MIMETYPES = {
|
||||
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
||||
}
|
||||
|
||||
# A libmagic cookie builds its description in a buffer it owns and returns a pointer
|
||||
# to it, so it cannot be used from more than one thread at a time or the description
|
||||
# comes back torn. Datasets are sniffed concurrently (celery runs a thread pool), so
|
||||
# go through `magic.Magic`, which locks around every libmagic call.
|
||||
_MAGIC = magic.Magic(mime=True, mime_encoding=True)
|
||||
|
||||
|
||||
def _split_magic_description(description: str) -> tuple[str, str]:
|
||||
"""Split a libmagic ``<mime type>; charset=<encoding>`` description in two."""
|
||||
mime_type, _, encoding = description.partition("; ")
|
||||
return mime_type, encoding.removeprefix("charset=")
|
||||
|
||||
|
||||
def get_test_fname(fname):
|
||||
"""Returns test data filename"""
|
||||
@@ -611,15 +623,11 @@ class FilePrefix:
|
||||
self.truncated = truncated
|
||||
self.filename = filename
|
||||
self.non_utf8_error = non_utf8_error
|
||||
file_magic = magic.detect_from_content(contents_header_bytes)
|
||||
self.encoding = file_magic.encoding
|
||||
self.mime_type = file_magic.mime_type
|
||||
self.mime_type, self.encoding = _split_magic_description(_MAGIC.from_buffer(contents_header_bytes))
|
||||
self.compressed_mime_type = None
|
||||
self.compressed_encoding = None
|
||||
if compressed_format:
|
||||
compressed_magic = magic.detect_from_filename(filename)
|
||||
self.compressed_mime_type = compressed_magic.mime_type
|
||||
self.compressed_encoding = compressed_magic.encoding
|
||||
self.compressed_mime_type, self.compressed_encoding = _split_magic_description(_MAGIC.from_file(filename))
|
||||
self.compressed_format = compressed_format
|
||||
self.contents_header = contents_header
|
||||
self.contents_header_bytes = contents_header_bytes
|
||||
|
||||
@@ -1,5 +1,17 @@
|
||||
import re
|
||||
|
||||
from ._framework import ApiTestCase
|
||||
|
||||
# Backbone, underscore and jQuery are no longer bundled as global objects for
|
||||
# injected webhook scripts. These patterns catch webhook scripts that still rely
|
||||
# on them (matching usage, not passing mentions in comments).
|
||||
REMOVED_GLOBAL_PATTERNS = [
|
||||
re.compile(r"Backbone\."),
|
||||
re.compile(r"_\.(template|each|map|extend|isEmpty)\("),
|
||||
re.compile(r"\bjQuery\("),
|
||||
re.compile(r"\$\(document\)"),
|
||||
]
|
||||
|
||||
|
||||
class TestWebhooksApi(ApiTestCase):
|
||||
def setUp(self):
|
||||
@@ -27,6 +39,16 @@ class TestWebhooksApi(ApiTestCase):
|
||||
self._assert_status_code_is(response, 200)
|
||||
self._assert_has_keys(response.json(), "username")
|
||||
|
||||
def test_scripts_avoid_removed_globals(self):
|
||||
response = self._get("webhooks")
|
||||
self._assert_status_code_is(response, 200)
|
||||
for webhook in response.json():
|
||||
script = webhook.get("script") or ""
|
||||
for pattern in REMOVED_GLOBAL_PATTERNS:
|
||||
assert not pattern.search(
|
||||
script
|
||||
), f"Webhook '{webhook.get('id')}' script uses removed global matching {pattern.pattern!r}"
|
||||
|
||||
def _assert_are_webhooks(self, response):
|
||||
response_list = response.json()
|
||||
assert isinstance(response_list, list)
|
||||
|
||||
@@ -1,56 +1,37 @@
|
||||
$(document).ready(function() {
|
||||
// Injected by the webhook framework (see appendScriptStyle in client/src/utils/utils.ts).
|
||||
// Runs in the global page scope wrapped in an IIFE, so it must be self-contained
|
||||
// vanilla JS -- Backbone, underscore and jQuery are no longer available globals.
|
||||
const root = typeof Galaxy !== "undefined" && Galaxy.root ? Galaxy.root : "/";
|
||||
const container = document.getElementById("phdcomics");
|
||||
|
||||
var galaxyRoot = typeof Galaxy != 'undefined' ? Galaxy.root : '/';
|
||||
if (container) {
|
||||
container.innerHTML =
|
||||
'<div id="phdcomics-header">' +
|
||||
'<div id="phdcomics-name">PHD Comics</div>' +
|
||||
'<button id="phdcomics-random" type="button">Random</button>' +
|
||||
"</div>" +
|
||||
'<div id="phdcomics-img"></div>';
|
||||
|
||||
var PHDComicsAppView = Backbone.View.extend({
|
||||
el: '#phdcomics',
|
||||
const imgContainer = document.getElementById("phdcomics-img");
|
||||
|
||||
appTemplate: _.template(
|
||||
'<div id="phdcomics-header">' +
|
||||
'<div id="phdcomics-name">PHD Comics</div>' +
|
||||
'<button id="phdcomics-random">Random</button>' +
|
||||
'</div>' +
|
||||
'<div id="phdcomics-img"></div>'
|
||||
),
|
||||
|
||||
imgTemplate: _.template('<img src="<%= src %>"">'),
|
||||
|
||||
events: {
|
||||
'click #phdcomics-random': 'getRandomComic'
|
||||
},
|
||||
|
||||
initialize: function() {
|
||||
this.render();
|
||||
},
|
||||
|
||||
render: function() {
|
||||
this.$el.html(this.appTemplate());
|
||||
this.$comicImg = this.$('#phdcomics-img');
|
||||
this.getRandomComic();
|
||||
return this;
|
||||
},
|
||||
|
||||
getRandomComic: function() {
|
||||
var me = this,
|
||||
url = galaxyRoot + 'api/webhooks/phdcomics/data';
|
||||
|
||||
this.$comicImg.html($('<div/>', {
|
||||
id: 'phdcomics-loader'
|
||||
}));
|
||||
|
||||
$.getJSON(url, function(data) {
|
||||
if (data.success) {
|
||||
me.renderImg(data.src);
|
||||
} else {
|
||||
console.error('[ERROR] "' + url + '":\n' + data.error);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
renderImg: function(src) {
|
||||
this.$comicImg.html(this.imgTemplate({src: src}));
|
||||
async function loadRandomComic() {
|
||||
imgContainer.innerHTML = '<div id="phdcomics-loader"></div>';
|
||||
const url = `${root}api/webhooks/phdcomics/data`;
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
const img = document.createElement("img");
|
||||
img.src = data.src;
|
||||
imgContainer.replaceChildren(img);
|
||||
} else {
|
||||
console.error(`[phdcomics webhook] "${url}":\n${data.error}`);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(`[phdcomics webhook] request to "${url}" failed`, e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
new PHDComicsAppView();
|
||||
});
|
||||
document.getElementById("phdcomics-random").addEventListener("click", loadRandomComic);
|
||||
loadRandomComic();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import json
|
||||
import logging
|
||||
import random
|
||||
from urllib.request import urlopen
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
TIMEOUT = 10
|
||||
# xkcd #404 is a deliberate joke: the comic does not exist and its API endpoint
|
||||
# returns HTTP 404, so it must never be picked.
|
||||
MISSING_COMIC_ID = 404
|
||||
|
||||
|
||||
def main(trans, webhook, params):
|
||||
error = ""
|
||||
comic = {}
|
||||
|
||||
try:
|
||||
# The xkcd JSON API has no CORS headers and info.0.json is only served
|
||||
# over HTTPS, so fetch it server-side rather than from the browser.
|
||||
latest = json.loads(urlopen("https://xkcd.com/info.0.json", timeout=TIMEOUT).read())
|
||||
random_id = MISSING_COMIC_ID
|
||||
while random_id == MISSING_COMIC_ID:
|
||||
random_id = random.randint(1, latest["num"])
|
||||
data = json.loads(urlopen(f"https://xkcd.com/{random_id}/info.0.json", timeout=TIMEOUT).read())
|
||||
comic = {"img": data["img"], "alt": data["alt"], "title": data["title"]}
|
||||
except Exception as e:
|
||||
log.exception(e)
|
||||
error = str(e)
|
||||
|
||||
return {"success": not error, "error": error, "comic": comic}
|
||||
@@ -1,56 +1,41 @@
|
||||
$(document).ready(function() {
|
||||
// Injected by the webhook framework (see appendScriptStyle in client/src/utils/utils.ts).
|
||||
// Runs in the global page scope wrapped in an IIFE, so it must be self-contained
|
||||
// vanilla JS -- Backbone, underscore and jQuery are no longer available globals.
|
||||
// The comic is fetched through the server-side helper (__init__.py) because the
|
||||
// xkcd JSON API sends no CORS headers and is only served over HTTPS.
|
||||
const root = typeof Galaxy !== "undefined" && Galaxy.root ? Galaxy.root : "/";
|
||||
const container = document.getElementById("xkcd");
|
||||
|
||||
var XkcdAppView = Backbone.View.extend({
|
||||
el: '#xkcd',
|
||||
if (container) {
|
||||
container.innerHTML =
|
||||
'<div id="xkcd-header">' +
|
||||
'<div id="xkcd-name">xkcd</div>' +
|
||||
'<button id="xkcd-random" type="button">Random</button>' +
|
||||
"</div>" +
|
||||
'<div id="xkcd-img"></div>';
|
||||
|
||||
appTemplate: _.template(
|
||||
'<div id="xkcd-header">' +
|
||||
'<div id="xkcd-name">xkcd</div>' +
|
||||
'<button id="xkcd-random">Random</button>' +
|
||||
'</div>' +
|
||||
'<div id="xkcd-img"></div>'
|
||||
),
|
||||
const imgContainer = document.getElementById("xkcd-img");
|
||||
|
||||
imgTemplate: _.template('<img src="<%= img %>" alt="<%= alt %>" title="<%= title %>">'),
|
||||
|
||||
events: {
|
||||
'click #xkcd-random': 'getRandomXkcd'
|
||||
},
|
||||
|
||||
initialize: function() {
|
||||
var me = this;
|
||||
|
||||
this.render();
|
||||
|
||||
// Get id of the last xkcd
|
||||
$.getJSON('http://dynamic.xkcd.com/api-0/jsonp/comic?callback=?', function(data) {
|
||||
me.latestXkcdId = data.num;
|
||||
me.getRandomXkcd();
|
||||
});
|
||||
},
|
||||
|
||||
render: function() {
|
||||
this.$el.html(this.appTemplate());
|
||||
this.xkcdImg = this.$('#xkcd-img');
|
||||
return this;
|
||||
},
|
||||
|
||||
getRandomXkcd: function() {
|
||||
var me = this,
|
||||
randomId = Math.floor(Math.random() * this.latestXkcdId) + 1;
|
||||
|
||||
this.xkcdImg.html($('<div/>', {id: 'xkcd-loader'}));
|
||||
$.getJSON('http://dynamic.xkcd.com/api-0/jsonp/comic/' + randomId + '?callback=?', function(data) {
|
||||
me.xkcd = {img: data.img, alt: data.alt, title: data.title};
|
||||
me.renderImg();
|
||||
});
|
||||
},
|
||||
|
||||
renderImg: function() {
|
||||
this.xkcdImg.html(this.imgTemplate({img: this.xkcd.img, alt: this.xkcd.alt, title: this.xkcd.title}));
|
||||
async function loadRandomComic() {
|
||||
imgContainer.innerHTML = '<div id="xkcd-loader"></div>';
|
||||
const url = `${root}api/webhooks/xkcd/data`;
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
const img = document.createElement("img");
|
||||
img.src = data.comic.img;
|
||||
img.alt = data.comic.alt;
|
||||
img.title = data.comic.title;
|
||||
imgContainer.replaceChildren(img);
|
||||
} else {
|
||||
console.error(`[xkcd webhook] "${url}":\n${data.error}`);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(`[xkcd webhook] request to "${url}" failed`, e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var XkcdApp = new XkcdAppView;
|
||||
|
||||
});
|
||||
document.getElementById("xkcd-random").addEventListener("click", loadRandomComic);
|
||||
loadRandomComic();
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import gzip
|
||||
import tempfile
|
||||
|
||||
import pytest
|
||||
@@ -7,6 +8,7 @@ from galaxy.datatypes.sniff import (
|
||||
convert_newlines,
|
||||
convert_newlines_sep2tabs,
|
||||
convert_sep2tabs,
|
||||
FilePrefix,
|
||||
get_test_fname,
|
||||
)
|
||||
|
||||
@@ -109,3 +111,17 @@ def test_infer_from_filename():
|
||||
assert datatypes_registry.get_datatype_from_filename("mycool.fq").file_ext == "fastqsanger"
|
||||
assert datatypes_registry.get_datatype_from_filename("mycool.fq.gz").file_ext == "fastqsanger.gz"
|
||||
assert datatypes_registry.get_datatype_from_filename("mycool.fastq").file_ext == "fastqsanger"
|
||||
|
||||
|
||||
def test_file_prefix_detects_mime_type_of_compressed_file(tmp_path):
|
||||
path = tmp_path / "sample.txt.gz"
|
||||
with gzip.open(path, "wt") as fh:
|
||||
fh.write("1\t2\n3\t4\n")
|
||||
|
||||
file_prefix = FilePrefix(str(path))
|
||||
|
||||
assert file_prefix.compressed_format == "gzip"
|
||||
assert file_prefix.compressed_mime_type == "application/gzip"
|
||||
assert file_prefix.compressed_encoding == "binary"
|
||||
assert file_prefix.mime_type == "text/plain"
|
||||
assert file_prefix.encoding == "us-ascii"
|
||||
|
||||
Reference in New Issue
Block a user