示例#1
0
    def __init__(self,
                 left_button=None,
                 left_led=None,
                 right_button=None,
                 right_led=None,
                 track=None,
                 strawberry_factory=None,
                 chocolate_factory=None):

        self.buttons_locked = False
        self.micro_lock = threading.Lock()

        self.pending_cookies = Queue.Queue()

        self.left_button = left_button
        self.left_button.register(self.button_pressed)
        self.left_led = left_led
        self.left_led.off()

        self.right_button = right_button
        self.right_button.register(self.button_pressed)
        self.right_led = right_led
        self.right_led.off()

        self.track = track
        self.strawberry_factory = strawberry_factory
        self.chocolate_factory = chocolate_factory

        self.evolution = Evolution()

        self._fsm = Fysom(initial='waiting',
                          events=[('reproduce', 'waiting', 'waiting')],
                          callbacks=[('on_state_waiting', self._unlock),
                                     ('onreproduce', self._reproduce)])
示例#2
0
    def do_stem(self, word):
        fsm = Fysom(initial='start', events=self.events)
        # FIXME: uncomment below and make sanitize functions support
        # both Python 2 and 3 versions
        # word = WordProcessor.sanitize(word)
        i = len(word) - 1
        j = len(word)

        while (True):
            if i <= 0:
                break
            v = word[i:j]
            # print v
            res = fsm.can(v)
            if (res):
                if v == 'i' and fsm.can(word[i - 1:j]):
                    i = i - 1
                    continue
                fsm.trigger(v)
                if fsm.current == 'h':
                    if word[i - 1:i] == 'i':
                        i = i - 1  # skip i
                        if word[i - 1:i] == 'n':
                            # ning qushimchasi
                            fsm.current = 'start'
                            continue
                elif fsm.current == 'b':
                    fsm.current = 'start'
                j = i

            i = i - 1

        return word[:j]
示例#3
0
    def test_pickling_does_not_work_with_callbacks(self):
        fsm = Fysom({
            'initial':
            'green',
            'events': [{
                'name': 'warn',
                'src': 'green',
                'dst': 'yellow'
            }, {
                'name': 'panic',
                'src': 'yellow',
                'dst': 'red'
            }, {
                'name': 'panic',
                'src': 'green',
                'dst': 'red'
            }, {
                'name': 'calm',
                'src': 'red',
                'dst': 'yellow'
            }, {
                'name': 'clear',
                'src': 'yellow',
                'dst': 'green'
            }],
            'callbacks': {
                'onpanic': lambda: 1,
            }
        })

        self.assertRaises(RuntimeError, dumps, fsm)
 def __init__(self):
     self._states = []
     self._fsm = Fysom({
         'initial':
         'green',
         'events': [{
             'name': 'warn',
             'src': 'green',
             'dst': 'yellow'
         }, {
             'name': 'panic',
             'src': 'yellow',
             'dst': 'red'
         }, {
             'name': 'calm',
             'src': 'red',
             'dst': 'yellow'
         }, {
             'name': 'clear',
             'src': 'yellow',
             'dst': 'green'
         }],
         'callbacks': {
             'ongreen': self._on_green,
             'onyellow': self._on_yellow,
             'onred': self._on_red
         }
     })
示例#5
0
    def __init__(self, debuglevel=0, debugname='Log Service Base'):
        self.debuglevel = debuglevel
        self.debugname = debugname
        self._error_string = ''
        self.on_error_string_changed = []

        # Log
        self._log_channel = Publish(debuglevel=debuglevel)
        self._log_channel.debugname = '%s - %s' % (self.debugname, 'log')
        # more efficient to reuse protobuf messages
        self._log_tx = Container()

        # callbacks
        self.on_state_changed = []

        # fsm
        self._fsm = Fysom(
            {
                'initial': 'down',
                'events': [
                    {'name': 'connect', 'src': 'down', 'dst': 'up'},
                    {'name': 'disconnect', 'src': 'up', 'dst': 'down'},
                ],
            }
        )

        self._fsm.ondown = self._on_fsm_down
        self._fsm.onafterconnect = self._on_fsm_connect
        self._fsm.onup = self._on_fsm_up
        self._fsm.onafterdisconnect = self._on_fsm_disconnect
