"""Umbrella package for all rules.
Anyone who wants to develop a plugin is welcome to modify the values in this specific namespace. In particular, to add
a rule with your plugin:
1) Add your plugin's rules as a submodule of this using
`from sys import modules; modules['.'.join((PATH_TO_RULE_MODULE, PATH_TO_YOUR_RULE))] = module[PATH_TO_YOUR_RULE]
2) Append your plugin's namespace to `rule.__all__`
3) Append each of your rules' import paths to `consts.AVAILABLE_RULES`
"""
from __future__ import annotations
from importlib import import_module
from typing import Any, Optional, Type, cast
from attrs import define
from .. import Rule
from ..consts import AnyResolution
from ..util import dynamic_import
[docs]def get_rule(type_: str) -> Type[Rule[Any]]:
"""Dynamically import and return a rule type by name."""
ret = getattr(
import_module(".".join(("", *type_.split(".")[:-1])), __name__),
type_.split(".")[-1]
)
if issubclass(ret, Rule):
return cast(Type[Rule[Any]], ret)
raise NameError()
[docs]@define(slots=False) # type: ignore
class DoResolveRule(Rule[Optional[bool]]):
"""The subtype of rule which determines if a market should resolve, returning a bool."""
[docs]@define(slots=False) # type: ignore
class ResolutionValueRule(Rule[AnyResolution]):
"""The subtype of rule which determines what a market should resolve to."""
__all__ = ['get_rule', 'DoResolveRule', 'ResolutionValueRule']
# dynamically load optional plugins where able to
exempt = {'__init__', '__main__', '__pycache__'}
dynamic_import(__file__, __name__, __all__, exempt)