Example #1
0
    def test_Unplugging(self):
        """Plug will unplug and shutdown when child component dies."""
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()

        splitter = Splitter()
        splitter.activate()

        target = DummyComponent()
        plug = Plug(splitter, target).activate()

        execute = Axon.Scheduler.scheduler.run.main()

        for i in xrange(1, 100):
            execute.next()

        #send shutdown msg
        msg = producerFinished()
        target._deliver(msg, "control")

        for i in xrange(1, 100):
            execute.next()

        # verify it reached the target
        self.assert_(target.controllog == [msg])

        # verify the plug has shutdown
        self.assert_(plug._isStopped())

        # verify the plug has no linkages
        self.assert_(not plug.postoffice.linkages)

        # verify that splitter only has outboxes "outbox" and "signal" now
        self.assert_(len(splitter.outboxes) == 2)
        self.assert_("outbox" in splitter.outboxes)
        self.assert_("signal" in splitter.outboxes)
Example #2
0
    def test_Unplugging(self):
        """Plug will unplug and shutdown when child component dies."""
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()

        splitter = Splitter()
        splitter.activate()

        target = DummyComponent()
        plug = Plug(splitter, target).activate()

        execute = Axon.Scheduler.scheduler.run.main()

        for i in xrange(1,100):
            execute.next()

        #send shutdown msg
        msg = producerFinished()
        target._deliver(msg, "control")

        for i in xrange(1,100):
            execute.next()

        # verify it reached the target
        self.assert_(target.controllog == [msg])

        # verify the plug has shutdown
        self.assert_(plug._isStopped())

        # verify the plug has no linkages
        self.assert_(not plug.postoffice.linkages)

        # verify that splitter only has outboxes "outbox" and "signal" now
        self.assert_( len(splitter.outboxes) == 2)
        self.assert_( "outbox" in splitter.outboxes)
        self.assert_( "signal" in splitter.outboxes)
Example #3
0
    def setUp(self):
        self.src = component()
        self.dst = component()
        self.dst2 = TestComponent()
        self.controller = component()
        self.split = Splitter()
        self.runner = self.split.main()
        self.linkin = linkage(self.src, self.split)
        self.linkcont = linkage(self.controller,
                                self.split,
                                sinkbox="configuration")
        self.links = [self.linkin, self.linkcont]
        #      self.linkout1 = linkage(self.split,self.dst)
        #      self.linkout2 = linkage(self.split,self.dst2, sourcebox="out2")

        #
        # -- NEW STUFF ------
        #
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()
        self.execute = Axon.Scheduler.scheduler.run.main()

        self.S = Splitter().activate()
        self.D = component().activate()
        self.D2 = TestComponent().activate()
        self.W = component().activate()
        self.W.link((self.W, "outbox"), (self.S, "configuration"))
Example #4
0
    def test_SplitterDelLinkBoth(self):
        """Sending an delSink message to splitter unlinks in the extra outbox and signal"""
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()
        split = Splitter().activate()

        target1 = Axon.Component.component().activate()
        target2 = Axon.Component.component().activate()

        target1.link( (split,"outbox"), (target1, "inbox") )
        target1.link( (split,"signal"), (target1, "control") )

        addmsg = addsink(target2, "inbox", "control")
        split._deliver(addmsg, "configuration")

        execute = Axon.Scheduler.scheduler.run.main()

        for i in xrange(1,10):
            execute.next()

        for i in xrange(1,10):
            if i == 5:
                delmsg = removesink(target2, "inbox", "control")
                split._deliver(delmsg, "configuration")

            split._deliver(i, "inbox")
            split._deliver(10+i, "control")

            for j in xrange(1,10):
                execute.next()

        for i in xrange(1,40):
            execute.next()

        # verify that the data has made it to the targets
        for i in xrange(1,5):
            self.assert_(target1.dataReady("inbox"))
            self.assert_(target1.dataReady("control"))
            self.assert_(i == target1.recv("inbox"))
            self.assert_(10+i == target1.recv("control"))

            self.assert_(target2.dataReady("inbox"))
            self.assert_(target2.dataReady("control"))
            self.assert_(i == target2.recv("inbox"))
            self.assert_(10+i == target2.recv("control"))

        for i in xrange(5,10):
            self.assert_(target1.dataReady("inbox"))
            self.assert_(target1.dataReady("control"))
            self.assert_(i == target1.recv("inbox"))
            self.assert_(10+i == target1.recv("control"))

            self.assert_(not target2.dataReady("inbox"))
            self.assert_(not target2.dataReady("control"))

        # verify there is nothing left
        self.assert_(not target1.dataReady("inbox"))
        self.assert_(not target1.dataReady("control"))

        self.assert_(not target2.dataReady("inbox"))
        self.assert_(not target2.dataReady("control"))
