All notable changes to this project will be documented in this file.
The format is inspired by Keep a Changelog and versioned according to PEP 440.
This release continues the stable 2.x line with a clearer integration reading path, stronger API payload smoke verification, and a more production-shaped reference-app release flow.
- Added
docs/integration-roadmap.mdto give new adopters a role-based reading path for first-time integration, backend APIs, frontend error rendering, and migration work - Added
scripts/smoke_api_payload_snapshot.pyand a generatedimport-failure-api-payload.jsonsnapshot underfiles/example-outputs/
- Expanded release smoke so wheel and source-distribution verification now compare a stable import-failure API payload snapshot instead of only checking ad hoc fields
- Extended release verification so installed-package smoke runs the
examples.fastapi_reference.appdemo directly after dependency installation - Cross-linked the new integration roadmap from onboarding, API-facing, and PyPI-facing docs
- No public import or export workflow API was removed in this release
ImportResult,CellErrorMap, andRowIssueMapremain the stable public result objects for 2.x integrationsstorage=...remains the recommended 2.x backend configuration path
- new users now have a clearer “what to read first” path
- release smoke now checks a stable import-failure payload shape
- installed-package verification exercises the FastAPI reference app more directly
This release continues the stable 2.x line with stronger API-facing result payloads, a more complete FastAPI reference application, harder install-time smoke verification, and more consistent codec diagnostics.
- Added
docs/api-response-cookbook.mdwith copyable success, data-invalid, and header-invalid response shapes for backend integrations - Added request and response contract modules for the FastAPI reference app
under
examples/fastapi_reference/schemas.pyandexamples/fastapi_reference/responses.py - Added
scripts/smoke_docs_assets.pyto verify showcase assets and critical result-object/showcase documentation entry points - Added logger consistency tests for codec fallback diagnostics
- Extended
ImportResult,CellErrorMap, andRowIssueMappayload guidance socode,message_key,message, anddisplay_messagehave clearer and more stable frontend-facing roles - Strengthened
CellErrorMapandRowIssueMapwith summary helpers for aggregation by field, row, and machine-readable code - Made
ImportResult.to_api_payload()a stable top-level integration surface for success, data-invalid, and header-invalid responses - Expanded the FastAPI reference app into a more copyable minimal application with request schema, response schema, structured response builder, and cookbook-aligned payloads
- Hardened release smoke verification so installed-package checks now cover:
- successful imports
- failed imports
- structured error payloads
- example asset generation
- result-object and showcase docs
- FastAPI reference HTTP behavior after dependency installation
- Unified codec fallback logging under the
excelalchemy.codecslogger and aligned warning wording across option, parse, and render fallbacks
- Fixed the runnable FastAPI example and the FastAPI reference app so their runtime type annotations work correctly when optional web dependencies are actually installed
- Fixed stale integration-test expectations after the improved business-facing validation messages landed
- No public import or export workflow API was removed in this release
ImportResult,CellErrorMap, andRowIssueMapremain the stable public result objects for 2.x integrationsstorage=...remains the recommended 2.x backend configuration path- Legacy built-in Minio fields remain part of the 2.x compatibility surface
- API response payloads are easier to consume from frontends and backend clients
- the FastAPI reference project now looks more like a copyable minimal app
- release smoke checks now verify docs, assets, failed-import payloads, and installed FastAPI integrations
- codec diagnostics are more consistent and easier to filter by logger
This release continues the stable 2.x line with stronger consumer-facing result-object guidance, a copyable FastAPI reference project, harder release smoke validation, and clearer codec fallback diagnostics.
- Added
docs/result-objects.mdto explain how to readImportResult,CellErrorMap, andRowIssueMapand how to expose them through backend APIs - Added a copyable FastAPI reference project under
examples/fastapi_referencewith separate route, service, storage, and schema modules - Added a captured output artifact for the FastAPI reference project and linked it from the examples docs and showcase
- Extended
docs/getting-started.md,docs/public-api.md,docs/examples-showcase.md, and the README entry points so the result objects and API integration path are easier to discover - Strengthened package smoke verification by validating both successful and
failed imports, including structured
cell_error_mapandrow_error_mappayloads - Expanded example smoke coverage so the FastAPI reference project is exercised directly alongside the existing script-style examples
- Polished codec fallback warnings so parse failures now produce clearer developer-facing diagnostics with field labels and cleaner exception reasons
- No public import or export workflow API was removed in this release
ImportResult,CellErrorMap, andRowIssueMapremain the stable public result objects for 2.x integrations- The FastAPI reference project is additive guidance and does not change the public API surface
storage=...remains the recommended 2.x backend configuration path
- result objects are now documented as first-class API integration surfaces
- the repository now includes a copyable FastAPI reference-project layout
- release smoke verification checks successful imports, failed imports, and structured error payloads
- codec fallback warnings are easier to read and more useful during debugging
This release continues the stable 2.x line with error UX polish, clearer documentation boundaries, stronger examples and smoke coverage, and continued typing cleanup across the runtime path.
- Added
CellErrorMapandRowIssueMapas richer workbook-facing error access containers while preserving 2.x dict-like compatibility - Added structured error records and API-friendly payload helpers through
records()andto_api_payload()on bothCellErrorMapandRowIssueMap - Added
docs/getting-started.mdto give new users one clear entry point for installation, schema declaration, workflow setup, and backend configuration - Added
docs/examples-showcase.mdand example-output assets so examples can be browsed as a lightweight showcase instead of only as source code - Added more business-oriented examples, including employee import, create-or-update import, export workflow, selection-heavy forms, and date/range field workflows
- Added a minimal FastAPI reference project with separate route, service, storage, and schema modules so teams can start from a copyable backend layout instead of only single-file examples
- Added stronger smoke scripts and release checks for installed packages, repository examples, and generated example-output assets
- Polished error UX so row and cell issues are easier to inspect through
dedicated result-map helpers such as
at(...),messages_at(...),messages_for_row(...), andflatten() - Unified exception boundaries around
ProgrammaticError,ConfigError,ExcelCellError, andExcelRowError, including structuredto_dict()output and clearer equality semantics - Normalized common validation messages into more natural, workbook-facing
English such as
This field is required - Made common field-type validation messages more business-oriented by adding expected-format hints for date, date-range, number-range, email, phone, URL, and configured-selection fields
- Clarified
FieldMetaInfoas a compatibility facade over layered metadata objects and moved more internal consumers and codecs ontodeclared,runtime,presentation, andconstraints - Continued shrinking typing gray areas outside
metadata.pyandhelper/pydantic.pyby removing or consolidating low-valuecast(...)usage where concrete runtime behavior was already clear - Strengthened documentation boundaries by cross-linking getting-started, public API, migrations, examples, showcase, and PyPI-facing README content
- Expanded
examples/README.mdinto a recommended reading order with expected outputs and captured example artifacts - Expanded the examples docs and showcase so the new FastAPI reference project is linked from GitHub README, PyPI README, and the examples showcase page
- Restored explicit
ProgrammaticErrorhandling for unsupportedAnnotated[..., Field(...), ExcelMeta(...)]declarations that use native Python types instead ofExcelFieldCodecsubclasses - Tightened codec resolution in the Pydantic adapter so unsupported declarations fail at the codec resolution boundary instead of being treated as valid runtime metadata
- Added regression coverage for the unsupported-annotation path and for error message quality in the Pydantic adapter
- No public import or export workflow API was removed in this release
- Valid
ExcelFieldCodecandCompositeExcelFieldCodecdeclarations continue to work unchanged - Unsupported native annotations with
ExcelMeta(...)now fail early with the intendedProgrammaticError storage=...remains the recommended 2.x backend configuration path, while legacy built-in Minio fields continue to exist only as compatibility surfaceFieldMeta(...)andExcelMeta(...)remain the stable public metadata entry points while internal metadata continues to consolidate behind them
- import failures are easier to inspect and present through richer error maps
- validation messages are more consistent, more natural, and better suited for workbook feedback
- examples now read more like real integration guides and are protected by direct smoke coverage
- getting-started, public API, migrations, examples, and showcase docs now form a clearer documentation path
- runtime typing boundaries are a little tighter without sacrificing readability or 2.x compatibility
This release continues the stable 2.x line with a focused validation fix in the Pydantic adapter layer.
- Restored explicit
ProgrammaticErrorhandling for unsupportedAnnotated[..., Field(...), ExcelMeta(...)]declarations that use native Python types instead ofExcelFieldCodecsubclasses - Tightened codec resolution in the Pydantic adapter so unsupported declarations fail at the codec resolution boundary instead of being treated as valid runtime metadata
- Added a regression test for unsupported annotated declarations to prevent native Python annotations from slipping through the workbook schema path
- Clarified
FieldMetaInfoas a compatibility facade over layered metadata objects instead of treating it as the primary internal metadata model - Moved more core consumers and built-in codecs onto the layered metadata
objects (
declared,runtime,presentation, andconstraints) - Continued reducing the effective responsibility carried by the flat
FieldMetaInfocompatibility surface in the 2.x implementation - Concentrated necessary dynamic typing boundaries into explicit aliases in the
codec and metadata layers instead of leaving ad hoc
Anyusage scattered across the codebase - Replaced a number of remaining loose
Anyannotations in the runtime path with more explicitobjector workbook-boundary aliases where the behavior was already concrete - Added smoke coverage for the repository examples so the annotated schema and custom storage examples are exercised directly in tests
- No public import or export workflow API was removed in this release
- Valid
ExcelFieldCodecandCompositeExcelFieldCodecdeclarations continue to work unchanged - Unsupported native annotations with
ExcelMeta(...)now fail early with the intendedProgrammaticError FieldMeta(...)andExcelMeta(...)remain the stable public metadata entry points while internal metadata continues to consolidate behind them
- unsupported annotated declarations now fail with the intended error again
- codec resolution is stricter and easier to reason about
- the validation fix is protected by an explicit integration regression test
- metadata internals continue to move toward layered objects rather than a flat central record
- runtime typing boundaries are more explicit without changing the public API
- repository examples now have direct smoke coverage in the test suite
This release continues the stable 2.x line with stronger developer ergonomics, clearer public API guidance, and better release-time smoke coverage.
- Added repository examples for:
Annotatedschema declarations, custom storage integration, and FastAPI upload flows - Added
docs/public-api.mdto document stable public modules, compatibility modules, and internal modules - Added
scripts/smoke_package.pyso release workflows can smoke-test template generation, import execution, and export generation from an installed package
- Updated the release workflow to run package-level smoke tests after wheel and source-distribution installation
- Updated
README.md,README_cn.md, andMIGRATIONS.mdto point users toward examples, public API guidance, and the recommended config/storage patterns
- No public import or export workflow API was removed in this release
- The new examples and docs clarify recommended public paths without changing existing 2.x compatibility behavior
- the repository now includes real integration examples instead of relying only on README snippets
- public API boundaries are documented explicitly
- release publishing now includes stronger smoke coverage for installed packages
This release continues the stable 2.x line with deeper metadata layering, stronger internal immutability, and tighter type boundaries around the Pydantic adapter layer.
- Added regression tests that verify split metadata layers behave like immutable value objects
- Added regression tests that verify facade-level mutation replaces internal metadata layers rather than mutating them in place
- Made
DeclaredFieldMeta,RuntimeFieldBinding,WorkbookPresentationMeta, andImportConstraintsfrozen internal structures - Updated
FieldMetaInfomutation paths to replace internal layer objects via structural updates instead of mutating them in place - Normalized workbook presentation internals so character sets and options are stored in immutable forms
- Tightened key type boundaries in the Pydantic adapter around annotations, codecs, and normalized input payloads
- No public import or export workflow API was removed in this release
FieldMeta(...)andExcelMeta(...)remain the stable public metadata entry points- The metadata layering changes are internal and preserve the public 2.x surface
- metadata internals are now more immutable and easier to reason about
- facade-level metadata updates preserve 2.x ergonomics while reducing hidden shared state
- the Pydantic adapter layer now has clearer type boundaries
This release continues the stable 2.x line with runtime consolidation, clearer configuration ergonomics, and a stronger protocol-first storage story.
- Added
ImportSessionPhaseandImportSessionSnapshotso one-shot import runs expose a clearer lifecycle and final runtime summary - Added recommended config constructors:
ImporterConfig.for_create(...),ImporterConfig.for_update(...),ImporterConfig.for_create_or_update(...),ExporterConfig.for_model(...), andExporterConfig.for_storage(...) - Added targeted regression tests for config helper constructors, legacy storage deprecation behavior, and import session snapshots
- Refined
ImportSessionso the import workflow now advances through explicit phases: workbook loading, header validation, row preparation, row execution, result rendering, and completion - Added
ExcelAlchemy.last_import_snapshotas the facade-level read-only view of the latest import session state - Clarified the recommended storage configuration path around explicit
storage=...backends - Kept legacy
minio,bucket_name, andurl_expiressupport for 2.x, but now emit an explicit deprecation warning when that path is used - Reduced warning noise by emitting the legacy storage deprecation warning once per compatibility scenario
- No public import or export workflow API was removed in this release
- The legacy Minio config path remains supported in 2.x for migration-friendly compatibility
- Existing direct
ImporterConfig(...)andExporterConfig(...)construction continue to work; helper constructors are the new recommended path
- import sessions now expose a clearer lifecycle and final snapshot
- config construction is easier to read through dedicated helper constructors
storage=...is now the clear recommended backend integration path for 2.x
This release continues the stable 2.x line with internal architecture cleanup, clearer naming, and a stronger separation between the long-lived facade and the single-run import workflow runtime.
- Added
ImportSessionas the one-shot import workflow runtime that keeps worksheet state, header parsing state, issue tracking, and executor state out of the long-livedExcelAlchemyfacade - Added normalized internal config layers:
ImporterSchemaOptions,ImportBehavior,ExporterSchemaOptions,ExportBehavior, andStorageOptions - Added internal metadata layers:
DeclaredFieldMeta,RuntimeFieldBinding,WorkbookPresentationMeta, andImportConstraints - Added targeted regression tests for config normalization and split metadata layering
- Refactored
ExcelAlchemy.import_data()to delegate import execution toImportSessionwhile keeping the 2.x public API unchanged - Reduced facade responsibility so
ExcelAlchemynow primarily owns durable configuration and collaborator wiring rather than import-run state - Normalized storage resolution so internal code now reads
storage_optionsinstead of scattering direct reads ofstorage,minio,bucket_name, andurl_expires - Updated import execution to consume normalized
schema_optionsandbehaviorobjects instead of treating config as an all-in-one bus - Split
FieldMetaInfointo internal declaration, runtime, presentation, and constraint layers while preserving the existingFieldMeta(...)andExcelMeta(...)entry points - Improved internal naming by moving the primary worksheet variable vocabulary
from
df/header_dftoworksheet_table/header_table - Renamed
excelalchemy.util.convertortoexcelalchemy.util.converter; the old path now remains as a deprecated compatibility shim - Simplified generic type parameter names across the config, facade, storage, executor, and import-session layers to better reflect their roles
dfandheader_dfremain available as backward-compatible aliases on the facade and import session, but new internal code should preferworksheet_tableandheader_tableexcelalchemy.util.convertorremains importable in 2.x and now emits the standard deprecation warning that points toexcelalchemy.util.converter- No public import/export workflow API was removed in this release
ExcelAlchemyis now a lighter facade, with single-run import state handled byImportSession- internal configuration now has clearer schema, behavior, and storage layers
- metadata internals are more structured without forcing users to rewrite
existing
FieldMeta(...)orExcelMeta(...)declarations
This post-release updates the package presentation and release metadata for the stable ExcelAlchemy 2.0 line without changing the core import/export behavior.
- Added a dedicated PyPI-friendly long description via
README-pypi.md - Switched package metadata to use the PyPI-specific README
- Replaced relative README assets with PyPI-safe absolute image and document links
- Tuned Codecov status behavior for large release PRs and compatibility shim files
This release promotes the validated 2.0 release candidate to the first stable public release of ExcelAlchemy 2.0.
- Promoted the 2.0 line from release candidate to stable
- Finalized release-facing documentation, badges, and portfolio screenshots
- Finalized the GitHub Actions coverage upload path for optional Codecov integration
This release candidate marks the first public preview of the ExcelAlchemy 2.0 line.
It consolidates the architectural work completed across the modernization roadmap and
is intended to validate the release pipeline before the final 2.0.0 release.
- Locale-aware workbook display text with
locale='zh-CN' | 'en' - A pluggable
ExcelStorageprotocol for custom storage backends - An optional built-in Minio backend installable via
ExcelAlchemy[minio] - Internal
WorksheetTableabstraction for workbook IO without pandas - Architecture and design documentation in
README.md,ABOUT.md, anddocs/architecture.md - A lightweight i18n message layer for runtime and workbook display messages
- Migrated the codebase to a standard
src/layout - Migrated from Pydantic v1-style internals to a Pydantic v2-based adapter design
- Modernized the codebase for Python 3.12-3.14, with Python 3.14 as the primary target
- Switched local development, CI, and release workflows to
uv - Split the former monolithic orchestration layer into focused internal components
- Rewrote the main documentation as architecture-focused project pages
- Deprecated the legacy
excelalchemy.types.*import paths in favor ofexcelalchemy.metadata,excelalchemy.results,excelalchemy.config,excelalchemy.codecs, and public types re-exported from the package root - Promoted
excelalchemy.exceptionsas the stable exception module and convertedexcelalchemy.exc,excelalchemy.identity, andexcelalchemy.header_modelsinto explicit compatibility layers
- Runtime dependency on
pandas - Hard architectural dependence on Minio
- Support for Python 3.10 and 3.11
- The supported Python range is now
3.12-3.14 - The project now requires Pydantic v2
pandasis no longer installed or used at runtime- Minio is no longer a core dependency; install
ExcelAlchemy[minio]if you want the built-in backend - Runtime exceptions and validation messages are now standardized in English
- If you previously depended on Minio support, install the extra:
pip install "ExcelAlchemy[minio]" - If you want a custom storage backend, provide
storage=...onImporterConfigorExporterConfig - If your users need English workbook-facing hints and import result labels, set
locale='en' - If you were relying on pandas being present indirectly, install it separately in your own application
- Legacy stable release before the 2.0 architecture and dependency modernization work.