pyTransitions Nested State "may_" have a bug?

28 Views Asked by At

I have a pyTransition statemachine (package here) like below, it runs the 3 months in qtr1 parallelly, then when qtr 1 completed, it runs the 3 months in qtr2 parallelly. When any month fail, it will transition to workflow_failed:

{
            'states': [
                'workflow_started',
                {
                    'name': 'running_qtr_1',
                    'parallel': [
                        {
                            'name': 'running_jan',
                            'children': [
                                'jan_started', 'jan_succeeded', 'jan_failed'
                            ],
                            'initial': 'jan_started',
                            'transitions': [
                                ['end_success_jan', 'jan_started', 'jan_succeeded'],
                                ['end_failure_jan', 'jan_started', 'jan_failed']
                            ]
                        },
                        {
                            'name': 'running_feb',
                            'children': [
                                'feb_started', 'feb_succeeded', 'feb_failed'
                            ],
                            'initial': 'feb_started',
                            'transitions': [
                                ['end_success_feb', 'feb_started', 'feb_succeeded'],
                                ['end_failure_feb', 'feb_started', 'feb_failed']
                            ]
                        },
                        {
                            'name': 'running_mar',
                            'children': [
                                'mar_started', 'mar_succeeded', 'mar_failed'
                            ],
                            'initial': 'mar_started',
                            'transitions': [
                                ['end_success_mar', 'mar_started', 'mar_succeeded'],
                                ['end_failure_mar', 'mar_started', 'mar_failed']
                            ]
                        },
                    ]
                },
                'completed_qtr_1',
                {
                    'name': 'running_qtr_2',
                    'parallel': [
                        {
                            'name': 'running_apr',
                            'children': [
                                'apr_started', 'apr_succeeded', 'apr_failed'
                            ],
                            'initial': 'apr_started',
                            'transitions': [
                                ['end_success_apr', 'apr_started', 'apr_succeeded'],
                                ['end_failure_apr', 'apr_started', 'apr_failed']
                            ]
                        },
                        {
                            'name': 'running_may',
                            'children': [
                                'may_started', 'may_succeeded', 'may_failed'
                            ],
                            'initial': 'may_started',
                            'transitions': [
                                ['end_success_may', 'may_started', 'may_succeeded'],
                                ['end_failure_may', 'may_started', 'may_failed']
                            ]
                        },
                        {
                            'name': 'running_jun',
                            'children': [
                                'jun_started', 'jun_succeeded', 'jun_failed'
                            ],
                            'initial': 'jun_started',
                            'transitions': [
                                ['end_success_jun', 'jun_started', 'jun_succeeded'],
                                ['end_failure_jun', 'jun_started', 'jun_failed']
                            ]
                        },
                    ],
                },
                'completed_qtr_2',
                'workflow_succeeded', 'workflow_failed'
            ],
            'transitions': [
                {'trigger': 'next', 'source': 'workflow_started', 'dest': 'running_qtr_1'},
                {'trigger': 'next', 'source': 'running_qtr_1~running_jan~jan_succeeded', 'dest': 'completed_qtr_1', 'conditions': 'qtr1_completed'},
                {'trigger': 'next', 'source': 'running_qtr_1~running_feb~feb_succeeded', 'dest': 'completed_qtr_1', 'conditions': 'qtr1_completed'},
                {'trigger': 'next', 'source': 'running_qtr_1~running_mar~mar_succeeded', 'dest': 'completed_qtr_1', 'conditions': 'qtr1_completed'},
                {'trigger': 'next', 'source': 'completed_qtr_1', 'dest': 'running_qtr_2'},
                {'trigger': 'next', 'source': 'running_qtr_2~running_apr~apr_succeeded', 'dest': 'completed_qtr_2', 'conditions': 'qtr2_completed'},
                {'trigger': 'next', 'source': 'running_qtr_2~running_may~may_succeeded', 'dest': 'completed_qtr_2', 'conditions': 'qtr2_completed'},
                {'trigger': 'next', 'source': 'running_qtr_2~running_jun~jun_succeeded', 'dest': 'completed_qtr_2', 'conditions': 'qtr2_completed'},
                {'trigger': 'next', 'source': 'completed_qtr_2', 'dest': 'workflow_succeeded'},
                {'trigger': 'next',
                 'source': [
                     'running_qtr_1~running_jan~jan_failed',
                     'running_qtr_1~running_feb~feb_failed',
                     'running_qtr_1~running_mar~mar_failed',
                     'running_qtr_2~running_apr~apr_failed',
                     'running_qtr_2~running_may~may_failed',
                     'running_qtr_2~running_jun~jun_failed'
                 ],
                 'dest': 'workflow_failed'
                 },
            ],
            'initial_state': 'workflow_started'
        }

My question is, after the statemachine transitioned to jan_succeeded, if I ask if it may trigger 'end_suucess_feb', it says False. But it should NOT be False, since I can really invoke end_success_feb(), see below:

# query if I can trigger 'end_success_feb', statemachine says False
> self.model.may_end_success_feb()
False
# but in fact, I should and am able to trigger 'end_success_feb'
> self.model.end_success_feb()
now at state: feb_succeeded

The point is jan, feb, mar are parallel state, so jan state change should not make feb trigger invalid.

This seems like a bug?

0

There are 0 best solutions below