Skip to content

Commit ed74f8e

Browse files
authored
Merge pull request #68 from RayCarterLab/v2.2
release: prepare ExcelAlchemy 2.2.8
2 parents 6f37281 + 9c71a63 commit ed74f8e

32 files changed

+1201
-134
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ jobs:
115115
uv run python scripts/smoke_examples.py
116116
uv run python scripts/generate_example_output_assets.py
117117
uv run python scripts/smoke_docs_assets.py
118+
uv run python scripts/smoke_api_payload_snapshot.py
118119
119120
- name: Upload coverage artifact
120121
if: always() && matrix.python-version == '3.14'

.github/workflows/python-publish.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ jobs:
6262
.pkg-smoke-wheel/bin/python scripts/smoke_examples.py
6363
.pkg-smoke-wheel/bin/python scripts/generate_example_output_assets.py
6464
.pkg-smoke-wheel/bin/python scripts/smoke_docs_assets.py
65+
.pkg-smoke-wheel/bin/python scripts/smoke_api_payload_snapshot.py
66+
.pkg-smoke-wheel/bin/python -m examples.fastapi_reference.app
6567
6668
- name: Smoke test source distribution installation
6769
run: |
@@ -73,6 +75,8 @@ jobs:
7375
.pkg-smoke-sdist/bin/python scripts/smoke_examples.py
7476
.pkg-smoke-sdist/bin/python scripts/generate_example_output_assets.py
7577
.pkg-smoke-sdist/bin/python scripts/smoke_docs_assets.py
78+
.pkg-smoke-sdist/bin/python scripts/smoke_api_payload_snapshot.py
79+
.pkg-smoke-sdist/bin/python -m examples.fastapi_reference.app
7680
7781
- name: Set artifact metadata
7882
id: artifact-meta

CHANGELOG.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,44 @@ 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+
## [2.2.8] - 2026-04-05
8+
9+
This release continues the stable 2.x line with a clearer integration reading
10+
path, stronger API payload smoke verification, and a more production-shaped
11+
reference-app release flow.
12+
13+
### Added
14+
15+
- Added `docs/integration-roadmap.md` to give new adopters a role-based reading
16+
path for first-time integration, backend APIs, frontend error rendering, and
17+
migration work
18+
- Added `scripts/smoke_api_payload_snapshot.py` and a generated
19+
`import-failure-api-payload.json` snapshot under `files/example-outputs/`
20+
21+
### Changed
22+
23+
- Expanded release smoke so wheel and source-distribution verification now
24+
compare a stable import-failure API payload snapshot instead of only checking
25+
ad hoc fields
26+
- Extended release verification so installed-package smoke runs the
27+
`examples.fastapi_reference.app` demo directly after dependency installation
28+
- Cross-linked the new integration roadmap from onboarding, API-facing, and
29+
PyPI-facing docs
30+
31+
### Compatibility Notes
32+
33+
- No public import or export workflow API was removed in this release
34+
- `ImportResult`, `CellErrorMap`, and `RowIssueMap` remain the stable public
35+
result objects for 2.x integrations
36+
- `storage=...` remains the recommended 2.x backend configuration path
37+
38+
### Release Summary
39+
40+
- new users now have a clearer “what to read first” path
41+
- release smoke now checks a stable import-failure payload shape
42+
- installed-package verification exercises the FastAPI reference app more
43+
directly
44+
745
## [2.2.7] - 2026-04-04
846

947
This release continues the stable 2.x line with stronger API-facing result

README-pypi.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ ExcelAlchemy turns Pydantic models into typed workbook contracts:
1010
- render workbook-facing output in `zh-CN` or `en`
1111
- keep storage pluggable through `ExcelStorage`
1212

13-
The current stable release is `2.2.7`, which continues the 2.x line with stronger API-facing result payloads, a more complete FastAPI reference app, harder install-time smoke verification, and more consistent codec diagnostics.
13+
The current stable release is `2.2.8`, which continues the 2.x line with a clearer integration roadmap, stronger import-failure payload smoke verification, and more direct install-time validation of the FastAPI reference app.
1414

