1
Fork 0
mirror of https://github.com/Steffo99/cfig.git synced 2024-11-23 16:34:20 +00:00

Display a fancy error message if cfig.errors.BatchResolutionFailure is raised

This commit is contained in:
Steffo 2022-09-06 04:51:43 +02:00
parent 455d41669c
commit fa2e360767
Signed by: steffo
GPG key ID: 6965406171929D01
2 changed files with 35 additions and 1 deletions

View file

@ -79,9 +79,41 @@ class InvalidValueError(ConfigurationError):
class BatchResolutionFailure(BaseException):
"""
A cumulative error which sums the errors occurred while resolving proxied configuration values.
It inherits from :class:`BaseException` to be distinguishable from regular :class:`Exception`s occouring inside the resolvers.
It uses some formatting tricks to display the missing keys in the configuration error message:
.. code-block:: console
$ python -m cfig.sample.usage
Traceback (most recent call last):
...
File "./cfig/sample/usage.py", line 7, in <module>
config.proxies.resolve()
File "./cfig/config.py", line 59, in resolve
raise errors.BatchResolutionFailure(errors=errors_dict)
cfig.errors.BatchResolutionFailure: 4 errors occurred during the resolution of the config:
* EXAMPLE_NUMBER InvalidValueError: Not an int.
* TELEGRAM_BOT_TOKEN MissingValueError: TELEGRAM_BOT_TOKEN
* DISCORD_CLIENT_SECRET MissingValueError: DISCORD_CLIENT_SECRET
* DATABASE_URI MissingValueError: DATABASE_URI
"""
def __init__(self, errors: dict[str, Exception]):
message = [f"{len(errors)} errors occurred during the resolution of the config:"]
key_padding = max(map(lambda k: len(k), errors.keys()))
for key, val in errors.items():
# Weird padding hack, part 2
# noinspection PyStringFormat
key_text = f"{{key:{key_padding}}}".format(key=key)
message.append(f"* {key_text}{val.__class__.__qualname__}: {val}")
super().__init__("\n".join(message))
self.errors: dict[str, Exception] = errors
def __repr__(self):

View file

@ -2,7 +2,9 @@
This module contains an example of how to use the values defined in a cfig definition module.
"""
from .definition import EXAMPLE_STRING, EXAMPLE_NUMBER, DATABASE_ENGINE
from .definition import EXAMPLE_STRING, EXAMPLE_NUMBER, DATABASE_ENGINE, config
config.proxies.resolve()
if __name__ == "__main__":