Skip to content

Tags: ngless-toolkit/ngless

Tags

v1.6.1

Toggle v1.6.1's commit message
RLS Version 1.6.1

Bug-fix release.

Binary operators now have the usual precedence (see below), which
changes the result of expressions such as `2 * 3 + 1` (now 7; it was 8
in 1.6.0).

Write() uses significantly less memory overall.

* `ngless --check-install` now checks that the external tools can be found
(on the PATH or via the `NGLESS_*_BIN` variables) and exits with an error
if samtools, bwa, prodigal, or megahit are missing. A missing minimap2 only
prints a warning. Previously, it always reported success. With `--verbose`
(a flag that had been dropped in the Rust rewrite), it also prints the path
to each tool it finds.
* `ngless --version-debug` no longer prints "embedded binaries: No".
* The error for a missing external tool no longer refers to builds with
embedded dependencies, which no longer exist, and names the variable that
can be set to point to the tool.
* `write` now uses constant memory when it has to recompress FASTQ output
(e.g., writing the result of `preprocess` to a `.fq.gz` file). Previously,
the whole decompressed file was held in memory, so memory usage grew with
the input size.
* Fixed a tokenizer bug where a `;` inside a `#` or `//` comment ended the
comment, so the rest of the line was tokenized as code. This usually produced
a confusing error pointing at a comment line, but if the tail of the comment
happened to be valid NGLess (commented-out code, typically) it was silently
executed. Block comments (`/* ... */`) were never affected, and `;` keeps
working as a statement separator in code.
* `ngless --help` now lists all the accepted command line options. It was
missing about half of them, including `-j`/`--jobs`/`--threads`, `-e`/`--script`,
`-o`/`--html-report-directory`, `-p`/`--print-last`, `-c`/`--config-file`,
`--create-report`, `--index-path`, `--color`, `--strict-threads`, the
`--export-json`/`--export-cwl` pair, and the data-management modes
(`--install-reference-data`, `--download-demo`, `--download-file`,
`--create-reference-pack`). The options are now grouped by purpose and the
supported short-option bundling is documented.
* Added the binary subtraction operator (`-`). It was documented in
`Language.md` (both in the prose and in the grammar), but `-` was only ever
parsed as unary negation, so `x = 5 - 3` silently mis-parsed as `x = 5`
followed by a separate top-level `-3`.
* Binary operators now have the usual precedence and are left-associative,
matching Python: `*` binds tighter than `+`/`-`/`</>`, which bind tighter
than the comparisons (`< > <= >= == !=`), and `not` binds loosest.
Previously they had no relative precedence and were right-associative, so
`10 - 4 - 3` would have been `10 - (4 - 3)` and `2 * 3 + 1` was `2 * (3 + 1)`.
Expressions such as `x - 1 > 0` or `len(x) + 1 == n`, which used to be type
errors, now work. Note that, unlike Python, comparisons do not chain:
`1 < 2 < 3` is `(1 < 2) < 3`, a type error.
* A bare expression in statement position (e.g. the stray `-3` above) is now
rejected by validation, as a normal script error reported by `ngless -n`.
Previously it reached the interpreter and was reported as an internal error,
with the "please report this bug" banner.
* Fixed unary minus on doubles (`x = -3.5` failed at run time with
"invalid unary operation (Minus) on value of type double").
* Fixed the type checking of arithmetic on doubles: `+` rejected a pair of
doubles ("Addition operator (+) must be applied to a pair of strings or
integers"), and `*` inferred the type of its right operand rather than the
documented "mixing integers and doubles returns a double".
* Fixed exponential type-checking time for long operator chains. The type
of each operand was inferred once per candidate type, and every inference
walks the whole operand, so a chain such as `a + b + c + ...` cost 2^n: a
24-term string concatenation took half a second and a 200-term one did not
finish. Operand types are now inferred once.

v1.6.0

Toggle v1.6.0's commit message
RLS Version 1.6.0

First stable release of the 1.6 series (previous 1.6 builds were betas).

- Cargo.toml / src/lib.rs (VERSION_STR_LONG, DATE_STR, and the matching unit
  test) / docs conf.py / pixi.toml / CLAUDE.md: version -> 1.6.0, release date
  4 August 2026. `--version` now reports "ngless v1.6.0 (release date: 4 August
  2026)".