示例#6
0
    def __init__(self):
        self.electionTimerInterval=randint(6,10) #seconds timeout
        # self.electionTimerInterval=randint(2,5) #seconds timeout
        self.ns = NodeState()
        self.ownAddress = socket.gethostbyname(socket.gethostname())
        self.leaderId = None
        print(self.ownAddress)
        self.serverState = Fysom({'initial': 'follower',
                                  'events': [
                                      ('startElection', 'follower', 'candidate'),
                                      ('discoverLeader', 'candidate', 'follower'),
                                      ('newTerm', 'candidate', 'follower'),
                                      ('startElection', 'candidate', 'candidate'),
                                      ('receivedMajority', 'candidate', 'leader'),
                                      ('discoverServerWithHigherTerm',
                                       'leader', 'follower')
                                  ],
                                  'callbacks': {
                                      'onleader': self.become_leader,
                                      'onstartElection': self.become_candidate,
                                      'onleaveleader': self.stop_being_leader,
                                      'onfollower': self.become_follower
                                  }
                                  })
        self.nodeAddresses = []
        # need to make sure all nodes are started up before populating the node list
        while len(self.nodeAddresses) < self.nodesInCluster:
            self.update_node_list()
            time.sleep(1)
        print(self.nodeAddresses)

        self.otherNodeAddresses = [
            a for a in self.nodeAddresses if a != str(self.ownAddress)]
        print(self.otherNodeAddresses)
 def test_it_should_indicate_whether_fsm_in_finished_state(self):
     fsm = Fysom({
         'initial':
         'green',
         'final':
         'red',
         'events': [{
             'name': 'warn',
             'src': 'green',
             'dst': 'yellow'
         }, {
             'name': 'panic',
             'src': 'yellow',
             'dst': 'red'
         }, {
             'name': 'calm',
             'src': 'red',
             'dst': 'yellow'
         }, {
             'name': 'clear',
             'src': 'yellow',
             'dst': 'green'
         }]
     })
     self.assertFalse(fsm.is_finished())
     fsm.warn()
     self.assertFalse(fsm.is_finished())
     fsm.panic()
     self.assertTrue(fsm.is_finished())
示例#8
0
 def __init__(self, cfg):
     from fysom import Fysom
     events = set([event['name'] for event in cfg['events']])
     cfg['callbacks'] = self.collect_event_listeners(
         events, cfg['callbacks'])
     self.fsm = Fysom(cfg)
     self.attach_proxy_methods(self.fsm, events)
示例#9
0
def create_voting_fsm(tracking_id,
                      vote,
                      broadcast_vote,
                      spawn_yadtshell,
                      fold,
                      cleanup_fsm):
    fsm = Fysom({
        'initial': 'negotiating',
        'events': [
            {'name': 'call', 'src': 'negotiating', 'dst': 'negotiating'},
            {'name': 'fold', 'src': 'negotiating', 'dst': 'finish'},
            {'name': 'showdown', 'src': 'negotiating', 'dst': 'spawning'},
            {'name': 'spawned', 'src': 'spawning', 'dst': 'finish'},
            {'name': 'showdown', 'src': 'finish', 'dst': 'finish'}
        ],
        'callbacks': {
            'onnegotiating': broadcast_vote,
            'onspawning': spawn_yadtshell,
            'onfinish': cleanup_fsm,
            'onfold': fold,
        }
    })
    fsm.tracking_id = tracking_id
    fsm.vote = vote
    return fsm
