Skip to content

Prepare the 1.0.0 release: README, CHANGELOG, packaging, release workflow#113

Merged
roed314 merged 6 commits into
roed314:mainfrom
roed-math:release-1.0
Jul 22, 2026
Merged

Prepare the 1.0.0 release: README, CHANGELOG, packaging, release workflow#113
roed314 merged 6 commits into
roed314:mainfrom
roed-math:release-1.0

Conversation

@roed-math

@roed-math roed-math commented Jul 21, 2026

Copy link
Copy Markdown

The capstone of the 1.0 wave, rebased onto main after the rest of the wave merged (#114#124 including the config redesign, the Sphinx site, the 3.9/SPDX packaging modernization and Versioning.md).

What's here

Verification

  • Full suite 857 passed / 36 skipped (PG18, psycopg 3.3.4); ruff clean.
  • python -m sphinx -W --keep-going clean, with the rewritten README's five guide links resolving on-site.
  • python -m build + twine check --strict: PASSED for both sdist and wheel; wheel METADATA carries Version 1.0.0 / SPDX license / ≥3.9.
  • Quickstart flow verified end-to-end against a live PG18 server (fresh HOME → ~/.psycodict/config.ini created, table/insert/search as shown, no cwd pollution).

After this merges: register the PyPI pending publisher (and optionally pre-create the pypi GitHub environment to attach protection rules — it is auto-created on first run otherwise), publish a GitHub Release tagged v1.0.0rc1 marked as a pre-release, verify the upload, then bump __version__ to 1.0.0 and publish v1.0.0.

🤖 Generated with Claude Code

roed314 and others added 4 commits July 22, 2026 03:19
Rewrite README.md as the PyPI landing page: a dict-in/dict-out pitch, a
verified quickstart (config.ini + PostgresDatabase(create=True) + create_table
+ insert_many + search), a feature list covering the 1.0 surface (joins,
$col/$size, bulk loading with reload/revert, stats/counts caching, schema
management with a versioned metadata format and migrations, staged writes,
introspection, notifications, diffing), absolute-URL documentation links, and
supported versions (Python >= 3.8, PostgreSQL 13-18, psycopg 3).  Drop the
"built upon psycopg2" falsehood.

Add CHANGELOG.md (Keep-a-Changelog) with a 1.0.0 section: breaking changes
each with a migration note, additions, curated fixes, and infrastructure.

Bump pyproject to 1.0.0; declare the license as the SPDX expression
GPL-2.0-or-later with license-files (setuptools >= 77 rejects a License trove
classifier alongside an SPDX expression); add Development Status, audience,
Python 3.8-3.13 and topic classifiers; add Homepage/Repository/Changelog URLs.

Add .github/workflows/release.yml: a Trusted-Publishing workflow that builds,
twine-checks, and uploads to PyPI on a published GitHub release, with the
one-time PyPI setup documented inline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
README quickstart: config.ini is now discovered ($PSYCODICT_CONFIG, then an
existing ./config.ini, then ~/.psycodict/config.ini) rather than created in
the working directory.  CHANGELOG: breaking-changes entry for the readargs
flip, the discovery and the log/secrets relocation, plus the
postgresql_dbname defaults fix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rebased onto main, which absorbed everything this PR used to anticipate;
the reconciliation:

- Version: 1.0.0 is now set in psycodict.__init__.__version__, the single
  source of truth roed314#121 established -- pyproject keeps main's dynamic
  version, SPDX license string and >=3.9 floor, and this PR's classifiers
  drop the License:: entry (setuptools >= 77 rejects it next to an SPDX
  string) and the 3.8 entry.

- README: the rewrite now carries the Versioning.md pointer (roed314#123) in its
  Documentation list, which switches to relative links -- on the Sphinx
  site (roed314#122) those resolve to the copied guide pages, and they still
  render on GitHub; CHANGELOG and LICENSE stay absolute since neither is
  on the site.  Supported Python is 3.9+; blob/master URLs become
  blob/main.

- CHANGELOG: entries for the late wave -- sum/random honoring saving
  (roed314#118) and the 3.9 floor (roed314#121) under breaking changes; the docs site
  (roed314#122), Versioning.md/CONTRIBUTING/SECURITY and __version__ (roed314#121)
  under added; reload metafile+resort (roed314#114), update_from_file stats
  publication (roed314#115), copy_dumps delimiter escaping (roed314#116) under fixed;
  config.ini untracking (roed314#120), this release workflow and CITATION.cff
  (roed314#124) under infrastructure.

- release.yml: the flow notes now say bump __init__.__version__ and merge
  to main.

- Fixes the docs build on main, broken by the roed314#119 x roed314#122 crossing (roed314#119
  merged after roed314#122's last CI run): the Configuration docstring's nested
  defaults list needed blank lines to be valid RST under autodoc, and the
  README's relative LICENSE link had no target on the site.

Suite 857 passed / 36 skipped; ruff clean; sphinx -W clean; python -m
build + twine check --strict pass with Version 1.0.0,
License-Expression GPL-2.0-or-later, Requires-Python >=3.9 and no
License classifier in the wheel metadata.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@read-the-docs-community

read-the-docs-community Bot commented Jul 22, 2026

Copy link
Copy Markdown

Documentation build overview

📚 psycodict | 🛠️ Build #33702360 | 📁 Comparing 6c5e30e against latest (01dd850)

  🔍 Preview build  

2 files changed
± README.html
± index.html

roed314 and others added 2 commits July 22, 2026 03:31
The uploaded version is whatever __version__ says at the tagged commit --
the tag name controls nothing -- and PyPI never accepts a version twice,
so a rehearsal tag against final-version source would have burned 1.0.0
on the rehearsal.  The build job now refuses any tag that is not
v<__version__>.

With that guard in place, ship the first release as a candidate:
__version__ starts at 1.0.0rc1, so the v1.0.0rc1 rehearsal exercises the
entire trusted-publishing path (including the pending publisher creating
the project) on a version pip ignores by default; bumping to 1.0.0 and
tagging v1.0.0 is then a one-line follow-up.  The release-flow notes
describe the sequence.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Four review findings:

- The Documentation list's relative guide links render as relative hrefs
  on PyPI, resolving against pypi.org and 404ing.  They now point at the
  live Read the Docs pages (verified 200), with a pointer to the Markdown
  originals at the repository root and the generated API reference; the
  pyproject urls gain a Documentation entry.

- The features tour advertised `revert`, which does not exist; the
  rollback method is `reload_revert`.

- The quickstart's example config connected as the postgres superuser
  with a blank password while the setup section below creates myuser
  with a password as the owner of mydb; someone following both sections
  in order would fail to authenticate.  The quickstart now uses the
  setup section's credentials and says so.

- The classifiers stopped at Python 3.13 while CI tests through 3.14.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@roed314
roed314 merged commit 14e3239 into roed314:main Jul 22, 2026
19 checks passed
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.

2 participants