Skip to content

Commit db1cc95

Browse files
committed
Merge tag 'v2.2.0' into develop
In this release, we conducted a general cleanup and refactoring across various modules to enhance code readability and maintainability. We improved exception handling and reduced code redundancy. As a result, we achieved a **~2.2x** faster setup in our performance tests and significantly simplified the callback machinery.
2 parents 65deb1a + 524df07 commit db1cc95

10 files changed

Lines changed: 17 additions & 15 deletions

File tree

docs/mixins.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ Given a state machine definition:
2525
... "A workflow machine"
2626
... draft = State('Draft', initial=True, value=1)
2727
... producing = State('Being produced', value=2)
28-
... closed = State('Closed', value=3)
29-
... cancelled = State('Cancelled', value=4)
28+
... closed = State('Closed', value=3, final=True)
29+
... cancelled = State('Cancelled', value=4, final=True)
3030
...
3131
... add_job = draft.to.itself() | producing.to.itself()
3232
... produce = draft.to(producing)

docs/processing_model.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Consider this state machine:
3232
>>> class ServerConnection(StateMachine):
3333
... disconnected = State(initial=True)
3434
... connecting = State()
35-
... connected = State()
35+
... connected = State(final=True)
3636
...
3737
... connect = disconnected.to(connecting, after="connection_succeed")
3838
... connection_succeed = connecting.to(connected)

docs/releases/2.2.0.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# StateMachine 2.2.0
22

3-
*Not released yet*
3+
*May 6, 2024*
44

55
## What's new in 2.2.0
66

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "python-statemachine"
3-
version = "2.1.2"
3+
version = "2.2.0"
44
description = "Python Finite State Machines made easy."
55
authors = ["Fernando Macedo <[email protected]>"]
66
maintainers = [

statemachine/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33

44
__author__ = """Fernando Macedo"""
55
__email__ = "[email protected]"
6-
__version__ = "2.1.2"
6+
__version__ = "2.2.0"
77

88
__all__ = ["StateMachine", "State"]

statemachine/factory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def _check_trap_states(cls):
113113
if cls._strict_states:
114114
raise InvalidDefinition(message)
115115
else:
116-
warnings.warn(message, UserWarning, stacklevel=1)
116+
warnings.warn(message, UserWarning, stacklevel=4)
117117

118118
def _check_reachable_final_states(cls):
119119
if not any(s.final for s in cls.states):

statemachine/states.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,23 @@ class States:
1515
Helps creating :ref:`StateMachine`'s :ref:`state` definitions from other
1616
sources, like an ``Enum`` class, using :meth:`States.from_enum`.
1717
18+
>>> states_def = [('open', {'initial': True}), ('closed', {'final': True})]
19+
1820
>>> from statemachine import StateMachine
1921
>>> class SM(StateMachine):
2022
...
2123
... states = States({
22-
... name: State(initial=idx == 0) for idx, name in enumerate(["initial", "final"])
24+
... name: State(**params) for name, params in states_def
2325
... })
2426
...
25-
... finish = states.initial.to(states.final)
27+
... close = states.open.to(states.closed)
2628
2729
And states can be used as usual.
2830
2931
>>> sm = SM()
30-
>>> sm.send("finish")
32+
>>> sm.send("close")
3133
>>> sm.current_state.id
32-
'final'
34+
'closed'
3335
3436
"""
3537

tests/test_callbacks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ def race_uppercase(race):
187187
def test_decorate_unbounded_machine_methods(self):
188188
class MiniHeroJourneyMachine(StateMachine, strict_states=False):
189189
ordinary_world = State(initial=True)
190-
call_to_adventure = State()
191-
refusal_of_call = State()
190+
call_to_adventure = State(final=True)
191+
refusal_of_call = State(final=True)
192192

193193
adventure_called = ordinary_world.to(call_to_adventure)
194194

tests/test_statemachine.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ def test_state_value_is_correct():
383383

384384
class ValueTestModel(StateMachine, strict_states=False):
385385
new = State(STATE_NEW, value=STATE_NEW, initial=True)
386-
draft = State(STATE_DRAFT, value=STATE_DRAFT)
386+
draft = State(STATE_DRAFT, value=STATE_DRAFT, final=True)
387387

388388
write = new.to(draft)
389389

tests/testcases/issue406.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ In this example, the event callback must be registered only once.
1111

1212
>>> class ExampleStateMachine(StateMachine, strict_states=False):
1313
... Created = State(initial=True)
14-
... Inited = State()
14+
... Inited = State(final=True)
1515
...
1616
... initialize = Created.to(Inited)
1717
...

0 commit comments

Comments
 (0)