Repository navigation
Releases
Datakrit 2.2.0
Datakrit 2.2.0
The Windows app becomes a desktop app: an installer, and its own window. Commands, options,
profiles, reports, and the Python API are unchanged.
Added
- Installer for the Windows app.
Datakrit-2.2.0-windows-x64-setup.exe(below), made with
Inno Setup 6. It installs for the current Windows user only, without administrator rights,
into%LOCALAPPDATA%\Programs\Datakrit, adds Datakrit to the Start Menu (and, if chosen, to
the Desktop), and registers an uninstaller under Settings > Apps. Running the installer
of a newer version updates the app. The zip stays available for use without installing. - Its own window. The Windows app opens in an app window of Microsoft Edge (or Google
Chrome when Edge is missing) with a private, temporary profile, without tabs or an address
bar. Closing the window stops the app, and Quit closes the window. Without Edge or
Chrome the page opens in the default browser, as before. No library is added to the app. - In the Windows app,
updatenames the installer of the new release (and the zip).
Changed
- The smoke test of the Windows app (
packaging/windows/smoke_app.py) also checks the app
window (--window) and the installer (install, run, uninstall). Thewindows-app.yml
workflow builds the installer, runs that test, and attaches the installer with its
.sha256file.
Fixed
- The local interface starts without asking the resolver for the name of
127.0.0.1, which
could delay its start by half a minute on some computers (macOS among them).
Upgrade notes
- Profile, CLI, report, and Python API compatibility: unchanged.
- Windows app users: run
Datakrit-2.2.0-windows-x64-setup.exeonce; later versions update
by running their installer. The installer does not touch aDatakritfolder unzipped from
an earlier zip: delete that folder yourself when you no longer need it. - pip installs:
datakrit update(or the Update Datakrit entry), or
python -m pip install --upgrade datakrit.
Files (SHA-256)
datakrit-2.2.0-py3-none-any.whl:b79cb972740313c115a1fbfdc1ed540a30d4d03b2b7511042adf4e4628f67f3ddatakrit-2.2.0.tar.gz:5bfd30e1e84e78ef23763e1bb7b3192cb338551e87f6ffb8278485250558f2f0Datakrit-2.2.0-windows-x64-setup.exe:770da4a8f83dd76e2f7a2c4864cd513254ab294ebbc18d7d3b3a1116ad03a7bbDatakrit-2.2.0-windows-x64.zip:6313788d596ccd1889b3aa9ff40b8e8df2332ac4f22d4ccac950047f35e5d4b6
Check the installer or the zip before you run it: in PowerShell,
Get-FileHash .\Datakrit-2.2.0-windows-x64-setup.exe -Algorithm SHA256 must print the hash
above (on Linux or macOS, sha256sum --check Datakrit-2.2.0-windows-x64-setup.exe.sha256).
The installer and the app are not code-signed, so Windows SmartScreen may warn the first
time: choose More info, then Run anyway, only for a file from this page whose hash
matches.
Verification
- CI on the tagged commit (
20b0a8d): CI,
CodeQL,
Dependency audit, all green. - Windows app and installer built from the tag: run.
- Smoke tests: the wheel installed in a fresh environment on Windows (Python 3.13); the
downloaded zip and installer checked against their SHA-256 and.sha256files
(sha256sumandshasum); the zip run with its app window (Quit and closing the window
each end the app with exit code 0); the installer installed, its app checked (license
notices, page and files served with the session key, refused without it, Quit), and
uninstalled with nothing left under Settings > Apps. - Not verified: a double-click on a clean Windows computer, how SmartScreen reacts to the
unsigned installer, and how antivirus programs react to it.
Datakrit 2.1.1
Datakrit 2.1.1
Two easier ways to install Datakrit: pip install datakrit from PyPI, and on Windows an app
that needs no Python (Datakrit-2.1.1-windows-x64.zip, below). This is the first release
with both. The tag v2.1.0 was prepared first but never published (its Windows app's
checksum file ended in CRLF, which GNU coreutils 8 and macOS shasum cannot check), so 2.1.1
carries all of its changes and the fix. Commands, options, profiles, reports, and the Python
API are unchanged.
Added
- PyPI. Datakrit is published as
datakrit. The
files there are the wheel and sdist of this release, with the same SHA-256. GitHub Actions
uploads them through PyPI Trusted Publishing, so no upload token or password exists; before
uploading, the workflow checks each file against the digest that GitHub publishes, runs
twine check --strict, and checks that the version is the tag's. - Windows app. Download
Datakrit-2.1.1-windows-x64.zip, check it (below), unzip it, and
double-clickDatakrit\Datakrit.exe: the local interface starts and opens in the browser,
with no Python, no terminal, and no console window. It behaves likedatakrit-uiand has
no command line; for thedatakritcommand and the Python API, install from PyPI. Inside
the app,updatereports the new release and its zip instead of running pip, and
shortcuts are not offered. The folderDatakrit\licensesholds the license notices of
Datakrit and of what the app bundles (Python, tomli-w, and the Microsoft runtime files).
The app is built by GitHub Actions from the tag and smoke-tested before it is attached. NOTICE.mdwith the license notices of the interface's icons (Lucide, ISC; icons derived
from Feather, MIT), included in the wheel and the sdist.- A smoke mode for
datakrit-uiand the app, for automated checks (the environment variable
DATAKRIT_UI_URL_FILE).
Changed
- Package metadata:
Development Status :: 5 - Production/Stable, and the local interface in
the description. Every link and image in the README is absolute, so the PyPI page works. - CI runs
twine check --strict, builds and smoke-tests the app on every pull request, and
audits the app's build tools (PyInstaller, pinned with hashes) with the other dependencies.
Fixed
- The Windows app's checksum file is one line that ends in LF, so
sha256sum --checkand
shasum -a 256 --checkaccept it on every system.
Upgrade notes
- Profile, CLI, report, and Python API compatibility: unchanged. Nothing changes for
profiles, CLI, reports, or the Python API. - Existing installs:
datakrit update(or the Update Datakrit entry), or
python -m pip install --upgrade datakrit. Windows users without Python: replace the old
Datakritfolder with the one from the new zip.
Files (SHA-256)
datakrit-2.1.1-py3-none-any.whl:818102b64f28adc0381df2af5b6da563f9ac6927a929c0658fcf3e55ca4e8e4ddatakrit-2.1.1.tar.gz:06e584babdc4a496e98ba46bf95d1b0de3c1f464c214777032bfb12da352486fDatakrit-2.1.1-windows-x64.zip:e3201ed8b793bfa1ddb9a86a371ffea531951ec7d37175fd4af201011d55d666
Check the app before you run it: in PowerShell, Get-FileHash .\Datakrit-2.1.1-windows-x64.zip -Algorithm SHA256
must print the hash above (on Linux or macOS, sha256sum --check Datakrit-2.1.1-windows-x64.zip.sha256).
The app is not code-signed, so Windows SmartScreen may warn the first time: choose More
info, then Run anyway, only for a file from this page whose hash matches.
Verification
- CI on the tagged commit (
35c0277): CI,
CodeQL,
Dependency audit, all green. - Windows app built from the tag: run.
- Smoke tests: the wheel installed in a fresh environment on Windows (Python 3.13); the
downloaded zip checked against its SHA-256, its.sha256file (sha256sumandshasum),
and its license notices, then started in smoke mode (page and files served with the
session key, refused without it, Quit ends the app with exit code 0). - Not verified: a double-click on a clean Windows computer, how SmartScreen reacts to the
unsigned app, and how antivirus programs react to it.
Datakrit 2.0.0
The product is called Datakrit: check and clean table files, explicitly. Every program,
module, distribution, error class, report tool.name, shortcut, interface storage key, and
the repository address carry the new name, and there are no aliases for the old names. The
aliases deprecated in 1.0.0 are removed. Data behavior is unchanged: profiles keep
schema_version = 1 and give the same results, and reports change only in tool.name and
schema_version. Supported input is still CSV with the delimiters ,, ;, and tab.
Upgrading to 2.0.0
| Item | 1.x | 2.0.0 |
|---|---|---|
| Commands | csv-tidy, csv-tidy-ui |
datakrit, datakrit-ui |
| Module | python -m csv_tidy, import csv_tidy |
python -m datakrit, import datakrit |
| Distribution and wheel | csv-tidy, csv_tidy-X.Y.Z-py3-none-any.whl |
datakrit, datakrit-X.Y.Z-py3-none-any.whl |
| Error class | CsvTidyError |
DatakritError |
| Options removed (deprecated in 1.0.0) | --schema, --output-schema, --output-schemas |
--profile, --output-profile, --output-profiles |
| Keywords removed (deprecated in 1.0.0) | export_clean(output_schema=...), run_batch(output_schemas=...) |
output_profile=..., output_profiles=... |
| Reports | tool.name csv-tidy, schema_version 2 |
tool.name datakrit, schema_version 3 |
| Shortcuts | "CSV Tidy", "Update CSV Tidy" (csv-tidy.desktop, csv-tidy-update.desktop on Linux) |
"Datakrit", "Update Datakrit" (datakrit.desktop, datakrit-update.desktop) |
| Interface storage (browser) | csv-tidy-theme, csv-tidy-nav, csv-tidy-howto |
datakrit-theme, datakrit-nav, datakrit-howto (moved on the first load) |
| Repository | https://github.com/JudikaM/csv-tidy |
https://github.com/JudikaM/datakrit (the old address redirects) |
Unchanged: profiles (schema_version = 1, including output profiles written by 1.x), every
option and keyword other than the removed ones, exit codes, issue codes, and every report
field other than tool.name and schema_version. Programs that read reports and accept
schema_version 2 can accept 3 the same way.
From CSV Tidy 1.2.0, csv-tidy update (or the Update CSV Tidy entry) switches by
itself: it installs Datakrit 2.0.0 from its release, verified with the published SHA-256;
if the computer has shortcuts that CSV Tidy made, it runs
python -m datakrit shortcut install (with --no-desktop when there was no icon on the
Desktop), which replaces them with Datakrit's; it removes CSV Tidy with
python -m pip uninstall -y csv-tidy (on Windows, when CSV Tidy is still running, it prints
that command instead); and it says how to start Datakrit. csv-tidy update --check describes
the switch first.
From CSV Tidy 1.1.x or older, switch by hand:
- Download
datakrit-2.0.0-py3-none-any.whlfrom the
Releases page. - Run
python -m pip install <path-to-wheel>with the Python that has CSV Tidy. - If you made shortcuts, run
datakrit shortcut install(add--no-desktopif you had no
icon on the Desktop); it replaces the old shortcuts. - Run
python -m pip uninstall csv-tidy.
Then replace csv-tidy with datakrit in scripts, csv_tidy with datakrit in imports, and
CsvTidyError with DatakritError.
Changed
- The programs are
datakritanddatakrit-ui, the module and distributiondatakrit
(python -m datakrit), and the wheeldatakrit-X.Y.Z-py3-none-any.whl. The package
description carries the tagline "Check and clean table files, explicitly." - The base exception is
DatakritError(ProfileError,InputError, andOutputError
derive from it as before). - Reports:
tool.nameisdatakritandschema_versionis3. Nothing else in the reports
changed; the results of every example profile were compared with those of 1.2.0. - Generated text names Datakrit: help, epilogs, messages, the error prefix
datakrit: error:, profile header comments, the temporary-file suffix.datakrit.tmp, and
the User-Agentdatakrit/<version>ofupdate. updateinstalls only releases ofJudikaM/datakritwith the wheel
datakrit-X.Y.Z-py3-none-any.whl, with the same SHA-256 and download-address checks as
before.update --versionwith a version before 2.0.0 is refused (exit code 2) with a hint
to install that wheel by hand from the Releases page.- Shortcuts are called "Datakrit" and "Update Datakrit", with the description "Check and
clean table files on this computer".shortcut installandshortcut removealso remove
the shortcuts that 1.x made, where 1.x put them (on the Desktop also with--no-desktop, or
in the--foldergiven), when they start the 1.x programs; files with those names that
belong to other programs are kept. - The local interface shows Datakrit in the page title, the side bar, the "About this page"
text, the dialogs, and the version chip, and uses Datakrit's icon as the page icon and in
the side bar (logo-mark.png, 64 x 64). Its theme, side-bar, and "How to use" choices are
stored asdatakrit-theme,datakrit-nav, anddatakrit-howto; a choice stored by 1.x
moves to its new key when the page loads. - The repository is
https://github.com/JudikaM/datakrit.
Removed
- The options
--schema,--output-schema, and--output-schemas, and the keyword
argumentsexport_clean(output_schema=...)andrun_batch(output_schemas=...), deprecated
in 1.0.0. A removed option is a usage error (exit code 2) that names its replacement; a
removed keyword raisesTypeError. logo.png(the logo with the old name) from the interface files.- The update path of 1.2.0 that looked in two repositories and switched installations; 2.0.0
updates only itself.
Verification
- CI on the release commit 5f51154 (Linux, Windows, and macOS; Python 3.11 to 3.15): https://github.com/JudikaM/datakrit/actions/runs/41971789713
- CodeQL and the dependency audit passed on the same commit.
- Smoke test: the attached wheel, built from the tagged commit, installed in a fresh environment on Windows 11 with CPython 3.13 (
scripts/smoke_dist.py), including the shortcut command that the 1.2.0 update runs and the refusal ofupdate --version 1.2.0. - The results of every example profile were compared with those of the published 1.2.0 wheel and are the same.
CSV Tidy 1.2.0
The last CSV Tidy release. In 2.0.0 the product is renamed to Datakrit, and the repository
JudikaM/csv-tidy becomes JudikaM/datakrit. 1.2.0 prepares csv-tidy update for that
rename, so that it keeps working and can switch an installation over to Datakrit, and it
announces the rename. Commands, the Python API, profiles, reports, and the interface are
unchanged.
Upgrade notes (from 1.1.1). Profiles, CLI, reports, and the Python API are unchanged.
Update to 1.2.0 with csv-tidy update now: installs older than 1.2.0 cannot follow the
repository rename. From 1.2.0, csv-tidy update (or the Update CSV Tidy entry) finds
Datakrit 2.0.0 once it is released and switches to it:
- it installs Datakrit from its release, verified with the published SHA-256 like any
update (CSV Tidy and Datakrit share no files, so nothing is overwritten); - if this computer has shortcuts that CSV Tidy made, it runs
python -m datakrit shortcut install(with--no-desktopwhen there was no CSV Tidy icon
on the Desktop), which replaces them with Datakrit's; - it removes CSV Tidy with
python -m pip uninstall -y csv-tidy. On Windows a running
program cannot be removed, so when the update runs ascsv-tidy update(or while the
interface is open), it prints that command instead; run it after closing CSV Tidy. From
the Update CSV Tidy entry the removal runs by itself; - it says how to start Datakrit: the Datakrit icon or
datakrit ui.
csv-tidy update --check describes the switch before anything is installed. Profiles keep
working with Datakrit. Installs older than 1.2.0 need these steps by hand after the
rename: download the Datakrit wheel from the
Releases page, run
python -m pip install <path-to-wheel>, then python -m pip uninstall csv-tidy.
Changed
csv-tidy updatefollows the repository rename. It asks the trusted repositories in a fixed
order,JudikaM/datakritfirst and thenJudikaM/csv-tidy: a 404 moves on to the next one,
"GitHub has no ... release" is reported only when both answer 404, and any other failure
stops with the offline hint and installs nothing. When the request was redirected, the
answer is accepted only if the final address is still onhttps://api.github.com/. A wheel
is accepted only fromhttps://github.com/JudikaM/datakrit/releases/download/or
https://github.com/JudikaM/csv-tidy/releases/download/; the published SHA-256 and pip's
#sha256=check are required exactly as before. The release link and the offline hint name
the repository that answered (with no answer at all, the hint names
JudikaM/csv-tidy, whose address keeps working after the rename).csv-tidy updateswitches to Datakrit when the release found carries the wheel
datakrit-X.Y.Z-py3-none-any.whl(looked for beforecsv_tidy-X.Y.Z-py3-none-any.whl), in
the steps described in the upgrade notes. It prints what happened in each step; when a step
after the installation fails, it prints the exact command that finishes it and exits with
code 2. When the installation fails, nothing else runs and CSV Tidy stays installed. When
looking for the shortcuts or replacing them fails, CSV Tidy stays installed too, so that its
icons keep working, and both remaining commands are printed.csv-tidy update --checknames the repository that answered, describes the switch for a
Datakrit release, and otherwise announces the rename.
Deprecated
-
The name CSV Tidy. 2.0.0 renames the product to Datakrit; nothing named CSV Tidy or
csv-tidyis left:1.x 2.0.0 commands csv-tidy,csv-tidy-uidatakrit,datakrit-uipython -m csv_tidypython -m datakritmodule csv_tidy; exceptionCsvTidyErrordatakrit;DatakritErrordistribution csv-tidy; wheelcsv_tidy-X.Y.Z-py3-none-any.whldatakrit;datakrit-X.Y.Z-py3-none-any.whlreport tool.namecsv-tidy; reportschema_version2datakrit; reportschema_version3shortcuts "CSV Tidy" and "Update CSV Tidy" "Datakrit" and "Update Datakrit" repository JudikaM/csv-tidyJudikaM/datakrit2.0.0 also removes the aliases deprecated in 1.0.0, as planned:
--schema,
--output-schema,--output-schemas,export_clean(output_schema=...), and
run_batch(output_schemas=...). Profiles keepschema_version = 1, and 1.x profiles keep
working unchanged. There is no warning at run time, because the new names do not exist in
1.x; the rename is announced here, in docs/STABILITY.md,
and bycsv-tidy update --check.
Verification
- CI on the release commit 83ea474 (Linux, Windows, and macOS; Python 3.11 to 3.15), including the switch to Datakrit run with a dummy
datakritwheel in a fresh environment: https://github.com/JudikaM/csv-tidy/actions/runs/41955071770 - CodeQL and the dependency audit passed on the same commit.
- Smoke test: the attached wheel, built from the tagged commit, installed in a fresh environment on Windows 11 with CPython 3.13 (
scripts/smoke_dist.py), including the switch with the environment on drive D: and TEMP on drive C:.
CSV Tidy 1.1.1
Small fixes to the look of the local interface.
Upgrade notes (from 1.1.0). Profiles, CLI, reports, and the Python API are unchanged.
Changed
- Interface: clicking a control in the file card with the mouse no longer draws blue lines
around it. The card keeps its border while a control in it has focus, and the file area and
the lists (such as Encoding and the lists of step 3) show their focus ring only when
they are reached with the keyboard. The ring around the chosen separator and file mode is
unchanged. - Interface: lists (such as Encoding and the lists of step 3) show the same chevron as
How to use, a little further from the edge than the browser's arrow, and it turns while
the list is open (at once when the system asks for reduced motion). The date list of a
column rule is slightly wider, so "Like the file (YYYY-MM-DD)" fits. - Interface: thin scroll bars (a 6-pixel rounded thumb without a track) for the page, the side
bar, the side panel (when the open How to use guide makes it taller than the window),
and tables, in both themes.
Verification
- CI on the release commit fec804e (Linux, Windows, and macOS; Python 3.11 to 3.15): https://github.com/JudikaM/csv-tidy/actions/runs/41812274509
- CodeQL and the dependency audit passed on the same commit.
- Smoke test: the attached wheel, built from the tagged commit, installed in a fresh environment on Windows 11 with CPython 3.13 (
scripts/smoke_dist.py).
CSV Tidy 1.1.0
A short guide in the local interface.
Upgrade notes (from 1.0.1). Profiles, CLI, reports, and the Python API are unchanged.
Added
- Interface: How to use at the bottom of the side panel, a short guide that is closed
until it is opened: the six steps in one line each, every step name leading to its step,
and a tip that profiles saved on the page also work with thecsv-tidycommand. It is a
native disclosure that works with the keyboard and screen readers, and whether it is open
is remembered in the browser (csv-tidy-howto, where the browser allows storage). In wide
windows the side panel now scrolls on its own when it is taller than the window.
Removed
- Interface: the unused background layer (the
backdropelement and its style rule) and its
style tokens--nebula-1,--nebula-2,--nebula-3, and--stars. They were transparent
in both themes, so the page looks the same.
Verification
- CI on the release commit 582d003 (Linux, Windows, and macOS; Python 3.11 to 3.15): https://github.com/JudikaM/csv-tidy/actions/runs/41806414024
- CodeQL and the dependency audit passed on the same commit.
- Smoke test: the attached wheel, built from the tagged commit, installed in a fresh environment on Windows 11 with CPython 3.13 (
scripts/smoke_dist.py).
CSV Tidy 1.0.1
A small clean-up of the local interface.
Upgrade notes (from 1.0.0). Profiles, CLI, reports, and the Python API are unchanged.
Changed
- Interface: the side bar, the narrow-screen top bar, and the browser tab use a small logo
mark without text (logo-mark.png, 64 x 64 pixels), which stays readable at 24 to 32
pixels. The full logo (logo.png) is still served and packaged.
Removed
- Interface: three unused style tokens,
--header,--status-bg, and--z-sticky, from the
page's style sheet. Nothing used them, so the page looks the same.
Verification
- CI on the release commit b7faa9b (Linux, Windows, and macOS; Python 3.11 to 3.15): https://github.com/JudikaM/csv-tidy/actions/runs/41798742026
- CodeQL and the dependency audit passed on the same commit.
- Smoke test: the attached wheel, built from the tagged commit, installed in a fresh environment on Windows 11 with CPython 3.13 (
scripts/smoke_dist.py).
CSV Tidy 1.0.0
The first stable release. docs/STABILITY.md lists everything that 1.x
keeps compatible: profiles, command-line options, exit codes, issue codes, JSON reports, and
the Python API. To get there, a few names were made consistent (with the old command-line
and Python names still accepted), and the local interface was reorganized like a desktop
application with a side bar, a file card, and a side panel.
Upgrade notes (from 0.5.0).
- Profiles: unchanged. Every 0.x profile works as before; profile
schema_versionstays 1. - Command line: commands written for 0.5 keep working.
--schema,--output-schema, and
--output-schemasnow print a warning on stderr; switch to--profile,--output-profile,
and--output-profilesbefore 2.0.0, which removes the old names. Exit codes are unchanged. - JSON reports:
schema_versionis now 2. Programs that read reports must accept it and
the renamed values in the table below; clean reports also have a top-levelartifacts
list (the same asexport.artifacts, which stays). Text reports name artifacts as before. - Python API:
export_clean(output_schema=...)andrun_batch(output_schemas=...)keep
working with aDeprecationWarning; useoutput_profile=andoutput_profiles=.
ArtifactOutcome.kindandBatchResult.modeuse the new values below. - Local interface: every feature works as before; it is laid out differently (see
Changed). Its look, layout, and internal HTTP API are not covered by the stability promise.
| Where | 0.5.0 | 1.0.0 |
|---|---|---|
Option (check, clean, batch) |
--schema PROFILE |
--profile PROFILE (old name deprecated) |
Option (clean) |
--output-schema PATH |
--output-profile PATH (old name deprecated) |
Option (batch clean) |
--output-schemas |
--output-profiles (old name deprecated) |
Report schema_version |
1 |
2 |
Report mode (clean, batch), BatchResult.mode |
"dry-run" |
"dry_run" ("apply" unchanged) |
Artifact kind (reports, ArtifactOutcome.kind) |
"output CSV", "output profile" |
"output_csv", "output_profile" ("report" unchanged) |
Issue code for a cleaned value longer than max_field_chars (stage output) |
field_too_large |
output_field_too_large (field_too_large stays the fatal reading error) |
| Clean report | export.artifacts |
artifacts and export.artifacts (the same list) |
export_clean keyword |
output_schema= |
output_profile= (old name deprecated) |
run_batch keyword |
output_schemas= |
output_profiles= (old name deprecated) |
Added
- docs/STABILITY.md: what Semantic Versioning covers from 1.0.0
(profiles, command-line options, exit codes, issue codes, JSON reports, the Python API) and
what it does not (the look of the local interface, message wording, benchmark numbers), a
full inventory of that surface, the decisions that led to this release, and the
deprecation rules. A test keeps the inventory in step with the code. - Command line:
--profile(check,clean,batch check,batch clean),
--output-profile(clean), and--output-profiles(batch clean). Help text, next-step
sentences, and the documentation use them. - Python API:
CleanResult.ok,source_errors,source_warnings, andoutput_warnings,
matchingCheckResult.ok,errors, andwarnings. - Python API:
FatalError,SourceSettings,OutputSettings,BatchInput, and
FileOutcomeare exported fromcsv_tidy, so every type that a public function returns or
contains can be imported from the package. - Clean reports have a top-level
artifactslist, like check and batch reports. - Issue code
output_field_too_large(error, stageoutput, remedymax_field_chars) for a
cleaned value that is longer thanmax_field_chars. - Interface: the side bar has New check (start again with nothing loaded; it asks first
when files, rules, or results would be lost, and removes the temporary copies), Find
(shows only the table rows of the current step that contain a word: a column name, a value,
or a problem; Escape empties and closes it), and In this session: every loaded file with
its row count and whether it is not checked yet, has problems, or is fine, shown as an icon
and in words. Clicking a file opens its latest result; with several files, the file's
details, and the results of the other files are kept. A note says that nothing is kept
after Quit. - Interface: the side panel shows the current Profile (Load, Save), how many Columns
have rules (Edit), the Unique keys (Add), the Output separator, encoding, line
ending, and formula protection (Edit), and the Theme (Switch). Each action leads to the
control in step 3. - Documentation: "Migrating from 0.x" in the README, the interface's limits under "Supported
conventions and limits" (one session, results in memory, nothing kept after Quit, the size
limit), a section on working on the interface in CONTRIBUTING.md, the page structure in
ARCHITECTURE.md, the 1.x support policy in SECURITY.md, and user-testing tasks for the new
layout with a results table and a screen-reader (NVDA) checklist in docs/USER_TESTING.md.
The sessions with people and the screen-reader session are planned after 1.0; they have
not taken place.
Changed
- Reports:
schema_version2.modeisdry_runinstead ofdry-run, and artifact kinds
areoutput_csvandoutput_profileinstead ofoutput CSVandoutput profile; the
same values inBatchResult.modeandArtifactOutcome.kind. Messages and text reports
still say "output CSV" and "output profile". - A cleaned value longer than
max_field_charsis reported asoutput_field_too_large
instead offield_too_large; it still blocks the export. - Interface: the page is laid out like a desktop application. A side bar on the left holds
previous/next step buttons, the sections above, links to the files, profile, report, and
settings parts of the page, and, at the bottom, the logo, version, "Offline & local", the
theme switch, and Quit (which still asks first). It can be folded to a row of icons, and
the choice is remembered in this browser. The steps stay in the middle column under one
page title; a side panel on the right holds the rows above and the notes that were in the
footer. Below 1100 pixels the side panel moves under the steps; below 720 pixels the side
bar opens over the page from a bar at the top and keeps the keyboard inside until it is
closed (Escape or the side-bar button). Every feature works as before. - Interface: the file, separator, encoding, and one-file/several-files choice are in one input
card at the top of the middle column, with a + button, the size limit, and one primary
button that checks, then previews the cleaning, then shows the ways to save. A breadcrumb
(Files / NAME) lists the loaded files and opens their latest result; the title shows the
file name. Steps 1-6 now show one at a time under the card: the step you pick, or the one
with the newest result (2 after reading a file, 4 after a check, 5 after a cleaning
preview). The status line sits quietly above the step content. - Interface: in the dark theme the side bar is #1F1F1F on a #191919 page, divided by a
#303030 line. - Interface: the side panel is a card at the right edge of the window; the main column stays
centered in the space between the side bar and the panel. - Interface: the dark theme (still the default) uses the colors of VS Code's built-in "Dark
Modern" theme and is now named "Dark Modern"; a theme chosen earlier is still remembered. - Interface: every icon is now an inline Lucide icon (the set shadcn/ui
uses), including the Tab separator and the theme switch, which shows a sun or moon in the
text color as in shadcn/ui's mode toggle; still no external files or requests. - Interface: the light theme uses the colors of VS Code's built-in "Light+" theme and is now
named "Light+". Text contrast stays at least 4.5:1 in both themes. - Interface: the CSV Tidy logo is shown in the side bar and used as the page icon
(logo.png, served by the local server like the other page files). - Interface: the marked step in the step navigation is gray in both themes instead of indigo.
- Interface accessibility: the bar at the top of narrow windows is a
headerlandmark, the
breadcrumb's file button has a name before the script runs, and every control, landmark,
focus ring, keyboard path, reduced-motion setting, and color pair was checked automatically
in both themes at three window widths (see TEST_CASES.md). This was an automated check,
not a session with a screen reader. - The saved-profile header of the interface and
profile init's next steps name--profile.
Deprecated
--schema,--output-schema, and--output-schemas: use--profile,--output-profile,
and--output-profiles. The old names still work, are not shown by--help, and print a
warning on stderr; giving an old and a new name together is a usage error. Removed in 2.0.0.export_clean(output_schema=...)andrun_batch(output_schemas=...): use
output_profile=andoutput_profiles=. The old names raiseDeprecationWarning; giving
both names raisesTypeError. Removed in 2.0.0.
Fixed
- Interface: pressing the check or preview button right after typing in a field that reads the
file again (such as "Rows shown in previews") no longer loses the press; it now runs once the
file was read. - Documentation: the README options table no longer lists
--max-examplesforcheck
(onlycleanand `batch...
CSV Tidy 0.5.0
CSV Tidy 0.5.0
Dates without separators, tab-separated files, per-column formats in profile init,
protection against formulas in exported files, a fix for the local interface, and tooling that
checks what the project claims: types, every supported Python version on Linux, Windows, and
macOS, test coverage, dependency vulnerabilities, and code scanning.
Upgrade notes. Profiles, CLI options, exit codes, and the Python API of 0.4 keep working
unchanged; everything new is opt-in. JSON reports gain transformations.neutralize_formulas
(an empty list when unused). A profile written by 0.5 is still read by 0.4 unless it uses a
tab delimiter, a date format without separators, or neutralize_formulas.
Added
- Date formats without separators, such as
YYYYMMDD(20261231) andDDMMYYYY, for source
and output dates in profiles, options, and the local interface (which listsYYYYMMDD).
They may use only the fixed-width tokensYYYY,MM, andDD;YYYYMDand mixed formats
such asYYYY-MMDDare rejected with an explanation. - Tab-separated files:
delimiter = "\t"in profiles,--delimiter taband
--output-delimiter tab(a tab character or\talso works), a Tab choice in the local
interface, and tab in the guidedprofile init. The single-column hint also recognizes
tabs, and next-step commands spell the option as--delimiter tab. profile initoptions for per-column formats:--column-number-format COLUMN=FORMATand
--column-date-format COLUMN=FORMAT, for files whose columns use different number or date
formats. They are checked before anything is written.- Opt-in neutralization of spreadsheet formulas (CSV injection): values of selected text
columns that start with=,+,-,@, a tab, or a carriage return get a leading',
as OWASP recommends. Select it withneutralize_formulasin[transform],
--neutralize-formulas COLUMN(--no-neutralize-formulasclears it), or Repair:
protect formulas in the local interface; it works in batch processing and the Python
API (Overrides.neutralize_formulas). It runs after normalize and before deduplicate.
Number and date columns cannot be selected. JSON reports gain
transformations.neutralize_formulas;orderand text reports name the step only when
it is selected, and generated profiles write the key only when it is used. - README: status badges, quick links, and screenshots of the local interface in its dark and
light themes (docs/images/). - A code of conduct (Contributor Covenant 2.1), linked from the README and CONTRIBUTING.md and
included in the source distribution. - The new-issue page links questions to Discussions and security reports to private
vulnerability reporting; blank issues stay available for contact requests.
Changed
- Security reports now go through GitHub private vulnerability reporting instead of a
detail-free contact-request issue (SECURITY.md). - Release process:
mainis protected, so a release commit reaches it through a pull request
with passing CI, and the tag points to the resultingmaincommit (docs/RELEASE.md). - Type annotations are checked with mypy in strict mode, locally and in every CI job. The
check found imprecise annotations, which are corrected without any change in behavior; for
exampleOutputError.outcomesis now declared as a tuple ofArtifactOutcome. - CI tests every supported Python version (3.11 to 3.15) on Linux, and Python 3.11 and 3.15 on
Windows and macOS. On macOS the distribution smoke test checks thatcsv-tidy shortcut installrefuses with exit code 2, since shortcuts are made on Windows and Linux only. - CI measures line and branch coverage of the tests (94% when this was added) and fails below
92%. - A dependency audit (pip-audit) checks every package pinned for development and CI against
published vulnerabilities, on pull requests, onmain, and weekly. - CodeQL analyzes the Python code and the local interface's JavaScript with the
security-extendedqueries, on pull requests, onmain, and weekly. - Package metadata: Documentation, Source, and Releases links.
Fixed
- Local interface: a refused request (another origin, a missing session key, or a body that
is not JSON) could reset the connection on Windows before the answer arrived, so the
client saw a network error instead of the refusal. The server now reads the rest of a
refused request's body (up to 1 MB) before it closes the connection.
Verification
- CI on the tagged commit
9e2f064, all passed:
CI (Linux with Python 3.11 to
3.15, Windows and macOS with Python 3.11 and 3.15),
CodeQL, and the
dependency audit. - The wheel and the source distribution were built from
git archive v0.5.0. The wheel passed
scripts/smoke_dist.pyin a fresh environment on Windows 11 with Python 3.13, before upload
and again as downloaded from this release. - SHA-256:
csv_tidy-0.5.0.tar.gz:a7c2a0a002ec41acfc98eefe2661b1e12de4d8fce6fb7029d9ac37912cea4f5ecsv_tidy-0.5.0-py3-none-any.whl:136607587a5e68055c48354ad21a886f85860bd2166ae28bc1c99154720f22f2
CSV Tidy 0.4.1
CSV Tidy 0.4.1
A new look for the local interface, and a port fix on Windows. The CLI, profiles, reports,
exit codes, and the Python API are unchanged.
Changed
- The local interface has a dark "Cosmos" theme (the default) and a light theme, switched in
the header and remembered by the browser. Each step is a card with a numbered badge, the
status strip marks the current step in a step navigation, mode and separator choices are
option cards, files can be dropped onto the file area, Quit asks for confirmation, and saved
files are confirmed with a short notice. Everything stays local: no web fonts or external
styles. Text contrast is at least 4.5:1 in both themes.
Fixed
- On Windows, a second
csv-tidy ui --port Ncould share the port of a running interface, so
its page was refused. The port is now claimed exclusively and the second start explains why
it cannot start.
The full list is in CHANGELOG.md.
Upgrade notes
- Profile/report compatibility: unchanged.
- Users of 0.4.0 can run
csv-tidy updateor the Update CSV Tidy entry. The icons keep
working.
Installation
Not on PyPI. Download the wheel below and run python -m pip install <path-to-wheel> in a
virtual environment (Python 3.11 or newer), then csv-tidy shortcut install.
Verification
- CI run for the tagged commit 92bfb25 (Linux and Windows, Python 3.11 and 3.15): https://github.com/JudikaM/csv-tidy/actions/runs/38550195167
- Smoke test: the attached wheel and sdist were built from the tag; the wheel was installed in
a fresh environment on Windows 11 with CPython 3.13.3 (scripts/smoke_dist.py, including all
interface assets in both archives). - SHA-256:
f8f466a34930c3a50b179eb68304bf2aa742485abe6ad4340742f929f0a637f8
csv_tidy-0.4.1-py3-none-any.whl,d6e1d1b892003a4461f627de23520ddc3d5a0ddbcbd22b4ad6684bf06f89ebf9
csv_tidy-0.4.1.tar.gz