When discovered dataset designations are very long (e.g., taxonomic names),
the job output association name (__new_primary_file_{name}|{designation}__)
can exceed the VARCHAR(255) column limit, causing StringDataRightTruncation
which corrupts the SQLAlchemy session and triggers PendingRollbackError.
Add name length validation in Job.add_output_dataset and related methods
that raises ValueError before the DB INSERT. Catch the error in both the
normal and extended metadata code paths to fail the job with a clear error
message instead of crashing the transaction session.
Fixes https://github.com/galaxyproject/galaxy/issues/22045
When input2 is not provided, the tool produces:
- output1: a copy of input1 (all elements preserved)
- output2: same structure/identifiers as input1 but with
expression.json null datasets
This enables workflows to use the harmonize tool with optional
inputs, producing null-filled collections that can be filtered
downstream with the Filter Null tool.
Bumps tool version to 1.1.0 and preserves 1.0.0 XML as backup.
Closes https://github.com/galaxyproject/galaxy/issues/22080
strictify() and _fill_default_for() in convert.py ignored
parameter.default_value for optional text params, hardcoding None
for absent values. Additionally both used `or` which swallowed
empty string defaults due to Python falsiness.
This caused inconsistent behavior for absent params on tools with
value="" across input formats:
| Input | optional (no default) | optional value="" | optional value="" + regex |
|-------|----------------------|-------------------|--------------------------|
| {} | None | "" | "" |
| None | None | None | None |
| "" | "" | "" | "" |
| valid | value | value | value |
| bad | value | value | fails |
All rows now consistent across legacy, 21.01, and request formats.
Test tools added:
- gx_text_optional_with_empty_default (optional text, value="", no validator)
- gx_text_optional_with_empty_default_regex_validation (the wild case)
- gx_text_optional_regex_validation updated to have no default
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Optional text params with regex (or other) validators would reject
None/"" in request format even though the runtime correctly skips
validation for empty optional params. Add optional flag to validator
chain so None/"" short-circuit before reaching static validators.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Symlink tools/filters/catWrapper.xml into test/functional/tools/for_workflows/
and register it in sample_tool_conf.xml.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add data-description attributes to GalaxyWizard.vue and DatasetError.vue
for test selectors. Add navigation helpers and Selenium test exercising
the inline error analysis widget with the static agent backend.
Fix broken stderr redirect in detect_errors.xml (>2& → >&2).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reuses existing tool <tests> blocks to drive execution through the
browser tool form, then verifies outputs with verify() infrastructure.
Harness infrastructure (navigates_galaxy.py):
- run_tool_test() orchestrates: fetch test def via galaxy_interactor,
stage data via stage_inputs(), fill form, execute, verify
- Data staging uses stage_inputs() from populators (not bespoke upload),
supporting files, collections, binary data, and ftype passthrough
- Collection staging converts TestCollectionDef dicts to CWL-like job
entries; supports paired, list, and list:paired (nested) types
- Job-based output tracking: snapshots pre-execution jobs, finds new job
after form submit, fetches outputs by dataset ID via job API
- Output collection verification: checks collection_type, element count,
and verifies each element's content; supports nested sub-collections
- Two-pass input filling: shallow params first (conditionals), then
deferred params, data params, collection params last
- Type detection via smart components: drilldown, checkbox_select,
boolean, color, select, text
- Multi-data support: detect FormSelection wrapper, clear auto-selected
tags before setting desired value
- Smart component selectors in navigation.yml for param type detection
and interaction (parameter_checkbox_input, parameter_color_input,
parameter_text_input, parameter_drilldown_option, etc.)
Test data:
- Add test cases to gx_data.xml and gx_repeat_boolean.xml
- Fix output name in gx_repeat_data.xml (out_file1 -> output)
Test suite (test_tool_form_harness.py) — 30 tests:
- Scalar params: int, float, text, select, boolean, color
- Composite params: conditional (select + boolean), section, repeat,
drilldown, multi-select checkboxes, data column, multi-data
- Data: single file, optional absent, multi-output, multi-repeats
- Collections: paired, list, list:paired input; paired and list:paired
output verification; mixed collection+data; optional absent collection
- Integration: simple_constructs, implicit_default_conds
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Map hidden_data to DataParameterModel(optional=True) in factory,
treat hidden_data as data in test definition parser for file uploads,
add gx_hidden_data test tool and parameter specs (anchored to
gx_data_optional).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
to_model() checked "bool" but production expression tools (pick_value,
param_value_from_file) declare type="boolean". Fix to_model() to match
canonical "boolean" and fix lone test tool using non-canonical "bool".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
to_model() checked "bool" but production expression tools (pick_value,
param_value_from_file) declare type="boolean". Fix to_model() to match
canonical "boolean" and fix lone test tool using non-canonical "bool".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When an optional text parameter is omitted from a workflow invocation and
connected to an expression tool, the callback_helper in visit_input_values
could fail to replace unresolved inputs with the tool parameter default.
Two issues contributed to this:
1. NoReplacement doesn't implement __eq__, so when the callback returns a
different NoReplacement instance than the module-level NO_REPLACEMENT
singleton, the equality comparison fails and the raw NoReplacement
object gets stored as the input value.
2. The replace_optional_connections path needs to guard replacements with
is_runtime_value(value) to avoid clobbering valid tool-state values
for unconnected parameters (like select parameters with defaults).
Fix both by switching all NoReplacement comparisons to isinstance()
checks and restoring the is_runtime_value guard. Add a framework workflow
test that connects an optional text parameter to an expression tool
converting text→boolean, then uses the boolean as a when condition.
Fix HTML datasets with extra files returning 404 errors when previewed.
Without a trailing slash on the display URL, the browser resolves
relative paths (e.g., image.jpg) against /datasets/{id}/ instead of
/datasets/{id}/display/, causing sub-resources to fail loading.
Adds a playwright test that verifies the trailing slash is present in
the iframe src and that extra files are accessible via relative paths.
https://claude.ai/code/session_01AvNoEjTngF3u59NJvSmPrg
Add timelimit to ResourceType literal, XSD schema, Pydantic model,
and cwl_to_galaxy mapping. Update test fixtures and assertions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New gx_data_collection_any_y tool accepts any collection type (no
collection_type constraint). Specs cover list, paired, list:paired,
and record in job_runtime_valid. Fix parameter_tool_source to handle
_y suffix convention matching functional_test_tool_source.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add gx_data_collection_list_paired_or_list_list and
gx_data_collection_list_or_list_paired tool definitions + specs
- Add job_runtime valid/invalid specs for comma-separated type unions
- Add E2E test for list:list:paired, record:paired dynamic models
- Tighten nested collection assertions to use dynamic model types
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use Pydantic discriminated unions to enforce that collection_type
matches element structure:
- Add Literal types to simple models (list, paired, record, etc.)
- Add DataCollectionSampleSheetRuntime as separate model
- Split DataCollectionNestedRuntime into NestedList and NestedRecord
- Add collection_runtime_discriminator() for routing validation
- Create CollectionRuntimeDiscriminated tagged union
- Add structure mismatch tests (list with object elements, etc.)
- Add gx_data_collection_list_or_paired test tool
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add validate_job_runtime to validation layer and test runner. Add
job_runtime_valid/invalid specs for data, data_multiple, data_collection,
and typed collection (list/paired) params. New gx_data_collection_paired
test tool for paired collection_type coverage.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Removes NotImplementedError for DataCollectionParameterModel in
runtimeify() by implementing full collection-to-runtime conversion.
Collections produce normalized representations with class, name,
collection_type, tags, and elements. List-like types (list,
sample_sheet) get array elements; record-like types (paired,
paired_or_unpaired, record) get object elements.
Adds DataCollectionElementInternalJson subtype of DataInternalJson
for stronger typing of files within collections (adds
element_identifier, columns fields).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>