Skip to content

Releases

Datakrit 2.2.0

Choose a tag to compare

@JudikaM JudikaM released this 12 Nov 03:32
20b0a8d

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, update names 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). The windows-app.yml
    workflow builds the installer, runs that test, and attaches the installer with its
    .sha256 file.

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.exe once; later versions update
    by running their installer. The installer does not touch a Datakrit folder 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: b79cb972740313c115a1fbfdc1ed540a30d4d03b2b7511042adf4e4628f67f3d
  • datakrit-2.2.0.tar.gz: 5bfd30e1e84e78ef23763e1bb7b3192cb338551e87f6ffb8278485250558f2f0
  • Datakrit-2.2.0-windows-x64-setup.exe: 770da4a8f83dd76e2f7a2c4864cd513254ab294ebbc18d7d3b3a1116ad03a7bb
  • Datakrit-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 .sha256 files
    (sha256sum and shasum); 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

Choose a tag to compare

@JudikaM JudikaM released this 05 Nov 12:55
35c0277

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-click Datakrit\Datakrit.exe: the local interface starts and opens in the browser,
    with no Python, no terminal, and no console window. It behaves like datakrit-ui and has
    no command line; for the datakrit command and the Python API, install from PyPI. Inside
    the app, update reports the new release and its zip instead of running pip, and
    shortcuts are not offered. The folder Datakrit\licenses holds 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.md with 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-ui and 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 --check and
    shasum -a 256 --check accept 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
    Datakrit folder with the one from the new zip.

Files (SHA-256)

  • datakrit-2.1.1-py3-none-any.whl: 818102b64f28adc0381df2af5b6da563f9ac6927a929c0658fcf3e55ca4e8e4d
  • datakrit-2.1.1.tar.gz: 06e584babdc4a496e98ba46bf95d1b0de3c1f464c214777032bfb12da352486f
  • Datakrit-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 .sha256 file (sha256sum and shasum),
    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

Choose a tag to compare

@JudikaM JudikaM released this 05 Nov 05:10
5f51154

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:

  1. Download datakrit-2.0.0-py3-none-any.whl from the
    Releases page.
  2. Run python -m pip install <path-to-wheel> with the Python that has CSV Tidy.
  3. If you made shortcuts, run datakrit shortcut install (add --no-desktop if you had no
    icon on the Desktop); it replaces the old shortcuts.
  4. 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 datakrit and datakrit-ui, the module and distribution datakrit
    (python -m datakrit), and the wheel datakrit-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, and OutputError
    derive from it as before).
  • Reports: tool.name is datakrit and schema_version is 3. 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-Agent datakrit/<version> of update.
  • update installs only releases of JudikaM/datakrit with the wheel
    datakrit-X.Y.Z-py3-none-any.whl, with the same SHA-256 and download-address checks as
    before. update --version with 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 install and shortcut remove also remove
    the shortcuts that 1.x made, where 1.x put them (on the Desktop also with --no-desktop, or
    in the --folder given), 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 as datakrit-theme, datakrit-nav, and datakrit-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
    arguments export_clean(output_schema=...) and run_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 raises TypeError.
  • 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 of update --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

Choose a tag to compare

