Skip to content

Conversation

@fgvieira
Copy link
Collaborator

@fgvieira fgvieira commented Nov 20, 2025

QC

While the contributions guidelines are more extensive, please particularly ensure that:

  • test.py was updated to call any added or updated example rules in a Snakefile
  • input: and output: file paths in the rules can be chosen arbitrarily
  • wherever possible, command line arguments are inferred and set automatically (e.g. based on file extensions in input: or output:)
  • temporary files are either written to a unique hidden folder in the working directory, or (better) stored where the Python function tempfile.gettempdir() points to
  • the meta.yaml contains a link to the documentation of the respective tool or command under url:
  • conda environments use a minimal amount of channels and packages, in recommended ordering

Summary by CodeRabbit

  • New Features

    • Improved compressed-input handling (including bzip2) and safer empty-input fallback with generated dummy inputs.
    • Plotting now supports an additional model/label and color.
  • Bug Fixes

    • Prevents crashes on empty or small compressed files.
    • Fixes JSON output post-processing to convert string "NaN" to real NaN.
  • Tests

    • Added many expectation fixtures and reorganized/renamed tests for broader coverage.
  • Chores

    • Updated environment pins and adjusted compression-tool pins.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 20, 2025

📝 Walkthrough

Walkthrough

Adds many Nonpareil test fixtures, updates test orchestration and expectations, enhances Nonpareil wrappers (input format detection, bz2 handling, empty-input substitution), changes plot wrapper JSON handling, and refreshes pinned environment and environment.yaml pins.

Changes

Cohort / File(s) Summary
Small .npc expectation fixtures
bio/nonpareil/infer/test/expected/a.fa.npc, bio/nonpareil/infer/test/expected/a.fas.bz2.npc, bio/nonpareil/infer/test/expected/a.fasta.gz.npc, bio/nonpareil/infer/test/expected/a.fastq.gz.npc, bio/nonpareil/infer/test/expected/a.fq.bz2.npc, bio/nonpareil/infer/test/expected/a.fq.npc
Added static .npc test expectation files (each contains repeated "15" lines).
Empty-sample expectation fixtures
bio/nonpareil/infer/test/expected/empty.fq* (e.g., empty.fq.npa, empty.fq.npo, empty.fq.gz.npa, empty.fq.gz.npo, empty.fq.bz2.npa, empty.fq.bz2.npo)
Added many empty-input test artifacts: long zero-initialized data sequences (1024-line .npa/.npa variants) and .npo files including Nonpareil headers and zero-data rows.
Nonpareil plot test inputs
bio/nonpareil/plot/test/d.npo, bio/nonpareil/plot/test/Snakefile
Added d.npo fixture and extended multiple-input test rule to include d.npo and an extra label/color.
Wrapper implementation (infer)
bio/nonpareil/infer/wrapper.py
Reworked input handling to use pathlib and get_format(), added explicit .bz2 uncompression (pbzip2), added empty-file detection and dummy FASTA/FASTQ generation, preserved temporary-file flow, and extended nonpareil CLI options (redundancy, mate distribution, log). Appends default redundancy line for empty-input cases.
Plot wrapper output handling
bio/nonpareil/plot/wrapper.py
Writes JSON to a temporary file inside a with-block, post-processes to convert string "NaN" to real NaN (numpy) before writing final json; other outputs unchanged.
Test orchestration & expectations
test_wrappers.py
Renamed/swapped two test functions, expanded expected-file mappings for Nonpareil tests, normalized some formatting in test cmds/diffs.
Conda environment pin
bio/nonpareil/infer/environment.linux-64.pin.txt
Replaced pinned package set and conda header with a comprehensive update (many package versions/buildids changed).
Environment YAML
bio/nonpareil/infer/environment.yaml
Removed pigz, pinned pbzip2 =1.1.13; other deps unchanged.
Additional small expected artifact
bio/nonpareil/infer/test/expected/a.fas.bz2.npc
Added another small expectation file (matches other a.*.npc entries).

Sequence Diagram(s)

