diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 74a4e50..ffa9433 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -1,6 +1,6 @@ name: nf-core branch protection # This workflow is triggered on PRs to `main`/`master` branch on the repository -# It fails when someone tries to make a PR against the nf-core `main`/`master` branch instead of `dev` +# It fails when someone tries to make a PR against the phac-nml `main`/`master` branch instead of `dev` on: pull_request_target: branches: @@ -11,7 +11,7 @@ jobs: test: runs-on: ubuntu-latest steps: - # PRs to the nf-core repo main/master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches + # PRs to the phac-nml repo main/master branch are only ok if coming from the phac-nml repo `dev` or any `patch` branches - name: Check PRs if: github.repository == 'phac-nml/iridanextexample2' run: | @@ -35,7 +35,7 @@ jobs: Hi @${{ github.event.pull_request.user.login }}, It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) ${{github.event.pull_request.base.ref}} branch. - The ${{github.event.pull_request.base.ref}} branch on nf-core repositories should always contain code from the latest release. + The ${{github.event.pull_request.base.ref}} branch on phac-nml repositories should always contain code from the latest release. Because of this, PRs to ${{github.event.pull_request.base.ref}} are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 6a666b0..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Pipeline CI -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: - push: - branches: - - dev - pull_request: - release: - types: [published] - -env: - NXF_ANSI_LOG: false - -concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" - cancel-in-progress: true - -jobs: - test: - name: Run pipeline with test data - # Only run on push if this is the phac-nml dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'phac-nml/iridanextexample') }}" - runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "25.04.6" - - "latest-everything" - steps: - - name: Check out pipeline code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - - - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 - with: - version: "${{ matrix.NXF_VER }}" - - - name: Nextflow run with test profile - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 584e218..22a2970 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,4 +1,4 @@ -name: nf-core linting of iridanextexample2 +name: nf-core linting # This workflow is triggered on pushes and PRs to the repository. # It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. @@ -50,7 +50,7 @@ jobs: pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} - name: Run nf-core pipelines lint - if: ${{ github.base_ref != 'main' }} + if: ${{ github.base_ref != 'master' && github.base_ref != 'main' }} env: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -58,7 +58,7 @@ jobs: run: nf-core -l lint_log.txt pipelines lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Run nf-core pipelines lint --release - if: ${{ github.base_ref == 'main' }} + if: ${{ github.base_ref == 'master' || github.base_ref == 'main' }} env: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index 7aeaf65..5ab00b7 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -68,7 +68,7 @@ jobs: shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} profile: [conda, docker, singularity] isMain: - - ${{ github.base_ref == 'main' || github.base_ref == 'master' }} + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} # Exclude conda and singularity on dev exclude: - isMain: false @@ -76,7 +76,7 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.10.5" + - "24.10.3" - "latest-everything" env: NXF_ANSI_LOG: false @@ -93,6 +93,7 @@ jobs: continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} env: NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + NXF_VERSION: ${{ matrix.NXF_VER }} with: profile: ${{ matrix.profile }} shard: ${{ matrix.shard }} diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml new file mode 100644 index 0000000..beb5c77 --- /dev/null +++ b/.github/workflows/template-version-comment.yml @@ -0,0 +1,46 @@ +name: nf-core template version comment +# This workflow is triggered on PRs to check if the pipeline template version matches the latest nf-core version. +# It posts a comment to the PR, even if it comes from a fork. + +on: pull_request_target + +jobs: + template_version: + runs-on: ubuntu-latest + steps: + - name: Check out pipeline code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Read template version from .nf-core.yml + uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 + id: read_yml + with: + config: ${{ github.workspace }}/.nf-core.yml + + - name: Install nf-core + run: | + python -m pip install --upgrade pip + pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + + - name: Check nf-core outdated + id: nf_core_outdated + run: echo "OUTPUT=$(pip list --outdated | grep nf-core)" >> ${GITHUB_ENV} + + - name: Post nf-core template version comment + uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2 + if: | + contains(env.OUTPUT, 'nf-core') + with: + repo-token: ${{ secrets.NF_CORE_BOT_AUTH_TOKEN }} + allow-repeats: false + message: | + > [!WARNING] + > Newer version of the nf-core template is available. + > + > Your pipeline is using an old version of the nf-core template: ${{ steps.read_yml.outputs['nf_core_version'] }}. + > Please update your pipeline to the latest version. + > + > For more documentation on how to update your pipeline, please see the [nf-core documentation](https://github.com/nf-core/tools?tab=readme-ov-file#sync-a-pipeline-with-the-template) and [Synchronisation documentation](https://nf-co.re/docs/contributing/sync). + # diff --git a/.nf-core.yml b/.nf-core.yml index 4792b85..47113aa 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -3,7 +3,6 @@ repository_type: pipeline nf_core_version: 3.3.2 lint: - included_configs: False files_unchanged: - CODE_OF_CONDUCT.md - assets/nf-core-iridanextexample2_logo_light.png @@ -12,15 +11,14 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml - .github/CONTRIBUTING.md - .github/PULL_REQUEST_TEMPLATE.md + - .github/workflows/linting.yml + - .github/workflows/branch.yml - assets/email_template.txt - docs/README.md - - .github/workflows/linting.yml nextflow_config: - custom_config - manifest.name - manifest.homePage - - validation.help.beforeText - - validation.help.afterText - validation.summary.beforeText - validation.summary.afterText multiqc_config: diff --git a/CHANGELOG.md b/CHANGELOG.md index d57a606..94df19d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### `Added` + +- Adding GitHub CI tests against Nextflow `24.10.3`. [PR #8](https://github.com/phac-nml/iridanextexample2/pull/8) + - Required downgrading minimum Nextflow version from `24.10.5` to `24.10.3`. + +### `Updated` + +- Some minor updates to GitHub actions and `.nf-core.yml` to better match latest nf-core template. [PR #8](https://github.com/phac-nml/iridanextexample2/pull/8) +- Updated nf-core modules and subworkflows. [PR #8](https://github.com/phac-nml/iridanextexample2/pull/8) + ## [0.1.0] - 2025-07-25 - Initial release of phac-nml/iridanextexample2, created with the [nf-core](https://nf-co.re/) template. diff --git a/README.md b/README.md index db034f2..5528073 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,7 @@ [![GitHub Actions Linting Status](https://github.com/phac-nml/iridanextexample2/actions/workflows/linting.yml/badge.svg)](https://github.com/phac-nml/iridanextexample2/actions/workflows/linting.yml) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.3-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) [![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) diff --git a/main.nf b/main.nf index 2cd4093..3f3fc70 100644 --- a/main.nf +++ b/main.nf @@ -69,10 +69,15 @@ workflow { PIPELINE_INITIALISATION ( params.version, params.validate_params, - params.monochrome_logs, args, params.outdir, - params.input + params.input, + params.help, + params.help_full, + params.show_hidden, + "", + "", + "nextflow run phac-nml/iridanextexample2 -profile --input samplesheet.csv --outdir " ) // diff --git a/modules.json b/modules.json index 5acb616..88c1a8a 100644 --- a/modules.json +++ b/modules.json @@ -12,7 +12,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e10b76ca0c66213581bec2833e30d31f239dec0b", "installed_by": ["modules"] } } @@ -21,17 +21,17 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", + "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index 812fc4c..dd513cb 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.29 + - bioconda::multiqc=1.31 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 0ac3c36..5288f5c 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : - 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ef/eff0eafe78d5f3b65a6639265a16b89fdca88d06d18894f90fcdb50142004329/data' : + 'community.wave.seqera.io/library/multiqc:1.31--1efbafd542a23882' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 88e9057..17881d1 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nextflow": "25.04.6" }, - "timestamp": "2025-05-22T11:50:41.182332996" + "timestamp": "2025-09-08T20:57:36.139055243" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nextflow": "25.04.6" }, - "timestamp": "2025-05-22T11:51:22.448739369" + "timestamp": "2025-09-08T20:59:15.142230631" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nextflow": "25.04.6" }, - "timestamp": "2025-05-22T11:51:06.198928424" + "timestamp": "2025-09-08T20:58:29.629087066" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml deleted file mode 100644 index bea6c0d..0000000 --- a/modules/nf-core/multiqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -multiqc: - - modules/nf-core/multiqc/** diff --git a/nextflow.config b/nextflow.config index 0858337..7cc6452 100644 --- a/nextflow.config +++ b/nextflow.config @@ -259,7 +259,7 @@ manifest { description = """An example pipeline for running on IRIDA-Next with nf-schema""" mainScript = 'main.nf' defaultBranch = 'main' - nextflowVersion = '!>=24.10.5' + nextflowVersion = '!>=24.10.3' version = '0.1.0' doi = '' } @@ -269,7 +269,9 @@ plugins { id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet id 'nf-iridanext@0.3.0' } + includeConfig 'conf/iridanext.config' + validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs @@ -278,6 +280,8 @@ validation { command = "nextflow run phac-nml/iridanextexample2 -profile --input samplesheet.csv --outdir " fullParameter = "help_full" showHiddenParameter = "show_hidden" + beforeText = "" + afterText = "" } } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 548ba2c..a873a72 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-07-09T15:42:36+00:00", - "description": "# phac-nml/iridanextexample2\n\n[![GitHub Actions CI Status](https://github.com/phac-nml/iridanextexample2/actions/workflows/nf-test.yml/badge.svg)](https://github.com/phac-nml/iridanextexample2/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/phac-nml/iridanextexample2/actions/workflows/linting.yml/badge.svg)](https://github.com/phac-nml/iridanextexample2/actions/workflows/linting.yml)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n\n## Introduction\n\n**phac-nml/iridanextexample2** is an example pipeline for integration with IRIDA-Next. It is a successor to the original [iridanextexample](https://github.com/phac-nml/iridanextexample) which replaces [nf-validation](https://github.com/nextflow-io/nf-validation) with [nf-schema](https://github.com/nextflow-io/nf-schema)\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n### Input\n\nFirst, prepare a samplesheet with your input data that looks as follows:\n\nAn example [samplesheet](assets/samplesheet.csv), which follows the [schema_input.json](assets/schema_input.json) structure.\n\n```csv\nsample,fastq_1,fastq_2\nSAMPLE1,sample1_R1.fastq.gz,sample1_R2.fastq.gz\nSAMPLE2,sample2_R1.fastq.gz,sample2_R2.fastq.gz\nSAMPLE3,sample1_R1.fastq.gz,\n```\n\nEach row represents a fastq file (single-end) or a pair of fastq files (paired end). Validation of the samplesheet is performed by [nf-schema validateParameters()](https://nextflow-io.github.io/nf-schema/latest/nextflow_schema/).\n\n### Running the pipeline\n\n```bash\nnextflow run phac-nml/iridanextexample2 \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n### Output for IRIDA-Next\n\nOutput from the pipeline is available in IRIDA-Next users based on the contents of the `iridanext.output.json.gz`. Files and metadata are passed to the json output file using the [nf-iridanext plugin](https://github.com/phac-nml/nf-iridanext) based on the [iridanext.config](conf/iridanext.config).\n\nExample:\n\n```\n{\n \"files\": {\n \"global\": [\n\n ],\n \"samples\": {\n \"SAMPLE3\": [\n {\n \"path\": \"fastqc/SAMPLE3_fastqc.html\"\n }\n ],\n \"SAMPLE2\": [\n {\n \"path\": \"fastqc/SAMPLE2_2_fastqc.html\"\n },\n {\n \"path\": \"fastqc/SAMPLE2_1_fastqc.html\"\n }\n ],\n \"SAMPLE1\": [\n {\n \"path\": \"fastqc/SAMPLE1_2_fastqc.html\"\n },\n {\n \"path\": \"fastqc/SAMPLE1_1_fastqc.html\"\n }\n ]\n }\n },\n \"metadata\": {\n \"samples\": {\n \"SAMPLE3\": {\n \"id\": \"SAMPLE3\",\n \"single_end\": \"true\"\n },\n \"SAMPLE2\": {\n \"id\": \"SAMPLE2\",\n \"single_end\": \"false\"\n },\n \"SAMPLE1\": {\n \"id\": \"SAMPLE1\",\n \"single_end\": \"false\"\n }\n }\n }\n}\n```\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n\n# Legal\n\nCopyright 2023 Government of Canada\n\nLicensed under the MIT License (the \"License\"); you may not use\nthis work except in compliance with the License. You may obtain a copy of the\nLicense at:\n\nhttps://opensource.org/license/mit/\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n", + "description": "# phac-nml/iridanextexample2\n\n[![GitHub Actions CI Status](https://github.com/phac-nml/iridanextexample2/actions/workflows/nf-test.yml/badge.svg)](https://github.com/phac-nml/iridanextexample2/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/phac-nml/iridanextexample2/actions/workflows/linting.yml/badge.svg)](https://github.com/phac-nml/iridanextexample2/actions/workflows/linting.yml)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.3-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) [![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n\n## Introduction\n\n**phac-nml/iridanextexample2** is an example pipeline for integration with IRIDA-Next. It is a successor to the original [iridanextexample](https://github.com/phac-nml/iridanextexample) which replaces [nf-validation](https://github.com/nextflow-io/nf-validation) with [nf-schema](https://github.com/nextflow-io/nf-schema)\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n### Input\n\nFirst, prepare a samplesheet with your input data that looks as follows:\n\nAn example [samplesheet](assets/samplesheet.csv), which follows the [schema_input.json](assets/schema_input.json) structure.\n\n```csv\nsample,fastq_1,fastq_2\nSAMPLE1,sample1_R1.fastq.gz,sample1_R2.fastq.gz\nSAMPLE2,sample2_R1.fastq.gz,sample2_R2.fastq.gz\nSAMPLE3,sample1_R1.fastq.gz,\n```\n\nEach row represents a fastq file (single-end) or a pair of fastq files (paired end). Validation of the samplesheet is performed by [nf-schema validateParameters()](https://nextflow-io.github.io/nf-schema/latest/nextflow_schema/).\n\n### Running the pipeline\n\n```bash\nnextflow run phac-nml/iridanextexample2 \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n### Output for IRIDA-Next\n\nOutput from the pipeline is available in IRIDA-Next users based on the contents of the `iridanext.output.json.gz`. Files and metadata are passed to the json output file using the [nf-iridanext plugin](https://github.com/phac-nml/nf-iridanext) based on the [iridanext.config](conf/iridanext.config).\n\nExample:\n\n```\n{\n \"files\": {\n \"global\": [\n\n ],\n \"samples\": {\n \"SAMPLE3\": [\n {\n \"path\": \"fastqc/SAMPLE3_fastqc.html\"\n }\n ],\n \"SAMPLE2\": [\n {\n \"path\": \"fastqc/SAMPLE2_2_fastqc.html\"\n },\n {\n \"path\": \"fastqc/SAMPLE2_1_fastqc.html\"\n }\n ],\n \"SAMPLE1\": [\n {\n \"path\": \"fastqc/SAMPLE1_2_fastqc.html\"\n },\n {\n \"path\": \"fastqc/SAMPLE1_1_fastqc.html\"\n }\n ]\n }\n },\n \"metadata\": {\n \"samples\": {\n \"SAMPLE3\": {\n \"id\": \"SAMPLE3\",\n \"single_end\": \"true\"\n },\n \"SAMPLE2\": {\n \"id\": \"SAMPLE2\",\n \"single_end\": \"false\"\n },\n \"SAMPLE1\": {\n \"id\": \"SAMPLE1\",\n \"single_end\": \"false\"\n }\n }\n }\n}\n```\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n\n# Legal\n\nCopyright 2023 Government of Canada\n\nLicensed under the MIT License (the \"License\"); you may not use\nthis work except in compliance with the License. You may obtain a copy of the\nLicense at:\n\nhttps://opensource.org/license/mit/\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n", "hasPart": [ { "@id": "main.nf" diff --git a/subworkflows/local/utils_iridanextexample2/main.nf b/subworkflows/local/utils_iridanextexample2/main.nf index 951e7d3..4f9e2bd 100644 --- a/subworkflows/local/utils_iridanextexample2/main.nf +++ b/subworkflows/local/utils_iridanextexample2/main.nf @@ -28,10 +28,15 @@ workflow PIPELINE_INITIALISATION { take: version // boolean: Display version and exit validate_params // boolean: Boolean whether to validate parameters against the schema at runtime - monochrome_logs // boolean: Do not use coloured log outputs nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved input // string: Path to input samplesheet + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline main: @@ -53,7 +58,13 @@ workflow PIPELINE_INITIALISATION { UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null + "${projectDir}/nextflow_schema.json", + help, + help_full, + show_hidden, + before_text, + after_text, + command ) // @@ -74,7 +85,7 @@ workflow PIPELINE_INITIALISATION { // Track processed IDs def processedIDs = [] as Set Channel - .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) + .fromList(samplesheetToList(input, "${projectDir}/assets/schema_input.json")) .map { meta, fastq_1, fastq_2 -> if (!meta.id) { diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config index 1f89bca..a09572e 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config @@ -3,7 +3,7 @@ manifest { author = """nf-core""" homePage = 'https://127.0.0.1' description = """Dummy pipeline""" - nextflowVersion = '!>=24.10.0' + nextflowVersion = '!>=23.04.0' version = '9.9.9' doi = 'https://doi.org/10.5281/zenodo.5070524' } diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f847611..0000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config index 8f97c6a..d0a926b 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config @@ -3,7 +3,7 @@ manifest { author = """nf-core""" homePage = 'https://127.0.0.1' description = """Dummy pipeline""" - nextflowVersion = '!>=24.10.0' + nextflowVersion = '!>=23.04.0' version = '9.9.9' doi = 'https://doi.org/10.5281/zenodo.5070524' } diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c..0000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index 4994303..ee4738c 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -4,6 +4,7 @@ include { paramsSummaryLog } from 'plugin/nf-schema' include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' workflow UTILS_NFSCHEMA_PLUGIN { @@ -15,29 +16,56 @@ workflow UTILS_NFSCHEMA_PLUGIN { // when this input is empty it will automatically use the configured schema or // "${projectDir}/nextflow_schema.json" as default. This input should not be empty // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline main: + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + params.help instanceof String ? params.help : "", + ) + exit 0 + } + // // Print parameter summary to stdout. This will display the parameters // that differ from the default given in the JSON schema // + + summary_options = [:] if(parameters_schema) { - log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) - } else { - log.info paramsSummaryLog(input_workflow) + summary_options << [parametersSchema: parameters_schema] } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text // // Validate the parameters using nextflow_schema.json or the schema // given via the validation.parametersSchema configuration option // if(validate_params) { + validateOptions = [:] if(parameters_schema) { - validateParameters(parameters_schema:parameters_schema) - } else { - validateParameters() + validateOptions << [parametersSchema: parameters_schema] } + validateParameters(validateOptions) } emit: diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test index 8fb3016..c977917 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -25,6 +25,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -51,6 +57,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -77,6 +89,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -103,6 +121,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -114,4 +138,36 @@ nextflow_workflow { ) } } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 09ef842..8d8c737 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,8 +1,8 @@ plugins { - id "nf-schema@2.4.2" + id "nf-schema@2.5.1" } validation { parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" monochromeLogs = true -} \ No newline at end of file +} diff --git a/tests/.nftignore b/tests/.nftignore index 824ddc7..5461f8e 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,10 +1,11 @@ .DS_Store multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt -multiqc/multiqc_data/BETA-multiqc.parquet +multiqc/multiqc_data/multiqc.parquet multiqc/multiqc_data/multiqc.log multiqc/multiqc_data/multiqc_data.json multiqc/multiqc_data/multiqc_sources.txt multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_data/llms-full.txt multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} multiqc/multiqc_report.html fastqc/*_fastqc.{html,zip} diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index ce9ca32..c439376 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -31,7 +31,6 @@ "merged_metadata.csv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", "multiqc/multiqc_data/fastqc_overrepresented_sequences_plot.txt", "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", @@ -43,7 +42,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_fastqc.txt", @@ -114,144 +115,9 @@ ] ], "meta": { - "nf-test": "0.9.0", + "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-07-25T16:02:53.359429554" - }, - "-profile test": { - "content": [ - 0, - { - "Workflow": { - "phac-nml/iridanextexample2": "v1.0.0dev" - } - }, - [ - "pipeline_info", - "pipeline_info/iridanextexample2_software_mqc_versions.yml" - ], - [ - - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "25.04.6" - }, - "timestamp": "2025-07-16T13:03:59.71613972" - }, - "-profile test,conda": { - "content": [ - 4, - { - "FASTQC": { - "fastqc": "0.12.1" - }, - "Workflow": { - "phac-nml/iridanextexample2": "v1.0.0dev" - } - }, - [ - "fastqc", - "fastqc/SAMPLE1_PE_1_fastqc.html", - "fastqc/SAMPLE1_PE_1_fastqc.zip", - "fastqc/SAMPLE1_PE_2_fastqc.html", - "fastqc/SAMPLE1_PE_2_fastqc.zip", - "fastqc/SAMPLE2_PE_1_fastqc.html", - "fastqc/SAMPLE2_PE_1_fastqc.zip", - "fastqc/SAMPLE2_PE_2_fastqc.html", - "fastqc/SAMPLE2_PE_2_fastqc.zip", - "fastqc/SAMPLE3_SE_1_fastqc.html", - "fastqc/SAMPLE3_SE_1_fastqc.zip", - "fastqc/SAMPLE3_SE_2_fastqc.html", - "fastqc/SAMPLE3_SE_2_fastqc.zip", - "iridanext.output.json.gz", - "multiqc", - "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", - "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", - "multiqc/multiqc_data/fastqc_overrepresented_sequences_plot.txt", - "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", - "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", - "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", - "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", - "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", - "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", - "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", - "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", - "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", - "multiqc/multiqc_data/multiqc.log", - "multiqc/multiqc_data/multiqc_citations.txt", - "multiqc/multiqc_data/multiqc_data.json", - "multiqc/multiqc_data/multiqc_fastqc.txt", - "multiqc/multiqc_data/multiqc_general_stats.txt", - "multiqc/multiqc_data/multiqc_software_versions.txt", - "multiqc/multiqc_data/multiqc_sources.txt", - "multiqc/multiqc_plots", - "multiqc/multiqc_plots/pdf", - "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", - "multiqc/multiqc_plots/pdf/fastqc_overrepresented_sequences_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", - "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", - "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_sequence_length_distribution_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf", - "multiqc/multiqc_plots/png", - "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", - "multiqc/multiqc_plots/png/fastqc_overrepresented_sequences_plot.png", - "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", - "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", - "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", - "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", - "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", - "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", - "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", - "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", - "multiqc/multiqc_plots/png/fastqc_sequence_length_distribution_plot.png", - "multiqc/multiqc_plots/png/fastqc_top_overrepresented_sequences_table.png", - "multiqc/multiqc_plots/svg", - "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", - "multiqc/multiqc_plots/svg/fastqc_overrepresented_sequences_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", - "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", - "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", - "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", - "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_sequence_length_distribution_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_top_overrepresented_sequences_table.svg", - "multiqc/multiqc_report.html", - "pipeline_info", - "pipeline_info/iridanextexample2_software_mqc_versions.yml" - ], - [ - "fastqc-status-check-heatmap.txt:md5,0f1975c565a16bf09be08a05c204ded7", - "fastqc_overrepresented_sequences_plot.txt:md5,4b23cea39c4e23deef6b97810bc1ee46", - "fastqc_per_base_n_content_plot.txt:md5,037692101c0130c72493d3bbfa3afac1", - "fastqc_per_base_sequence_quality_plot.txt:md5,bfe735f3e31befe13bdf6761bb297d6e", - "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,7108d19c46ef7883e864ba274c457d2e", - "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,23f527c80a148e4f34e5a43f6e520a90", - "fastqc_per_sequence_quality_scores_plot.txt:md5,a0cc0e6df7bfb05257da1cfc88b13c50", - "fastqc_sequence_counts_plot.txt:md5,c6e4e1588e6765fe8df27812a1322fbd", - "fastqc_sequence_duplication_levels_plot.txt:md5,3cde2db4033f6c64648976d1174db925", - "fastqc_sequence_length_distribution_plot.txt:md5,e82b9b14a7e24c0c5f27af97cebb6870", - "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", - "multiqc_fastqc.txt:md5,1a41c2158adc9947bff9232962f70110", - "multiqc_general_stats.txt:md5,0b54e4e764665bd57fe0f95216744a78" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "25.04.6" - }, - "timestamp": "2025-07-18T16:48:55.321351221" + "timestamp": "2025-10-07T14:41:41.180274463" } } \ No newline at end of file