Ejemplo n.º 1
0
   def testPrimary(self):
      fsm = FSM()

      fsm.add('start', None, 'final', self.primary_start)
      fsm.add('final', None, 'start', self.primary_stop)
      fsm.start('start')

      fsm.execute(self.START_TEST_OUTPUT)
      fsm.execute(self.VALID_TEST_OUTPUT)

      self.assertEqual(self._primaryout, self.VALID_TEST_OUTPUT)
Ejemplo n.º 2
0
class AttributeFilter:
   '''Filter Expat processing'''
   __ACQ_SIGNAL = 'start'

   def __init__(self, filter, complete_cb):
      '''Initialize with tag list and proc'''
      # Parameterize Expat
      self.__parser_init()

      # (tag:value) mapping returned via callback/proc
      self._filter = filter
      self._acquire = dict.fromkeys(filter)
      self._current_tag = iter(filter)

      self.__fsm_init()
      self.__callback = complete_cb

   def __parser_init(self):
      '''Help initialize Expat'''
      self._parser = xml.parsers.expat.ParserCreate('utf-8')
      self._parser.buffer_text = True
      self._parser.StartElementHandler = self.start_element
      self._parser.EndElementHandler = self.end_element
      self._parser.CharacterDataHandler = self.char_data

   def __fsm_init(self):
      '''Helper initialize FSM'''
      self._fsm = FSM()

      tagiter = iter(self._filter)
      init_tag = current_tag = tagiter.next()
      while True:
         try:
            # Create distinct state transitions
            acq_tag = '%s%s' % (current_tag, '_acq')

            # Don't do anything before being signaled
            self._fsm.add(current_tag, None, current_tag, None)
            self._fsm.add(current_tag, self.__ACQ_SIGNAL, acq_tag, None)

            try:
               # Next user-/tag-defined state
               current_tag = tagiter.next()
               self._fsm.add(acq_tag, None, current_tag, self.acquire)
            except StopIteration:
               # Or close the loop
               self._fsm.add(acq_tag, None, init_tag, self.last_action)
               break
         except StopIteration:
            # TODO: Log: this should never happen
            break

      self._fsm.start(init_tag)

   def parse(self, raw_xml):
      '''Direct call on Expat instance'''
      try:
         self._parser.Parse(raw_xml, 1)
      except xml.parsers.expat.ExpatError, err:
         # TODO: Error path/Exceptions 
         message = 'Expat Error: %s (%i, %i)' % (xml.parsers.expat.ErrorString(err.code),\
                                                 err.lineno,\
                                                 err.offset)