Skip to content

Commit 784bb1b

Browse files
committed
chore: release 3.0.0
1 parent 51d6b26 commit 784bb1b

7 files changed

Lines changed: 103 additions & 13 deletions

File tree

CHANGELOG.md

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,28 @@ All notable changes to this project will be documented in this file.
44

55
The format is inspired by Keep a Changelog and versioned according to PEP 440.
66

7-
## [3.0.0a0] - 2026-05-30
7+
## [3.0.0] - 2026-06-23
88

9-
This is a breaking 3.0 alpha release focused on a cleaner public API and module
10-
layout.
9+
This is the first stable ExcelAlchemy 3.0 release. It finalizes the breaking
10+
3.0 public API, documentation set, examples, and release validation path around
11+
typed Pydantic models plus explicit workbook metadata.
12+
13+
### Added
14+
15+
- Added stable 3.0 guidance across README, PyPI README, Chinese README,
16+
public API docs, migration notes, examples, and generated output smoke checks.
17+
- Added release smoke coverage for package install behavior, repository
18+
examples, docs assets, and API payload snapshots.
1119

1220
### Changed
1321

1422
- Use the 3.0 public API from `excelalchemy`, `excelalchemy.config`,
1523
`excelalchemy.codecs`, `excelalchemy.storage`, and related public modules.
1624
- Internal modules now use explicit responsibility names such as `runtime`,
17-
`schema`, `workbook`, `rendering`, `adapters`, and `primitives`.
25+
`schema`, `worksheet`, `rendering`, `adapters`, and `primitives`.
1826
- Storage configuration uses `storage=...` with an `ExcelStorage`
1927
implementation.
28+
- Package metadata now marks the 3.0 line as a stable release.
2029

2130
### Removed
2231

@@ -37,6 +46,15 @@ layout.
3746
- Removed legacy Minio config fields such as `minio`, `bucket_name`, and
3847
`url_expires`.
3948

49+
### Migration Notes
50+
51+
- 3.0 intentionally does not preserve 2.x compatibility imports, field
52+
factories, config aliases, or facade aliases.
53+
- Python annotations define the data shape, Pydantic `Field(...)` defines
54+
Pydantic validation, and `ExcelColumn(...)` defines workbook-facing metadata.
55+
- Use `docs/migrations.md` and `docs/public-api.md` as the current upgrade and
56+
public surface references.
57+
4058
## [2.4.0] - 2026-04-24
4159

4260
### Added

README-pypi.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ ExcelAlchemy turns Pydantic models into workbook contracts:
1111
- return result workbooks and API-friendly error payloads
1212
- keep workbook IO pluggable through `ExcelStorage`
1313

14-
The current mainline is ExcelAlchemy 3.0. It uses ordinary Python annotations
15-
plus explicit `ExcelColumn(...)` metadata. Old 2.x field factories,
14+
The current stable release is ExcelAlchemy 3.0. It uses ordinary Python
15+
annotations plus explicit `ExcelColumn(...)` metadata. Old 2.x field factories,
1616
compatibility imports, legacy config fields, and facade aliases are not current
1717
API.
1818

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ Use it when you want to turn Python models into Excel workbook contracts:
2121
- return user-friendly result workbooks
2222
- keep storage pluggable through `ExcelStorage`
2323

24-
The current mainline is ExcelAlchemy 3.0. It uses ordinary Python annotations
25-
plus explicit `ExcelColumn(...)` metadata. The old 2.x field factories,
26-
compatibility imports, legacy config fields, and facade aliases are not current
27-
API.
24+
The current stable release is ExcelAlchemy 3.0. It uses ordinary Python
25+
annotations plus explicit `ExcelColumn(...)` metadata. The old 2.x field
26+
factories, compatibility imports, legacy config fields, and facade aliases are
27+
not current API.
2828

2929
## Why This Matters
3030

README_cn.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ ExcelAlchemy 是一个基于 Pydantic 模型的 schema-driven Excel 导入/导
1414
- 生成面向用户的结果工作簿
1515
- 通过 `ExcelStorage` 支持可替换的存储实现
1616