示例#10
0
 def test_it_doesnt_break_with_unicode_literals(self):
     try:
         fsm = Fysom({
             'initial':
             'green',
             'final':
             'red',
             'events': [{
                 'name': 'warn',
                 'src': 'green',
                 'dst': 'yellow'
             }, {
                 'name': 'panic',
                 'src': 'yellow',
                 'dst': 'red'
             }, {
                 'name': 'calm',
                 'src': 'red',
                 'dst': 'yellow'
             }, {
                 'name': 'clear',
                 'src': 'yellow',
                 'dst': 'green'
             }]
         })
         self.assertTrue(True)
     except TypeError:
         self.assertTrue(False)
示例#11
0
    def __init__(self, agent):
        logger.debug("Initializing host agent state machine")

        self.agent = agent
        self.fsm = Fysom({
            "events": [("lookup", "*", "found"),
                       ("announce", "found", "announced"),
                       ("pending", "announced", "wait4init"),
                       ("ready", "wait4init", "good2go")],
            "callbacks": {
                # Can add the following to debug
                # "onchangestate":  self.print_state_change,
                "onlookup": self.lookup_agent_host,
                "onannounce": self.announce_sensor,
                "onpending": self.on_ready,
                "ongood2go": self.on_good2go
            }
        })

        self.timer = threading.Timer(1, self.fsm.lookup)
        self.timer.daemon = True
        self.timer.name = self.THREAD_NAME

        # Only start the announce process when not in Test
        if not "INSTANA_TEST" in os.environ:
            self.timer.start()
示例#12
0
 def logon(self):
     self.psget = PasswordProtect(self.baseurl)
     self.logon_fsm = Fysom({
         'initial': {
             'state': 'start'
         },
         'events': [{
             'name': 'userid',
             'src': 'start',
             'dst': 'username_sent'
         }, {
             'name': 'password',
             'src': 'username_sent',
             'dst': 'password_sent'
         }, {
             'name': 'logon',
             'src': 'password_sent',
             'dst': 'logged_on'
         }],
         'final':
         'logged_on',
         'callbacks': {
             'onuserid': self.send_userid,
             'onpassword': self.send_password,
             'onlogon': self.send_logon
         }
     })
     self.logon_fsm.userid(html_id='userid')
     self.logon_fsm.password(html_id='password')
     self.logon_fsm.logon(html_id='logon')
示例#13
0
    def test_onchangestate_should_fire_for_all_state_changes(self):
        def on_change_state(e):
            self.current_event = e
        fsm = Fysom({
            'initial': 'foo',
            'events': [
                {'name': 'footobar', 'src': 'foo', 'dst': 'bar'},
                {'name': 'bartobaz', 'src': 'bar', 'dst': 'baz'},
            ],
            'callbacks': {
                'onchangestate': on_change_state
            }
        })

        fsm.footobar(id=123)
        self.assertEqual(self.current_event.event, 'footobar')
        self.assertEqual(self.current_event.src, 'foo')
        self.assertEqual(self.current_event.dst, 'bar')
        self.assertEqual(self.current_event.id, 123)
        self.assertTrue(self.current_event.fsm is fsm)

        fsm.bartobaz('positional', named_attribute='test')
        self.assertEqual(self.current_event.event, 'bartobaz')
        self.assertEqual(self.current_event.src, 'bar')
        self.assertEqual(self.current_event.dst, 'baz')
        self.assertEqual(self.current_event.named_attribute, 'test')
        self.assertEqual(self.current_event.args[0], 'positional')
        self.assertTrue(self.current_event.fsm is fsm)
示例#14
0
    def setUp(self):
        self.fired_callbacks = []

        self.fsm = Fysom({
            'initial': 'sleeping',
            'events': [
                {'name': 'foo', 'src': 'sleeping', 'dst': 'fooed'},
                {'name': 'foo', 'src': 'fooed', 'dst': 'fooed'},
                {'name': 'bar', 'src': 'fooed', 'dst': 'bared'},
                {'name': 'bar', 'src': 'bared', 'dst': 'bared'},
                {'name': 'baz', 'src': 'bared', 'dst': 'bazed'},
                {'name': 'wait', 'src': 'sleeping', 'dst': 'waiting'}
            ],
            'callbacks': {
                'onfoo': self.on_foo,
                'onbar': self.on_bar,
                'onbaz': self.on_baz,
                'onbeforefoo': self.before_foo,
                'onbeforebar': self.before_bar,
                'onbeforewait': self.before_wait,
                'onenterfooed': self.on_enter_fooed,
                'onenterbared': self.on_enter_bared,
                'onreenterfooed': self.on_reenter_fooed,
                'onreenterbared': self.on_reenter_bared,
                'onleavesleeping': self.on_leave_sleeping,
                'onleavefooed': self.on_leave_fooed
            }
        })