sequenceDiagram
  participant SM as Snakemake
  participant InferW as infer/wrapper.py
  participant Tools as pbzip2/gzip/fs
  participant Nonpareil as nonpareil
  participant PlotW as plot/wrapper.py

  SM->>InferW: invoke infer wrapper with input
  InferW->>InferW: Path(input) & in_format = get_format(input)
  alt input suffix == .bz2
    InferW->>Tools: pbzip2 -d (stream) -> write in_uncomp
  else input compressed (.gz) or plain
    InferW->>Tools: decompress or copy -> in_uncomp
  end
  InferW->>InferW: probe in_uncomp size / gzip header
  alt empty input detected
    InferW->>InferW: create minimal dummy FASTA/FASTQ as in_uncomp
  end
  InferW->>Nonpareil: run nonpareil with constructed options (redundancy, mate_distr, log, ...)
  Nonpareil-->>InferW: produce .npa/.npo/.npc outputs
  InferW-->>SM: return outputs

  SM->>PlotW: invoke plot wrapper for outputs
  PlotW->>PlotW: create temp JSON file (NamedTemporaryFile)
  PlotW->>PlotW: run plotting command writing to temp JSON
  alt json post-processing required
    PlotW->>PlotW: load temp JSON, convert "NaN" strings to real NaN (numpy), write final json
  end
  PlotW-->>SM: final outputs (pdf/tsv/json)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Review focus:
    • bio/nonpareil/infer/wrapper.py: verify get_format() usage, pbzip2 streaming invocation and safe subprocess handling, gzip probing heuristics, correctness of dummy FASTA/FASTQ content for each format, and edge cases where empty-input substitution could affect downstream outputs.
    • bio/nonpareil/plot/wrapper.py: validate temp-file usage and JSON post-processing (nan conversion) and ensure deterministic output and error handling.
    • bio/nonpareil/infer/environment.linux-64.pin.txt: inspect pinset changes for intentionality (many package/buildid updates).
    • test_wrappers.py and added fixtures: ensure test renames align with CI discovery and that expected-file contents match test comparisons.

Possibly related PRs

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description check ✅ Passed The pull request description covers the main objectives and includes a completed QC checklist confirming adherence to contributing guidelines, with all items checked off indicating compliance with repository standards.
Title check ✅ Passed The title clearly and specifically describes the main change: adding support for empty FASTQ input files in the nonpareil wrapper.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@fgvieira
Copy link
Collaborator Author

@coderabbitai review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 20, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@fgvieira fgvieira marked this pull request as draft November 21, 2025 08:14
@fgvieira fgvieira marked this pull request as ready for review November 21, 2025 15:02
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
bio/nonpareil/plot/wrapper.py (1)

26-38: Consider renaming unused loop variable.

The JSON post-processing logic correctly addresses the NaN issue. However, the loop variable key at line 35 is not used within the loop body.

Apply this diff to indicate the variable is intentionally unused:

-        for key, val in json_data.items():
+        for _key, val in json_data.items():
             val["x.adj"] = [np.nan if x == "NaN" else x for x in val["x.adj"]]

Or, if the key is truly not needed, consider using values():

-        for key, val in json_data.items():
+        for val in json_data.values():
             val["x.adj"] = [np.nan if x == "NaN" else x for x in val["x.adj"]]
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 07cc8ca and 550b034.

