Changelog¶
All notable changes to this project will be documented in this file.
[Unreleased]¶
[0.1.4] - 2026-07-04¶
- Migrate documentation to Zensical with Read the Docs hosting
(
.readthedocs.yaml,zensical.toml, optionaldocsdependency group). Restructure the docs tree (getting-started,user-guide/,specifications/,examples/,development/);changelog.mdanddevelopment/roadmap.mdsnippet-include rootHISTORY.mdandROADMAP.md. Add executable example notebooks with committed markdown and plot outputs underdocs/examples/. (#90) - Backfill
HISTORY.mdfor the 0.1.3 release and bump to 0.1.4. (#91)
[0.1.3] - 2026-07-04¶
- Add in-repo pre-commit hooks (
ruff check --fix,ruff format) via.pre-commit-config.yamland document one-timeuv run pre-commit installsetup. (#84) - Add
merge_dataandupdate_datafor combining processedDataobjects and incrementally appending new raw rows (withCellpyCellCorewrappers and tests). (#86) - Add merge/update end-to-end test coverage for the public merge and incremental update pipeline. (#89)
- Move
CellpyError/NoDataFoundfromlegacy/to top-levelcellpycore.exceptions(legacy re-export kept); expand theCellpyCellCoreclass docstring; addROADMAP.mdfor planned features and open design questions. (#82) - Reorganise legacy bridge, units, and test mock helpers into dedicated
subpackages (
legacy/,units/,testing/): split implementation into focused modules, update importers, and remove the old top-level modules. (#77) - Add pytest coverage reporting to CI:
pytest-covin the dev group,[tool.coverage.run]config, and--cov=cellpycorein the test workflow. (#69) - Document the per-step
<signal>_<stat>engine contract (B1) and default unsetcycle_modeto NORMAL via_cycle_mode_to_test_mode, so initialized and uninitializedCellpyCellCoreshare the same polarity unless"anode"is set explicitly. (#70) - Fix units fallback so
get_converter_to_specificandnominal_capacity_as_absoluteaccept explicit values orCellMetainstead of crashing on bareData; thread optionalcell_metathroughadd_scaled_summary_columns. (#68) - Move broken
selectors.pyhelpers to bridge-onlylegacy_selectors.pywithlegacy_schema()default and unit + golden tests. (#67) - Rename test-data fixture prefix from vendor-specific
arbinto genericcycler(files, tests, regen scripts, harmonizedsource_type, and docs). (#72) - Code-review cleanup and test completion (#66): drop unused dependencies
(duckdb, duckdb-engine, sqlalchemy, narwhals) and the unconfigured
uv-dynamic-versioning; fix the falsy-override bug so an explicit
0.0inoverride_raw_limitswins; freezeDEFAULT_RAW_LIMITSand build fresh limits per call (thread safety); remove the deadData.cycle/Data.stepfields and the deadfind_end_voltage/select_columnsparams on the nativemake_core_summary; declare the public API incellpycore/__init__.py(curated exports +__version__) with apy.typedmarker; validate engine inputs (NoDataFound/ missing-columnValueError) atmake_step_table/make_summary; add ruff lint to CI, native-path e2e tests via the public API, and an opt-in pytest-benchmark suite (uv run pytest -m benchmark). - Update the README developer section to uv's project workflow:
uv syncafter cloning,uv addfor new dependencies,uv run pytestfor tests (#64). - Use absolute GitHub URLs for README documentation links so they resolve on PyPI. (#62)
[0.1.2] - 2026-07-02¶
- Add
summarizers.normalize_capacity_granularity+config.ResetGranularity(CYCLE/STEP/TEST) to normalize step-cumulative or test-cumulative raw capacity / energy columns to the mandated cycle-cumulative convention before aggregation; a cycle-cumulative input is an exact no-op so the exercised path stays byte-stable (#42). - Add
test_idtoStepCols/CycleColsand key all per-step/per-cycle aggregation, cumulation, and joins on the composite(test_id, cycle_num, step_num, …)so a mergedDataholding many tests never mixes cycles across tests (defaulttest_id=0for a single unmerged test; single-test goldens stay byte-identical) (#41). - Promote
CellpyUnitsintocellpycore.units(first-class unit-spec module) with alegacy.pyre-export, plus converter-parity and pint-optional guard tests (STEP-12, #40). - Add native
ref_potential(reference-electrode potential) toRawColswith the fullStepColsaggregate set, wired through the polars step engine (aggregated when present, skipped when absent); legacyreference_voltagestays unbridged to preserve the legacy step-frame parity (#43). - Add a PyPI release workflow (
.github/workflows/release.yml: release publish → ruff + pytest →uv build→ trusted PyPI publish) and fix the ruff F401 failure that blocked thev0.1.0release CI (#44). - Remove the superseded pandas selector pair (
selectors.create_selector/selectors.summary_selector_exluder) and the never-usedselectorparameter on bothmake_core_summarysignatures, now that cellpy has migrated off them; the exclude-types summary feature they carried is tracked for native reimplementation in #54 (#45). - Establish and verify the release/PyPI pipeline end-to-end (
releasealias +release.ymltrusted publishing;cellpycore0.1.1 live on PyPI), document the procedure and the cellpy re-pin checklist in.issueflows/04-designs-and-guides/release-procedure.md, and re-pin cellpy fromgit+…@mainto the PyPI release (jepegit/cellpy#400) (#44). - Add a validating front door for raw frames:
Data.from_raw_frame(df, validate=True)plus module-levelvalidate_raw_framecheck a native polars frame againstconfig.RawCols(required columns,epoch_time_utcint64-ns UTC contract, integer datapoint/cycle/step numbers) and fail fast with one actionable error;validate=Falseskips all checks (#55). - Add native exclude-types summary support:
summarizers.make_summary(exclude_step_types=[...])subtracts the excluded steps' per-cycle capacity deltas from the cycle-end summary values before any derived column (prefix match on step type, e.g.["cv_"]for a non-CV summary), forwarded by bothmake_core_summarysignatures — natively replacing the exclusion feature lost with the removed pandas selector pair; parity locked by a pandas-oracle test (#54). - Document standalone use of cellpy-core: new slim-consumer guide
(
docs/standalone-use.md) covering the nativeCellpyCellCore+Data.from_raw_framepipeline, the class-freesummarizersalternative, and the caller contract; linked from the README together with a fixed PyPI install note (#56).