The store is a rebuildable, content-addressed cache — it does not need
Galaxy's database, and living there was the source of every subtle
lifecycle mechanism in the subsystem: store.commit() committed whatever
request or job transaction was in flight, reads needed a private-Session
isolation hack, and a sa_session parameter threaded through the factory,
populator, watcher and CLI.
Standalone stores are now the only kind: the default is a SQLite file
under tool_source_disk_path (any SQLAlchemy URL via tool_source_stores
for shared multi-host deployments), committing per write on its own
engine. The tool_source_record/tool_index tables, their migration, the
model classes and the whole session plumbing are gone. The ToolSourceStore
ABC loses commit() (every backend persists per write). The dev/watch-mode
watcher now populates per file without broadcasting and keeps its single
debounced reload notification for the batch.
Claude-Session: https://claude.ai/code/session_018L7ZmCv2ubKA3JNeSL8Pkr
The package is app-coupled (galaxy.model, galaxy.config, galaxy.queues,
galaxy.datatypes) and only consumed from app-side code, so it belongs
under galaxy.tools rather than a new top-level package. Riding the
existing packages/app tools symlink also removes the need for a
dedicated package symlink. Also drop an unused back-compat alias and
fix stale doc references.
Claude-Session: https://claude.ai/code/session_018L7ZmCv2ubKA3JNeSL8Pkr
Introduces galaxy.tool_source_store: a queryable store of parsed,
macro-expanded tool sources plus a pre-computed ToolIndex of the metadata
batch consumers need (panel section, labels, EDAM, requirements, test
counts, shed provenance).
- Backends: database (store-owned tool_source_record + tool_index tables,
migration f5a73c8b9d12), sqlalchemy (read-only SQLite bundles, e.g.
CVMFS-shipped), and a composite that layers named stores over the
default with read fall-through.
- scripts/tool_source/populate_store.py walks tool_conf files and writes
sources + index + whoosh search index; --watch updates the store on
file changes and broadcasts reload_tool_source_cache. The populator is
the single writer; consumers are read-only.
- Per-conf opt-in via store="name" on a toolbox conf root, resolved
against the tool_source_stores catalog in galaxy.yml.
- The tool_source_record table is deliberately separate from tool_source,
whose rows belong to the job-request path and carry a raw-string
payload contract.
Nothing reads from the store yet — an on-demand-loading toolbox consuming
it is follow-up work (#22633). Extracted from that PR.
Update Galaxy's Rucio test and optional dependency declarations to require rucio-clients 40.2.0.
Adjust the Rucio object store for client 40 behavior, including checksum import changes, ingest checksum handling, Rucio config cache invalidation, and isolated download directories.
Run Rucio integration tests against the Savannah Rucio 40.2.0 container by default while keeping an environment override for the image.
only directories in `lib/galaxy` & `packages/*/galaxy`
All other files removed or moved to their own module
All references to those files updated, especially galaxy/version.py
Fix underscore handling in semantics.py that caused "'_' allowed only
in math mode" errors in rendered HTML. Issues: CollectionDefinition
used bare escaped underscores outside \text{}, expression_to_latex had
double-replacement bugs (unpaired→\text{un\text{paired}}), and
sample_sheet was unhandled.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Convert 32 free-form then string expressions in collection_semantics.yml
to structured typed YAML with 14 Pydantic models and as_latex() methods.
Bug fix: NestedElements.elements typed as dict[str, "OutputBinding"]
with model_rebuild() to resolve forward ref (was dict[str, Any]).
Polish: discriminated unions via Annotated[..., Field(discriminator="type")]
on all 4 union type aliases, rename elements_to_latex to
_assumption_elements_to_latex.
61 tests (was 40): smoke tests for all as_latex() and generate_docs(),
unit tests for EllipsisMarker, DatasetListInput, NestedElements,
CollectionOutput with ellipsis, compound sub_collection_type,
MapOverThen producing DatasetOutput.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the yarn install target from packages/web_client/Makefile since
client builds now use corepack/pnpm via the root Makefile, and fix a few
leftover yarn mentions in comments and docs.
Expand writing_tests.md with:
- Quick reference table and decision tree for test type selection
- Workflow framework tests section
- API test patterns: populators, decorators, fixtures, user switching
- Integration test patterns: config options, mixins, app access
- Selenium test patterns: smart components, accessibility, shared state
- When to use UI vs API methods in browser tests
Add client/README.md testing section:
- Test file structure and standard imports
- LocalVue setup and test data factories
- MSW/OpenAPI-MSW for type-safe API mocking
- Vue component testing patterns
A strict vs relaxed state for incoming requests lets us preserve some older behavior if it is needed for tests and such while also allowing us to default to "the correct thing".