示例#15
0
    def __init__(self, agent):
        package_version = 'unknown'
        try:
            package_version = pkg_resources.get_distribution('instana').version
        except pkg_resources.DistributionNotFound:
            pass

        logger.info("Stan is on the scene.  Starting Instana instrumentation version: %s", package_version)
        logger.debug("initializing fsm")

        self.agent = agent
        self.fsm = Fysom({
            "events": [
                ("lookup",   "*",            "found"),
                ("announce", "found",        "announced"),
                ("pending",  "announced",    "wait4init"),
                ("ready",    "wait4init",    "good2go")],
            "callbacks": {
                # Can add the following to debug
                # "onchangestate":  self.print_state_change,
                "onlookup":       self.lookup_agent_host,
                "onannounce":     self.announce_sensor,
                "onpending":      self.agent.start,
                "onready":        self.on_ready}})

        self.timer = t.Timer(5, self.fsm.lookup)
        self.timer.daemon = True
        self.timer.name = self.THREAD_NAME
        self.timer.start()
示例#16
0
 def test_never_finished_if_final_is_unspecified(self):
     fsm = Fysom({
         'initial':
         'green',
         'events': [{
             'name': 'warn',
             'src': 'green',
             'dst': 'yellow'
         }, {
             'name': 'panic',
             'src': 'yellow',
             'dst': 'red'
         }, {
             'name': 'calm',
             'src': 'red',
             'dst': 'yellow'
         }, {
             'name': 'clear',
             'src': 'yellow',
             'dst': 'green'
         }]
     })
     self.assertFalse(fsm.is_finished())
     fsm.warn()
     self.assertFalse(fsm.is_finished())
     fsm.panic()
     self.assertFalse(fsm.is_finished())
示例#17
0
 def setUp(self):
     self.fsm = Fysom({
         'initial':
         'green',
         'events': [{
             'name': 'warn',
             'src': 'green',
             'dst': 'yellow'
         }, {
             'name': 'panic',
             'src': 'yellow',
             'dst': 'red'
         }, {
             'name': 'calm',
             'src': 'red',
             'dst': 'yellow'
         }, {
             'name': 'clear',
             'src': 'yellow',
             'dst': 'green'
         }, {
             'name': 'warm',
             'src': 'green',
             'dst': 'blue'
         }]
     })
示例#18
0
    def __init__(self,
                 my_id,
                 zmq_context,
                 img_socket,
                 queueing_fun,
                 output_dir,
                 router_address,
                 resize_factor=100,
                 debug=False):

        self.my_id = my_id
        self.zmq_context = zmq_context
        self.socket_img = img_socket
        self.enqueue_fun = queueing_fun
        self.output_dir = output_dir
        self.router_address = router_address
        self.resize_ratio = resize_factor

        events = [{
            'name': 'start',
            'src': 'idle',
            'dst': 'in_sweep'
        }, {
            'name': 'stop',
            'src': '*',
            'dst': 'idle'
        }]
        callbacks = {'onleaveidle': self.reset, 'onstop': self.halt}
        self.fsm = Fysom(initial='idle', events=events, callbacks=callbacks)

        self.time_start = get_utc_now_ms()
        if debug:
            self.fsm.onchangestate = print_state_change
