From 13fa0ccb3a87470f393dbe1ff3da2bed2a0021f7 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 30 Apr 2025 12:26:08 +0000 Subject: [PATCH 1/7] Template update for nf-core/tools version 3.2.1 --- .github/workflows/awsfulltest.yml | 41 ++---- .github/workflows/ci.yml | 1 + .nf-core.yml | 19 ++- assets/email_template.html | 141 ++++++--------------- assets/nf-core-bactmap_logo_light.png | Bin 75729 -> 75733 bytes docs/images/nf-core-bactmap_logo_dark.png | Bin 28573 -> 28533 bytes docs/images/nf-core-bactmap_logo_light.png | Bin 24636 -> 24513 bytes nextflow.config | 2 +- ro-crate-metadata.json | 23 +++- 9 files changed, 79 insertions(+), 148 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 8b87c69f..7547da8f 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -4,44 +4,23 @@ name: nf-core AWS full size tests # It runs the -profile 'test_full' on AWS batch on: - pull_request: - branches: - - main - - master workflow_dispatch: pull_request_review: types: [submitted] + release: + types: [published] jobs: run-platform: name: Run AWS full tests - # run only if the PR is approved by at least 2 reviewers and against the master branch or manually triggered - if: github.repository == 'nf-core/bactmap' && github.event.review.state == 'approved' && github.event.pull_request.base.ref == 'master' || github.event_name == 'workflow_dispatch' + # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered + if: github.repository == 'nf-core/bactmap' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - - name: Get PR reviews - uses: octokit/request-action@v2.x - if: github.event_name != 'workflow_dispatch' - id: check_approvals - continue-on-error: true - with: - route: GET /repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews?per_page=100 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Check for approvals - if: ${{ failure() && github.event_name != 'workflow_dispatch' }} - run: | - echo "No review approvals found. At least 2 approvals are required to run this action automatically." - exit 1 - - - name: Check for enough approvals (>=2) - id: test_variables - if: github.event_name != 'workflow_dispatch' + - name: Set revision variable + id: revision run: | - JSON_RESPONSE='${{ steps.check_approvals.outputs.data }}' - CURRENT_APPROVALS_COUNT=$(echo $JSON_RESPONSE | jq -c '[.[] | select(.state | contains("APPROVED")) ] | length') - test $CURRENT_APPROVALS_COUNT -ge 2 || exit 1 # At least 2 approvals are required + echo "revision=${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'release') && github.sha || 'dev' }}" >> "$GITHUB_OUTPUT" - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 @@ -52,12 +31,12 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - revision: ${{ github.sha }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/bactmap/work-${{ github.sha }} + revision: ${{ steps.revision.outputs.revision }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/bactmap/work-${{ steps.revision.outputs.revision }} parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/bactmap/results-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/bactmap/results-${{ steps.revision.outputs.revision }}" } profiles: test_full diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df615bda..953beb7b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,5 +83,6 @@ jobs: uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} run: | nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.nf-core.yml b/.nf-core.yml index 29b98257..cea52597 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,16 +1,13 @@ -repository_type: pipeline - -nf_core_version: 3.2.0 - lint: {} - +nf_core_version: 3.2.1 +repository_type: pipeline template: - org: nf-core - name: bactmap - description: A mapping-based pipeline for bacterial whole genome sequences author: Andries J. van Tonder - version: 2.0.0dev - force: true + description: A mapping-based pipeline for bacterial whole genome sequences + force: false + is_nfcore: true + name: bactmap + org: nf-core outdir: . skip_features: [] - is_nfcore: true + version: 2.0.0dev diff --git a/assets/email_template.html b/assets/email_template.html index 8387659b..3619691a 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,110 +1,53 @@ - - - - + + + + - - nf-core/bactmap Pipeline Report - - -
- + + nf-core/bactmap Pipeline Report + + +
-

nf-core/bactmap ${version}

-

Run Name: $runName

+ - <% if (!success){ out << """ -
-

nf-core/bactmap execution completed unsuccessfully!

+

nf-core/bactmap ${version}

+

Run Name: $runName

+ +<% if (!success){ + out << """ +
+

nf-core/bactmap execution completed unsuccessfully!

The exit status of the task that caused the workflow execution to fail was: $exitStatus.

The full error message was:

-
${errorReport}
-
- """ } else { out << """ -
+
${errorReport}
+
+ """ +} else { + out << """ +
nf-core/bactmap execution completed successfully! -
- """ } %> +
+ """ +} +%> -

The workflow was completed at $dateComplete (duration: $duration)

-

The command used to launch the workflow was as follows:

-
-$commandLine
+

The workflow was completed at $dateComplete (duration: $duration)

+

The command used to launch the workflow was as follows:

+
$commandLine
-

Pipeline Configuration:

- - - <% out << summary.collect{ k,v -> " - - - - - " }.join("\n") %> - -
- $k - -
$v
-
+

Pipeline Configuration:

+ + + <% out << summary.collect{ k,v -> "" }.join("\n") %> + +
$k
$v
-

nf-core/bactmap

-

https://github.com/nf-core/bactmap

-
- +

nf-core/bactmap

+

https://github.com/nf-core/bactmap