Example #5
0
    def test_SplitterDelLinkBoth(self):
        """Sending an delSink message to splitter unlinks in the extra outbox and signal"""
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()
        split = Splitter().activate()

        target1 = Axon.Component.component().activate()
        target2 = Axon.Component.component().activate()

        target1.link((split, "outbox"), (target1, "inbox"))
        target1.link((split, "signal"), (target1, "control"))

        addmsg = addsink(target2, "inbox", "control")
        split._deliver(addmsg, "configuration")

        execute = Axon.Scheduler.scheduler.run.main()

        for i in xrange(1, 10):
            execute.next()

        for i in xrange(1, 10):
            if i == 5:
                delmsg = removesink(target2, "inbox", "control")
                split._deliver(delmsg, "configuration")

            split._deliver(i, "inbox")
            split._deliver(10 + i, "control")

            for j in xrange(1, 10):
                execute.next()

        for i in xrange(1, 40):
            execute.next()

        # verify that the data has made it to the targets
        for i in xrange(1, 5):
            self.assert_(target1.dataReady("inbox"))
            self.assert_(target1.dataReady("control"))
            self.assert_(i == target1.recv("inbox"))
            self.assert_(10 + i == target1.recv("control"))

            self.assert_(target2.dataReady("inbox"))
            self.assert_(target2.dataReady("control"))
            self.assert_(i == target2.recv("inbox"))
            self.assert_(10 + i == target2.recv("control"))

        for i in xrange(5, 10):
            self.assert_(target1.dataReady("inbox"))
            self.assert_(target1.dataReady("control"))
            self.assert_(i == target1.recv("inbox"))
            self.assert_(10 + i == target1.recv("control"))

            self.assert_(not target2.dataReady("inbox"))
            self.assert_(not target2.dataReady("control"))

        # verify there is nothing left
        self.assert_(not target1.dataReady("inbox"))
        self.assert_(not target1.dataReady("control"))

        self.assert_(not target2.dataReady("inbox"))
        self.assert_(not target2.dataReady("control"))
Example #6
0
    def test_PluggingInAndTxfer(self):
        """Plug instantiated with splitter and component and passes data through to component."""
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()

        splitter = Splitter()
        splitter.activate()

        target = DummyComponent()
        plug = Plug(splitter, target).activate()

        execute = Axon.Scheduler.scheduler.run.main()

        for i in xrange(1, 1000):
            execute.next()

        #pass some data in
        for i in xrange(1, 10):
            splitter._deliver(i, "inbox")
            splitter._deliver(10 + i, "control")
            for i in xrange(1, 100):
                execute.next()

        # verify it reached the target
        self.assert_(target.inboxlog == range(1, 10))
        self.assert_(target.controllog == range(11, 20))
Example #7
0
    def test_PluggingInAndTxfer(self):
        """Plug instantiated with splitter and component and passes data through to component."""
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()

        splitter = Splitter()
        splitter.activate()

        target = DummyComponent()
        plug = Plug(splitter, target).activate()

        execute = Axon.Scheduler.scheduler.run.main()

        for i in xrange(1,1000):
            execute.next()

        #pass some data in
        for i in xrange(1,10):
            splitter._deliver(i, "inbox")
            splitter._deliver(10+i, "control")
            for i in xrange(1,100):
                execute.next()

        # verify it reached the target
        self.assert_(target.inboxlog == range(1,10))
        self.assert_(target.controllog == range(11,20))
Example #8
0
   def setUp(self):
      self.src = component()
      self.dst = component()
      self.dst2 = TestComponent()
      self.controller = component()
      self.split = Splitter()
      self.runner = self.split.main()
      self.linkin = linkage(self.src,self.split)
      self.linkcont = linkage(self.controller, self.split, sinkbox="configuration")
      self.links = [self.linkin, self.linkcont]
#      self.linkout1 = linkage(self.split,self.dst)
#      self.linkout2 = linkage(self.split,self.dst2, sourcebox="out2")

      #
      # -- NEW STUFF ------
      #
      Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()
      self.execute = Axon.Scheduler.scheduler.run.main()

      self.S = Splitter().activate()
      self.D = component().activate()
      self.D2 = TestComponent().activate()
      self.W = component().activate()
      self.W.link( (self.W, "outbox"), (self.S, "configuration") )