示例#19
0
 def __init__(self, location, size, disease):
     self.state = Fysom({
         'initial':
         'healthy',
         'events': [
             {
                 'name': 'get infected',
                 'src': 'healthy',
                 'dst': 'incubation'
             },
             {
                 'name': 'finish incubation',
                 'src': 'incubation',
                 'dst': 'contagious'
             },
             {
                 'name': 'die',
                 'src': 'contagious',
                 'dst': 'dead'
             },
             {
                 'name': 'recover',
                 'src': 'contagious',
                 'dst': 'immune'
             },
         ],
     })
     self.incubation_duration = disease['incubation duration']
     self.contagious_duration = disease['contagious duration']
     self.color = colors[self.state.current]
     self.next_trigger = None
     self.neighbors = []
     self.size = size
     self.x, self.y = location[0] * self.size, location[1] * self.size
示例#20
0
    def test_rest_should_always_transition_to_hungry_state(self):
        fsm = Fysom(self.fsm_descr)
        fsm.rest()
        self.assertEquals(fsm.current, 'hungry')

        fsm = Fysom(self._get_descr('satisfied'))
        fsm.rest()
        self.assertEquals(fsm.current, 'hungry')

        fsm = Fysom(self._get_descr('full'))
        fsm.rest()
        self.assertEquals(fsm.current, 'hungry')

        fsm = Fysom(self._get_descr('sick'))
        fsm.rest()
        self.assertEquals(fsm.current, 'hungry')
示例#21
0
    def do_stem(self, word):
        fsm = Fysom(initial='start', events=self.events)

        i = len(word) - 1
        j = len(word)

        while (True):
            if i <= 0:
                break
            v = word[i:j]
            # print v
            res = fsm.can(v)
            if (res):
                if v == 'i' and fsm.can(word[i - 1:j]):
                    i = i - 1
                    continue
                fsm.trigger(v)
                if fsm.current == 'h':
                    if word[i - 1:i] == 'i':
                        i = i - 1  # skip i
                        if word[i - 1:i] == 'n':
                            # ning qushimchasi
                            fsm.current = 'start'
                            continue
                elif fsm.current == 'b':
                    fsm.current = 'start'
                j = i

            i = i - 1

        return word[:j]
示例#22
0
 def test_if_src_not_specified_then_is_wildcard(self):
     fsm = Fysom({
         'initial':
         'hungry',
         'events': [{
             'name': 'eat',
             'src': 'hungry',
             'dst': 'satisfied'
         }, {
             'name': 'eat',
             'src': 'satisfied',
             'dst': 'full'
         }, {
             'name': 'eat',
             'src': 'full',
             'dst': 'sick'
         }, {
             'name': 'rest',
             'dst': 'hungry'
         }]
     })
     fsm.eat()
     self.assertEqual(fsm.current, 'satisfied')
     fsm.rest()
     self.assertEqual(fsm.current, 'hungry')
     fsm.eat()
     fsm.eat()
     self.assertEqual(fsm.current, 'full')
     fsm.rest()
     self.assertEqual(fsm.current, 'hungry')
