# Release Notes

### 0.0.599 - 31 March 2026

* Config variables are parsed for braces-bracketed substitution text. A OS or env.json variable in the form `"This is {who} variable"` will be rendered as `"This is my variable"` if there is another variable `who` with the value `"my"`.
* `transfer-mode` configuration also follows the braces-bracketed interpolation on the transfer-to path, enabling destinations like `sftp://{SFTP_SERVER}:{SFTP_PORT}/my/destination`.&#x20;
* The new `sql_in()` function is a SQL column analog to the existing `in()` function. `sql_in()` enables live or cached presence tests against a column from a table in Postgres, MySQL, or Sqlite.

### 0.0.598 - 11 March 2026

#### Major changes

* Support CsvPath-to-Parquet schemas and [Parquet file output](/topics/how-tos/parquet.md)
* Addition of a `definition.json` and `README.md` to named-files
* Added a configuration to automatically trigger runs on file registration
* Added a configuration to automatically use a default named-file path template for registrations
* Update to both `transfer-mode` and the SFTP integration to allow sending any/all files generated in a run
* Fix for a problem where delimiter and quotechar choices were not being applied to output files
* Substantially improved validation error reporting, including:&#x20;
  * Deduplication of similar errors
  * Improved descriptions
  * Providing more complete error information
  * Improving ID chains to better identify error sources within csvpaths
* Fix for a problem where CsvPaths run methods would act on only the first file returned by a reference, rather than all results found by the reference.
* Eight function improvements including the following new functions:&#x20;
  * **`parquet()`** - a specialization of line() that uses its schema to create a parquet file of all matching data
  * **`sort()`** a stack var
  * **`slice()`** a stack var
  * **`percent_matching(header, value|stack)`**
  * **matches()** - the same capability to indicate matching lines as the `onmatch` qualifier, but in the form of a function suitable for use cases where a function test is needed

### Winter 2025-2026 FlightPath - v1.1.87

* Comprises: CsvPath 0.0.591, FlightPath Server 0.1.27, FlightPath Data 0.1.28&#x20;
* FlightPath changes:&#x20;
  * Support for creating and editing JSONL
  * Support for editing CSV and JSON in grid view
  * New JSON text editing view
  * Edit JSONL as JSON
  * CSV and JSONL grid view editing, including copy-selected-to-new
  * Support for custom functions in FlightPath Data and FlightPath Server
  * Added `use-delimiter` and `use-quotechar` for FlightPath Data and FlightPath Server
  * Added a config dialog to compare and sync config between projects in Data and Server
  * Improved the env vars config dialog to act as a compare and sync, not just an upload, between projects in Data and Server
  * Changed to a fixed width font in the printouts tab for better table printouts
  * Many minor fixes and improvements

### **0.0.591 - 25 Jan 2026**

* Added `jsonpath()` function using jsonpath-ng
* Dozens of minor fixes and improvements

### **0.0.581 - 11 Jan 2026**

#### **Major changes**

When/do changes:&#x20;

* When/do operator right-hand sides now contribute to matching&#x20;
* When/do right-hand side now respects `nocontrib`

Custom functions changes:&#x20;

* External functions can be loaded from a file anywhere visible to the Python process&#x20;
* Functions loaded from different `function.imports` files within the same Python process do not collide&#x20;
* Multiple `functions.imports` will be loaded&#x20;
* `FunctionFactory` supports reloadeding imports files

Three new functions:&#x20;

* Added `line_before()` to compare current line header value to last line header value&#x20;
* Added `remove()` to drop one or more headers&#x20;
* Set headers manually using `rename(@stack)` or `rename(“a”, “b”, “c”…)`

Three qualifier changes:&#x20;

* Support for name qualifiers in `error()` that are visibile in error events. E.g. `error.myname(“this is a msg”)` outputs: `2025-12-08 00h42m40s-886915:temps.txt:1:`:m:`myname[1]: this is a msg`&#x20;
* Added `skipnone` qualifier primarily for `push()`. With `notnone` on `push()` `None` is flagged as an error; whereas, in some cases we just want to not push `None`s.&#x20;
* Support for the `distinct` qualifier in `string()`, `integer()`, `decimal()`, `date()`, `datetime()`

Other functions changes:&#x20;

* [New markdown docs](https://github.com/csvpath/csvpath/blob/main/docs/func_gen/index.md) generated from/by the functions. E.g. <https://github.com/csvpath/csvpath/blob/main/docs/func_gen/advance.md>. These docs are barebones, but always 100% up to date. The original function docs `.md` pages will be maintained but should not be considered the most current and/or correct.&#x20;
* `blank(name|header)` and `wildcard()` support `Any` in actuals, including `None`&#x20;
* `put()` support added for `dict`, `list`, `date`, `date` `time`, and `None`

Added `project` and `project_context` args to the `CsvPath` `__init__` in order to populate logger name fields.

### **0.0.576 - 7 dec 2025**

#### Major changes

* JSONL now available with all backends
* External custom functions are found before internals, allowing overriding
* 13 new CsvPath Validation Language functions. See the CLI functions look up for usage.
  * `headers_stack()`: returns the names of the current headers
  * `clear(var|var-name)`: removes a variable
  * `index_of(stack-var|stack-name, value)`: returns the int position of the value
  * `track_any()`: tracks typed values, optionally collecting values in a stack or summing them
  * `roll(date|datetime, number, unit-name)`: returns a date/datetime that is N-units in the future or past
  * `day(date)`: returns the date of the month as an int
  * `month(date)`: returns the month of the year as an int
  * `year(date)`: returns the year as an int
  * `format_date(date|datetime, str)`: formats a date/datetime as a string
  * `fingerprint(Optional[Header], ...)`: returns the hash of the line or the indicated header values
  * `format(str-value, str-format)`: formats a value according to a Python string template
  * `interpolate(str-value, str-format)`: formats a value within a longer string using Python formatting&#x20;
  * `xpath(xml-str, xpath-str)`: extracts a value from an XML document using an XPath expression&#x20;

#### Fixes and Updates

* 15 function updates:&#x20;
  * Number of times `reset_headers()` has been called and on what lines tracked in variables
  * Wildcard max length in `string()` using `none()`
  * `track()`: added 3rd arg `add` or `collect`, essentially the same function as for `track_any()`
  * `push()` and `get()` now able to take both stack vars and stack var names.
  * `get(x)` creates and returns a dict var if the variable named x is not found
  * Added an optional default arg to `get()`
  * `concat()` able to take a stack var of values to concatinate
  * Apply `regex()` to all headers using the `headers()` function like: `regex( headers(), /…/ )`&#x20;
  * `size()` now takes the `notnone` qualifier and either a stack var or name of a stack var
  * `eq()`  accepts None-valued vars, as well as `none()`
* Other minor user-facing changes&#x20;
  * Removed function name limitations disallowing numbers, '\_', and '.' after an inital alpha char.&#x20;
  * Made an alias to header\_names\_mismatch for clarity.
  * Added ability for transfer mode to append, rather than overwrite, using a target path ending in `+`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.csvpath.org/topics/release-notes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
