Skip to content

Commit b4605c4

Browse files
authored
Merge pull request #1840 from nf-core/address-vag-1838-feedback
Address review feedback from #1838 (Vag)
2 parents 97864ae + a1e4ca3 commit b4605c4

10 files changed

Lines changed: 114 additions & 65 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Special thanks to the following for their contributions to the release:
3838
- [PR #1836](https://github.com/nf-core/rnaseq/pull/1836) - Reinstall `trimgalore` module to pick up upstream label change (`process_high``process_medium` + `process_low_memory`); add the matching `process_low_memory` definition (1 GB) to `conf/base.config` per the nf-core/tools template
3939
- [PR #1837](https://github.com/nf-core/rnaseq/pull/1837) - Bump version to 3.26.0 ahead of release
4040
- [PR #1839](https://github.com/nf-core/rnaseq/pull/1839) - Address review feedback from #1838: condense the two large `strandCheckSummaryYaml` JSON snapshots in `multiqc_rnaseq` function tests to `.md5()`; add this Software dependencies subsection summarising tool version bumps in 3.26.0
41+
- [PR #1840](https://github.com/nf-core/rnaseq/pull/1840) - Address further review feedback from #1838: lowercase `Channel.x``channel.x` in local test files and `workflows/rnaseq/main.nf`; pin `params.outdir` in the `PIPELINE_COMPLETION` test so Nextflow execution reports land in the nf-test sandbox instead of a literal `null/pipeline_info/` directory; populate the previously empty "Pipeline specific contribution guidelines" section in `docs/CONTRIBUTING.md` with rnaseq-specific notes (test profiles, CI skip env vars, `.nftignore`, snapshots, version-reporting topic, module configs)
4142

4243
### Software dependencies
4344

docs/CONTRIBUTING.md

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,46 @@ If you update images or graphics, follow the nf-core [style guidelines](https://
185185

186186
## Pipeline specific contribution guidelines
187187

188-
<!-- TODO nf-core: Add any pipeline specific contribution guidelines here, such as coding styles, procedures, checklists etc. -->
188+
A few conventions that are specific to nf-core/rnaseq and tend to surprise new contributors:
189+
190+
#### Test profiles
191+
192+
The pipeline ships three test profile families: `test` (CPU smoke test, ~15 GB resourceLimits), `test_prokaryotic` (composes on top of `test`, swaps in the bacterial/archaeal samplesheet and `bowtie2_salmon` aligner), and `test_gpu` (~30 GB resourceLimits for GPU CI). `nf-test.config` deliberately does **not** set a default profile - you must always pass one explicitly (e.g. `--profile +test,docker`).
193+
194+
GPU/license-server-bound CI cases are gated on env vars so they don't run by default on contributor laptops:
195+
196+
- `SKIP_GPU=1` skips Parabricks and GPU ribodetector tests
197+
- `SKIP_SENTIEON=1` skips Sentieon STAR tests
198+
- `SKIP_PARABRICKS=1` is a finer-grained subset of `SKIP_GPU`
199+
200+
#### Test data
201+
202+
Eukaryotic test data is pulled from the iGenomes S3 mirror (`pipelines_testdata_base_path = s3://ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/`); prokaryotic test data is pulled from `nf-core/test-datasets` on GitHub (Salmonella SL1344 subset). Both are pinned in `conf/test.config` and `conf/test_prokaryotic.config`; if you need to add a new fixture, prefer extending one of those rather than introducing a new bucket.
203+
204+
#### nf-core modules and subworkflows
205+
206+
Modules and subworkflows under `modules/nf-core/` and `subworkflows/nf-core/` are managed by the nf-core tooling - install or update them with `nf-core modules install` / `nf-core subworkflows update`, do **not** edit them directly. Edits should go through a PR to [nf-core/modules](https://github.com/nf-core/modules) first; the pipeline then picks up the new SHA via a `modules.json` bump. Pipeline-specific code (anything not portable to other pipelines) lives under `modules/local/` and `subworkflows/local/`.
207+
208+
#### Module configs
209+
210+
Per-tool publishDir, ext.args, and ext.prefix settings are split into one file per logical group under `conf/modules/` (e.g. `conf/modules/align_star.config`, `conf/modules/quantify_rsem.config`) and included from `nextflow.config`. When you add a new local module, add or extend the matching file rather than dropping settings into `nextflow.config` directly.
211+
212+
#### Version reporting
213+
214+
Modules emit their versions onto the `versions` channel topic so the calling workflow does not have to thread a `ch_versions` through every process (PR #1689). Modules that still also declare a `path "versions.yml", emit: versions` output do so because they are templated (the `.r`/`.py` template script writes the YAML); those modules populate the topic too and don't need migrating - leave them alone.
215+
216+
#### `--genome` reference catalogues
217+
218+
`--genome <key>` resolves a bundle of reference paths from the `params.genomes` map. The pipeline ships the iGenomes catalogue out of the box, but the same mechanism works with a user-authored catalogue - that is the recommended path for modern reference data, since the iGenomes annotations are stale. If you add new fields to genome map entries, make them optional and gate behaviour on their presence (see e.g. the `star_legacy` flag in `conf/igenomes.config`).
219+
220+
#### Snapshots
221+
222+
Non-deterministic outputs (STAR, Salmon, Kallisto, RSEM, HISAT2 indices; qualimap reports) are snapshotted by file-name-only (`getSnapshot()` filtered) rather than content. Deterministic text outputs are snapshotted by md5. Verbose JSON test output (e.g. helper-function tests) should snapshot `.md5()` of the result rather than inlining the JSON. Don't snapshot timestamps or paths that contain hash directories.
223+
224+
#### `.nftignore`
225+
226+
`tests/.nftignore` (and `tests/.nftignore_rustqc` for the RustQC variant) is a list of glob patterns that nf-test excludes from `${outputDir}` snapshots at the pipeline-test level. It is the right place to drop outputs that are content-stable but not byte-stable (e.g. files that include a timestamp, paths under multiqc/multiqc_data, log files where ordering varies), or that are already covered elsewhere. If a pipeline-level snapshot is fluttering on a file you don't actually need to assert on, add it here rather than rerunning until you get lucky.
227+
228+
#### CHANGELOG
229+
230+
One-line entry per PR under the unreleased section, focused on the _what_, not the implementation history. A `### Software dependencies` table at the end of each release section captures tool version bumps (Old → New).

modules/local/star_genomeparams_upgrade/tests/main.nf.test

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ nextflow_process {
1313
script "../../../../modules/nf-core/star/genomegenerate/main.nf"
1414
process {
1515
"""
16-
input[0] = Channel.of([
16+
input[0] = channel.of([
1717
[ id:'test_fasta' ],
1818
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ]
1919
])
20-
input[1] = Channel.of([
20+
input[1] = channel.of([
2121
[ id:'test_gtf' ],
2222
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
2323
])
@@ -65,11 +65,11 @@ nextflow_process {
6565
script "../../../../modules/nf-core/star/genomegenerate/main.nf"
6666
process {
6767
"""
68-
input[0] = Channel.of([
68+
input[0] = channel.of([
6969
[ id:'test_fasta' ],
7070
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ]
7171
])
72-
input[1] = Channel.of([
72+
input[1] = channel.of([
7373
[ id:'test_gtf' ],
7474
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
7575
])
@@ -110,11 +110,11 @@ nextflow_process {
110110
script "../../../../modules/nf-core/star/genomegenerate/main.nf"
111111
process {
112112
"""
113-
input[0] = Channel.of([
113+
input[0] = channel.of([
114114
[ id:'test_fasta' ],
115115
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ]
116116
])
117-
input[1] = Channel.of([
117+
input[1] = channel.of([
118118
[ id:'test_gtf' ],
119119
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
120120
])

subworkflows/local/align_star/tests/main.extra_args.nf.test

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ nextflow_workflow {
1212
script "../../../../modules/nf-core/star/genomegenerate/main.nf"
1313
process {
1414
"""
15-
input[0] = Channel.of([
15+
input[0] = channel.of([
1616
[ id:'test_fasta' ],
1717
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ]
1818
])
19-
input[1] = Channel.of([
19+
input[1] = channel.of([
2020
[ id:'test_gtf' ],
2121
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
2222
])
@@ -33,20 +33,20 @@ nextflow_workflow {
3333
use_parabricks_star = false
3434
skip_markduplicates = false
3535

36-
input[0] = Channel.of([
36+
input[0] = channel.of([
3737
[ id:'test', single_end:false ], // meta map
3838
[
3939
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true),
4040
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true)
4141
]
4242
])
4343
input[1] = STAR_GENOMEGENERATE.out.index
44-
input[2] = Channel.of([
44+
input[2] = channel.of([
4545
[ id:'test_gtf' ],
4646
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
4747
])
4848
input[3] = star_ignore_sjdbgtf
49-
input[4] = Channel.of([
49+
input[4] = channel.of([
5050
[ id:'test_fasta' ],
5151
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true),
5252
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true)

subworkflows/local/align_star/tests/main.nf.test

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ nextflow_workflow {
1212
script "../../../../modules/nf-core/star/genomegenerate/main.nf"
1313
process {
1414
"""
15-
input[0] = Channel.of([
15+
input[0] = channel.of([
1616
[ id:'test_fasta' ],
1717
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ]
1818
])
19-
input[1] = Channel.of([
19+
input[1] = channel.of([
2020
[ id:'test_gtf' ],
2121
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
2222
])
@@ -33,20 +33,20 @@ nextflow_workflow {
3333
use_parabricks_star = false
3434
skip_markduplicates = false
3535

36-
input[0] = Channel.of([
36+
input[0] = channel.of([
3737
[ id:'test', single_end:false ], // meta map
3838
[
3939
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true),
4040
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true)
4141
]
4242
])
4343
input[1] = STAR_GENOMEGENERATE.out.index
44-
input[2] = Channel.of([
44+
input[2] = channel.of([
4545
[ id:'test_gtf' ],
4646
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
4747
])
4848
input[3] = star_ignore_sjdbgtf
49-
input[4] = Channel.of([
49+
input[4] = channel.of([
5050
[ id:'test_fasta' ],
5151
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true),
5252
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true)
@@ -97,11 +97,11 @@ nextflow_workflow {
9797
script "../../../../modules/nf-core/star/genomegenerate/main.nf"
9898
process {
9999
"""
100-
input[0] = Channel.of([
100+
input[0] = channel.of([
101101
[ id:'test_fasta' ],
102102
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ]
103103
])
104-
input[1] = Channel.of([
104+
input[1] = channel.of([
105105
[ id:'test_gtf' ],
106106
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
107107
])
@@ -126,20 +126,20 @@ nextflow_workflow {
126126
use_parabricks_star = false
127127
skip_markduplicates = false
128128

129-
input[0] = Channel.of([
129+
input[0] = channel.of([
130130
[ id:'test', single_end:false ], // meta map
131131
[
132132
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true),
133133
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true)
134134
]
135135
])
136136
input[1] = STAR_GENOMEPARAMS_UPGRADE.out.index
137-
input[2] = Channel.of([
137+
input[2] = channel.of([
138138
[ id:'test_gtf' ],
139139
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
140140
])
141141
input[3] = star_ignore_sjdbgtf
142-
input[4] = Channel.of([
142+
input[4] = channel.of([
143143
[ id:'test_fasta' ],
144144
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true),
145145
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true)
@@ -186,11 +186,11 @@ nextflow_workflow {
186186
script "../../../../modules/nf-core/star/genomegenerate/main.nf"
187187
process {
188188
"""
189-
input[0] = Channel.of([
189+
input[0] = channel.of([
190190
[ id:'test_fasta' ],
191191
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ]
192192
])
193-
input[1] = Channel.of([
193+
input[1] = channel.of([
194194
[ id:'test_gtf' ],
195195
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
196196
])
@@ -207,20 +207,20 @@ nextflow_workflow {
207207
use_parabricks_star = false
208208
skip_markduplicates = false
209209

210-
input[0] = Channel.of([
210+
input[0] = channel.of([
211211
[ id:'test', single_end:false ], // meta map
212212
[
213213
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true),
214214
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true)
215215
]
216216
])
217217
input[1] = STAR_GENOMEGENERATE.out.index
218-
input[2] = Channel.of([
218+
input[2] = channel.of([
219219
[ id:'test_gtf' ],
220220
[ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ]
221221
])
222222
input[3] = star_ignore_sjdbgtf
223-
input[4] = Channel.of([
223+
input[4] = channel.of([
224224
[ id:'test_fasta' ],
225225
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true),
226226
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true)

0 commit comments

Comments
 (0)