Skip to content

datavzrd: auto-generated tool wrapper (issue #1966) - #1976

Merged
bgruening merged 6 commits into
masterfrom
tool-bot/issue-1966
Sep 1, 2026
Merged

datavzrd: auto-generated tool wrapper (issue #1966)#1976
bgruening merged 6 commits into
masterfrom
tool-bot/issue-1966

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

This PR adds a Galaxy wrapper for datavzrd (v2.71.3, resolves #1966), a tool for rendering interactive, configurable HTML reports from tabular data.

The wrapper supports multiple tabular inputs (CSV/TSV/JSON/Parquet), with either auto-generated configs (datavzrd suggest) or user-provided YAML configs whose dataset paths are rewritten via the included datavzrd_config.py helper. Reports are exposed as interactive Galaxy HTML output (QUAST-style directory layout) or as a zip archive, with advanced options for max-in-memory-rows, webview controls, and output overwriting.

The PR includes datavzrd_render.xml, shared macros.xml, the config helper script, .shed.yml metadata, and test data adapted from upstream examples. All 5 functional tests pass under planemo, covering auto-config, multi-input, user config, TSV, and zip output scenarios.

Comment thread tools/datavzrd/datavzrd_render.xml Outdated
Comment thread tools/datavzrd/macros.xml Outdated
@SaimMomin12 SaimMomin12 added the address-feedback ask gxy-tool-bot to address pr feedback label Aug 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor Author

🔧 Addressing feedback — view progress

@github-actions github-actions Bot removed the address-feedback ask gxy-tool-bot to address pr feedback label Aug 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor Author

🔧 Addressed feedback — 8 files in tool directory

All 5 tests pass and lint is clean. Summary of the changes addressing each review comment:

1. "Can this configuration file be built on the fly by taking inputs from the user?" (line 81, on the config_file param)

This is already the tool's default behavior — the "Auto-generate the configuration from the input tables" option builds the datavzrd config on the fly from the user's input tables via datavzrd suggest, so no functional change was required. I only clarified the help text for the auto mode ("builds the configuration on the fly ... no configuration file is needed") to make this explicit for users/reviewers.

2. "I don't think this is required" (line 90, on webview_url)

Removed the webview_url parameter entirely. It was redundant: webview_controls writes webview-controls: true into the config, and datavzrd then uses its default webview host (https://datavzrd.github.io/view/) anyway. This also simplified the command template (removed the $webview_flag interpolation, which was a shell-quoting surface), and the URL is now documented in the webview_controls param help. Test 05's negative assertion was updated from --webview-url to webview-controls, which is a stronger check that the webview option is absent when not requested.

3. @PROFILE@ → 25.0 (macros.xml line 4)

Applied as suggested.

Files changed: macros.xml and datavzrd_render.xml. Verified with planemo lint (no warnings) and planemo test (all 5 tests pass).

Agent tool call trace

read_file({"path": "datavzrd_render.xml"})

<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">
    <description>Render visual and interactive HTML reports from tabular data</description>
    <macros>
        <import>macros.xml</import>
    </macros>
    <expand macro="render_requirements"/>
    <expand macro="version_command"/>
    <command detect_errors="aggressive"><![CDATA[
## Symlink the input tables into the working directory using safe names
## so that they can be referenc

read_file({"path": "macros.xml"})

<macros>
    <token name="@TOOL_VERSION@">2.71.3</token>
    <token name="@VERSION_SUFFIX@">0</token>
    <token name="@PROFILE@">24.1</token>
    <xml name="render_requirements">
        <requirements>
            <requirement type="package" version="@TOOL_VERSION@">datavzrd</requirement>
            <requirement type="package" version="3.13">python</requirement>
            <requirement type="package" version="6.0.3">pyyaml</requirement>
            <requirement type="package" version="3.0">zi

read_file({"path": "datavzrd_config.py"})

#!/usr/bin/env python3
"""Helper script to adapt datavzrd report configuration files for Galaxy.

Subcommands:
    rewrite: rewrite the dataset paths of a config file to point to the
             Galaxy input files. Datasets are matched to the input files
             in the order in which they appear in the config file.
    set:     set one or more top-level key-value pairs in a config file.
"""

import argparse
import sys

import yaml


def load_config(path):
    with open(path, "r", encoding=

read_file({"path": ".shed.yml"})

categories:
- Data Visualization
description: Render visual and interactive HTML reports from tabular data with datavzrd
homepage_url: https://github.com/datavzrd/datavzrd
long_description: |
  Datavzrd creates visual and interactive HTML reports from collections of tabular
  data (CSV, TSV, JSON or Parquet). Reports include automatically generated vega-lite
  plots per column, searching, sorting and filtering, and can be fully customized via a
  YAML configuration file supporting custom plots, 

read_file({"end_line": 100, "path": "datavzrd_render.xml", "start_line": 70})

70:         <param name="input_data" type="data" format="csv,tsv,tabular,json,parquet" multiple="true" label="Input table(s)" help="One or more tabular datasets (CSV, TSV, JSON or Parquet) to include in the report. When using a custom configuration file, provide the tables in the same order as the datasets defined in that configuration file."/>
71:         <conditional name="config_mode">
72:             <param name="config_mode_selector" type="select" label="Configuration">
73:                 

write_file({"content": "\n <token name="@TOOL_VERSION@">2.71.3\n <token name="@VERSION_SUFFIX@">0\n <token name="@Profile@">25.0\n <xml name="render_requirements">\n \n <requirement type="package" version="@TOOL_VERSION@">datavzrd\n <requirement type="package" version="3.13">python\n <requirement type="package" version="6.0.3">pyyaml\n <requirement type="package" version="3.0">zip\n \n \n <xml name="version_command">\n <version_command>datavzrd --version</version_command>\n \n <xml name="report_name">\n <param name="report_name" type="text" value="Datavzrd Report" label="Report name" help="Name of the generated report, shown in the report header">\n <validator type="regex" message="Report name must not contain single quotes, backslashes or newline characters">^[^'\\\\\\n\\r]+$\n \n \n <xml name="citations">\n \n <citation type="doi">10.1371/journal.pone.0323079\n \n \n \n\n", "path": "macros.xml"})

File written: macros.xml

write_file({"content": "<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@Profile@">\n Render visual and interactive HTML reports from tabular data\n \n macros.xml\n \n <expand macro="render_requirements"/>\n <expand macro="version_command"/>\n <command detect_errors="aggressive"> config.yaml &&\n#else:\n ## Rewrite the dataset paths of the user-provided configuration file\n ## to point to the input tables of this job\n python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&\n#end if\n\n## Apply advanced options to the configuration file\n#set $adv_args = []\n#if $adv.max_in_memory_rows:\n #silent $adv_args.append('max-in-memory-rows=' + str($adv.max_in_memory_rows))\n#end if\n#if $adv.webview_controls:\n #silent $adv_args.append('webview-controls=true')\n#end if\n#if $adv_args:\n python '$__tool_directory__/datavzrd_config.py' set config.yaml --output config.yaml #echo ' '.join($adv_args)# &&\n#end if\n\n## Render the report\n#set $overwrite_flag = ''\n#if $adv.overwrite_output:\n #set $overwrite_flag = '--overwrite-output'\n#end if\ndatavzrd config.yaml --output report_output $overwrite_flag &&\n\n## Collect the output\n#if $output_format == 'html':\n mkdir -p '${output_html.files_path}' &&\n mv report_output/index.html '${output_html}' &&\n mv report_output/* '${output_html.files_path}/'\n#else:\n cd report_output &&\n zip -q -r ../report.zip . &&\n cd .. &&\n mv report.zip '${output_zip}'\n#end if\n ]]>\n \n <param name="input_data" type="data" format="csv,tsv,tabular,json,parquet" multiple="true" label="Input table(s)" help="One or more tabular datasets (CSV, TSV, JSON or Parquet) to include in the report. When using a custom configuration file, provide the tables in the same order as the datasets defined in that configuration file."/>\n <conditional name="config_mode">\n <param name="config_mode_selector" type="select" label="Configuration">\n <option value="auto" selected="true">Auto-generate the configuration from the input tables\n <option value="provide">Provide a datavzrd configuration file\n \n <when value="auto">\n <expand macro="report_name"/>\n \n <when value="provide">\n <param name="config_file" type="data" format="yaml" label="datavzrd configuration file" help="A datavzrd YAML configuration file. The dataset 'path' entries are rewritten to the input tables above (matched in the order in which the datasets appear in the configuration file), so any path can be used there. Note that relative references to external files (spec-path, script-path, custom-path, render-img paths) are not supported - use the inline 'spec' or 'custom' fields instead."/>\n \n \n <param name="output_format" type="select" label="Output format">\n <option value="html" selected="true">Interactive HTML report (displayed in Galaxy)\n <option value="zip">Zipped report directory\n \n <section name="adv" title="Advanced options" expanded="false">\n <param name="max_in_memory_rows" type="integer" optional="true" min="1" label="Maximum in-memory rows" help="Maximum number of rows of a table that are rendered into a single page (default: 20000). Tables with more rows are split into searchable pages."/>\n <param name="webview_controls" type="boolean" checked="false" label="Enable webview sharing controls" help="Adds sharing controls to the report that allow exporting the displayed data to datavzrd's webview host (https://datavzrd.github.io/view/).\"/>\n <param name="overwrite_output" type="boolean" checked="true" truevalue="--overwrite-output" falsevalue="" label="Overwrite output directory" help="Use the --overwrite-output flag of datavzrd."/>\n \n \n \n <data name="output_html" format="html" label="${tool.name} on ${on_string}: interactive report">\n output_format == 'html'\n \n <data name="output_zip" format="zip" label="${tool.name} on ${on_string}: zipped report">\n output_format == 'zip'\n \n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Oscars Report"/>\n <has_text text="static/bundle.js"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Datavzrd Report"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="provide"/>\n <param name="config_file" value="example-config.yaml" ftype="yaml"/>\n \n <section name="adv">\n <param name="max_in_memory_rows" value="500"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="My oscar report"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="--overwrite-output"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="genes.tsv" ftype="tsv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Gene Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Gene Report"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="-s $'\t'"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="zip"/>\n <assert_command>\n <has_text text="zip -q -r ../report.zip"/>\n <not_has_text text="webview-controls"/>\n </assert_command>\n <output name="output_zip" ftype="zip"/>\n \n \n <help format="markdown">\n <expand macro="citations"/>\n\n", "path": "datavzrd_render.xml"})

File written: datavzrd_render.xml

planemo_lint({"path": "."})

Linting tool /home/runner/work/galaxytools/galaxytools/tools/datavzrd/datavzrd_render.xml
.. CHECK (TestsNoValid): 5 test(s) found.
.. INFO (OutputsNumber): 2 outputs found.
.. INFO (InputsNum): Found 8 input parameters.
.. CHECK (HelpPresent): Tool contains help section.
.. CHECK (ToolIDValid): Tool defines an id [datavzrd_render].
.. CHECK (ToolNameValid): Tool defines a name [datavzrd].
.. CHECK (ToolProfileValid): Tool specifies profile version [25.0].
.. CHECK (ToolVersionValid): Tool defin

planemo_test({"path": "."})

Error: tool call timed out after 300s

planemo_test({"path": "."})

All 5 tests passed.

Comment thread tools/datavzrd/macros.xml Outdated
Comment thread tools/datavzrd/datavzrd_render.xml
Comment thread tools/datavzrd/datavzrd_render.xml Outdated
Comment thread tools/datavzrd/datavzrd_render.xml Outdated
Comment thread tools/datavzrd/datavzrd_render.xml
Comment thread tools/datavzrd/datavzrd_render.xml Outdated
Comment thread tools/datavzrd/datavzrd_render.xml Outdated
Comment thread tools/datavzrd/datavzrd_render.xml Outdated
Comment thread tools/datavzrd/.shed.yml Outdated
Comment thread tools/datavzrd/.shed.yml Outdated
@SaimMomin12 SaimMomin12 added the address-feedback ask gxy-tool-bot to address pr feedback label Aug 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor Author

🔧 Addressing feedback — view progress

@github-actions github-actions Bot removed the address-feedback ask gxy-tool-bot to address pr feedback label Aug 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor Author

🔧 Addressed feedback — 8 files in tool directory

All lint checks and all 5 tests pass. Here's a summary of the fixes applied per the review comments:

macros.xml

  • Bumped @TOOL_VERSION@ from 2.71.3 to 2.72.0.

.shed.yml

  • Changed category from Data Visualization to Visualization.
  • Fixed remote_repository_url to point at https://github.com/bgruening/galaxytools/tree/master/tools/datavzrd.

datavzrd_render.xml

  • Added a <required_files> block declaring datavzrd_config.py (after <expand macro="render_requirements"/>).
  • Replaced the raw $data_file.ext handling with is_of_type()-based extension normalization (json/parquet/csv, else tsv), so non-standard Galaxy extensions like bed no longer silently get -s ',' — they fall into the tsv branch.
  • Switched auto-mode dataset names from input_0/input_1 to safe stems derived from each dataset's element_identifier, with a $used list to disambiguate name collisions by appending the index. This makes the auto-generated datasets: keys meaningful in the resulting config/report.
  • Removed the webview_controls and overwrite_output advanced options (both marked "not required" / blank-suggested). The --overwrite-output flag is now always passed since the tool always renders into a fresh report_output directory.
  • max_in_memory_rows now has value="20000" matching the datavzrd default, instead of optional="true".
  • The zip test output now asserts the archive contents (index.html, static/bundle.js) via has_archive_member.
  • Test 3's command assertion was updated from the now-removed --overwrite-output param logic to max-in-memory-rows=500, and test 5's not_has_text for webview-controls was dropped along with the option itself.
  • Help section updated to remove the webview-controls bullet.

One technical note: the reviewer's snippet used re.sub(...) in the command template without an import, but Cheetah templates don't have re in scope by default — I added #import re at the top of the command, which is what made the template evaluate correctly (without it all tests failed with NameError: re).

Agent tool call trace

read_file({"path": "datavzrd_render.xml"})

<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">
    <description>Render visual and interactive HTML reports from tabular data</description>
    <macros>
        <import>macros.xml</import>
    </macros>
    <expand macro="render_requirements"/>
    <expand macro="version_command"/>
    <command detect_errors="aggressive"><![CDATA[
## Symlink the input tables into the working directory using safe names
## so that they can be referenc

read_file({"path": "macros.xml"})

<macros>
    <token name="@TOOL_VERSION@">2.71.3</token>
    <token name="@VERSION_SUFFIX@">0</token>
    <token name="@PROFILE@">25.0</token>
    <xml name="render_requirements">
        <requirements>
            <requirement type="package" version="@TOOL_VERSION@">datavzrd</requirement>
            <requirement type="package" version="3.13">python</requirement>
            <requirement type="package" version="6.0.3">pyyaml</requirement>
            <requirement type="package" version="3.0">zi

read_file({"path": ".shed.yml"})

categories:
- Data Visualization
description: Render visual and interactive HTML reports from tabular data with datavzrd
homepage_url: https://github.com/datavzrd/datavzrd
long_description: |
  Datavzrd creates visual and interactive HTML reports from collections of tabular
  data (CSV, TSV, JSON or Parquet). Reports include automatically generated vega-lite
  plots per column, searching, sorting and filtering, and can be fully customized via a
  YAML configuration file supporting custom plots, 

read_file({"path": "datavzrd_config.py"})

#!/usr/bin/env python3
"""Helper script to adapt datavzrd report configuration files for Galaxy.

Subcommands:
    rewrite: rewrite the dataset paths of a config file to point to the
             Galaxy input files. Datasets are matched to the input files
             in the order in which they appear in the config file.
    set:     set one or more top-level key-value pairs in a config file.
"""

import argparse
import sys

import yaml


def load_config(path):
    with open(path, "r", encoding=

write_file({"content": "\n <token name="@TOOL_VERSION@">2.72.0\n <token name="@VERSION_SUFFIX@">0\n <token name="@Profile@">25.0\n <xml name="render_requirements">\n \n <requirement type="package" version="@TOOL_VERSION@">datavzrd\n <requirement type="package" version="3.13">python\n <requirement type="package" version="6.0.3">pyyaml\n <requirement type="package" version="3.0">zip\n \n \n <xml name="version_command">\n <version_command>datavzrd --version</version_command>\n \n <xml name="report_name">\n <param name="report_name" type="text" value="Datavzrd Report" label="Report name" help="Name of the generated report, shown in the report header">\n <validator type="regex" message="Report name must not contain single quotes, backslashes or newline characters">^[^'\\\\\\n\\r]+$\n \n \n <xml name="citations">\n \n <citation type="doi">10.1371/journal.pone.0323079\n \n \n \n\n", "path": "macros.xml"})

File written: macros.xml

write_file({"content": "categories:\n- Visualization\ndescription: Render visual and interactive HTML reports from tabular data with datavzrd\nhomepage_url: https://github.com/datavzrd/datavzrd\nlong_description: |\n Datavzrd creates visual and interactive HTML reports from collections of tabular\n data (CSV, TSV, JSON or Parquet). Reports include automatically generated vega-lite\n plots per column, searching, sorting and filtering, and can be fully customized via a\n YAML configuration file supporting custom plots, heatmaps, linkouts and inter-table\n linking.\nname: datavzrd\nowner: bgruening\nremote_repository_url: https://github.com/bgruening/galaxytools/tree/master/tools/datavzrd\ntype: unrestricted\n", "path": ".shed.yml"})

File written: .shed.yml

write_file({"content": "<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@Profile@">\n Render visual and interactive HTML reports from tabular data\n \n macros.xml\n \n <expand macro="render_requirements"/>\n <required_files>\n <include path="datavzrd_config.py"/>\n </required_files>\n <expand macro="version_command"/>\n <command detect_errors="aggressive"> config.yaml &&\n#else:\n ## Rewrite the dataset paths of the user-provided configuration file\n ## to point to the input tables of this job\n python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&\n#end if\n\n## Apply advanced options to the configuration file\n#set $adv_args = []\n#if $adv.max_in_memory_rows:\n #silent $adv_args.append('max-in-memory-rows=' + str($adv.max_in_memory_rows))\n#end if\n#if $adv_args:\n python '$__tool_directory__/datavzrd_config.py' set config.yaml --output config.yaml #echo ' '.join($adv_args)# &&\n#end if\n\n## Render the report\ndatavzrd config.yaml --output report_output &&\n\n## Collect the output\n#if $output_format == 'html':\n mkdir -p '${output_html.files_path}' &&\n mv report_output/index.html '${output_html}' &&\n mv report_output/* '${output_html.files_path}/'\n#else:\n cd report_output &&\n zip -q -r ../report.zip . &&\n cd .. &&\n mv report.zip '${output_zip}'\n#end if\n ]]>\n \n <param name="input_data" type="data" format="csv,tsv,tabular,json,parquet" multiple="true" label="Input table(s)" help="One or more tabular datasets (CSV, TSV, JSON or Parquet) to include in the report. When using a custom configuration file, provide the tables in the same order as the datasets defined in that configuration file."/>\n <conditional name="config_mode">\n <param name="config_mode_selector" type="select" label="Configuration">\n <option value="auto" selected="true">Auto-generate the configuration from the input tables\n <option value="provide">Provide a datavzrd configuration file\n \n <when value="auto">\n <expand macro="report_name"/>\n \n <when value="provide">\n <param name="config_file" type="data" format="yaml" label="datavzrd configuration file" help="A datavzrd YAML configuration file. The dataset 'path' entries are rewritten to the input tables above (matched in the order in which the datasets appear in that configuration file), so any path can be used there. Note that relative references to external files (spec-path, script-path, custom-path, render-img paths) are not supported - use the inline 'spec' or 'custom' fields instead."/>\n \n \n <param name="output_format" type="select" label="Output format">\n <option value="html" selected="true">Interactive HTML report (displayed in Galaxy)\n <option value="zip">Zipped report directory\n \n <section name="adv" title="Advanced options" expanded="false">\n <param name="max_in_memory_rows" type="integer" value="20000" min="1" label="Maximum in-memory rows" help="Maximum number of rows of a table that are rendered into a single page (default: 20000). Tables with more rows are split into searchable pages."/>\n \n \n \n <data name="output_html" format="html" label="${tool.name} on ${on_string}: interactive report">\n output_format == 'html'\n \n <data name="output_zip" format="zip" label="${tool.name} on ${on_string}: zipped report">\n output_format == 'zip'\n \n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Oscars Report"/>\n <has_text text="static/bundle.js"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Datavzrd Report"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="provide"/>\n <param name="config_file" value="example-config.yaml" ftype="yaml"/>\n \n <section name="adv">\n <param name="max_in_memory_rows" value="500"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="My oscar report"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="max-in-memory-rows=500"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="genes.tsv" ftype="tsv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Gene Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Gene Report"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="-s $'\t'"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="zip"/>\n <assert_command>\n <has_text text="zip -q -r ../report.zip"/>\n </assert_command>\n <output name="output_zip" ftype="zip">\n <assert_contents>\n <has_archive_member path="index.html"/>\n <has_archive_member path="static/bundle.js"/>\n </assert_contents>\n \n \n \n <help format="markdown">\n <expand macro="citations"/>\n\n", "path": "datavzrd_render.xml"})

File written: datavzrd_render.xml

planemo_lint({"path": "."})

Linting tool /home/runner/work/galaxytools/galaxytools/tools/datavzrd/datavzrd_render.xml
.. CHECK (TestsNoValid): 5 test(s) found.
.. INFO (OutputsNumber): 2 outputs found.
.. INFO (InputsNum): Found 6 input parameters.
.. CHECK (HelpPresent): Tool contains help section.
.. CHECK (ToolIDValid): Tool defines an id [datavzrd_render].
.. CHECK (ToolNameValid): Tool defines a name [datavzrd].
.. CHECK (ToolProfileValid): Tool specifies profile version [25.0].
.. CHECK (ToolVersionValid): Tool defin

read_file({"path": "test-data/example-config.yaml"})

name: My oscar report
datasets:
  oscars:
    path: oscars.csv
    offer-excel: true
    links:
      link to oscar plot:
        column: age
        view: oscar-plot
      link to movie:
        column: movie
        table-row: movies/Title
  movies:
    path: movies.csv
    offer-excel: true
    links:
      link to oscar entry:
        column: Title
        table-row: oscars/movie
views:
  oscars:
    dataset: oscars
    desc: |
      ## All winning oscars beginning in the year 1929.
      Th

planemo_test({"path": "."})

### datavzrd_render-0 — failure
Output problems:
  - Job in error state.. tool_id: datavzrd_render, exit_code: None, stderr: .
  - Output output_html:  different than expected
Expected text 'Oscars Report' in output ('')

### datavzrd_render-1 — failure
Output problems:
  - Job in error state.. tool_id: datavzrd_render, exit_code: None, stderr: .
  - Output output_html:  different than expected
Expected text 'Datavzrd Report' in output ('')

### datavzrd_render-2 — failure
Output problems:
  - '

fetch_url({"url": "https://api.anaconda.org/package/bioconda/datavzrd"})

Error: Client error '404 Not Found' for url 'https://api.anaconda.org/package/bioconda/datavzrd'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

search_web({"query": "datavzrd conda package bioconda channel"})

No web search results found.

search_web({"query": "datavzrd conda package which channel forge"})

No web search results found.

fetch_url({"url": "https://api.anaconda.org/search?name=datavzrd"})

[
  {
    "name": "datavzrd",
    "id": "620e137b061d72975e122950",
    "package_types": [
      "conda"
    ],
    "summary": "A tool to create visual interactive standalone HTML reports from collections of CSV/TSV tables",
    "description": "A tool to create visual and interactive standalone HTML reports from\ncollections of CSV/TSV tables.\nReports include automatically generated vega-lite histograms\nper column. Plots can be fully customized by users via a config file.\nThese also enable th

read_file({"path": "datavzrd_render.xml", "start_line": 11, "end_line": 20})

11:     <command detect_errors="aggressive"><![CDATA[
12: ## Symlink the input tables into the working directory using safe names
13: ## derived from the dataset names, so that they can be referenced from
14: ## the datavzrd configuration file.
15: #set $data_files = []
16: #set $suggest_args = []
17: #set $used = []
18: #for $i, $data_file in enumerate($input_data):
19:     #if $data_file.is_of_type('json'):
20:         #set $ext = 'json'

read_file({"end_line": 30, "path": "datavzrd_render.xml", "start_line": 28})

28:     #set $stem = re.sub('[^\w\-]', '_', str($data_file.element_identifier).rsplit('.', 1)[0])
29:     #if $stem in $used:
30:         #set $stem = $stem + '_' + str($i)

write_file({"content": " <command detect_errors="aggressive"><![CDATA[\n## Symlink the input tables into the working directory using safe names\n## derived from the dataset names, so that they can be referenced from\n## the datavzrd configuration file.\n#import re\n#set $data_files = []\n#set $suggest_args = []\n#set $used = []\n#for $i, $data_file in enumerate($input_data):\n #if $data_file.is_of_type('json'):\n #set $ext = 'json'\n #elif $data_file.is_of_type('parquet'):\n #set $ext = 'parquet'\n #elif $data_file.is_of_type('csv'):\n #set $ext = 'csv'\n #else:\n #set $ext = 'tsv'\n #end if\n #set $stem = re.sub('[^\\w\\-]', '', str($data_file.element_identifier).rsplit('.', 1)[0])\n #if $stem in $used:\n #set $stem = $stem + '' + str($i)\n #end if\n #silent $used.append($stem)\n #set $fname = $stem + '.' + $ext\n #silent $data_files.append($fname)\n ln -s '${data_file}' '${fname}' &&\n #if $ext == 'tsv':\n #silent $suggest_args.append("-f '" + $fname + "' -s $'\\t'")\n #else:\n #silent $suggest_args.append("-f '" + $fname + "' -s ','")\n #end if\n#end for\n", "path": "datavzrd_render.xml"})

File written: datavzrd_render.xml

read_file({"path": "datavzrd_render.xml"})

    <command detect_errors="aggressive"><![CDATA[
## Symlink the input tables into the working directory using safe names
## derived from the dataset names, so that they can be referenced from
## the datavzrd configuration file.
#import re
#set $data_files = []
#set $suggest_args = []
#set $used = []
#for $i, $data_file in enumerate($input_data):
    #if $data_file.is_of_type('json'):
        #set $ext = 'json'
    #elif $data_file.is_of_type('parquet'):
        #set $ext = 'parquet'
    #elif $

write_file({"content": "<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@Profile@">\n Render visual and interactive HTML reports from tabular data\n \n macros.xml\n \n <expand macro="render_requirements"/>\n <required_files>\n <include path="datavzrd_config.py"/>\n </required_files>\n <expand macro="version_command"/>\n <command detect_errors="aggressive"> config.yaml &&\n#else:\n ## Rewrite the dataset paths of the user-provided configuration file\n ## to point to the input tables of this job\n python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&\n#end if\n\n## Apply advanced options to the configuration file\n#set $adv_args = []\n#if $adv.max_in_memory_rows:\n #silent $adv_args.append('max-in-memory-rows=' + str($adv.max_in_memory_rows))\n#end if\n#if $adv.webview_controls:\n #silent $adv_args.append('webview-controls=true')\n#end if\n#if $adv_args:\n python '$__tool_directory__/datavzrd_config.py' set config.yaml --output config.yaml #echo ' '.join($adv_args)# &&\n#end if\n\n## Render the report\ndatavzrd config.yaml --output report_output --overwrite-output &&\n\n## Collect the output\n#if $output_format == 'html':\n mkdir -p '${output_html.files_path}' &&\n mv report_output/index.html '${output_html}' &&\n mv report_output/* '${output_html.files_path}/'\n#else:\n cd report_output &&\n zip -q -r ../report.zip . &&\n cd .. &&\n mv report.zip '${output_zip}'\n#end if\n ]]>\n \n <param name="input_data" type="data" format="csv,tsv,tabular,json,parquet" multiple="true" label="Input table(s)" help="One or more tabular datasets (CSV, TSV, JSON or Parquet) to include in the report. When using a custom configuration file, provide the tables in the same order as the datasets defined in that configuration file."/>\n <conditional name="config_mode">\n <param name="config_mode_selector" type="select" label="Configuration">\n <option value="auto" selected="true">Auto-generate the configuration from the input tables\n <option value="provide">Provide a datavzrd configuration file\n \n <when value="auto">\n <expand macro="report_name"/>\n \n <when value="provide">\n <param name="config_file" type="data" format="yaml" label="datavzrd configuration file" help="A datavzrd YAML configuration file. The dataset 'path' entries are rewritten to the input tables above (matched in the order in which the datasets appear in the configuration file), so any path can be used there. Note that relative references to external files (spec-path, script-path, custom-path, render-img paths) are not supported - use the inline 'spec' or 'custom' fields instead."/>\n \n \n <param name="output_format" type="select" label="Output format">\n <option value="html" selected="true">Interactive HTML report (displayed in Galaxy)\n <option value="zip">Zipped report directory\n \n <section name="adv" title="Advanced options" expanded="false">\n <param name="max_in_memory_rows" type="integer" value="20000" min="1" label="Maximum in-memory rows" help="Maximum number of rows of a table that are rendered into a single page (default: 20000). Tables with more rows are split into searchable pages."/>\n <param name="webview_controls" type="boolean" checked="false" label="Enable webview sharing controls" help="Adds sharing controls to the report that allow exporting the displayed data to datavzrd's webview host (https://datavzrd.github.io/view/).\"/>\n \n \n \n <data name="output_html" format="html" label="${tool.name} on ${on_string}: interactive report">\n output_format == 'html'\n \n <data name="output_zip" format="zip" label="${tool.name} on ${on_string}: zipped report">\n output_format == 'zip'\n \n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Oscars Report"/>\n <has_text text="static/bundle.js"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Datavzrd Report"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="provide"/>\n <param name="config_file" value="example-config.yaml" ftype="yaml"/>\n \n <section name="adv">\n <param name="max_in_memory_rows" value="500"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="My oscar report"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="max-in-memory-rows=500"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="genes.tsv" ftype="tsv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Gene Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Gene Report"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="-s $'\t'"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="zip"/>\n <assert_command>\n <has_text text="zip -q -r ../report.zip"/>\n <not_has_text text="webview-controls"/>\n </assert_command>\n <output name="output_zip" ftype="zip">\n <assert_contents>\n <has_archive_member path="index.html"/>\n <has_archive_member path="static/bundle.js"/>\n </assert_contents>\n \n \n \n <help format="markdown">\n <expand macro="citations"/>\n\n", "path": "datavzrd_render.xml"})

File written: datavzrd_render.xml

planemo_lint({"path": "."})

Linting tool /home/runner/work/galaxytools/galaxytools/tools/datavzrd/datavzrd_render.xml
.. CHECK (TestsNoValid): 5 test(s) found.
.. INFO (OutputsNumber): 2 outputs found.
.. INFO (InputsNum): Found 7 input parameters.
.. CHECK (HelpPresent): Tool contains help section.
.. CHECK (ToolIDValid): Tool defines an id [datavzrd_render].
.. CHECK (ToolNameValid): Tool defines a name [datavzrd].
.. CHECK (ToolProfileValid): Tool specifies profile version [25.0].
.. CHECK (ToolVersionValid): Tool defin

planemo_test({"path": "."})

All 5 tests passed.

write_file({"content": "<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@Profile@">\n Render visual and interactive HTML reports from tabular data\n \n macros.xml\n \n <expand macro="render_requirements"/>\n <required_files>\n <include path="datavzrd_config.py"/>\n </required_files>\n <expand macro="version_command"/>\n <command detect_errors="aggressive"> config.yaml &&\n#else:\n ## Rewrite the dataset paths of the user-provided configuration file\n ## to point to the input tables of this job\n python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&\n#end if\n\n## Apply advanced options to the configuration file\n#set $adv_args = []\n#if $adv.max_in_memory_rows:\n #silent $adv_args.append('max-in-memory-rows=' + str($adv.max_in_memory_rows))\n#end if\n#if $adv_args:\n python '$__tool_directory__/datavzrd_config.py' set config.yaml --output config.yaml #echo ' '.join($adv_args)# &&\n#end if\n\n## Render the report\ndatavzrd config.yaml --output report_output --overwrite-output &&\n\n## Collect the output\n#if $output_format == 'html':\n mkdir -p '${output_html.files_path}' &&\n mv report_output/index.html '${output_html}' &&\n mv report_output/* '${output_html.files_path}/'\n#else:\n cd report_output &&\n zip -q -r ../report.zip . &&\n cd .. &&\n mv report.zip '${output_zip}'\n#end if\n ]]>\n \n <param name="input_data" type="data" format="csv,tsv,tabular,json,parquet" multiple="true" label="Input table(s)" help="One or more tabular datasets (CSV, TSV, JSON or Parquet) to include in the report. When using a custom configuration file, provide the tables in the same order as the datasets defined in that configuration file."/>\n <conditional name="config_mode">\n <param name="config_mode_selector" type="select" label="Configuration">\n <option value="auto" selected="true">Auto-generate the configuration from the input tables\n <option value="provide">Provide a datavzrd configuration file\n \n <when value="auto">\n <expand macro="report_name"/>\n \n <when value="provide">\n <param name="config_file" type="data" format="yaml" label="datavzrd configuration file" help="A datavzrd YAML configuration file. The dataset 'path' entries are rewritten to the input tables above (matched in the order in which the datasets appear in the configuration file), so any path can be used there. Note that relative references to external files (spec-path, script-path, custom-path, render-img paths) are not supported - use the inline 'spec' or 'custom' fields instead."/>\n \n \n <param name="output_format" type="select" label="Output format">\n <option value="html" selected="true">Interactive HTML report (displayed in Galaxy)\n <option value="zip">Zipped report directory\n \n <section name="adv" title="Advanced options" expanded="false">\n <param name="max_in_memory_rows" type="integer" value="20000" min="1" label="Maximum in-memory rows" help="Maximum number of rows of a table that are rendered into a single page (default: 20000). Tables with more rows are split into searchable pages."/>\n \n \n \n <data name="output_html" format="html" label="${tool.name} on ${on_string}: interactive report">\n output_format == 'html'\n \n <data name="output_zip" format="zip" label="${tool.name} on ${on_string}: zipped report">\n output_format == 'zip'\n \n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Oscars Report"/>\n <has_text text="static/bundle.js"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Datavzrd Report"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="provide"/>\n <param name="config_file" value="example-config.yaml" ftype="yaml"/>\n \n <section name="adv">\n <param name="max_in_memory_rows" value="500"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="My oscar report"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="max-in-memory-rows=500"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="genes.tsv" ftype="tsv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Gene Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="Gene Report"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="-s $'\t'"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="zip"/>\n <assert_command>\n <has_text text="zip -q -r ../report.zip"/>\n </assert_command>\n <output name="output_zip" ftype="zip">\n <assert_contents>\n <has_archive_member path="index.html"/>\n <has_archive_member path="static/bundle.js"/>\n </assert_contents>\n \n \n \n <help format="markdown">\n <expand macro="citations"/>\n\n", "path": "datavzrd_render.xml"})

File written: datavzrd_render.xml

planemo_lint({"path": "."})

Linting tool /home/runner/work/galaxytools/galaxytools/tools/datavzrd/datavzrd_render.xml
.. CHECK (TestsNoValid): 5 test(s) found.
.. INFO (OutputsNumber): 2 outputs found.
.. INFO (InputsNum): Found 6 input parameters.
.. CHECK (HelpPresent): Tool contains help section.
.. CHECK (ToolIDValid): Tool defines an id [datavzrd_render].
.. CHECK (ToolNameValid): Tool defines a name [datavzrd].
.. CHECK (ToolProfileValid): Tool specifies profile version [25.0].
.. CHECK (ToolVersionValid): Tool defin

planemo_test({"path": "."})

All 5 tests passed.

Comment thread tools/datavzrd/datavzrd_render.xml Outdated
<output name="output_html" ftype="html">
<assert_contents>
<has_text text="Oscars Report"/>
<has_text text="static/bundle.js"/>

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a bit unspecific maybe number of lines with a large delta?

Comment thread tools/datavzrd/datavzrd_render.xml Outdated
<param name="output_format" value="html"/>
<output name="output_html" ftype="html">
<assert_contents>
<has_text text="Gene Report"/>

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we need to be more specific here ...

html, could also be a valid XML ... so you maybe can use the XML specific assertions

Comment thread tools/datavzrd/datavzrd_render.xml Outdated
Comment on lines +214 to +217
## Credits

Datavzrd was developed by Felix Wiegand, Johannes Köster and colleagues. Source code and documentation are available at https://github.com/datavzrd/datavzrd.
]]></help>

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have explicit citations for this

Comment thread tools/datavzrd/datavzrd_render.xml Outdated

The interactive HTML report can be displayed directly in Galaxy (choose *Interactive HTML report*). All report files (tables, plots and data) are stored alongside the displayed `index.html`. Alternatively, the whole report directory can be returned as a zip archive, e.g. for sharing or archiving of large reports.

## Advanced options

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why repeating this here again?

</test>
<!-- Test 03: user-provided configuration file with advanced options -->
<test expect_num_outputs="1">
<param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

those names here need to match exactly the names in the config file ...

I think this deserves an example in the help section. Also raising the fact that those names need to be unique.

@SaimMomin12 SaimMomin12 added the address-feedback ask gxy-tool-bot to address pr feedback label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

🔧 Addressing feedback — view progress

@github-actions github-actions Bot removed the address-feedback ask gxy-tool-bot to address pr feedback label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

🔧 Addressed feedback — 8 files in tool directory

⚠️ Incomplete:

⚠️ Agent did not naturally terminate after 30 iterations. Output may be incomplete.

Agent tool call trace

read_file({"path": "datavzrd_render.xml"})

<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">
    <description>Render visual and interactive HTML reports from tabular data</description>
    <macros>
        <import>macros.xml</import>
    </macros>
    <expand macro="render_requirements"/>
    <required_files>
        <include path="datavzrd_config.py"/>
    </required_files>
    <expand macro="version_command"/>
    <command detect_errors="aggressive"><![CDATA[
## Symlink the 

read_file({"path": "macros.xml"})

<macros>
    <token name="@TOOL_VERSION@">2.72.0</token>
    <token name="@VERSION_SUFFIX@">0</token>
    <token name="@PROFILE@">25.0</token>
    <xml name="render_requirements">
        <requirements>
            <requirement type="package" version="@TOOL_VERSION@">datavzrd</requirement>
            <requirement type="package" version="3.13">python</requirement>
            <requirement type="package" version="6.0.3">pyyaml</requirement>
            <requirement type="package" version="3.0">zi

read_file({"path": "datavzrd_config.py"})

#!/usr/bin/env python3
"""Helper script to adapt datavzrd report configuration files for Galaxy.

Subcommands:
    rewrite: rewrite the dataset paths of a config file to point to the
             Galaxy input files. Datasets are matched to the input files
             in the order in which they appear in the config file.
    set:     set one or more top-level key-value pairs in a config file.
"""

import argparse
import sys

import yaml


def load_config(path):
    with open(path, "r", encoding=

read_file({"path": "test-data/example-config.yaml"})

name: My oscar report
datasets:
  oscars:
    path: oscars.csv
    offer-excel: true
    links:
      link to oscar plot:
        column: age
        view: oscar-plot
      link to movie:
        column: movie
        table-row: movies/Title
  movies:
    path: movies.csv
    offer-excel: true
    links:
      link to oscar entry:
        column: Title
        table-row: oscars/movie
views:
  oscars:
    dataset: oscars
    desc: |
      ## All winning oscars beginning in the year 1929.
      Th

read_file({"path": "datavzrd_render.xml", "start_line": 50, "end_line": 60})

50:     ## to point to the input tables of this job
51:     python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&
52: #end if
53: 
54: ## Apply advanced options to the configuration file
55: #set $adv_args = []
56: #if $adv.max_in_memory_rows:
57:     #silent $adv_args.append('max-in-memory-rows=' + str($adv.max_in_memory_rows))
58: #end if
59: #if $adv_args:
60:     python '$__tool_directory__/datavzr

read_file({"end_line": 225, "start_line": 100, "path": "datavzrd_render.xml"})

100:     <outputs>
101:         <data name="output_html" format="html" label="${tool.name} on ${on_string}: interactive report">
102:             <filter>output_format == 'html'</filter>
103:         </data>
104:         <data name="output_zip" format="zip" label="${tool.name} on ${on_string}: zipped report">
105:             <filter>output_format == 'zip'</filter>
106:         </data>
107:     </outputs>
108:     <tests>
109:         <!-- Test 01: auto-generated configuration from a single CSV 

read_file({"end_line": 92, "path": "datavzrd_render.xml", "start_line": 82})

82:                 <option value="auto" selected="true">Auto-generate the configuration from the input tables</option>
83:                 <option value="provide">Provide a datavzrd configuration file</option>
84:             </param>
85:             <when value="auto">
86:                 <expand macro="report_name"/>
87:             </when>
88:             <when value="provide">
89:                 <param name="config_file" type="data" format="yaml" label="datavzrd configuration file" help="A

search_github({"query": "has_n_lines delta tool test assert_contents galaxy"})

No GitHub repo found.

search_github({"query": "has_element_with_text has_attribute xpath assert_contents XML galaxy tool"})

No GitHub repo found.

fetch_url({"url": "https://raw.githubusercontent.com/datavzrd/datavzrd/v2.72.0/src/templates/index.html"})

Error: Client error '404 Not Found' for url 'https://raw.githubusercontent.com/datavzrd/datavzrd/v2.72.0/src/templates/index.html'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

search_web({"query": "datavzrd PLOS ONE 10.1371/journal.pone.0323079 Wiegand K\u00f6ster"})

No web search results found.

search_github({"query": "datavzrd report index.html templates Tera"})

No GitHub repo found.

search_github({"query": "journal.pone.0323079 datavzrd"})

No GitHub repo found.

fetch_url({"url": "https://api.github.com/search/code?q=repo:datavzrd/datavzrd+filename:index.html"})

Error: Client error '401 Unauthorized' for url 'https://api.github.com/search/code?q=repo:datavzrd/datavzrd+filename:index.html'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401

fetch_url({"url": "https://api.github.com/repos/datavzrd/datavzrd/contents/src/render_table.rs?ref=v2.72.0"})

Error: Client error '404 Not Found' for url 'https://api.github.com/repos/datavzrd/datavzrd/contents/src/render_table.rs?ref=v2.72.0'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

fetch_url({"url": "https://api.github.com/repos/datavzrd/datavzrd/contents/?ref=v2.72.0"})

[{"name":".examples","path":".examples","sha":"ad97dfa62f2a3ad8c9d9683438980f7df73c8cca","size":0,"url":"https://api.github.com/repos/datavzrd/datavzrd/contents/.examples?ref=v2.72.0","html_url":"https://github.com/datavzrd/datavzrd/tree/v2.72.0/.examples","git_url":"https://api.github.com/repos/datavzrd/datavzrd/git/trees/ad97dfa62f2a3ad8c9d9683438980f7df73c8cca","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/datavzrd/datavzrd/contents/.examples?ref=v2.72.0","gi

fetch_url({"url": "https://api.github.com/repos/datavzrd/datavzrd/contents/templates?ref=v2.72.0"})

[{"name":"bar_plot.vl.tera","path":"templates/bar_plot.vl.tera","sha":"f0c62fd7ea9f2e782ccb887720cd3c84f537b1cc","size":1744,"url":"https://api.github.com/repos/datavzrd/datavzrd/contents/templates/bar_plot.vl.tera?ref=v2.72.0","html_url":"https://github.com/datavzrd/datavzrd/blob/v2.72.0/templates/bar_plot.vl.tera","git_url":"https://api.github.com/repos/datavzrd/datavzrd/git/blobs/f0c62fd7ea9f2e782ccb887720cd3c84f537b1cc","download_url":"https://raw.githubusercontent.com/datavzrd/datavzrd/v2.7

fetch_url({"url": "https://raw.githubusercontent.com/datavzrd/datavzrd/v2.72.0/templates/index.html.tera"})

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Datavzrd</title>
</head>
<body>
<script src="./static/bundle.js"></script>
<script type="text/javascript">
    const urlParams = new URLSearchParams(window.location.search);
    const viewParam = urlParams.get('view');
    const version = '{{ version }}';
    const name = '{{ name }}';
    const views = {{ views | json_encode}};
    const table = {{ table | json_encode }};
    let redirectUrl = viewParam ? `${viewParam

fetch_url({"url": "https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tools/verify/asserts/__init__.py"})

Error: Client error '404 Not Found' for url 'https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tools/verify/asserts/__init__.py'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

fetch_url({"url": "https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tools/verify/asserts/__init__.py"})

Error: Client error '404 Not Found' for url 'https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tools/verify/asserts/__init__.py'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

fetch_url({"url": "https://api.github.com/repos/galaxyproject/galaxy/contents/lib/galaxy/tools/verify/asserts"})

Error: Client error '404 Not Found' for url 'https://api.github.com/repos/galaxyproject/galaxy/contents/lib/galaxy/tools/verify/asserts'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

search_github({"query": "galaxy verify asserts has_n_lines xml"})

No GitHub repo found.

search_web({"query": "galaxy tool xml assertion tag "has_n_lines" delta attribute"})

No web search results found.

fetch_url({"url": "https://raw.githubusercontent.com/galaxyproject/galaxy/master/lib/galaxy/tools/verify/asserts/__init__.py"})

Error: Client error '404 Not Found' for url 'https://raw.githubusercontent.com/galaxyproject/galaxy/master/lib/galaxy/tools/verify/asserts/__init__.py'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

fetch_url({"url": "https://api.github.com/search/code?q=has_n_lines+repo:galaxyproject/galaxy&per_page=5"})

Error: Client error '401 Unauthorized' for url 'https://api.github.com/search/code?q=has_n_lines+repo:galaxyproject/galaxy&per_page=5'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401

search_web({"query": ""has_n_lines" planemo verify assertion"})

No web search results found.

fetch_url({"url": "https://docs.galaxyproject.org/en/latest/dev/schema.html"})





<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="../">
<head>
  <meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Galaxy Tool XML File &mdash; Galaxy Project 26.2.dev0 documentation</title>
      <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=03e43079" />
      <link rel="stylesheet" type="text/css" href="../_static/c

fetch_url({"url": "https://raw.githubusercontent.com/datavzrd/datavzrd/v2.72.0/README.md"})

[![PLOS ONE](https://img.shields.io/badge/PLOS%20ONE-10.1371%2Fjournal.pone.0323079-blue.svg)](https://doi.org/10.1371/journal.pone.0323079)
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/datavzrd/datavzrd/rust.yml?branch=main&label=tests)](https://github.com/datavzrd/datavzrd/actions)
[![Conda Recipe](https://img.shields.io/badge/recipe-datavzrd-green.svg)](https://anaconda.org/conda-forge/datavzrd)
[![Conda Downloads](https://img.shields.io/conda/dn/conda-forg

search_bio_tools({"query": "datavzrd"})

No bio.tools entries found.

read_file({"end_line": 60, "path": "datavzrd_render.xml", "start_line": 40})

40:         #silent $suggest_args.append("-f '" + $fname + "' -s ','")
41:     #end if
42: #end for
43: 
44: ## Build the datavzrd configuration file
45: #if $config_mode.config_mode_selector == 'auto':
46:     ## Let datavzrd suggest a configuration from the given input tables
47:     datavzrd suggest #echo ' '.join($suggest_args)# --name '${config_mode.report_name}' > config.yaml &&
48: #else:
49:     ## Rewrite the dataset paths of the user-provided configuration file
50:     ## to point to t

read_file({"end_line": 39, "path": "datavzrd_render.xml", "start_line": 1})

1: <tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">
2:     <description>Render visual and interactive HTML reports from tabular data</description>
3:     <macros>
4:         <import>macros.xml</import>
5:     </macros>
6:     <expand macro="render_requirements"/>
7:     <required_files>
8:         <include path="datavzrd_config.py"/>
9:     </required_files>
10:     <expand macro="version_command"/>
11:     <command detect_errors="ag

read_file({"end_line": 110, "path": "datavzrd_render.xml", "start_line": 60})

60:     python '$__tool_directory__/datavzrd_config.py' set config.yaml --output config.yaml #echo ' '.join($adv_args)# &&
61: #end if
62: 
63: ## Render the report
64: datavzrd config.yaml --output report_output --overwrite-output &&
65: 
66: ## Collect the output
67: #if $output_format == 'html':
68:     mkdir -p '${output_html.files_path}' &&
69:     mv report_output/index.html '${output_html}' &&
70:     mv report_output/* '${output_html.files_path}/'
71: #else:
72:     cd report_output &&
7

read_file({"end_line": 230, "path": "datavzrd_render.xml", "start_line": 108})

108:     <tests>
109:         <!-- Test 01: auto-generated configuration from a single CSV -->
110:         <test expect_num_outputs="1">
111:             <param name="input_data" value="oscars.csv" ftype="csv"/>
112:             <conditional name="config_mode">
113:                 <param name="config_mode_selector" value="auto"/>
114:                 <param name="report_name" value="Oscars Report"/>
115:             </conditional>
116:             <param name="output_format" value="html"/>
117

read_file({"path": "macros.xml"})

<macros>
    <token name="@TOOL_VERSION@">2.72.0</token>
    <token name="@VERSION_SUFFIX@">0</token>
    <token name="@PROFILE@">25.0</token>
    <xml name="render_requirements">
        <requirements>
            <requirement type="package" version="@TOOL_VERSION@">datavzrd</requirement>
            <requirement type="package" version="3.13">python</requirement>
            <requirement type="package" version="6.0.3">pyyaml</requirement>
            <requirement type="package" version="3.0">zi

read_file({"path": "datavzrd_config.py"})

#!/usr/bin/env python3
"""Helper script to adapt datavzrd report configuration files for Galaxy.

Subcommands:
    rewrite: rewrite the dataset paths of a config file to point to the
             Galaxy input files. Datasets are matched to the input files
             in the order in which they appear in the config file.
    set:     set one or more top-level key-value pairs in a config file.
"""

import argparse
import sys

import yaml


def load_config(path):
    with open(path, "r", encoding=

read_file({"path": "test-data/example-config.yaml"})

name: My oscar report
datasets:
  oscars:
    path: oscars.csv
    offer-excel: true
    links:
      link to oscar plot:
        column: age
        view: oscar-plot
      link to movie:
        column: movie
        table-row: movies/Title
  movies:
    path: movies.csv
    offer-excel: true
    links:
      link to oscar entry:
        column: Title
        table-row: oscars/movie
views:
  oscars:
    dataset: oscars
    desc: |
      ## All winning oscars beginning in the year 1929.
      Th

fetch_url({"url": "https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tool_util/xsd/tool.xsd"})

Error: Client error '404 Not Found' for url 'https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tool_util/xsd/tool.xsd'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

fetch_url({"url": "https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tool_util/xsd/galaxy.xsd"})

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gxdocs="http://galaxyproject.org/xml/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:annotation>
    <xs:appinfo>Galaxy Schema</xs:appinfo>
    <xs:documentation xml:lang="en">A Galaxy XML tool wrapper</xs:documentation>
  </xs:annotation>
  <xs:element name="tool">
    <xs:annotation gxdocs:best_practices="tools">
      <xs:documentation xml:lang="en"><![CDATA[
The o

read_file({"end_line": 58, "path": "datavzrd_render.xml", "start_line": 50})

50:     ## to point to the input tables of this job
51:     python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&
52: #end if
53: 
54: ## Apply advanced options to the configuration file
55: #set $adv_args = []
56: #if $adv.max_in_memory_rows:
57:     #silent $adv_args.append('max-in-memory-rows=' + str($adv.max_in_memory_rows))
58: #end if

read_file({"end_line": 92, "path": "datavzrd_render.xml", "start_line": 84})

84:             </param>
85:             <when value="auto">
86:                 <expand macro="report_name"/>
87:             </when>
88:             <when value="provide">
89:                 <param name="config_file" type="data" format="yaml" label="datavzrd configuration file" help="A datavzrd YAML configuration file. The dataset 'path' entries are rewritten to the input tables above (matched in the order in which the datasets appear in the configuration file), so any path can be used there.

@SaimMomin12 SaimMomin12 added the address-feedback ask gxy-tool-bot to address pr feedback label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

🔧 Addressing feedback — view progress

@github-actions github-actions Bot removed the address-feedback ask gxy-tool-bot to address pr feedback label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

⚠️ Failed to address feedback: Client error '400 Bad Request' for url 'https://llm.ai.e-infra.cz/chat/completions'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400

@SaimMomin12 SaimMomin12 added the address-feedback ask gxy-tool-bot to address pr feedback label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

🔧 Addressing feedback — view progress

@github-actions github-actions Bot removed the address-feedback ask gxy-tool-bot to address pr feedback label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

🔧 Addressed feedback — 8 files in tool directory

⚠️ Incomplete:

⚠️ Agent did not naturally terminate after 30 iterations. Output may be incomplete.

Agent tool call trace

read_file({"path": "datavzrd_render.xml"})

<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">
    <description>Render visual and interactive HTML reports from tabular data</description>
    <macros>
        <import>macros.xml</import>
    </macros>
    <expand macro="render_requirements"/>
    <required_files>
        <include path="datavzrd_config.py"/>
    </required_files>
    <expand macro="version_command"/>
    <command detect_errors="aggressive"><![CDATA[
## Symlink the 

read_file({"path": "macros.xml"})

<macros>
    <token name="@TOOL_VERSION@">2.72.0</token>
    <token name="@VERSION_SUFFIX@">0</token>
    <token name="@PROFILE@">25.0</token>
    <xml name="render_requirements">
        <requirements>
            <requirement type="package" version="@TOOL_VERSION@">datavzrd</requirement>
            <requirement type="package" version="3.13">python</requirement>
            <requirement type="package" version="6.0.3">pyyaml</requirement>
            <requirement type="package" version="3.0">zi

read_file({"end_line": 230, "path": "datavzrd_render.xml", "start_line": 45})

45: #if $config_mode.config_mode_selector == 'auto':
46:     ## Let datavzrd suggest a configuration from the given input tables
47:     datavzrd suggest #echo ' '.join($suggest_args)# --name '${config_mode.report_name}' > config.yaml &&
48: #else:
49:     ## Rewrite the dataset paths of the user-provided configuration file
50:     ## to point to the input tables of this job
51:     python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($dat

read_file({"path": "datavzrd_config.py"})

#!/usr/bin/env python3
"""Helper script to adapt datavzrd report configuration files for Galaxy.

Subcommands:
    rewrite: rewrite the dataset paths of a config file to point to the
             Galaxy input files. Datasets are matched to the input files
             in the order in which they appear in the config file.
    set:     set one or more top-level key-value pairs in a config file.
"""

import argparse
import sys

import yaml


def load_config(path):
    with open(path, "r", encoding=

read_file({"path": "test-data/example-config.yaml"})

name: My oscar report
datasets:
  oscars:
    path: oscars.csv
    offer-excel: true
    links:
      link to oscar plot:
        column: age
        view: oscar-plot
      link to movie:
        column: movie
        table-row: movies/Title
  movies:
    path: movies.csv
    offer-excel: true
    links:
      link to oscar entry:
        column: Title
        table-row: oscars/movie
views:
  oscars:
    dataset: oscars
    desc: |
      ## All winning oscars beginning in the year 1929.
      Th

read_file({"path": ".shed.yml"})

categories:
- Visualization
description: Render visual and interactive HTML reports from tabular data with datavzrd
homepage_url: https://github.com/datavzrd/datavzrd
long_description: |
  Datavzrd creates visual and interactive HTML reports from collections of tabular
  data (CSV, TSV, JSON or Parquet). Reports include automatically generated vega-lite
  plots per column, searching, sorting and filtering, and can be fully customized via a
  YAML configuration file supporting custom plots, heatm

fetch_url({"url": "https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tool_util/verify/asserts/__init__.py"})

import logging
import sys
from collections.abc import Callable
from inspect import (
    getfullargspec,
    getmembers,
)
from tempfile import NamedTemporaryFile

from galaxy.util import unicodify
from galaxy.util.compression_utils import get_fileobj

log = logging.getLogger(__name__)

assertion_module_names = ["text", "tabular", "xml", "json", "hdf5", "archive", "size", "image"]

assertion_module_and_functions: dict[str, tuple[str, Callable]] = {}

for assertion_module_name in assertion_module

search_github({"query": "datavzrd index.html template site repo:datavzrd/datavzrd"})

No GitHub repo found.

fetch_url({"url": "https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tool_util/verify/asserts/xml.py"})

import re

from lxml.etree import XMLSyntaxError

from galaxy.tool_util.verify import asserts
from galaxy.util import (
    asbool,
    parse_xml_string,
    unicodify,
)
from ._types import (
    Annotated,
    AssertionParameter,
    ChildAssertions,
    Delta,
    Max,
    Min,
    N,
    Negate,
    NEGATE_DEFAULT,
    Output,
    VerifyAssertionsFunction,
    XmlBool,
    XmlRegex,
)
from ._util import _assert_presence_number

Path = Annotated[str, AssertionParameter("The Python xpath-like 

fetch_url({"url": "https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tool_util/verify/asserts/archive.py"})

import io
import re
import tarfile
import tempfile
import zipfile

from galaxy.util import asbool
from ._types import (
    Annotated,
    AssertionParameter,
    ChildAssertions,
    Delta,
    Max,
    Min,
    N,
    Negate,
    NEGATE_DEFAULT,
    OutputBytes,
    VerifyAssertionsFunction,
    XmlBool,
)
from ._util import _assert_presence_number


def _extract_from_tar(output_bytes, fn):
    with io.BytesIO(output_bytes) as temp:
        with tarfile.open(fileobj=temp, mode="r") as tar_temp

fetch_url({"url": "https://api.github.com/repos/datavzrd/datavzrd/contents/"})

[{"name":".examples","path":".examples","sha":"ad97dfa62f2a3ad8c9d9683438980f7df73c8cca","size":0,"url":"https://api.github.com/repos/datavzrd/datavzrd/contents/.examples?ref=main","html_url":"https://github.com/datavzrd/datavzrd/tree/main/.examples","git_url":"https://api.github.com/repos/datavzrd/datavzrd/git/trees/ad97dfa62f2a3ad8c9d9683438980f7df73c8cca","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/datavzrd/datavzrd/contents/.examples?ref=main","git":"https

fetch_url({"url": "https://raw.githubusercontent.com/datavzrd/datavzrd/main/templates/index.html"})

Error: Client error '404 Not Found' for url 'https://raw.githubusercontent.com/datavzrd/datavzrd/main/templates/index.html'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

fetch_url({"url": "https://api.github.com/repos/datavzrd/datavzrd/contents/templates?ref=main"})

[{"name":"bar_plot.vl.tera","path":"templates/bar_plot.vl.tera","sha":"f0c62fd7ea9f2e782ccb887720cd3c84f537b1cc","size":1744,"url":"https://api.github.com/repos/datavzrd/datavzrd/contents/templates/bar_plot.vl.tera?ref=main","html_url":"https://github.com/datavzrd/datavzrd/blob/main/templates/bar_plot.vl.tera","git_url":"https://api.github.com/repos/datavzrd/datavzrd/git/blobs/f0c62fd7ea9f2e782ccb887720cd3c84f537b1cc","download_url":"https://raw.githubusercontent.com/datavzrd/datavzrd/main/templ

fetch_url({"url": "https://raw.githubusercontent.com/datavzrd/datavzrd/main/templates/index.html.tera"})

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Datavzrd</title>
</head>
<body>
<script src="./static/bundle.js"></script>
<script type="text/javascript">
    const urlParams = new URLSearchParams(window.location.search);
    const viewParam = urlParams.get('view');
    const version = '{{ version }}';
    const name = '{{ name }}';
    const views = {{ views | json_encode}};
    const table = {{ table | json_encode }};
    let redirectUrl = viewParam ? `${viewParam

fetch_url({"url": "https://raw.githubusercontent.com/datavzrd/datavzrd/v2.72.0/templates/index.html.tera"})

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Datavzrd</title>
</head>
<body>
<script src="./static/bundle.js"></script>
<script type="text/javascript">
    const urlParams = new URLSearchParams(window.location.search);
    const viewParam = urlParams.get('view');
    const version = '{{ version }}';
    const name = '{{ name }}';
    const views = {{ views | json_encode}};
    const table = {{ table | json_encode }};
    let redirectUrl = viewParam ? `${viewParam

fetch_url({"url": "https://raw.githubusercontent.com/datavzrd/datavzrd/v2.72.0/templates/html.html.tera"})

<!doctype html>
<html lang="en">
<head>
    <title>datavzrd report</title>
    <meta charset="UTF-8">
</head>

<body>
<script src="../static/bundle.js"></script>
{% if aux_libraries %}
{% for library in aux_libraries %}
<script src="{{ library }}"></script>
{% endfor %}
{% endif %}

<div class="collapse" id="sidebar">
    <div class="card" id="sidebar-card">
        <ul class="list-group list-group-flush" id="sidebar-list">
            {% if has_excel_sheet %}<li class="list-group-item sidebar-b

read_file({"path": "datavzrd_render.xml"})

<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">
    <description>Render visual and interactive HTML reports from tabular data</description>
    <macros>
        <import>macros.xml</import>
    </macros>
    <expand macro="render_requirements"/>
    <required_files>
        <include path="datavzrd_config.py"/>
    </required_files>
    <expand macro="version_command"/>
    <command detect_errors="aggressive"><![CDATA[
## Symlink the 

read_file({"path": "macros.xml"})

<macros>
    <token name="@TOOL_VERSION@">2.72.0</token>
    <token name="@VERSION_SUFFIX@">0</token>
    <token name="@PROFILE@">25.0</token>
    <xml name="render_requirements">
        <requirements>
            <requirement type="package" version="@TOOL_VERSION@">datavzrd</requirement>
            <requirement type="package" version="3.13">python</requirement>
            <requirement type="package" version="6.0.3">pyyaml</requirement>
            <requirement type="package" version="3.0">zi

read_file({"path": "test-data/oscars.csv"})

oscar_no,oscar_yr,award,name,movie,age,birth place,birth date,birth_mo,birth_d,birth_y,overall_wins_and_overall_nominations
1,1929,Best actress,Janet Gaynor,7th Heaven,22,Pennsylvania,1906-10-06,10,6,1906,1/2
2,1930,Best actress,Mary Pickford,Coquette,37,Canada,1892-04-08,4,8,1892,1/1
3,1931,Best actress,Norma Shearer,The Divorcee,28,Canada,1902-08-10,8,10,1902,1/6
4,1932,Best actress,Marie Dressler,Min and Bill,63,Canada,1868-11-09,11,9,1868,1/2
5,1933,Best actress,Helen Hayes,The Sin of Madelo

read_file({"path": "test-data/movies.csv"})

Title,Year,Rated,Released,Runtime,Genre,Director,imdbRating,imdbID
7th Heaven,1927,Unrated,6 May 1927,110 min,"Drama",Frank Borzage,7.6,tt0018379
Coquette,1929,Unrated,06 Apr 1929,76 min,"Drama, Romance",Sam Taylor,5.7,tt0019788
The Divorcee,1930,Passed,19 Apr 1930,84 min,"Romance, Drama",Robert Z. Leonard,6.7,tt0020827
Min and Bill,1930,Passed,29 Nov 1930,69 min,"Comedy, Drama",George W. Hill,6.8,tt0021148
The Sin of Madelon Claudet,1931,Passed,24 Oct 1931,75 min,Drama,Edgar Selwyn,6.7,tt002238

read_file({"path": "test-data/genes.tsv"})

gene	count	log2fc
BRCA1	124	2.4
TP53	87	-1.2
EGFR	301	0.8
KRAS	56	1.5
PTEN	12	-0.3
MYC	410	3.1
RB1	34	-0.9

read_file({"end_line": 100, "path": "datavzrd_render.xml", "start_line": 50})

50:     ## to point to the input tables of this job
51:     python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&
52: #end if
53: 
54: ## Apply advanced options to the configuration file
55: #set $adv_args = []
56: #if $adv.max_in_memory_rows:
57:     #silent $adv_args.append('max-in-memory-rows=' + str($adv.max_in_memory_rows))
58: #end if
59: #if $adv_args:
60:     python '$__tool_directory__/datavzr

read_file({"end_line": 223, "path": "datavzrd_render.xml", "start_line": 100})

100:     <outputs>
101:         <data name="output_html" format="html" label="${tool.name} on ${on_string}: interactive report">
102:             <filter>output_format == 'html'</filter>
103:         </data>
104:         <data name="output_zip" format="zip" label="${tool.name} on ${on_string}: zipped report">
105:             <filter>output_format == 'zip'</filter>
106:         </data>
107:     </outputs>
108:     <tests>
109:         <!-- Test 01: auto-generated configuration from a single CSV 

fetch_url({"url": "https://raw.githubusercontent.com/galaxyproject/galaxy/dev/lib/galaxy/tool_util/verify/asserts/xml.py"})

import re

from lxml.etree import XMLSyntaxError

from galaxy.tool_util.verify import asserts
from galaxy.util import (
    asbool,
    parse_xml_string,
    unicodify,
)
from ._types import (
    Annotated,
    AssertionParameter,
    ChildAssertions,
    Delta,
    Max,
    Min,
    N,
    Negate,
    NEGATE_DEFAULT,
    Output,
    VerifyAssertionsFunction,
    XmlBool,
    XmlRegex,
)
from ._util import _assert_presence_number

Path = Annotated[str, AssertionParameter("The Python xpath-like 

write_file({"content": "<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@Profile@">\n Render visual and interactive HTML reports from tabular data\n \n macros.xml\n \n <expand macro="render_requirements"/>\n <required_files>\n <include path="datavzrd_config.py"/>\n </required_files>\n <expand macro="version_command"/>\n <command detect_errors="aggressive"> config.yaml &&\n#else:\n ## Rewrite the dataset paths of the user-provided configuration file\n ## to point to the input tables of this job\n python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&\n#end if\n\n## Render the report\ndatavzrd config.yaml --output report_output --overwrite-output &&\n\n## Collect the output\n#if $output_format == 'html':\n mkdir -p '${output_html.files_path}' &&\n mv report_output/index.html '${output_html}' &&\n mv report_output/* '${output_html.files_path}/'\n#else:\n cd report_output &&\n zip -q -r ../report.zip . &&\n cd .. &&\n mv report.zip '${output_zip}'\n#end if\n ]]>\n \n <param name="input_data" type="data" format="csv,tsv,tabular,json,parquet" multiple="true" label="Input table(s)" help="One or more tabular datasets (CSV, TSV, JSON or Parquet) to include in the report. When using a custom configuration file, provide the tables in the same order as the datasets defined in that configuration file."/>\n <conditional name="config_mode">\n <param name="config_mode_selector" type="select" label="Configuration">\n <option value="auto" selected="true">Auto-generate the configuration from the input tables\n <option value="provide">Provide a datavzrd configuration file\n \n <when value="auto">\n <expand macro="report_name"/>\n \n <when value="provide">\n <param name="config_file" type="data" format="yaml" label="datavzrd configuration file" help="A datavzrd YAML configuration file. The dataset 'path' entries are rewritten to the input tables above (matched in the order in which the datasets appear in the configuration file), so any path can be used there. Note that relative references to external files (spec-path, script-path, custom-path, render-img paths) are not supported - use the inline 'spec' or 'custom' fields instead."/>\n \n \n <param name="output_format" type="select" label="Output format">\n <option value="html" selected="true">Interactive HTML report (displayed in Galaxy)\n <option value="zip">Zipped report directory\n \n <section name="adv" title="Advanced options" expanded="false">\n <param name="max_in_memory_rows" type="integer" value="20000" min="1" label="Maximum in-memory rows" help="Maximum number of rows of a table that are rendered into a single page (default: 20000). Tables with more rows are split into searchable pages."/>\n \n \n \n <data name="output_html" format="html" label="${tool.name} on ${on_string}: interactive report">\n output_format == 'html'\n \n <data name="output_zip" format="zip" label="${tool.name} on ${on_string}: zipped report">\n output_format == 'zip'\n \n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="<script src="./static/bundle.js">"/>\n <has_text text="const name = 'Oscars Report';"/>\n <has_text_matching expression="const table = "oscars";"/>\n <not_has_text text="movies"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="datavzrd suggest -f 'oscars.csv' -s ',' --name 'Oscars Report' > config.yaml"/>\n <not_has_text text="datavzrd_config.py"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="const name = 'Datavzrd Report';"/>\n <has_text_matching expression="const table = "(oscars|movies)";"/>\n <has_text text="<script src="./static/bundle.js">"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="provide"/>\n <param name="config_file" value="example-config.yaml" ftype="yaml"/>\n \n <section name="adv">\n <param name="max_in_memory_rows" value="500"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="const table = "oscars";"/>\n <has_text text=""oscar-plot""/>\n <has_text text=""movies""/>\n <has_text text="<script src="./static/bundle.js">"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="max-in-memory-rows=500"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="genes.tsv" ftype="tsv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Gene Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="const name = 'Gene Report';"/>\n <has_text_matching expression="const table = "genes";"/>\n <has_text text="<script src="./static/bundle.js">"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="-s $'\t'"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="zip"/>\n <assert_command>\n <has_text text="zip -q -r ../report.zip"/>\n </assert_command>\n <output name="output_zip" ftype="zip">\n <assert_contents>\n <has_archive_member path="index.html"/>\n <has_archive_member path="static/bundle.js"/>\n <has_archive_member path="oscars/index_1.html"/>\n <has_archive_member path="oscars/functional-plots/age.json"/>\n <has_archive_member path="static/bundle.js$" n="0"/>\n </assert_contents>\n \n \n \n <help format="markdown">\n <expand macro="citations"/>\n\n", "path": "datavzrd_render.xml"})

File written: datavzrd_render.xml

read_file({"path": "macros.xml", "pattern": "xml name="})

5:     <xml name="render_requirements">
13:     <xml name="version_command">
16:     <xml name="report_name">
21:     <xml name="citations">

planemo_lint({"path": "datavzrd_render.xml"})

Linting tool /home/runner/work/galaxytools/galaxytools/tools/datavzrd/datavzrd_render.xml
.. CHECK (TestsNoValid): 5 test(s) found.
.. INFO (OutputsNumber): 2 outputs found.
.. INFO (InputsNum): Found 6 input parameters.
.. CHECK (HelpPresent): Tool contains help section.
.. CHECK (ToolIDValid): Tool defines an id [datavzrd_render].
.. CHECK (ToolNameValid): Tool defines a name [datavzrd].
.. CHECK (ToolProfileValid): Tool specifies profile version [25.0].
.. CHECK (ToolVersionValid): Tool defin

planemo_test({"path": "datavzrd_render.xml"})

Error: tool call timed out after 300s

planemo_test({"path": "datavzrd_render.xml"})

### datavzrd_render-0 — failure
Output problems:
  - Output output_html:  different than expected
Expected text matching expression 'const table = "oscars";' in output ('<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Datavzrd</title>
</head>
<body>
<script src="./static/bundle.js"></script>
<script type="text/javascript">
    const urlParams = new URLSearchParams(window.location.search);
    const viewParam = urlParams.get('view');
    const version = '2.72.0';
   

read_file({"path": "macros.xml"})

<macros>
    <token name="@TOOL_VERSION@">2.72.0</token>
    <token name="@VERSION_SUFFIX@">0</token>
    <token name="@PROFILE@">25.0</token>
    <xml name="render_requirements">
        <requirements>
            <requirement type="package" version="@TOOL_VERSION@">datavzrd</requirement>
            <requirement type="package" version="3.13">python</requirement>
            <requirement type="package" version="6.0.3">pyyaml</requirement>
            <requirement type="package" version="3.0">zi

write_file({"content": "<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@Profile@">\n Render visual and interactive HTML reports from tabular data\n \n macros.xml\n \n <expand macro="render_requirements"/>\n <required_files>\n <include path="datavzrd_config.py"/>\n </required_files>\n <expand macro="version_command"/>\n <command detect_errors="aggressive"> config.yaml &&\n#else:\n ## Rewrite the dataset paths of the user-provided configuration file\n ## to point to the input tables of this job\n python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&\n#end if\n\n## Apply advanced options to the configuration file\n#set $adv_args = []\n#if $adv.max_in_memory_rows:\n #silent $adv_args.append('max-in-memory-rows=' + str($adv.max_in_memory_rows))\n#end if\n#if $adv_args:\n python '$__tool_directory__/datavzrd_config.py' set config.yaml --output config.yaml #echo ' '.join($adv_args)# &&\n#end if\n\n## Render the report\ndatavzrd config.yaml --output report_output --overwrite-output &&\n\n## Collect the output\n#if $output_format == 'html':\n mkdir -p '${output_html.files_path}' &&\n mv report_output/index.html '${output_html}' &&\n mv report_output/* '${output_html.files_path}/'\n#else:\n cd report_output &&\n zip -q -r ../report.zip . &&\n cd .. &&\n mv report.zip '${output_zip}'\n#end if\n ]]>\n \n <param name="input_data" type="data" format="csv,tsv,tabular,json,parquet" multiple="true" label="Input table(s)" help="One or more tabular datasets (CSV, TSV, JSON or Parquet) to include in the report. When using a custom configuration file, provide the tables in the same order as the datasets defined in that configuration file."/>\n <conditional name="config_mode">\n <param name="config_mode_selector" type="select" label="Configuration">\n <option value="auto" selected="true">Auto-generate the configuration from the input tables\n <option value="provide">Provide a datavzrd configuration file\n \n <when value="auto">\n <expand macro="report_name"/>\n \n <when value="provide">\n <param name="config_file" type="data" format="yaml" label="datavzrd configuration file" help="A datavzrd YAML configuration file. The dataset 'path' entries are rewritten to the input tables above (matched in the order in which the datasets appear in the configuration file), so any path can be used there. Note that relative references to external files (spec-path, script-path, custom-path, render-img paths) are not supported - use the inline 'spec' or 'custom' fields instead."/>\n \n \n <param name="output_format" type="select" label="Output format">\n <option value="html" selected="true">Interactive HTML report (displayed in Galaxy)\n <option value="zip">Zipped report directory\n \n <section name="adv" title="Advanced options" expanded="false">\n <param name="max_in_memory_rows" type="integer" value="20000" min="1" label="Maximum in-memory rows" help="Maximum number of rows of a table that are rendered into a single page (default: 20000). Tables with more rows are split into searchable pages."/>\n \n \n \n <data name="output_html" format="html" label="${tool.name} on ${on_string}: interactive report">\n output_format == 'html'\n \n <data name="output_zip" format="zip" label="${tool.name} on ${on_string}: zipped report">\n output_format == 'zip'\n \n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="<script src="./static/bundle.js">"/>\n <has_text text="const name = 'Oscars Report';"/>\n <has_text_matching expression="const views = \{"oscars":null\};"/>\n <has_text text="const table = null;"/>\n <not_has_text text="movies"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="datavzrd suggest -f 'oscars.csv' -s ',' --name 'Oscars Report' > config.yaml"/>\n <not_has_text text="datavzrd_config.py"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="const name = 'Datavzrd Report';"/>\n <has_text_matching expression="const views = \{"(movies|oscars)":null,"(movies|oscars)":null\};"/>\n <has_text text="<script src="./static/bundle.js">"/>\n </assert_contents>\n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="provide"/>\n <param name="config_file" value="example-config.yaml" ftype="yaml"/>\n \n <section name="adv">\n <param name="max_in_memory_rows" value="500"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="const name = 'My oscar report';"/>\n <has_text_matching expression="const views = \{"movies":null,"oscars":.,"oscar-plot":.\};"/>\n <has_text text=""oscar-plot""/>\n <has_text text="<script src="./static/bundle.js">"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="datavzrd_config.py' rewrite"/>\n <has_text text="max-in-memory-rows=500"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="genes.tsv" ftype="tsv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Gene Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="const name = 'Gene Report';"/>\n <has_text text="const views = {"genes":null};"/>\n <has_text text="<script src="./static/bundle.js">"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="-s $'\t'"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="zip"/>\n <assert_command>\n <has_text text="zip -q -r ../report.zip"/>\n </assert_command>\n <output name="output_zip" ftype="zip">\n <assert_contents>\n <has_archive_member path="index.html"/>\n <has_archive_member path="static/bundle.js"/>\n <has_archive_member path="oscars/index_1.html"/>\n </assert_contents>\n \n \n \n <help format="markdown">\n <expand macro="citations"/>\n\n", "path": "datavzrd_render.xml"})

File written: datavzrd_render.xml

planemo_lint({"path": "datavzrd_render.xml"})

Linting tool /home/runner/work/galaxytools/galaxytools/tools/datavzrd/datavzrd_render.xml
.. CHECK (TestsNoValid): 5 test(s) found.
.. INFO (OutputsNumber): 2 outputs found.
.. INFO (InputsNum): Found 6 input parameters.
.. CHECK (HelpPresent): Tool contains help section.
.. CHECK (ToolIDValid): Tool defines an id [datavzrd_render].
.. CHECK (ToolNameValid): Tool defines a name [datavzrd].
.. CHECK (ToolProfileValid): Tool specifies profile version [25.0].
.. CHECK (ToolVersionValid): Tool defin

planemo_test({"path": "datavzrd_render.xml"})

### datavzrd_render-0 — failure
Output problems:
  - Output file contains unexpected text 'datavzrd_config.py'
Command: ln -s '/tmp/tmp466c03vk/files/c/7/4/dataset_c7440070-88d7-4558-9757-652b1682200f.dat' 'oscars.csv' &&  datavzrd suggest -f 'oscars.csv' -s ',' --name 'Oscars Report' > config.yaml &&  python '/home/runner/work/galaxytools/galaxytools/tools/datavzrd/datavzrd_config.py' set config.yaml --output config.yaml max-in-memory-rows=20000 &&  datavzrd config.yaml --output report_output -

read_file({"end_line": 180, "path": "datavzrd_render.xml", "start_line": 110})

110:         <test expect_num_outputs="1">
111:             <param name="input_data" value="oscars.csv" ftype="csv"/>
112:             <conditional name="config_mode">
113:                 <param name="config_mode_selector" value="auto"/>
114:                 <param name="report_name" value="Oscars Report"/>
115:             </conditional>
116:             <param name="output_format" value="html"/>
117:             <output name="output_html" ftype="html">
118:                 <assert_contents>
1

write_file({"content": "<tool id="datavzrd_render" name="datavzrd" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@Profile@">\n Render visual and interactive HTML reports from tabular data\n \n macros.xml\n \n <expand macro="render_requirements"/>\n <required_files>\n <include path="datavzrd_config.py"/>\n </required_files>\n <expand macro="version_command"/>\n <command detect_errors="aggressive"> config.yaml &&\n#else:\n ## Rewrite the dataset paths of the user-provided configuration file\n ## to point to the input tables of this job\n python '$__tool_directory__/datavzrd_config.py' rewrite '${config_mode.config_file}' --inputs '#echo ','.join($data_files)#' --output config.yaml &&\n#end if\n\n## Apply advanced options to the configuration file\n#set $adv_args = []\n#if $adv.max_in_memory_rows:\n #silent $adv_args.append('max-in-memory-rows=' + str($adv.max_in_memory_rows))\n#end if\n#if $adv_args:\n python '$__tool_directory__/datavzrd_config.py' set config.yaml --output config.yaml #echo ' '.join($adv_args)# &&\n#end if\n\n## Render the report\ndatavzrd config.yaml --output report_output --overwrite-output &&\n\n## Collect the output\n#if $output_format == 'html':\n mkdir -p '${output_html.files_path}' &&\n mv report_output/index.html '${output_html}' &&\n mv report_output/* '${output_html.files_path}/'\n#else:\n cd report_output &&\n zip -q -r ../report.zip . &&\n cd .. &&\n mv report.zip '${output_zip}'\n#end if\n ]]>\n \n <param name="input_data" type="data" format="csv,tsv,tabular,json,parquet" multiple="true" label="Input table(s)" help="One or more tabular datasets (CSV, TSV, JSON or Parquet) to include in the report. When using a custom configuration file, provide the tables in the same order as the datasets defined in that configuration file."/>\n <conditional name="config_mode">\n <param name="config_mode_selector" type="select" label="Configuration">\n <option value="auto" selected="true">Auto-generate the configuration from the input tables\n <option value="provide">Provide a datavzrd configuration file\n \n <when value="auto">\n <expand macro="report_name"/>\n \n <when value="provide">\n <param name="config_file" type="data" format="yaml" label="datavzrd configuration file" help="A datavzrd YAML configuration file. The dataset 'path' entries are rewritten to the input tables above (matched in the order in which the datasets appear in the configuration file), so any path can be used there. Note that relative references to external files (spec-path, script-path, custom-path, render-img paths) are not supported - use the inline 'spec' or 'custom' fields instead."/>\n \n \n <param name="output_format" type="select" label="Output format">\n <option value="html" selected="true">Interactive HTML report (displayed in Galaxy)\n <option value="zip">Zipped report directory\n \n <section name="adv" title="Advanced options" expanded="false">\n <param name="max_in_memory_rows" type="integer" value="20000" min="1" label="Maximum in-memory rows" help="Maximum number of rows of a table that are rendered into a single page (default: 20000). Tables with more rows are split into searchable pages."/>\n \n \n \n <data name="output_html" format="html" label="${tool.name} on ${on_string}: interactive report">\n output_format == 'html'\n \n <data name="output_zip" format="zip" label="${tool.name} on ${on_string}: zipped report">\n output_format == 'zip'\n \n \n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="<script src="./static/bundle.js">"/>\n <has_text text="const name = 'Oscars Report';"/>\n <has_text text="const views = {"oscars":null};"/>\n <has_text text="const table = null;"/>\n <not_has_text text="movies"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="datavzrd suggest -f 'oscars.csv' -s ',' --name 'Oscars Report' > config.yaml"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="const name = 'Datavzrd Report';"/>\n <has_text text=""oscars":null"/>\n <has_text text=""movies":null"/>\n <has_text text="<script src="./static/bundle.js">"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="-f 'oscars.csv' -s ',' -f 'movies.csv' -s ','"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv,movies.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="provide"/>\n <param name="config_file" value="example-config.yaml" ftype="yaml"/>\n \n <section name="adv">\n <param name="max_in_memory_rows" value="500"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="const name = 'My oscar report';"/>\n <has_text text=""oscars":"/>\n <has_text text=""movies":null"/>\n <has_text text=""oscar-plot":"/>\n <has_text text="## All winning oscars beginning in the year 1929."/>\n <has_text text="<script src="./static/bundle.js">"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="datavzrd_config.py' rewrite"/>\n <has_text text="max-in-memory-rows=500"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="genes.tsv" ftype="tsv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Gene Report"/>\n \n <param name="output_format" value="html"/>\n <output name="output_html" ftype="html">\n <assert_contents>\n <has_text text="const name = 'Gene Report';"/>\n <has_text text="const views = {"genes":null};"/>\n <has_text text="<script src="./static/bundle.js">"/>\n </assert_contents>\n \n <assert_command>\n <has_text text="-s $'\t'"/>\n </assert_command>\n \n \n <test expect_num_outputs="1">\n <param name="input_data" value="oscars.csv" ftype="csv"/>\n <conditional name="config_mode">\n <param name="config_mode_selector" value="auto"/>\n <param name="report_name" value="Oscars Report"/>\n \n <param name="output_format" value="zip"/>\n <assert_command>\n <has_text text="zip -q -r ../report.zip"/>\n </assert_command>\n <output name="output_zip" ftype="zip">\n <assert_contents>\n <has_archive_member path="index.html"/>\n <has_archive_member path="static/bundle.js"/>\n <has_archive_member path="oscars/index_1.html"/>\n </assert_contents>\n \n \n \n <help format="markdown">\n <expand macro="citations"/>\n\n", "path": "datavzrd_render.xml"})

File written: datavzrd_render.xml

read_file({"path": "datavzrd_config.py"})

#!/usr/bin/env python3
"""Helper script to adapt datavzrd report configuration files for Galaxy.

Subcommands:
    rewrite: rewrite the dataset paths of a config file to point to the
             Galaxy input files. Datasets are matched to the input files
             in the order in which they appear in the config file.
    set:     set one or more top-level key-value pairs in a config file.
"""

import argparse
import sys

import yaml


def load_config(path):
    with open(path, "r", encoding=

planemo_test({"path": "datavzrd_render.xml"})

All 5 tests passed.

Comment thread tools/datavzrd/datavzrd_render.xml Outdated
Comment thread tools/datavzrd/macros.xml Outdated
@bgruening
bgruening merged commit c9c8686 into master Sep 1, 2026
10 checks passed
@bgruening
bgruening deleted the tool-bot/issue-1966 branch September 1, 2026 14:02
@bgruening

Copy link
Copy Markdown
Owner

Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

datavzrd

2 participants