diff --git a/docs/about/release-notes.md b/docs/about/release-notes.md index 77fbecb1..15086f1d 100644 --- a/docs/about/release-notes.md +++ b/docs/about/release-notes.md @@ -23,6 +23,12 @@ The current members of the MkDocs-NG team. * [@shenxianpeng](https://github.com/shenxianpeng) +## Version 1.7.1 (Unreleased) + +### Maintenance + +* Remove the unmaintained `mergedeep` dependency by replacing it with an internal deep-merge helper for inherited YAML configuration. #29 + ## Version 1.7.0 (2026-04-24) MkDocs NG 1.7.0 is a small but important release. The biggest change is that diff --git a/mkdocs/tests/utils/utils_tests.py b/mkdocs/tests/utils/utils_tests.py index f7c2e9e2..df5fd678 100644 --- a/mkdocs/tests/utils/utils_tests.py +++ b/mkdocs/tests/utils/utils_tests.py @@ -19,6 +19,10 @@ baz: sub1: replaced sub3: new +replace_list: + - child +replace_scalar: + nested: value deep1: deep2-1: deep3-1: replaced @@ -28,6 +32,9 @@ baz: sub1: 1 sub2: 2 +replace_list: + - parent +replace_scalar: value deep1: deep2-1: deep3-1: foo @@ -291,6 +298,8 @@ def test_yaml_inheritance(self, tdir): "sub2": 2, "sub3": "new", }, + "replace_list": ["child"], + "replace_scalar": {"nested": "value"}, "deep1": { "deep2-1": { "deep3-1": "replaced", diff --git a/mkdocs/utils/yaml.py b/mkdocs/utils/yaml.py index 3b68c1b1..28851e11 100644 --- a/mkdocs/utils/yaml.py +++ b/mkdocs/utils/yaml.py @@ -4,9 +4,9 @@ import logging import os import os.path +from collections.abc import MutableMapping from typing import IO, TYPE_CHECKING, Any -import mergedeep # type: ignore import yaml import yaml.constructor import yaml_env_tag # type: ignore @@ -19,6 +19,20 @@ log = logging.getLogger(__name__) +def _deep_merge( + parent: MutableMapping[Any, Any], child: MutableMapping[Any, Any] +) -> MutableMapping[Any, Any]: + for key, child_value in child.items(): + parent_value = parent.get(key) + if isinstance(parent_value, MutableMapping) and isinstance( + child_value, MutableMapping + ): + _deep_merge(parent_value, child_value) + else: + parent[key] = child_value + return parent + + def _construct_dir_placeholder( config: MkDocsConfig, loader: yaml.BaseLoader, node: yaml.ScalarNode ) -> _DirPlaceholder: @@ -152,5 +166,5 @@ def yaml_load( log.debug(f"Loading inherited configuration file: {abspath}") with open(abspath, "rb") as fd: parent = yaml_load(fd, loader) - result = mergedeep.merge(parent, result) + result = _deep_merge(parent, result) return result diff --git a/pyproject.toml b/pyproject.toml index 5a3b8d5e..04375d84 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,6 @@ dependencies = [ "pyyaml_env_tag >=0.1", "importlib-metadata >=4.4; python_version < '3.10'", "packaging >=20.5", - "mergedeep >=1.3.4", "pathspec >=0.11.1", "mkdocs-get-deps >=0.2.0", "colorama >=0.4; platform_system == 'Windows'", @@ -66,7 +65,6 @@ min-versions = [ "pyyaml_env_tag ==1.1", "importlib-metadata ==4.4; python_version < '3.10'", "packaging ==26.1", - "mergedeep ==1.3.4", "pathspec ==1.0.4", "mkdocs-get-deps ==0.2.2", "colorama ==0.4.6; platform_system == 'Windows'",