aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron LI <aaronly.me@outlook.com>2016-10-03 20:34:33 +0800
committerAaron LI <aaronly.me@outlook.com>2016-10-03 20:34:33 +0800
commitefffb7474d695fc09f94e8aabcf54f160146b9a8 (patch)
treec142dcf6af4fac35feb4f7382e1ebcd9a662daa0
parentcf97ee0abe1790a1d0e767f834df5bcbc60accdb (diff)
downloadfg21sim-efffb7474d695fc09f94e8aabcf54f160146b9a8.tar.bz2
Add custom configuration checkers.
These additional checker functions validate the required configs whether provided by the user config file, as well as against necessary contexts.
-rw-r--r--fg21sim/configs/__init__.py1
-rw-r--r--fg21sim/configs/validate.py94
2 files changed, 95 insertions, 0 deletions
diff --git a/fg21sim/configs/__init__.py b/fg21sim/configs/__init__.py
index b1fe70f..bbfbbd7 100644
--- a/fg21sim/configs/__init__.py
+++ b/fg21sim/configs/__init__.py
@@ -2,5 +2,6 @@
# MIT license
from .manager import ConfigManager
+from .validate import validate_configs
configs = ConfigManager()
diff --git a/fg21sim/configs/validate.py b/fg21sim/configs/validate.py
new file mode 100644
index 0000000..b9accdf
--- /dev/null
+++ b/fg21sim/configs/validate.py
@@ -0,0 +1,94 @@
+# Copyright (c) 2016 Weitian LI <liweitianux@live.com>
+# MIT license
+
+"""
+Custom validations for the configurations.
+"""
+
+from ..errors import ConfigError
+
+
+def _check_missing(configs, keys):
+ """Check whether the mandatory config is provided by the user."""
+ if isinstance(keys, str):
+ keys = [keys, ]
+ for key in keys:
+ if not configs.getn(key):
+ raise ConfigError('config "%s" missing' % key)
+ return True
+
+
+def check_common(configs):
+ """Check the "[common]" section of the configurations."""
+ _check_missing(configs, "common/data_dir")
+ return True
+
+
+def check_frequency(configs):
+ """Check the "[frequency]" section of the configurations."""
+ if configs.getn("frequency/type") == "custom":
+ _check_missing(configs, "frequency/frequencies")
+ elif configs.getn("frequency/type") == "calc":
+ _check_missing(configs, ["frequency/start",
+ "frequency/stop",
+ "frequency/step"])
+ return True
+
+
+def check_output(configs):
+ """Check the "[output]" section of the configurations."""
+ if configs.getn("output/combine"):
+ _check_missing(configs, "output/output_dir")
+ return True
+
+
+def check_galactic_synchrotron(configs):
+ """Check the "[galactic][synchrotron]" section of the configurations."""
+ _check_missing(configs, ["galactic/synchrotron/template",
+ "galactic/synchrotron/template_freq",
+ "galactic/synchrotron/template_unit",
+ "galactic/synchrotron/indexmap"])
+ if configs.getn("galactic/synchrotron/save"):
+ _check_missing(configs, "galactic/synchrotron/output_dir")
+ return True
+
+
+# Available checkers to validate the configurations
+_CHECKERS = [
+ check_common,
+ check_frequency,
+ check_output,
+ check_galactic_synchrotron,
+]
+
+
+def validate_configs(configs, checkers=_CHECKERS):
+ """Validate the configurations through the supplied checkers.
+
+ These checker usually validate on the global scale, and validate
+ some specific configs against their contexts.
+
+ Parameters
+ ----------
+ configs : `ConfigManager` object
+ An `ConfigManager` object contains both default and user
+ configurations.
+ checkers : list of functions
+ List of checker functions through which the configurations
+ will be validated.
+
+ Returns
+ -------
+ bool
+ True if the configurations pass all checker functions, otherwise,
+ the `ConfigError` will be raised with corresponding message.
+
+ Raises
+ ------
+ ConfigError
+ If any configuration failed the check, a `ConfigError` with
+ details will be raised.
+ """
+ for checker in checkers:
+ checker(configs)
+ return True