Example #9
0
def Tee(*destinations):
    splitter = PlugSplitter()
    plugs = {}
    i = 1
    for dest in destinations:
        plugs[str(i)] = Plug(splitter, dest)
        i = i + 1

    return Graphline(splitter=splitter,
                     linkages={
                         ("", "inbox"): ("splitter", "inbox"),
                         ("", "control"): ("splitter", "control"),
                         ("splitter", "outbox"): ("", "outbox"),
                         ("splitter", "signal"): ("", "signal")
                     },
                     **plugs)
Example #10
0
    def test_SplitterAddLinkSignalOnly(self):
        """Sending an addSink message to splitter links in an extra signal"""
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()
        split = Splitter().activate()

        target1 = Axon.Component.component().activate()
        target2 = Axon.Component.component().activate()

        target1.link( (split,"outbox"), (target1, "inbox") )
        target1.link( (split,"signal"), (target1, "control") )

        addmsg = addsink(target2, None, "control")
        split._deliver(addmsg, "configuration")

        execute = Axon.Scheduler.scheduler.run.main()

        for i in xrange(1,10):
            execute.next()

        for i in xrange(1,10):
            split._deliver(i, "inbox")
            split._deliver(10+i, "control")
            for j in xrange(1,10):
                execute.next()

        # verify that the data has made it to the targets
        for i in xrange(1,10):
            self.assert_(target1.dataReady("inbox"))
            self.assert_(target1.dataReady("control"))
            self.assert_(i == target1.recv("inbox"))
            self.assert_(10+i == target1.recv("control"))

            self.assert_(not target2.dataReady("inbox"))
            self.assert_(target2.dataReady("control"))
            self.assert_(10+i == target2.recv("control"))

        # verify there is nothing left
        self.assert_(not target1.dataReady("inbox"))
        self.assert_(not target1.dataReady("control"))

        self.assert_(not target2.dataReady("inbox"))
        self.assert_(not target2.dataReady("control"))
Example #11
0
    def test_SplitterAddLinkSignalOnly(self):
        """Sending an addSink message to splitter links in an extra signal"""
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()
        split = Splitter().activate()

        target1 = Axon.Component.component().activate()
        target2 = Axon.Component.component().activate()

        target1.link((split, "outbox"), (target1, "inbox"))
        target1.link((split, "signal"), (target1, "control"))

        addmsg = addsink(target2, None, "control")
        split._deliver(addmsg, "configuration")

        execute = Axon.Scheduler.scheduler.run.main()

        for i in xrange(1, 10):
            execute.next()

        for i in xrange(1, 10):
            split._deliver(i, "inbox")
            split._deliver(10 + i, "control")
            for j in xrange(1, 10):
                execute.next()

        # verify that the data has made it to the targets
        for i in xrange(1, 10):
            self.assert_(target1.dataReady("inbox"))
            self.assert_(target1.dataReady("control"))
            self.assert_(i == target1.recv("inbox"))
            self.assert_(10 + i == target1.recv("control"))

            self.assert_(not target2.dataReady("inbox"))
            self.assert_(target2.dataReady("control"))
            self.assert_(10 + i == target2.recv("control"))

        # verify there is nothing left
        self.assert_(not target1.dataReady("inbox"))
        self.assert_(not target1.dataReady("control"))

        self.assert_(not target2.dataReady("inbox"))
        self.assert_(not target2.dataReady("control"))
Example #12
0
    from Kamaelia.Util.Comparator import Comparator
    from Kamaelia.Util.Splitter import Plug, PlugSplitter
    from Kamaelia.Util.PassThrough import PassThrough
    from Kamaelia.File.Writing import SimpleFileWriter
    
    TS_FILE = "/home/matteh/dvb/2008-05-16 11.27.13 MUX1_EIT_TOT_TDT.ts"
    