17-
当前主线是 ExcelAlchemy 3.0。3.0 使用普通 Python 类型标注配合显式
17+
当前稳定版本是 ExcelAlchemy 3.0。3.0 使用普通 Python 类型标注配合显式
1818
`ExcelColumn(...)` 元数据。2.x 的字段工厂、兼容导入、legacy 配置字段和
1919
facade 别名都不再是当前 API。
2020

docs/releases/3.0.0.md

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# 3.0.0 Release Notes and Checklist
2+
3+
This document records the final release positioning and verification checklist
4+
for the stable `3.0.0` release.
5+
6+
## Purpose
7+
8+
- publish the first stable ExcelAlchemy 3.0 package
9+
- finalize the breaking 3.0 public API around typed Pydantic models and
10+
explicit `ExcelColumn(...)` workbook metadata
11+
- confirm current docs, examples, and smoke assets describe 3.0 instead of the
12+
retired 2.x compatibility surface
13+
- trigger the GitHub Release workflow that builds, verifies, and publishes the
14+
Python package to PyPI
15+
16+
## Release Positioning
17+
18+
`3.0.0` is a stable breaking release:
19+
20+
- Python type annotations define the data shape
21+
- Pydantic `Field(...)` stays responsible for Pydantic validation
22+
- `ExcelColumn(...)` carries workbook-facing metadata
23+
- codec helpers are explicit objects instead of fake Python scalar/container
24+
types
25+
- storage configuration uses `storage=...` with an `ExcelStorage`
26+
implementation
27+
- 2.x compatibility imports, legacy config fields, and facade aliases are no
28+
longer current API
29+
30+
## Before Tagging
31+
32+
1. Confirm the package version in `src/excelalchemy/__init__.py` is `3.0.0`.
33+
2. Confirm `pyproject.toml` no longer marks the package as alpha.
34+
3. Review the `3.0.0` section in `CHANGELOG.md`.
35+
4. Confirm README entry points describe ExcelAlchemy 3.0 as stable:
36+
- `README.md`
37+
- `README-pypi.md`
38+
- `README_cn.md`
39+
5. Confirm the release smoke scripts:
40+
- `scripts/smoke_package.py`
41+
- `scripts/smoke_examples.py`
42+
- `scripts/smoke_docs_assets.py`
43+
- `scripts/smoke_api_payload_snapshot.py`
44+
45+
## Local Verification
46+
47+
Run these commands from the repository root:
48+
49+
```bash
50+
uv run ruff format --check .
51+
uv run ruff check .
52+
uv run pyright
53+
uv run pytest --cov=excelalchemy --cov-report=term-missing:skip-covered tests
54+
uv run python scripts/smoke_package.py
55+
uv run python scripts/smoke_examples.py
56+
uv run python scripts/smoke_docs_assets.py
57+
uv run python scripts/smoke_api_payload_snapshot.py
58+
uv build
59+
uvx twine check dist/*
60+
```
61+
62+
## GitHub Release Steps
63+
64+
1. Push the release commit.
65+
2. Create and publish the tag `v3.0.0`.
66+
3. Publish a GitHub Release for `v3.0.0` using this document and the
67+
`CHANGELOG.md` entry as release-note sources.
68+
4. Confirm the `Upload Python Package` workflow succeeds.
69+
5. Confirm the published package version is `3.0.0`.
70+
71+
The publish workflow verifies that the release tag, after removing the `v`
72+
prefix, matches `excelalchemy.__version__`.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ readme = { file = 'README-pypi.md', content-type = 'text/markdown' }
1010
license = { file = 'LICENSE' }
1111
keywords = ['excel', 'openpyxl', 'pydantic', 'minio', 'schema']
1212
classifiers = [
13-
'Development Status :: 3 - Alpha',
13+
'Development Status :: 5 - Production/Stable',
1414
'Intended Audience :: Developers',
1515
'License :: OSI Approved :: MIT License',
1616
'Operating System :: OS Independent',

src/excelalchemy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Public ExcelAlchemy API."""
22

3-
__version__ = '3.0.0a0'
3+
__version__ = '3.0.0'
44
from excelalchemy.artifacts import ExcelArtifact
55
from excelalchemy.codecs.boolean import BooleanCodec
66
from excelalchemy.codecs.choice import MultiChoiceCodec, SingleChoiceCodec

0 commit comments

Comments
 (0)