Tags: ngless-toolkit/ngless
Tags
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.
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>
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.
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.
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).
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
PreviousNext