- ChangeLog: rename the Unreleased block to Version 1.6.0, with a lead-in
  pointing at the beta1/beta2 blocks for the full delta against 1.5.0.
- docs/sources/whatsnew.rst: retitle from a beta note to "Released on August 4
  2026". Promote the two post-beta2 changes that are new relative to 1.5.0 (the
  early output-directory check and the module-import error listing searched
  locations) into the user-facing list; fold the rest, which restore 1.5
  behaviour the betas had not ported, into a section covering both pre-releases.

Install docs: 1.6.0 goes to bioconda, so drop the pre-release workaround of
pinning the .conda package by URL. pixi_install_ngless.toml now depends on
`ngless = ">=1.6.0,<2"` only -- the external tools (bwa, samtools, minimap2,
megahit, prodigal) come in as dependencies of the bioconda package, so they no
longer need to be listed. README.md and docs/sources/install.md are reworded
from "Beta releases (via pixi)" to "Using pixi" to match. This also fixes the
README manifest snippet, which had been missing its closing brace since the
1.6.0-beta2 release commit and was therefore invalid TOML.

Also remove the Docker and statically-linked-binary sections from both README.md
and docs/sources/install.md: they pointed at 1.4.2/1.5.0 artifacts and claimed
the download "bundles bwa, samtools and megahit", which is not true of the Rust
build (no external tools are embedded). Retarget the README release-docs link
from 1.5.0 to 1.6.0, and correct the functional test count in CLAUDE.md from 99
to 108.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v1.6.0-beta2

Toggle v1.6.0-beta2's commit message
RLS Version 1.6.0-beta2

Changes with respect to 1.5.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* NGLess is now based on a new implementation written in Rust (previous
versions were written in Haskell). It is intended as a compatible replacement:
the same scripts produce the same results.
* NGLess now supports a single language version, "1.6". Scripts must declare
`ngless "1.6"`; declaring an older version (including "1.5") is now a hard
error. Update the version statement at the top of your scripts to `ngless
"1.6"`.
* Built-in modules (`parallel`, `samtools`, `mocat`, ...) now track the ngless
version: import them at version "1.6" going forward. Older module versions are
still accepted (with the latest behaviour) but print a deprecation warning.
* Removed the deprecated `strand` argument to `count()`; use `sense`
(`{both}`/`{sense}`/`{antisense}`) instead. `strand=True` is equivalent to
`sense={sense}`.
* Removed the deprecated `--search-dir` command-line flag (use
`--search-path`) and the unimplemented `--check-deprecation` flag.
* The output content hash reported by `auto_comments=[{hash}]` (and used to
name parallel lock/stats directories) is now computed with a simpler internal
serialization. It is still deterministic and content-addressed, but the hash
*values* differ from previous releases (they are an internal identifier, not a
stable cross-version value).
* ngless now writes an HTML run report again (the `<script>.output_ngless/`
directory, or the location given by `-o`/`--html-report-directory`; disable
with `--no-create-report`). The report is a single self-contained
`index.html` that embeds its data and makes no network requests, so it works
offline on compute clusters (the old report loaded AngularJS, jQuery,
Bootstrap and d3/nvd3 from CDNs). It shows the script (with links to the
quality-control and mapping statistics), the run log, per-file FASTQ QC with
per-position quality charts, and mapping statistics. The script listing is
syntax-highlighted. The directory also contains `script.ngl`, `fq.tsv` and
`mappings.tsv`. Inline scripts (passed with `-e`/`--script`) do *not* write a
report by default (they are typically quick one-liners); pass
`--create-report` or `-o`/`--html-report-directory` to force one.
* Importing the legacy `motus` or `soap` modules now aborts with a clear
guidance error (both are obsolete and unsupported)
* `count()` now errors early when more than one annotation source is given
(seqname mode, `gff_file`, `functional_map`, or `reference`) instead of
silently ignoring all but one
* A constant out-of-bounds list index (e.g. `x[5]` on a 3-element list) now
fails early, right after the list is assigned, with the same "Index access
on line N is invalid" message as earlier ngless versions
* Added the `{always_3_fq_files}` format flag to `write()`
* Better suggestions for mistyped arguments/flags (matching by prefix, e.g.
`ref=` for `reference=`)

