]> git.openstreetmap.org Git - nominatim.git/blobdiff - nominatim/config.py
Merge remote-tracking branch 'upstream/master'
[nominatim.git] / nominatim / config.py
index 271d2d4d4ee20b0d37fde49de1429b5b9da7f0fc..72aaf0bd6b436ed78322f39ccec34feb560d542d 100644 (file)
@@ -7,6 +7,8 @@ from pathlib import Path
 
 from dotenv import dotenv_values
 
 
 from dotenv import dotenv_values
 
+from nominatim.errors import UsageError
+
 LOG = logging.getLogger()
 
 class Configuration:
 LOG = logging.getLogger()
 
 class Configuration:
@@ -15,7 +17,7 @@ class Configuration:
         Nominatim uses dotenv to configure the software. Configuration options
         are resolved in the following order:
 
         Nominatim uses dotenv to configure the software. Configuration options
         are resolved in the following order:
 
-         * from the OS environment
+         * from the OS environment (or the dirctionary given in `environ`
          * from the .env file in the project directory of the installation
          * from the default installation in the configuration directory
 
          * from the .env file in the project directory of the installation
          * from the default installation in the configuration directory
 
@@ -23,11 +25,12 @@ class Configuration:
         avoid conflicts with other environment variables.
     """
 
         avoid conflicts with other environment variables.
     """
 
-    def __init__(self, project_dir, config_dir):
+    def __init__(self, project_dir, config_dir, environ=None):
+        self.environ = environ or os.environ
         self.project_dir = project_dir
         self.config_dir = config_dir
         self._config = dotenv_values(str((config_dir / 'env.defaults').resolve()))
         self.project_dir = project_dir
         self.config_dir = config_dir
         self._config = dotenv_values(str((config_dir / 'env.defaults').resolve()))
-        if project_dir is not None:
+        if project_dir is not None and (project_dir / '.env').is_file():
             self._config.update(dotenv_values(str((project_dir / '.env').resolve())))
 
         # Add defaults for variables that are left empty to set the default.
             self._config.update(dotenv_values(str((project_dir / '.env').resolve())))
 
         # Add defaults for variables that are left empty to set the default.
@@ -36,11 +39,21 @@ class Configuration:
             self._config['NOMINATIM_ADDRESS_LEVEL_CONFIG'] = \
                 str(config_dir / 'address-levels.json')
 
             self._config['NOMINATIM_ADDRESS_LEVEL_CONFIG'] = \
                 str(config_dir / 'address-levels.json')
 
+        class _LibDirs:
+            pass
+
+        self.lib_dir = _LibDirs()
+
+    def set_libdirs(self, **kwargs):
+        """ Set paths to library functions and data.
+        """
+        for key, value in kwargs.items():
+            setattr(self.lib_dir, key, Path(value).resolve())
 
     def __getattr__(self, name):
         name = 'NOMINATIM_' + name
 
 
     def __getattr__(self, name):
         name = 'NOMINATIM_' + name
 
-        return os.environ.get(name) or self._config[name]
+        return self.environ.get(name) or self._config[name]
 
     def get_bool(self, name):
         """ Return the given configuration parameter as a boolean.
 
     def get_bool(self, name):
         """ Return the given configuration parameter as a boolean.
@@ -57,7 +70,7 @@ class Configuration:
             return int(self.__getattr__(name))
         except ValueError:
             LOG.fatal("Invalid setting NOMINATIM_%s. Needs to be a number.", name)
             return int(self.__getattr__(name))
         except ValueError:
             LOG.fatal("Invalid setting NOMINATIM_%s. Needs to be a number.", name)
-            raise
+            raise UsageError("Configuration error.")
 
 
     def get_libpq_dsn(self):
 
 
     def get_libpq_dsn(self):
@@ -98,6 +111,6 @@ class Configuration:
             merged in.
         """
         env = dict(self._config)
             merged in.
         """
         env = dict(self._config)
-        env.update(os.environ)
+        env.update(self.environ)
 
         return env
 
         return env