示例#23
0
    def __init__(self, debuglevel=0, debugname='Halrcomp Subscribe'):
        self.debuglevel = debuglevel
        self.debugname = debugname
        self._error_string = ''
        self.on_error_string_changed = []
        # ZeroMQ
        context = zmq.Context()
        context.linger = 0
        self._context = context
        # pipe to signalize a shutdown
        self._shutdown = context.socket(zmq.PUSH)
        self._shutdown_uri = b'inproc://shutdown-%s' % str(uuid.uuid4()).encode()
        self._shutdown.bind(self._shutdown_uri)
        self._thread = None  # socket worker tread
        self._tx_lock = threading.Lock()  # lock for outgoing messages

        # Socket
        self.socket_uri = ''
        self._socket_topics = set()
        # more efficient to reuse protobuf messages
        self._socket_rx = Container()

        # Heartbeat
        self._heartbeat_lock = threading.Lock()
        self._heartbeat_interval = 2500
        self._heartbeat_timer = None
        self._heartbeat_active = False
        self._heartbeat_liveness = 0
        self._heartbeat_reset_liveness = 5

        # callbacks
        self.on_socket_message_received = []
        self.on_state_changed = []

        # fsm
        self._fsm = Fysom(
            {
                'initial': 'down',
                'events': [
                    {'name': 'start', 'src': 'down', 'dst': 'trying'},
                    {'name': 'full_update_received', 'src': 'trying', 'dst': 'up'},
                    {'name': 'stop', 'src': 'trying', 'dst': 'down'},
                    {'name': 'heartbeat_timeout', 'src': 'up', 'dst': 'trying'},
                    {'name': 'heartbeat_tick', 'src': 'up', 'dst': 'up'},
                    {'name': 'any_msg_received', 'src': 'up', 'dst': 'up'},
                    {'name': 'stop', 'src': 'up', 'dst': 'down'},
                ],
            }
        )

        self._fsm.ondown = self._on_fsm_down
        self._fsm.onafterstart = self._on_fsm_start
        self._fsm.ontrying = self._on_fsm_trying
        self._fsm.onafterfull_update_received = self._on_fsm_full_update_received
        self._fsm.onafterstop = self._on_fsm_stop
        self._fsm.onup = self._on_fsm_up
        self._fsm.onafterheartbeat_timeout = self._on_fsm_heartbeat_timeout
        self._fsm.onafterheartbeat_tick = self._on_fsm_heartbeat_tick
        self._fsm.onafterany_msg_received = self._on_fsm_any_msg_received
    def test_gc_should_not_break_callback(self):
        class MyTestObject(object):
            def __init__(self):
                self._states = []
                self._fsm = None

            def warn(self):
                self._fsm.warn()

            def panic(self):
                self._fsm.panic()

            def calm(self):
                self._fsm.calm()

            def clear(self):
                self._fsm.clear()

            def _on_green(self, *args, **kwargs):
                self._states.append('green')

            def _on_yellow(self, *args, **kwargs):
                self._states.append('yellow')

            def _on_red(self, *args, **kwargs):
                self._states.append('red')

        obj = MyTestObject()
        fsm = Fysom({
            'initial':
            'green',
            'events': [{
                'name': 'warn',
                'src': 'green',
                'dst': 'yellow'
            }, {
                'name': 'panic',
                'src': 'yellow',
                'dst': 'red'
            }, {
                'name': 'calm',
                'src': 'red',
                'dst': 'yellow'
            }, {
                'name': 'clear',
                'src': 'yellow',
                'dst': 'green'
            }],
            'callbacks': {
                'ongreen': obj._on_green,
                'onyellow': obj._on_yellow,
                'onred': obj._on_red
            }
        })
        obj._fsm = fsm
        obj.warn()
        obj.clear()
        del obj
        fsm.warn()
示例#25
0
 def test_initial_state_should_work_with_different_event_name(self):
     fsm = Fysom({
         'initial': {'state': 'green', 'event': 'init'},
         'events': [
             {'name': 'panic', 'src': 'green', 'dst': 'red'},
             {'name': 'calm', 'src': 'red', 'dst': 'green'},
         ]
     })
     self.assertEquals(fsm.current, 'green')
示例#26
0
 def test_init_kwargs_only(self):
     fsm = Fysom(initial='green',
                 events=[('panic', 'green', 'red'),
                         ('calm', 'red', 'green')])
     self.assertEqual(fsm.current, "green")
     fsm.panic()
     self.assertEqual(fsm.current, "red")
     fsm.calm()
     self.assertEqual(fsm.current, "green")
示例#27
0
 def test_should_have_no_state_when_no_initial_state_is_given(self):
     fsm = Fysom({
         'events': [
             {'name': 'warn', 'src': 'green', 'dst': 'yellow'},
             {'name': 'panic', 'src': 'yellow', 'dst': 'red'},
             {'name': 'calm', 'src': 'red', 'dst': 'yellow'},
             {'name': 'clear', 'src': 'yellow', 'dst': 'green'}
         ]
     })
     self.assertEqual(fsm.current, 'none')
