Source code for pkgcore.config.hint
"""Config introspection support."""
__all__ = ("ConfigHint", "configurable")
import typing
[docs]
class ConfigHint:
"""Hint for introspection supplying overrides."""
types: dict[str, str]
positional: tuple[str, ...]
required: tuple[str, ...]
typename: typing.Optional[str]
allow_unknowns: bool
authorative: bool
requires_config: bool
raw_class: bool
# be aware this is used in clone
__slots__ = (
"types",
"positional",
"required",
"typename",
"allow_unknowns",
"doc",
"authorative",
"requires_config",
"raw_class",
)
def __init__(
self,
types: typing.Optional[dict[str, str]] = None,
positional: typing.Optional[typing.Sequence[str]] = None,
required: typing.Optional[typing.Sequence[str]] = None,
doc: typing.Optional[str] = None,
typename: typing.Optional[str] = None,
allow_unknowns: bool = False,
authorative: bool = False,
requires_config: bool = False,
raw_class: bool = False,
) -> None:
self.types = types or {}
self.positional = tuple(positional or [])
self.required = tuple(required or [])
self.typename = typename
self.allow_unknowns = allow_unknowns
self.doc = doc
self.authorative = authorative
self.requires_config = requires_config
self.raw_class = raw_class
[docs]
def clone(self, **kwds: typing.Any) -> "ConfigHint":
"""return a copy of this ConfigHint with the given kwds overrides"""
new_kwds = {}
for attr in self.__slots__:
new_kwds[attr] = kwds.pop(attr, getattr(self, attr))
if kwds:
raise TypeError(f"unknown type overrides: {kwds!r}")
return self.__class__(**new_kwds)
[docs]
def configurable(**kwargs):
"""Decorator version of ConfigHint."""
hint = ConfigHint(**kwargs)
def decorator(original):
original.pkgcore_config_type = hint
return original
return decorator