From 4bd10d5e11c526e29a0c41917e3898b983eeef1d Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 6 May 2026 08:55:02 +0100 Subject: [PATCH 1/9] feat(template): add axis-decomposed process_cpus_* / process_mem_* labels Introduces a parallel set of resource labels that decompose along the cpu and memory axes, so a process can express its shape independently: process_cpus_{single,low,medium,high} - cpus only process_mem_{low,medium,high} - memory only Stack one of each (and optionally a time-only label like process_long) on a process. The combined labels (process_single, process_low, process_medium, process_high, process_high_memory) stay in place for backwards compatibility while the ecosystem migrates; deprecation will follow in a separate PR once enough downstream pipelines / configs have adopted the new scheme. Why: the existing combined labels couple cpus and memory at fixed ratios (e.g. process_high = 12 cpus + 72 GB), which is wrong for tools that are cpu-bound but memory-light (Rust streaming binaries, e.g. trim_galore 2.x at ~100 MB peak_rss) or vice versa. Splitting the axes lets module authors pick each independently and stops over-allocating on one axis to get headroom on the other. --- CHANGELOG.md | 2 ++ nf_core/components/create.py | 9 ++++++ nf_core/modules/lint/main_nf.py | 9 ++++++ nf_core/pipeline-template/conf/base.config | 34 ++++++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c24613366d..3777a0c590 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ - accept `process_low_memory` as a standard module label ([#4264](https://github.com/nf-core/tools/pull/4264)) - improve linting for `modules.json` to add support for only installing subworkflows from a repository and provide more explicit error messages ([#4287](https://github.com/nf-core/tools/pull/4287)) - improve singularity_tag linting check (add skip, handle exceptions correctly, check against oras) ([#4358](https://github.com/nf-core/tools/pull/4358)) +- accept axis-decomposed `process_cpus_*` and `process_mem_*` labels alongside the legacy combined labels ([#XXXX](https://github.com/nf-core/tools/pull/XXXX)) ### Modules @@ -33,6 +34,7 @@ - fix dead link ([#4307](https://github.com/nf-core/tools/pull/4307)) - remove date placeholder from changelog title ([#4333](https://github.com/nf-core/tools/pull/4333)) - Fix publishDir configuration in modules.config for multiqc ([#4347](https://github.com/nf-core/tools/pull/4347)) +- add axis-decomposed `process_cpus_{single,low,medium,high}` and `process_mem_{low,medium,high}` labels to `base.config`; legacy combined labels remain in place pending deprecation ([#XXXX](https://github.com/nf-core/tools/pull/XXXX)) #### Version updates diff --git a/nf_core/components/create.py b/nf_core/components/create.py index 78e1c5f7d7..867c10d730 100644 --- a/nf_core/components/create.py +++ b/nf_core/components/create.py @@ -244,6 +244,15 @@ def _get_bioconda_tool(self): def _get_module_structure_components(self): process_label_defaults = [ + # Axis-decomposed labels (preferred) + "process_cpus_single", + "process_cpus_low", + "process_cpus_medium", + "process_cpus_high", + "process_mem_low", + "process_mem_medium", + "process_mem_high", + # Legacy combined labels (kept for backwards compatibility, to be deprecated) "process_single", "process_low", "process_medium", diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index e4b791f70a..7c280615df 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -558,6 +558,15 @@ def check_process_name_format(self, process_name, component_name): def check_process_labels(self, lines): correct_process_labels = [ + # Axis-decomposed labels (preferred) + "process_cpus_single", + "process_cpus_low", + "process_cpus_medium", + "process_cpus_high", + "process_mem_low", + "process_mem_medium", + "process_mem_high", + # Legacy combined labels (kept for backwards compatibility, to be deprecated) "process_single", "process_low", "process_medium", diff --git a/nf_core/pipeline-template/conf/base.config b/nf_core/pipeline-template/conf/base.config index 4d9519d8fd..5af328e22e 100644 --- a/nf_core/pipeline-template/conf/base.config +++ b/nf_core/pipeline-template/conf/base.config @@ -26,6 +26,40 @@ process { // adding in your local modules too. // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + + // + // Axis-decomposed labels (preferred). Stack one cpus_* and one mem_* label + // (and optionally a time-only label) on a process to express its resource + // shape independently along each axis. e.g. a cpu-bound, memory-light tool + // can use `process_cpus_high` + `process_mem_low`. + // + withLabel:process_cpus_single { + cpus = { 1 } + } + withLabel:process_cpus_low { + cpus = { 2 * task.attempt } + } + withLabel:process_cpus_medium { + cpus = { 6 * task.attempt } + } + withLabel:process_cpus_high { + cpus = { 12 * task.attempt } + } + withLabel:process_mem_low { + memory = { 1.GB * task.attempt } + } + withLabel:process_mem_medium { + memory = { 12.GB * task.attempt } + } + withLabel:process_mem_high { + memory = { 72.GB * task.attempt } + } + + // + // Legacy combined labels. Kept for backwards compatibility while the + // ecosystem migrates to the axis-decomposed labels above; these will be + // deprecated in a future release. + // withLabel:process_single { cpus = { 1 } memory = { 6.GB * task.attempt } From 1b2e855845fad258ee87bbac1375dd48d3a74fef Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 6 May 2026 08:55:53 +0100 Subject: [PATCH 2/9] docs(changelog): fill in PR number --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3777a0c590..79af28b7f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - improve linting for `modules.json` to add support for only installing subworkflows from a repository and provide more explicit error messages ([#4287](https://github.com/nf-core/tools/pull/4287)) - improve singularity_tag linting check (add skip, handle exceptions correctly, check against oras) ([#4358](https://github.com/nf-core/tools/pull/4358)) - accept axis-decomposed `process_cpus_*` and `process_mem_*` labels alongside the legacy combined labels ([#XXXX](https://github.com/nf-core/tools/pull/XXXX)) +- accept axis-decomposed `process_cpus_*` and `process_mem_*` labels alongside the legacy combined labels ([#4265](https://github.com/nf-core/tools/pull/4265)) ### Modules @@ -35,6 +36,7 @@ - remove date placeholder from changelog title ([#4333](https://github.com/nf-core/tools/pull/4333)) - Fix publishDir configuration in modules.config for multiqc ([#4347](https://github.com/nf-core/tools/pull/4347)) - add axis-decomposed `process_cpus_{single,low,medium,high}` and `process_mem_{low,medium,high}` labels to `base.config`; legacy combined labels remain in place pending deprecation ([#XXXX](https://github.com/nf-core/tools/pull/XXXX)) +- add axis-decomposed `process_cpus_{single,low,medium,high}` and `process_mem_{low,medium,high}` labels to `base.config`; legacy combined labels remain in place pending deprecation ([#4265](https://github.com/nf-core/tools/pull/4265)) #### Version updates From bc4fc0fcf49d22e8b7e513aeca3fbfd05904ccbf Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 6 May 2026 09:01:12 +0100 Subject: [PATCH 3/9] feat(template): add process_time_{short,medium,long} time axis Completes the axis-decomposed scheme: alongside cpus_* and mem_*, a process can now also pin its time budget independently. Values: process_time_short = 1.h * task.attempt process_time_medium = 8.h * task.attempt process_time_long = 20.h * task.attempt short = 1.h is a meaningful step down from the 4.h template default for fast tools (streaming utilities, QC, samtools view), and lets schedulers route them to short-queue priority pools. medium / long match the existing process_medium and process_long values exactly, so module authors migrating from those don't change their effective time budget. The existing process_long label stays in the legacy block; it has the same value as process_time_long but removing it would break pipelines, so it deprecates on the same slow-deprecation timeline as the other combined labels. --- CHANGELOG.md | 2 ++ nf_core/components/create.py | 3 +++ nf_core/modules/lint/main_nf.py | 3 +++ nf_core/pipeline-template/conf/base.config | 17 +++++++++++++---- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79af28b7f0..5fe3fa3ab6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - improve singularity_tag linting check (add skip, handle exceptions correctly, check against oras) ([#4358](https://github.com/nf-core/tools/pull/4358)) - accept axis-decomposed `process_cpus_*` and `process_mem_*` labels alongside the legacy combined labels ([#XXXX](https://github.com/nf-core/tools/pull/XXXX)) - accept axis-decomposed `process_cpus_*` and `process_mem_*` labels alongside the legacy combined labels ([#4265](https://github.com/nf-core/tools/pull/4265)) +- accept axis-decomposed `process_cpus_*`, `process_mem_*` and `process_time_*` labels alongside the legacy combined labels ([#4265](https://github.com/nf-core/tools/pull/4265)) ### Modules @@ -37,6 +38,7 @@ - Fix publishDir configuration in modules.config for multiqc ([#4347](https://github.com/nf-core/tools/pull/4347)) - add axis-decomposed `process_cpus_{single,low,medium,high}` and `process_mem_{low,medium,high}` labels to `base.config`; legacy combined labels remain in place pending deprecation ([#XXXX](https://github.com/nf-core/tools/pull/XXXX)) - add axis-decomposed `process_cpus_{single,low,medium,high}` and `process_mem_{low,medium,high}` labels to `base.config`; legacy combined labels remain in place pending deprecation ([#4265](https://github.com/nf-core/tools/pull/4265)) +- add axis-decomposed `process_cpus_{single,low,medium,high}`, `process_mem_{low,medium,high}` and `process_time_{short,medium,long}` labels to `base.config`; legacy combined labels remain in place pending deprecation ([#4265](https://github.com/nf-core/tools/pull/4265)) #### Version updates diff --git a/nf_core/components/create.py b/nf_core/components/create.py index 867c10d730..6c346d9ca1 100644 --- a/nf_core/components/create.py +++ b/nf_core/components/create.py @@ -252,6 +252,9 @@ def _get_module_structure_components(self): "process_mem_low", "process_mem_medium", "process_mem_high", + "process_time_short", + "process_time_medium", + "process_time_long", # Legacy combined labels (kept for backwards compatibility, to be deprecated) "process_single", "process_low", diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index 7c280615df..b90ec6fab3 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -566,6 +566,9 @@ def check_process_labels(self, lines): "process_mem_low", "process_mem_medium", "process_mem_high", + "process_time_short", + "process_time_medium", + "process_time_long", # Legacy combined labels (kept for backwards compatibility, to be deprecated) "process_single", "process_low", diff --git a/nf_core/pipeline-template/conf/base.config b/nf_core/pipeline-template/conf/base.config index 5af328e22e..6ff7c2f87f 100644 --- a/nf_core/pipeline-template/conf/base.config +++ b/nf_core/pipeline-template/conf/base.config @@ -28,10 +28,10 @@ process { // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors // - // Axis-decomposed labels (preferred). Stack one cpus_* and one mem_* label - // (and optionally a time-only label) on a process to express its resource - // shape independently along each axis. e.g. a cpu-bound, memory-light tool - // can use `process_cpus_high` + `process_mem_low`. + // Axis-decomposed labels (preferred). Stack one cpus_*, one mem_*, and + // one time_* label on a process to express its resource shape + // independently along each axis. e.g. a cpu-bound, memory-light, fast + // tool can use `process_cpus_high` + `process_mem_low` + `process_time_short`. // withLabel:process_cpus_single { cpus = { 1 } @@ -54,6 +54,15 @@ process { withLabel:process_mem_high { memory = { 72.GB * task.attempt } } + withLabel:process_time_short { + time = { 1.h * task.attempt } + } + withLabel:process_time_medium { + time = { 8.h * task.attempt } + } + withLabel:process_time_long { + time = { 20.h * task.attempt } + } // // Legacy combined labels. Kept for backwards compatibility while the From b5b8ce0d1a272966a59b89ab2a2ff316a4555435 Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 13 May 2026 15:57:44 +0200 Subject: [PATCH 4/9] add deprecation warning and handle multiple labels correctly # Conflicts: # tests/modules/lint/test_main_nf.py --- nf_core/modules/lint/main_nf.py | 38 +++++++++++++++++++++++++----- tests/modules/lint/test_main_nf.py | 30 +++++++++++++---------- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index b90ec6fab3..8fd17faab4 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -569,7 +569,8 @@ def check_process_labels(self, lines): "process_time_short", "process_time_medium", "process_time_long", - # Legacy combined labels (kept for backwards compatibility, to be deprecated) + ] + legacy_process_labels = [ "process_single", "process_low", "process_medium", @@ -581,6 +582,7 @@ def check_process_labels(self, lines): all_labels = [line.strip() for line in lines if line.lstrip().startswith("label ")] bad_labels = [] good_labels = [] + legacy_labels = [] if len(all_labels) > 0: for label in all_labels: try: @@ -595,23 +597,47 @@ def check_process_labels(self, lines): ) ) continue - if label not in correct_process_labels: + if label not in correct_process_labels and label not in legacy_process_labels: bad_labels.append(label) + if label in legacy_process_labels: + legacy_labels.append(label) else: good_labels.append(label) - if len(good_labels) > 1: + axes = [label.split("_")[1] for label in good_labels if len(label.split("_")) > 1] + if len(axes) != len(set(axes)): + conflicting = [ + label + for label in good_labels + if axes.count(label.split("_")[1] if len(label.split("_")) > 1 else "") > 1 + ] self.warned.append( ( "main_nf", "process_standard_label", - f"Conflicting process labels found: `{'`,`'.join(good_labels)}`", + f"Conflicting process labels found: `{'`,`'.join(conflicting)}`", + self.main_nf, + ) + ) + elif good_labels: + self.passed.append( + ( + "main_nf", + "process_standard_label", + f"Correct process labels: `{'`,`'.join(good_labels)}`", self.main_nf, ) ) - elif len(good_labels) == 1: - self.passed.append(("main_nf", "process_standard_label", "Correct process label", self.main_nf)) else: self.warned.append(("main_nf", "process_standard_label", "Standard process label not found", self.main_nf)) + if legacy_labels: + self.warned.append( + ( + "main_nf", + "process_standard_label", + f"Deprecated process labels found: `{'`,`'.join(legacy_labels)}`. Use the new standard labels instead: https://nf-co.re/docs/developing/migration-guides/resource-labels", + self.main_nf, + ) + ) if len(bad_labels) > 0: self.warned.append( ( diff --git a/tests/modules/lint/test_main_nf.py b/tests/modules/lint/test_main_nf.py index 0893987d67..a01715f220 100644 --- a/tests/modules/lint/test_main_nf.py +++ b/tests/modules/lint/test_main_nf.py @@ -67,19 +67,25 @@ def test_process_name_format(process_name, component_name, passed, warned, faile @pytest.mark.parametrize( "content,passed,warned,failed", [ - # Valid process label - ("label 'process_high'\ncpus 12", 1, 0, 0), - # Non-alphanumeric characters in label + # Valid new-style axis-decomposed label + ("label 'process_cpus_high'\ncpus 12", 1, 0, 0), + # Multiple axis-decomposed labels on different axes — allowed + ("label 'process_cpus_high'\nlabel 'process_mem_low'\ncpus 12", 1, 0, 0), + # Same axis twice — conflict + ("label 'process_cpus_high'\nlabel 'process_cpus_low'\ncpus 12", 0, 1, 0), + # Legacy label warns (no new-style label present, so also warns "not found") + ("label 'process_high'\ncpus 12", 0, 2, 0), + # Two legacy labels warn legacy + not-found (distinct, so no dup warn) + ("label 'process_high'\nlabel 'process_low'\ncpus 12", 0, 2, 0), + # Duplicate legacy labels: not-found + legacy + duplicate + ("label 'process_high'\nlabel 'process_high'\ncpus 12", 0, 3, 0), + # Non-alphanumeric characters in label: non-alphanumeric warn + not-found warn ("label 'a:label:with:colons'\ncpus 12", 0, 2, 0), - # Conflicting labels - ("label 'process_high'\nlabel 'process_low'\ncpus 12", 0, 1, 0), - # Duplicate labels - ("label 'process_high'\nlabel 'process_high'\ncpus 12", 0, 2, 0), - # Valid and non-standard labels - ("label 'process_high'\nlabel 'process_extra_label'\ncpus 12", 1, 1, 0), - # Non-standard label only - ("label 'process_extra_label'\ncpus 12", 0, 2, 0), - # Non-standard duplicates without quotes + # Non-standard (bad) label only: passes axis check but warns non-standard + ("label 'process_extra_label'\ncpus 12", 1, 1, 0), + # Legacy + non-standard: passes axis check, warns legacy and non-standard + ("label 'process_high'\nlabel 'process_extra_label'\ncpus 12", 1, 2, 0), + # Non-standard duplicates without quotes: conflict + non-standard + duplicate ("label process_extra_label\nlabel process_extra_label\ncpus 12", 0, 3, 0), # No label found ("cpus 12", 0, 1, 0), From 0347c465f17d7b27ba24cf87b8ae0110bf03de2d Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 13 May 2026 15:58:07 +0200 Subject: [PATCH 5/9] fix pyright warnings --- nf_core/modules/lint/main_nf.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index 8fd17faab4..a8e840196e 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -8,6 +8,7 @@ from rich.progress import Progress +import nf_core.utils from nf_core.components.components_differ import ComponentsDiffer from nf_core.components.nfcore_component import NFCoreComponent from nf_core.modules.lint.meta_yml import _load_skip_nf_test_sets @@ -69,7 +70,26 @@ def main_nf( equal the number of ``emit:`` outputs whose name starts with ``versions``. A warning is issued if a legacy YAML-based ``versions`` emit is used instead of a topic output. - + * ``process_standard_label``: Process labels should follow the standard format. + A warning is issued if a legacy label is used. Allowed standard labels are: + "process_cpus_single", + "process_cpus_low", + "process_cpus_medium", + "process_cpus_high", + "process_mem_low", + "process_mem_medium", + "process_mem_high", + "process_time_short", + "process_time_medium", + "process_time_long" + Legacy labels are: + "process_single", + "process_low", + "process_medium", + "process_high", + "process_long", + "process_low_memory", + "process_high_memory" """ inputs: list[str] = [] @@ -585,9 +605,8 @@ def check_process_labels(self, lines): legacy_labels = [] if len(all_labels) > 0: for label in all_labels: - try: - label = re.match(r"^label\s+'?\"?([a-zA-Z0-9_-]+)'?\"?$", label).group(1) - except AttributeError: + match = re.match(r"^label\s+'?\"?([a-zA-Z0-9_-]+)'?\"?$", label) + if match is None: self.warned.append( ( "main_nf", @@ -597,6 +616,7 @@ def check_process_labels(self, lines): ) ) continue + label = match.group(1) if label not in correct_process_labels and label not in legacy_process_labels: bad_labels.append(label) if label in legacy_process_labels: From 8c1ffa009f13d82bdbb2f95ee51474f336a42ca8 Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 13 May 2026 16:06:02 +0200 Subject: [PATCH 6/9] fix warning message order --- nf_core/modules/lint/main_nf.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index a8e840196e..771a6f5b13 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -647,17 +647,17 @@ def check_process_labels(self, lines): self.main_nf, ) ) - else: - self.warned.append(("main_nf", "process_standard_label", "Standard process label not found", self.main_nf)) - if legacy_labels: + elif legacy_labels: self.warned.append( ( "main_nf", "process_standard_label", - f"Deprecated process labels found: `{'`,`'.join(legacy_labels)}`. Use the new standard labels instead: https://nf-co.re/docs/developing/migration-guides/resource-labels", + f"Deprecated process label found: `{legacy_labels[0]}`. Use the new standard labels instead: https://nf-co.re/docs/developing/migration-guides/resource-labels", self.main_nf, ) ) + else: + self.warned.append(("main_nf", "process_standard_label", "Standard process label not found", self.main_nf)) if len(bad_labels) > 0: self.warned.append( ( @@ -676,6 +676,7 @@ def check_process_labels(self, lines): self.main_nf, ) ) + else: self.warned.append(("main_nf", "process_standard_label", "Process label not specified", self.main_nf)) From 4d7fc91f798bb79aafbab94c913a4abd0fedb640 Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 13 May 2026 17:12:21 +0200 Subject: [PATCH 7/9] fix test logic --- nf_core/modules/lint/main_nf.py | 18 +++++++++--------- tests/modules/lint/test_main_nf.py | 6 +++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index 771a6f5b13..6d70eccd6c 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -623,6 +623,15 @@ def check_process_labels(self, lines): legacy_labels.append(label) else: good_labels.append(label) + if legacy_labels: + self.warned.append( + ( + "main_nf", + "process_standard_label", + f"Deprecated process label found: `{legacy_labels[0]}`. Use the new standard labels instead: https://nf-co.re/docs/developing/migration-guides/resource-labels", + self.main_nf, + ) + ) axes = [label.split("_")[1] for label in good_labels if len(label.split("_")) > 1] if len(axes) != len(set(axes)): conflicting = [ @@ -647,15 +656,6 @@ def check_process_labels(self, lines): self.main_nf, ) ) - elif legacy_labels: - self.warned.append( - ( - "main_nf", - "process_standard_label", - f"Deprecated process label found: `{legacy_labels[0]}`. Use the new standard labels instead: https://nf-co.re/docs/developing/migration-guides/resource-labels", - self.main_nf, - ) - ) else: self.warned.append(("main_nf", "process_standard_label", "Standard process label not found", self.main_nf)) if len(bad_labels) > 0: diff --git a/tests/modules/lint/test_main_nf.py b/tests/modules/lint/test_main_nf.py index a01715f220..3ae03df5b7 100644 --- a/tests/modules/lint/test_main_nf.py +++ b/tests/modules/lint/test_main_nf.py @@ -392,7 +392,11 @@ def test_topics_and_emits_version_check(self): module_lint = nf_core.modules.lint.ModuleLint(directory=self.pipeline_dir) module_lint.lint(print_results=False, module="bamstats/generalstats") assert len(module_lint.failed) == 0, f"Linting failed with {[x.__dict__ for x in module_lint.failed]}" - # assert len(module_lint.warned) == 0, f"Expected 0 warnings, got {[x.__dict__ for x in module_lint.warned]}" + # TODO: once modules are migrated to axis-decomposed labels, remove the filter and assert len(module_lint.warned) == 0 + non_label_warned = [w for w in module_lint.warned if w.lint_test != "process_standard_label"] + assert len(non_label_warned) == 0, ( + f"Expected 0 non-label warnings, got {[x.__dict__ for x in non_label_warned]}" + ) assert len(module_lint.passed) > 0 From db5afd1782a91042e5197da177ae0716e522fe61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20H=C3=B6rtenhuber?= Date: Tue, 30 Jun 2026 10:17:47 +0200 Subject: [PATCH 8/9] Update nf_core/pipeline-template/conf/base.config Co-authored-by: James A. Fellows Yates --- nf_core/pipeline-template/conf/base.config | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/nf_core/pipeline-template/conf/base.config b/nf_core/pipeline-template/conf/base.config index 6ff7c2f87f..b786fe26dc 100644 --- a/nf_core/pipeline-template/conf/base.config +++ b/nf_core/pipeline-template/conf/base.config @@ -28,10 +28,12 @@ process { // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors // - // Axis-decomposed labels (preferred). Stack one cpus_*, one mem_*, and - // one time_* label on a process to express its resource shape - // independently along each axis. e.g. a cpu-bound, memory-light, fast - // tool can use `process_cpus_high` + `process_mem_low` + `process_time_short`. + // Resource labels for independently controlling the default amount + // of CPUs, memory, and time requests a process makes to a scheduler. + // + // TODO nf-core: adjust all CPU, memory, and time resource requests to work with 'average' data for the pipeline. + // Default resource usage limits are intentionally generous and are may not be suitable. + // It is highly recommended to modify these settings to suit your pipeline. // withLabel:process_cpus_single { cpus = { 1 } From f7c7dee79cffce4e282bfa5cac54cd77702bef75 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 30 Jun 2026 10:30:51 +0200 Subject: [PATCH 9/9] fix linting --- nf_core/modules/lint/main_nf.py | 1 - nf_core/pipeline-template/conf/base.config | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index 6d70eccd6c..5804689e52 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -8,7 +8,6 @@ from rich.progress import Progress -import nf_core.utils from nf_core.components.components_differ import ComponentsDiffer from nf_core.components.nfcore_component import NFCoreComponent from nf_core.modules.lint.meta_yml import _load_skip_nf_test_sets diff --git a/nf_core/pipeline-template/conf/base.config b/nf_core/pipeline-template/conf/base.config index b786fe26dc..a1ad2b7938 100644 --- a/nf_core/pipeline-template/conf/base.config +++ b/nf_core/pipeline-template/conf/base.config @@ -28,11 +28,11 @@ process { // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors // - // Resource labels for independently controlling the default amount + // Resource labels for independently controlling the default amount // of CPUs, memory, and time requests a process makes to a scheduler. // // TODO nf-core: adjust all CPU, memory, and time resource requests to work with 'average' data for the pipeline. - // Default resource usage limits are intentionally generous and are may not be suitable. + // Default resource usage limits are intentionally generous and are may not be suitable. // It is highly recommended to modify these settings to suit your pipeline. // withLabel:process_cpus_single {