示例#28
0
    def __init__(self, debuglevel=0, debugname='Log Base'):
        self.debuglevel = debuglevel
        self.debugname = debugname
        self._error_string = ''
        self.on_error_string_changed = []

        # Log
        self._log_channel = SimpleSubscribe(debuglevel=debuglevel)
        self._log_channel.debugname = '%s - %s' % (self.debugname, 'log')
        self._log_channel.on_state_changed.append(
            self._log_channel_state_changed)
        self._log_channel.on_socket_message_received.append(
            self._log_channel_message_received)
        # more efficient to reuse protobuf messages
        self._log_rx = Container()

        # callbacks
        self.on_log_message_received = []
        self.on_state_changed = []

        # fsm
        self._fsm = Fysom({
            'initial':
            'down',
            'events': [
                {
                    'name': 'connect',
                    'src': 'down',
                    'dst': 'trying'
                },
                {
                    'name': 'log_up',
                    'src': 'trying',
                    'dst': 'up'
                },
                {
                    'name': 'disconnect',
                    'src': 'trying',
                    'dst': 'down'
                },
                {
                    'name': 'disconnect',
                    'src': 'up',
                    'dst': 'down'
                },
            ],
        })

        self._fsm.ondown = self._on_fsm_down
        self._fsm.onafterconnect = self._on_fsm_connect
        self._fsm.ontrying = self._on_fsm_trying
        self._fsm.onafterlog_up = self._on_fsm_log_up
        self._fsm.onafterdisconnect = self._on_fsm_disconnect
        self._fsm.onup = self._on_fsm_up
        self._fsm.onleaveup = self._on_fsm_up_exit
示例#29
0
文件: L2tpv3Fsm.py 项目: hujiangyi/or
    def __init__(self, states, events, config, callbacks):
        """TODO params dont match
        :param callbacks: it is used to indicate some event happens, we should take some action
        {
            Type:event/state
            TrackPoint:On/Before/After/ Leave/Enter/reenter
            Name:
            Handler:
        }
        """
        # Get all the Event
        generatedCallbackDict = dict()
        newConfig = copy(config)
        for callback in callbacks:
            if callback["Type"] == 'event':
                if callback["TrackPoint"] not in ["on", "before", "after"]:
                    raise l2tpv3FsmParameterError(
                        "Cannot register event callback since Trackpoint type unrecognised"
                    )
                if callback["Name"] not in events:
                    raise l2tpv3FsmParameterError(
                        "Cannot register event callback since event name is unrecognised"
                    )
            elif callback["Type"] == 'state':
                if callback["TrackPoint"] not in [
                        "on", "leave", "enter", "reenter", "after"
                ]:
                    raise l2tpv3FsmParameterError(
                        "Cannot register state callback since Trackpoint type unrecognised"
                    )
                if callback["Name"] not in states:
                    raise l2tpv3FsmParameterError(
                        "Cannot register event callback since states name is unrecognised"
                    )
            else:
                raise l2tpv3FsmParameterError(
                    "Cannot register state callback since Type unrecognised")

            if not callable(callback['Handler']):
                raise l2tpv3FsmParameterError(
                    "Cannot register state callback since handler is not callable"
                )

            if callback["TrackPoint"] == "on":
                callbackTrackpoint = "on"
            else:
                callbackTrackpoint = "on" + callback["TrackPoint"]

            prefix = callbackTrackpoint + callback['Name']
            generatedCallbackDict[prefix] = callback["Handler"]

        if len(generatedCallbackDict) > 0:
            newConfig["callbacks"] = generatedCallbackDict

        self.fsm = Fysom(newConfig)
示例#30
0
 def test_deferred_initial_state_should_be_none_then_state(self):
     fsm = Fysom({
         'initial': {'state': 'green', 'event': 'init', 'defer': True},
         'events': [
             {'name': 'panic', 'src': 'green', 'dst': 'red'},
             {'name': 'calm', 'src': 'red', 'dst': 'green'},
         ]
     })
     self.assertEqual(fsm.current, 'none')
     fsm.init()
     self.assertEqual(fsm.current, 'green')