Changelog¶
All notable changes to this project are documented here.
The format follows Keep a Changelog. This project uses semantic versioning.
Unreleased¶
Added¶
- Initial project structure (
src/layout,pyproject.toml,mkdocs.yml) - Package skeleton:
FrozenFrame,field,FrozenSeries,FrozenFrameError,SchemaValidationErrorstubs roadmap.mdandmotivations.mdproject documentation- MkDocs Material documentation site with full guide, API reference, and contributing pages
ruff(linting + formatting) andty(type checking) configured inpyproject.tomlcolumn.py— Phase 1 implementation complete:_PYTHON_TO_ARROWdefault type map coveringbool,int,float,str,bytes,datetime.datetime,datetime.date,datetime.timedelta,decimal.Decimalregister_type()for global third-party type registrationfield()for optional per-column Arrow type overrides and documentationresolve_arrow_type()internal resolver handling bare types,T | Noneunions,Optional[T], andfield(arrow_type=...)overrides- 28 tests for
column.pycovering all type mappings, nullable unions, overrides, error cases,field(), andregister_type() schema.py— Phase 1 implementation complete:build_schema(annotations, defaults)builds apa.Schemafrom a class's__annotations__and anyfield()defaults, respectingarrow_typeoverrides andT | Nonenullabilityvalidate(schema, batch)checks apa.RecordBatchfor extra columns, missing columns, type mismatches, and nullability violations — each with a descriptive error message naming the offending column- 21 tests for
schema.pycovering basic types, nullability,field()overrides, column ordering, error cases, and passing validation frame.py— Phase 1 implementation complete:FrozenFrameMetametaclass with@dataclass_transform()— compiles__annotations__intocls.__schema__at class creation time, resolves forward references viaget_type_hints, collectsfield()defaultsFrozenFramebase class withfrom_dict,from_arrow, and_from_batch(internal fast-path) constructors- Mutation guards:
__setattr__,__delattr__,__setitem__,__delitem__all raiseFrozenFrameError - Column access via
df["col"]anddf.col(returnspa.Array; upgrades toFrozenSeriesin next step) __hash__— SHA-256 of Arrow IPC serialisation, cached after first computation__eq__,__len__,__iter__(row-wise dicts),__repr__- 45 tests for
frame.pycovering metaclass schema compilation, construction, mutation guards, column access, iteration, equality, hashing, and repr __init__.py— public API wired up:FrozenFrame,field,register_type,FrozenFrameError,SchemaValidationErrorall importable directly fromfreezeframeseries.py— Phase 1 implementation complete:FrozenSeries[T]wraps apa.Arraywith a fully immutable interface__len__,__iter__(yields Python values; nulls becomeNone),__getitem__(int → scalar, slice → newFrozenSeries)- Comparison operators (
==,!=,<,<=,>,>=) viapyarrow.compute— returnpa.BooleanArraymasks for use withfilter()in Phase 2 equals()for value equality between two series (returnsbool, null-aware)to_pylist(),to_arrow(),type,null_count,__repr__- Explicitly
__hash__ = None— unhashable by design since__eq__is element-wise FrozenFrame.__getitem__and__getattr__updated to returnFrozenSeriesinstead ofpa.ArrayFrozenSeriesadded to public API exports in__init__.py- 45 tests for
series.pycovering construction, immutability, sequence protocol, all six comparison operators (scalar and series operands),equals(), conversion helpers, and repr