From 80ae05a4f6ecc78478383bef2f45cbe54c948112 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Tue, 13 Aug 2024 13:55:06 +0200 Subject: [PATCH] docs: Update (Async)TransitionConfig(Dict) and adjusted tests --- Changelog.md | 1 + tests/test_async.py | 50 ++++++++++++++++++- tests/test_core.py | 49 ++++++++++++++++-- tests/test_experimental.py | 7 +-- tests/test_graphviz.py | 6 +-- tests/test_reuse.py | 11 ++-- tests/utils.py | 3 +- transitions/core.pyi | 33 ++++++++---- transitions/experimental/utils.py | 4 +- transitions/experimental/utils.pyi | 35 +++++++++---- transitions/extensions/asyncio.pyi | 33 ++++++++---- transitions/extensions/diagrams.pyi | 8 +-- transitions/extensions/diagrams_graphviz.pyi | 2 +- transitions/extensions/diagrams_mermaid.pyi | 2 +- .../extensions/diagrams_pygraphviz.pyi | 2 +- transitions/extensions/locking.pyi | 6 +-- transitions/extensions/markup.pyi | 6 +-- transitions/extensions/nesting.pyi | 28 +++++------ transitions/extensions/states.pyi | 4 +- 19 files changed, 206 insertions(+), 84 deletions(-) diff --git a/Changelog.md b/Changelog.md index 7b3c48cd..acb80c9b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,7 @@ - Bug #683: Typing wrongly suggested that `Transition` instances can be passed to `Machine.__init__` and/or `Machine.add_transition(s)` (thanks @antonio-antuan) - Typing should be more precise now + - Made `transitions.core.(Async)TransitionConfigDict` a `TypedDict` which can be used to spot parameter errors during static analysis - `Machine.add_transitions` and `Machine.__init__` expect a `Sequence` of configurations for transitions now - Added 'async' callbacks to types in `asyncio` extension diff --git a/tests/test_async.py b/tests/test_async.py index fadbca0d..03e25302 100644 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -2,7 +2,8 @@ try: import asyncio - from transitions.extensions.asyncio import AsyncMachine, HierarchicalAsyncMachine, AsyncEventData + from transitions.extensions.asyncio import AsyncMachine, HierarchicalAsyncMachine, AsyncEventData, \ + AsyncTransition except (ImportError, SyntaxError): asyncio = None # type: ignore @@ -17,7 +18,7 @@ from .test_pygraphviz import pgv if TYPE_CHECKING: - from typing import Type, Sequence + from typing import Type, Sequence, List from transitions.extensions.asyncio import AsyncTransitionConfig @@ -584,6 +585,51 @@ async def run(): asyncio.run(run()) + def test_custom_transition(self): + + class MyTransition(self.machine_cls.transition_cls): # type: ignore + + def __init__(self, source, dest, conditions=None, unless=None, before=None, + after=None, prepare=None, my_int=None, my_none=None, my_str=None, my_dict=None): + super(MyTransition, self).__init__(source, dest, conditions, unless, before, after, prepare) + self.my_int = my_int + self.my_none = my_none + self.my_str = my_str + self.my_dict = my_dict + + class MyMachine(self.machine_cls): # type: ignore + transition_cls = MyTransition + + a_transition = { + "trigger": "go", "source": "B", "dest": "A", + "my_int": 42, "my_str": "foo", "my_dict": {"bar": "baz"} + } + transitions = [ + ["go", "A", "B"], + a_transition + ] + + m = MyMachine(states=["A", "B"], transitions=transitions, initial="A") + m.add_transition("reset", "*", "A", + my_int=23, my_str="foo2", my_none=None, my_dict={"baz": "bar"}) + + async def run(): + assert await m.go() + trans = m.get_transitions("go", "B") # type: List[MyTransition] + assert len(trans) == 1 + assert trans[0].my_str == a_transition["my_str"] + assert trans[0].my_int == a_transition["my_int"] + assert trans[0].my_dict == a_transition["my_dict"] + assert trans[0].my_none is None + trans = m.get_transitions("reset", "A") + assert len(trans) == 1 + assert trans[0].my_str == "foo2" + assert trans[0].my_int == 23 + assert trans[0].my_dict == {"baz": "bar"} + assert trans[0].my_none is None + + asyncio.run(run()) + @skipIf(asyncio is None or (pgv is None and gv is None), "AsyncGraphMachine requires asyncio and (py)gaphviz") class TestAsyncGraphMachine(TestAsync): diff --git a/tests/test_core.py b/tests/test_core.py index 0debdbb6..f41360df 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -4,13 +4,13 @@ pass import sys -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, List from functools import partial from unittest import TestCase, skipIf import weakref from transitions import Machine, MachineError, State, EventData -from transitions.core import listify, _prep_ordered_arg +from transitions.core import listify, _prep_ordered_arg, Transition from .utils import InheritedStuff from .utils import Stuff, DummyModel @@ -23,7 +23,7 @@ if TYPE_CHECKING: from typing import Sequence - from transitions.core import TransitionConfig, StateConfig + from transitions.core import TransitionConfig, StateConfig, TransitionConfigDict def on_exit_A(event): @@ -570,7 +570,7 @@ def test_pickle(self): {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} - ] + ] # type: Sequence[TransitionConfigDict] m = Machine(states=states, transitions=transitions, initial='A') m.walk() dump = pickle.dumps(m) @@ -1350,3 +1350,44 @@ def test_on_final(self): self.assertEqual(1, final_mock.call_count) machine.to_B() self.assertEqual(2, final_mock.call_count) + + def test_custom_transition(self): + + class MyTransition(self.machine_cls.transition_cls): # type: ignore + + def __init__(self, source, dest, conditions=None, unless=None, before=None, + after=None, prepare=None, my_int=None, my_none=None, my_str=None, my_dict=None): + super(MyTransition, self).__init__(source, dest, conditions, unless, before, after, prepare) + self.my_int = my_int + self.my_none = my_none + self.my_str = my_str + self.my_dict = my_dict + + class MyMachine(self.machine_cls): # type: ignore + transition_cls = MyTransition + + a_transition = { + "trigger": "go", "source": "B", "dest": "A", + "my_int": 42, "my_str": "foo", "my_dict": {"bar": "baz"} + } + transitions = [ + ["go", "A", "B"], + a_transition + ] + + m = MyMachine(states=["A", "B"], transitions=transitions, initial="A") + m.add_transition("reset", "*", "A", + my_int=23, my_str="foo2", my_none=None, my_dict={"baz": "bar"}) + assert m.go() + trans = m.get_transitions("go", "B") # type: List[MyTransition] + assert len(trans) == 1 + assert trans[0].my_str == a_transition["my_str"] + assert trans[0].my_int == a_transition["my_int"] + assert trans[0].my_dict == a_transition["my_dict"] + assert trans[0].my_none is None + trans = m.get_transitions("reset", "A") + assert len(trans) == 1 + assert trans[0].my_str == "foo2" + assert trans[0].my_int == 23 + assert trans[0].my_dict == {"baz": "bar"} + assert trans[0].my_none is None diff --git a/tests/test_experimental.py b/tests/test_experimental.py index 804344ba..4366a32c 100644 --- a/tests/test_experimental.py +++ b/tests/test_experimental.py @@ -137,10 +137,8 @@ class Model: def is_B(self) -> bool: return False - transition_config = [["A", "B"], "C"] # type: TransitionConfig - @add_transitions(transition(source="A", dest="B")) - @add_transitions(transition_config) + @add_transitions([["A", "B"], "C"]) def go(self) -> bool: raise RuntimeError("Should be overridden!") @@ -196,8 +194,7 @@ class Model: def is_B(self) -> bool: return False - transition_config = [["A", "B"], "C"] # type: TransitionConfig - go = event(transition(source="A", dest="B"), transition_config) + go = event(transition(source="A", dest="B"), [["A", "B"], "C"], {"source": "*", "dest": None}) model = Model() machine = self.trigger_machine(model, states=["A", "B", "C"], initial="A") diff --git a/tests/test_graphviz.py b/tests/test_graphviz.py index c3ee1e21..54dc95ad 100644 --- a/tests/test_graphviz.py +++ b/tests/test_graphviz.py @@ -20,7 +20,7 @@ if TYPE_CHECKING: from typing import Type, List, Collection, Union, Literal, Sequence, Dict, Optional - from transitions.core import TransitionConfig + from transitions.core import TransitionConfig, TransitionConfigDict class TestDiagramsImport(TestCase): @@ -75,7 +75,7 @@ def setUp(self): {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D', 'conditions': 'is_fast'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'B'} - ] # type: Sequence[Dict[str, str]] + ] # type: Sequence[TransitionConfigDict] def test_diagram(self): m = self.machine_cls(states=self.states, transitions=self.transitions, initial='A', auto_transitions=False, @@ -327,7 +327,7 @@ def setUp(self): 'conditions': 'is_fast'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'B'}, # + 1 edge {'trigger': 'reset', 'source': '*', 'dest': 'A'} # + 4 edges (from base state) = 8 - ] # type: Sequence[Dict[str, str]] + ] # type: Sequence[TransitionConfigDict] def test_diagram(self): m = self.machine_cls(states=self.states, transitions=self.transitions, initial='A', auto_transitions=False, diff --git a/tests/test_reuse.py b/tests/test_reuse.py index 6387cd86..1930a428 100644 --- a/tests/test_reuse.py +++ b/tests/test_reuse.py @@ -20,8 +20,7 @@ if TYPE_CHECKING: from typing import List, Union, Dict, Any, Sequence - from transitions.core import TransitionConfig - + from transitions.core import TransitionConfig, TransitionConfigDict test_states = ['A', 'B', {'name': 'C', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b', 'c']}]}, 'D', 'E', 'F'] @@ -91,7 +90,7 @@ def test_blueprint_reuse(self): {'trigger': 'decrease', 'source': '3', 'dest': '2'}, {'trigger': 'decrease', 'source': '1', 'dest': '1'}, {'trigger': 'reset', 'source': '*', 'dest': '1'}, - ] + ] # type: Sequence[TransitionConfigDict] counter = self.machine_cls(states=states, transitions=transitions, before_state_change='check', after_state_change='clear', initial='1') @@ -103,7 +102,7 @@ def test_blueprint_reuse(self): {'trigger': 'backward', 'source': 'C', 'dest': 'B'}, {'trigger': 'backward', 'source': 'B', 'dest': 'A'}, {'trigger': 'calc', 'source': '*', 'dest': 'C'}, - ] + ] # type: Sequence[TransitionConfigDict] walker = self.machine_cls(states=new_states, transitions=new_transitions, before_state_change='watch', after_state_change='look_back', initial='A') @@ -144,7 +143,7 @@ def test_blueprint_remap(self): {'trigger': 'decrease', 'source': '1', 'dest': '1'}, {'trigger': 'reset', 'source': '*', 'dest': '1'}, {'trigger': 'done', 'source': '3', 'dest': 'finished'} - ] + ] # type: Sequence[TransitionConfigDict] counter = self.machine_cls(states=states, transitions=transitions, initial='1') @@ -158,7 +157,7 @@ def test_blueprint_remap(self): {'trigger': 'backward', 'source': 'C', 'dest': 'B'}, {'trigger': 'backward', 'source': 'B', 'dest': 'A'}, {'trigger': 'calc', 'source': '*', 'dest': 'C%s1' % State.separator}, - ] + ] # type: Sequence[TransitionConfigDict] walker = self.machine_cls(states=new_states, transitions=new_transitions, before_state_change='watch', after_state_change='look_back', initial='A') diff --git a/tests/utils.py b/tests/utils.py index afee2d46..afc3417b 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -6,7 +6,8 @@ class Stuff(object): is_false = False is_True = True - def __init__(self, states=None, machine_cls=Machine, extra_kwargs={}): + def __init__(self, states=None, machine_cls=Machine, extra_kwargs=None): + extra_kwargs = extra_kwargs if extra_kwargs is not None else {} self.state = None self.message = None diff --git a/transitions/core.pyi b/transitions/core.pyi index c5204d2d..0623760a 100644 --- a/transitions/core.pyi +++ b/transitions/core.pyi @@ -1,7 +1,7 @@ from logging import Logger from typing import ( Any, Optional, Callable, Sequence, Union, Iterable, List, Dict, DefaultDict, - Type, Deque, OrderedDict, Tuple, Literal, Collection, TypedDict, Mapping + Type, Deque, OrderedDict, Tuple, Literal, Collection, TypedDict, Mapping, Required ) # Enums are supported for Python 3.4+ and Python 2.7 with enum34 package installed @@ -91,8 +91,19 @@ TransitionConfigList = Union[ List[str], List[Sequence[str]], List[Optional[str]], List[Union[str, Enum]], List[Optional[Union[str, Enum]]] ] -TransitionConfigDict = Mapping[str, Union[None, StateConfig, Callback, Iterable[Callback]]] -TransitionConfig = Union[TransitionConfigList, TransitionConfigDict] + +class TransitionConfigDict(TypedDict, total=False): + trigger: Required[str] + source: Required[Union[str, Enum, Sequence[Union[str, Enum]]]] + dest: Required[Optional[Union[str, Enum]]] + prepare: CallbacksArg + before: CallbacksArg + after: CallbacksArg + conditions: CallbacksArg + unless: CallbacksArg + +# For backwards compatibility we also accept untyped dictionaries/mappings +TransitionConfig = Union[TransitionConfigList, TransitionConfigDict, Mapping[str, Any]] class EventData: state: State @@ -115,7 +126,7 @@ class Event: transitions: DefaultDict[str, List[Transition]] def __init__(self, name: str, machine: Machine) -> None: ... def add_transition(self, transition: Transition) -> None: ... - def trigger(self, model: object, *args: List[Any], **kwargs: Dict[str, Any]) -> bool: ... + def trigger(self, model: object, *args: Any, **kwargs: Any) -> bool: ... def _trigger(self, event_data: EventData) -> bool: ... def _process(self, event_data: EventData) -> bool: ... def _is_valid_source(self, state: State) -> bool: ... @@ -157,7 +168,7 @@ class Machine: name: str = ..., queued: bool = ..., prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., model_attribute: str = ..., model_override: bool = ..., - on_exception: CallbacksArg = ..., on_final: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... + on_exception: CallbacksArg = ..., on_final: CallbacksArg = ..., **kwargs: Any) -> None: ... def add_model(self, model: ModelParameter, initial: Optional[StateIdentifier] = ...) -> None: ... def remove_model(self, model: ModelParameter) -> None: ... @@ -201,21 +212,21 @@ class Machine: def set_state(self, state: StateIdentifier, model: Optional[object] = ...) -> None: ... def add_state(self, states: Union[Sequence[StateConfig], StateConfig], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., - ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... + ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Any) -> None: ... def add_states(self, states: Union[Sequence[StateConfig], StateConfig], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., - ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... + ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Any) -> None: ... def _add_model_to_state(self, state: State, model: object) -> None: ... def _checked_assignment(self, model: object, name: str, func: CallbackFunc) -> None: ... def _add_trigger_to_model(self, trigger: str, model: object) -> None: ... - def _get_trigger(self, model: object, trigger_name: str, *args: List[Any], **kwargs: Dict[str, Any]) -> bool: ... + def _get_trigger(self, model: object, trigger_name: str, *args: Any, **kwargs: Any) -> bool: ... def get_triggers(self, *args: Union[str, Enum, State]) -> List[str]: ... def add_transition(self, trigger: str, source: Union[StateIdentifier, List[StateIdentifier]], dest: Optional[StateIdentifier] = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., prepare: CallbacksArg = ..., - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... def add_transitions(self, transitions: Sequence[TransitionConfig]) -> None: ... def add_ordered_transitions(self, states: Optional[Sequence[Union[str, State]]] = ..., trigger: str = ..., loop: bool = ..., @@ -225,11 +236,11 @@ class Machine: before: Optional[Sequence[Union[Callback, None]]] = ..., after: Optional[Sequence[Union[Callback, None]]] = ..., prepare: CallbacksArg = ..., - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... def get_transitions(self, trigger: str = ..., source: StateIdentifier = ..., dest: StateIdentifier = ...) -> List[Transition]: ... def remove_transition(self, trigger: str, source: str = ..., dest: str = ...) -> None: ... - def dispatch(self, trigger: str, *args: List[Any], **kwargs: Dict[str, Any]) -> bool: ... + def dispatch(self, trigger: str, *args: Any, **kwargs: Any) -> bool: ... def callbacks(self, funcs: Iterable[Callback], event_data: EventData) -> None: ... def callback(self, func: Callback, event_data: EventData) -> None: ... @staticmethod diff --git a/transitions/experimental/utils.py b/transitions/experimental/utils.py index 23455640..b6767439 100644 --- a/transitions/experimental/utils.py +++ b/transitions/experimental/utils.py @@ -66,7 +66,7 @@ def generate_base_model(config): f" def may_{trigger_name}(self) -> bool: {_placeholder_body}\n" ) - extra_params = "event_data: EventData" if m.send_event else "*args: List[Any], **kwargs: Dict[str, Any]" + extra_params = "event_data: EventData" if m.send_event else "*args: Any, **kwargs: Any" for callback_name in callbacks: if isinstance(callback_name, str): callback_block += (f" @abstractmethod\n" @@ -98,7 +98,7 @@ def add_model_override(self, model, initial=None): self.model_override = True for model in listify(model): model = self if model == "self" else model - for name, specs in TriggerPlaceholder.definitions.get(model.__class__).items(): + for name, specs in TriggerPlaceholder.definitions.get(model.__class__, {}).items(): for spec in specs: if isinstance(spec, list): self.add_transition(name, *spec) diff --git a/transitions/experimental/utils.pyi b/transitions/experimental/utils.pyi index 4258a19f..f8fbb48f 100644 --- a/transitions/experimental/utils.pyi +++ b/transitions/experimental/utils.pyi @@ -1,28 +1,43 @@ -from typing import Union, Callable, List, Optional, Iterable, Type, ClassVar, Tuple, Dict, Any, DefaultDict, Deque, \ - Sequence -from transitions.core import StateIdentifier, CallbacksArg, CallbackFunc, Machine, TransitionConfig, MachineConfig +from typing import Union, Callable, List, Optional, Iterable, Type, ClassVar, Any, DefaultDict, Deque, \ + Sequence, TypedDict, Required + +from enum import Enum +from transitions.core import StateIdentifier, CallbacksArg, CallbackFunc, Machine, MachineConfig, \ + TransitionConfigList +from transitions.extensions.asyncio import AsyncCallbacksArg from transitions.extensions.markup import MarkupConfig _placeholder_body: str +class TransitionConfigDictWithoutTrigger(TypedDict, total=False): + source: Required[Union[str, Enum, Sequence[Union[str, Enum]]]] + dest: Required[Optional[Union[str, Enum]]] + prepare: Union[CallbacksArg, AsyncCallbacksArg] + before: Union[CallbacksArg, AsyncCallbacksArg] + after: Union[CallbacksArg, AsyncCallbacksArg] + conditions: Union[CallbacksArg, AsyncCallbacksArg] + unless: Union[CallbacksArg, AsyncCallbacksArg] + +TransitionConfigWithoutTrigger = Union[TransitionConfigList, TransitionConfigDictWithoutTrigger] + def generate_base_model(config: Union[MachineConfig, MarkupConfig]) -> str: ... def with_model_definitions(cls: Type[Machine]) -> Type[Machine]: ... -def add_transitions(*configs: Union[TransitionConfig, Sequence[TransitionConfig]]) -> Callable[[CallbackFunc], CallbackFunc]: ... -def event(*configs: TransitionConfig) -> Callable[..., Optional[bool]]: ... +def add_transitions(*configs: TransitionConfigWithoutTrigger) -> Callable[[CallbackFunc], CallbackFunc]: ... +def event(*configs: TransitionConfigWithoutTrigger) -> Callable[..., Optional[bool]]: ... def transition(source: Union[StateIdentifier, List[StateIdentifier]], dest: Optional[StateIdentifier] = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., - prepare: CallbacksArg = ...) -> TransitionConfig: ... + prepare: CallbacksArg = ...) -> TransitionConfigWithoutTrigger: ... class TriggerPlaceholder: - definitions: ClassVar[DefaultDict[type, DefaultDict[str, List[TransitionConfig]]]] - configs: Deque[TransitionConfig] - def __init__(self, configs: Iterable[TransitionConfig]) -> None: ... + definitions: ClassVar[DefaultDict[type, DefaultDict[str, List[TransitionConfigWithoutTrigger]]]] + configs: Deque[TransitionConfigWithoutTrigger] + def __init__(self, configs: Iterable[TransitionConfigWithoutTrigger]) -> None: ... def __set_name__(self, owner: type, name: str) -> None: ... - def __call__(self, *args: Tuple[Any], **kwargs: Dict[str, Any]) -> Optional[bool]: ... + def __call__(self, *args: Any, **kwargs: Any) -> Optional[bool]: ... diff --git a/transitions/extensions/asyncio.pyi b/transitions/extensions/asyncio.pyi index 0d00df1a..9d35064d 100644 --- a/transitions/extensions/asyncio.pyi +++ b/transitions/extensions/asyncio.pyi @@ -3,7 +3,7 @@ from ..core import Callback, Condition, Event, EventData, Machine, State, Transi from .nesting import HierarchicalMachine, NestedEvent, NestedState, NestedTransition, NestedEventData, \ NestedStateConfig, NestedStateIdentifier from typing import Any, Awaitable, Optional, List, Type, Dict, Deque, Callable, Union, Iterable, DefaultDict, Literal, \ - Sequence, Coroutine, Mapping + Sequence, Coroutine, Mapping, Required, TypedDict from asyncio import Task from logging import Logger from enum import Enum @@ -16,8 +16,19 @@ _LOGGER: Logger AsyncCallbackFunc = Callable[..., Coroutine[Any, Any, Optional[bool]]] AsyncCallback = Union[str, AsyncCallbackFunc] AsyncCallbacksArg = Optional[Union[Callback, Iterable[Callback], AsyncCallback, Iterable[AsyncCallback]]] -AsyncTransitionConfigDict = Mapping[str, Union[None, StateConfig, Union[AsyncCallback, Callback], Iterable[Union[AsyncCallback, Callback]]]] -AsyncTransitionConfig = Union[TransitionConfigList, AsyncTransitionConfigDict] + +class AsyncTransitionConfigDict(TypedDict, total=False): + trigger: Required[str] + source: Required[Union[str, Enum, Sequence[Union[str, Enum]]]] + dest: Required[Optional[Union[str, Enum]]] + prepare: AsyncCallbacksArg + before: AsyncCallbacksArg + after: AsyncCallbacksArg + conditions: AsyncCallbacksArg + unless: AsyncCallbacksArg + +# For backwards compatibility we also accept untyped dictionaries/mappings +AsyncTransitionConfig = Union[TransitionConfigList, AsyncTransitionConfigDict, Mapping[str, Any]] class AsyncState(State): async def enter(self, event_data: AsyncEventData) -> None: ... # type: ignore[override] @@ -55,7 +66,7 @@ class AsyncEvent(Event): machine: AsyncMachine transitions: DefaultDict[str, List[AsyncTransition]] # type: ignore - async def trigger(self, model: object, *args: List[Any], **kwargs: Dict[str, Any]) -> bool: ... # type: ignore[override] + async def trigger(self, model: object, *args: Any, **kwargs: Any) -> bool: ... # type: ignore[override] async def _trigger(self, event_data: AsyncEventData) -> bool: ... # type: ignore[override] async def _process(self, event_data: AsyncEventData) -> bool: ... # type: ignore[override] @@ -86,7 +97,7 @@ class AsyncMachine(Machine): name: str = ..., queued: Union[bool, Literal["model"]] = ..., prepare_event: AsyncCallbacksArg = ..., finalize_event: AsyncCallbacksArg = ..., model_attribute: str = ..., model_override: bool= ..., on_exception: AsyncCallbacksArg = ..., - on_final: AsyncCallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... + on_final: AsyncCallbacksArg = ..., **kwargs: Any) -> None: ... def add_model(self, model: Union[Union[Literal["self"], object], Sequence[Union[Literal["self"], object]]], initial: Optional[StateIdentifier] = ...) -> None: ... def add_transition(self, trigger: str, @@ -94,13 +105,13 @@ class AsyncMachine(Machine): dest: Optional[StateIdentifier] = ..., conditions: AsyncCallbacksArg = ..., unless: AsyncCallbacksArg = ..., before: AsyncCallbacksArg = ..., after: AsyncCallbacksArg = ..., prepare: AsyncCallbacksArg = ..., - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... def add_transitions(self, transitions: Sequence[AsyncTransitionConfig] = ...) -> None: ... - async def dispatch(self, trigger: str, *args: List[Any], **kwargs: Dict[str, Any]) -> bool: ... # type: ignore[override] + async def dispatch(self, trigger: str, *args: Any, **kwargs: Any) -> bool: ... # type: ignore[override] async def callbacks(self, funcs: Iterable[Callback], event_data: AsyncEventData) -> None: ... # type: ignore[override] async def callback(self, func: AsyncCallback, event_data: AsyncEventData) -> None: ... # type: ignore[override] @staticmethod - async def await_all(callables: List[AsyncCallbackFunc]) -> List[Any]: ... + async def await_all(callables: List[AsyncCallbackFunc]) -> List[Optional[bool]]: ... async def switch_model_context(self, model: object) -> None: ... def get_state(self, state: Union[str, Enum]) -> AsyncState: ... async def process_context(self, func: Callable[[], Awaitable[None]], model: object) -> bool: ... @@ -121,9 +132,9 @@ class HierarchicalAsyncMachine(HierarchicalMachine, AsyncMachine): # type: igno before_state_change: AsyncCallbacksArg = ..., after_state_change: AsyncCallbacksArg = ..., name: str = ..., queued: Union[bool, str] = ..., prepare_event: AsyncCallbacksArg = ..., finalize_event: AsyncCallbacksArg = ..., - model_attribute: str = ..., on_exception: AsyncCallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... + model_attribute: str = ..., on_exception: AsyncCallbacksArg = ..., **kwargs: Any) -> None: ... async def trigger_event(self, model: object, trigger: str, # type: ignore[override] - *args: List[Any], **kwargs: Dict[str, Any]) -> bool: ... + *args: Any, **kwargs: Any) -> bool: ... async def _trigger_event(self, event_data: NestedAsyncEventData, trigger: str) -> bool: ... # type: ignore[override] def get_state(self, state: Union[str, Enum, List[str]], hint: Optional[List[str]] = ...) -> NestedAsyncState: ... @@ -134,7 +145,7 @@ class AsyncTimeout(AsyncState): timeout: float _on_timeout: AsyncCallbacksArg runner: Dict[int, Task[Any]] - def __init__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> None: ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... async def enter(self, event_data: AsyncEventData) -> None: ... # type: ignore[override] async def exit(self, event_data: AsyncEventData) -> None: ... # type: ignore[override] def create_timer(self, event_data: AsyncEventData) -> Task[Any]: ... diff --git a/transitions/extensions/diagrams.pyi b/transitions/extensions/diagrams.pyi index a8c2686f..8935be52 100644 --- a/transitions/extensions/diagrams.pyi +++ b/transitions/extensions/diagrams.pyi @@ -17,7 +17,7 @@ GraphvizParameters = Dict[str, Union[str, Dict[str, Any]]] class TransitionGraphSupport(Transition): label: str - def __init__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> None: ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... def _change_state(self, event_data: EventData) -> None: ... @@ -48,7 +48,7 @@ class GraphMachine(MarkupMachine): title: str = ..., show_conditions: bool = ..., show_state_attributes: bool = ..., show_auto_transitions: bool = ..., use_pygraphviz: bool = ..., graph_engine: Union[Literal["pygraphviz"], Literal["graphviz"], Literal["mermaid"]] = ..., - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... def _init_graphviz_engine(self, graph_engine: str) -> Type[BaseGraph]: ... def _get_graph(self, model: GraphModelProtocol, title: Optional[str] = ..., force_new: bool = ..., show_roi: bool = ...) -> GraphProtocol: ... @@ -58,13 +58,13 @@ class GraphMachine(MarkupMachine): initial: Optional[StateIdentifier] = ...) -> None: ... def add_states(self, states: Union[Sequence[StateConfig], StateConfig], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., - ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... + ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Any) -> None: ... def add_transition(self, trigger: str, source: Union[StateIdentifier, List[StateIdentifier]], dest: Optional[StateIdentifier] = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., prepare: CallbacksArg = ..., - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... class NestedGraphTransition(TransitionGraphSupport, NestedTransition): ... diff --git a/transitions/extensions/diagrams_graphviz.pyi b/transitions/extensions/diagrams_graphviz.pyi index 1cf513ff..1f26adf0 100644 --- a/transitions/extensions/diagrams_graphviz.pyi +++ b/transitions/extensions/diagrams_graphviz.pyi @@ -33,7 +33,7 @@ class Graph(BaseGraph): class NestedGraph(Graph): _cluster_states: List[str] - def __init__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> None: ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... def set_previous_transition(self, src: str, dst: str) -> None: ... def _add_nodes(self, states: List[Dict[str, str]], # type: ignore[no-any-unimported] container: Union[Digraph, SubgraphContext]) -> None: ... diff --git a/transitions/extensions/diagrams_mermaid.pyi b/transitions/extensions/diagrams_mermaid.pyi index 1107eaa7..f6e785ec 100644 --- a/transitions/extensions/diagrams_mermaid.pyi +++ b/transitions/extensions/diagrams_mermaid.pyi @@ -22,7 +22,7 @@ class Graph(BaseGraph): class NestedGraph(Graph): _cluster_states: List[str] - def __init__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> None: ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... def set_previous_transition(self, src: str, dst: str) -> None: ... def _add_nodes(self, states: List[Dict[str, str]], container: List[str]) -> None: ... diff --git a/transitions/extensions/diagrams_pygraphviz.pyi b/transitions/extensions/diagrams_pygraphviz.pyi index 2a82a657..697ac3ea 100644 --- a/transitions/extensions/diagrams_pygraphviz.pyi +++ b/transitions/extensions/diagrams_pygraphviz.pyi @@ -30,7 +30,7 @@ class Graph(BaseGraph): class NestedGraph(Graph): seen_transitions: Any - def __init__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> None: ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... def _add_nodes(self, # type: ignore[override, no-any-unimported] states: List[Dict[str, Union[str, List[Dict[str, str]]]]], container: AGraph, prefix: str = ..., default_style: str = ...) -> None: ... diff --git a/transitions/extensions/locking.pyi b/transitions/extensions/locking.pyi index 6285a70b..686ee183 100644 --- a/transitions/extensions/locking.pyi +++ b/transitions/extensions/locking.pyi @@ -30,7 +30,7 @@ class IdentManager(LockContext): class LockedEvent(Event): machine: LockedMachine - def trigger(self, model: object, *args: List[Any], **kwargs: Dict[str, Any]) -> bool: ... + def trigger(self, model: object, *args: Any, **kwargs: Any) -> bool: ... class LockedMachine(Machine): @@ -49,7 +49,7 @@ class LockedMachine(Machine): prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., model_attribute: str = ..., model_override: bool = ..., on_exception: CallbacksArg = ..., on_final: CallbacksArg = ..., machine_context: Optional[Union[List[LockContext], LockContext]] = ..., - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... def __getstate__(self) -> Dict[str, Any]: ... def __setstate__(self, state: Dict[str, Any]) -> None: ... def add_model(self, model: Union[Union[Literal['self'], object], List[Union[Literal['self'], object]]], @@ -61,4 +61,4 @@ class LockedMachine(Machine): def __getattr__(self, item: str) -> Any: ... def _add_model_to_state(self, state: State, model: object) -> None: ... def _get_qualified_state_name(self, state: State) -> str: ... - def _locked_method(self, func: Callable[..., Any], *args: List[Any], **kwargs: Dict[str, Any]) -> Any: ... + def _locked_method(self, func: Callable[..., Any], *args: Any, **kwargs: Any) -> Any: ... diff --git a/transitions/extensions/markup.pyi b/transitions/extensions/markup.pyi index dd9b19ef..3f2a4533 100644 --- a/transitions/extensions/markup.pyi +++ b/transitions/extensions/markup.pyi @@ -41,7 +41,7 @@ class MarkupMachine(Machine): prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., model_attribute: str = ..., model_override: bool = ..., on_exception: CallbacksArg = ..., markup: Optional[MarkupConfig] = ..., auto_transitions_markup: bool = ..., - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... @property def auto_transitions_markup(self) -> bool: ... @auto_transitions_markup.setter @@ -54,11 +54,11 @@ class MarkupMachine(Machine): dest: Optional[StateIdentifier] = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., prepare: CallbacksArg = ..., - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... def remove_transition(self, trigger: str, source: str = ..., dest: str = ...) -> None: ... def add_states(self, states: Union[Sequence[StateConfig], StateConfig], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., - ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... + ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Any) -> None: ... @staticmethod def format_references(func: CallbackFunc) -> str: ... def _convert_states_and_transitions(self, root: MarkupConfig) -> None: ... diff --git a/transitions/extensions/nesting.pyi b/transitions/extensions/nesting.pyi index b01e3668..f1684843 100644 --- a/transitions/extensions/nesting.pyi +++ b/transitions/extensions/nesting.pyi @@ -12,7 +12,7 @@ class FunctionWrapper: _func: Optional[CallbackFunc] def __init__(self, func: CallbackFunc, path: List[str]) -> None: ... def add(self, func: CallbackFunc, path: List[str]) -> None: ... - def __call__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> Any: ... + def __call__(self, *args: Any, **kwargs: Any) -> Any: ... class NestedEvent(Event): @@ -86,7 +86,7 @@ class HierarchicalMachine(Machine): before_state_change: CallbacksArg = ..., after_state_change: CallbacksArg = ..., name: str = ..., queued: Union[bool, str] = ..., prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., - model_attribute: str = ..., on_exception: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... + model_attribute: str = ..., on_exception: CallbacksArg = ..., **kwargs: Any) -> None: ... _next_scope: Optional[ScopeTuple] def __call__(self, to_scope: Optional[Union[ScopeTuple, str, Enum]] = ...) -> HierarchicalMachine: ... def __enter__(self) -> None: ... @@ -100,16 +100,16 @@ class HierarchicalMachine(Machine): def add_ordered_transitions(self, states: Optional[Sequence[NestedState]] = ..., trigger: str = ..., loop: bool = ..., # type: ignore[override] loop_includes_initial: bool = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., - prepare: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... + prepare: CallbacksArg = ..., **kwargs: Any) -> None: ... def add_states(self, states: Union[List[NestedStateConfig], NestedStateConfig], # type: ignore[override] on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., - ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... + ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Any) -> None: ... def add_transition(self, trigger: str, # type: ignore[override] source: Union[NestedStateIdentifier, List[NestedStateIdentifier]], dest: Optional[NestedStateIdentifier] = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., - prepare: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... + prepare: CallbacksArg = ..., **kwargs: Any) -> None: ... def get_global_name(self, state: NestedStateIdentifier = ..., join: bool = ...) -> Union[str, List[str]]: ... def get_nested_state_names(self) -> List[str]: ... def get_nested_transitions(self, trigger: str = ..., src_path: Optional[List[str]] = ..., @@ -126,30 +126,30 @@ class HierarchicalMachine(Machine): def on_exit(self, state_name: str, callback: Callback) -> None: ... def set_state(self, state: Union[NestedStateIdentifier, List[NestedStateIdentifier]], # type: ignore[override] model: Optional[object] = ...) -> None: ... - def to_state(self, model: object, state_name: str, *args: List[Any], **kwargs: Dict[str, Any]) -> None: ... - def trigger_event(self, model: object, trigger: str, *args: List[Any], **kwargs: Dict[str, Any]) -> bool: ... + def to_state(self, model: object, state_name: str, *args: Any, **kwargs: Any) -> None: ... + def trigger_event(self, model: object, trigger: str, *args:Any, **kwargs: Any) -> bool: ... def _add_model_to_state(self, state: NestedState, model: object) -> None: ... # type: ignore[override] def _add_dict_state(self, state: Dict[str, Any], ignore_invalid_triggers: bool, remap: Optional[Dict[str, str]], - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... def _add_enum_state(self, state: Enum, on_enter: CallbacksArg, on_exit: CallbacksArg, ignore_invalid_triggers: bool, - remap: Optional[Dict[str, str]], **kwargs: Dict[str, Any]) -> None: ... + remap: Optional[Dict[str, str]], **kwargs: Any) -> None: ... def _add_machine_states(self, state: HierarchicalMachine, remap: Optional[Dict[str, str]]) -> None: ... def _add_string_state(self, state: str, on_enter: CallbacksArg, on_exit: CallbacksArg, ignore_invalid_triggers: bool, remap: Optional[Dict[str, str]], - **kwargs: Dict[str, Any]) -> None: ... + **kwargs: Any) -> None: ... def _add_trigger_to_model(self, trigger: str, model: object) -> None: ... def build_state_tree(self, model_states: Union[str, Enum, Sequence[Union[str, Enum, Sequence[Any]]]], separator: str, tree: Optional[StateTree] = ...) -> StateTree: ... @classmethod - def _create_transition(cls, *args: List[Any], **kwargs: Dict[str, Any]) -> NestedTransition: ... + def _create_transition(cls, *args: Any, **kwargs: Any) -> NestedTransition: ... @classmethod - def _create_event(cls, *args: List[Any], **kwargs: Dict[str, Any]) -> NestedEvent: ... + def _create_event(cls, *args: Any, **kwargs: Any) -> NestedEvent: ... @classmethod - def _create_state(cls, *args: List[Any], **kwargs: Dict[str, Any]) -> NestedState: ... + def _create_state(cls, *args: Any, **kwargs: Any) -> NestedState: ... def _get_enum_path(self, enum_state: Enum, prefix: Optional[List[str]] =...) -> List[str]: ... def _get_state_path(self, state: NestedState, prefix: Optional[List[str]] = ...) -> List[str]: ... def _check_event_result(self, res: bool, model: object, trigger: str) -> bool: ... - def _get_trigger(self, model: object, trigger_name: str, *args: List[Any], **kwargs: Dict[str, Any]) -> bool: ... + def _get_trigger(self, model: object, trigger_name: str, *args: Any, **kwargs: Any) -> bool: ... def _has_state(self, state: NestedState, raise_error: bool = ...) -> bool: ... # type: ignore[override] def _init_state(self, state: NestedState) -> None: ... def _recursive_initial(self, value: NestedStateIdentifier) -> Union[str, List[str]]: ... diff --git a/transitions/extensions/states.pyi b/transitions/extensions/states.pyi index 882204a2..4f37edf2 100644 --- a/transitions/extensions/states.pyi +++ b/transitions/extensions/states.pyi @@ -19,7 +19,7 @@ class Timeout(State): timeout: float _on_timeout: Optional[List[Callback]] runner: Dict[int, Timer] - def __init__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> None: ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... def enter(self, event_data: EventData) -> None: ... def exit(self, event_data: EventData) -> None: ... def _process_timeout(self, event_data: EventData) -> None: ... @@ -32,7 +32,7 @@ class Volatile(State): volatile_cls: Any volatile_hook: str initialized: bool - def __init__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> None: ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... def enter(self, event_data: EventData) -> None: ... def exit(self, event_data: EventData) -> None: ...