+ +
+ + diff --git a/assets/nf-core-bactmap_logo_light.png b/assets/nf-core-bactmap_logo_light.png index 47f376d82d8ea6f72a04c485049cb28464b9b5df..9fd8de13841288f24191c6f76e72c4a60cba2f84 100644 GIT binary patch delta 23702 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 diff --git a/docs/images/nf-core-bactmap_logo_dark.png b/docs/images/nf-core-bactmap_logo_dark.png index 9e7daef524cad4349f42c9732b1ece524dcfcaf6..4d3f130c9ccadc3378a784b66cff223f9be4253a 100644 GIT binary patch delta 27822 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 andcxSeLvzd27Go8VtCaQQLX3l;Qs(I{{o8u diff --git a/docs/images/nf-core-bactmap_logo_light.png b/docs/images/nf-core-bactmap_logo_light.png index f86b9a7e3719e5b9a515f1b76b914c1496b82f24..819530b03df9c3c42c6a2fa1e822f361dbdfc514 100644 GIT binary patch literal 24513 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 bDACjkf-Ad%&eWbM!` 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 b!S5dFi417Nm4!hAehAXnF-E=6a*q2itq#&l literal 24636 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%0DMIV_J~~>PX0oEV$~7vgshQ1?7AQVM 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 diff --git a/nextflow.config b/nextflow.config index d02a30c2..9831397d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -249,7 +249,7 @@ manifest { // Nextflow plugins plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.2.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 6dc91e48..39a50c70 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,7 +22,7 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-03-13T14:15:46+00:00", + "datePublished": "2025-04-30T12:25:50+00:00", "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", "hasPart": [ { @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#2ba10903-33af-4faa-9ee1-d7e45a8f2fc1" + "@id": "#a5c89635-4eb5-448f-8d64-97e8af04e96f" } ], "name": "nf-core/bactmap" @@ -122,8 +122,13 @@ { "@id": "main.nf", "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], + "creator": [ + { + "@id": "#ajv37@shgb2monitor.vet.private.cam.ac.uk" + } + ], "dateCreated": "", - "dateModified": "2025-03-13T14:15:46Z", + "dateModified": "2025-04-30T12:25:50Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -160,11 +165,11 @@ "version": "!>=24.04.2" }, { - "@id": "#2ba10903-33af-4faa-9ee1-d7e45a8f2fc1", + "@id": "#a5c89635-4eb5-448f-8d64-97e8af04e96f", "@type": "TestSuite", "instance": [ { - "@id": "#3f5008e2-1065-44ff-89de-ac416b610232" + "@id": "#59ab53b9-7a7b-4769-8ff5-e7eb2f15d71b" } ], "mainEntity": { @@ -173,7 +178,7 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#3f5008e2-1065-44ff-89de-ac416b610232", + "@id": "#59ab53b9-7a7b-4769-8ff5-e7eb2f15d71b", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", "resource": "repos/nf-core/bactmap/actions/workflows/ci.yml", @@ -300,6 +305,12 @@ "@type": "Organization", "name": "nf-core", "url": "https://nf-co.re/" + }, + { + "@id": "#ajv37@shgb2monitor.vet.private.cam.ac.uk", + "@type": "Person", + "email": "ajv37@shgb2monitor.vet.private.cam.ac.uk", + "name": "Andries Van Tonder" } ] } From 6d080acf9fc53e6a9ea91258d4a6122c2024ceec Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 3 Jun 2025 11:01:27 +0000 Subject: [PATCH 2/7] Template update for nf-core/tools version 3.3.1 --- .editorconfig | 37 ----- .github/CONTRIBUTING.md | 2 +- .github/actions/get-shards/action.yml | 69 +++++++++ .github/actions/nf-test/action.yml | 113 ++++++++++++++ .github/workflows/awsfulltest.yml | 4 +- .github/workflows/awstest.yml | 2 +- .github/workflows/ci.yml | 88 ----------- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 20 +-- .../{fix-linting.yml => fix_linting.yml} | 4 +- .github/workflows/linting.yml | 15 +- .github/workflows/linting_comment.yml | 4 +- .github/workflows/nf-test.yml | 142 ++++++++++++++++++ .github/workflows/release-announcements.yml | 2 +- ...mment.yml => template-version-comment.yml} | 2 +- .nf-core.yml | 2 +- .pre-commit-config.yaml | 26 +++- .prettierrc.yml | 5 + README.md | 7 +- conf/base.config | 5 +- nextflow.config | 17 ++- nf-test.config | 24 +++ ro-crate-metadata.json | 16 +- .../utils_nfcore_bactmap_pipeline/main.nf | 1 - tests/.nftignore | 10 ++ tests/default.nf.test | 35 +++++ tests/nextflow.config | 12 ++ 27 files changed, 487 insertions(+), 179 deletions(-) delete mode 100644 .editorconfig create mode 100644 .github/actions/get-shards/action.yml create mode 100644 .github/actions/nf-test/action.yml delete mode 100644 .github/workflows/ci.yml rename .github/workflows/{fix-linting.yml => fix_linting.yml} (96%) create mode 100644 .github/workflows/nf-test.yml rename .github/workflows/{template_version_comment.yml => template-version-comment.yml} (95%) create mode 100644 nf-test.config create mode 100644 tests/.nftignore create mode 100644 tests/default.nf.test create mode 100644 tests/nextflow.config diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 6d9b74cc..00000000 --- a/.editorconfig +++ /dev/null @@ -1,37 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_size = 4 -indent_style = space - -[*.{md,yml,yaml,html,css,scss,js}] -indent_size = 2 - -# These files are edited and tested upstream in nf-core/modules -[/modules/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset -[/subworkflows/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset - -[/assets/email*] -indent_size = unset - -# ignore python and markdown -[*.{py,md}] -indent_style = unset - -# ignore ro-crate metadata files -[**/ro-crate-metadata.json] -insert_final_newline = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index eecca486..9ae86e78 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -78,7 +78,7 @@ If you wish to contribute a new step, please use the following coding standards: 5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test command in `.github/workflow/ci.yml`. +8. If applicable, add a new test in the `tests` directory. 9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml new file mode 100644 index 00000000..34085279 --- /dev/null +++ b/.github/actions/get-shards/action.yml @@ -0,0 +1,69 @@ +name: "Get number of shards" +description: "Get the number of nf-test shards for the current CI job" +inputs: + max_shards: + description: "Maximum number of shards allowed" + required: true + paths: + description: "Component paths to test" + required: false + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +outputs: + shard: + description: "Array of shard numbers" + value: ${{ steps.shards.outputs.shard }} + total_shards: + description: "Total number of shards" + value: ${{ steps.shards.outputs.total_shards }} +runs: + using: "composite" + steps: + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: ${{ env.NFT_VER }} + - name: Get number of shards + id: shards + shell: bash + run: | + # Run nf-test with dynamic parameter + nftest_output=$(nf-test test \ + --profile +docker \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --dry-run \ + --ci \ + --changed-since HEAD^) || { + echo "nf-test command failed with exit code $?" + echo "Full output: $nftest_output" + exit 1 + } + echo "nf-test dry-run output: $nftest_output" + + # Default values for shard and total_shards + shard="[]" + total_shards=0 + + # Check if there are related tests + if echo "$nftest_output" | grep -q 'No tests to execute'; then + echo "No related tests found." + else + # Extract the number of related tests + number_of_shards=$(echo "$nftest_output" | sed -n 's|.*Executed \([0-9]*\) tests.*|\1|p') + if [[ -n "$number_of_shards" && "$number_of_shards" -gt 0 ]]; then + shards_to_run=$(( $number_of_shards < ${{ inputs.max_shards }} ? $number_of_shards : ${{ inputs.max_shards }} )) + shard=$(seq 1 "$shards_to_run" | jq -R . | jq -c -s .) + total_shards="$shards_to_run" + else + echo "Unexpected output format. Falling back to default values." + fi + fi + + # Write to GitHub Actions outputs + echo "shard=$shard" >> $GITHUB_OUTPUT + echo "total_shards=$total_shards" >> $GITHUB_OUTPUT + + # Debugging output + echo "Final shard array: $shard" + echo "Total number of shards: $total_shards" diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml new file mode 100644 index 00000000..243e7823 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,113 @@ +name: "nf-test Action" +description: "Runs nf-test with common setup steps" +inputs: + profile: + description: "Profile to use" + required: true + shard: + description: "Shard number for this CI job" + required: true + total_shards: + description: "Total number of test shards(NOT the total number of matrix jobs)" + required: true + paths: + description: "Test paths" + required: true + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +runs: + using: "composite" + steps: + - name: Setup Nextflow + uses: nf-core/setup-nextflow@v2 + with: + version: "${{ env.NXF_VERSION }}" + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.13" + + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - name: Setup apptainer + if: contains(inputs.profile, 'singularity') + uses: eWaterCycle/setup-apptainer@main + + - name: Set up Singularity + if: contains(inputs.profile, 'singularity') + shell: bash + run: | + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Conda setup + if: contains(inputs.profile, 'conda') + uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 + with: + auto-update-conda: true + conda-solver: libmamba + conda-remove-defaults: true + + # TODO Skip failing conda tests and document their failures + # https://github.com/nf-core/modules/issues/7017 + - name: Run nf-test + shell: bash + env: + NFT_DIFF: ${{ env.NFT_DIFF }} + NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + run: | + nf-test test \ + --profile=+${{ inputs.profile }} \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --ci \ + --changed-since HEAD^ \ + --verbose \ + --tap=test.tap \ + --shard ${{ inputs.shard }}/${{ inputs.total_shards }} + + # Save the absolute path of the test.tap file to the output + echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT + + - name: Generate test summary + if: always() + shell: bash + run: | + # Add header if it doesn't exist (using a token file to track this) + if [ ! -f ".summary_header" ]; then + echo "# 🚀 nf-test results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY + echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY + touch .summary_header + fi + + if [ -f test.tap ]; then + while IFS= read -r line; do + if [[ $line =~ ^ok ]]; then + test_name="${line#ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ✅ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + elif [[ $line =~ ^not\ ok ]]; then + test_name="${line#not ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + done < test.tap + else + echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + + - name: Clean up + if: always() + shell: bash + run: | + sudo rm -rf /home/ubuntu/tests/ diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 7547da8f..90140f5e 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: run-platform: name: Run AWS full tests # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered - if: github.repository == 'nf-core/bactmap' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' + if: github.repository == 'nf-core/bactmap' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' || github.event_name == 'release' runs-on: ubuntu-latest steps: - name: Set revision variable @@ -40,7 +40,7 @@ jobs: } profiles: test_full - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 51d0ba90..c10dc2cb 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -25,7 +25,7 @@ jobs: } profiles: test - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 953beb7b..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: nf-core 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] - workflow_dispatch: - -env: - NXF_ANSI_LOG: false - NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity - NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity - -concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" - cancel-in-progress: true - -jobs: - test: - name: "Run pipeline with test data (${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }})" - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/bactmap') }}" - runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "24.04.2" - - "latest-everything" - profile: - - "conda" - - "docker" - - "singularity" - test_name: - - "test" - isMaster: - - ${{ github.base_ref == 'master' }} - # Exclude conda and singularity on dev - exclude: - - isMaster: false - profile: "conda" - - isMaster: false - profile: "singularity" - steps: - - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - with: - fetch-depth: 0 - - - name: Set up Nextflow - uses: nf-core/setup-nextflow@v2 - with: - version: "${{ matrix.NXF_VER }}" - - - name: Set up Apptainer - if: matrix.profile == 'singularity' - uses: eWaterCycle/setup-apptainer@main - - - name: Set up Singularity - if: matrix.profile == 'singularity' - run: | - mkdir -p $NXF_SINGULARITY_CACHEDIR - mkdir -p $NXF_SINGULARITY_LIBRARYDIR - - - name: Set up Miniconda - if: matrix.profile == 'conda' - uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 - with: - miniconda-version: "latest" - auto-update-conda: true - conda-solver: libmamba - channels: conda-forge,bioconda - - - name: Set up Conda - if: matrix.profile == 'conda' - run: | - echo $(realpath $CONDA)/condabin >> $GITHUB_PATH - echo $(realpath python) >> $GITHUB_PATH - - - name: Clean up Disk space - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" - continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} - run: | - nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 0b6b1f27..ac030fd5 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9 + - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index ab06316e..999bcc38 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -12,14 +12,6 @@ on: required: true default: "dev" pull_request: - types: - - opened - - edited - - synchronize - branches: - - main - - master - pull_request_target: branches: - main - master @@ -52,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: Setup Apptainer @@ -120,6 +112,7 @@ jobs: echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" - name: Compare container image counts + id: count_comparison run: | if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} @@ -132,3 +125,10 @@ jobs: else echo "The pipeline can be downloaded successfully!" fi + + - name: Upload Nextflow logfile for debugging purposes + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: nextflow_logfile.txt + path: .nextflow.log* + include-hidden-files: true diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix_linting.yml similarity index 96% rename from .github/workflows/fix-linting.yml rename to .github/workflows/fix_linting.yml index b43736ff..e6c0586d 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix_linting.yml @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index dbd52d5a..f2d7d1dd 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -3,9 +3,6 @@ name: nf-core linting # It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. on: - push: - branches: - - dev pull_request: release: types: [published] @@ -17,9 +14,9 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Python 3.12 - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit @@ -36,13 +33,13 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: read .nf-core.yml - uses: pietrobolcato/action-read-yaml@1.1.0 + uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml @@ -74,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 95b6b6af..7e8050fb 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@20319c5641d495c8a52e688b7dc5fada6c3a9fbc # v8 + uses: dawidd6/action-download-artifact@4c1e823582f43b179e2cbb49c3eade4e41f992e2 # v10 with: workflow: linting.yml workflow_conclusion: completed @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2 + uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 00000000..f03aea0c --- /dev/null +++ b/.github/workflows/nf-test.yml @@ -0,0 +1,142 @@ +name: Run nf-test +on: + push: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + pull_request: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + release: + types: [published] + workflow_dispatch: + +# Cancel if a newer run is started +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NFT_VER: "0.9.2" + NFT_WORKDIR: "~" + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +jobs: + nf-test-changes: + name: nf-test-changes + runs-on: # use self-hosted runners + - runs-on=$-nf-test-changes + - runner=4cpu-linux-x64 + outputs: + shard: ${{ steps.set-shards.outputs.shard }} + total_shards: ${{ steps.set-shards.outputs.total_shards }} + steps: + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: get number of shards + id: set-shards + uses: ./.github/actions/get-shards + env: + NFT_VER: ${{ env.NFT_VER }} + with: + max_shards: 7 + + - name: debug + run: | + echo ${{ steps.set-shards.outputs.shard }} + echo ${{ steps.set-shards.outputs.total_shards }} + + nf-test: + name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" + needs: [nf-test-changes] + if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} + runs-on: # use self-hosted runners + - runs-on=$-nf-test + - runner=4cpu-linux-x64 + strategy: + fail-fast: false + matrix: + shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} + profile: [conda, docker, singularity] + isMain: + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + # Exclude conda and singularity on dev + exclude: + - isMain: false + profile: "conda" + - isMain: false + profile: "singularity" + NXF_VER: + - "24.04.2" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: Run nf-test + uses: ./.github/actions/nf-test + env: + NFT_DIFF: ${{ env.NFT_DIFF }} + NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + with: + profile: ${{ matrix.profile }} + shard: ${{ matrix.shard }} + total_shards: ${{ env.TOTAL_SHARDS }} + confirm-pass: + needs: [nf-test] + if: always() + runs-on: # use self-hosted runners + - runs-on=$-confirm-pass + - runner=2cpu-linux-x64 + steps: + - name: One or more tests failed + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: One or more tests cancelled + if: ${{ contains(needs.*.result, 'cancelled') }} + run: exit 1 + + - name: All tests ok + if: ${{ contains(needs.*.result, 'success') }} + run: exit 0 + + - name: debug-print + if: always() + run: | + echo "::group::DEBUG: `needs` Contents" + echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" + echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" + echo "::endgroup::" + + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + if: always() + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 76a9e67e..4abaf484 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -30,7 +30,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@80dbe0a7697de18c15ad22f4619919ceb5ccf597 # v0.1.0 + - uses: zentered/bluesky-post-action@4aa83560bb3eac05dbad1e5f221ee339118abdd2 # v0.2.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template-version-comment.yml similarity index 95% rename from .github/workflows/template_version_comment.yml rename to .github/workflows/template-version-comment.yml index 537529bc..beb5c77f 100644 --- a/.github/workflows/template_version_comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -14,7 +14,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Read template version from .nf-core.yml - uses: nichmor/minimal-read-yaml@v0.0.2 + uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml diff --git a/.nf-core.yml b/.nf-core.yml index cea52597..304e9155 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.2.1 +nf_core_version: 3.3.1 repository_type: pipeline template: author: Andries J. van Tonder diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1dec8650..9d0b248d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,10 +4,24 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.2.5 - - - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: "3.1.2" + - prettier@3.5.0 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 hooks: - - id: editorconfig-checker - alias: ec + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ + - id: end-of-file-fixer + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ diff --git a/.prettierrc.yml b/.prettierrc.yml index c81f9a76..07dbd8bb 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1 +1,6 @@ printWidth: 120 +tabWidth: 4 +overrides: + - files: "*.{md,yml,yaml,html,css,scss,js,cff}" + options: + tabWidth: 2 diff --git a/README.md b/README.md index decae49f..a4f31d0f 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,14 @@ [![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-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.1-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.1) [![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/) [![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction @@ -28,7 +29,7 @@ --> + workflows use the "tube map" design for that. See https://nf-co.re/docs/guidelines/graphic_design/workflow_diagrams#examples for examples. --> 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Usage diff --git a/conf/base.config b/conf/base.config index a037a4f4..139dcbbd 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ process { memory = { 6.GB * task.attempt } time = { 4.h * task.attempt } - errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in ((130..145) + 104 + 175) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' @@ -59,4 +59,7 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withLabel: process_gpu { + ext.use_gpu = { workflow.profile.contains('gpu') } + } } diff --git a/nextflow.config b/nextflow.config index 9831397d..49c7c0b5 100644 --- a/nextflow.config +++ b/nextflow.config @@ -160,16 +160,25 @@ profiles { ] } } + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' + } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } -// Load nf-core custom profiles from different Institutions -includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" +// Load nf-core custom profiles from different institutions + +// If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. +// Load nf-core/bactmap custom profiles from different institutions. +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" + // Load nf-core/bactmap custom profiles from different institutions. // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/bactmap.config" : "/dev/null" +// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/bactmap.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled @@ -249,7 +258,7 @@ manifest { // Nextflow plugins plugins { - id 'nf-schema@2.2.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..889df760 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,24 @@ +config { + // location for all nf-test tests + testsDir "." + + // nf-test directory including temporary files for each test + workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" + + // location of an optional nextflow.config file specific for executing tests + configFile "tests/nextflow.config" + + // ignore tests coming from the nf-core/modules repo + ignore 'modules/nf-core/**/*', 'subworkflows/nf-core/**/*' + + // run all test with defined profile(s) from the main nextflow.config + profile "test" + + // list of filenames or patterns that should be trigger a full test run + triggers 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore' + + // load the necessary plugins + plugins { + load "nft-utils@0.0.3" + } +} diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 39a50c70..5668bec2 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-04-30T12:25:50+00:00", - "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", + "datePublished": "2025-06-03T11:01:23+00:00", + "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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.04.2-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.1-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.1)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#a5c89635-4eb5-448f-8d64-97e8af04e96f" + "@id": "#608f327c-9110-49dd-9976-f8e1a48a7d33" } ], "name": "nf-core/bactmap" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-04-30T12:25:50Z", + "dateModified": "2025-06-03T11:01:23Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -165,11 +165,11 @@ "version": "!>=24.04.2" }, { - "@id": "#a5c89635-4eb5-448f-8d64-97e8af04e96f", + "@id": "#608f327c-9110-49dd-9976-f8e1a48a7d33", "@type": "TestSuite", "instance": [ { - "@id": "#59ab53b9-7a7b-4769-8ff5-e7eb2f15d71b" + "@id": "#bbd42029-a57c-4aae-9989-91f4e2574e0c" } ], "mainEntity": { @@ -178,10 +178,10 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#59ab53b9-7a7b-4769-8ff5-e7eb2f15d71b", + "@id": "#bbd42029-a57c-4aae-9989-91f4e2574e0c", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", - "resource": "repos/nf-core/bactmap/actions/workflows/ci.yml", + "resource": "repos/nf-core/bactmap/actions/workflows/nf-test.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, diff --git a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf index 105a4e63..3aeb4206 100644 --- a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf @@ -261,4 +261,3 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } - diff --git a/tests/.nftignore b/tests/.nftignore new file mode 100644 index 00000000..c10bc1f1 --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,10 @@ +.DS_Store +multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt +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_plots/{svg,pdf,png}/*.{svg,pdf,png} +multiqc/multiqc_report.html +fastqc/*_fastqc.{html,zip} +pipeline_info/*.{html,json,txt,yml} diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 00000000..8bb40337 --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,35 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("-profile test") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success}, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_bactmap_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } +} diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..b42ec1ea --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,12 @@ +/* +======================================================================================== + Nextflow config file for running nf-test tests +======================================================================================== +*/ + +// TODO nf-core: Specify any additional parameters here +// Or any resources requirements +params.modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' +params.pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/bactmap' + +aws.client.anonymous = true // fixes S3 access issues on self-hosted runners From d57c2a799e65e08bdc3eff01c1cfce92fd195dd3 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 8 Jul 2025 11:38:24 +0000 Subject: [PATCH 3/7] Template update for nf-core/tools version 3.3.2 --- .github/actions/nf-test/action.yml | 4 - .github/workflows/linting.yml | 2 +- .github/workflows/linting_comment.yml | 2 +- .github/workflows/nf-test.yml | 45 +++---- .github/workflows/release-announcements.yml | 2 +- .nf-core.yml | 2 +- .pre-commit-config.yaml | 2 +- README.md | 6 +- assets/schema_input.json | 4 +- conf/base.config | 1 + modules.json | 4 +- modules/nf-core/fastqc/environment.yml | 2 + modules/nf-core/fastqc/main.nf | 2 +- modules/nf-core/fastqc/meta.yml | 23 ++-- modules/nf-core/multiqc/environment.yml | 4 +- modules/nf-core/multiqc/main.nf | 4 +- modules/nf-core/multiqc/meta.yml | 110 ++++++++++-------- .../nf-core/multiqc/tests/main.nf.test.snap | 18 +-- nextflow.config | 5 +- nf-test.config | 2 +- ro-crate-metadata.json | 16 +-- .../tests/nextflow.config | 2 +- tests/.nftignore | 1 + tests/nextflow.config | 6 +- 24 files changed, 146 insertions(+), 123 deletions(-) diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index 243e7823..bf44d961 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -54,13 +54,9 @@ runs: conda-solver: libmamba conda-remove-defaults: true - # TODO Skip failing conda tests and document their failures - # https://github.com/nf-core/modules/issues/7017 - name: Run nf-test shell: bash env: - NFT_DIFF: ${{ env.NFT_DIFF }} - NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} NFT_WORKDIR: ${{ env.NFT_WORKDIR }} run: | nf-test test \ diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index f2d7d1dd..8b0f88c3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: python-version: "3.13" diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 7e8050fb..d43797d9 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@4c1e823582f43b179e2cbb49c3eade4e41f992e2 # v10 + uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index f03aea0c..e7b58449 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -1,12 +1,5 @@ name: Run nf-test on: - push: - paths-ignore: - - "docs/**" - - "**/meta.yml" - - "**/*.md" - - "**/*.png" - - "**/*.svg" pull_request: paths-ignore: - "docs/**" @@ -35,7 +28,7 @@ jobs: nf-test-changes: name: nf-test-changes runs-on: # use self-hosted runners - - runs-on=$-nf-test-changes + - runs-on=${{ github.run_id }}-nf-test-changes - runner=4cpu-linux-x64 outputs: shard: ${{ steps.set-shards.outputs.shard }} @@ -69,7 +62,7 @@ jobs: needs: [nf-test-changes] if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} runs-on: # use self-hosted runners - - runs-on=$-nf-test + - runs-on=${{ github.run_id }}-nf-test - runner=4cpu-linux-x64 strategy: fail-fast: false @@ -85,7 +78,7 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.04.2" + - "24.10.5" - "latest-everything" env: NXF_ANSI_LOG: false @@ -97,23 +90,39 @@ jobs: fetch-depth: 0 - name: Run nf-test + id: run_nf_test uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} env: - NFT_DIFF: ${{ env.NFT_DIFF }} - NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} NFT_WORKDIR: ${{ env.NFT_WORKDIR }} with: profile: ${{ matrix.profile }} shard: ${{ matrix.shard }} total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + confirm-pass: needs: [nf-test] if: always() runs-on: # use self-hosted runners - - runs-on=$-confirm-pass + - runs-on=${{ github.run_id }}-confirm-pass - runner=2cpu-linux-x64 steps: - - name: One or more tests failed + - name: One or more tests failed (excluding latest-everything) if: ${{ contains(needs.*.result, 'failure') }} run: exit 1 @@ -132,11 +141,3 @@ jobs: echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" echo "::endgroup::" - - - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner - if: always() - run: | - ls -la ./ - rm -rf ./* || true - rm -rf ./.??* || true - ls -la ./ diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 4abaf484..0f732495 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -30,7 +30,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@4aa83560bb3eac05dbad1e5f221ee339118abdd2 # v0.2.0 + - uses: zentered/bluesky-post-action@6461056ea355ea43b977e149f7bf76aaa572e5e8 # v0.3.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.nf-core.yml b/.nf-core.yml index 304e9155..3958ca07 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.3.1 +nf_core_version: 3.3.2 repository_type: pipeline template: author: Andries J. van Tonder diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9d0b248d..bb41beec 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.5.0 + - prettier@3.6.2 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: diff --git a/README.md b/README.md index a4f31d0f..4e4334cc 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,12 @@ -[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml) +[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![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.04.2-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.1-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.1) +[![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) [![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/assets/schema_input.json b/assets/schema_input.json index 3023bb46..6fecd108 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -17,14 +17,14 @@ "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" }, "fastq_2": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" } }, diff --git a/conf/base.config b/conf/base.config index 139dcbbd..4ea51b37 100644 --- a/conf/base.config +++ b/conf/base.config @@ -61,5 +61,6 @@ process { } withLabel: process_gpu { ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } } } diff --git a/modules.json b/modules.json index d910b83f..0fc67f90 100644 --- a/modules.json +++ b/modules.json @@ -7,12 +7,12 @@ "nf-core": { "fastqc": { "branch": "master", - "git_sha": "08108058ea36a63f141c25c4e75f9f872a5b2296", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "f0719ae309075ae4a291533883847c3f7c441dad", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] } } diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml index 691d4c76..f9f54ee9 100644 --- a/modules/nf-core/fastqc/environment.yml +++ b/modules/nf-core/fastqc/environment.yml @@ -1,3 +1,5 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 033f4154..23e16634 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -29,7 +29,7 @@ process FASTQC { // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 // Dividing the task.memory by task.cpu allows to stick to requested amount of RAM in the label - def memory_in_mb = task.memory ? task.memory.toUnit('MB').toFloat() / task.cpus : null + def memory_in_mb = task.memory ? task.memory.toUnit('MB') / task.cpus : null // FastQC memory value allowed range (100 - 10000) def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index 2b2e62b8..c8d9d025 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -29,9 +29,10 @@ input: description: | List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. + ontologies: [] output: - - html: - - meta: + html: + - - meta: type: map description: | Groovy Map containing sample information @@ -40,8 +41,9 @@ output: type: file description: FastQC report pattern: "*_{fastqc.html}" - - zip: - - meta: + ontologies: [] + zip: + - - meta: type: map description: | Groovy Map containing sample information @@ -50,11 +52,14 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index a27122ce..812fc4c5 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -1,5 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.27 + - bioconda::multiqc=1.29 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 58d9313c..0ac3c369 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.27--pyhdfd78af_0' : - 'biocontainers/multiqc:1.27--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : + 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index b16c1879..ce30eb73 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -15,57 +15,71 @@ tools: licence: ["GPL-3.0-or-later"] identifier: biotools:multiqc input: - - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - - - multiqc_logo: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + ontologies: [] + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV +output: + report: + - "*multiqc_report.html": type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - - - replace_names: + description: MultiQC report file + pattern: "multiqc_report.html" + ontologies: [] + data: + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - "*_plots": type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - - - sample_names: + description: Plots created by MultiQC + pattern: "*_data" + ontologies: [] + versions: + - versions.yml: type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" -output: - - report: - - "*multiqc_report.html": - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - - "*_plots": - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 7b7c1322..88e90571 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,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:29:57.631982377" + "timestamp": "2025-05-22T11:50:41.182332996" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:30:34.743726958" + "timestamp": "2025-05-22T11:51:22.448739369" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:30:21.44383553" + "timestamp": "2025-05-22T11:51:06.198928424" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 49c7c0b5..a6fee8e8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -235,7 +235,6 @@ dag { manifest { name = 'nf-core/bactmap' - author = """Andries J. van Tonder""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ @@ -251,14 +250,14 @@ manifest { description = """A mapping-based pipeline for bacterial whole genome sequences""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.04.2' + nextflowVersion = '!>=24.10.5' version = '2.0.0dev' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/nf-test.config b/nf-test.config index 889df760..3a1fff59 100644 --- a/nf-test.config +++ b/nf-test.config @@ -9,7 +9,7 @@ config { configFile "tests/nextflow.config" // ignore tests coming from the nf-core/modules repo - ignore 'modules/nf-core/**/*', 'subworkflows/nf-core/**/*' + ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' // run all test with defined profile(s) from the main nextflow.config profile "test" diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 5668bec2..30dfe891 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-06-03T11:01:23+00:00", - "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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.04.2-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.1-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.1)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", + "datePublished": "2025-07-08T11:38:19+00:00", + "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#608f327c-9110-49dd-9976-f8e1a48a7d33" + "@id": "#3e097423-0ff9-4730-9d8d-aa366d021c38" } ], "name": "nf-core/bactmap" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-06-03T11:01:23Z", + "dateModified": "2025-07-08T11:38:19Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -162,14 +162,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.04.2" + "version": "!>=24.10.5" }, { - "@id": "#608f327c-9110-49dd-9976-f8e1a48a7d33", + "@id": "#3e097423-0ff9-4730-9d8d-aa366d021c38", "@type": "TestSuite", "instance": [ { - "@id": "#bbd42029-a57c-4aae-9989-91f4e2574e0c" + "@id": "#f7e01228-e890-4c53-ad20-3d01691d92e9" } ], "mainEntity": { @@ -178,7 +178,7 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#bbd42029-a57c-4aae-9989-91f4e2574e0c", + "@id": "#f7e01228-e890-4c53-ad20-3d01691d92e9", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", "resource": "repos/nf-core/bactmap/actions/workflows/nf-test.yml", diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 0907ac58..09ef842a 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,5 +1,5 @@ plugins { - id "nf-schema@2.1.0" + id "nf-schema@2.4.2" } validation { diff --git a/tests/.nftignore b/tests/.nftignore index c10bc1f1..158c83c5 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,5 +1,6 @@ .DS_Store multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt +multiqc/multiqc_data/BETA-multiqc.parquet multiqc/multiqc_data/multiqc.log multiqc/multiqc_data/multiqc_data.json multiqc/multiqc_data/multiqc_sources.txt diff --git a/tests/nextflow.config b/tests/nextflow.config index b42ec1ea..fbaf64d9 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -6,7 +6,9 @@ // TODO nf-core: Specify any additional parameters here // Or any resources requirements -params.modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' -params.pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/bactmap' +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/bactmap' +} aws.client.anonymous = true // fixes S3 access issues on self-hosted runners From a7f34b3b7d1bf5a2d6be3e5f7043ad7d1f4cd7cb Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 16 Oct 2025 13:38:27 +0000 Subject: [PATCH 4/7] Template update for nf-core/tools version 3.4.1 --- .devcontainer/devcontainer.json | 28 ++++---- .devcontainer/setup.sh | 13 ++++ .github/actions/nf-test/action.yml | 6 +- .github/workflows/awsfulltest.yml | 12 ++-- .github/workflows/awstest.yml | 12 ++-- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 6 +- .github/workflows/fix_linting.yml | 16 ++--- .github/workflows/linting.yml | 14 ++-- .github/workflows/linting_comment.yml | 2 +- .github/workflows/nf-test.yml | 9 +-- .github/workflows/release-announcements.yml | 7 ++ .../workflows/template-version-comment.yml | 2 +- .gitpod.yml | 10 --- .nf-core.yml | 4 +- .pre-commit-config.yaml | 2 +- .prettierignore | 1 + CHANGELOG.md | 2 +- README.md | 5 +- assets/multiqc_config.yml | 4 +- docs/usage.md | 2 +- main.nf | 5 +- modules.json | 8 +-- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 18 ++--- modules/nf-core/multiqc/tests/tags.yml | 2 - nextflow.config | 66 ++++++------------- nextflow_schema.json | 12 ++++ ro-crate-metadata.json | 22 +++---- .../utils_nfcore_bactmap_pipeline/main.nf | 31 ++++++++- .../utils_nextflow_pipeline/tests/tags.yml | 2 - .../utils_nfcore_pipeline/tests/tags.yml | 2 - .../nf-core/utils_nfschema_plugin/main.nf | 40 +++++++++-- .../utils_nfschema_plugin/tests/main.nf.test | 56 ++++++++++++++++ .../tests/nextflow.config | 4 +- tests/.nftignore | 3 +- tests/default.nf.test | 2 - 38 files changed, 275 insertions(+), 163 deletions(-) create mode 100755 .devcontainer/setup.sh delete mode 100644 .gitpod.yml delete mode 100644 modules/nf-core/multiqc/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b290e090..97c8c97f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,20 +1,20 @@ { "name": "nfcore", - "image": "nfcore/gitpod:latest", - "remoteUser": "gitpod", - "runArgs": ["--privileged"], + "image": "nfcore/devcontainer:latest", - // Configure tool-specific properties. - "customizations": { - // Configure properties specific to VS Code. - "vscode": { - // Set *default* container specific settings.json values on container create. - "settings": { - "python.defaultInterpreterPath": "/opt/conda/bin/python" - }, + "remoteUser": "root", + "privileged": true, - // Add the IDs of extensions you want installed when the container is created. - "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] - } + "remoteEnv": { + // Workspace path on the host for mounting with docker-outside-of-docker + "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}" + }, + + "onCreateCommand": "./.devcontainer/setup.sh", + + "hostRequirements": { + "cpus": 4, + "memory": "16gb", + "storage": "32gb" } } diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 00000000..2bdbcaa0 --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# Customise the terminal command prompt +echo "export PROMPT_DIRTRIM=2" >> $HOME/.bashrc +echo "export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] '" >> $HOME/.bashrc +export PROMPT_DIRTRIM=2 +export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] ' + +# Update Nextflow +nextflow self-update + +# Update welcome message +echo "Welcome to the nf-core/bactmap devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index bf44d961..3b9724c7 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -25,9 +25,9 @@ runs: version: "${{ env.NXF_VERSION }}" - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install nf-test uses: nf-core/setup-nf-test@v1 @@ -52,6 +52,8 @@ runs: with: auto-update-conda: true conda-solver: libmamba + channels: conda-forge + channel-priority: strict conda-remove-defaults: true - name: Run nf-test diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 90140f5e..26d02545 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -28,15 +28,15 @@ jobs: # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} revision: ${{ steps.revision.outputs.revision }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/bactmap/work-${{ steps.revision.outputs.revision }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/bactmap/work-${{ steps.revision.outputs.revision }} parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/bactmap/results-${{ steps.revision.outputs.revision }}" + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/bactmap/results-${{ steps.revision.outputs.revision }}" } profiles: test_full @@ -44,5 +44,5 @@ jobs: with: name: Seqera Platform debug log file path: | - seqera_platform_action_*.log - seqera_platform_action_*.json + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index c10dc2cb..96955115 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -14,14 +14,14 @@ jobs: - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} revision: ${{ github.sha }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/bactmap/work-${{ github.sha }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/bactmap/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/bactmap/results-test-${{ github.sha }}" + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/bactmap/results-test-${{ github.sha }}" } profiles: test @@ -29,5 +29,5 @@ jobs: with: name: Seqera Platform debug log file path: | - seqera_platform_action_*.log - seqera_platform_action_*.json + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index ac030fd5..6adb0fff 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 999bcc38..6d94bcbf 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -44,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" architecture: "x64" - name: Setup Apptainer @@ -57,7 +57,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install git+https://github.com/nf-core/tools.git@dev + pip install git+https://github.com/nf-core/tools.git - name: Make a cache directory for the container images run: | diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index e6c0586d..85d87311 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} # indication that the linting is being fixed - name: React on comment - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: eyes @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -47,7 +47,7 @@ jobs: # indication that the linting has finished - name: react if linting finished succesfully if: steps.pre-commit.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: "+1" @@ -67,21 +67,21 @@ jobs: - name: react if linting errors were fixed id: react-if-fixed if: steps.commit-and-push.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: hooray - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: confused - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: issue-number: ${{ github.event.issue.number }} body: | diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 8b0f88c3..30e66026 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,12 +11,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - name: Set up Python 3.13 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - name: Set up Python 3.14 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -28,14 +28,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" architecture: "x64" - name: read .nf-core.yml diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index d43797d9..e6e9bc26 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index e7b58449..e20bf6d0 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -18,7 +18,7 @@ concurrency: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NFT_VER: "0.9.2" + NFT_VER: "0.9.3" NFT_WORKDIR: "~" NXF_ANSI_LOG: false NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity @@ -40,7 +40,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: fetch-depth: 0 @@ -78,14 +78,14 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.10.5" + - "25.04.0" - "latest-everything" env: NXF_ANSI_LOG: false TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: fetch-depth: 0 @@ -95,6 +95,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/release-announcements.yml b/.github/workflows/release-announcements.yml index 0f732495..e64cebd6 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -14,6 +14,11 @@ jobs: run: | echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" | sed 's/-//g' >> $GITHUB_OUTPUT + - name: get description + id: get_topics + run: | + echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description' >> $GITHUB_OUTPUT + - uses: rzr/fediverse-action@master with: access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} @@ -23,6 +28,8 @@ jobs: message: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! + ${{ steps.get_topics.outputs.description }} + Please see the changelog: ${{ github.event.release.html_url }} ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index beb5c77f..c5988af9 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: ref: ${{ github.event.pull_request.head.sha }} diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 83599f63..00000000 --- a/.gitpod.yml +++ /dev/null @@ -1,10 +0,0 @@ -image: nfcore/gitpod:latest -tasks: - - name: Update Nextflow and setup pre-commit - command: | - pre-commit install --install-hooks - nextflow self-update - -vscode: - extensions: - - nf-core.nf-core-extensionpack # https://github.com/nf-core/vscode-extensionpack diff --git a/.nf-core.yml b/.nf-core.yml index 3958ca07..61430abb 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.3.2 +nf_core_version: 3.4.1 repository_type: pipeline template: author: Andries J. van Tonder @@ -10,4 +10,4 @@ template: org: nf-core outdir: . skip_features: [] - version: 2.0.0dev + version: 2.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bb41beec..d06777a8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,7 +6,7 @@ repos: additional_dependencies: - prettier@3.6.2 - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace args: [--markdown-linebreak-ext=md] diff --git a/.prettierignore b/.prettierignore index edd29f01..2255e3e3 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,4 +10,5 @@ testing/ testing* *.pyc bin/ +.nf-test/ ro-crate-metadata.json diff --git a/CHANGELOG.md b/CHANGELOG.md index c64143e9..60e4a77e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ 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). -## v2.0.0dev - [date] +## v2.0.0 - [date] Initial release of nf-core/bactmap, created with the [nf-core](https://nf-co.re/) template. diff --git a/README.md b/README.md index 4e4334cc..e434f8f9 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,13 @@ +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/bactmap) [![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![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%A525.04.0-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.4.1-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.4.1) [![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/assets/multiqc_config.yml b/assets/multiqc_config.yml index 89acb7af..938d4f12 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/bactmap + This report has been generated by the nf-core/bactmap analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-bactmap-methods-description": order: -1000 diff --git a/docs/usage.md b/docs/usage.md index 49c4df23..f5638d1e 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -149,7 +149,7 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - `shifter` - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) + - A generic configuration profile to be used with [Charliecloud](https://charliecloud.io/) - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `wave` diff --git a/main.nf b/main.nf index 3a3b39a4..7841445f 100644 --- a/main.nf +++ b/main.nf @@ -74,7 +74,10 @@ workflow { params.monochrome_logs, args, params.outdir, - params.input + params.input, + params.help, + params.help_full, + params.show_hidden ) // diff --git a/modules.json b/modules.json index 0fc67f90..f881cc1c 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 812fc4c5..dd513cbd 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 0ac3c369..5288f5cc 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 88e90571..17881d15 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 bea6c0d3..00000000 --- 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 a6fee8e8..40aebc35 100644 --- a/nextflow.config +++ b/nextflow.config @@ -32,13 +32,15 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false - hook_url = null + hook_url = System.getenv('HOOK_URL') help = false help_full = false show_hidden = false version = false pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' - trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')// Config options + trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + + // Config options config_profile_name = null config_profile_description = null @@ -91,7 +93,18 @@ profiles { apptainer.enabled = false docker.runOptions = '-u $(id -u):$(id -g)' } - arm { + arm64 { + process.arch = 'arm64' + // TODO https://github.com/nf-core/modules/issues/6694 + // For now if you're using arm64 you have to use wave for the sake of the maintainers + // wave profile + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' + } + emulate_amd64 { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { @@ -148,18 +161,6 @@ profiles { wave.freeze = true wave.strategy = 'conda,container' } - gitpod { - executor.name = 'local' - executor.cpus = 4 - executor.memory = 8.GB - process { - resourceLimits = [ - memory: 8.GB, - cpus : 4, - time : 1.h - ] - } - } gpu { docker.runOptions = '-u $(id -u):$(id -g) --gpus all' apptainer.runOptions = '--nv' @@ -169,6 +170,8 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } +// Set AWS client to anonymous when using the default igenomes_base +aws.client.anonymous = !params.igenomes_ignore && params.igenomes_base?.startsWith('s3://ngi-igenomes/igenomes/') ?: false // Load nf-core custom profiles from different institutions // If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. @@ -250,46 +253,19 @@ manifest { description = """A mapping-based pipeline for bacterial whole genome sequences""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.10.5' - version = '2.0.0dev' + nextflowVersion = '!>=25.04.0' + version = '2.0.0' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs - help { - enabled = true - command = "nextflow run nf-core/bactmap -profile --input samplesheet.csv --outdir " - fullParameter = "help_full" - showHiddenParameter = "show_hidden" - beforeText = """ --\033[2m----------------------------------------------------\033[0m- - \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m -\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m -\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m -\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m - \033[0;32m`._,._,\'\033[0m -\033[0;35m nf-core/bactmap ${manifest.version}\033[0m --\033[2m----------------------------------------------------\033[0m- -""" - afterText = """${manifest.doi ? "\n* The pipeline\n" : ""}${manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${manifest.doi ? "\n" : ""} -* The nf-core framework - https://doi.org/10.1038/s41587-020-0439-x - -* Software dependencies - https://github.com/nf-core/bactmap/blob/master/CITATIONS.md -""" - } - summary { - beforeText = validation.help.beforeText - afterText = validation.help.afterText - } } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index dfae7be0..31b7bd84 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -224,6 +224,18 @@ "fa_icon": "far calendar", "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", "hidden": true + }, + "help": { + "type": ["boolean", "string"], + "description": "Display the help message." + }, + "help_full": { + "type": "boolean", + "description": "Display the full detailed help message." + }, + "show_hidden": { + "type": "boolean", + "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } } } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 30dfe891..4f53371a 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,9 +21,9 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "InProgress", - "datePublished": "2025-07-08T11:38:19+00:00", - "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", + "creativeWorkStatus": "Stable", + "datePublished": "2025-10-16T13:38:23+00:00", + "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/bactmap)\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A525.04.0-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.4.1-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.4.1)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#3e097423-0ff9-4730-9d8d-aa366d021c38" + "@id": "#067186aa-61eb-451c-b9ca-c498944b52ab" } ], "name": "nf-core/bactmap" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-07-08T11:38:19Z", + "dateModified": "2025-10-16T13:38:23Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -149,8 +149,8 @@ "sdPublisher": { "@id": "https://nf-co.re/" }, - "url": ["https://github.com/nf-core/bactmap", "https://nf-co.re/bactmap/dev/"], - "version": ["2.0.0dev"] + "url": ["https://github.com/nf-core/bactmap", "https://nf-co.re/bactmap/2.0.0/"], + "version": ["2.0.0"] }, { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", @@ -162,14 +162,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.10.5" + "version": "!>=25.04.0" }, { - "@id": "#3e097423-0ff9-4730-9d8d-aa366d021c38", + "@id": "#067186aa-61eb-451c-b9ca-c498944b52ab", "@type": "TestSuite", "instance": [ { - "@id": "#f7e01228-e890-4c53-ad20-3d01691d92e9" + "@id": "#f7a4fe6e-7599-4e4b-8a35-f7216ace240f" } ], "mainEntity": { @@ -178,7 +178,7 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#f7e01228-e890-4c53-ad20-3d01691d92e9", + "@id": "#f7a4fe6e-7599-4e4b-8a35-f7216ace240f", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", "resource": "repos/nf-core/bactmap/actions/workflows/nf-test.yml", diff --git a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf index 3aeb4206..79e52906 100644 --- a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf @@ -11,6 +11,7 @@ include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' include { paramsSummaryMap } from 'plugin/nf-schema' include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' @@ -32,6 +33,9 @@ workflow PIPELINE_INITIALISATION { 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: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message main: @@ -50,10 +54,35 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // + before_text = """ +-\033[2m----------------------------------------------------\033[0m- + \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m +\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m +\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m +\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m + \033[0;32m`._,._,\'\033[0m +\033[0;35m nf-core/bactmap ${workflow.manifest.version}\033[0m +-\033[2m----------------------------------------------------\033[0m- +""" + after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} +* The nf-core framework + https://doi.org/10.1038/s41587-020-0439-x + +* Software dependencies + https://github.com/nf-core/bactmap/blob/master/CITATIONS.md +""" + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null + null, + help, + help_full, + show_hidden, + before_text, + after_text, + command ) // 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 f8476112..00000000 --- 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/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c9..00000000 --- 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 4994303e..ee4738c8 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 8fb30164..c977917a 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 09ef842a..8d8c7371 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 158c83c5..e128a128 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 b/tests/default.nf.test index 8bb40337..71d7ab93 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assertAll( { assert workflow.success}, { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/nf_core_bactmap_software_mqc_versions.yml"), // All stable path name, with a relative path From d81d61e1584a128bec19f0aa55bb1770e9e111d3 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 20 Nov 2025 09:31:33 +0000 Subject: [PATCH 5/7] Template update for nf-core/tools version 3.5.1 --- .github/workflows/awsfulltest.yml | 2 +- .github/workflows/awstest.yml | 2 +- .github/workflows/download_pipeline.yml | 2 +- .github/workflows/fix_linting.yml | 2 +- .github/workflows/linting.yml | 6 +-- .github/workflows/nf-test.yml | 4 +- .github/workflows/release-announcements.yml | 9 ++--- .../workflows/template-version-comment.yml | 2 +- .nf-core.yml | 2 +- .prettierignore | 2 + README.md | 4 +- modules.json | 4 +- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 24 ++++++------ nextflow.config | 2 - ro-crate-metadata.json | 14 +++---- .../utils_nfcore_bactmap_pipeline/main.nf | 6 +-- .../nf-core/utils_nfcore_pipeline/main.nf | 2 +- workflows/bactmap.nf | 38 ++++++++++++++----- 20 files changed, 74 insertions(+), 59 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 26d02545..a387aa2a 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -40,7 +40,7 @@ jobs: } profiles: test_full - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 96955115..9de794f2 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -25,7 +25,7 @@ jobs: } profiles: test - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 6d94bcbf..45884ff9 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -127,7 +127,7 @@ jobs: fi - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: nextflow_logfile.txt path: .nextflow.log* diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index 85d87311..68a93169 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 30e66026..7a527a34 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,7 +11,7 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Set up Python 3.14 uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 @@ -71,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index e20bf6d0..c98d76ec 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -40,7 +40,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 @@ -85,7 +85,7 @@ jobs: TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index e64cebd6..431d3d44 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -15,10 +15,9 @@ jobs: echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" | sed 's/-//g' >> $GITHUB_OUTPUT - name: get description - id: get_topics + id: get_description run: | - echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description' >> $GITHUB_OUTPUT - + echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description')" >> $GITHUB_OUTPUT - uses: rzr/fediverse-action@master with: access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} @@ -27,9 +26,7 @@ jobs: # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release message: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! - - ${{ steps.get_topics.outputs.description }} - + ${{ steps.get_description.outputs.description }} Please see the changelog: ${{ github.event.release.html_url }} ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index c5988af9..e8560fc7 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: ref: ${{ github.event.pull_request.head.sha }} diff --git a/.nf-core.yml b/.nf-core.yml index 61430abb..5ecc1482 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.4.1 +nf_core_version: 3.5.1 repository_type: pipeline template: author: Andries J. van Tonder diff --git a/.prettierignore b/.prettierignore index 2255e3e3..dd749d43 100644 --- a/.prettierignore +++ b/.prettierignore @@ -12,3 +12,5 @@ testing* bin/ .nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/README.md b/README.md index e434f8f9..f7d2be1f 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,13 @@ -[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/bactmap) +[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/bactmap) [![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![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%A525.04.0-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.4.1-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.4.1) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-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.5.1) [![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/modules.json b/modules.json index f881cc1c..14a7682d 100644 --- a/modules.json +++ b/modules.json @@ -12,7 +12,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "e10b76ca0c66213581bec2833e30d31f239dec0b", + "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", "installed_by": ["modules"] } } @@ -26,7 +26,7 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index dd513cbd..d02016a0 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.31 + - bioconda::multiqc=1.32 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 5288f5cc..c1158fb0 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://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ef/eff0eafe78d5f3b65a6639265a16b89fdca88d06d18894f90fcdb50142004329/data' : - 'community.wave.seqera.io/library/multiqc:1.31--1efbafd542a23882' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : + 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" 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 17881d15..a88bafd6 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,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:57:36.139055243" + "timestamp": "2025-10-27T13:33:24.356715" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:59:15.142230631" + "timestamp": "2025-10-27T13:34:11.103619" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:58:29.629087066" + "timestamp": "2025-10-27T13:34:04.615233" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 40aebc35..846473f7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -170,8 +170,6 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } -// Set AWS client to anonymous when using the default igenomes_base -aws.client.anonymous = !params.igenomes_ignore && params.igenomes_base?.startsWith('s3://ngi-igenomes/igenomes/') ?: false // Load nf-core custom profiles from different institutions // If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 4f53371a..2ee7829f 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2025-10-16T13:38:23+00:00", - "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/bactmap)\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A525.04.0-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.4.1-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.4.1)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", + "datePublished": "2025-11-20T09:31:27+00:00", + "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/bactmap)\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A525.04.0-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.5.1-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.5.1)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#067186aa-61eb-451c-b9ca-c498944b52ab" + "@id": "#795d1994-0898-4e3b-a67c-2b16ead27603" } ], "name": "nf-core/bactmap" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-10-16T13:38:23Z", + "dateModified": "2025-11-20T09:31:27Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -165,11 +165,11 @@ "version": "!>=25.04.0" }, { - "@id": "#067186aa-61eb-451c-b9ca-c498944b52ab", + "@id": "#795d1994-0898-4e3b-a67c-2b16ead27603", "@type": "TestSuite", "instance": [ { - "@id": "#f7a4fe6e-7599-4e4b-8a35-f7216ace240f" + "@id": "#10ba78b5-e554-46c3-8eae-dc4e0f15d0fb" } ], "mainEntity": { @@ -178,7 +178,7 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#f7a4fe6e-7599-4e4b-8a35-f7216ace240f", + "@id": "#10ba78b5-e554-46c3-8eae-dc4e0f15d0fb", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", "resource": "repos/nf-core/bactmap/actions/workflows/nf-test.yml", diff --git a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf index 79e52906..8105008f 100644 --- a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf @@ -39,7 +39,7 @@ workflow PIPELINE_INITIALISATION { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -64,7 +64,7 @@ workflow PIPELINE_INITIALISATION { \033[0;35m nf-core/bactmap ${workflow.manifest.version}\033[0m -\033[2m----------------------------------------------------\033[0m- """ - after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} + after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { doi -> " https://doi.org/${doi.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} * The nf-core framework https://doi.org/10.1038/s41587-020-0439-x @@ -101,7 +101,7 @@ workflow PIPELINE_INITIALISATION { // Create channel from input file provided through params.input // - Channel + channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { meta, fastq_1, fastq_2 -> diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index bfd25876..2f30e9a4 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -98,7 +98,7 @@ def workflowVersionToYAML() { // Get channel of software versions used in pipeline in YAML format // def softwareVersionsToYAML(ch_versions) { - return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML())) + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) } // diff --git a/workflows/bactmap.nf b/workflows/bactmap.nf index 7d759604..c5f325ed 100644 --- a/workflows/bactmap.nf +++ b/workflows/bactmap.nf @@ -22,8 +22,8 @@ workflow BACTMAP { ch_samplesheet // channel: samplesheet read in from --input main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // // MODULE: Run FastQC // @@ -36,7 +36,25 @@ workflow BACTMAP { // // Collate and save software versions // - softwareVersionsToYAML(ch_versions) + def topic_versions = Channel.topic("versions") + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } + + def topic_versions_string = topic_versions.versions_tuple + .map { process, tool, version -> + [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by:0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } + + softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_' + 'bactmap_software_' + 'mqc_' + 'versions.yml', @@ -48,24 +66,24 @@ workflow BACTMAP { // // MODULE: MultiQC // - ch_multiqc_config = Channel.fromPath( + ch_multiqc_config = channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_config, checkIfExists: true) : + channel.empty() ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_logo, checkIfExists: true) : + channel.empty() summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( + ch_methods_description = channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) From 419d6028f9cae9a8effa95332297091308290aef Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 28 Apr 2026 11:20:43 +0000 Subject: [PATCH 6/7] Template update for nf-core/tools version 4.0.0 --- .devcontainer/devcontainer.json | 1 + .github/CONTRIBUTING.md | 125 -- .github/PULL_REQUEST_TEMPLATE.md | 4 +- .github/actions/get-shards/action.yml | 2 +- .github/actions/nf-test/action.yml | 10 +- .github/workflows/awsfulltest.yml | 25 +- .github/workflows/awstest.yml | 4 +- .github/workflows/branch.yml | 2 +- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 14 +- .github/workflows/fix_linting.yml | 22 +- .github/workflows/linting.yml | 34 +- .github/workflows/linting_comment.yml | 4 +- .github/workflows/nf-test.yml | 8 +- .github/workflows/release-announcements.yml | 4 +- .../workflows/template-version-comment.yml | 6 +- .gitignore | 1 + .nf-core.yml | 2 +- .pre-commit-config.yaml | 16 +- .prettierignore | 2 - README.md | 12 +- assets/adaptivecard.json | 67 - assets/slackreport.json | 34 - conf/base.config | 2 +- conf/containers_conda_lock_files_amd64.config | 2 + conf/containers_conda_lock_files_arm64.config | 2 + conf/containers_docker_amd64.config | 2 + conf/containers_docker_arm64.config | 2 + .../containers_singularity_https_amd64.config | 2 + .../containers_singularity_https_arm64.config | 2 + conf/containers_singularity_oras_amd64.config | 2 + conf/containers_singularity_oras_arm64.config | 2 + docs/CONTRIBUTING.md | 185 ++ docs/usage.md | 8 +- main.nf | 7 +- modules.json | 8 +- .../linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt | 822 +++++++++ .../linux_arm64-bd-e455e32f745abe68_1.txt | 769 ++++++++ modules/nf-core/fastqc/main.nf | 43 +- modules/nf-core/fastqc/meta.yml | 51 +- modules/nf-core/fastqc/tests/main.nf.test | 12 +- .../nf-core/fastqc/tests/main.nf.test.snap | 228 ++- .../linux_amd64-bd-c1f4a7982b743963_1.txt | 1552 +++++++++++++++++ .../linux_amd64-bd-db7c73dae76bc9e6_1.txt | 126 ++ .../linux_arm64-bd-40bf3b435e89dc22_1.txt | 1502 ++++++++++++++++ .../linux_arm64-bd-d167b8012595a136_1.txt | 125 ++ modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 51 +- modules/nf-core/multiqc/meta.yml | 165 +- .../multiqc/tests/custom_prefix.config | 5 + modules/nf-core/multiqc/tests/main.nf.test | 191 +- .../nf-core/multiqc/tests/main.nf.test.snap | 435 ++++- modules/nf-core/multiqc/tests/nextflow.config | 1 + nextflow.config | 8 +- nextflow_schema.json | 7 - nf-test.config | 26 +- ro-crate-metadata.json | 29 +- .../utils_nfcore_bactmap_pipeline/main.nf | 17 +- .../nf-core/utils_nfcore_pipeline/main.nf | 66 +- .../utils_nfcore_pipeline/tests/main.nf.test | 29 + .../tests/main.nf.test.snap | 19 + .../nf-core/utils_nfschema_plugin/main.nf | 3 +- .../tests/nextflow.config | 2 +- tests/default.nf.test | 14 +- tests/nextflow.config | 2 +- workflows/bactmap.nf | 84 +- 66 files changed, 6270 insertions(+), 743 deletions(-) delete mode 100644 .github/CONTRIBUTING.md delete mode 100644 assets/adaptivecard.json delete mode 100644 assets/slackreport.json create mode 100644 conf/containers_conda_lock_files_amd64.config create mode 100644 conf/containers_conda_lock_files_arm64.config create mode 100644 conf/containers_docker_amd64.config create mode 100644 conf/containers_docker_arm64.config create mode 100644 conf/containers_singularity_https_amd64.config create mode 100644 conf/containers_singularity_https_arm64.config create mode 100644 conf/containers_singularity_oras_amd64.config create mode 100644 conf/containers_singularity_oras_arm64.config create mode 100644 docs/CONTRIBUTING.md create mode 100644 modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt create mode 100644 modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt create mode 100644 modules/nf-core/multiqc/tests/custom_prefix.config create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 97c8c97f..237c9ed0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,4 +1,5 @@ { + "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json", "name": "nfcore", "image": "nfcore/devcontainer:latest", diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index 9ae86e78..00000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,125 +0,0 @@ -# `nf-core/bactmap`: Contributing Guidelines - -Hi there! -Many thanks for taking an interest in improving nf-core/bactmap. - -We try to manage the required tasks for nf-core/bactmap using GitHub issues, you probably came to this page when creating one. -Please use the pre-filled template to save time. - -However, don't be put off by this template - other more general issues and suggestions are welcome! -Contributions to the code are even more welcome ;) - -> [!NOTE] -> If you need help using or modifying nf-core/bactmap then the best place to ask is on the nf-core Slack [#bactmap](https://nfcore.slack.com/channels/bactmap) channel ([join our Slack here](https://nf-co.re/join/slack)). - -## Contribution workflow - -If you'd like to write some code for nf-core/bactmap, the standard workflow is as follows: - -1. Check that there isn't already an issue about your idea in the [nf-core/bactmap issues](https://github.com/nf-core/bactmap/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this -2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/bactmap repository](https://github.com/nf-core/bactmap) to your GitHub account -3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core pipelines schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). -5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged - -If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). - -## Tests - -You have the option to test your changes locally by running the pipeline. For receiving warnings about process selectors and other `debug` information, it is recommended to use the debug profile. Execute all the tests with the following command: - -```bash -nf-test test --profile debug,test,docker --verbose -``` - -When you create a pull request with changes, [GitHub Actions](https://github.com/features/actions) will run automatic tests. -Typically, pull-requests are only fully reviewed when these tests are passing, though of course we can help out before then. - -There are typically two types of tests that run: - -### Lint tests - -`nf-core` has a [set of guidelines](https://nf-co.re/developers/guidelines) which all pipelines must adhere to. -To enforce these and ensure that all pipelines stay in sync, we have developed a helper tool which runs checks on the pipeline code. This is in the [nf-core/tools repository](https://github.com/nf-core/tools) and once installed can be run locally with the `nf-core pipelines lint ` command. - -If any failures or warnings are encountered, please follow the listed URL for more documentation. - -### Pipeline tests - -Each `nf-core` pipeline should be set up with a minimal set of test-data. -`GitHub Actions` then runs the pipeline on this data to ensure that it exits successfully. -If there are any failures then the automated tests fail. -These tests are run both with the latest available version of `Nextflow` and also the minimum required version that is stated in the pipeline code. - -## Patch - -:warning: Only in the unlikely and regretful event of a release happening with a bug. - -- On your own fork, make a new branch `patch` based on `upstream/main` or `upstream/master`. -- Fix the bug, and bump version (X.Y.Z+1). -- Open a pull-request from `patch` to `main`/`master` with the changes. - -## Getting help - -For further information/help, please consult the [nf-core/bactmap documentation](https://nf-co.re/bactmap/usage) and don't hesitate to get in touch on the nf-core Slack [#bactmap](https://nfcore.slack.com/channels/bactmap) channel ([join our Slack here](https://nf-co.re/join/slack)). - -## Pipeline contribution conventions - -To make the `nf-core/bactmap` code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. - -### Adding a new step - -If you wish to contribute a new step, please use the following coding standards: - -1. Define the corresponding input channel into your new process from the expected previous process channel. -2. Write the process block (see below). -3. Define the output channel if needed (see below). -4. Add any new parameters to `nextflow.config` with a default (see below). -5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). -6. Add sanity checks and validation for all relevant parameters. -7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test in the `tests` directory. -9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. -10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. - -### Default values - -Parameters should be initialised / defined with default values within the `params` scope in `nextflow.config`. - -Once there, use `nf-core pipelines schema build` to add to `nextflow_schema.json`. - -### Default processes resource requirements - -Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/main/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. - -The process resources can be passed on to the tool dynamically within the process with the `${task.cpus}` and `${task.memory}` variables in the `script:` block. - -### Naming schemes - -Please use the following naming schemes, to make it easy to understand what is going where. - -- initial process channel: `ch_output_from_` -- intermediate and terminal channels: `ch__for_` - -### Nextflow version bumping - -If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core pipelines bump-version --nextflow . [min-nf-version]` - -### Images and figures - -For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). - -## GitHub Codespaces - -This repo includes a devcontainer configuration which will create a GitHub Codespaces for Nextflow development! This is an online developer environment that runs in your browser, complete with VSCode and a terminal. - -To get started: - -- Open the repo in [Codespaces](https://github.com/nf-core/bactmap/codespaces) -- Tools installed - - nf-core - - Nextflow - -Devcontainer specs: - -- [DevContainer config](.devcontainer/devcontainer.json) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 5d8468d0..0fb69200 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,14 +8,14 @@ These are the most common things requested on pull requests (PRs). Remember that PRs should be made against the dev branch, unless you're preparing a pipeline release. -Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/bactmap/tree/master/.github/CONTRIBUTING.md) +Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/bactmap/tree/master/docs/CONTRIBUTING.md) --> ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/bactmap/tree/master/.github/CONTRIBUTING.md) +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/bactmap/tree/master/docs/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/bactmap _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml index 34085279..e2833ee9 100644 --- a/.github/actions/get-shards/action.yml +++ b/.github/actions/get-shards/action.yml @@ -21,7 +21,7 @@ runs: using: "composite" steps: - name: Install nf-test - uses: nf-core/setup-nf-test@v1 + uses: nf-core/setup-nf-test@4069fbbaabe94c08faba4ad261bfa88225ba133f # v2 with: version: ${{ env.NFT_VER }} - name: Get number of shards diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index 3b9724c7..ad686e8e 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -20,24 +20,24 @@ runs: using: "composite" steps: - name: Setup Nextflow - uses: nf-core/setup-nextflow@v2 + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 with: version: "${{ env.NXF_VERSION }}" - name: Set up Python - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: "3.14" - name: Install nf-test - uses: nf-core/setup-nf-test@v1 + uses: nf-core/setup-nf-test@4069fbbaabe94c08faba4ad261bfa88225ba133f # v2 with: version: "${{ env.NFT_VER }}" install-pdiff: true - name: Setup apptainer if: contains(inputs.profile, 'singularity') - uses: eWaterCycle/setup-apptainer@main + uses: eWaterCycle/setup-apptainer@3f706d898c9db585b1d741b4692e66755f3a1b40 # v2 - name: Set up Singularity if: contains(inputs.profile, 'singularity') @@ -48,7 +48,7 @@ runs: - name: Conda setup if: contains(inputs.profile, 'conda') - uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 + uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4 with: auto-update-conda: true conda-solver: libmamba diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index a387aa2a..8e2afb1b 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -23,7 +23,7 @@ jobs: echo "revision=${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'release') && github.sha || 'dev' }}" >> "$GITHUB_OUTPUT" - name: Launch workflow via Seqera Platform - uses: seqeralabs/action-tower-launch@v2 + uses: seqeralabs/action-tower-launch@51565b514bff1827cf34620de25d0055759f1fc9 # v2 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters @@ -33,14 +33,33 @@ jobs: compute_env: ${{ vars.TOWER_COMPUTE_ENV }} revision: ${{ steps.revision.outputs.revision }} workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/bactmap/work-${{ steps.revision.outputs.revision }} + nextflow_config: | + plugins { + id 'nf-slack@0.5.0' + } + slack { + enabled = true + bot { + token = '${{ secrets.NFSLACK_BOT_TOKEN }}' + channel = 'bactmap' + } + onStart { + enabled = false + } + onComplete { + message = ':white_check_mark: *bactmap/test_full* completed successfully! :tada:' + } + onError { + message = ':x: *bactmap/test_full* failed :crying_cat_face:' + } + } parameters: | { - "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/bactmap/results-${{ steps.revision.outputs.revision }}" } profiles: test_full - - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 9de794f2..eddb8328 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -12,7 +12,7 @@ jobs: steps: # Launch workflow using Seqera Platform CLI tool action - name: Launch workflow via Seqera Platform - uses: seqeralabs/action-tower-launch@v2 + uses: seqeralabs/action-tower-launch@51565b514bff1827cf34620de25d0055759f1fc9 # v2 with: workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} @@ -25,7 +25,7 @@ jobs: } profiles: test - - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index c9a8b792..539ac1cf 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -21,7 +21,7 @@ jobs: # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets - name: Post PR comment if: failure() - uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2 + uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3 with: message: | ## This PR is against the `${{github.event.pull_request.base.ref}}` branch :x: diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 6adb0fff..172de6f3 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 45884ff9..5b6592c1 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -39,12 +39,12 @@ jobs: needs: configure steps: - name: Install Nextflow - uses: nf-core/setup-nextflow@v2 + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: "3.14" architecture: "x64" @@ -54,10 +54,16 @@ jobs: with: apptainer-version: 1.3.4 + - name: Read .nf-core.yml + uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 + id: read_yml + with: + config: ${{ github.workspace }}/.nf-core.yml + - name: Install dependencies run: | python -m pip install --upgrade pip - pip install git+https://github.com/nf-core/tools.git + pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} - name: Make a cache directory for the container images run: | @@ -127,7 +133,7 @@ jobs: fi - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: nextflow_logfile.txt path: .nextflow.log* diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index 68a93169..25413548 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: token: ${{ secrets.nf_core_bot_auth_token }} @@ -31,22 +31,18 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - # Install and run pre-commit - - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 - with: - python-version: "3.14" - - - name: Install pre-commit - run: pip install pre-commit + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - - name: Run pre-commit - id: pre-commit - run: pre-commit run --all-files + # Install and run prek + - name: Run prek + id: prek + uses: j178/prek-action@cbc2f23eb5539cf20d82d1aabd0d0ecbcc56f4e3 # v2 continue-on-error: true # indication that the linting has finished - name: react if linting finished succesfully - if: steps.pre-commit.outcome == 'success' + if: steps.prek.outcome == 'success' uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} @@ -54,7 +50,7 @@ jobs: - name: Commit & push changes id: commit-and-push - if: steps.pre-commit.outcome == 'failure' + if: steps.prek.outcome == 'failure' run: | git config user.email "core@nf-co.re" git config user.name "nf-core-bot" diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 7a527a34..bfe46c98 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,33 +11,31 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - - name: Set up Python 3.14 - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 - with: - python-version: "3.14" - - - name: Install pre-commit - run: pip install pre-commit + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - - name: Run pre-commit - run: pre-commit run --all-files + - name: Run prek + uses: j178/prek-action@cbc2f23eb5539cf20d82d1aabd0d0ecbcc56f4e3 # v2 nf-core: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Install Nextflow - uses: nf-core/setup-nextflow@v2 + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: "3.14" architecture: "x64" + - name: Setup uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: read .nf-core.yml uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 id: read_yml @@ -45,12 +43,10 @@ jobs: config: ${{ github.workspace }}/.nf-core.yml - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + run: uv tool install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} - name: Run nf-core pipelines lint - if: ${{ github.base_ref != 'master' }} + 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 +54,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 == 'master' }} + if: ${{ github.base_ref == 'master' || github.base_ref == 'main' }} env: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -71,7 +67,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index e6e9bc26..2bc3c07f 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 + uses: dawidd6/action-download-artifact@8305c0f1062bb0d184d09ef4493ecb9288447732 # v20 with: workflow: linting.yml workflow_conclusion: completed @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 + uses: marocchino/sticky-pull-request-comment@70d2764d1a7d5d9560b100cbea0077fc8f633987 # v3 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index c98d76ec..efd72d65 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -18,7 +18,7 @@ concurrency: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NFT_VER: "0.9.3" + NFT_VER: "0.9.4" NFT_WORKDIR: "~" NXF_ANSI_LOG: false NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity @@ -40,7 +40,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 @@ -78,14 +78,14 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "25.04.0" + - "25.10.4" - "latest-everything" env: NXF_ANSI_LOG: false TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 431d3d44..78d5dbe0 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -18,7 +18,7 @@ jobs: id: get_description run: | echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description')" >> $GITHUB_OUTPUT - - uses: rzr/fediverse-action@master + - uses: rzr/fediverse-action@563159eb8d45f70ab6aaba36ed55cd037e51f441 # master with: access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} host: "mstdn.science" # custom host if not "mastodon.social" (default) @@ -34,7 +34,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@6461056ea355ea43b977e149f7bf76aaa572e5e8 # v0.3.0 + - uses: zentered/bluesky-post-action@5a91cc2ad10a304a4e96c16182dbe4918710bcf6 # v0.4.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index e8560fc7..ea30827e 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: ref: ${{ github.event.pull_request.head.sha }} @@ -29,7 +29,7 @@ jobs: 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 + uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3 if: | contains(env.OUTPUT, 'nf-core') with: @@ -42,5 +42,5 @@ jobs: > 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). + > For more documentation on how to update your pipeline, please see the [Synchronisation documentation](https://nf-co.re/docs/developing/template-syncs/overview). # diff --git a/.gitignore b/.gitignore index a42ce016..cc2b1a77 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ testing/ testing* *.pyc null/ +.lineage/ diff --git a/.nf-core.yml b/.nf-core.yml index 5ecc1482..b9cd1c4c 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.5.1 +nf_core_version: 4.0.0 repository_type: pipeline template: author: Andries J. van Tonder diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d06777a8..f51e1a28 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.6.2 + - prettier@3.8.3 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: @@ -13,15 +13,21 @@ repos: exclude: | (?x)^( .*ro-crate-metadata.json$| - modules/nf-core/.*| - subworkflows/nf-core/.*| + modules/(?!local/).*| + subworkflows/(?!local/).*| .*\.snap$ )$ - id: end-of-file-fixer exclude: | (?x)^( .*ro-crate-metadata.json$| - modules/nf-core/.*| - subworkflows/nf-core/.*| + modules/(?!local/).*| + subworkflows/(?!local/).*| .*\.snap$ )$ + - repo: https://github.com/seqeralabs/nf-lint-pre-commit + rev: v0.3.0 + hooks: + - id: nextflow-lint + files: '\.nf$|nextflow\.config$' + args: ["-output", "json"] diff --git a/.prettierignore b/.prettierignore index dd749d43..63cde500 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1,4 @@ email_template.html -adaptivecard.json -slackreport.json .nextflow* work/ data/ diff --git a/README.md b/README.md index f7d2be1f..d92379d5 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ [![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![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%A525.04.0-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.5.1-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.5.1) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.4-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-4.0.0-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.0) [![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/) @@ -30,13 +30,13 @@ --> + workflows use the "tube map" design for that. See https://nf-co.re/docs/community/brand/workflow-schematics#examples for examples. --> 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Usage > [!NOTE] -> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data. +> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data. diff --git a/docs/usage.md b/docs/usage.md index f5638d1e..8170aac3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -76,7 +76,7 @@ If you wish to repeatedly use the same parameters for multiple runs, rather than Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. > [!WARNING] -> Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). +> Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/running/run-pipelines#configuring-pipelines), other infrastructural tweaks (such as output directories), or module arguments (args). The above pipeline run specified with a params file in yaml format: @@ -173,19 +173,19 @@ Specify the path to a specific config file (this is a core Nextflow command). Se Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the pipeline steps, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher resources request (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. -To change the resource requests, please see the [max resources](https://nf-co.re/docs/usage/configuration#max-resources) and [tuning workflow resources](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources) section of the nf-core website. +To change the resource requests, please see the [max resources](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#set-max-resources) and [customise process resources](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#customize-process-resources) section of the nf-core website. ### Custom Containers In some cases, you may wish to change the container or conda environment used by a pipeline steps for a particular tool. By default, nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However, in some cases the pipeline specified version maybe out of date. -To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/usage/configuration#updating-tool-versions) section of the nf-core website. +To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#update-tool-versions) section of the nf-core website. ### Custom Tool Arguments A pipeline might not always support every possible argument or option of a particular tool used in pipeline. Fortunately, nf-core pipelines provide some freedom to users to insert additional parameters that the pipeline does not include by default. -To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/usage/configuration#customising-tool-arguments) section of the nf-core website. +To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#modifying-tool-arguments) section of the nf-core website. ### nf-core/configs diff --git a/main.nf b/main.nf index 7841445f..80d78713 100644 --- a/main.nf +++ b/main.nf @@ -51,7 +51,11 @@ workflow NFCORE_BACTMAP { // WORKFLOW: Run pipeline // BACTMAP ( - samplesheet + samplesheet, + params.multiqc_config, + params.multiqc_logo, + params.multiqc_methods_description, + params.outdir, ) emit: multiqc_report = BACTMAP.out.multiqc_report // channel: /path/to/multiqc_report.html @@ -95,7 +99,6 @@ workflow { params.plaintext_email, params.outdir, params.monochrome_logs, - params.hook_url, NFCORE_BACTMAP.out.multiqc_report ) } diff --git a/modules.json b/modules.json index 14a7682d..78029c1f 100644 --- a/modules.json +++ b/modules.json @@ -7,12 +7,12 @@ "nf-core": { "fastqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", + "git_sha": "008f9d3e61209bf995edac3ba531f54e269e1215", "installed_by": ["modules"] } } @@ -26,12 +26,12 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", + "git_sha": "a3fb7351b1fdb2b1de282b765816bbea190e86a8", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", + "git_sha": "fdc08b8b1ae74f56686ce21f7ea11ad11990ce57", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt new file mode 100644 index 00000000..7770ccd5 --- /dev/null +++ b/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt @@ -0,0 +1,822 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-64: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 +md5: a9f577daf3de00bca7c3c76c0ecbd1de +depends: +- __glibc >=2.17,<3.0.a0 +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28948 +timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda +sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 +md5: dcdc58c15961dbf17a0621312b01f5cb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: LGPL-2.1-or-later +license_family: GPL +size: 584660 +timestamp: 1768327524772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 +md5: d2ffd7602c02f2b316fd921d39876885 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 260182 +timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda +sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a +md5: bb6c4808bfa69d6f7f6b07e5846ced37 +depends: +- __glibc >=2.17,<3.0.a0 +- fontconfig >=2.15.0,<3.0a0 +- fonts-conda-ecosystem +- icu >=78.1,<79.0a0 +- libexpat >=2.7.3,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libglib >=2.86.3,<3.0a0 +- libpng >=1.6.53,<1.7.0a0 +- libstdcxx >=14 +- libxcb >=1.17.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pixman >=0.46.4,<1.0a0 +- xorg-libice >=1.1.2,<2.0a0 +- xorg-libsm >=1.2.6,<2.0a0 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: LGPL-2.1-only or MPL-1.1 +size: 989514 +timestamp: 1766415934926 +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c +md5: c9f6a4b12229f7331f79c9a00dd6e240 +depends: +- font-ttf-dejavu-sans-mono +- fontconfig +- openjdk >=8.0.144 +- perl +license: GPL >=3 +size: 11664291 +timestamp: 1677946722445 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c +md5: 867127763fbe935bab59815b6e0b7b5c +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 270705 +timestamp: 1771382710863 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 +md5: fee5683a3f04bd15cbd8318b096a27ab +depends: +- fonts-conda-forge +license: BSD-3-Clause +license_family: BSD +size: 3667 +timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda +sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff +md5: 3bf7b9fd5a7136126e0234db4b87c8b6 +depends: +- libgcc-ng >=12 +license: MIT +license_family: MIT +size: 77248 +timestamp: 1712692454246 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda +sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c +md5: 2cd94587f3a401ae05e03a6caf09539d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: LGPL-2.0-or-later +license_family: LGPL +size: 99596 +timestamp: 1755102025473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda +sha256: 477f2c553f72165020d3c56740ba354be916c2f0b76fd9f535e83d698277d5ec +md5: 14470902326beee192e33719a2e8bb7f +depends: +- __glibc >=2.17,<3.0.a0 +- cairo >=1.18.4,<2.0a0 +- graphite2 >=1.3.14,<2.0a0 +- icu >=78.3,<79.0a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.2 +- libfreetype6 >=2.14.2 +- libgcc >=14 +- libglib >=2.86.4,<3.0a0 +- libstdcxx >=14 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 2384060 +timestamp: 1774276284520 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a +md5: c80d8a3b84358cb967fa81e7075fbc8a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12723451 +timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda +sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 +md5: b38117a3c920364aff79f870c984b4a3 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: LGPL-2.1-or-later +size: 134088 +timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda +sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 +md5: fb53fb07ce46a575c5d004bbc96032c2 +depends: +- __glibc >=2.17,<3.0.a0 +- keyutils >=1.6.3,<2.0a0 +- libedit >=3.1.20250104,<3.2.0a0 +- libedit >=3.1.20250104,<4.0a0 +- libgcc >=14 +- libstdcxx >=14 +- openssl >=3.5.5,<4.0a0 +license: MIT +license_family: MIT +size: 1386730 +timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a +md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 249959 +timestamp: 1768184673131 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 +md5: a752488c68f2e7c456bcbd8f16eec275 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 261513 +timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda +sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c +md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 +depends: +- __glibc >=2.17,<3.0.a0 +- krb5 >=1.22.2,<1.23.0a0 +- libgcc >=14 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +license: Apache-2.0 +license_family: Apache +size: 4518030 +timestamp: 1770902209173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 +md5: 6c77a605a7a689d17d4819c0f8ac9a00 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 73490 +timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda +sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 +md5: c277e0a4d549b03ac1e9d6cbbe3d017b +depends: +- ncurses +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- ncurses >=6.5,<7.0a0 +license: BSD-2-Clause +license_family: BSD +size: 134676 +timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 +md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76798 +timestamp: 1771259418166 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 +md5: a360c33a5abe61c07959e449fa1453eb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 58592 +timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 +md5: e289f3d17880e44b633ba911d57a321b +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8049 +timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d +md5: fb16b4b69e3f1dcfe79d80db8fd0c55d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 384575 +timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 +md5: 0aa00f03f9e39fb9876085dee11a85d4 +depends: +- __glibc >=2.17,<3.0.a0 +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1041788 +timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 +md5: d5e96b1ed75ca01906b3d2469b4ce493 +depends: +- libgcc 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27526 +timestamp: 1771378224552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda +sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce +md5: bb26456332b07f68bf3b7622ed71c0da +depends: +- __glibc >=2.17,<3.0.a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- libiconv >=1.18,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pcre2 >=10.47,<10.48.0a0 +constrains: +- glib 2.86.4 *_1 +license: LGPL-2.1-or-later +size: 4398701 +timestamp: 1771863239578 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 +md5: 239c5e9546c38a1e884d69effcf4c882 +depends: +- __glibc >=2.17,<3.0.a0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 603262 +timestamp: 1771378117851 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda +sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f +md5: 915f5995e94f60e9a4826e0b0920ee88 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: LGPL-2.1-only +size: 790176 +timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 +md5: 8397539e3a0bbd1695584fb4f927485a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 633710 +timestamp: 1762094827865 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb +md5: c7c83eecbb72d88b940c249af56c8b17 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 113207 +timestamp: 1768752626120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c +md5: 5f13ffc7d30ffec87864e678df9957b4 +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 317669 +timestamp: 1770691470744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e +md5: 1b08cd684f34175e4514474793d44bcb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc 15.2.0 he0feb66_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5852330 +timestamp: 1771378262446 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 +md5: cd5a90476766d53e901500df9215e927 +depends: +- __glibc >=2.17,<3.0.a0 +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 435273 +timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee +md5: db409b7c1720428638e7c0d509d3e1b5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 40311 +timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b +md5: aea31d2e5b1091feca96fcfe945c3cf9 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 429011 +timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa +md5: 92ed62436b625154323d40d5f2f11dd7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 395888 +timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda +sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c +md5: 5aa797f8787fe7a17d1b0821485b5adc +depends: +- libgcc-ng >=12 +license: LGPL-2.1-or-later +size: 100393 +timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 +md5: d87ff7921124eccd67248aa483c23fec +depends: +- __glibc >=2.17,<3.0.a0 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 63629 +timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 +md5: 47e340acb35de30501a76c7c799c41d7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 891641 +timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda +sha256: 3825a4c84676a8a5cc23b397a2911e4efa4a805daf2af764153bd904e142ec41 +md5: a41092b0177362dbe5eb2a18501e86c0 +depends: +- xorg-libx11 +- xorg-libxext +- xorg-libxi +- xorg-libxrender +- xorg-libxtst +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- xorg-libxrender >=0.9.12,<0.10.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- giflib >=5.2.2,<5.3.0a0 +- xorg-libxrandr >=1.5.5,<2.0a0 +- harfbuzz >=12.3.2 +- fontconfig >=2.17.1,<3.0a0 +- fonts-conda-ecosystem +- xorg-libxtst >=1.2.5,<2.0a0 +- xorg-libxi >=1.8.2,<2.0a0 +- lcms2 >=2.18,<3.0a0 +- alsa-lib >=1.2.15.3,<1.3.0a0 +- libpng >=1.6.55,<1.7.0a0 +- xorg-libxt >=1.3.1,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- xorg-libxext >=1.3.7,<2.0a0 +- xorg-libx11 >=1.8.13,<2.0a0 +- libcups >=2.3.3,<2.4.0a0 +license: GPL-2.0-or-later WITH Classpath-exception-2.0 +license_family: GPL +size: 122465031 +timestamp: 1771443671180 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c +md5: f61eb8cd60ff9057122a3d338b99c00f +depends: +- __glibc >=2.17,<3.0.a0 +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3164551 +timestamp: 1769555830639 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda +sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff +md5: 7a3bff861a6583f1889021facefc08b1 +depends: +- __glibc >=2.17,<3.0.a0 +- bzip2 >=1.0.8,<2.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 1222481 +timestamp: 1763655398280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda +build_number: 7 +sha256: 9ec32b6936b0e37bcb0ed34f22ec3116e75b3c0964f9f50ecea5f58734ed6ce9 +md5: f2cfec9406850991f4e3d960cc9e3321 +depends: +- libgcc-ng >=12 +- libxcrypt >=4.4.36 +license: GPL-1.0-or-later OR Artistic-1.0-Perl +size: 13344463 +timestamp: 1703310653947 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda +sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a +md5: c01af13bdc553d1a8fbfff6e8db075f0 +depends: +- libgcc >=14 +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +license: MIT +license_family: MIT +size: 450960 +timestamp: 1754665235234 +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d +md5: f2c23a77b25efcad57d377b34bd84941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 593603 +timestamp: 1769710381284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 +md5: b3c17d95b5a10c6e64a21fa17573e70e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 8252 +timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda +sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b +md5: fb901ff28063514abb6046c9ec2c4a45 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 58628 +timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda +sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 +md5: 1c74ff8c35dcadf952a16f752ca5aa49 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- libuuid >=2.38.1,<3.0a0 +- xorg-libice >=1.1.2,<2.0a0 +license: MIT +license_family: MIT +size: 27590 +timestamp: 1741896361728 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda +sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 +md5: 861fb6ccbc677bb9a9fb2468430b9c6a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libxcb >=1.17.0,<2.0a0 +license: MIT +license_family: MIT +size: 839652 +timestamp: 1770819209719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b +md5: b2895afaf55bf96a8c8282a2e47a5de0 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 15321 +timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 +md5: 1dafce8548e38671bea82e3f5c6ce22f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 20591 +timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda +sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f +md5: 34e54f03dfea3e7a2dcf1453a85f1085 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 50326 +timestamp: 1769445253162 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda +sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 +md5: ba231da7fccf9ea1e768caf5c7099b84 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 20071 +timestamp: 1759282564045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda +sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a +md5: 17dcc85db3c7886650b8908b183d6876 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxfixes >=6.0.1,<7.0a0 +license: MIT +license_family: MIT +size: 47179 +timestamp: 1727799254088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda +sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 +md5: e192019153591938acf7322b6459d36e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: MIT +license_family: MIT +size: 30456 +timestamp: 1769445263457 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda +sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 +md5: 96d57aba173e878a2089d5638016dc5e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 33005 +timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda +sha256: a8afba4a55b7b530eb5c8ad89737d60d60bc151a03fbef7a2182461256953f0e +md5: 279b0de5f6ba95457190a1c459a64e31 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libice >=1.1.1,<2.0a0 +- xorg-libsm >=1.2.4,<2.0a0 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 379686 +timestamp: 1731860547604 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda +sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a +md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxi >=1.7.10,<2.0a0 +license: MIT +license_family: MIT +size: 32808 +timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 +md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 +depends: +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 601375 +timestamp: 1764777111296 diff --git a/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt new file mode 100644 index 00000000..cdc434ca --- /dev/null +++ b/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt @@ -0,0 +1,769 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-aarch64: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 +md5: 468fd3bb9e1f671d36c2cbc677e56f1d +depends: +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28926 +timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda +sha256: ea2233e2db9908c2e5f29d3ca420a546b4583253f4f70abb5494cdd676866d42 +md5: 4a98cbc4ade694520227402ff8880630 +depends: +- libgcc >=14 +license: LGPL-2.1-or-later +license_family: GPL +size: 615729 +timestamp: 1768327548407 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c +md5: 840d8fc0d7b3209be93080bc20e07f2d +depends: +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 192412 +timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda +sha256: 675db823f3d6fb6bf747fab3b0170ba99b269a07cf6df1e49fff2f9972be9cd1 +md5: 043c13ed3a18396994be9b4fab6572ad +depends: +- fontconfig >=2.15.0,<3.0a0 +- fonts-conda-ecosystem +- icu >=78.1,<79.0a0 +- libexpat >=2.7.3,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libglib >=2.86.3,<3.0a0 +- libpng >=1.6.53,<1.7.0a0 +- libstdcxx >=14 +- libxcb >=1.17.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pixman >=0.46.4,<1.0a0 +- xorg-libice >=1.1.2,<2.0a0 +- xorg-libsm >=1.2.6,<2.0a0 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: LGPL-2.1-only or MPL-1.1 +size: 927045 +timestamp: 1766416003626 +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c +md5: c9f6a4b12229f7331f79c9a00dd6e240 +depends: +- font-ttf-dejavu-sans-mono +- fontconfig +- openjdk >=8.0.144 +- perl +license: GPL >=3 +size: 11664291 +timestamp: 1677946722445 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c +md5: 0fed1ff55f4938a65907f3ecf62609db +depends: +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 279044 +timestamp: 1771382728182 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 +md5: fee5683a3f04bd15cbd8318b096a27ab +depends: +- fonts-conda-forge +license: BSD-3-Clause +license_family: BSD +size: 3667 +timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda +sha256: a79dc3bd54c4fb1f249942ee2d5b601a76ecf9614774a4cff9af49adfa458db2 +md5: 2f809afaf0ba1ea4135dce158169efac +depends: +- libgcc-ng >=12 +license: MIT +license_family: MIT +size: 82124 +timestamp: 1712692444545 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda +sha256: c9b1781fe329e0b77c5addd741e58600f50bef39321cae75eba72f2f381374b7 +md5: 4aa540e9541cc9d6581ab23ff2043f13 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: LGPL-2.0-or-later +license_family: LGPL +size: 102400 +timestamp: 1755102000043 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda +sha256: e22f485fddaaea3ff4b6cae98e0197b9dccd2ed2770337ad6ff38a92afe04e59 +md5: 05d65a2cf410adc331c9ea61f59f1013 +depends: +- cairo >=1.18.4,<2.0a0 +- graphite2 >=1.3.14,<2.0a0 +- icu >=78.3,<79.0a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.2 +- libfreetype6 >=2.14.2 +- libgcc >=14 +- libglib >=2.86.4,<3.0a0 +- libstdcxx >=14 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 2345732 +timestamp: 1774281448329 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 +md5: 546da38c2fa9efacf203e2ad3f987c59 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12837286 +timestamp: 1773822650615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda +sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 +md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 +depends: +- libgcc >=13 +license: LGPL-2.1-or-later +size: 129048 +timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda +sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba +md5: d9ca108bd680ea86a963104b6b3e95ca +depends: +- keyutils >=1.6.3,<2.0a0 +- libedit >=3.1.20250104,<3.2.0a0 +- libedit >=3.1.20250104,<4.0a0 +- libgcc >=14 +- libstdcxx >=14 +- openssl >=3.5.5,<4.0a0 +license: MIT +license_family: MIT +size: 1517436 +timestamp: 1769773395215 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +sha256: 379ef5e91a587137391a6149755d0e929f1a007d2dcb211318ac670a46c8596f +md5: bb960f01525b5e001608afef9d47b79c +depends: +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 293039 +timestamp: 1768184778398 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 +md5: d13423b06447113a90b5b1366d4da171 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 240444 +timestamp: 1773114901155 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda +sha256: 41b04f995c9f63af8c4065a35931e46cbc2fdd6b9bf7e4c19f90d53cbb2bc8e5 +md5: 67828c963b17db7dc989fe5d509ef04a +depends: +- krb5 >=1.22.2,<1.23.0a0 +- libgcc >=14 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +license: Apache-2.0 +license_family: Apache +size: 4553739 +timestamp: 1770903929794 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 +md5: a9138815598fe6b91a1d6782ca657b0c +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 71117 +timestamp: 1761979776756 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda +sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 +md5: fb640d776fc92b682a14e001980825b1 +depends: +- ncurses +- libgcc >=13 +- ncurses >=6.5,<7.0a0 +license: BSD-2-Clause +license_family: BSD +size: 148125 +timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 +md5: 57f3b3da02a50a1be2a6fe847515417d +depends: +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76564 +timestamp: 1771259530958 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 +md5: 2f364feefb6a7c00423e80dcb12db62a +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 55952 +timestamp: 1769456078358 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a +md5: a229e22d4d8814a07702b0919d8e6701 +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8125 +timestamp: 1774301094057 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c +md5: b99ed99e42dafb27889483b3098cace7 +depends: +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 422941 +timestamp: 1774301093473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 +md5: 552567ea2b61e3a3035759b2fdb3f9a6 +depends: +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 622900 +timestamp: 1771378128706 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f +md5: 4feebd0fbf61075a1a9c2e9b3936c257 +depends: +- libgcc 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27568 +timestamp: 1771378136019 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda +sha256: afc503dbd04a5bf2709aa9d8318a03a8c4edb389f661ff280c3494bfef4341ec +md5: 4ac4372fc4d7f20630a91314cdac8afd +depends: +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- libiconv >=1.18,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pcre2 >=10.47,<10.48.0a0 +constrains: +- glib 2.86.4 *_1 +license: LGPL-2.1-or-later +size: 4512186 +timestamp: 1771863220969 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 +md5: 4faa39bf919939602e594253bd673958 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 588060 +timestamp: 1771378040807 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda +sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 +md5: 5a86bf847b9b926f3a4f203339748d78 +depends: +- libgcc >=14 +license: LGPL-2.1-only +size: 791226 +timestamp: 1754910975665 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 +md5: 5109d7f837a3dfdf5c60f60e311b041f +depends: +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 691818 +timestamp: 1762094728337 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +sha256: 843c46e20519651a3e357a8928352b16c5b94f4cd3d5481acc48be2e93e8f6a3 +md5: 96944e3c92386a12755b94619bae0b35 +depends: +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 125916 +timestamp: 1768754941722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 +md5: be4088903b94ea297975689b3c3aeb27 +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 340156 +timestamp: 1770691477245 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 +md5: f56573d05e3b735cb03efeb64a15f388 +depends: +- libgcc 15.2.0 h8acb6b2_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5541411 +timestamp: 1771378162499 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 +md5: 8c6fd84f9c87ac00636007c6131e457d +depends: +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 488407 +timestamp: 1762022048105 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 +md5: cf2861212053d05f27ec49c3784ff8bb +depends: +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 43453 +timestamp: 1766271546875 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 +md5: 24e92d0942c799db387f5c9d7b81f1af +depends: +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 359496 +timestamp: 1752160685488 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b +md5: cd14ee5cca2464a425b1dbfc24d90db2 +depends: +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 397493 +timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda +sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f +md5: b4df5d7d4b63579d081fd3a4cf99740e +depends: +- libgcc-ng >=12 +license: LGPL-2.1-or-later +size: 114269 +timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f +md5: 502006882cf5461adced436e410046d1 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 69833 +timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 +md5: 182afabe009dc78d8b73100255ee6868 +depends: +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 926034 +timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda +sha256: 6fd2c872b275fa5d42a61a4b6dc28a819cde29f9048adb547363597432e0720e +md5: 27fdd5d67e235c20d23b2d66406497d3 +depends: +- xorg-libx11 +- xorg-libxext +- xorg-libxi +- xorg-libxrender +- xorg-libxtst +- libstdcxx >=14 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +- xorg-libxtst >=1.2.5,<2.0a0 +- libpng >=1.6.55,<1.7.0a0 +- alsa-lib >=1.2.15.3,<1.3.0a0 +- xorg-libx11 >=1.8.13,<2.0a0 +- xorg-libxi >=1.8.2,<2.0a0 +- xorg-libxrandr >=1.5.5,<2.0a0 +- lcms2 >=2.18,<3.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +- libcups >=2.3.3,<2.4.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- harfbuzz >=12.3.2 +- xorg-libxext >=1.3.7,<2.0a0 +- giflib >=5.2.2,<5.3.0a0 +- xorg-libxt >=1.3.1,<2.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- fontconfig >=2.17.1,<3.0a0 +- fonts-conda-ecosystem +license: GPL-2.0-or-later WITH Classpath-exception-2.0 +license_family: GPL +size: 106988620 +timestamp: 1771443741031 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +sha256: 7f8048c0e75b2620254218d72b4ae7f14136f1981c5eb555ef61645a9344505f +md5: 25f5885f11e8b1f075bccf4a2da91c60 +depends: +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3692030 +timestamp: 1769557678657 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda +sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 +md5: 1a30c42e32ca0ea216bd0bfe6f842f0b +depends: +- bzip2 >=1.0.8,<2.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 1166552 +timestamp: 1763655534263 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda +build_number: 7 +sha256: d78296134263b5bf476cad838ded65451e7162db756f9997c5d06b08122572ed +md5: 17d019cb2a6c72073c344e98e40dfd61 +depends: +- libgcc-ng >=12 +- libxcrypt >=4.4.36 +license: GPL-1.0-or-later OR Artistic-1.0-Perl +size: 13338804 +timestamp: 1703310557094 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda +sha256: e6b0846a998f2263629cfeac7bca73565c35af13251969f45d385db537a514e4 +md5: 1587081d537bd4ae77d1c0635d465ba5 +depends: +- libgcc >=14 +- libstdcxx >=14 +- libgcc >=14 +license: MIT +license_family: MIT +size: 357913 +timestamp: 1754665583353 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 +md5: ab7288cc39545556d1bc5e71ab2df9a9 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 636733 +timestamp: 1769712412683 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba +md5: bb5a90c93e3bac3d5690acf76b4a6386 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 8342 +timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda +sha256: a2ba1864403c7eb4194dacbfe2777acf3d596feae43aada8d1b478617ce45031 +md5: c8d8ec3e00cd0fd8a231789b91a7c5b7 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 60433 +timestamp: 1734229908988 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda +sha256: b86a819cd16f90c01d9d81892155126d01555a20dabd5f3091da59d6309afd0a +md5: 2d1409c50882819cb1af2de82e2b7208 +depends: +- libgcc >=13 +- libuuid >=2.38.1,<3.0a0 +- xorg-libice >=1.1.2,<2.0a0 +license: MIT +license_family: MIT +size: 28701 +timestamp: 1741897678254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda +sha256: cf886160e2ff580d77f7eb8ec1a77c41c2c5b05343e329bc35f0ddf40b8d92ab +md5: 22dd10425ef181e80e130db50675d615 +depends: +- libgcc >=14 +- libxcb >=1.17.0,<2.0a0 +license: MIT +license_family: MIT +size: 869058 +timestamp: 1770819244991 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 +md5: 1c246e1105000c3660558459e2fd6d43 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 16317 +timestamp: 1762977521691 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 +md5: bff06dcde4a707339d66d45d96ceb2e2 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 21039 +timestamp: 1762979038025 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda +sha256: db2188bc0d844d4e9747bac7f6c1d067e390bd769c5ad897c93f1df759dc5dba +md5: fb42b683034619915863d68dd9df03a3 +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 52409 +timestamp: 1769446753771 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda +sha256: 8cb9c88e25c57e47419e98f04f9ef3154ad96b9f858c88c570c7b91216a64d0e +md5: e8b4056544341daf1d415eaeae7a040c +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 20704 +timestamp: 1759284028146 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda +sha256: 7b587407ecb9ccd2bbaf0fb94c5dbdde4d015346df063e9502dc0ce2b682fb5e +md5: eeee3bdb31c6acde2b81ad1b8c287087 +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.9,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxfixes >=6.0.1,<7.0a0 +license: MIT +license_family: MIT +size: 48197 +timestamp: 1727801059062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda +sha256: 9f5196665a8d72f4f119c40dcc4bafeb0b540b102cc7b8b299c2abf599e7919f +md5: 1f64c613f0b8d67e9fb0e165d898fb6b +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: MIT +license_family: MIT +size: 31122 +timestamp: 1769445286951 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda +sha256: ffd77ee860c9635a28cfda46163dcfe9224dc6248c62404c544ae6b564a0be1f +md5: ae2c2dd0e2d38d249887727db2af960e +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 33649 +timestamp: 1734229123157 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda +sha256: 7c109792b60720809a580612aba7f8eb2a0bd425b9fc078748a9d6ffc97cbfa8 +md5: a9e4852c8e0b68ee783e7240030b696f +depends: +- libgcc >=13 +- xorg-libice >=1.1.1,<2.0a0 +- xorg-libsm >=1.2.4,<2.0a0 +- xorg-libx11 >=1.8.9,<2.0a0 +license: MIT +license_family: MIT +size: 384752 +timestamp: 1731860572314 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda +sha256: 6eaffce5a34fc0a16a21ddeaefb597e792a263b1b0c387c1ce46b0a967d558e1 +md5: c05698071b5c8e0da82a282085845860 +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.9,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxi >=1.7.10,<2.0a0 +license: MIT +license_family: MIT +size: 33786 +timestamp: 1727964907993 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 +md5: c3655f82dcea2aa179b291e7099c1fcc +depends: +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 614429 +timestamp: 1764777145593 diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 23e16634..10851264 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -1,37 +1,40 @@ process FASTQC { tag "${meta.id}" - label 'process_medium' + label 'process_low' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' : - 'biocontainers/fastqc:0.12.1--hdfd78af_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' + : 'quay.io/biocontainers/fastqc:0.12.1--hdfd78af_0'}" input: - tuple val(meta), path(reads) + tuple val(meta), path(reads, stageAs: '?/*') output: tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: versions + tuple val(meta), path("*.zip"), emit: zip + tuple val("${task.process}"), val('fastqc'), eval('fastqc --version | sed "/FastQC v/!d; s/.*v//"'), emit: versions_fastqc, topic: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" // Make list of old name and new name pairs to use for renaming in the bash while loop - def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } - def rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_files = old_new_pairs.collect{ _old_name, new_name -> new_name }.join(' ') + def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[reads, "${prefix}.${reads.extension}"]] : reads.withIndex().collect { entry, index -> [entry, "${prefix}_${index + 1}.${entry.extension}"] } + def rename_to = old_new_pairs*.join(' ').join(' ') + def renamed_files = old_new_pairs.collect { _old_name, new_name -> new_name }.join(' ') // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 - // Dividing the task.memory by task.cpu allows to stick to requested amount of RAM in the label - def memory_in_mb = task.memory ? task.memory.toUnit('MB') / task.cpus : null + // Dividing the task.memory by task.cpus allows to stick to requested amount of RAM in the label + def memory_in_mb = task.memory + ? (task.memory.toUnit('MB') / task.cpus).intValue() + : null // FastQC memory value allowed range (100 - 10000) def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) + def fastqc_memory_arg = fastqc_memory ? "--memory ${fastqc_memory}" : '' """ printf "%s %s\\n" ${rename_to} | while read old_name new_name; do @@ -41,13 +44,8 @@ process FASTQC { fastqc \\ ${args} \\ --threads ${task.cpus} \\ - --memory ${fastqc_memory} \\ + ${fastqc_memory_arg} \\ ${renamed_files} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ stub: @@ -55,10 +53,5 @@ process FASTQC { """ touch ${prefix}.html touch ${prefix}.zip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ } diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index c8d9d025..2f6cfef6 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -53,13 +53,28 @@ output: description: FastQC report archive pattern: "*_{fastqc.zip}" ontologies: [] + versions_fastqc: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@grst" @@ -70,3 +85,27 @@ maintainers: - "@grst" - "@ewels" - "@FelixKrueger" +containers: + docker: + linux/arm64: + name: community.wave.seqera.io/library/fastqc:0.12.1--e455e32f745abe68 + build_id: bd-e455e32f745abe68_1 + scan_id: sc-f102f736465af88c_1 + linux/amd64: + name: community.wave.seqera.io/library/fastqc:0.12.1--5cb1a2fa2f18c7c2 + build_id: bd-5cb1a2fa2f18c7c2_1 + scan_id: sc-0c0466326b6b77d2_1 + singularity: + linux/amd64: + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--5c4bd442468d75dd + build_id: bd-5c4bd442468d75dd_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f2/f20b021476d1d87658820f971ebecc1e8cdbde0f338eb0d9cea2b0a8fc54a54b/data + linux/arm64: + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--127a87fc06499035 + build_id: bd-127a87fc06499035_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/46/46daf2dad0169afd2ae047c3e50ed3776259f664bf07e5e06b045dc23449e994/data + conda: + linux/amd64: + lock_file: modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt + linux/arm64: + lock_file: modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test index e9d79a07..66c44da9 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -30,7 +30,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -58,7 +58,7 @@ nextflow_process { { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -82,7 +82,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -106,7 +106,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -142,7 +142,7 @@ nextflow_process { { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -166,7 +166,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap index d5db3092..c8ee120f 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -1,15 +1,21 @@ { "sarscov2 custom_prefix": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:16.374038" + "timestamp": "2025-10-28T16:39:14.518503" }, "sarscov2 single-end [fastq] - stub": { "content": [ @@ -33,7 +39,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -44,8 +54,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -59,10 +73,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:24.993809" + "timestamp": "2025-10-28T16:39:19.309008" }, "sarscov2 custom_prefix - stub": { "content": [ @@ -86,7 +100,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -97,8 +115,12 @@ "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -112,58 +134,82 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:03:10.93942" + "timestamp": "2025-10-28T16:39:44.94888" }, "sarscov2 interleaved [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:42.355718" + "timestamp": "2025-10-28T16:38:45.168496" }, "sarscov2 paired-end [bam]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:53.276274" + "timestamp": "2025-10-28T16:38:53.268919" }, "sarscov2 multiple [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:05.527626" + "timestamp": "2025-10-28T16:39:05.050305" }, "sarscov2 paired-end [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:31.188871" + "timestamp": "2025-10-28T16:38:37.2373" }, "sarscov2 paired-end [fastq] - stub": { "content": [ @@ -187,7 +233,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -198,8 +248,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -213,10 +267,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:34.273566" + "timestamp": "2025-10-28T16:39:24.450398" }, "sarscov2 multiple [fastq] - stub": { "content": [ @@ -240,7 +294,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -251,8 +309,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -266,22 +328,28 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:03:02.304411" + "timestamp": "2025-10-28T16:39:39.758762" }, "sarscov2 single-end [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:19.095607" + "timestamp": "2025-10-28T16:38:29.555068" }, "sarscov2 interleaved [fastq] - stub": { "content": [ @@ -305,7 +373,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -316,8 +388,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -331,10 +407,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:44.640184" + "timestamp": "2025-10-28T16:39:29.193136" }, "sarscov2 paired-end [bam] - stub": { "content": [ @@ -358,7 +434,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -369,8 +449,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -384,9 +468,9 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:53.550742" + "timestamp": "2025-10-28T16:39:34.144919" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt new file mode 100644 index 00000000..76190304 --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt @@ -0,0 +1,1552 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-64: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.4-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.39.3-py310hffdcd12_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.39.3-py310hbcd5346_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.2.28-py314h5bd0f2a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 +md5: a9f577daf3de00bca7c3c76c0ecbd1de +depends: +- __glibc >=2.17,<3.0.a0 +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28948 +timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda +noarch: generic +sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 +md5: a2ac7763a9ac75055b68f325d3255265 +depends: +- python >=3.14 +license: BSD-3-Clause AND MIT AND EPL-2.0 +size: 7514 +timestamp: 1767044983590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda +sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 +md5: 8910d2c46f7e7b519129f486e0fe927a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- libbrotlicommon 1.2.0 hb03c661_1 +license: MIT +license_family: MIT +size: 367376 +timestamp: 1764017265553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 +md5: d2ffd7602c02f2b316fd921d39876885 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 260182 +timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda +sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 +md5: 765c4d97e877cdbbb88ff33152b86125 +depends: +- python >=3.10 +license: ISC +size: 151445 +timestamp: 1772001170301 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda +sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 +md5: 49ee13eb9b8f44d63879c69b8a40a74b +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 58510 +timestamp: 1773660086450 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda +sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 +md5: ea8a6c3256897cc31263de9f455e25d9 +depends: +- python >=3.10 +- __unix +- python +license: BSD-3-Clause +license_family: BSD +size: 97676 +timestamp: 1764518652276 +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda +noarch: generic +sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c +md5: 3bb89e4f795e5414addaa531d6b1500a +depends: +- python >=3.14,<3.15.0a0 +- python_abi * *_cp314 +license: Python-2.0 +size: 50078 +timestamp: 1770674447292 +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.4-hecca717_0.conda +sha256: 0cc345e4dead417996ce9a1f088b28d858f03d113d43c1963d29194366dcce27 +md5: a0535741a4934b3e386051065c58761a +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat 2.7.4 hecca717_0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 145274 +timestamp: 1771259434699 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c +md5: 867127763fbe935bab59815b6e0b7b5c +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 270705 +timestamp: 1771382710863 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 17397 +timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a +md5: c80d8a3b84358cb967fa81e7075fbc8a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12723451 +timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda +sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 +md5: 53abe63df7e10a6ba605dc5f9f961d36 +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 50721 +timestamp: 1760286526795 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 +md5: 080594bf4493e6bae2607e65390c520a +depends: +- python >=3.10 +- zipp >=3.20 +- python +license: Apache-2.0 +license_family: APACHE +size: 34387 +timestamp: 1773931568510 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +sha256: 7f243680ca03eba7457b7a48f93a9440ba8181a8eac20a3eb5ef165ab6c96664 +md5: b3723b235b0758abaae8c82ce4d80146 +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +size: 62099926 +timestamp: 1615199463039 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a +md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 249959 +timestamp: 1768184673131 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda +sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c +md5: 18335a698559cdbcd86150a48bf54ba6 +depends: +- __glibc >=2.17,<3.0.a0 +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-64 2.45.1 +license: GPL-3.0-only +license_family: GPL +size: 728002 +timestamp: 1774197446916 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 +md5: a752488c68f2e7c456bcbd8f16eec275 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 261513 +timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda +build_number: 5 +sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c +md5: c160954f7418d7b6e87eaf05a8913fa9 +depends: +- libopenblas >=0.3.30,<0.3.31.0a0 +- libopenblas >=0.3.30,<1.0a0 +constrains: +- mkl <2026 +- liblapack 3.11.0 5*_openblas +- libcblas 3.11.0 5*_openblas +- blas 2.305 openblas +- liblapacke 3.11.0 5*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18213 +timestamp: 1765818813880 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda +build_number: 5 +sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 +md5: 6636a2b6f1a87572df2970d3ebc87cc0 +depends: +- libblas 3.11.0 5_h4a7cf45_openblas +constrains: +- liblapacke 3.11.0 5*_openblas +- blas 2.305 openblas +- liblapack 3.11.0 5*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18194 +timestamp: 1765818837135 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 +md5: 6c77a605a7a689d17d4819c0f8ac9a00 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 73490 +timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 +md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76798 +timestamp: 1771259418166 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 +md5: a360c33a5abe61c07959e449fa1453eb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 58592 +timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 +md5: e289f3d17880e44b633ba911d57a321b +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8049 +timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d +md5: fb16b4b69e3f1dcfe79d80db8fd0c55d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 384575 +timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 +md5: 0aa00f03f9e39fb9876085dee11a85d4 +depends: +- __glibc >=2.17,<3.0.a0 +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1041788 +timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 +md5: d5e96b1ed75ca01906b3d2469b4ce493 +depends: +- libgcc 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27526 +timestamp: 1771378224552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda +sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee +md5: 9063115da5bc35fdc3e1002e69b9ef6e +depends: +- libgfortran5 15.2.0 h68bc16d_18 +constrains: +- libgfortran-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27523 +timestamp: 1771378269450 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda +sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12 +md5: 646855f357199a12f02a87382d429b75 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 2482475 +timestamp: 1771378241063 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 +md5: 239c5e9546c38a1e884d69effcf4c882 +depends: +- __glibc >=2.17,<3.0.a0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 603262 +timestamp: 1771378117851 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 +md5: 8397539e3a0bbd1695584fb4f927485a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 633710 +timestamp: 1762094827865 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda +build_number: 5 +sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053 +md5: b38076eb5c8e40d0106beda6f95d7609 +depends: +- libblas 3.11.0 5_h4a7cf45_openblas +constrains: +- blas 2.305 openblas +- liblapacke 3.11.0 5*_openblas +- libcblas 3.11.0 5*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18200 +timestamp: 1765818857876 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb +md5: c7c83eecbb72d88b940c249af56c8b17 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 113207 +timestamp: 1768752626120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 +md5: 2c21e66f50753a083cbe6b80f38268fa +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-2-Clause +license_family: BSD +size: 92400 +timestamp: 1769482286018 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda +sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 +md5: be43915efc66345cccb3c310b6ed0374 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.30,<0.3.31.0a0 +license: BSD-3-Clause +license_family: BSD +size: 5927939 +timestamp: 1763114673331 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c +md5: 5f13ffc7d30ffec87864e678df9957b4 +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 317669 +timestamp: 1770691470744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda +sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 +md5: fd893f6a3002a635b5e50ceb9dd2c0f4 +depends: +- __glibc >=2.17,<3.0.a0 +- icu >=78.2,<79.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: blessing +size: 951405 +timestamp: 1772818874251 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e +md5: 1b08cd684f34175e4514474793d44bcb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc 15.2.0 he0feb66_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5852330 +timestamp: 1771378262446 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 +md5: cd5a90476766d53e901500df9215e927 +depends: +- __glibc >=2.17,<3.0.a0 +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 435273 +timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee +md5: db409b7c1720428638e7c0d509d3e1b5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 40311 +timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b +md5: aea31d2e5b1091feca96fcfe945c3cf9 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 429011 +timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa +md5: 92ed62436b625154323d40d5f2f11dd7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 395888 +timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 +md5: d87ff7921124eccd67248aa483c23fec +depends: +- __glibc >=2.17,<3.0.a0 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 63629 +timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e +md5: 5b5203189eb668f042ac2b0826244964 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +size: 64736 +timestamp: 1754951288511 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda +sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf +md5: 9a17c4307d23318476d7fbf0fedc0cde +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +size: 27424 +timestamp: 1772445227915 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 +sha256: 02fef69bde69db264a12f21386612262f545b6e3e68d8f1ccec19f3eaae58edf +md5: 86e69bd82c2a2c6fd29f5ab7e02b3691 +license: Apache-2.0 +license_family: Apache +size: 22281629 +timestamp: 1662784498331 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda +sha256: f005760b13093362fc9c997d603dd487de32ab2e821a3cbce52a42bcb8136517 +md5: 698a8a27c2b9d8a542c70cb47099a75e +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- pillow >=10.2.0 +- plotly >=5.18 +- polars-lts-cpu +- pyaml-env +- pydantic >=2.7.1 +- python >=3.8,!=3.14.1 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard +license: GPL-3.0-or-later +license_family: GPL3 +size: 4198799 +timestamp: 1765300743879 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +sha256: 541fd4390a0687228b8578247f1536a821d9261389a65585af9d1a6f2a14e1e0 +md5: 30bec5e8f4c3969e2b1bd407c5e52afb +depends: +- python >=3.10 +- python +license: MIT +size: 280459 +timestamp: 1774380620329 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 +md5: 47e340acb35de30501a76c7c799c41d7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 891641 +timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda +sha256: e3664264bd936c357523b55c71ed5a30263c6ba278d726a75b1eb112e6fb0b64 +md5: e235d5566c9cc8970eb2798dd4ecf62f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +size: 228588 +timestamp: 1762348634537 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda +sha256: 44dd98ffeac859d84a6dcba79a2096193a42fc10b29b28a5115687a680dd6aea +md5: 567fbeed956c200c1db5782a424e58ee +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +size: 2057773 +timestamp: 1763485556350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda +sha256: f2ba8cb0d86a6461a6bcf0d315c80c7076083f72c6733c9290086640723f79ec +md5: 36f5b7eb328bdc204954a2225cf908e2 +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +- libcblas >=3.9.0,<4.0a0 +- liblapack >=3.9.0,<4.0a0 +- libblas >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +size: 8927860 +timestamp: 1773839233468 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda +sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d +md5: 11b3379b191f63139e29c0d19dee24cd +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +size: 355400 +timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c +md5: f61eb8cd60ff9057122a3d338b99c00f +depends: +- __glibc >=2.17,<3.0.a0 +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3164551 +timestamp: 1769555830639 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda +sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 +md5: b76541e68fea4d511b1ac46a28dcd2c6 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +size: 72010 +timestamp: 1769093650580 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda +sha256: 9e6ec8f3213e8b7d64b0ad45f84c51a2c9eba4398efda31e196c9a56186133ee +md5: 79678378ae235e24b3aa83cee1b38207 +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libwebp-base >=1.6.0,<2.0a0 +- zlib-ng >=2.3.3,<2.4.0a0 +- python_abi 3.14.* *_cp314 +- tk >=8.6.13,<8.7.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libxcb >=1.17.0,<2.0a0 +- openjpeg >=2.5.4,<3.0a0 +- lcms2 >=2.18,<3.0a0 +- libtiff >=4.7.1,<4.8.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +license: HPND +size: 1073026 +timestamp: 1770794002408 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda +sha256: d332c2d5002fc440ae37ed9679ffc21b552f18d20232390005d1dd3bce0888d3 +md5: d5a4e013a30dd8dfde9ab39f45aaf9c1 +depends: +- polars-runtime-32 ==1.39.3 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.39.3 +- polars-runtime-64 ==1.39.3 +- polars-runtime-compat ==1.39.3 +license: MIT +license_family: MIT +size: 533495 +timestamp: 1774207987966 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda +sha256: e466fb31f67ba9bde18deafeb34263ca5eb25807f39ead0e9d753a8e82c4c4f4 +md5: ef0340e75068ac8ff96462749b5c98e7 +depends: +- polars >=1.34.0 +- polars-runtime-compat >=1.34.0 +license: MIT +license_family: MIT +size: 3902 +timestamp: 1760206808444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.39.3-py310hffdcd12_1.conda +noarch: python +sha256: 9744f8086bb0832998f5b01076f57ddc9efbe460e493b14303c3567dc4f401e7 +md5: f9327f9f2cfc4215f55b613e64afd3ba +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 37570276 +timestamp: 1774207987966 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.39.3-py310hbcd5346_1.conda +noarch: python +sha256: bf0b932713f0f27924f42159c98426e0073bb6145ed796eaa4cec79ca05363c7 +md5: 4b9b312453eebd6fbdbbe2a88fa1b5c4 +depends: +- python +- libgcc >=14 +- libstdcxx >=14 +- __glibc >=2.17,<3.0.a0 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 37224264 +timestamp: 1774207985377 +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d +md5: f2c23a77b25efcad57d377b34bd84941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 593603 +timestamp: 1769710381284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 +md5: b3c17d95b5a10c6e64a21fa17573e70e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 8252 +timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda +sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d +md5: c3946ed24acdb28db1b5d63321dbca7d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- typing-extensions >=4.6.1 +- annotated-types >=0.6.0 +- pydantic-core ==2.41.5 +- python +license: MIT +license_family: MIT +size: 340482 +timestamp: 1764434463101 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda +sha256: 7e0ae379796e28a429f8e48f2fe22a0f232979d65ec455e91f8dac689247d39f +md5: 432b0716a1dfac69b86aa38fdd59b7e6 +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 1943088 +timestamp: 1762988995556 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda +sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a +md5: 6b6ece66ebcae2d5f326c77ef2c5a066 +depends: +- python >=3.9 +license: BSD-2-Clause +license_family: BSD +size: 889287 +timestamp: 1750615908735 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda +build_number: 101 +sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd +md5: c014ad06e60441661737121d3eae8a60 +depends: +- __glibc >=2.17,<3.0.a0 +- bzip2 >=1.0.8,<2.0a0 +- ld_impl_linux-64 >=2.36.1 +- libexpat >=2.7.3,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.2,<6.0a0 +- libmpdec >=4.0.0,<5.0a0 +- libsqlite >=3.51.2,<4.0a0 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +- ncurses >=6.5,<7.0a0 +- openssl >=3.5.5,<4.0a0 +- python_abi 3.14.* *_cp314 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +- zstd >=1.5.7,<1.6.0a0 +license: Python-2.0 +size: 36702440 +timestamp: 1770675584356 +python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +sha256: 233aebd94c704ac112afefbb29cf4170b7bc606e22958906f2672081bc50638a +md5: 235765e4ea0d0301c75965985163b5a1 +depends: +- cpython 3.14.3.* +- python_abi * *_cp314 +license: Python-2.0 +size: 50062 +timestamp: 1770674497152 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 +md5: 310259a5b03ff02289d7705f39e2b1d2 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +build_number: 8 +sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 +md5: 0539938c55b6b1a59b560e843ad864a4 +constrains: +- python 3.14.* *_cp314 +license: BSD-3-Clause +license_family: BSD +size: 6989 +timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda +sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d +md5: 2035f68f96be30dc60a5dfd7452c7941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +size: 202391 +timestamp: 1770223462836 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 +md5: d7d95fc8287ea7bf33e0e7116d2b95ec +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +size: 345073 +timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.2.28-py314h5bd0f2a_0.conda +sha256: e085e336f1446f5263a3ec9747df8c719b6996753901181add50dc4fdd8bb2e8 +md5: 3c8b6a8c4d0ff5a264e9831eac4941f4 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +size: 411924 +timestamp: 1772255161535 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda +sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 +md5: c65df89a0b2e321045a9e01d1337b182 +depends: +- python >=3.10 +- certifi >=2017.4.17 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.21.1,<3 +- python +constrains: +- chardet >=3.0.2,<6 +license: Apache-2.0 +license_family: APACHE +size: 63602 +timestamp: 1766926974520 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda +sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 +md5: 7a6289c50631d620652f5045a63eb573 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +size: 208472 +timestamp: 1771572730357 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 +md5: c1c368b5437b0d1a68f372ccf01cb133 +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 376121 +timestamp: 1764543122774 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda +sha256: c9af81e7830d9c4b67a7f48e512d060df2676b29cac59e3b31f09dbfcee29c58 +md5: 7d9d7efe9541d4bb71b5934e8ee348ea +depends: +- __glibc >=2.17,<3.0.a0 +- icu >=78.2,<79.0a0 +- libgcc >=14 +- libsqlite 3.52.0 hf4e2dac_0 +- libzlib >=1.3.1,<2.0a0 +- ncurses >=6.5,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +size: 203641 +timestamp: 1772818888368 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +sha256: 7e395d67fd249d901beb1ae269057763c0d8c3ee5f7a348694bdb16d158a37d9 +md5: d705f9d8a1185a2b01cced191177a028 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 939648 +timestamp: 1764028306357 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac +md5: cffd3bdd58090148f4cfcd831f4b26ab +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +size: 3301196 +timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +sha256: 39d8ae33c43cdb8f771373e149b0b4fae5a08960ac58dcca95b2f1642bb17448 +md5: 260af1b0a94f719de76b4e14094e9a3b +depends: +- importlib-metadata >=3.6 +- python >=3.10 +- typing-extensions >=4.10.0 +- typing_extensions >=4.14.0 +constrains: +- pytest >=7 +license: MIT +license_family: MIT +size: 36838 +timestamp: 1771532971545 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 +md5: a0a4a3035667fc34f29bfbd5c190baa6 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +license: MIT +license_family: MIT +size: 18923 +timestamp: 1764158430324 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a +md5: 9272daa869e03efe68833e3dc7a02130 +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +size: 103172 +timestamp: 1767817860341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b +md5: b2895afaf55bf96a8c8282a2e47a5de0 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 15321 +timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 +md5: 1dafce8548e38671bea82e3f5c6ce22f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 20591 +timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda +sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad +md5: a77f85f77be52ff59391544bfe73390a +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +license: MIT +license_family: MIT +size: 85189 +timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae +md5: 30cd29cb87d819caead4d55184c1d115 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 24194 +timestamp: 1764460141901 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda +sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f +md5: 2aadb0d17215603a82a2a6b0afd9a4cb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +size: 122618 +timestamp: 1770167931827 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 +md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 +depends: +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 601375 +timestamp: 1764777111296 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt new file mode 100644 index 00000000..a55a4d49 --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt @@ -0,0 +1,126 @@ + +# This file may be used to create an environment using: +# $ conda create --name --file +# platform: linux-64 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb +https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 +https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c +https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 +https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 +https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 +https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.5-hecca717_0.conda#7de50d165039df32d38be74c1b34a910 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda#867127763fbe935bab59815b6e0b7b5c +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e +https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda#c1c368b5437b0d1a68f372ccf01cb133 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 +https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2#86e69bd82c2a2c6fd29f5ab7e02b3691 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda#e235d5566c9cc8970eb2798dd4ecf62f +https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda#567fbeed956c200c1db5782a424e58ee +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 +https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2#b3723b235b0758abaae8c82ce4d80146 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b +https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 +https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a +https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.40.0-py310hffdcd12_0.conda#8eacf9ff4d4e1ca1b52f8f3ba3e0c993 +https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 +https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.40.0-py310hbcd5346_0.conda#03a6899e17bb731c8e21b08212f1a64c +https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda#2035f68f96be30dc60a5dfd7452c7941 +https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda#1f3fd537f929b8d3236f9f0f0e7f7a32 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 +https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c +https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 +https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 +https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 +https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a +https://conda.anaconda.org/conda-forge/linux-64/regex-2026.4.4-py314h5bd0f2a_0.conda#4ffb42385183c854564f1f9adcf80a63 +https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda#d705f9d8a1185a2b01cced191177a028 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 +https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b +https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 +https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f +https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda#f2c23a77b25efcad57d377b34bd84941 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt new file mode 100644 index 00000000..a58231a0 --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt @@ -0,0 +1,1502 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-aarch64: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.4-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.1.1-py314hac3e5ec_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.39.3-py310hff09b76_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.39.3-py310hf00a4a2_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.3-hb06a95a_101_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.2.28-py314h51f160d_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.52.0-hf1c7be2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 +md5: 468fd3bb9e1f671d36c2cbc677e56f1d +depends: +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28926 +timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda +noarch: generic +sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 +md5: a2ac7763a9ac75055b68f325d3255265 +depends: +- python >=3.14 +license: BSD-3-Clause AND MIT AND EPL-2.0 +size: 7514 +timestamp: 1767044983590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda +sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 +md5: a1b5c571a0923a205d663d8678df4792 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +constrains: +- libbrotlicommon 1.2.0 he30d5cf_1 +license: MIT +license_family: MIT +size: 373193 +timestamp: 1764017486851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c +md5: 840d8fc0d7b3209be93080bc20e07f2d +depends: +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 192412 +timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda +sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 +md5: 765c4d97e877cdbbb88ff33152b86125 +depends: +- python >=3.10 +license: ISC +size: 151445 +timestamp: 1772001170301 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda +sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 +md5: 49ee13eb9b8f44d63879c69b8a40a74b +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 58510 +timestamp: 1773660086450 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda +sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 +md5: ea8a6c3256897cc31263de9f455e25d9 +depends: +- python >=3.10 +- __unix +- python +license: BSD-3-Clause +license_family: BSD +size: 97676 +timestamp: 1764518652276 +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda +noarch: generic +sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c +md5: 3bb89e4f795e5414addaa531d6b1500a +depends: +- python >=3.14,<3.15.0a0 +- python_abi * *_cp314 +license: Python-2.0 +size: 50078 +timestamp: 1770674447292 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.4-hfae3067_0.conda +sha256: 5f087bef054c681edcaae84a8c2230585b938691e371ff92957a30707b7fcdf7 +md5: b304307db639831ad7caabd2eac6fca6 +depends: +- libexpat 2.7.4 hfae3067_0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 137701 +timestamp: 1771259543650 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c +md5: 0fed1ff55f4938a65907f3ecf62609db +depends: +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 279044 +timestamp: 1771382728182 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 17397 +timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 +md5: 546da38c2fa9efacf203e2ad3f987c59 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12837286 +timestamp: 1773822650615 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda +sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 +md5: 53abe63df7e10a6ba605dc5f9f961d36 +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 50721 +timestamp: 1760286526795 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 +md5: 080594bf4493e6bae2607e65390c520a +depends: +- python >=3.10 +- zipp >=3.20 +- python +license: Apache-2.0 +license_family: APACHE +size: 34387 +timestamp: 1773931568510 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +sha256: d3c7f4797566e6f983d16c2a87063a18e4b2d819a66230190a21584d70042755 +md5: 4f0d284f5d11e04277b552eb1c172c7f +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +size: 65750397 +timestamp: 1615199465742 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +sha256: 379ef5e91a587137391a6149755d0e929f1a007d2dcb211318ac670a46c8596f +md5: bb960f01525b5e001608afef9d47b79c +depends: +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 293039 +timestamp: 1768184778398 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda +sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 +md5: a21644fc4a83da26452a718dc9468d5f +depends: +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-aarch64 2.45.1 +license: GPL-3.0-only +license_family: GPL +size: 875596 +timestamp: 1774197520746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 +md5: d13423b06447113a90b5b1366d4da171 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 240444 +timestamp: 1773114901155 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda +build_number: 5 +sha256: 700f3c03d0fba8e687a345404a45fbabe781c1cf92242382f62cef2948745ec4 +md5: 5afcea37a46f76ec1322943b3c4dfdc0 +depends: +- libopenblas >=0.3.30,<0.3.31.0a0 +- libopenblas >=0.3.30,<1.0a0 +constrains: +- mkl <2026 +- libcblas 3.11.0 5*_openblas +- liblapack 3.11.0 5*_openblas +- liblapacke 3.11.0 5*_openblas +- blas 2.305 openblas +license: BSD-3-Clause +license_family: BSD +size: 18369 +timestamp: 1765818610617 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda +build_number: 5 +sha256: 3fad5c9de161dccb4e42c8b1ae8eccb33f4ed56bccbcced9cbb0956ae7869e61 +md5: 0b2f1143ae2d0aa4c991959d0daaf256 +depends: +- libblas 3.11.0 5_haddc8a3_openblas +constrains: +- liblapack 3.11.0 5*_openblas +- liblapacke 3.11.0 5*_openblas +- blas 2.305 openblas +license: BSD-3-Clause +license_family: BSD +size: 18371 +timestamp: 1765818618899 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 +md5: a9138815598fe6b91a1d6782ca657b0c +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 71117 +timestamp: 1761979776756 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 +md5: 57f3b3da02a50a1be2a6fe847515417d +depends: +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76564 +timestamp: 1771259530958 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 +md5: 2f364feefb6a7c00423e80dcb12db62a +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 55952 +timestamp: 1769456078358 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a +md5: a229e22d4d8814a07702b0919d8e6701 +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8125 +timestamp: 1774301094057 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c +md5: b99ed99e42dafb27889483b3098cace7 +depends: +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 422941 +timestamp: 1774301093473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 +md5: 552567ea2b61e3a3035759b2fdb3f9a6 +depends: +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 622900 +timestamp: 1771378128706 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f +md5: 4feebd0fbf61075a1a9c2e9b3936c257 +depends: +- libgcc 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27568 +timestamp: 1771378136019 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda +sha256: 7dcd7dff2505d56fd5272a6e712ec912f50a46bf07dc6873a7e853694304e6e4 +md5: 41f261f5e4e2e8cbd236c2f1f15dae1b +depends: +- libgfortran5 15.2.0 h1b7bec0_18 +constrains: +- libgfortran-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27587 +timestamp: 1771378169244 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda +sha256: 85347670dfb4a8d4c13cd7cae54138dcf2b1606b6bede42eef5507bf5f9660c6 +md5: 574d88ce3348331e962cfa5ed451b247 +depends: +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1486341 +timestamp: 1771378148102 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 +md5: 4faa39bf919939602e594253bd673958 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 588060 +timestamp: 1771378040807 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 +md5: 5109d7f837a3dfdf5c60f60e311b041f +depends: +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 691818 +timestamp: 1762094728337 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda +build_number: 5 +sha256: 692222d186d3ffbc99eaf04b5b20181fd26aee1edec1106435a0a755c57cce86 +md5: 88d1e4133d1182522b403e9ba7435f04 +depends: +- libblas 3.11.0 5_haddc8a3_openblas +constrains: +- liblapacke 3.11.0 5*_openblas +- blas 2.305 openblas +- libcblas 3.11.0 5*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18392 +timestamp: 1765818627104 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +sha256: 843c46e20519651a3e357a8928352b16c5b94f4cd3d5481acc48be2e93e8f6a3 +md5: 96944e3c92386a12755b94619bae0b35 +depends: +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 125916 +timestamp: 1768754941722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda +sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 +md5: 7b9813e885482e3ccb1fa212b86d7fd0 +depends: +- libgcc >=14 +license: BSD-2-Clause +license_family: BSD +size: 114056 +timestamp: 1769482343003 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda +sha256: 794a7270ea049ec931537874cd8d2de0ef4b3cef71c055cfd8b4be6d2f4228b0 +md5: 11d7d57b7bdd01da745bbf2b67020b2e +depends: +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.30,<0.3.31.0a0 +license: BSD-3-Clause +license_family: BSD +size: 4959359 +timestamp: 1763114173544 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 +md5: be4088903b94ea297975689b3c3aeb27 +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 340156 +timestamp: 1770691477245 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda +sha256: 1ddaf91b44fae83856276f4cb7ce544ffe41d4b55c1e346b504c6b45f19098d6 +md5: 77891484f18eca74b8ad83694da9815e +depends: +- icu >=78.2,<79.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: blessing +size: 952296 +timestamp: 1772818881550 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 +md5: f56573d05e3b735cb03efeb64a15f388 +depends: +- libgcc 15.2.0 h8acb6b2_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5541411 +timestamp: 1771378162499 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 +md5: 8c6fd84f9c87ac00636007c6131e457d +depends: +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 488407 +timestamp: 1762022048105 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 +md5: cf2861212053d05f27ec49c3784ff8bb +depends: +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 43453 +timestamp: 1766271546875 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 +md5: 24e92d0942c799db387f5c9d7b81f1af +depends: +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 359496 +timestamp: 1752160685488 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b +md5: cd14ee5cca2464a425b1dbfc24d90db2 +depends: +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 397493 +timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f +md5: 502006882cf5461adced436e410046d1 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 69833 +timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e +md5: 5b5203189eb668f042ac2b0826244964 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +size: 64736 +timestamp: 1754951288511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda +sha256: 383c188496d13a55658c06e61e7d4cdff2c9f9d5a0648769fca8250bece7e0ef +md5: e5de3c36dd548b35ff2a8aa49208dcb3 +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +size: 27913 +timestamp: 1772446407659 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 +sha256: 8fd4c79d6eda3d4cba73783114305a53a154ada4d1e334d4e02cb3521429599b +md5: 7b08314a6867a9d5648a1c3265e9eb8e +license: Apache-2.0 +license_family: Apache +size: 22257008 +timestamp: 1662784555011 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda +sha256: f005760b13093362fc9c997d603dd487de32ab2e821a3cbce52a42bcb8136517 +md5: 698a8a27c2b9d8a542c70cb47099a75e +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- pillow >=10.2.0 +- plotly >=5.18 +- polars-lts-cpu +- pyaml-env +- pydantic >=2.7.1 +- python >=3.8,!=3.14.1 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard +license: GPL-3.0-or-later +license_family: GPL3 +size: 4198799 +timestamp: 1765300743879 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +sha256: 541fd4390a0687228b8578247f1536a821d9261389a65585af9d1a6f2a14e1e0 +md5: 30bec5e8f4c3969e2b1bd407c5e52afb +depends: +- python >=3.10 +- python +license: MIT +size: 280459 +timestamp: 1774380620329 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 +md5: 182afabe009dc78d8b73100255ee6868 +depends: +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 926034 +timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda +sha256: 78a06e89285fef242e272998b292c1e621e3ee3dd4fba62ec014e503c7ec118f +md5: 6dd4f07147774bf720075a210f8026b9 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +size: 235140 +timestamp: 1762350120355 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda +sha256: 48942696889367ffd448f8dccfc080fb7e130b9938a4a3b6b20ef8e6af856463 +md5: 4540f9570d12db2150f42ba036154552 +depends: +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +size: 2061869 +timestamp: 1763490303490 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda +sha256: a6d42fd88afc57c3b0a57b21a12eff7492dfc419bb61ee3f74e9ba6261dabc88 +md5: 25d896c331481145720a21e5145fad65 +depends: +- python +- libgcc >=14 +- python 3.14.* *_cp314 +- libstdcxx >=14 +- libcblas >=3.9.0,<4.0a0 +- liblapack >=3.9.0,<4.0a0 +- python_abi 3.14.* *_cp314 +- libblas >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +size: 8008045 +timestamp: 1773839355275 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda +sha256: bd1bc8bdde5e6c5cbac42d462b939694e40b59be6d0698f668515908640c77b8 +md5: cea962410e327262346d48d01f05936c +depends: +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +size: 392636 +timestamp: 1758489353577 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +sha256: 7f8048c0e75b2620254218d72b4ae7f14136f1981c5eb555ef61645a9344505f +md5: 25f5885f11e8b1f075bccf4a2da91c60 +depends: +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3692030 +timestamp: 1769557678657 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda +sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 +md5: b76541e68fea4d511b1ac46a28dcd2c6 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +size: 72010 +timestamp: 1769093650580 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.1.1-py314hac3e5ec_0.conda +sha256: 1ca2d1616baad9bccb7ebc425ef2dcd6cebe742fbe91edf226fb606ad371ca0f +md5: d3c959c7efe560b2d7da459d69121fe9 +depends: +- python +- python 3.14.* *_cp314 +- libgcc >=14 +- zlib-ng >=2.3.3,<2.4.0a0 +- libwebp-base >=1.6.0,<2.0a0 +- tk >=8.6.13,<8.7.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libtiff >=4.7.1,<4.8.0a0 +- lcms2 >=2.18,<3.0a0 +- python_abi 3.14.* *_cp314 +- openjpeg >=2.5.4,<3.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libxcb >=1.17.0,<2.0a0 +license: HPND +size: 1051828 +timestamp: 1770794010335 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda +sha256: d332c2d5002fc440ae37ed9679ffc21b552f18d20232390005d1dd3bce0888d3 +md5: d5a4e013a30dd8dfde9ab39f45aaf9c1 +depends: +- polars-runtime-32 ==1.39.3 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.39.3 +- polars-runtime-64 ==1.39.3 +- polars-runtime-compat ==1.39.3 +license: MIT +license_family: MIT +size: 533495 +timestamp: 1774207987966 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda +sha256: e466fb31f67ba9bde18deafeb34263ca5eb25807f39ead0e9d753a8e82c4c4f4 +md5: ef0340e75068ac8ff96462749b5c98e7 +depends: +- polars >=1.34.0 +- polars-runtime-compat >=1.34.0 +license: MIT +license_family: MIT +size: 3902 +timestamp: 1760206808444 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.39.3-py310hff09b76_1.conda +noarch: python +sha256: c070be507c5a90df397a47ae0299660be437d5546d68f1bc0fa4402c9f07d59e +md5: 3c1a7c6b4ba8b9fb773ace9723f8a5db +depends: +- python +- libgcc >=14 +- libstdcxx >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 34785466 +timestamp: 1774207998285 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.39.3-py310hf00a4a2_1.conda +noarch: python +sha256: 683315f1a49e47ce72bf9462419733b40b588b2b3106552d95fd4cd994e174de +md5: dd3464e2132dc3a783e76e5078870c76 +depends: +- python +- libgcc >=14 +- libstdcxx >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 34652491 +timestamp: 1774207996879 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 +md5: ab7288cc39545556d1bc5e71ab2df9a9 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 636733 +timestamp: 1769712412683 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba +md5: bb5a90c93e3bac3d5690acf76b4a6386 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 8342 +timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda +sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d +md5: c3946ed24acdb28db1b5d63321dbca7d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- typing-extensions >=4.6.1 +- annotated-types >=0.6.0 +- pydantic-core ==2.41.5 +- python +license: MIT +license_family: MIT +size: 340482 +timestamp: 1764434463101 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda +sha256: f8acb2d03ebe80fed0032b9a989fc9acfb6735e3cd3f8c704b72728cb31868f6 +md5: 28f5027a1e04d67aa13fac1c5ba79693 +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- python 3.14.* *_cp314 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 1828339 +timestamp: 1762989038561 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda +sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a +md5: 6b6ece66ebcae2d5f326c77ef2c5a066 +depends: +- python >=3.9 +license: BSD-2-Clause +license_family: BSD +size: 889287 +timestamp: 1750615908735 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.3-hb06a95a_101_cp314.conda +build_number: 101 +sha256: 87e9dff5646aba87cecfbc08789634c855871a7325169299d749040b0923a356 +md5: 205011b36899ff0edf41b3db0eda5a44 +depends: +- bzip2 >=1.0.8,<2.0a0 +- ld_impl_linux-aarch64 >=2.36.1 +- libexpat >=2.7.3,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.2,<6.0a0 +- libmpdec >=4.0.0,<5.0a0 +- libsqlite >=3.51.2,<4.0a0 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +- ncurses >=6.5,<7.0a0 +- openssl >=3.5.5,<4.0a0 +- python_abi 3.14.* *_cp314 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +- zstd >=1.5.7,<1.6.0a0 +license: Python-2.0 +size: 37305578 +timestamp: 1770674395875 +python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +sha256: 233aebd94c704ac112afefbb29cf4170b7bc606e22958906f2672081bc50638a +md5: 235765e4ea0d0301c75965985163b5a1 +depends: +- cpython 3.14.3.* +- python_abi * *_cp314 +license: Python-2.0 +size: 50062 +timestamp: 1770674497152 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 +md5: 310259a5b03ff02289d7705f39e2b1d2 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +build_number: 8 +sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 +md5: 0539938c55b6b1a59b560e843ad864a4 +constrains: +- python 3.14.* *_cp314 +license: BSD-3-Clause +license_family: BSD +size: 6989 +timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda +sha256: 496b5e65dfdd0aaaaa5de0dcaaf3bceea00fcb4398acf152f89e567c82ec1046 +md5: 9ae2c92975118058bd720e9ba2bb7c58 +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +size: 195678 +timestamp: 1770223441816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 +md5: 3d49cad61f829f4f0e0611547a9cda12 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +size: 357597 +timestamp: 1765815673644 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.2.28-py314h51f160d_0.conda +sha256: 2080ecea825e1ef91a2422cc0bc63e85db9e38908ed17657fb8f41de7a6eee71 +md5: 818aa2c9f6b3c808da5e7be22a9a424c +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +size: 408097 +timestamp: 1772255205521 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda +sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 +md5: c65df89a0b2e321045a9e01d1337b182 +depends: +- python >=3.10 +- certifi >=2017.4.17 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.21.1,<3 +- python +constrains: +- chardet >=3.0.2,<6 +license: Apache-2.0 +license_family: APACHE +size: 63602 +timestamp: 1766926974520 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda +sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 +md5: 7a6289c50631d620652f5045a63eb573 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +size: 208472 +timestamp: 1771572730357 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda +sha256: a587240f16eac7c6a80f9585cef679cd1cb9a287b8dfcdd36dcef1f7e7db15dc +md5: e7f6ed9e60043bb5cbcc527764897f0d +depends: +- python +- libgcc >=14 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 376332 +timestamp: 1764543345455 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.52.0-hf1c7be2_0.conda +sha256: 4f8523f5341f0d9e1547085206c6c1f71f9fc7c277443ca363a8cf98add8fc01 +md5: d9634079df93a65ee045b3c75f35cae1 +depends: +- icu >=78.2,<79.0a0 +- libgcc >=14 +- libsqlite 3.52.0 h10b116e_0 +- libzlib >=1.3.1,<2.0a0 +- ncurses >=6.5,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +size: 209416 +timestamp: 1772818891689 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda +sha256: c1da41c79262b27efa168407cfecc47b20270e5fc071a8307f95a2c85fb94170 +md5: 55bf7b559202236157b14323b40f19e6 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 914402 +timestamp: 1764030357702 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 +md5: 7fc6affb9b01e567d2ef1d05b84aa6ed +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +size: 3368666 +timestamp: 1769464148928 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +sha256: 39d8ae33c43cdb8f771373e149b0b4fae5a08960ac58dcca95b2f1642bb17448 +md5: 260af1b0a94f719de76b4e14094e9a3b +depends: +- importlib-metadata >=3.6 +- python >=3.10 +- typing-extensions >=4.10.0 +- typing_extensions >=4.14.0 +constrains: +- pytest >=7 +license: MIT +license_family: MIT +size: 36838 +timestamp: 1771532971545 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 +md5: a0a4a3035667fc34f29bfbd5c190baa6 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +license: MIT +license_family: MIT +size: 18923 +timestamp: 1764158430324 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a +md5: 9272daa869e03efe68833e3dc7a02130 +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +size: 103172 +timestamp: 1767817860341 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 +md5: 1c246e1105000c3660558459e2fd6d43 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 16317 +timestamp: 1762977521691 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 +md5: bff06dcde4a707339d66d45d96ceb2e2 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 21039 +timestamp: 1762979038025 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda +sha256: 66265e943f32ce02396ad214e27cb35f5b0490b3bd4f064446390f9d67fa5d88 +md5: 032d8030e4a24fe1f72c74423a46fb88 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 88088 +timestamp: 1753484092643 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae +md5: 30cd29cb87d819caead4d55184c1d115 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 24194 +timestamp: 1764460141901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda +sha256: 638a3a41a4fbfed52d3c60c8ef5a3693b3f12a5b1a3f58fa29f5698d0a0702e2 +md5: f731af71c723065d91b4c01bb822641b +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +size: 121046 +timestamp: 1770167944449 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 +md5: c3655f82dcea2aa179b291e7099c1fcc +depends: +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 614429 +timestamp: 1764777145593 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt new file mode 100644 index 00000000..f787dbe1 --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt @@ -0,0 +1,125 @@ + +# This file may be used to create an environment using: +# $ conda create --name --file +# platform: linux-aarch64 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda#4faa39bf919939602e594253bd673958 +https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda#468fd3bb9e1f671d36c2cbc677e56f1d +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda#552567ea2b61e3a3035759b2fdb3f9a6 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda#840d8fc0d7b3209be93080bc20e07f2d +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda#502006882cf5461adced436e410046d1 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda#c3655f82dcea2aa179b291e7099c1fcc +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda#a21644fc4a83da26452a718dc9468d5f +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda#05d1e0b30acd816a192c03dc6e164f4d +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda#2f364feefb6a7c00423e80dcb12db62a +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda#76298a9e6d71ee6e832a8d0d7373b261 +https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda#7b9813e885482e3ccb1fa212b86d7fd0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.0-h022381a_0.conda#86db4036fd08bf34e991bf48a8af405d +https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda#a0b5de740d01c390bdbb46d7503c9fab +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda#3b129669089e4d6a5c6871dbb4669b99 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda#3d49cad61f829f4f0e0611547a9cda12 +https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda#7fc6affb9b01e567d2ef1d05b84aa6ed +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda#3cfbe780f0f51cc8cba41db9f8a28bfe +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 +https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda#f56573d05e3b735cb03efeb64a15f388 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda#a1b5c571a0923a205d663d8678df4792 +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c +https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 +https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 +https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda#574d88ce3348331e962cfa5ed451b247 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda#41f261f5e4e2e8cbd236c2f1f15dae1b +https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda#5d2ce5cf40443d055ec6d33840192265 +https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda#652bb20bb4618cacd11e17ae070f47ce +https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda#939e300b110db241a96a1bed438c315b +https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda#e23a27b52fb320687239e2c5ae4d7540 +https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda#25d896c331481145720a21e5145fad65 +https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 +https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.5-hfae3067_0.conda#d2bb0c889d94f2fdc5856392c3002976 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda#f51503ac45a4888bce71af9027a2ecc9 +https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda#b99ed99e42dafb27889483b3098cace7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda#a229e22d4d8814a07702b0919d8e6701 +https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda#0fed1ff55f4938a65907f3ecf62609db +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e +https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda#e5de3c36dd548b35ff2a8aa49208dcb3 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda#e7f6ed9e60043bb5cbcc527764897f0d +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda#4feebd0fbf61075a1a9c2e9b3936c257 +https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2#7b08314a6867a9d5648a1c3265e9eb8e +https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda#6dd4f07147774bf720075a210f8026b9 +https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda#4540f9570d12db2150f42ba036154552 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.0-he8854b5_0.conda#ad8164bdeece883b825c50639c0c4725 +https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2#4f0d284f5d11e04277b552eb1c172c7f +https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda#a85ba48648f6868016f2741fd9170250 +https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda#d13423b06447113a90b5b1366d4da171 +https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda#a9138815598fe6b91a1d6782ca657b0c +https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda#24e92d0942c799db387f5c9d7b81f1af +https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda#8c6fd84f9c87ac00636007c6131e457d +https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda#bb960f01525b5e001608afef9d47b79c +https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda#bb5a90c93e3bac3d5690acf76b4a6386 +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda#1c246e1105000c3660558459e2fd6d43 +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda#bff06dcde4a707339d66d45d96ceb2e2 +https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda#cd14ee5cca2464a425b1dbfc24d90db2 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 +https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda#cea962410e327262346d48d01f05936c +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda#f731af71c723065d91b4c01bb822641b +https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda#87d58d103b47c4a8567b3d7666647684 +https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 +https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a +https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.40.0-py310hff09b76_0.conda#d5628a33ce7652511e38fc98643dc910 +https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 +https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.40.0-py310hf00a4a2_0.conda#a82af0fcbb72db253dc89a7a45279372 +https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda#9ae2c92975118058bd720e9ba2bb7c58 +https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.3-py314h451b6cc_0.conda#1a2cb55be9a153ad6203bff6b787c240 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 +https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c +https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 +https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 +https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 +https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a +https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.4.4-py314h51f160d_0.conda#88a3dbd279e6b1faf0cddb8397866864 +https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda#55bf7b559202236157b14323b40f19e6 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 +https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b +https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 +https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f +https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda#ab7288cc39545556d1bc5e71ab2df9a9 diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index d02016a0..37e7612d 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.32 + - bioconda::multiqc=1.34 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index c1158fb0..e80e8cd8 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,24 +1,21 @@ process MULTIQC { + tag "${meta.id}" label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : - 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data' + : 'community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6'}" input: - path multiqc_files, stageAs: "?/*" - path(multiqc_config) - path(extra_multiqc_config) - path(multiqc_logo) - path(replace_names) - path(sample_names) + tuple val(meta), path(multiqc_files, stageAs: "?/*"), path(multiqc_config, stageAs: "?/*"), path(multiqc_logo), path(replace_names), path(sample_names) output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions + tuple val(meta), path("*.html"), emit: report + tuple val(meta), path("*_data"), emit: data + tuple val(meta), path("*_plots"), emit: plots, optional: true + // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever + tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions when: task.ext.when == null || task.ext.when @@ -26,38 +23,28 @@ process MULTIQC { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' - def config = multiqc_config ? "--config $multiqc_config" : '' - def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + def config = multiqc_config ? multiqc_config instanceof List ? "--config ${multiqc_config.join(' --config ')}" : "--config ${multiqc_config}" : "" def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' def replace = replace_names ? "--replace-names ${replace_names}" : '' def samples = sample_names ? "--sample-names ${sample_names}" : '' """ multiqc \\ --force \\ - $args \\ - $config \\ - $prefix \\ - $extra_config \\ - $logo \\ - $replace \\ - $samples \\ + ${args} \\ + ${config} \\ + ${prefix} \\ + ${logo} \\ + ${replace} \\ + ${samples} \\ . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ stub: """ mkdir multiqc_data + touch multiqc_data/.stub mkdir multiqc_plots + touch multiqc_plots/.stub touch multiqc_report.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ } diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ce30eb73..2facc627 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -1,6 +1,6 @@ name: multiqc -description: Aggregate results from bioinformatics analyses across many samples into - a single report +description: Aggregate results from bioinformatics analyses across many samples + into a single report keywords: - QC - bioinformatics tools @@ -12,74 +12,91 @@ tools: It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ - licence: ["GPL-3.0-or-later"] + licence: + - "GPL-3.0-or-later" identifier: biotools:multiqc input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - ontologies: [] - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML - - multiqc_logo: - type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - ontologies: [] - - replace_names: - type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 # TSV - - sample_names: - type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 # TSV -output: - report: - - "*multiqc_report.html": + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - multiqc_files: type: file - description: MultiQC report file - pattern: "multiqc_report.html" + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC ontologies: [] - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - plots: - - "*_plots": + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 + - multiqc_logo: type: file - description: Plots created by MultiQC - pattern: "*_data" + description: Optional logo file for MultiQC + pattern: "*.{png}" ontologies: [] - versions: - - versions.yml: + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 + - sample_names: type: file - description: File containing software versions - pattern: "versions.yml" + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - edam: http://edamontology.org/format_3475 +output: + report: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*.html": + type: file + description: MultiQC report file + pattern: ".html" + ontologies: [] + data: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*_plots": + type: file + description: Plots created by MultiQC + pattern: "*_plots" + ontologies: [] + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - multiqc: + type: string + description: The tool name + - multiqc --version | sed "s/.* //g": + type: eval + description: The expression to obtain the version of the tool authors: - "@abhi18av" - "@bunop" @@ -90,3 +107,27 @@ maintainers: - "@bunop" - "@drpatelh" - "@jfy133" +containers: + conda: + linux/amd64: + lock_file: modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt + linux/arm64: + lock_file: modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt + docker: + linux/amd64: + name: community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6 + build_id: bd-db7c73dae76bc9e6_1 + scan_id: sc-66fc7138dbf1cf48_1 + linux/arm64: + name: community.wave.seqera.io/library/multiqc:1.34--d167b8012595a136 + build_id: bd-d167b8012595a136_1 + scan_id: sc-ac701dfa631a2af9_1 + singularity: + linux/amd64: + name: oras://community.wave.seqera.io/library/multiqc:1.34--4fc8657c816047c0 + build_id: bd-4fc8657c816047c0_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data + linux/arm64: + name: oras://community.wave.seqera.io/library/multiqc:1.34--7fbd82d945c06726 + build_id: bd-7fbd82d945c06726_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9a1fec9662a152683e6fcae440d0ce20920b3b89dc62d1e3a52e73f92eba0969/data diff --git a/modules/nf-core/multiqc/tests/custom_prefix.config b/modules/nf-core/multiqc/tests/custom_prefix.config new file mode 100644 index 00000000..b30b1358 --- /dev/null +++ b/modules/nf-core/multiqc/tests/custom_prefix.config @@ -0,0 +1,5 @@ +process { + withName: 'MULTIQC' { + ext.prefix = "custom_prefix" + } +} diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index 33316a7d..4cbdb95d 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -15,25 +15,84 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = [] - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) """ } } then { - assertAll( - { assert process.success }, - { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, - { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_single") } - ) + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] - custom prefix") { + config "./custom_prefix.config" + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) + """ + } } + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } } test("sarscov2 single-end [fastqc] [config]") { @@ -41,23 +100,85 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = Channel.of(file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true)) - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true), + [], + [], + [] + ]) """ } } then { - assertAll( - { assert process.success }, - { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, - { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_config") } - ) + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] [multiple configs]") { + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [ + file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true), + file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true) + ], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() } } @@ -68,25 +189,23 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = [] - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) """ } } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out.report.collect { file(it).getName() } + - process.out.data.collect { file(it).getName() } + - process.out.plots.collect { file(it).getName() } + - process.out.versions ).match("multiqc_stub") } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } - } } diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index a88bafd6..7c2f370f 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -1,41 +1,422 @@ { - "multiqc_versions_single": { + "sarscov2 single-end [fastqc] [multiple configs]": { "content": [ - [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" - ] + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "multiqc_report.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } ], + "timestamp": "2026-03-17T16:15:42.577775492", "meta": { - "nf-test": "0.9.3", - "nextflow": "24.10.4" - }, - "timestamp": "2025-10-27T13:33:24.356715" + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } }, - "multiqc_stub": { + "sarscov2 single-end [fastqc]": { "content": [ - [ - "multiqc_report.html", - "multiqc_data", - "multiqc_plots", - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" - ] + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "multiqc_report.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } ], + "timestamp": "2026-03-17T16:21:17.072841555", "meta": { - "nf-test": "0.9.3", - "nextflow": "24.10.4" - }, - "timestamp": "2025-10-27T13:34:11.103619" + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } }, - "multiqc_versions_config": { + "sarscov2 single-end [fastqc] - stub": { "content": [ - [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" - ] + { + "data": [ + [ + { + "id": "FASTQC" + }, + [ + ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "plots": [ + [ + { + "id": "FASTQC" + }, + [ + ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "report": [ + [ + { + "id": "FASTQC" + }, + "multiqc_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } ], + "timestamp": "2026-02-26T15:14:39.789193051", "meta": { - "nf-test": "0.9.3", - "nextflow": "24.10.4" - }, - "timestamp": "2025-10-27T13:34:04.615233" + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc] [config]": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "multiqc_report.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } + ], + "timestamp": "2026-03-17T16:15:30.372239611", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc] - custom prefix": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "custom_prefix.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } + ], + "timestamp": "2026-03-17T16:15:18.189023981", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/nextflow.config b/modules/nf-core/multiqc/tests/nextflow.config index c537a6a3..374dfef2 100644 --- a/modules/nf-core/multiqc/tests/nextflow.config +++ b/modules/nf-core/multiqc/tests/nextflow.config @@ -1,5 +1,6 @@ process { withName: 'MULTIQC' { ext.prefix = null + ext.args = '-p' } } diff --git a/nextflow.config b/nextflow.config index 846473f7..c09412f7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -32,7 +32,6 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false - hook_url = System.getenv('HOOK_URL') help = false help_full = false show_hidden = false @@ -53,6 +52,10 @@ params { validate_params = true } +// Backwards compatibility for publishDir syntax +outputDir = params.outdir +workflow.output.mode = params.publish_dir_mode + // Load base.config by default for all pipelines includeConfig 'conf/base.config' @@ -251,7 +254,7 @@ manifest { description = """A mapping-based pipeline for bacterial whole genome sequences""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=25.04.0' + nextflowVersion = '!>=25.10.4' version = '2.0.0' doi = '' } @@ -265,6 +268,5 @@ validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs } - // Load modules.config for DSL2 module specific options includeConfig 'conf/modules.config' diff --git a/nextflow_schema.json b/nextflow_schema.json index 31b7bd84..99d538bb 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -180,13 +180,6 @@ "fa_icon": "fas fa-palette", "hidden": true }, - "hook_url": { - "type": "string", - "description": "Incoming hook URL for messaging service", - "fa_icon": "fas fa-people-group", - "help_text": "Incoming hook URL for messaging service. Currently, MS Teams and Slack are supported.", - "hidden": true - }, "multiqc_config": { "type": "string", "format": "file-path", diff --git a/nf-test.config b/nf-test.config index 3a1fff59..f7aaeb4a 100644 --- a/nf-test.config +++ b/nf-test.config @@ -1,21 +1,35 @@ config { // location for all nf-test tests - testsDir "." + testsDir = "." // nf-test directory including temporary files for each test - workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" + workDir = System.getenv("NFT_WORKDIR") ?: ".nf-test" // location of an optional nextflow.config file specific for executing tests - configFile "tests/nextflow.config" + configFile = "tests/nextflow.config" // ignore tests coming from the nf-core/modules repo - ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' + ignore = [ + 'modules/nf-core/**/tests/*', + 'subworkflows/nf-core/**/tests/*', + ] // run all test with defined profile(s) from the main nextflow.config - profile "test" + profile = "test" // list of filenames or patterns that should be trigger a full test run - triggers 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore' + triggers = [ + '.github/actions/nf-test/action.yml', + '.github/workflows/nf-test.yml', + 'assets/schema_input.json', + 'bin/*', + 'conf/test.config', + 'nextflow.config', + 'nextflow_schema.json', + 'nf-test.config', + 'tests/.nftignore', + 'tests/nextflow.config', + ] // load the necessary plugins plugins { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 2ee7829f..7431874d 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -1,6 +1,6 @@ { "@context": [ - "https://w3id.org/ro/crate/1.1/context", + "https://w3id.org/ro/crate/1.2/context", { "GithubService": "https://w3id.org/ro/terms/test#GithubService", "JenkinsService": "https://w3id.org/ro/terms/test#JenkinsService", @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2025-11-20T09:31:27+00:00", - "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/bactmap)\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A525.04.0-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.5.1-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.5.1)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", + "datePublished": "2026-04-28T11:20:37+00:00", + "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/bactmap)\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A525.10.4-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-4.0.0-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.0)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/running/run-pipelines#using-parameter-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](docs/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#795d1994-0898-4e3b-a67c-2b16ead27603" + "@id": "#acb0799b-b60a-4126-ba7e-2537fa8673db" } ], "name": "nf-core/bactmap" @@ -112,7 +112,7 @@ }, "conformsTo": [ { - "@id": "https://w3id.org/ro/crate/1.1" + "@id": "https://w3id.org/ro/crate/1.2" }, { "@id": "https://w3id.org/workflowhub/workflow-ro-crate/1.0" @@ -122,13 +122,13 @@ { "@id": "main.nf", "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], - "creator": [ + "contributor": [ { - "@id": "#ajv37@shgb2monitor.vet.private.cam.ac.uk" + "@id": "#02992607-122e-4e25-8824-7729b32917bb" } ], "dateCreated": "", - "dateModified": "2025-11-20T09:31:27Z", + "dateModified": "2026-04-28T11:20:37Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -162,14 +162,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=25.04.0" + "version": "!>=25.10.4" }, { - "@id": "#795d1994-0898-4e3b-a67c-2b16ead27603", + "@id": "#acb0799b-b60a-4126-ba7e-2537fa8673db", "@type": "TestSuite", "instance": [ { - "@id": "#10ba78b5-e554-46c3-8eae-dc4e0f15d0fb" + "@id": "#f52b7c1c-1dfc-4a98-a719-2b8f96149798" } ], "mainEntity": { @@ -178,7 +178,7 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#10ba78b5-e554-46c3-8eae-dc4e0f15d0fb", + "@id": "#f52b7c1c-1dfc-4a98-a719-2b8f96149798", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", "resource": "repos/nf-core/bactmap/actions/workflows/nf-test.yml", @@ -307,10 +307,9 @@ "url": "https://nf-co.re/" }, { - "@id": "#ajv37@shgb2monitor.vet.private.cam.ac.uk", + "@id": "#02992607-122e-4e25-8824-7729b32917bb", "@type": "Person", - "email": "ajv37@shgb2monitor.vet.private.cam.ac.uk", - "name": "Andries Van Tonder" + "name": "Andries J. van Tonder" } ] } diff --git a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf index 8105008f..202484e5 100644 --- a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf @@ -14,7 +14,6 @@ include { samplesheetToList } from 'plugin/nf-schema' include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' -include { imNotification } from '../../nf-core/utils_nfcore_pipeline' include { UTILS_NFCORE_PIPELINE } from '../../nf-core/utils_nfcore_pipeline' include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' @@ -54,6 +53,9 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // + + def before_text = "" + def after_text = "" before_text = """ -\033[2m----------------------------------------------------\033[0m- \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m @@ -71,6 +73,10 @@ workflow PIPELINE_INITIALISATION { * Software dependencies https://github.com/nf-core/bactmap/blob/master/CITATIONS.md """ + if (monochrome_logs) { + before_text = before_text.replaceAll(/\033\[[0-9;]*m/, '') + } + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " UTILS_NFSCHEMA_PLUGIN ( @@ -102,7 +108,7 @@ workflow PIPELINE_INITIALISATION { // 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 (!fastq_2) { @@ -140,7 +146,6 @@ workflow PIPELINE_COMPLETION { plaintext_email // boolean: Send plain-text email instead of HTML outdir // path: Path to output directory where results will be published monochrome_logs // boolean: Disable ANSI colour codes in log output - hook_url // string: hook URL for notifications multiqc_report // string: Path to MultiQC report main: @@ -164,13 +169,11 @@ workflow PIPELINE_COMPLETION { } completionSummary(monochrome_logs) - if (hook_url) { - imNotification(summary_params, hook_url) - } + } workflow.onError { - log.error "Pipeline failed. Please refer to troubleshooting docs: https://nf-co.re/docs/usage/troubleshooting" + log.error "Pipeline failed. Please refer to troubleshooting docs for common issues: https://nf-co.re/docs/running/troubleshooting" } } diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index 2f30e9a4..afca5439 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -17,7 +17,7 @@ workflow UTILS_NFCORE_PIPELINE { checkProfileProvided(nextflow_cli_args) emit: - valid_config + valid_config = valid_config } /* @@ -353,67 +353,3 @@ def completionSummary(monochrome_logs=true) { log.info("-${colors.purple}[${workflow.manifest.name}]${colors.red} Pipeline completed with errors${colors.reset}-") } } - -// -// Construct and send a notification to a web server as JSON e.g. Microsoft Teams and Slack -// -def imNotification(summary_params, hook_url) { - def summary = [:] - summary_params - .keySet() - .sort() - .each { group -> - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['start'] = workflow.start - misc_fields['complete'] = workflow.complete - misc_fields['scriptfile'] = workflow.scriptFile - misc_fields['scriptid'] = workflow.scriptId - if (workflow.repository) { - misc_fields['repository'] = workflow.repository - } - if (workflow.commitId) { - misc_fields['commitid'] = workflow.commitId - } - if (workflow.revision) { - misc_fields['revision'] = workflow.revision - } - misc_fields['nxf_version'] = workflow.nextflow.version - misc_fields['nxf_build'] = workflow.nextflow.build - misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp - - def msg_fields = [:] - msg_fields['version'] = getWorkflowVersion() - msg_fields['runName'] = workflow.runName - msg_fields['success'] = workflow.success - msg_fields['dateComplete'] = workflow.complete - msg_fields['duration'] = workflow.duration - msg_fields['exitStatus'] = workflow.exitStatus - msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - msg_fields['errorReport'] = (workflow.errorReport ?: 'None') - msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") - msg_fields['projectDir'] = workflow.projectDir - msg_fields['summary'] = summary << misc_fields - - // Render the JSON template - def engine = new groovy.text.GStringTemplateEngine() - // Different JSON depending on the service provider - // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format - def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" - def hf = new File("${workflow.projectDir}/assets/${json_path}") - def json_template = engine.createTemplate(hf).make(msg_fields) - def json_message = json_template.toString() - - // POST - def post = new URL(hook_url).openConnection() - post.setRequestMethod("POST") - post.setDoOutput(true) - post.setRequestProperty("Content-Type", "application/json") - post.getOutputStream().write(json_message.getBytes("UTF-8")) - def postRC = post.getResponseCode() - if (!postRC.equals(200)) { - log.warn(post.getErrorStream().getText()) - } -} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test new file mode 100644 index 00000000..8940d32d --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test @@ -0,0 +1,29 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NFCORE_PIPELINE" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + workflow "UTILS_NFCORE_PIPELINE" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" + + test("Should run without failures") { + + when { + workflow { + """ + input[0] = [] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap new file mode 100644 index 00000000..859d1030 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap @@ -0,0 +1,19 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + true + ], + "valid_config": [ + true + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:25.726491" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index ee4738c8..1df8b76f 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -38,7 +38,7 @@ workflow UTILS_NFSCHEMA_PLUGIN { } log.info paramsHelp( help_options, - params.help instanceof String ? params.help : "", + (params.help instanceof String && params.help != "true") ? params.help : "", ) exit 0 } @@ -71,4 +71,3 @@ workflow UTILS_NFSCHEMA_PLUGIN { emit: dummy_emit = true } - diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 8d8c7371..f6537cc3 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,5 +1,5 @@ plugins { - id "nf-schema@2.5.1" + id "nf-schema@2.6.1" } validation { diff --git a/tests/default.nf.test b/tests/default.nf.test index 71d7ab93..5d5604e2 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -13,19 +13,19 @@ nextflow_pipeline { } then { - // stable_name: All files + folders in ${params.outdir}/ with a stable name - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + // stable_path: All files + folders in ${params.outdir}/ with a stable path (including file name) + def stable_path = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_content: All files in ${params.outdir}/ with stable content + def stable_content = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assert workflow.success assertAll( - { assert workflow.success}, { assert snapshot( // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/nf_core_bactmap_software_mqc_versions.yml"), // All stable path name, with a relative path - stable_name, + stable_path, // All files with stable contents - stable_path + stable_content ).match() } ) } diff --git a/tests/nextflow.config b/tests/nextflow.config index fbaf64d9..b5af4a72 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -8,7 +8,7 @@ // Or any resources requirements params { modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' - pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/bactmap' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/bactmap/' } aws.client.anonymous = true // fixes S3 access issues on self-hosted runners diff --git a/workflows/bactmap.nf b/workflows/bactmap.nf index c5f325ed..6c59d5ee 100644 --- a/workflows/bactmap.nf +++ b/workflows/bactmap.nf @@ -20,23 +20,25 @@ workflow BACTMAP { take: ch_samplesheet // channel: samplesheet read in from --input + multiqc_config + multiqc_logo + multiqc_methods_description + outdir + main: - ch_versions = channel.empty() - ch_multiqc_files = channel.empty() + def ch_versions = channel.empty() + def ch_multiqc_files = channel.empty() // // MODULE: Run FastQC // - FASTQC ( - ch_samplesheet - ) - ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}) - ch_versions = ch_versions.mix(FASTQC.out.versions.first()) + FASTQC(ch_samplesheet) + ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.map{ _meta, file -> file }) // // Collate and save software versions // - def topic_versions = Channel.topic("versions") + def topic_versions = channel.topic("versions") .distinct() .branch { entry -> versions_file: entry instanceof Path @@ -53,59 +55,43 @@ workflow BACTMAP { "${process}:\n${tool_versions.join('\n')}" } - softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + def ch_collated_versions = softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) .mix(topic_versions_string) .collectFile( - storeDir: "${params.outdir}/pipeline_info", + storeDir: "${outdir}/pipeline_info", name: 'nf_core_' + 'bactmap_software_' + 'mqc_' + 'versions.yml', sort: true, newLine: true - ).set { ch_collated_versions } - + ) // // MODULE: MultiQC // - ch_multiqc_config = channel.fromPath( - "$projectDir/assets/multiqc_config.yml", checkIfExists: true) - ch_multiqc_custom_config = params.multiqc_config ? - channel.fromPath(params.multiqc_config, checkIfExists: true) : - channel.empty() - ch_multiqc_logo = params.multiqc_logo ? - channel.fromPath(params.multiqc_logo, checkIfExists: true) : - channel.empty() - - summary_params = paramsSummaryMap( - workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) - ch_multiqc_files = ch_multiqc_files.mix( - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_custom_methods_description = params.multiqc_methods_description ? - file(params.multiqc_methods_description, checkIfExists: true) : - file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = channel.value( - methodsDescriptionText(ch_multiqc_custom_methods_description)) - ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) - ch_multiqc_files = ch_multiqc_files.mix( - ch_methods_description.collectFile( - name: 'methods_description_mqc.yaml', - sort: true - ) - ) - - MULTIQC ( - ch_multiqc_files.collect(), - ch_multiqc_config.toList(), - ch_multiqc_custom_config.toList(), - ch_multiqc_logo.toList(), - [], - [] + def ch_summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") + def ch_workflow_summary = channel.value(paramsSummaryMultiqc(ch_summary_params)) + ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + def ch_multiqc_custom_methods_description = multiqc_methods_description + ? file(multiqc_methods_description, checkIfExists: true) + : file("${projectDir}/assets/methods_description_template.yml", checkIfExists: true) + def ch_methods_description = channel.value(methodsDescriptionText(ch_multiqc_custom_methods_description)) + ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml', sort: true)) + MULTIQC( + ch_multiqc_files.flatten().collect().map { files -> + [ + [id: 'bactmap'], + files, + multiqc_config + ? file(multiqc_config, checkIfExists: true) + : file("${projectDir}/assets/multiqc_config.yml", checkIfExists: true), + multiqc_logo ? file(multiqc_logo, checkIfExists: true) : [], + [], + [], + ] + } ) - - emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + emit:multiqc_report = MULTIQC.out.report.map { _meta, report -> [report] }.toList() // channel: /path/to/multiqc_report.html versions = ch_versions // channel: [ path(versions.yml) ] - } /* From 9ea5b4562e3a962f083e192e1c6cf1d708d28db2 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 30 Apr 2026 13:32:43 +0000 Subject: [PATCH 7/7] Template update for nf-core/tools version 4.0.2 --- .github/workflows/download_pipeline.yml | 8 +++++--- .github/workflows/fix_linting.yml | 2 +- .github/workflows/linting.yml | 2 +- .github/workflows/linting_comment.yml | 2 +- .nf-core.yml | 2 +- README.md | 2 +- nextflow_schema.json | 1 - ro-crate-metadata.json | 18 +++++++++--------- 8 files changed, 19 insertions(+), 18 deletions(-) diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 5b6592c1..a7bf4fc2 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -38,6 +38,9 @@ jobs: runs-on: ubuntu-latest needs: configure steps: + - name: Check out pipeline code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - name: Install Nextflow uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 @@ -55,10 +58,9 @@ jobs: apptainer-version: 1.3.4 - name: Read .nf-core.yml - uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 id: read_yml - with: - config: ${{ github.workspace }}/.nf-core.yml + run: | + echo "nf_core_version=$(yq '.nf_core_version' ${{ github.workspace }}/.nf-core.yml)" >> "$GITHUB_OUTPUT" - name: Install dependencies run: | diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index 25413548..439b4ce0 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -37,7 +37,7 @@ jobs: # Install and run prek - name: Run prek id: prek - uses: j178/prek-action@cbc2f23eb5539cf20d82d1aabd0d0ecbcc56f4e3 # v2 + uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # v2 continue-on-error: true # indication that the linting has finished diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index bfe46c98..8738ffc9 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -17,7 +17,7 @@ jobs: uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - name: Run prek - uses: j178/prek-action@cbc2f23eb5539cf20d82d1aabd0d0ecbcc56f4e3 # v2 + uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # v2 nf-core: runs-on: ubuntu-latest diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 2bc3c07f..5b0c24f7 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@8305c0f1062bb0d184d09ef4493ecb9288447732 # v20 + uses: dawidd6/action-download-artifact@b6e2e70617bc3265edd6dab6c906732b2f1ae151 # v21 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.nf-core.yml b/.nf-core.yml index b9cd1c4c..c99f6a3a 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 4.0.0 +nf_core_version: 4.0.2 repository_type: pipeline template: author: Andries J. van Tonder diff --git a/README.md b/README.md index d92379d5..64bf4d5d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ [![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%A525.10.4-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-4.0.0-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.0) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-4.0.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/4.0.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/nextflow_schema.json b/nextflow_schema.json index 99d538bb..8e7f7d22 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -74,7 +74,6 @@ }, "igenomes_base": { "type": "string", - "format": "directory-path", "description": "The base path to the igenomes reference files", "fa_icon": "fas fa-ban", "hidden": true, diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 7431874d..8e8722b7 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2026-04-28T11:20:37+00:00", - "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/bactmap)\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A525.10.4-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-4.0.0-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.0)\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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/running/run-pipelines#using-parameter-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](docs/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", + "datePublished": "2026-04-30T13:32:35+00:00", + "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/bactmap)\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A525.10.4-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-4.0.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/4.0.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[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/running/run-pipelines#using-parameter-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](docs/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\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\nYou can cite the `nf-core` publication as follows:\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", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#acb0799b-b60a-4126-ba7e-2537fa8673db" + "@id": "#05dad43b-07ff-4882-ae31-d68dcf6db172" } ], "name": "nf-core/bactmap" @@ -124,11 +124,11 @@ "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], "contributor": [ { - "@id": "#02992607-122e-4e25-8824-7729b32917bb" + "@id": "#99b3fdc4-53f2-4ca2-a3a3-386cdabbba7f" } ], "dateCreated": "", - "dateModified": "2026-04-28T11:20:37Z", + "dateModified": "2026-04-30T13:32:35Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -165,11 +165,11 @@ "version": "!>=25.10.4" }, { - "@id": "#acb0799b-b60a-4126-ba7e-2537fa8673db", + "@id": "#05dad43b-07ff-4882-ae31-d68dcf6db172", "@type": "TestSuite", "instance": [ { - "@id": "#f52b7c1c-1dfc-4a98-a719-2b8f96149798" + "@id": "#2a4f22ac-657f-4399-ae40-11b4cd8580af" } ], "mainEntity": { @@ -178,7 +178,7 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#f52b7c1c-1dfc-4a98-a719-2b8f96149798", + "@id": "#2a4f22ac-657f-4399-ae40-11b4cd8580af", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", "resource": "repos/nf-core/bactmap/actions/workflows/nf-test.yml", @@ -307,7 +307,7 @@ "url": "https://nf-co.re/" }, { - "@id": "#02992607-122e-4e25-8824-7729b32917bb", + "@id": "#99b3fdc4-53f2-4ca2-a3a3-386cdabbba7f", "@type": "Person", "name": "Andries J. van Tonder" }