15-
[GitHub Repository](https://github.com/RayCarterLab/ExcelAlchemy) · [Full README](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/README.md) · [Getting Started](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/getting-started.md) · [Result Objects](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/result-objects.md) · [API Response Cookbook](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/api-response-cookbook.md) · [Examples Showcase](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/examples-showcase.md) · [Architecture](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/architecture.md) · [Migration Notes](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/MIGRATIONS.md)
15+
[GitHub Repository](https://github.com/RayCarterLab/ExcelAlchemy) · [Full README](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/README.md) · [Getting Started](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/getting-started.md) · [Integration Roadmap](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/integration-roadmap.md) · [Result Objects](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/result-objects.md) · [API Response Cookbook](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/api-response-cookbook.md) · [Examples Showcase](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/examples-showcase.md) · [Architecture](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/architecture.md) · [Migration Notes](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/MIGRATIONS.md)
1616

1717
## Screenshots
1818

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
![Lint](https://img.shields.io/badge/lint-ruff-D7FF64)
77
![Typing](https://img.shields.io/badge/typing-pyright-2C6BED)
88

9-
[中文 README](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/README_cn.md) · [About](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/ABOUT.md) · [Getting Started](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/getting-started.md) · [Result Objects](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/result-objects.md) · [API Response Cookbook](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/api-response-cookbook.md) · [Architecture](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/architecture.md) · [Examples Showcase](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/examples-showcase.md) · [Public API](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/public-api.md) · [Locale Policy](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/locale.md) · [Changelog](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/CHANGELOG.md) · [Migration Notes](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/MIGRATIONS.md)
9+
[中文 README](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/README_cn.md) · [About](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/ABOUT.md) · [Getting Started](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/getting-started.md) · [Integration Roadmap](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/integration-roadmap.md) · [Result Objects](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/result-objects.md) · [API Response Cookbook](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/api-response-cookbook.md) · [Architecture](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/architecture.md) · [Examples Showcase](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/examples-showcase.md) · [Public API](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/public-api.md) · [Locale Policy](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/locale.md) · [Changelog](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/CHANGELOG.md) · [Migration Notes](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/MIGRATIONS.md)
1010

1111
ExcelAlchemy is a schema-driven Python library for Excel import and export workflows.
1212
It turns Pydantic models into typed workbook contracts: generate templates, validate uploads, map failures back to rows
@@ -16,7 +16,7 @@ This repository is also a design artifact.
1616
It documents a series of deliberate engineering choices: `src/` layout, Pydantic v2 migration, pandas removal,
1717
pluggable storage, `uv`-based workflows, and locale-aware workbook output.
1818

19-
The current stable release is `2.2.7`, which continues the ExcelAlchemy 2.x line with stronger API-facing result payloads, a more complete FastAPI reference app, harder install-time smoke verification, and more consistent codec diagnostics.
19+
The current stable release is `2.2.8`, which continues the ExcelAlchemy 2.x line with a clearer integration roadmap, stronger import-failure payload smoke verification, and more direct install-time validation of the FastAPI reference app.
2020

2121
## At a Glance
2222

README_cn.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# ExcelAlchemy
22

3-
[English README](./README.md) · [项目说明](./ABOUT.md) · [快速开始](./docs/getting-started.md) · [结果对象](./docs/result-objects.md) · [架构文档](./docs/architecture.md) · [Locale Policy](./docs/locale.md) · [Changelog](./CHANGELOG.md) · [迁移说明](./MIGRATIONS.md)
3+
[English README](./README.md) · [项目说明](./ABOUT.md) · [快速开始](./docs/getting-started.md) · [接入路线图](./docs/integration-roadmap.md) · [结果对象](./docs/result-objects.md) · [架构文档](./docs/architecture.md) · [Locale Policy](./docs/locale.md) · [Changelog](./CHANGELOG.md) · [迁移说明](./MIGRATIONS.md)
44

55
ExcelAlchemy 是一个面向 Excel 导入导出的 schema-first Python 库。
66
它的核心思路不是“读写表格文件”,而是“把 Excel 当成一种带约束的业务契约”。
77

8-
当前稳定发布版本是 `2.2.7`,它在稳定的 ExcelAlchemy 2.x 线上继续加强了 API 结果载荷、FastAPI 参考应用、安装后真实可用的 release smoke 验证,以及更一致的 codec 诊断信息
8+
当前稳定发布版本是 `2.2.8`,它在稳定的 ExcelAlchemy 2.x 线上继续加强了接入路线图、失败导入 API 载荷的 smoke 校验,以及对 FastAPI 参考应用的安装后真实可用验证
99

1010
你用 Pydantic 模型定义结构,用 `FieldMeta` 定义 Excel 元数据,用显式的导入/导出流程去完成模板生成、数据校验、错误回写和后端集成。
1111

docs/api-response-cookbook.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ Within each error item:
3737
- use `message` for logs or plain-text APIs
3838
- use `display_message` when you want ready-to-render UI text
3939

40+
Developer diagnostics are intentionally separate from these payload fields.
41+
Application logs use named loggers such as `excelalchemy.codecs`,
42+
`excelalchemy.runtime`, and `excelalchemy.metadata`; API responses should rely
43+
on `code`, `message_key`, `message`, and `display_message` instead of raw log
44+
output.
45+
4046
## 1. Success Response
4147

4248
Use this when the import completed without header or data failures.

docs/getting-started.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ If you want the full public surface and compatibility boundaries, see
99
If you want to understand the result objects and how to surface them through an
1010
API, see
1111
[`docs/result-objects.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/result-objects.md).
12+
If you want a role-based reading path, see
13+
[`docs/integration-roadmap.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/integration-roadmap.md).
1214

1315
## 1. Install
1416

docs/integration-roadmap.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# Integration Roadmap
2+
3+
This page helps you choose a reading path through the ExcelAlchemy docs based on
4+
what you are trying to build.
5+
6+
If you want the fastest general entry point, start with
7+
[`docs/getting-started.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/getting-started.md).
8+
If you want screenshots and captured workflow output first, see
9+
[`docs/examples-showcase.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/examples-showcase.md).
10+
11+
## 1. If You Are Integrating ExcelAlchemy For The First Time
12+
13+
Recommended order:
14+
15+
1. [`docs/getting-started.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/getting-started.md)
16+
2. [`docs/public-api.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/public-api.md)
17+
3. [`examples/README.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/examples/README.md)
18+
4. [`docs/examples-showcase.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/examples-showcase.md)
19+
20+
Focus on these concepts first:
21+
22+
- stable import paths
23+
- schema declaration style
24+
- `storage=...` as the recommended backend integration path
25+
- the difference between import, create-or-update, and export workflows
26+
27+
## 2. If You Are Building A Backend API
28+
29+
Recommended order:
30+
31+
1. [`docs/result-objects.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/result-objects.md)
32+
2. [`docs/api-response-cookbook.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/api-response-cookbook.md)
33+
3. [`examples/fastapi_reference/README.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/examples/fastapi_reference/README.md)
34+
4. [`docs/public-api.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/public-api.md)
35+
36+
Focus on these objects:
37+
38+
- `ImportResult`
39+
- `CellErrorMap`
40+
- `RowIssueMap`
41+
42+
Use these payload helpers directly in your API layer:
43+
44+
- `ImportResult.to_api_payload()`
45+
- `CellErrorMap.to_api_payload()`
46+
- `RowIssueMap.to_api_payload()`
47+
48+
## 3. If You Are Building Frontend Error Displays
49+
50+
Recommended order:
51+
52+
1. [`docs/result-objects.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/result-objects.md)
53+
2. [`docs/api-response-cookbook.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/api-response-cookbook.md)
54+
3. [`examples/fastapi_reference/README.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/examples/fastapi_reference/README.md)
55+
56+
Focus on these payload fields:
57+
58+
- `code`
59+
- `message_key`
60+
- `message`
61+
- `display_message`
62+
63+
And these grouped or summary helpers:
64+
65+
- `summary.by_field`
66+
- `summary.by_row`
67+
- `summary.by_code`
68+
- `facets.field_labels`
69+
- `facets.codes`
70+
- `facets.row_numbers_for_humans`
71+
- `grouped.messages_by_field`
72+
- `grouped.messages_by_row`
73+
- `grouped.messages_by_code`
74+
75+
## 4. If You Want Copyable Reference Code
76+
77+
Start here:
78+
79+
- [`examples/employee_import_workflow.py`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/examples/employee_import_workflow.py)
80+
- [`examples/create_or_update_import.py`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/examples/create_or_update_import.py)
81+
- [`examples/export_workflow.py`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/examples/export_workflow.py)
82+
- [`examples/fastapi_reference/README.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/examples/fastapi_reference/README.md)
83+
84+
## 5. If You Need Migration And Compatibility Context
85+
86+
Read:
87+
88+
1. [`MIGRATIONS.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/MIGRATIONS.md)
89+
2. [`docs/public-api.md`](https://github.com/RayCarterLab/ExcelAlchemy/blob/main/docs/public-api.md)
90+
91+
This is the best route when you need to answer:
92+
93+
- which imports are stable
94+
- which imports are compatibility-only
95+
- how the 2.x line treats legacy Minio configuration

docs/locale.md

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,27 @@
22

33
## Scope
44

5-
ExcelAlchemy currently distinguishes between two kinds of language output:
5+
ExcelAlchemy currently distinguishes between three kinds of language output:
66

7+
- developer diagnostics, intended for logs and runtime troubleshooting
78
- runtime messages, intended for Python developers and integrators
89
- workbook display text, intended for spreadsheet users
910

10-
These two layers do not currently share the same locale policy.
11+
These layers do not currently share the same locale policy.
12+
13+
## Developer Diagnostics Policy
14+
15+
- Developer diagnostics are emitted through named loggers such as:
16+
- `excelalchemy.codecs`
17+
- `excelalchemy.runtime`
18+
- `excelalchemy.metadata`
19+
- Stability policy: diagnostics are intentionally standardized in English for the
20+
2.x line
21+
- Intended audience: backend developers, operators, and maintainers
22+
23+
Developer diagnostics are not the same surface as API payloads or workbook-facing
24+
messages. They are designed for logs, traces, and troubleshooting rather than
25+
end-user rendering.
1126

1227
## Runtime Message Policy
1328

@@ -35,6 +50,7 @@ Workbook display locale affects user-facing spreadsheet text such as:
3550

3651
## Fallback Rules
3752

53+
- Developer diagnostics fall back to English
3854
- Runtime messages fall back to the runtime default locale: `en`
3955
- Workbook display messages fall back to the workbook display default locale: `zh-CN`
4056

@@ -67,7 +83,8 @@ alchemy_en = ExcelAlchemy(ImporterConfig(ImporterModel, creator=create_func, loc
6783

6884
The i18n roadmap remains intentionally incremental:
6985

70-
1. keep runtime messages consistently English
71-
2. keep workbook display locale explicit and stable
72-
3. add new workbook locales additively
73-
4. only expand runtime locale support when there is a clear maintenance plan
86+
1. keep developer diagnostics consistently English
87+
2. keep runtime messages consistently English
88+
3. keep workbook display locale explicit and stable
89+
4. add new workbook locales additively
90+
5. only expand runtime locale support when there is a clear maintenance plan

0 commit comments

Comments
 (0)