diff options
author | Richard van der Hoff <1389908+richvdh@users.noreply.github.com> | 2020-12-08 14:04:35 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-08 14:04:35 +0000 |
commit | ab7a24cc6bbffa5ba67b42731c45b1d4d33f3ae3 (patch) | |
tree | 9aeefb42b2c5871847505fc50f58127c7b605ebb /synapse/config/_util.py | |
parent | Simplify the flow for SSO UIA (#8881) (diff) | |
download | synapse-ab7a24cc6bbffa5ba67b42731c45b1d4d33f3ae3.tar.xz |
Better formatting for config errors from modules (#8874)
The idea is that the parse_config method of extension modules can raise either a ConfigError or a JsonValidationError, and it will be magically turned into a legible error message. There's a few components to it: * Separating the "path" and the "message" parts of a ConfigError, so that we can fiddle with the path bit to turn it into an absolute path. * Generally improving the way ConfigErrors get printed. * Passing in the config path to load_module so that it can wrap any exceptions that get caught appropriately.
Diffstat (limited to 'synapse/config/_util.py')
-rw-r--r-- | synapse/config/_util.py | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/synapse/config/_util.py b/synapse/config/_util.py index c74969a977..1bbe83c317 100644 --- a/synapse/config/_util.py +++ b/synapse/config/_util.py @@ -38,14 +38,27 @@ def validate_config( try: jsonschema.validate(config, json_schema) except jsonschema.ValidationError as e: - # copy `config_path` before modifying it. - path = list(config_path) - for p in list(e.path): - if isinstance(p, int): - path.append("<item %i>" % p) - else: - path.append(str(p)) - - raise ConfigError( - "Unable to parse configuration: %s at %s" % (e.message, ".".join(path)) - ) + raise json_error_to_config_error(e, config_path) + + +def json_error_to_config_error( + e: jsonschema.ValidationError, config_path: Iterable[str] +) -> ConfigError: + """Converts a json validation error to a user-readable ConfigError + + Args: + e: the exception to be converted + config_path: the path within the config file. This will be used as a basis + for the error message. + + Returns: + a ConfigError + """ + # copy `config_path` before modifying it. + path = list(config_path) + for p in list(e.path): + if isinstance(p, int): + path.append("<item %i>" % p) + else: + path.append(str(p)) + return ConfigError(e.message, path) |