@JudikaM JudikaM released this 05 Nov 02:30
83ea474

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:

  1. 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);
  2. if this computer has shortcuts that CSV Tidy made, it runs
    python -m datakrit shortcut install (with --no-desktop when there was no CSV Tidy icon
    on the Desktop), which replaces them with Datakrit's;
  3. 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 as csv-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;
  4. 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 update follows the repository rename. It asks the trusted repositories in a fixed
    order, JudikaM/datakrit first and then JudikaM/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 on https://api.github.com/. A wheel
    is accepted only from https://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 update switches to Datakrit when the release found carries the wheel
    datakrit-X.Y.Z-py3-none-any.whl (looked for before csv_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 --check names 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-tidy is left:

    1.x 2.0.0
    commands csv-tidy, csv-tidy-ui datakrit, datakrit-ui
    python -m csv_tidy python -m datakrit
    module csv_tidy; exception CsvTidyError datakrit; DatakritError
    distribution csv-tidy; wheel csv_tidy-X.Y.Z-py3-none-any.whl datakrit; datakrit-X.Y.Z-py3-none-any.whl
    report tool.name csv-tidy; report schema_version 2 datakrit; report schema_version 3
    shortcuts "CSV Tidy" and "Update CSV Tidy" "Datakrit" and "Update Datakrit"
    repository JudikaM/csv-tidy JudikaM/datakrit

    2.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 keep schema_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 by csv-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 datakrit wheel 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

Choose a tag to compare

@JudikaM JudikaM released this 04 Nov 10:23
fec804e

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

Choose a tag to compare

@JudikaM JudikaM released this 04 Nov 09:23
582d003

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 the csv-tidy command. 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 backdrop element 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

Choose a tag to compare

@JudikaM JudikaM released this 04 Nov 08:25
b7faa9b

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

Choose a tag to compare

@JudikaM JudikaM released this 04 Nov 07:53
aaf15ac

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_version stays 1.
  • Command line: commands written for 0.5 keep working. --schema, --output-schema, and
    --output-schemas now print a warning on stderr; switch to --profile, --output-profile,
    and --output-profiles before 2.0.0, which removes the old names. Exit codes are unchanged.
  • JSON reports: schema_version is now 2. Programs that read reports must accept it and
    the renamed values in the table below; clean reports also have a top-level artifacts
    list (the same as export.artifacts, which stays). Text reports name artifacts as before.
  • Python API: export_clean(output_schema=...) and run_batch(output_schemas=...) keep
    working with a DeprecationWarning; use output_profile= and output_profiles=.
    ArtifactOutcome.kind and BatchResult.mode use 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, and output_warnings,
    matching CheckResult.ok, errors, and warnings.
  • Python API: FatalError, SourceSettings, OutputSettings, BatchInput, and
    FileOutcome are exported from csv_tidy, so every type that a public function returns or
    contains can be imported from the package.
  • Clean reports have a top-level artifacts list, like check and batch reports.
  • Issue code output_field_too_large (error, stage output, remedy max_field_chars) for a
    cleaned value that is longer than max_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_version 2. mode is dry_run instead of dry-run, and artifact kinds
    are output_csv and output_profile instead of output CSV and output profile; the
    same values in BatchResult.mode and ArtifactOutcome.kind. Messages and text reports
    still say "output CSV" and "output profile".
  • A cleaned value longer than max_field_chars is reported as output_field_too_large
    instead of field_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 header landmark, 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=...) and run_batch(output_schemas=...): use
    output_profile= and output_profiles=. The old names raise DeprecationWarning; giving
    both names raises TypeError. 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-examples for check
    (only clean and `batch...
Read more

CSV Tidy 0.5.0

Choose a tag to compare

@JudikaM JudikaM released this 28 Oct 18:58
9e2f064

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) and DDMMYYYY, for source
    and output dates in profiles, options, and the local interface (which lists YYYYMMDD).
    They may use only the fixed-width tokens YYYY, MM, and DD; YYYYMD and mixed formats
    such as YYYY-MMDD are rejected with an explanation.
  • Tab-separated files: delimiter = "\t" in profiles, --delimiter tab and
    --output-delimiter tab (a tab character or \t also works), a Tab choice in the local
    interface, and tab in the guided profile init. The single-column hint also recognizes
    tabs, and next-step commands spell the option as --delimiter tab.
  • profile init options for per-column formats: --column-number-format COLUMN=FORMAT and
    --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 with neutralize_formulas in [transform],
    --neutralize-formulas COLUMN (--no-neutralize-formulas clears 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; order and 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: main is protected, so a release commit reaches it through a pull request
    with passing CI, and the tag points to the resulting main commit (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
    example OutputError.outcomes is now declared as a tuple of ArtifactOutcome.
  • 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 that csv-tidy shortcut install refuses 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, on main, and weekly.
  • CodeQL analyzes the Python code and the local interface's JavaScript with the
    security-extended queries, on pull requests, on main, 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.py in 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: a7c2a0a002ec41acfc98eefe2661b1e12de4d8fce6fb7029d9ac37912cea4f5e
    • csv_tidy-0.5.0-py3-none-any.whl: 136607587a5e68055c48354ad21a886f85860bd2166ae28bc1c99154720f22f2

CSV Tidy 0.4.1

Choose a tag to compare

@JudikaM JudikaM released this 14 Oct 10:34
92bfb25

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 N could 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 update or 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