aboutsummaryrefslogtreecommitdiffstats
path: root/common.py
diff options
context:
space:
mode:
authorGuilhem Moulin <guilhem@fripost.org>2025-05-27 23:20:26 +0200
committerGuilhem Moulin <guilhem@fripost.org>2025-06-04 15:16:29 +0200
commit052536f62d2e58f6b9b142e035c49cb033458d7f (patch)
tree9487344ce453dfa3493dc2a0c9dd899a0070cfb5 /common.py
parent3e9586f0a9708afca40ab50a2987fc0090256e2f (diff)
MVT: Generate metadata.json with copyright and timing information.
So the information can be exposed to the webmap's info dialog.
Diffstat (limited to 'common.py')
-rw-r--r--common.py60
1 files changed, 59 insertions, 1 deletions
diff --git a/common.py b/common.py
index 0035160..0859ef0 100644
--- a/common.py
+++ b/common.py
@@ -19,7 +19,7 @@
# pylint: disable=missing-module-docstring
import os
-from os import path as os_path, curdir as os_curdir
+from os import path as os_path, curdir as os_curdir, pardir as os_pardir, sep as os_sep
import sys
from fnmatch import fnmatchcase
from pathlib import Path, PosixPath
@@ -151,6 +151,64 @@ def parse_config(path : Optional[Path] = None,
return config
+def _check_key_type(k : str, v : str, known_keys : list[type, tuple[set[str]]]) -> bool:
+ for t, ks in known_keys:
+ if k in ks and isinstance(v, t):
+ return True
+ return False
+
+def parse_config_dl(downloads) -> dict[str, dict[str, str|int]]:
+ """Parse and validate the "downloads" section from the configuration dictionary"""
+
+ if not isinstance(downloads, list):
+ raise BadConfiguration(f'Invalid download recipe: {downloads}')
+
+ known_keys = [
+ (str, {'path', 'url'}),
+ (int, {'max-age', 'max-size'}),
+ ]
+
+ destinations = {}
+ known_keys_set = {k for _,ks in known_keys for k in ks}
+ for dl in downloads:
+ if 'url' in dl:
+ dls = [dl]
+ elif 'basedir' in dl and 'baseurl' in dl and 'files' in dl and 'path' not in dl:
+ dls = []
+ for filename in dl['files']:
+ dl2 = {
+ 'path' : os_path.join(dl['basedir'], filename),
+ 'url' : dl['baseurl'] + filename
+ }
+ for k, v in dl.items():
+ if k not in ('basedir', 'baseurl', 'files'):
+ dl2[k] = v
+ dls.append(dl2)
+ else:
+ raise BadConfiguration(f'Invalid download recipe: {dl}')
+
+ for dl in dls:
+ path = dl.get('path', None)
+ if path is None or path in ('', os_curdir, os_pardir) or path.endswith(os_sep):
+ raise BadConfiguration(f'Invalid destination path "{path}"')
+ if path in destinations:
+ raise BadConfiguration(f'Duplicate download recipe for "{path}"')
+ dl2 = {}
+ for k, v in dl.items():
+ if k == 'path':
+ continue
+ if k not in known_keys_set:
+ logging.warning('Ignoring unknown setting "%s" in download recipe for "%s"',
+ k, path)
+ elif not _check_key_type(k, v, known_keys):
+ logging.warning('Ignoring setting "%s" in download recipe for "%s"'
+ ' (invalid type)', k, path)
+ else:
+ dl2[k] = v
+ destinations[path] = dl2
+
+ return destinations
+
# pylint: disable-next=invalid-name
def getSourcePathLockFileName(path : str) -> str:
"""Return the name of the lockfile associated with a source path."""