Changes with respect to 1.6.0-beta1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* The build now supports a single language version, "1.6": a script declaring
"1.5" (which beta1 still accepted with a warning) is now a hard error.
* Removed the deprecated `count()` `strand` argument (use `sense`), the
`--search-dir` command-line flag (use `--search-path`), and the unimplemented
`--check-deprecation` flag.
* The internal output content hash (`auto_comments=[{hash}]` and parallel
lock/stats directory names) is computed differently, so its values differ from
beta1. It remains deterministic and content-addressed.
* Otherwise beta2 restores a large set of features that beta1 had not yet
ported from earlier ngless versions -- transparent `.xz` support, the HTML run
report, parallel-module progress reporting, `format={sam|bam}` on `write()`,
`preprocess(keep_singles=False)`, `auto_comments=[{date}]`, reference-based
`count()`, enhanced FASTQ QC statistics, broader external module support,
and several performance and UX improvements.

v1.6.0-beta1

Toggle v1.6.0-beta1's commit message
RLS Version 1.6.0-beta1

Complete rewrite in Rust!

It should be 100% completely backwards compatible with 1.5, but, just in
case, I bumped the version number and you should declare ngless "1.6"

The HTML reports are currently not produced, that is the major
regression.

Also in this release

- Fixed a bug when writing comments to compressed output files.
- Fixed load_sample_from_yaml (it previously took the wrong arguments).
- Added the {always_3_fq_files} format flag to write().
- Better "did you mean" suggestions for mistyped arguments/flags (now matches on prefixes).
- Fixed a bug where multiplication of non-integer values used addition instead of multiplication.

v1.5.0

Toggle v1.5.0's commit message
RLS Version 1.5.0

The two big changes are:

1. the ability to use Yaml files to specify samples,
2. the introduction of `run_for_all` (and `run_for_all_samples`) functions to simplify the usage of the `parallel` module.

Several of the other changes were then to support these two features.
Additionally, some minor fixes and improvements were made.

Full ChangeLog:

- Add `load_sample_list` function to load samples in YAML format.
- Add `compress_level` argument to `write` function to specify the compression level.
- Added `name()` method to `ReadSet` objects, so you can do:

    input = load_fastq_directory("my-sample")
    print(input.name())

which will print `my-sample`.
- Added `println` function which works like `print` but prints a newline after the output.
- Make `print()` accept ints and doubles as well as strings.
- Added `run_for_all` function to `parallel` module, simplifying its API.
- When using the `parallel` module and a job fails, writes the log to the corresponding `.failed` file.
- External modules can now use the `sequenceset` type to represent a FASTA file.
- The `load_fastq_directory` function now supports `.xz` compressed files.
- The `parallel` module now checks for stale locks **before** re-trying failed tasks. The former model could lead to a situation where a particular sample failed deterministically and then blocked progress even when some locks were stale.

Bugfixes

- The `parallel` module should generate a `.failed` file for each failed job, but this was not happening in every case.
- Fixed parsing of GFF files to support negative values (reported by Josh Sekela on the mailing-list).

v1.4.2

Toggle v1.4.2's commit message
RLS Version 1.4.2

Bugfix to parsing of GFF files

It was assumed that the score field was always non-negative.

Reported by Josh Sekela on the mailing-list:
https://groups.google.com/g/ngless/c/kf6y2MWBfec/m/2DicyAH3DwAJ

v1.4.1

Toggle v1.4.1's commit message
RLS Version 1.4.1

Fixes bug with _low memory mode_

v1.4.0

Toggle v1.4.0's commit message
RLS Version 1.4.0

Many bugfixes and improvements since `1.3.0`

- Do not fail when merging empty files (#113)
- Fix version in install-reference mode (#107)
- Update --create-reference-pack mode (#108)
- Reset terminal colors after error for `--download-demo` mode
- Add --trace argument to all modes
- Newer version of megahit
- Builtin gmgc module
- Faster internals

v1.4.0-beta2

Toggle v1.4.0-beta2's commit message
RLS Version 1.4.0-beta2

Several bugfixes included since beta1:

- Do not fail when merging empty files (#113)
- Fix version in install-reference mode (#107)
- Update --create-reference-pack mode (#108)
- Reset terminal colors after error for `--download-demo` mode
- Add --trace argument to all modes

v1.4.0-beta1

Toggle v1.4.0-beta1's commit message
RLS Version 1.4.0-beta1

- Newer version of megahit
- Builtin gmgc module
- Faster internals