|
@@ -13,7 +13,18 @@ import copy
|
|
|
import typing
|
|
|
import logging
|
|
|
import pathlib
|
|
|
-import pytomlpp as toml
|
|
|
+
|
|
|
+try:
|
|
|
+ import tomllib
|
|
|
+
|
|
|
+ pytomlpp = None
|
|
|
+ USE_TOMLLIB = True
|
|
|
+except ImportError:
|
|
|
+ import pytomlpp
|
|
|
+
|
|
|
+ tomllib = None
|
|
|
+ USE_TOMLLIB = False
|
|
|
+
|
|
|
|
|
|
__all__ = ['Config', 'UNSET', 'SchemaIssue']
|
|
|
|
|
@@ -61,7 +72,7 @@ class Config:
|
|
|
# init schema
|
|
|
|
|
|
log.debug("load schema file: %s", schema_file)
|
|
|
- cfg = cls(cfg_schema=toml.load(schema_file), deprecated=deprecated)
|
|
|
+ cfg = cls(cfg_schema=toml_load(schema_file), deprecated=deprecated)
|
|
|
if not cfg_file.exists():
|
|
|
log.warning("missing config file: %s", cfg_file)
|
|
|
return cfg
|
|
@@ -69,12 +80,7 @@ class Config:
|
|
|
# load configuration
|
|
|
|
|
|
log.debug("load config file: %s", cfg_file)
|
|
|
- try:
|
|
|
- upd_cfg = toml.load(cfg_file)
|
|
|
- except toml.DecodeError as exc:
|
|
|
- msg = str(exc).replace('\t', '').replace('\n', ' ')
|
|
|
- log.error("%s: %s", cfg_file, msg)
|
|
|
- raise
|
|
|
+ upd_cfg = toml_load(cfg_file)
|
|
|
|
|
|
is_valid, issue_list = cfg.validate(upd_cfg)
|
|
|
for msg in issue_list:
|
|
@@ -176,6 +182,25 @@ class Config:
|
|
|
return getattr(m, name)
|
|
|
|
|
|
|
|
|
+def toml_load(file_name):
|
|
|
+ if USE_TOMLLIB:
|
|
|
+ # Python >= 3.11
|
|
|
+ try:
|
|
|
+ with open(file_name, "rb") as f:
|
|
|
+ return tomllib.load(f)
|
|
|
+ except tomllib.TOMLDecodeError as exc:
|
|
|
+ msg = str(exc).replace('\t', '').replace('\n', ' ')
|
|
|
+ log.error("%s: %s", file_name, msg)
|
|
|
+ raise
|
|
|
+ # fallback to pytomlpp for Python < 3.11
|
|
|
+ try:
|
|
|
+ return pytomlpp.load(file_name)
|
|
|
+ except pytomlpp.DecodeError as exc:
|
|
|
+ msg = str(exc).replace('\t', '').replace('\n', ' ')
|
|
|
+ log.error("%s: %s", file_name, msg)
|
|
|
+ raise
|
|
|
+
|
|
|
+
|
|
|
# working with dictionaries
|
|
|
|
|
|
|