Browse Source

Drop pytomlpp dependency for Python >= 3.11

Rely on tomllib for Python >= 3.11
Alexandre Flament 1 year ago
parent
commit
ac430a9eaf
2 changed files with 34 additions and 9 deletions
  1. 1 1
      requirements.txt
  2. 33 8
      searx/botdetection/config.py

+ 1 - 1
requirements.txt

@@ -15,4 +15,4 @@ setproctitle==1.3.3
 redis==5.0.4
 markdown-it-py==3.0.0
 fasttext-predict==0.9.2.2
-pytomlpp==1.0.13
+pytomlpp==1.0.13; python_version < '3.11'

+ 33 - 8
searx/botdetection/config.py

@@ -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