#    def AddInVersion():
#        def transf(x):
#            x["version"] = 0
#            return x
#        return PureTransformer(transf)
    
    print "run a diff over the two output files to compare the results"
    
    splitter=PlugSplitter()
    
    Pipeline(
        RateControlledFileReader(TS_FILE, readmode="bytes", rate=1000*1000, chunksize=188),
        DVB_SoftDemuxer( {0x12:["outbox"]} ),
        ReassemblePSITables(),
        ParseEventInformationTable_Subset( \
            actual_presentFollowing = True,
            other_presentFollowing = True,
            actual_schedule = True,
            other_schedule = True,
            ),
        splitter
    ).activate()
    
    Plug(splitter, Pipeline(
Example #13
0
    def test_SplitterShutdown(self):
        """If producerFinished or shutdownMicroprocess is received on the 'control' inbox they are passed on and the component shuts down"""
        for msg in [producerFinished(self), shutdownMicroprocess(self)]:
            split = Splitter()
            Dummy = Axon.Component.component()
            split.link((split, "outbox"), (Dummy, "inbox"))
            split.link((split, "signal"), (Dummy, "control"))
            split.activate()

            for _ in xrange(0,10):
                split.next()
            self.assert_(0==len(split.outboxes["outbox"]))
            self.assert_(0==len(split.outboxes["signal"]))

            split._deliver( msg, "control" )
            try:
                for _ in xrange(0,10):
                    split.next()
                self.fail()
            except StopIteration:
                pass
            self.assert_(0==len(split.outboxes["outbox"]))
            self.assert_(1==len(split.outboxes["signal"]))
#            received = split._collect("signal")
            received = Dummy.recv("control")
            self.assert_( msg == received )
Example #14
0
    def test_PassThroughControlSignal(self):
        """Data sent to the inbox is sent on to the outbox"""
        split = Splitter()
        Dummy = Axon.Component.component()
        split.link((split, "outbox"), (Dummy, "inbox"))
        split.link((split, "signal"), (Dummy, "control"))
        split.activate()

        for i in xrange(1,10):
            split._deliver( i, "control" )
        for _ in xrange(0,100):
            split.next()
        for i in xrange(1,10):
            self.assert_(len(split.outboxes["signal"]))
            self.assert_(0==len(split.outboxes["outbox"]))
#            self.assert_( i == split._collect("signal") )
            self.assert_( i == Dummy.recv("control") )

        for i in xrange(1,10):
            split._deliver( i, "control" )
            split.next()
            split.next()
        for _ in xrange(0,10):
            split.next()
        for i in xrange(1,10):
            self.assert_(len(split.outboxes["signal"]))
            self.assert_(0==len(split.outboxes["outbox"]))
#            self.assert_( i == split._collect("signal") )
            self.assert_( i == Dummy.recv("control") )
Example #15
0
 def test_InstantiateNoArgs(self):
     """Splitter instantiated with no args is just passthrough"""
     split = Splitter()
     split.activate()
Example #16
0
    def test_SplitterShutdown(self):
        """If producerFinished or shutdownMicroprocess is received on the 'control' inbox they are passed on and the component shuts down"""
        for msg in [producerFinished(self), shutdownMicroprocess(self)]:
            split = Splitter()
            Dummy = Axon.Component.component()
            split.link((split, "outbox"), (Dummy, "inbox"))
            split.link((split, "signal"), (Dummy, "control"))
            split.activate()

            for _ in xrange(0, 10):
                split.next()
            self.assert_(0 == len(split.outboxes["outbox"]))
            self.assert_(0 == len(split.outboxes["signal"]))

            split._deliver(msg, "control")
            try:
                for _ in xrange(0, 10):
                    split.next()
                self.fail()
            except StopIteration:
                pass
            self.assert_(0 == len(split.outboxes["outbox"]))
            self.assert_(1 == len(split.outboxes["signal"]))
            #            received = split._collect("signal")
            received = Dummy.recv("control")
            self.assert_(msg == received)
Example #17
0
class Splitter_Test(unittest.TestCase):
   def setUp(self):
      self.src = component()
      self.dst = component()
      self.dst2 = TestComponent()
      self.controller = component()
      self.split = Splitter()
      self.runner = self.split.main()
      self.linkin = linkage(self.src,self.split)
      self.linkcont = linkage(self.controller, self.split, sinkbox="configuration")
      self.links = [self.linkin, self.linkcont]
#      self.linkout1 = linkage(self.split,self.dst)
#      self.linkout2 = linkage(self.split,self.dst2, sourcebox="out2")

      #
      # -- NEW STUFF ------
      #
      Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()
      self.execute = Axon.Scheduler.scheduler.run.main()

      self.S = Splitter().activate()
      self.D = component().activate()
      self.D2 = TestComponent().activate()
      self.W = component().activate()
      self.W.link( (self.W, "outbox"), (self.S, "configuration") )

   def waitEvent(self, cycles, conditionFunc, *args):
      i = 0
      while 1:
          self.execute.next()
          if conditionFunc(*args):
              break
          else:
             i += 1
             if i > cycles:
                 raise Timeout(i)

   def runCycles(self, cycles=20):
      for _ in xrange(cycles):
          self.execute.next()
   
   def deliverhelper(self):
      # Next bit not really needed due to direct delivery was implemented since then...
      pass
   
   def test_isacomponent(self):
      "__init__ - Splitter is a component."
      self.failUnless(isinstance(self.split,component))
   
   def test_simplepassthrough_defaultbox(self):
      """mainBody - This test sets up a sink and checks it receives sent messages using the default box."""

      self.W.send(addsink(self.D), "outbox")
      data = [ 1,2,3,4,5,6]
      for i in data:
          self.S._deliver(i, "inbox")

      try:
          self.waitEvent(10, self.D.dataReady, "inbox" )
      except Timeout, e:
          self.fail("Data hasn't arrived after "+str(e.t)+" cycles")

      R = []
      while 1:
          try:
              R.append(self.D.recv("inbox"))
          except:
              break
      self.assert_( R == data )
Example #18
0
 def initiateInternalSplitter(self):
     self.internalSplitter = PlugSplitter()
     self.link((self, '_signal'), (self.internalSplitter, 'control'))
     self.addChildren(self.internalSplitter)
     self.internalSplitter.activate()
Example #19
0
class FeedParserFactory(Axon.Component.component):
    """
    FeedParserFactory() -> FeedParserFactory object
    
    It receives different feed URLs throught the "inbox" inbox 
    and returns each post parsed through the "outbox" outbox.
    
    This class can handles multiple concurrent petitions, retrieves
    the content of the feed and parses it with the feedparser library.
    The result is a feedparser.FeedParserDict per each feed URL 
    provided.
    """
    Inboxes = {
        "inbox": "Strings representing different URLs of feeds",
        "control": "From component...",
        "_parsed-feeds":
        "Parsed feeds retrieved from FeedParserFactory children",
    }
    Outboxes = {
        "outbox":
        "feedparser.FeedParserDict object representing a parsed feed",
        "signal": "From component...",
        "_signal": "To the internal parsers",
    }

    def __init__(self, **argd):
        """x.__init__(...) initializes x; see x.__class__.__doc__ for signature"""
        super(FeedParserFactory, self).__init__(**argd)
        self.mustStop = None
        self.providerFinished = False

    def makeFeedParser(self, feedUrl):
        """ 
        makeFeedParser(feedUrl) -> Pipeline
        
        It returns a pipeline which does not expect any input except for signals and
        sends the parsed data through the "outbox" outbox.
        """
        started(feedUrl)
        return Pipeline(
            OneShot(feedUrl),
            SimpleHTTPClient(
            ),  # TODO: SimpleHTTPClient doesn't seem to have proxy support
        )

    def checkControl(self):
        while self.dataReady("control"):
            msg = self.recv("control")
            if isinstance(msg, producerFinished):
                self.providerFinished = True
            elif isinstance(msg, shutdownMicroprocess):
                self.mustStop = msg
        return self.mustStop, self.providerFinished

    def handleChildTerminations(self):  #taken from Carousel.py
        for child in self.childComponents():
            if child._isStopped():
                self.removeChild(child)

    def initiateInternalSplitter(self):
        self.internalSplitter = PlugSplitter()
        self.link((self, '_signal'), (self.internalSplitter, 'control'))
        self.addChildren(self.internalSplitter)
        self.internalSplitter.activate()

    def linkChildToInternalSplitter(self, child):
        forwarder = Forwarder()
        plug = Plug(self.internalSplitter, forwarder)
        plug.activate()
        plug.link((plug, 'signal'), (child, 'control'))
        child.link((child, 'signal'), (plug, 'control'))

    def createChild(self, feed):
        child = self.makeFeedParser(feed.url)
        child = Pipeline(child, Feedparser(feed.url))
        self.link((child, 'outbox'), (self, '_parsed-feeds'))
        self.linkChildToInternalSplitter(child)
        return child

    def waitForChildren(self, signalMessage):
        self.send(signalMessage, "_signal")
        while len(self.childComponents()) > 0:
            self.handleChildTerminations()
            yield 1

    def main(self):
        self.initiateInternalSplitter()
        yield 1

        while True:
            mustStop, providerFinished = self.checkControl()
            if mustStop:
                self.send(mustStop, "signal")
                return

            self.handleChildTerminations()

            while self.dataReady("inbox"):
                feed = self.recv("inbox")
                child = self.createChild(feed)
                self.addChildren(child)
                child.activate()

            while self.dataReady("_parsed-feeds"):
                parseddata = self.recv("_parsed-feeds")
                self.send(parseddata, "outbox")

            if providerFinished and len(self.childComponents()) == 1:
                # TODO: CHECK IF THIS IS THE PROBLEM
                # It's actually only waiting for the plugsplitter
                for _ in self.waitForChildren(producerFinished(self)):
                    yield 1
                pfinished = producerFinished(self)
                self.send(pfinished, "signal")
                return

            if not self.anyReady():
                self.pause()
            yield 1
Example #20
0
class Splitter_Test(unittest.TestCase):
    def setUp(self):
        self.src = component()
        self.dst = component()
        self.dst2 = TestComponent()
        self.controller = component()
        self.split = Splitter()
        self.runner = self.split.main()
        self.linkin = linkage(self.src, self.split)
        self.linkcont = linkage(self.controller,
                                self.split,
                                sinkbox="configuration")
        self.links = [self.linkin, self.linkcont]
        #      self.linkout1 = linkage(self.split,self.dst)
        #      self.linkout2 = linkage(self.split,self.dst2, sourcebox="out2")

        #
        # -- NEW STUFF ------
        #
        Axon.Scheduler.scheduler.run = Axon.Scheduler.scheduler()
        self.execute = Axon.Scheduler.scheduler.run.main()

        self.S = Splitter().activate()
        self.D = component().activate()
        self.D2 = TestComponent().activate()
        self.W = component().activate()
        self.W.link((self.W, "outbox"), (self.S, "configuration"))

    def waitEvent(self, cycles, conditionFunc, *args):
        i = 0
        while 1:
            self.execute.next()
            if conditionFunc(*args):
                break
            else:
                i += 1
                if i > cycles:
                    raise Timeout(i)

    def runCycles(self, cycles=20):
        for _ in xrange(cycles):
            self.execute.next()

    def deliverhelper(self):
        # Next bit not really needed due to direct delivery was implemented since then...
        pass

    def test_isacomponent(self):
        "__init__ - Splitter is a component."
        self.failUnless(isinstance(self.split, component))

    def test_simplepassthrough_defaultbox(self):
        """mainBody - This test sets up a sink and checks it receives sent messages using the default box."""

        self.W.send(addsink(self.D), "outbox")
        data = [1, 2, 3, 4, 5, 6]
        for i in data:
            self.S._deliver(i, "inbox")

        try:
            self.waitEvent(10, self.D.dataReady, "inbox")
        except Timeout, e:
            self.fail("Data hasn't arrived after " + str(e.t) + " cycles")

        R = []
        while 1:
            try:
                R.append(self.D.recv("inbox"))
            except:
                break
        self.assert_(R == data)
Example #21
0
 def test_InstantiateNoArgs(self):
     """Splitter instantiated with no args is just passthrough"""
     split = Splitter()
     split.activate()
Example #22
0
    def test_PassThroughControlSignal(self):
        """Data sent to the inbox is sent on to the outbox"""
        split = Splitter()
        Dummy = Axon.Component.component()
        split.link((split, "outbox"), (Dummy, "inbox"))
        split.link((split, "signal"), (Dummy, "control"))
        split.activate()

        for i in xrange(1, 10):
            split._deliver(i, "control")
        for _ in xrange(0, 100):
            split.next()
        for i in xrange(1, 10):
            self.assert_(len(split.outboxes["signal"]))
            self.assert_(0 == len(split.outboxes["outbox"]))
            #            self.assert_( i == split._collect("signal") )
            self.assert_(i == Dummy.recv("control"))

        for i in xrange(1, 10):
            split._deliver(i, "control")
            split.next()
            split.next()
        for _ in xrange(0, 10):
            split.next()
        for i in xrange(1, 10):
            self.assert_(len(split.outboxes["signal"]))
            self.assert_(0 == len(split.outboxes["outbox"]))
            #            self.assert_( i == split._collect("signal") )
            self.assert_(i == Dummy.recv("control"))
Example #23
0
				print "From control in forwarder: %s: %s" % (self.name, data)
				self.send(data, "signal")
				return

			while self.dataReady("secondary-control"):
				data = self.recv("secondary-control")
				print "From control in secondary-control: %s: %s" % (self.name, data)
				self.send(data, "signal")
				return

			if not self.anyReady():
				self.pause()
			yield 1

if 0:
	mysplitter = PlugSplitter( Producer() )
	mysplitter.activate()

	Plug(mysplitter, Consumer("consumerA") ).activate()
	Plug(mysplitter, Consumer("consumerB") ).activate()

	mysplitter.run()

if 0:
	producer = Producer()
	mysplitter = PlugSplitter()
	pipe = Pipeline(producer, mysplitter)

	Plug(mysplitter, Consumer("consumerA") ).activate()
	Plug(mysplitter, Consumer("consumerB") ).activate()
Example #24
0
                return

            while self.dataReady("secondary-control"):
                data = self.recv("secondary-control")
                print "From control in secondary-control: %s: %s" % (self.name,
                                                                     data)
                self.send(data, "signal")
                return

            if not self.anyReady():
                self.pause()
            yield 1


if 0:
    mysplitter = PlugSplitter(Producer())
    mysplitter.activate()

    Plug(mysplitter, Consumer("consumerA")).activate()
    Plug(mysplitter, Consumer("consumerB")).activate()

    mysplitter.run()

if 0:
    producer = Producer()
    mysplitter = PlugSplitter()
    pipe = Pipeline(producer, mysplitter)

    Plug(mysplitter, Consumer("consumerA")).activate()
    Plug(mysplitter, Consumer("consumerB")).activate()
Example #25
0
class FeedParserFactory(Axon.Component.component):
    """
    FeedParserFactory() -> FeedParserFactory object
    
    It receives different feed URLs throught the "inbox" inbox 
    and returns each post parsed through the "outbox" outbox.
    
    This class can handles multiple concurrent petitions, retrieves
    the content of the feed and parses it with the feedparser library.
    The result is a feedparser.FeedParserDict per each feed URL 
    provided.
    """
    Inboxes = {
        "inbox"          : "Strings representing different URLs of feeds",
        "control"        : "From component...",
        "_parsed-feeds"  : "Parsed feeds retrieved from FeedParserFactory children", 
    }
    Outboxes = {
        "outbox"         : "feedparser.FeedParserDict object representing a parsed feed", 
        "signal"         : "From component...", 
        "_signal"        : "To the internal parsers",
    }
    def __init__(self, **argd):
        """x.__init__(...) initializes x; see x.__class__.__doc__ for signature"""
        super(FeedParserFactory, self).__init__(**argd)
        self.mustStop         = None
        self.providerFinished = False

    def makeFeedParser(self, feedUrl):
        """ 
        makeFeedParser(feedUrl) -> Pipeline
        
        It returns a pipeline which does not expect any input except for signals and
        sends the parsed data through the "outbox" outbox.
        """
        started(feedUrl)
        return Pipeline(
                OneShot(feedUrl), 
                SimpleHTTPClient(), # TODO: SimpleHTTPClient doesn't seem to have proxy support
            )
            
    def checkControl(self):
        while self.dataReady("control"):
            msg = self.recv("control")
            if isinstance(msg,producerFinished):
                self.providerFinished = True
            elif isinstance(msg,shutdownMicroprocess):
                self.mustStop = msg
        return self.mustStop, self.providerFinished
        
    def handleChildTerminations(self): #taken from Carousel.py
        for child in self.childComponents():
            if child._isStopped():
                self.removeChild(child)
                
    def initiateInternalSplitter(self):
        self.internalSplitter = PlugSplitter()
        self.link((self,'_signal'), (self.internalSplitter, 'control'))
        self.addChildren(self.internalSplitter)
        self.internalSplitter.activate()
        
    def linkChildToInternalSplitter(self, child):
        forwarder = Forwarder()
        plug = Plug(self.internalSplitter,  forwarder)
        plug.activate()
        plug.link((plug, 'signal'), (child, 'control'))
        child.link((child, 'signal'), (plug, 'control'))
        
    def createChild(self, feed):
        child = self.makeFeedParser(feed.url)
        child = Pipeline(child, Feedparser(feed.url))
        self.link( (child, 'outbox'), (self, '_parsed-feeds') )
        self.linkChildToInternalSplitter(child)
        return child
        
    def waitForChildren(self, signalMessage):
        self.send(signalMessage,"_signal")
        while len(self.childComponents()) > 0:
            self.handleChildTerminations()
            yield 1
        
    def main(self):
        self.initiateInternalSplitter()
        yield 1
        
        while True:
            mustStop, providerFinished = self.checkControl()
            if mustStop:
                self.send(mustStop,"signal")
                return
            
            self.handleChildTerminations()
            
            while self.dataReady("inbox"):
                feed = self.recv("inbox")
                child = self.createChild(feed)
                self.addChildren(child)
                child.activate()
                
            while self.dataReady("_parsed-feeds"):
                parseddata = self.recv("_parsed-feeds")
                self.send(parseddata,"outbox")
                
            if providerFinished and len(self.childComponents()) == 1:
                # TODO: CHECK IF THIS IS THE PROBLEM
                # It's actually only waiting for the plugsplitter
                for _ in self.waitForChildren(producerFinished(self)):
                    yield 1
                pfinished = producerFinished(self)
                self.send(pfinished,"signal")
                return
                
            if not self.anyReady():
                self.pause()
            yield 1
Example #26
0
    def start(self):
        channels_plugsplitter = PlugSplitter()
        feeds_plugsplitter = PlugSplitter()
        posts_plugsplitter = PlugSplitter()
        config_plugsplitter = PlugSplitter()
        config_parser_finished_plugsplitter = PlugSplitter()

        self.createPosts2fileManager(channels_plugsplitter, feeds_plugsplitter,
                                     posts_plugsplitter, config_plugsplitter,
                                     'rssTemplateName',
                                     'rssFileName').activate()
        self.createPosts2fileManager(channels_plugsplitter, feeds_plugsplitter,
                                     posts_plugsplitter, config_plugsplitter,
                                     'htmlTemplateName',
                                     'htmlFileName').activate()

        self.component = Graphline(
            XML_PARSER=self.create_xml_parser(),
            CONFIG_PARSER=ConfigFileParser(),
            FEED_PARSER_FACTORY=FeedParserFactory(),
            CHANNELS_SUBSCRIBER=self.subscribeToPlugsplitter(
                channels_plugsplitter),
            CHANNELS_SPLITTER=channels_plugsplitter,
            POST_SORTER=PostSorter(),
            POSTS_SUBSCRIBER=self.subscribeToPlugsplitter(posts_plugsplitter),
            POSTS_SPLITTER=posts_plugsplitter,
            FEEDS_SUBSCRIBER=self.subscribeToPlugsplitter(feeds_plugsplitter),
            FEEDS_SPLITTER=feeds_plugsplitter,
            CONFIG_SUBSCRIBER=self.subscribeToPlugsplitter(
                config_plugsplitter),
            CONFIG_SPLITTER=config_plugsplitter,
            CONFIG_PARSER_FINISHED_SUBS1=self.subscribeToPlugsplitter(
                config_parser_finished_plugsplitter),
            CONFIG_PARSER_FINISHED_SUBS2=self.subscribeToPlugsplitter(
                config_parser_finished_plugsplitter),
            CONFIG_PARSER_FINISHED_SUBS3=self.subscribeToPlugsplitter(
                config_parser_finished_plugsplitter),
            CONFIG_PARSER_FINISHED=config_parser_finished_plugsplitter,
            linkages={
                ('XML_PARSER', 'outbox'): ('CONFIG_PARSER', 'inbox'),
                ('CONFIG_PARSER', 'feeds-outbox'):
                ('CHANNELS_SPLITTER', 'inbox'),
                ('CONFIG_PARSER', 'config-outbox'):
                ('CONFIG_SPLITTER', 'inbox'),
                ('CONFIG_SUBSCRIBER', 'outbox'): ('POST_SORTER',
                                                  'config-inbox'),
                ('CHANNELS_SUBSCRIBER', 'outbox'): ('FEED_PARSER_FACTORY',
                                                    'inbox'),
                ('FEED_PARSER_FACTORY', 'outbox'): ('FEEDS_SPLITTER', 'inbox'),
                ('FEEDS_SUBSCRIBER', 'outbox'): ('POST_SORTER', 'inbox'),
                ('POST_SORTER', 'outbox'): ('POSTS_SPLITTER', 'inbox'),

                # Signals
                ('XML_PARSER', 'signal'): ('CONFIG_PARSER', 'control'),
                ('CONFIG_PARSER', 'signal'): ('CONFIG_PARSER_FINISHED',
                                              'control'),
                ('CONFIG_PARSER_FINISHED_SUBS1', 'signal'):
                ('FEED_PARSER_FACTORY', 'control'),
                ('CONFIG_PARSER_FINISHED_SUBS2', 'signal'):
                ('CHANNELS_SPLITTER', 'control'),
                ('CONFIG_PARSER_FINISHED_SUBS3', 'signal'): ('CONFIG_SPLITTER',
                                                             'control'),
                ('FEED_PARSER_FACTORY', 'signal'): ('POST_SORTER', 'control'),
                ('POST_SORTER', 'signal'): ('POSTS_SPLITTER', 'control'),
                ('POSTS_SUBSCRIBER', 'signal'): ('FEEDS_SPLITTER', 'control'),
            })
Example #27
0
 def initiateInternalSplitter(self):
     self.internalSplitter = PlugSplitter()
     self.link((self,'_signal'), (self.internalSplitter, 'control'))
     self.addChildren(self.internalSplitter)
     self.internalSplitter.activate()