diff --git a/.gitignore b/.gitignore
index 8250d4d..0d9f2d4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -161,3 +161,6 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/
+
+# Downloaded assets
+docs/assets/downloaded/
diff --git a/docs/about.md b/docs/about.md
index 07508e1..e529070 100644
--- a/docs/about.md
+++ b/docs/about.md
@@ -79,4 +79,4 @@ zappend --help-config md > docs/config.md
`zappend` is open source made available under the terms and conditions of the
[MIT License](https://github.com/bcdev/zappend/blob/main/LICENSE).
-Copyright © 2024 Brockmann Consult Development
+Copyright © 2024-2026 Brockmann Consult Development
diff --git a/docs/hooks/download_fonts.py b/docs/hooks/download_fonts.py
new file mode 100644
index 0000000..3916a9c
--- /dev/null
+++ b/docs/hooks/download_fonts.py
@@ -0,0 +1,48 @@
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
+
+from pathlib import Path
+from urllib.error import URLError
+from urllib.request import urlretrieve
+
+ROBOTO_BASE_URL = "https://raw.githubusercontent.com/google/fonts/main/ofl/roboto"
+
+DOWNLOADS = (
+ {
+ "name": "Roboto.ttf",
+ "url": f"{ROBOTO_BASE_URL}/Roboto%5Bwdth,wght%5D.ttf",
+ },
+ {
+ "name": "Roboto-Italic.ttf",
+ "url": f"{ROBOTO_BASE_URL}/Roboto-Italic%5Bwdth,wght%5D.ttf",
+ },
+ {
+ "name": "OFL.txt",
+ "url": f"{ROBOTO_BASE_URL}/OFL.txt",
+ },
+)
+
+
+def on_config(config):
+ """Download self-hosted Roboto assets before MkDocs builds the site."""
+ docs_dir = Path(config["docs_dir"])
+ font_dir = docs_dir / "assets" / "downloaded" / "fonts"
+ font_dir.mkdir(parents=True, exist_ok=True)
+
+ for item in DOWNLOADS:
+ target = font_dir / item["name"]
+ if target.exists():
+ continue
+
+ try:
+ print(f"Downloading Roboto asset: {item['name']}")
+ urlretrieve(item["url"], target)
+ except URLError as exc:
+ raise RuntimeError(
+ f"Could not download {item['name']} from {item['url']}. "
+ "Check your network connection or place the file manually in "
+ f"{font_dir}."
+ ) from exc
+
+ return config
diff --git a/docs/overrides/partials/copyright.html b/docs/overrides/partials/copyright.html
new file mode 100644
index 0000000..e3e16fb
--- /dev/null
+++ b/docs/overrides/partials/copyright.html
@@ -0,0 +1,17 @@
+
+
+
+ {% if config.copyright %}
+
+ {{ config.copyright }}
+ {% for link in config.extra.footer_links %}
+
+
{{ link.text }}
+ {% endfor %}
+
+ {% endif %}
+
diff --git a/docs/stylesheet/extra.css b/docs/stylesheet/extra.css
new file mode 100644
index 0000000..38b6b4c
--- /dev/null
+++ b/docs/stylesheet/extra.css
@@ -0,0 +1,21 @@
+@font-face {
+ font-family: "Roboto";
+ src: url("../assets/downloaded/fonts/Roboto.ttf") format("truetype");
+ font-style: normal;
+ font-weight: 100 900;
+ font-stretch: 75% 100%;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: "Roboto";
+ src: url("../assets/downloaded/fonts/Roboto-Italic.ttf") format("truetype");
+ font-style: italic;
+ font-weight: 100 900;
+ font-stretch: 75% 100%;
+ font-display: swap;
+}
+
+:root {
+ --md-text-font: "Roboto", "Segoe UI", Helvetica, Arial, sans-serif;
+}
diff --git a/mkdocs.yml b/mkdocs.yml
index 1977b63..ff81cce 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -2,7 +2,7 @@ site_name: zappend
repo_url: https://github.com/bcdev/zappend
repo_name: bcdev/zappend
-copyright: Copyright © 2024, 2025 Brockmann Consult and contributors
+copyright: Copyright © 2024-2026 Brockmann Consult and contributors
nav:
- Overview: index.md
@@ -18,6 +18,8 @@ theme:
name: material
logo: assets/logo.png
favicon: assets/logo-small.png
+ font: false
+ custom_dir: docs/overrides
palette:
# Palette toggle for light mode
- scheme: default
@@ -43,6 +45,11 @@ extra:
link: https://github.com/bcdev/zappend
- icon: fontawesome/brands/python
link: https://pypi.org/project/zappend/
+ footer_links:
+ - text: Imprint
+ href: https://www.brockmann-consult.de/imprint/
+ - text: Privacy Policy
+ href: https://www.brockmann-consult.de/privacy-policy-documentation-pages/
plugins:
- search
@@ -56,3 +63,9 @@ plugins:
show_source: false
heading_level: 3
annotations_path: brief
+
+extra_css:
+ - stylesheet/extra.css
+
+hooks:
+ - docs/hooks/download_fonts.py
\ No newline at end of file
diff --git a/tests/__init__.py b/tests/__init__.py
index 34898ad..e700455 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,3 +1,3 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
diff --git a/tests/config/__init__.py b/tests/config/__init__.py
index e69de29..072757f 100644
--- a/tests/config/__init__.py
+++ b/tests/config/__init__.py
@@ -0,0 +1,4 @@
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
+
diff --git a/tests/config/test_attrs.py b/tests/config/test_attrs.py
index 9198091..b46124c 100644
--- a/tests/config/test_attrs.py
+++ b/tests/config/test_attrs.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import datetime
import json
diff --git a/tests/config/test_config.py b/tests/config/test_config.py
index ae807b7..6c5a8f6 100644
--- a/tests/config/test_config.py
+++ b/tests/config/test_config.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/config/test_normalize.py b/tests/config/test_normalize.py
index e45b811..e9ea2bb 100644
--- a/tests/config/test_normalize.py
+++ b/tests/config/test_normalize.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import json
import os
diff --git a/tests/config/test_schema.py b/tests/config/test_schema.py
index e7f966f..2c721c3 100644
--- a/tests/config/test_schema.py
+++ b/tests/config/test_schema.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/config/test_validate.py b/tests/config/test_validate.py
index fa81750..d39be9f 100644
--- a/tests/config/test_validate.py
+++ b/tests/config/test_validate.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/contrib/__init__.py b/tests/contrib/__init__.py
index 34898ad..e700455 100644
--- a/tests/contrib/__init__.py
+++ b/tests/contrib/__init__.py
@@ -1,3 +1,3 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
diff --git a/tests/contrib/test_levels.py b/tests/contrib/test_levels.py
index f75dd05..de24725 100644
--- a/tests/contrib/test_levels.py
+++ b/tests/contrib/test_levels.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import json
import unittest
diff --git a/tests/fsutil/__init__.py b/tests/fsutil/__init__.py
index 34898ad..e700455 100644
--- a/tests/fsutil/__init__.py
+++ b/tests/fsutil/__init__.py
@@ -1,3 +1,3 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
diff --git a/tests/fsutil/test_fileobj.py b/tests/fsutil/test_fileobj.py
index 9f82115..6bb7a8e 100644
--- a/tests/fsutil/test_fileobj.py
+++ b/tests/fsutil/test_fileobj.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import os.path
import unittest
diff --git a/tests/fsutil/test_path.py b/tests/fsutil/test_path.py
index 9ab3dc9..ab6cef8 100644
--- a/tests/fsutil/test_path.py
+++ b/tests/fsutil/test_path.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/fsutil/test_transaction.py b/tests/fsutil/test_transaction.py
index 4bf8d15..753b412 100644
--- a/tests/fsutil/test_transaction.py
+++ b/tests/fsutil/test_transaction.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
from typing import Callable
diff --git a/tests/helpers.py b/tests/helpers.py
index 786a762..b5d661b 100644
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from contextlib import contextmanager
from typing import Any
diff --git a/tests/slice/__init__.py b/tests/slice/__init__.py
index e69de29..072757f 100644
--- a/tests/slice/__init__.py
+++ b/tests/slice/__init__.py
@@ -0,0 +1,4 @@
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
+
diff --git a/tests/slice/test_callable.py b/tests/slice/test_callable.py
index 2f7424e..d1a5c53 100644
--- a/tests/slice/test_callable.py
+++ b/tests/slice/test_callable.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/slice/test_cm.py b/tests/slice/test_cm.py
index 788f508..774880f 100644
--- a/tests/slice/test_cm.py
+++ b/tests/slice/test_cm.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import contextlib
import shutil
diff --git a/tests/slice/test_source.py b/tests/slice/test_source.py
index 1b05de4..4b46fae 100644
--- a/tests/slice/test_source.py
+++ b/tests/slice/test_source.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/test_api.py b/tests/test_api.py
index a154e17..356b361 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import os
import shutil
diff --git a/tests/test_cli.py b/tests/test_cli.py
index de7ecce..9f61b78 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/test_context.py b/tests/test_context.py
index 654c9d6..f8c28bd 100644
--- a/tests/test_context.py
+++ b/tests/test_context.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/test_log.py b/tests/test_log.py
index f522e95..741e93d 100644
--- a/tests/test_log.py
+++ b/tests/test_log.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import logging
import unittest
diff --git a/tests/test_metadata.py b/tests/test_metadata.py
index 72e5c85..3818bd2 100644
--- a/tests/test_metadata.py
+++ b/tests/test_metadata.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import math
import unittest
diff --git a/tests/test_processor.py b/tests/test_processor.py
index a5c6473..309e107 100644
--- a/tests/test_processor.py
+++ b/tests/test_processor.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/test_profiler.py b/tests/test_profiler.py
index 7d1a5af..122905a 100644
--- a/tests/test_profiler.py
+++ b/tests/test_profiler.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import os
import unittest
diff --git a/tests/test_rollbackstore.py b/tests/test_rollbackstore.py
index da22a4a..c98a269 100644
--- a/tests/test_rollbackstore.py
+++ b/tests/test_rollbackstore.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import copy
import unittest
diff --git a/tests/test_tailoring.py b/tests/test_tailoring.py
index 3c62719..a842ce6 100644
--- a/tests/test_tailoring.py
+++ b/tests/test_tailoring.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import unittest
diff --git a/tests/test_xrencoding.py b/tests/test_xrencoding.py
index 688c250..917b85f 100644
--- a/tests/test_xrencoding.py
+++ b/tests/test_xrencoding.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import json
import unittest
diff --git a/zappend/__init__.py b/zappend/__init__.py
index 2429edd..74c258a 100644
--- a/zappend/__init__.py
+++ b/zappend/__init__.py
@@ -1,5 +1,5 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
__version__ = "0.8.1.dev0"
diff --git a/zappend/api.py b/zappend/api.py
index 85941e5..906739f 100644
--- a/zappend/api.py
+++ b/zappend/api.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from typing import Any, Iterable
diff --git a/zappend/cli.py b/zappend/cli.py
index 5e8ded4..40b31d4 100644
--- a/zappend/cli.py
+++ b/zappend/cli.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import sys
import click
diff --git a/zappend/config/__init__.py b/zappend/config/__init__.py
index 0fb4d47..2cf4891 100644
--- a/zappend/config/__init__.py
+++ b/zappend/config/__init__.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from .attrs import eval_dyn_config_attrs, get_dyn_config_attrs_env, has_dyn_config_attrs
from .config import Config
diff --git a/zappend/config/attrs.py b/zappend/config/attrs.py
index d58c60f..c87dbb2 100644
--- a/zappend/config/attrs.py
+++ b/zappend/config/attrs.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import datetime
import math
diff --git a/zappend/config/config.py b/zappend/config/config.py
index fb0ce0a..13c21e8 100644
--- a/zappend/config/config.py
+++ b/zappend/config/config.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import tempfile
from typing import Any, Callable, Dict, Literal
diff --git a/zappend/config/defaults.py b/zappend/config/defaults.py
index 00196e5..89a4fba 100644
--- a/zappend/config/defaults.py
+++ b/zappend/config/defaults.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
DEFAULT_ZARR_VERSION = 2
DEFAULT_APPEND_DIM = "time"
diff --git a/zappend/config/markdown.py b/zappend/config/markdown.py
index b29239b..df2a3ab 100644
--- a/zappend/config/markdown.py
+++ b/zappend/config/markdown.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import json
from typing import Any
diff --git a/zappend/config/normalize.py b/zappend/config/normalize.py
index 2883bb9..5283f32 100644
--- a/zappend/config/normalize.py
+++ b/zappend/config/normalize.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import contextlib
import io
diff --git a/zappend/config/schema.py b/zappend/config/schema.py
index 601fb77..e1d7b2a 100644
--- a/zappend/config/schema.py
+++ b/zappend/config/schema.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import json
from typing import Any, Literal
diff --git a/zappend/config/validate.py b/zappend/config/validate.py
index 1887d2f..7422de0 100644
--- a/zappend/config/validate.py
+++ b/zappend/config/validate.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from typing import Any
diff --git a/zappend/context.py b/zappend/context.py
index 69f6916..05948af 100644
--- a/zappend/context.py
+++ b/zappend/context.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from typing import Any, Dict
diff --git a/zappend/contrib/__init__.py b/zappend/contrib/__init__.py
index b8a10f9..87497f6 100644
--- a/zappend/contrib/__init__.py
+++ b/zappend/contrib/__init__.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
"""
This module contributes to zappend's core functionality.
diff --git a/zappend/contrib/levels.py b/zappend/contrib/levels.py
index e4341ec..b8e5a5c 100644
--- a/zappend/contrib/levels.py
+++ b/zappend/contrib/levels.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import json
import logging
diff --git a/zappend/fsutil/__init__.py b/zappend/fsutil/__init__.py
index 3396aa2..61179fd 100644
--- a/zappend/fsutil/__init__.py
+++ b/zappend/fsutil/__init__.py
@@ -1,5 +1,5 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from .fileobj import FileObj as FileObj
diff --git a/zappend/fsutil/fileobj.py b/zappend/fsutil/fileobj.py
index 9d80b7a..7d26748 100644
--- a/zappend/fsutil/fileobj.py
+++ b/zappend/fsutil/fileobj.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import json
from typing import Any, Literal
diff --git a/zappend/fsutil/path.py b/zappend/fsutil/path.py
index a841c15..304d4f6 100644
--- a/zappend/fsutil/path.py
+++ b/zappend/fsutil/path.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
def split_parent(path: str, sep: str = "/") -> tuple[str, str]:
diff --git a/zappend/fsutil/transaction.py b/zappend/fsutil/transaction.py
index e427a40..134d810 100644
--- a/zappend/fsutil/transaction.py
+++ b/zappend/fsutil/transaction.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import uuid
from typing import Callable, Literal
diff --git a/zappend/log.py b/zappend/log.py
index 2ee0db8..229b5aa 100644
--- a/zappend/log.py
+++ b/zappend/log.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import logging
import logging.config
diff --git a/zappend/metadata.py b/zappend/metadata.py
index 5cd5f19..841cb9e 100644
--- a/zappend/metadata.py
+++ b/zappend/metadata.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from typing import Any, Callable
diff --git a/zappend/processor.py b/zappend/processor.py
index 0e6764d..ed5ffca 100644
--- a/zappend/processor.py
+++ b/zappend/processor.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import collections.abc
from typing import Any, Iterable
diff --git a/zappend/profiler.py b/zappend/profiler.py
index 1f787c4..44a895e 100644
--- a/zappend/profiler.py
+++ b/zappend/profiler.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import cProfile
import io
diff --git a/zappend/rollbackstore.py b/zappend/rollbackstore.py
index d64adad..ba897a8 100644
--- a/zappend/rollbackstore.py
+++ b/zappend/rollbackstore.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from collections.abc import MutableMapping
from typing import Any, Mapping, Sequence
diff --git a/zappend/slice/__init__.py b/zappend/slice/__init__.py
index 037844e..c7c9e06 100644
--- a/zappend/slice/__init__.py
+++ b/zappend/slice/__init__.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from .callable import SliceCallable, invoke_slice_callable, to_slice_callable
from .cm import open_slice_dataset
diff --git a/zappend/slice/callable.py b/zappend/slice/callable.py
index 95abf88..d47a231 100644
--- a/zappend/slice/callable.py
+++ b/zappend/slice/callable.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import importlib
import inspect
diff --git a/zappend/slice/cm.py b/zappend/slice/cm.py
index 62b5ed5..a234169 100644
--- a/zappend/slice/cm.py
+++ b/zappend/slice/cm.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import contextlib
from typing import Any, ContextManager
diff --git a/zappend/slice/source.py b/zappend/slice/source.py
index 2f724db..c252cad 100644
--- a/zappend/slice/source.py
+++ b/zappend/slice/source.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import contextlib
import warnings
diff --git a/zappend/slice/sources/__init__.py b/zappend/slice/sources/__init__.py
index c995056..acb804f 100644
--- a/zappend/slice/sources/__init__.py
+++ b/zappend/slice/sources/__init__.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
from .memory import MemorySliceSource
from .persistent import PersistentSliceSource
diff --git a/zappend/slice/sources/memory.py b/zappend/slice/sources/memory.py
index f30c9d5..7b4ae47 100644
--- a/zappend/slice/sources/memory.py
+++ b/zappend/slice/sources/memory.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import xarray as xr
diff --git a/zappend/slice/sources/persistent.py b/zappend/slice/sources/persistent.py
index e0387ad..0c54ff8 100644
--- a/zappend/slice/sources/persistent.py
+++ b/zappend/slice/sources/persistent.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import time
diff --git a/zappend/slice/sources/temporary.py b/zappend/slice/sources/temporary.py
index d4e5d3b..4328de5 100644
--- a/zappend/slice/sources/temporary.py
+++ b/zappend/slice/sources/temporary.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import xarray as xr
diff --git a/zappend/tailoring.py b/zappend/tailoring.py
index cde38ec..d2e68c8 100644
--- a/zappend/tailoring.py
+++ b/zappend/tailoring.py
@@ -1,6 +1,6 @@
-# Copyright © 2024, 2025 Brockmann Consult and contributors
-# Permissions are hereby granted under the terms of the MIT License:
-# https://opensource.org/licenses/MIT.
+# Copyright © 2024-2026 Brockmann Consult and contributors
+# Permissions are hereby granted under the terms of the MIT License:
+# https://opensource.org/licenses/MIT.
import dask.array
import numpy as np