📒 Files selected for processing (8)
  • bio/nonpareil/infer/test/expected/empty.fq.bz2.npo (1 hunks)
  • bio/nonpareil/infer/test/expected/empty.fq.gz.npo (1 hunks)
  • bio/nonpareil/infer/test/expected/empty.fq.npo (1 hunks)
  • bio/nonpareil/infer/wrapper.py (3 hunks)
  • bio/nonpareil/plot/test/Snakefile (1 hunks)
  • bio/nonpareil/plot/test/d.npo (1 hunks)
  • bio/nonpareil/plot/wrapper.py (1 hunks)
  • test_wrappers.py (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • bio/nonpareil/infer/test/expected/empty.fq.npo
  • test_wrappers.py
  • bio/nonpareil/infer/test/expected/empty.fq.bz2.npo
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py

⚙️ CodeRabbit configuration file

**/*.py: Do not try to improve formatting.
Do not suggest type annotations for functions that are defined inside of functions or methods.
Do not suggest type annotation of the self argument of methods.
Do not suggest type annotation of the cls argument of classmethods.
Do not suggest return type annotation if a function or method does not contain a return statement.

Files:

  • bio/nonpareil/plot/wrapper.py
  • bio/nonpareil/infer/wrapper.py
**/wrapper.py

⚙️ CodeRabbit configuration file

Do not complain about use of undefined variable called snakemake.

Files:

  • bio/nonpareil/plot/wrapper.py
  • bio/nonpareil/infer/wrapper.py
🧠 Learnings (19)
📓 Common learnings
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3499
File: bio/ngscheckmate/makesnvpattern/wrapper.py:18-24
Timestamp: 2024-11-26T09:08:06.041Z
Learning: In Snakemake wrappers, input file validation is managed by Snakemake, so manual validation in the wrapper code is unnecessary.
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3499
File: bio/ngscheckmate/makesnvpattern/test/Snakefile:14-22
Timestamp: 2024-11-26T09:16:39.570Z
Learning: In the `snakemake-wrappers` repository, when writing test `Snakefile`s (e.g., `bio/ngscheckmate/makesnvpattern/test/Snakefile`), hardcoded input/output paths are acceptable because these are examples and the IO can be chosen freely.
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3496
File: bio/mtnucratio/test/Snakefile:2-6
Timestamp: 2024-11-26T08:31:00.099Z
Learning: In test files for Snakemake wrappers, such as `bio/mtnucratio/test/Snakefile`, hard-coded input and output paths are acceptable as examples and do not need to use wildcards to make paths flexible.
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3478
File: bio/varlociraptor/estimate-alignment-properties/wrapper.py:5-12
Timestamp: 2024-11-21T10:23:03.427Z
Learning: In the Snakemake wrappers project, avoid suggesting extensive error handling or temporary file management in simple wrapper scripts when it may be unnecessary, to prevent overcomplicating the code.
Learnt from: dlaehnemann
Repo: snakemake/snakemake-wrappers PR: 3115
File: CHANGELOG.md:5-5
Timestamp: 2024-08-14T15:21:37.230Z
Learning: Do not review release-please commits in the Snakemake wrappers repository as they are auto-formatted.
Learnt from: dlaehnemann
Repo: snakemake/snakemake-wrappers PR: 3115
File: CHANGELOG.md:5-5
Timestamp: 2024-10-08T17:41:54.542Z
Learning: Do not review release-please commits in the Snakemake wrappers repository as they are auto-formatted.
📚 Learning: 2024-11-26T09:16:24.981Z
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3499
File: bio/ngscheckmate/makesnvpattern/test/Snakefile:1-13
Timestamp: 2024-11-26T09:16:24.981Z
Learning: In test `Snakefile`s (e.g., `test/Snakefile`), it's acceptable to use fixed input and output file names instead of wildcards.

Applied to files:

  • bio/nonpareil/plot/test/Snakefile
  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-26T15:01:13.202Z
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3502
File: bio/ngsbits/sampleancestry/wrapper.py:1-23
Timestamp: 2024-11-26T15:01:13.202Z
Learning: The NGS-bits SampleAncestry wrapper in `bio/ngsbits/sampleancestry/` includes a test Snakefile, sample VCF files, and tests available in the `test/` directory.

Applied to files:

  • bio/nonpareil/plot/test/Snakefile
📚 Learning: 2024-11-26T09:16:39.570Z
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3499
File: bio/ngscheckmate/makesnvpattern/test/Snakefile:14-22
Timestamp: 2024-11-26T09:16:39.570Z
Learning: In the `snakemake-wrappers` repository, when writing test `Snakefile`s (e.g., `bio/ngscheckmate/makesnvpattern/test/Snakefile`), hardcoded input/output paths are acceptable because these are examples and the IO can be chosen freely.

Applied to files:

  • bio/nonpareil/plot/test/Snakefile
  • bio/nonpareil/plot/wrapper.py
  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-21T10:50:09.006Z
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3478
File: bio/varlociraptor/call-variants/test/Snakefile:29-47
Timestamp: 2024-11-21T10:50:09.006Z
Learning: In example Snakefiles, using hardcoded sample names is acceptable.

Applied to files:

  • bio/nonpareil/plot/test/Snakefile
📚 Learning: 2024-11-15T18:31:15.447Z
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3478
File: bio/varlociraptor/estimate-alignment-properties/test/Snakefile:7-10
Timestamp: 2024-11-15T18:31:15.447Z
Learning: In the Snakemake wrappers repository, avoid suggesting refactoring that involves using `tempfile.gettempdir()` or changing output paths to temporary directories.

Applied to files:

  • bio/nonpareil/plot/wrapper.py
  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-21T10:23:03.427Z
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3478
File: bio/varlociraptor/estimate-alignment-properties/wrapper.py:5-12
Timestamp: 2024-11-21T10:23:03.427Z
Learning: In the Snakemake wrappers project, avoid suggesting extensive error handling or temporary file management in simple wrapper scripts when it may be unnecessary, to prevent overcomplicating the code.

Applied to files:

  • bio/nonpareil/plot/wrapper.py
  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-26T14:59:03.678Z
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3502
File: bio/ngsbits/sampleancestry/wrapper.py:18-23
Timestamp: 2024-11-26T14:59:03.678Z
Learning: In Snakemake wrapper scripts, Snakemake validates input and output paths, so explicit shell quoting is not necessary.

Applied to files:

  • bio/nonpareil/plot/wrapper.py
  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-08-21T08:30:42.757Z
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3123
File: utils/datavzrd/wrapper.py:31-32
Timestamp: 2024-08-21T08:30:42.757Z
Learning: In `wrapper.py` scripts, do not flag the use of an undefined variable called `snakemake`.

Applied to files:

  • bio/nonpareil/plot/wrapper.py
📚 Learning: 2024-08-21T08:33:50.878Z
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3123
File: utils/datavzrd/wrapper.py:31-32
Timestamp: 2024-08-21T08:33:50.878Z
Learning: The `snakemake` variable is inserted via a preamble during execution in `wrapper.py` scripts, so it doesn't need to be explicitly defined.

Applied to files:

  • bio/nonpareil/plot/wrapper.py
📚 Learning: 2024-11-15T13:48:33.759Z
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3478
File: bio/varlociraptor/preprocess-variants/wrapper.py:0-0
Timestamp: 2024-11-15T13:48:33.759Z
Learning: In Snakemake wrappers, security considerations like input sanitization are unnecessary, as the wrappers are under full control of the user.

Applied to files:

  • bio/nonpareil/plot/wrapper.py
  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-26T10:49:04.406Z
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3501
File: meta/bio/varscan2_snpeff/test/Snakefile:1-10
Timestamp: 2024-11-26T10:49:04.406Z
Learning: Using generic output filenames like "genome.fasta" is acceptable in the `snakemake-wrappers` project.

Applied to files:

  • bio/nonpareil/plot/wrapper.py
  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-26T08:31:00.099Z
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3496
File: bio/mtnucratio/test/Snakefile:2-6
Timestamp: 2024-11-26T08:31:00.099Z
Learning: In test files for Snakemake wrappers, such as `bio/mtnucratio/test/Snakefile`, hard-coded input and output paths are acceptable as examples and do not need to use wildcards to make paths flexible.

Applied to files:

  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-26T09:08:06.041Z
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3499
File: bio/ngscheckmate/makesnvpattern/wrapper.py:18-24
Timestamp: 2024-11-26T09:08:06.041Z
Learning: In Snakemake wrappers, input file validation is managed by Snakemake, so manual validation in the wrapper code is unnecessary.

Applied to files:

  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-26T10:49:54.765Z
Learnt from: tdayris
Repo: snakemake/snakemake-wrappers PR: 3501
File: meta/bio/varscan2_snpeff/test/Snakefile:58-71
Timestamp: 2024-11-26T10:49:54.765Z
Learning: In test Snakefiles within the snakemake-wrappers repository, it is acceptable to use simplified paths and logging configurations that may differ from real-life pipelines.

Applied to files:

  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-12-06T14:25:43.922Z
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3498
File: bio/ngscheckmate/ncm/wrapper.py:68-68
Timestamp: 2024-12-06T14:25:43.922Z
Learning: In the `bio/ngscheckmate/ncm/wrapper.py` file for the NGSCheckMate wrapper, do not suggest adding file existence checks for the list file input, as the files are already required by the wrapper.

Applied to files:

  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-15T18:36:04.660Z
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3478
File: bio/varlociraptor/call-variants/wrapper.py:15-23
Timestamp: 2024-11-15T18:36:04.660Z
Learning: In the Snakemake wrappers repository, using `shell=True` and redirecting within shell commands is acceptable.

Applied to files:

  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2024-11-15T13:44:18.810Z
Learnt from: johanneskoester
Repo: snakemake/snakemake-wrappers PR: 3478
File: bio/varlociraptor/estimate-alignment-properties/wrapper.py:5-12
Timestamp: 2024-11-15T13:44:18.810Z
Learning: In the snakemake-wrappers repository, it is acceptable to use f-strings with `shell=True` in wrapper scripts (e.g., `wrapper.py` files), as these wrappers are under full control of the user. Potential command injection vulnerabilities are not considered an issue in this context.

Applied to files:

  • bio/nonpareil/infer/wrapper.py
📚 Learning: 2025-06-15T07:43:03.263Z
Learnt from: tedil
Repo: snakemake/snakemake-wrappers PR: 4274
File: bio/mehari/annotate-seqvars/wrapper.py:11-19
Timestamp: 2025-06-15T07:43:03.263Z
Learning: In Snakemake wrappers, a common pattern is to have flag variables that are either empty strings "" or the actual flag strings (e.g., "--keep-intergenic") for direct interpolation in shell commands. This avoids conditionals in the shell expression and keeps the command construction clean.

Applied to files:

  • bio/nonpareil/infer/wrapper.py
🪛 Ruff (0.14.5)
bio/nonpareil/plot/wrapper.py

10-10: Undefined name snakemake

(F821)


11-11: Undefined name snakemake

(F821)


16-16: Undefined name snakemake

(F821)


28-28: Undefined name snakemake

(F821)


35-35: Loop control variable key not used within loop body

Rename unused key to _key

(B007)

bio/nonpareil/infer/wrapper.py

11-11: Undefined name snakemake

(F821)


12-12: Undefined name snakemake

(F821)


13-13: Undefined name snakemake

(F821)


16-16: Undefined name snakemake

(F821)


41-41: Undefined name snakemake

(F821)


47-47: Undefined name snakemake

(F821)


67-67: Avoid specifying long messages outside the exception class

(TRY003)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: testing
  • GitHub Check: docs
  • GitHub Check: Summary
🔇 Additional comments (10)
bio/nonpareil/plot/wrapper.py (2)

6-6: LGTM!

The tempfile import is appropriate for the temporary file handling introduced to work around the Nonpareil JSON output issue.


14-24: LGTM!

The temporary file approach for JSON output is well-structured, allowing post-processing to fix the NaN issue while writing other formats directly to their final paths.

bio/nonpareil/infer/wrapper.py (5)

6-16: LGTM!

Using get_format from snakemake_wrapper_utils is a robust approach for input format detection, superior to manual extension parsing.


19-36: LGTM!

The additional output options follow consistent patterns and properly extend the wrapper's functionality to support more Nonpareil features.


40-47: LGTM!

The bz2 decompression logic is clean and properly utilizes parallel decompression with pbzip2.


81-83: LGTM!

Appending a zero-line to the redundancy summary for empty inputs ensures consistent output file presence, preventing downstream pipeline failures.


49-68: The 50-byte threshold for gzip empty-file detection is appropriate.

An empty gzipped file is approximately 20 bytes, and larger sizes (21–31 bytes) appear when filename/timestamp/extra fields are stored. The code's 50-byte threshold provides a safe buffer that allows truly empty gzipped files to be properly detected through decompression, while any actual FASTA or FASTQ content would exceed this threshold. The empty input detection and dummy sequence generation logic is sound.

bio/nonpareil/plot/test/d.npo (1)

1-10: LGTM!

The test data file follows the correct Nonpareil output format with appropriate metadata headers and zero-valued data matrix for testing empty input scenarios.

bio/nonpareil/plot/test/Snakefile (1)

19-27: LGTM!

The test configuration correctly extends the multiple-plot test case to include the new d.npo test data with matching labels and colors.

bio/nonpareil/infer/test/expected/empty.fq.gz.npo (1)

1-10: Expected output is validated by the test framework and confirmed correct.

The file bio/nonpareil/infer/test/expected/empty.fq.gz.npo is part of the active test suite (line 411 in test_wrappers.py). The test framework runs the wrapper, generates actual output, and validates byte-for-byte against this expected file using filecmp.cmp. All three empty input variants (.fq, .fq.gz, .fq.bz2) consistently produce identical output, confirming correctness. The all-zero redundancy values are appropriate for the single minimal dummy sequence that the wrapper creates to handle empty inputs (GitHub issue #71 workaround).

@fgvieira fgvieira changed the title feat: allow for empty input files feat: nonpareil allow for empty FASTQ input files Nov 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant