-
Notifications
You must be signed in to change notification settings - Fork 0
/
order.py
93 lines (78 loc) · 2.97 KB
/
order.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from object import Object
from greenery import *
from greenery.lego import parse
from transitions import Machine
from transitions import *
from transitions.extensions import GraphMachine
class StateMachine(object):
def __init__(self, fsm, states, finals):
self.fsm = fsm
self.events = set()
self.finals = finals
self.machine = Machine(model=self, states=states, initial=states[0])
self.gmachine = GraphMachine(model=self, states=states, initial=states[0])
self.machine.auto_transitions = True
self.machine.send_event = True
for key in fsm.map:
for key2 in fsm.map[key]:
self.machine.add_transition(trigger=key2, source=str(key), dest=str(fsm.map[key][key2]))
self.gmachine.add_transition(trigger=key2, source=str(key), dest=str(fsm.map[key][key2]))
self.events.add(key2)
print(f"trigger={key2}, source={key}, dest={fsm.map[key][key2]}");
#print(f"trigger={type(key2)}, source={type(key)}, dest={type(fsm.map[key][key2])}");
#print(self.machine.states)
def __str__(self):
lines = f'\n{self.machine.states}, {self.fsm.map}\n'
return lines
pass
# TODO do we need it?
def create(self, sm):
pass
def verify(self, call_flow):
i = None
event = Event(None, self.machine)
#print("###",event)
try:
for i in call_flow:
self.trigger(i)
print(i,' ',self.state)
if int(self.state) in self.finals:
print("Accepting state:",self.state)
else:
print(f"failed Order- current state:{self.state} trigger:{i} final:{self.finals}")
self.get_graph().draw('my_state_diagram.png', prog='dot')
#print(FSM.get_model_state())
except Exception as e:
print(e)
print(f"Failed Order- current state:{self.state} trigger:{i} final:{self.finals}")
pass
class Order(object):
def __init__(self, obj, regx_order):
self.Objects = obj
self.regx_order = regx_order
self.FSM = self.__convertToFSM()
def __str__(self):
lines = ''
lines = (f'{self.regx_order}')
lines = lines + self.FSM.__str__()
return lines
def __convertToFSM(self):
fsm = parse(self.regx_order).to_fsm()
states = [str(x) for x in list(fsm.states)]
FSM = StateMachine(fsm, states, fsm.finals)
print(states)
return FSM
def set(self, obj, regx_order):
self.Objects = obj
self.reqx_order = regx_order
self.FSM = None
# TODO order verification with logs
def verify(self, LObj):
call_flow = []
for o in LObj:
for k in self.FSM.events:
if self.Objects[k].getfname() == o.getfname():
call_flow.append(k)
print(call_flow)
self.FSM.verify(call_flow)
pass