Release Notes
High-level descriptions of point releases
0.0.581 - 11 Jan 2026
Major changes
When/do changes:
When/do operator right-hand sides now contribute to matching
When/do right-hand side now respects
nocontrib
Custom functions changes:
External functions can be loaded from a file anywhere visible to the Python process
Functions loaded from different
function.importsfiles within the same Python process do not collideMultiple
functions.importswill be loadedFunctionFactorysupports reloadeding imports files
Three new functions:
Added
line_before()to compare current line header value to last line header valueAdded
remove()to drop one or more headersSet headers manually using
rename(@stack)orrename(“a”, “b”, “c”…)
Three qualifier changes:
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:Ⓜ️myname[1]: this is a msgAdded
skipnonequalifier primarily forpush(). Withnotnoneonpush()Noneis flagged as an error; whereas, in some cases we just want to not pushNones.Support for the
distinctqualifier instring(),integer(),decimal(),date(),datetime()
Other functions changes:
New markdown docs 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
.mdpages will be maintained but should not be considered the most current and/or correct.blank(name|header)andwildcard()supportAnyin actuals, includingNoneput()support added fordict,list,date,datetime, andNone
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 headersclear(var|var-name): removes a variableindex_of(stack-var|stack-name, value): returns the int position of the valuetrack_any(): tracks typed values, optionally collecting values in a stack or summing themroll(date|datetime, number, unit-name): returns a date/datetime that is N-units in the future or pastday(date): returns the date of the month as an intmonth(date): returns the month of the year as an intyear(date): returns the year as an intformat_date(date|datetime, str): formats a date/datetime as a stringfingerprint(Optional[Header], ...): returns the hash of the line or the indicated header valuesformat(str-value, str-format): formats a value according to a Python string templateinterpolate(str-value, str-format): formats a value within a longer string using Python formattingxpath(xml-str, xpath-str): extracts a value from an XML document using an XPath expression
Fixes and Updates
15 function updates:
Number of times
reset_headers()has been called and on what lines tracked in variablesWildcard max length in
string()usingnone()track(): added 3rd argaddorcollect, essentially the same function as fortrack_any()push()andget()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 foundAdded an optional default arg to
get()concat()able to take a stack var of values to concatinateApply
regex()to all headers using theheaders()function like:regex( headers(), /…/ )size()now takes thenotnonequalifier and either a stack var or name of a stack vareq()accepts None-valued vars, as well asnone()
Other minor user-facing changes
Removed function name limitations disallowing numbers, '_', and '.' after an inital alpha char.
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
+
Last updated