Skip to content

Release 0.6.0 - #37

Merged
jqnatividad merged 11 commits into
mainfrom
release/0.6.0
Oct 26, 2026
Merged

jqnatividad merged 11 commits into
mainfrom
release/0.6.0

Conversation

@jqnatividad

@jqnatividad jqnatividad commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Release 0.6.0, to ship alongside qsv 27.0.0, where live Data Schematics are the banner feature.

Why release before qsv 27.0.0

The draft Highlights for qsv 27.0.0 tell readers to point qsv-clientd viz at a CKAN page. That command arrived in #34 and isn't in 0.5.0. Nothing else in qsv 27 depends on this release: the bridge protocol hasn't changed. The new optional source key in the schematic's data block is ignored by 0.5.0, which reads only the keys it knows (SchematicSource.from_json).

Changes

  • Version 0.6.0 in pyproject.toml, __init__.py and uv.lock.

  • CHANGELOG.md: [Unreleased] becomes [0.6.0] - 2026-10-26, with an intro and compare links. Covers feat(daemon): one-command live mode for CKAN data; fix ckan:// and web-page fetches #34 and fix(daemon): re-renders keep the recorded source; register's stdout is JSON only #35.

  • The docs now name qsv 27.0.0 or later for live schematics, in place of "a qsv newer than 26.0.0": README.md, the package description, and the docs/DAEMON.md example embed.

  • Fix (6056afa): data downloaded through qsv get (by qsv-clientd viz <URL>, or the download field of POST /v1/datasets) was left 0644 beside the schematic: qsv get cache-fetch --output puts a new file there with the umask's mode. It is now set back to 0600. Added a regression test, and the fake qsv now replaces the file the way qsv does, instead of truncating it (which had kept the mode and hidden the bug). There's no separate changelog entry: 0.5.0 had no such download path, so the bug never shipped, and the fix makes the feat(daemon): one-command live mode for CKAN data; fix ckan:// and web-page fetches #34 entry's "readable only by you" true. (The commit message says register --download; that is the API field above, not a CLI flag.)

  • Changelog (459867f): the viz <URL> entry now says that a qsv with get also keeps a copy of the data in its own cache (~/.qsv-cache or QSV_CACHE_DIR), which follows your umask. qsv's stats caches already take the CSV's mode (qsv #4622), so the 0600 fix covers them.

  • Breaking: Python 3.11+ and Pillow 13 (f99570d). All 41 open Dependabot alerts (5 critical, 23 high, 13 moderate) were for Pillow 12.3.0, which uv.lock kept for Python 3.10; Pillow 13.0.0 fixes them and requires 3.11. So [tray] now needs Pillow>=13, requires-python is >=3.11, CI runs 3.11–3.14, and tomli is gone (no runtime dependencies again). ruff's py311 rules swap six asyncio.TimeoutError for the builtin TimeoutError, the same class since 3.11. The tray only opens its own bundled icon, so the Pillow bugs weren't reachable through it. 769 passed, 2 skipped on both 3.11 and 3.14. The alerts should close when this merges.

  • Breaking: daemon.toml replaces daemon.json (74939f5, e25dc4e). JSON can't hold comments, so the tray's Open config… could only create {}. The config is now TOML, read with the stdlib's tomllib. Open config… now creates a daemon.toml with every setting commented out, each with its default and the values it takes. The template is generated from DaemonConfig, and a test checks that uncommenting every line loads cleanly and equals the defaults. A daemon.json from 0.5.x is no longer read (agreed: not widely released yet). The run directory's daemon.json (runtime info) is unchanged. Updated: README, docs/DAEMON.md, CHANGELOG (### Changed), CLAUDE.md. Tests include a Windows path round-trip.

  • A notice when qsv is older than 27.0.0 (16f2412). Its schematics can't connect, so serve logs a warning (shown without --verbose) and the tray notifies once per qsv version, rather than schematics silently staying offline. Nothing is blocked; other uses still need only qsv 25.0.0. A qsv dev build that has 27.0.0's schematic code but still reports 26.0.0 triggers it too, until qsv bumps its version.

Follow-up for 0.6.1

  • Unless qsv makes its get cache private first: point QSV_CACHE_DIR at a 0700 folder under the daemon's home for the qsv the daemon runs, then check that re-renders and Fetch latest still work.

Before publishing

  • Run the schematic flow end to end (qsv master 6e35860f0 against a local CKAN: all passed; it surfaced the 0644 bug fixed above, which the new unit test covers rather than a re-run): viz smart → register → approve → drill-down, refresh, re-render, Fetch latest, plus a qsv get (dc:) page with a source.
  • QSV_BIN=<qsv 27.0.0> uv run pytest. No build reports 27.0.0 yet. Against the newest qsv dev build (viz-live-table-sb-export 4801cb243, reports 26.0.0): 769 passed, 2 skipped, including the TOML change and the qsv < 27 notice.
  • Update the changelog date if it doesn't ship on 2026-10-26.
  • After merging, tag 0.6.0 and publish the GitHub release, which pushes it to PyPI via publish.yml.

🤖 Generated with Claude Code

Bump to 0.6.0 for qsv 27.0.0, which brings live Data Schematics.
The docs now name qsv 27.0.0 or later for them, in place of
"a qsv newer than 26.0.0".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.14%. Comparing base (4532dd3) to head (2e6205b).

Additional details and impacted files
@@            Coverage Diff             @@
##             main      #37      +/-   ##
==========================================
- Coverage   99.28%   99.14%   -0.14%     
==========================================
  Files          30       30              
  Lines        4178     4230      +52     
  Branches      542      550       +8     
==========================================
+ Hits         4148     4194      +46     
- Misses         16       20       +4     
- Partials       14       16       +2     
Files with missing lines Coverage Δ
src/qsv_client/__init__.py 100.00% <100.00%> (ø)
src/qsv_client/client.py 100.00% <100.00%> (ø)
src/qsv_client/daemon/__main__.py 99.53% <100.00%> (ø)
src/qsv_client/daemon/client.py 97.04% <100.00%> (-2.96%) ⬇️
src/qsv_client/daemon/config.py 100.00% <100.00%> (ø)
src/qsv_client/daemon/fetch.py 100.00% <100.00%> (ø)
src/qsv_client/daemon/server.py 98.92% <100.00%> (+<0.01%) ⬆️
src/qsv_client/daemon/service.py 100.00% <ø> (ø)
src/qsv_client/tray/__main__.py 100.00% <100.00%> (ø)
src/qsv_client/tray/autostart.py 100.00% <ø> (ø)
... and 1 more
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

jqnatividad and others added 10 commits October 26, 2026 08:04
…s source

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`qsv get cache-fetch --output` puts a new file at the staging path with
the umask's mode, so a `viz <URL>` or `register --download` through a
qsv with `get` left the data 0644 beside the schematic. It is made 0600
again before anything else. The test fake now replaces the file as qsv
does, rather than truncating it, which had kept the mode and hidden this.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The downloaded file is owner-only, but a qsv with `get` also caches the
data in ~/.qsv-cache (or QSV_CACHE_DIR) with its default modes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s a commented template

JSON can't hold comments, so the tray's Open config could only seed `{}`. The config is
now TOML (tomllib on 3.11+, tomli on 3.10). Open config creates daemon.toml with every
setting commented out, each with its default and the values it takes, generated from
DaemonConfig so the two can't drift. A daemon.json from 0.5.x is no longer read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tics

serve logs a warning and the tray notifies once per qsv version, rather than
schematics silently never connecting. Nothing is blocked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pillow 13.0.0 fixes the 41 open Dependabot alerts on the tray extra's
Pillow 12.3.0, and needs Python 3.11, so qsv-client drops 3.10. The
daemon's config is read with the stdlib's tomllib, so tomli is gone and
there are no runtime dependencies again. ruff's py311 rules replace
asyncio.TimeoutError with its builtin alias TimeoutError.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
uv.lock conflicted with the Python 3.11 relock; kept that lock and moved
ruff to 0.17.2, as #36 did.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…chematics

[skip ci]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jqnatividad
jqnatividad merged commit 38c69b0 into main Oct 26, 2026
@jqnatividad
jqnatividad deleted the release/0.6.0 branch October 26, 2026 23:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant