Full Changelog¶
The content below is the canonical CHANGELOG.md from the repository root.
It is included here without duplication — edit the root file to update this page.
Changelog — ndict-tools¶
All notable changes to this project are documented in this file.
The format follows Keep a Changelog. Versioning follows Semantic Versioning.
[1.2.0] — Persistence (Serialize) — 2026-05-06¶
Added¶
.tox-config/— fragmented requirements by role (base,format,linter,security,type-check,full) with dedicated scriptstest.shandcoverage.shfor sequential multi-version execution (DD-025).pyproject.toml—[project.optional-dependencies]groupsdevanddocsenablinguv sync --extra dev --extra docsfor environment bootstrap.PUBLISHING.md— bilingual (FR/EN) publication procedure covering the full RC → TestPyPI → PyPI chain.CONTRIBUTING.md/CONTRIBUTING.fr.md— bilingual contributor guide: uv setup, PyCharm configuration, tox environments, CI chain, branch strategy.README.fr.md— French README split from the original bilingual file.CODE_OF_CONDUCT.md/CODE_DE_CONDUITE.md— aligned to ndict-tools.
Changed¶
Build tooling: virtualenv + pip replaced by uv for virtual environment management, dependency installation, and CI.
tox-uvadopted as tox provisioner (DD-024). Closes #109.Type checking: mypy replaced by basedpyright as the sole type checker.
pyrightconfig.jsonis the single source of configuration (DD-026).tox.inirewritten: new environmentsci-quality,ci-tests,pre-push,basedpyright,black-check,isort-check,format,check,coverage.localkept as alias forpre-push.gh-ciandlintenvironments removed.GitHub Actions — all workflows updated:
actions/checkout@v4→actions/checkout@v6across all workflows.python-ci-quality.yamlintroduced as the new quality gate (replaces the quality section of the formergh-citox env).python-ci-tests.yamlnow triggers viaworkflow_runafter Quality; Python 3.14 runs withcontinue-on-error: true.python-ci-coverage.yamlupdated to usetox -e coverage.Publication chain remains tag-based (
v*.*.*andv*.*.*rc*).
Dependencies updated: pytest 9.0.3 validated (unpinned). Closes #110, Closes #121.
[tool.isort]inpyproject.toml:known_first_partycorrected fromsrctondict_tools.[tool.tox.*]sections removed frompyproject.toml(now solely intox.ini).
Fixed¶
tools.py:119— E721: type comparison replaced by identity check (type(d1) != type(d2)→type(d1) is not type(d2)).tools.py:1954–1955— F841: unused local variablesindanddefaultremoved.
Deprecated¶
Flake8 violations in the test suite (
E711,E712,E731,F401,F541,F811,F841) are suppressed viaper-file-ignoresand scheduled for cleanup in v1.3.0.
[1.1.0] — JSON Bridge (Encoder) — 2026-04-05¶
Added¶
serialize.py— new private module providing the serialization infrastructure (not part of the public API):_encode_key/_decode_key: JSON key encoding for non-string keys per DD-021 (supportsint,float,bool, flattuple, flatfrozenset).NestedDictionaryEncoder:json.JSONEncodersubclass used byto_json._make_decoder_hook: factory for theobject_pairs_hookused byfrom_json._pickle_dump/_pickle_load: pickle helpers with SHA-256 sidecar for integrity verification.
_StackedDict.from_dict(cls, dictionary, **class_options): new@classmethodalternative constructor. Inherited by all three public variants —NestedDictionary.from_dict(...),StrictNestedDictionary.from_dict(...),SmoothNestedDictionary.from_dict(...)are all available without any wrapper incore.py. Closes #42._StackedDict.to_json(path, indent=None): serialize to a JSON file. Non-string keys are encoded per DD-021. Closes #43._StackedDict.from_json(cls, path, **class_options): reconstruct from a JSON file.@classmethod, returns an instance of the calling class. Closes #43._StackedDict.to_pickle(path, protocol=None): serialize to a pickle file alongside a SHA-256 sidecar. Always emitsUserWarningabout pickle safety. Closes #44._StackedDict.from_pickle(cls, path, verify=True): reconstruct from a pickle file.verify=True(default) checks the SHA-256 sidecar and raisesStackedValueErroron mismatch. Closes #44._StackedDict.__reduce__: native pickle support via the module-level_reconstructhelper, preservingdefault_setupanddefault_factoryacross the pickle round-trip.CI matrix: Python 3.13 added as stable target; Python 3.14 added as best-effort (
continue-on-error: true). Closes #41.
Changed¶
Python 3.9 support dropped. Minimum Python version is now 3.10.
python_requires >= "3.10"inpyproject.toml. Closes #41.from __future__ import annotationsremoved fromtools.py,core.py, andexception.py. All forward references are now explicitly quoted. Closes #38.Legacy
typinggenerics replaced with built-in equivalents throughouttools.pyandexception.py:Dict→dict,List→list,Set→set,Tuple→tuple.Unionremoved fromexception.py(unused). Closes #39._type_namecompatibility helper removed fromexception.py.type.__name__is used directly inStackedTypeError. Closes #40.blackconfigured with--target-version py310intox.inito ensure consistent formatting across all supported Python versions.
Deprecated¶
from_dictfree function (from ndict_tools.tools import from_dict) is deprecated since 1.1.0 and will be removed in 1.5.0 (issue #81, milestone v1.5.0).Calling the free function now emits a
DeprecationWarningwith an explicit removal notice. Migrate to theclassmethod:# Before (deprecated since 1.1.0, removed in 1.5.0) from ndict_tools.tools import from_dict nd = from_dict(data, NestedDictionary, default_setup={...}) # After nd = NestedDictionary.from_dict(data, default_setup={...})Closes #47.
[1.0.0] — Path Manager (Compass) — 2026-01-31¶
First stable release.
Added¶
_StackedDictbase class extendingcollections.defaultdict._HKeytree node with__slots__, immutable tuple children, DFS/BFS traversal._Pathslazy view over all hierarchical paths._CPathscompact/factorized view with coverage analysis (is_covering,coverage,missing_paths,uncovered_paths).Public API:
NestedDictionary,StrictNestedDictionary,SmoothNestedDictionary,PathsView,CompactPathsView.Custom exception hierarchy:
StackedDictionaryErrorand six specializations (StackedKeyError,StackedTypeError,StackedValueError,StackedAttributeError,StackedIndexError,NestedDictionaryException).Published on PyPI. CI on GitHub Actions and GitLab CI. Coverage reported to codecov.io.
Deprecated¶
DictPathsdeprecated at instantiation withDeprecationWarning. Scheduled for removal in 1.2.0. UseCompactPathsViewornd.compact_paths()instead.
[0.8.0] — EoL¶
End-of-life milestone. Removed deprecated indent= and strict=
attributes from NestedDictionary.__init__. Use default_setup= instead.
For the full list of changes, see the GitHub issue tracker.