# HG changeset patch # User prologic # Date 1324037891 -36000 # Node ID 9c27ee47262a3e16870724f309385156cbdade2f # Parent 695978aaf92c8583bf211dbaa4f8288bb5995305 # Parent 309511a9ae5ee7fef67df87f9b7248f947fc9b03 Merged with aspidites - Fixing issue with WIndows and unix related improts diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f .hgchurn --- a/.hgchurn Fri Dec 16 06:01:19 2011 -0600 +++ b/.hgchurn Fri Dec 16 22:18:11 2011 +1000 @@ -5,6 +5,7 @@ holger@merlinux.eu = Holger Krekel toni@playsign.net = Toni Alatalo root@localhost = James Mills +aspidites = Edwin Marshall dsuch = Dariusz Suchojad jamesmills = James Mills jaemsmills = James Mills diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f .hgtags --- a/.hgtags Fri Dec 16 06:01:19 2011 -0600 +++ b/.hgtags Fri Dec 16 22:18:11 2011 +1000 @@ -34,3 +34,9 @@ f572915d5b78ea570c3008588bbc006cda8963a2 1.5 f572915d5b78ea570c3008588bbc006cda8963a2 1.5 2c8f6603dccf38e3e052db4675056d17089f37df 1.5 +85fd4941cc0369eef29134b4c606a9441e4b607d 1.6 +85fd4941cc0369eef29134b4c606a9441e4b607d 1.6 +ac4e2474236e59d5d73c5ad7b9f4da25cd2701f9 1.6 +ac4e2474236e59d5d73c5ad7b9f4da25cd2701f9 1.6 +bdaa579d1f825b835055ebc4669272f79f4b32b1 1.6 +18f0db0026e726e55af8fc62752569a5d9e6bde3 1.6 diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f CHANGES --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CHANGES Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,4 @@ +circuits-1.6.1 YYYYMMDD +----------------------- + +- Fixed missing import of sys in ``circuits.io`` diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f RELEASE.rst --- a/RELEASE.rst Fri Dec 16 06:01:19 2011 -0600 +++ b/RELEASE.rst Fri Dec 16 22:18:11 2011 +1000 @@ -6,9 +6,9 @@ ................ This is the third attempt at getting Python 3 support for circuits working -while still maintaining Python 2 compatibility. These release finally adds +while still maintaining Python 2 compatibility. This release finally adds full support for Python 3 as well as maintaining compatibility with Python -2.6 and 2.7 with the same codebase. +2.6 and 2.7 with the same code-base. .. note:: Python 2.5 support has been dropped as of this release and will no @@ -16,6 +16,17 @@ specifically for Python 2.5 if required. +Greenlet Support +................ + +circuits now includes two new primitives which work by integrating +`greenlet `_. + +- ``.waitEvent(...)`` -- Wait for the given event to complete. +- ``.callEvent(...)`` -- Call event handlers for the given event. + +.. note:: These new primitives add (*as long as greenlet is installed*) the ability to write semi-synchronous code in your event handlers while still taking full advantage of the asynchronous and component framework that circuits has to offer. + Code Coverage ............. @@ -26,10 +37,56 @@ Features ........ -... +- Added an example WebSockets server using circuits.web +- Added support for specifying a ``Poll`` instance to use when using the + ``@future`` decorator to create "future" event handlers. +- Added ``add_section``, ``has_section`` and ``set`` methods to + ``app.config.Config`` Component. +- Added support for running test suite with distutils ``python setup.py + test``. +- Added a ``_on_signal`` event handler on the ``BaseEnvironment`` Component + so that environments can be reloaded by listening to ``SIGHUP`` signals. +- Added support for using absolute paths in ``app.env.Environment``. +- Added support in circuits.web ``HTTP`` protocol to limit the no. of + header fragments. This prevents OOM exploits. +- Added a ticks limit to waitEvent +- Added deprecation warnings for .push .add and .remove methods +- NEW ``Loader`` Component in ``circuits.core`` for simple plugin support. +- NEW ``app.env`` and ``app.config`` modules including a new ``app.startup`` + modules integrating a common startup for applications. +- NEW ``KQueue`` poller Bug Fixes ......... -... +- Fixed Issue #17 +- Renamed ``circuits.web.main`` module to ``circuits.web.__main__`` so that + ``python -m circuits.web`` just works. +- Fixed ``Server.host`` and ``Server.port`` properties in + ``circuits.net.sockets``. +- Fixed Issue #19 +- Fixed ``app.Daemon`` Component to correctly open the stderr file. +- Fixed triggering of ``Success`` events. +- Fixed duplicate broadcast handler in ``UDPServer`` +- Fixed duplicate ``Disconnect`` event from being triggered twice on + ``Client`` socket components. +- Removed dynamic timeout code from ``Select`` poller. +- Fixed a bug in the circuits.web ``HTTP`` protocol where headers were + not being buffered per client. +- Fixes a missing Event ``Closed()`` not being triggered for ``UDPServer``. +- Make underlying ``UDPServer`` socket reusable by setting ``SO_REUSEADDR`` +- Fixes Server socket being discarded twice on close + disconnect +- Socket.write now expects bytes (bytes for python3 and str for python2) +- Better handling of encoding in HTTP Component (allow non utf-8 encoding) +- Always encode http headers in utf-8 +- Fixes error after getting socket.ERRCONNREFUSED +- Allows TCPClient to bind to a specific port +- Improved docs +- Handles closing of udpserver socket when no client is connected +- Adds an unregister handler for components +- Allows utils.kill to work from a different thread +- Fixes bug when handling "*" in channels and targets +- Fixes a bug that could occur when unregistering components +- Fixes for CPU usage problems when using circuits with no I/O pollers + and using a Timer for timed events diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/app/daemon.py --- a/circuits/app/daemon.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/app/daemon.py Fri Dec 16 22:18:11 2011 +1000 @@ -5,7 +5,7 @@ """Daemon Component Component to daemonizae a system into the background and detach it from its -controlling PTY. Supports pid file writing, logging stdin, stdout and stderr +controlling PTY. Supports PID file writing, logging stdin, stdout and stderr and changing the current working directory. """ @@ -120,14 +120,14 @@ os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(se.fileno(), sys.stderr.fileno()) - self.push(WritePID()) + self.fire(WritePID()) @handler("started", filter=True, priority=100.0, target="*") def _on_started(self, manager, mode): if not manager == self and mode is None: - self.push(Daemonize()) + self.fire(Daemonize()) @handler("registered") def _on_registered(self, component, manager): if component == self and manager == self and manager.root.running: - self.push(Daemonize()) + self.fire(Daemonize()) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/app/env.py --- a/circuits/app/env.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/app/env.py Fri Dec 16 22:18:11 2011 +1000 @@ -80,7 +80,7 @@ class Verify(EnvironmentEvent): - """Verify EEnvironment Event""" + """Verify Environment Event""" success = "verify_success", EnvironmentEvent._target failure = "verify_failure", EnvironmentEvent._target @@ -120,7 +120,7 @@ @handler("load", priority=1.0) def load(self, verify=False): if verify: - return self.push(Verify()) + return self.fire(Verify()) else: return self._load() @@ -179,11 +179,11 @@ "path": self.path, } self.config.set(section, option, value) - return self.push(config.Save(), target=self.config) + return self.fire(config.Save(), target=self.config) def _load(self): # Create Config Component configfile = joinpath(self.path, "conf", "%s.ini" % self.envname) self.config = Config(configfile).register(self) - self.push(config.Load(), target=self.config) + self.fire(config.Load(), target=self.config) return True diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/app/startup.py --- a/circuits/app/startup.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/app/startup.py Fri Dec 16 22:18:11 2011 +1000 @@ -70,11 +70,11 @@ @handler("signal", target="*") def _on_signal(self, signal, track): if signal in (SIGINT, SIGTERM): - self.push(Terminate()) + self.fire(Terminate()) @handler("environment_loaded", target="env") def _on_environment_loaded(self, *args): - self.push(Command(), self.command, self) + self.fire(Command(), self.command, self) @handler("started") def _on_started(self, component, mode): @@ -82,17 +82,17 @@ if not os.path.exists(self.env.path): raise Error("Environment does not exist!") else: - self.push(LoadEnvironment(), target=self.env) + self.fire(LoadEnvironment(), target=self.env) else: if os.path.exists(self.env.path): raise Error("Environment already exists!") else: - self.push(Command(), self.command, self) + self.fire(Command(), self.command, self) @handler("start") def _on_start(self): if self.opts.daemon: - pidfile = self.env.config.get("general", "pidfile", "dap.pid") + pidfile = self.env.config.get("general", "pidfile", "app.pid") Daemon(pidfile, self.env.path).register(self) @handler("stop") @@ -108,9 +108,9 @@ @handler("restart") def _on_restart(self): - self.push(Command(), "stop", self.channel) + self.fire(Command(), "stop", self.channel) sleep(1) - self.push(Command(), "start", self.channel) + self.fire(Command(), "start", self.channel) @handler("rehash") def _on_rehash(self): @@ -120,8 +120,8 @@ @handler("init") def _on_init(self): - self.push(CreateEnvironment(), target=self.env) + self.fire(CreateEnvironment(), target=self.env) @handler("upgrade") def _on_upgrade(self): - self.push(UpgradeEnvironment(), target=self.env) + self.fire(UpgradeEnvironment(), target=self.env) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/core/bridge.py --- a/circuits/core/bridge.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/core/bridge.py Fri Dec 16 22:18:11 2011 +1000 @@ -59,14 +59,14 @@ try: eid = self._values[value] s = dumps((eid, value), -1) - self.push(Write(s), target=self._socket) + self.fire(Write(s), target=self._socket) except: return def _process(self, id, obj): if isinstance(obj, Event): obj.remote = True - value = self._manager.push(obj) + value = self._manager.fire(obj) self._values[value] = id value.manager = self._manager value.onSet = "value", @@ -87,7 +87,7 @@ eid = id(event) self._values[eid] = event.value s = dumps((eid, event)) - self.push(Write(s), target=self._socket) + self.fire(Write(s), target=self._socket) except: return diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/core/components.py --- a/circuits/core/components.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/core/components.py Fri Dec 16 22:18:11 2011 +1000 @@ -4,7 +4,7 @@ """Components -This module definse the BaseComponent and the subclassed Component +This module defines the BaseComponent and the subclass Component """ from itertools import chain @@ -13,7 +13,7 @@ from .utils import findroot from .manager import Manager -from .handlers import HandlerMetaClass +from .handlers import HandlerMetaClass, handler from .events import Registered, Unregistered import collections @@ -82,7 +82,7 @@ handlers = [v for k, v in getmembers(self, p)] for handler in handlers: target = handler.target or getattr(self, "channel", "*") - self.add(handler, target=target) + self.addHandler(handler, target=target) else: for handler in chain(self._globals, self._handlers): kwargs = {} @@ -94,11 +94,11 @@ del kwargs["channels"] else: channels = () - manager.add(handler, *channels, **kwargs) + manager.addHandler(handler, *channels, **kwargs) def _unregisterHandlers(self, manager): for handler in self._handlers.copy(): - manager.remove(handler) + manager.removeHandler(handler) def register(self, manager): """Register all Event Handlers with the given Manager @@ -107,9 +107,9 @@ given Manager. By default, every Component (Base Component) is registered with itself. - Iif the Component or Manager being registered + If the Component or Manager being registered with is not the current Component, then any Hidden Components - in registered to this Component will also be regsitered with the + in registered to this Component will also be registered with the given Manager. A Registered Event will also be sent. """ @@ -140,6 +140,11 @@ return self + @handler('unregister') + def on_unregister(self, component=None): + if component == self or component == None: + self.unregister() + def unregister(self): """Unregister all registered Event Handlers @@ -148,7 +153,6 @@ @note: It's possible to unregister a Component from itself! """ - def _unregister(c, m, r): c._unregisterHandlers(m) c.root = self diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/core/debugger.py --- a/circuits/core/debugger.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/core/debugger.py Fri Dec 16 22:18:11 2011 +1000 @@ -4,7 +4,7 @@ """ Debugger component used to debug each event in a system by printing -each event to sys.stderr or to a Logger Component instnace. +each event to sys.stderr or to a Logger Component instance. """ import os @@ -74,9 +74,11 @@ if self.logger is not None: self.logger.error("".join(s)) else: - self.file.write("".join(s)) - # Bugged on py2 - #self.file.flush() + try: + self.file.write("".join(s)) + self.file.flush() + except IOError: + pass @handler(priority=100.0) def _on_event(self, event, *args, **kwargs): @@ -102,6 +104,9 @@ if self.logger is not None: self.logger.debug(s) else: - self.file.write(s) - self.file.write("\n") - self.file.flush() + try: + self.file.write(s) + self.file.write("\n") + self.file.flush() + except IOError: + pass diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/core/events.py --- a/circuits/core/events.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/core/events.py Fri Dec 16 22:18:11 2011 +1000 @@ -4,7 +4,7 @@ """Events -This module define the basic Event object and commmon events. +This module define the basic Event object and common events. """ class Event(object): @@ -27,7 +27,7 @@ :param args: list of arguments :type args: tuple - :param kwargs: dct of keyword arguments + :param kwargs: dict of keyword arguments :type kwargs: dict """ @@ -169,16 +169,16 @@ class Failure(Event): """Failure Event - This Event is sent when an error has occured with the execution of an + This Event is sent when an error has occurred with the execution of an Event Handlers. - :param evt: The event that failued + :param evt: The event that failed :type evt: Event :param handler: The handler that failed :type handler: @handler - :param error: A tuple containing the exception that occured + :param error: A tuple containing the exception that occurred :type error: (etype, evalue, traceback) """ @@ -315,6 +315,20 @@ super(Registered, self).__init__(component, manager) + +class Unregister(Event): + """Unregister Event + + This Event ask for a Component to unregister from its + Component or Manager. + """ + + def __init__(self, component=None): + "x.__init__(...) initializes x; see x.__class__.__doc__ for signature" + + super(Unregister, self).__init__(component) + + class Unregistered(Event): """Unregistered Event diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/core/futures.py --- a/circuits/core/futures.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/core/futures.py Fri Dec 16 22:18:11 2011 +1000 @@ -4,7 +4,15 @@ """Futures -... +circuits supports the concept of "future" events. In circuits futures are +event handlers that are specially designed to be run in the background +either in a Thread or a Process. If you have event handlers that may +potentially "block" then wrapping them by the @future decorator unblocks +the bottle-neck caused by the "blocking" event handler(s). + +Support for using a Thread or Process pool is also supported by specifying +an optional `pool` keyword argument and supplying an instance to a +``circuits.core.pool.Pool``. """ from uuid import uuid4 as uuid @@ -34,9 +42,9 @@ p = findcmp(self.root, Pool) if p is not None: setattr(self, "_pool", p) - return self.push(Task(f, self, *args, **kwargs), target=p) + return self.fire(Task(f, self, *args, **kwargs), target=p) else: - return Worker(channel=str(uuid())).push( + return Worker(channel=str(uuid())).fire( Task(f, self, *args, **kwargs)) wrapper.event = True return update_wrapper(wrapper, f) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/core/manager.py --- a/circuits/core/manager.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/core/manager.py Fri Dec 16 22:18:11 2011 +1000 @@ -305,7 +305,7 @@ Use :py:meth:`addHandler` instead. """ - warn(DeprecationWarning("Use .addHandler(...) instead")) + warn(DeprecationWarning("Use .addHandler(...) instead"), DeprecationWarning, 2) return self.addHandler(*args, **kwargs) @@ -341,12 +341,12 @@ (target, channel) = channel - if target in self._tmap and handler in self._tmap: + if target in self._tmap and handler in self._tmap[target]: self._tmap[target].remove(handler) if not self._tmap[target]: del self._tmap[target] - if channel in self._cmap and handler in self._cmap: + if channel in self._cmap and handler in self._cmap[channel]: self._cmap[channel].remove(handler) if not self._cmap[channel]: del self._cmap[channel] @@ -421,7 +421,7 @@ Use :py:meth:`fire` instead. """ - warn(DeprecationWarning("Use .fire(...) instead")) + warn(DeprecationWarning("Use .fire(...) instead"), DeprecationWarning, 2) return self.fire(*args, **kwargs) @@ -461,7 +461,7 @@ def callEvent(self, event, channel=None, target=None): self.fire(event, channel, target) e = self.waitEvent(event) - return e.value.value + return e.value call = callEvent @@ -491,11 +491,13 @@ retval = None handler = None - for handler in self._getHandlers(channel): + handlers = self._getHandlers(channel) + handlerattrs = self._handlerattrs.copy() + + for handler in handlers[:]: error = None - - attrs = self._handlerattrs[handler] event.handler = handler + attrs = handlerattrs[handler] try: if attrs["event"]: @@ -582,18 +584,19 @@ self.tick() def tick(self): - if self._ticks: + for f in self._ticks.copy(): try: - [f() for f in self._ticks.copy()] + f() except (KeyboardInterrupt, SystemExit): raise except: etype, evalue, etraceback = _exc_info() self.fire(Error(etype, evalue, format_tb(etraceback))) + + if self: + self.flush() else: - sleep(TIMEOUT) # Nothing to do - Let's not tie up the CUP - - self._flush() + sleep(TIMEOUT) def run(self, *args, **kwargs): log = kwargs.get("log", True) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/core/pollers.py --- a/circuits/core/pollers.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/core/pollers.py Fri Dec 16 22:18:11 2011 +1000 @@ -147,11 +147,11 @@ for sock in w: if self.isWriting(sock): - self.push(Write(sock), "_write", self.getTarget(sock)) + self.fire(Write(sock), "_write", self.getTarget(sock)) for sock in r: if self.isReading(sock): - self.push(Read(sock), "_read", self.getTarget(sock)) + self.fire(Read(sock), "_read", self.getTarget(sock)) class Poll(BasePoller): @@ -235,19 +235,19 @@ fd = self._map[fileno] if event & self._disconnected_flag and not (event & select.POLLIN): - self.push(Disconnect(fd), "_disconnect", self.getTarget(fd)) + self.fire(Disconnect(fd), "_disconnect", self.getTarget(fd)) self._poller.unregister(fileno) super(Poll, self).discard(fd) del self._map[fileno] else: try: if event & select.POLLIN: - self.push(Read(fd), "_read", self.getTarget(fd)) + self.fire(Read(fd), "_read", self.getTarget(fd)) if event & select.POLLOUT: - self.push(Write(fd), "_write", self.getTarget(fd)) + self.fire(Write(fd), "_write", self.getTarget(fd)) except Exception as e: - self.push(Error(fd, e), "_error", self.getTarget(fd)) - self.push(Disconnect(fd), "_disconnect", self.getTarget(fd)) + self.fire(Error(fd, e), "_error", self.getTarget(fd)) + self.fire(Disconnect(fd), "_disconnect", self.getTarget(fd)) self._poller.unregister(fileno) super(Poll, self).discard(fd) del self._map[fileno] @@ -335,19 +335,19 @@ fd = self._map[fileno] if event & self._disconnected_flag and not (event & select.POLLIN): - self.push(Disconnect(fd), "_disconnect", self.getTarget(fd)) + self.fire(Disconnect(fd), "_disconnect", self.getTarget(fd)) self._poller.unregister(fileno) super(EPoll, self).discard(fd) del self._map[fileno] else: try: if event & select.EPOLLIN: - self.push(Read(fd), "_read", self.getTarget(fd)) + self.fire(Read(fd), "_read", self.getTarget(fd)) if event & select.EPOLLOUT: - self.push(Write(fd), "_write", self.getTarget(fd)) + self.fire(Write(fd), "_write", self.getTarget(fd)) except Exception as e: - self.push(Error(fd, e), "_error", self.getTarget(fd)) - self.push(Disconnect(fd), "_disconnect", self.getTarget(fd)) + self.fire(Error(fd, e), "_error", self.getTarget(fd)) + self.fire(Disconnect(fd), "_disconnect", self.getTarget(fd)) self._poller.unregister(fileno) super(EPoll, self).discard(fd) del self._map[fileno] @@ -420,13 +420,13 @@ sock = self._map[event.ident] if event.flags & select.KQ_EV_ERROR: - self.push(Error(sock, "error"), "_error", self.getTarget(sock)) + self.fire(Error(sock, "error"), "_error", self.getTarget(sock)) elif event.flags & select.KQ_EV_EOF: - self.push(Disconnect(sock), "_disconnect", self.getTarget(sock)) + self.fire(Disconnect(sock), "_disconnect", self.getTarget(sock)) elif event.filter == select.KQ_FILTER_WRITE: - self.push(Write(sock), "_write", self.getTarget(sock)) + self.fire(Write(sock), "_write", self.getTarget(sock)) elif event.filter == select.KQ_FILTER_READ: - self.push(Read(sock), "_read", self.getTarget(sock)) + self.fire(Read(sock), "_read", self.getTarget(sock)) Poller = Select diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/core/pools.py --- a/circuits/core/pools.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/core/pools.py Fri Dec 16 22:18:11 2011 +1000 @@ -46,4 +46,4 @@ if not assigned: worker = choice(self._workers) assigned = worker.channel - return worker.push(Task(f, *args, **kwargs), target=worker) + return worker.fire(Task(f, *args, **kwargs), target=worker) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/core/timers.py --- a/circuits/core/timers.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/core/timers.py Fri Dec 16 22:18:11 2011 +1000 @@ -45,7 +45,7 @@ def __tick__(self): if time() > self._eTime: - self.push(self.e, self.c, self.t) + self.fire(self.e, self.c, self.t) if self.persist: self.reset() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/io/__init__.py --- a/circuits/io/__init__.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/io/__init__.py Fri Dec 16 22:18:11 2011 +1000 @@ -2,219 +2,23 @@ # Date: 4th August 2004 # Author: James Mills -"""I/O Components +"""I/O Support This package contains various I/O Components. Provided are a a generic File Component, StdIn, StdOut and StdErr components. Instances of StdIn, StdOUt and StdErr are also created by importing this package. """ -import os import sys -import errno -import select -from collections import deque -from circuits.tools import tryimport -from circuits.core import Event, Component +from .file import File +from .serial import Serial +from .events import Close, Seek, Write -fcntl = tryimport("fcntl") -serial = tryimport("serial") - -TIMEOUT = 0.2 -BUFSIZE = 4096 - - -class EOF(Event): - """EOF Event""" - - -class Seek(Event): - """Seek Event""" - - -class Read(Event): - """Read Event""" - - -class Close(Event): - """Close Event""" - - -class Write(Event): - """Write Event""" - - -class Error(Event): - """Error Event""" - - -class Opened(Event): - """Opened Event""" - - -class Closed(Event): - """Closed Event""" - - -class File(Component): - - channel = "file" - - def __init__(self, filename=None, mode="r", fd=None, autoclose=True, - bufsize=BUFSIZE, encoding="utf-8", channel=channel): - super(File, self).__init__(channel=channel) - - self.bufsize = bufsize - self.encoding = encoding - self.autoclose = autoclose - - if filename is not None: - self.mode = mode - self.filename = filename - self._fd = open(filename, mode) - else: - self._fd = fd - self.mode = fd.mode - self.filename = fd.name - - if fcntl is not None: - # Set non-blocking file descriptor (non-portable) - flag = fcntl.fcntl(self._fd, fcntl.F_GETFL) - flag = flag | os.O_NONBLOCK - fcntl.fcntl(self._fd, fcntl.F_SETFL, flag) - - self._read = [] - self._write = [] - self._buffer = deque() - - if any([m for m in "r+" if m in self._fd.mode]): - self._read.append(self._fd) - - self.push(Opened(self.filename), "opened") - - @property - def closed(self): - return self._fd.closed if hasattr(self, "_fd") else None - - def __tick__(self, wait=TIMEOUT): - if not self.closed: - try: - r, w, e = select.select(self._read, self._write, [], wait) - except select.error as error: - if not error[0] == errno.EINTR: - self.push(Error(error), "error") - return - - if w and self._buffer: - data = self._buffer.popleft() - try: - if isinstance(data, str): - data = data.encode(self.encoding) - bytes = os.write(self._fd.fileno(), data) - if bytes < len(data): - self._buffer.append(data[bytes:]) - elif not self._buffer: - self._write.remove(self._fd) - except OSError as error: - self.push(Error(error), "error") - - if r: - try: - data = os.read(self._fd.fileno(), self.bufsize) - except IOError as e: - if e[0] == errno.EBADF: - data = None - - if data: - self.push(Read(data), "read") - elif self.autoclose: - self.push(EOF()) - self.close() - - def write(self, data): - if self._fd not in self._write: - self._write.append(self._fd) - self._buffer.append(data) - - def close(self): - self._fd.close() - self._read = [] - self._write = [] - self.push(Closed(self.filename), "closed") - - def seek(self, offset, whence=0): - self._fd.seek(offset, whence) - - -class Serial(Component): - - channel = "serial" - - def __init__(self, port, baudrate=115200, bufsize=BUFSIZE, - timeout=TIMEOUT, channel=channel): - super(Serial, self).__init__(channel=channel) - - if serial is None: - raise RuntimeError("No serial support available") - - self.port = port - self.baudrate = baudrate - - self._serial = serial.Serial() - self._serial.port = port - self._serial.baudrate = baudrate - - if os.name == "posix": - self._serial.timeout = 0 # non-blocking (POSIX) - else: - self._serial.timeout = timeout - - self._buffer = deque() - self._bufsize = bufsize - self._timeout = timeout - - self._read = [] - self._write = [] - - self._serial.open() - self._fd = self._serial.fileno() - - self._read.append(self._fd) - - self.push(Opened(self.port)) - - def __tick__(self): - r, w, e = select.select(self._read, self._write, [], self._timeout) - - if w and self._buffer: - data = self._buffer.popleft() - try: - bytes = os.write(self._fd, data) - if bytes < len(data): - self._buffer.append(data[bytes:]) - else: - if not self._buffer and self._fd in self._write: - self._write.remove(self._fd) - except OSError as error: - self.push(Error(error)) - - if r: - data = os.read(self._fd, self._bufsize) - if data: - self.push(Read(data)) - - def write(self, data): - if self._fd not in self._write: - self._write.append(self._fd) - self._buffer.append(data) - - def close(self): - self._fd = None - self._read = [] - self._write = [] - self._serial.close() - self.push(Closed(self.port)) +try: + from .notify import Notify +except: + pass try: stdin = File(fd=sys.stdin, mode="r", channel="stdin") diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/io/events.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/circuits/io/events.py Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,42 @@ +# Module: events +# Date: 10th June 2011 +# Author: James Mills + +"""I/O Events + +This module implements commonly used I/O events used by other I/O modules. +""" + +from circuits.core import Event + + +class EOF(Event): + """EOF Event""" + + +class Seek(Event): + """Seek Event""" + + +class Read(Event): + """Read Event""" + + +class Close(Event): + """Close Event""" + + +class Write(Event): + """Write Event""" + + +class Error(Event): + """Error Event""" + + +class Opened(Event): + """Opened Event""" + + +class Closed(Event): + """Closed Event""" diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/io/file.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/circuits/io/file.py Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,113 @@ +# Module: file +# Date: 4th August 2004 +# Author: James Mills + +"""File I/O + +This module implements a wrapper for basic File I/O. +""" + +import os +import errno +import select +from collections import deque + +from circuits.core import Component +from circuits.tools import tryimport + +from .events import Closed, EOF, Error, Opened, Read + +fcntl = tryimport("fcntl") + +TIMEOUT = 0.2 +BUFSIZE = 4096 + + +class File(Component): + + channel = "file" + + def __init__(self, filename=None, mode="r", fd=None, autoclose=True, + bufsize=BUFSIZE, encoding="utf-8", channel=channel): + super(File, self).__init__(channel=channel) + + self.bufsize = bufsize + self.encoding = encoding + self.autoclose = autoclose + + if filename is not None: + self.mode = mode + self.filename = filename + self._fd = open(filename, mode) + else: + self._fd = fd + self.mode = fd.mode + self.filename = fd.name + + if fcntl is not None: + # Set non-blocking file descriptor (non-portable) + flag = fcntl.fcntl(self._fd, fcntl.F_GETFL) + flag = flag | os.O_NONBLOCK + fcntl.fcntl(self._fd, fcntl.F_SETFL, flag) + + self._read = [] + self._write = [] + self._buffer = deque() + + if any([m for m in "r+" if m in self._fd.mode]): + self._read.append(self._fd) + + self.fire(Opened(self.filename), "opened") + + @property + def closed(self): + return self._fd.closed if hasattr(self, "_fd") else None + + def __tick__(self, wait=TIMEOUT): + if not self.closed: + try: + r, w, e = select.select(self._read, self._write, [], wait) + except select.error as error: + if not error[0] == errno.EINTR: + self.fire(Error(error), "error") + return + + if w and self._buffer: + data = self._buffer.popleft() + try: + if isinstance(data, str): + data = data.encode(self.encoding) + bytes = os.write(self._fd.fileno(), data) + if bytes < len(data): + self._buffer.append(data[bytes:]) + elif not self._buffer: + self._write.remove(self._fd) + except OSError as error: + self.fire(Error(error), "error") + + if r: + try: + data = os.read(self._fd.fileno(), self.bufsize) + except IOError as e: + if e[0] == errno.EBADF: + data = None + + if data: + self.fire(Read(data), "read") + elif self.autoclose: + self.fire(EOF()) + self.close() + + def write(self, data): + if self._fd not in self._write: + self._write.append(self._fd) + self._buffer.append(data) + + def close(self): + self._fd.close() + self._read = [] + self._write = [] + self.fire(Closed(self.filename), "closed") + + def seek(self, offset, whence=0): + self._fd.seek(offset, whence) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/io/notify.py --- a/circuits/io/notify.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/io/notify.py Fri Dec 16 22:18:11 2011 +1000 @@ -18,10 +18,17 @@ except ImportError: raise Exception("No pyinotify support available. Is pyinotify installed?") -from circuits.core import Event, BaseComponent +from circuits.core import Event, Component MASK = ALL_EVENTS +class AddPath(Event): + """Add path to watch""" + channel = 'add_path' + +class RemovePath(Event): + """Remove path from watch""" + channel = 'remove_path' class Moved(Event): """Moved Event""" @@ -72,7 +79,7 @@ } -class Notify(BaseComponent): +class Notify(Component): channel = "notify" @@ -109,13 +116,13 @@ if mask & k: e = v(name, path, pathname, dir) c = e.name.lower() - self.push(e, c) + self.fire(e, c) - def add(self, path, mask=None, recursive=False): + def add_path(self, path, mask=None, recursive=False): mask = mask or MASK self._wm.add_watch(path, mask, rec=recursive) - def remove(self, path, recursive=False): + def remove_path(self, path, recursive=False): wd = self._wm.get_wd(path) if wd: self._wm.rm_watch(wd, rec=recursive) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/io/serial.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/circuits/io/serial.py Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,92 @@ +# Module: serial +# Date: 4th August 2004 +# Author: James Mills + +"""Serial I/O + +This module implements basic Serial (RS232) I/O. +""" + +import os +import select +from collections import deque + +from circuits.core import Component +from circuits.tools import tryimport + +from .events import Closed, Error, Opened, Read + +serial = tryimport("serial") + +TIMEOUT = 0.2 +BUFSIZE = 4096 + + +class Serial(Component): + + channel = "serial" + + def __init__(self, port, baudrate=115200, bufsize=BUFSIZE, + timeout=TIMEOUT, channel=channel): + super(Serial, self).__init__(channel=channel) + + if serial is None: + raise RuntimeError("No serial support available") + + self.port = port + self.baudrate = baudrate + + self._serial = serial.Serial() + self._serial.port = port + self._serial.baudrate = baudrate + + if os.name == "posix": + self._serial.timeout = 0 # non-blocking (POSIX) + else: + self._serial.timeout = timeout + + self._buffer = deque() + self._bufsize = bufsize + self._timeout = timeout + + self._read = [] + self._write = [] + + self._serial.open() + self._fd = self._serial.fileno() + + self._read.append(self._fd) + + self.fire(Opened(self.port)) + + def __tick__(self): + r, w, e = select.select(self._read, self._write, [], self._timeout) + + if w and self._buffer: + data = self._buffer.popleft() + try: + bytes = os.write(self._fd, data) + if bytes < len(data): + self._buffer.append(data[bytes:]) + else: + if not self._buffer and self._fd in self._write: + self._write.remove(self._fd) + except OSError as error: + self.fire(Error(error)) + + if r: + data = os.read(self._fd, self._bufsize) + if data: + self.fire(Read(data)) + + def write(self, data): + if self._fd not in self._write: + self._write.append(self._fd) + self._buffer.append(data) + + def close(self): + self._fd = None + self._read = [] + self._write = [] + self._serial.close() + self.fire(Closed(self.port)) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/net/protocols/http.py --- a/circuits/net/protocols/http.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/net/protocols/http.py Fri Dec 16 22:18:11 2011 +1000 @@ -49,7 +49,7 @@ cLen = int(self._response.headers.get("Content-Length", "0")) if cLen and self._response._body.tell() == cLen: self._response._body.seek(0) - self.push(Response(self._response)) + self.fire(Response(self._response)) self._response = None else: statusline, data = data.split(b"\r\n", 1) @@ -75,4 +75,4 @@ return response._body.seek(0) - self.push(Response(response)) + self.fire(Response(response)) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/net/protocols/irc.py --- a/circuits/net/protocols/irc.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/net/protocols/irc.py Fri Dec 16 22:18:11 2011 +1000 @@ -201,68 +201,68 @@ ### def RAW(self, data): - self.push(Write("%s\r\n" % data)) + self.fire(Write("%s\r\n" % data)) def PASS(self, password): - self.push(RAW("PASS %s" % password)) + self.fire(RAW("PASS %s" % password)) def USER(self, ident, host, server, name): - self.push(RAW("USER %s \"%s\" \"%s\" :%s" % ( + self.fire(RAW("USER %s \"%s\" \"%s\" :%s" % ( ident, host, server, name))) def NICK(self, nick): - self.push(RAW("NICK %s" % nick)) + self.fire(RAW("NICK %s" % nick)) def PING(self, server): - self.push(RAW("PING :%s" % server)) + self.fire(RAW("PING :%s" % server)) def PONG(self, server): - self.push(RAW("PONG :%s" % server)) + self.fire(RAW("PONG :%s" % server)) def QUIT(self, message="Leaving"): - self.push(RAW("QUIT :%s" % message)) + self.fire(RAW("QUIT :%s" % message)) def JOIN(self, channel, key=None): if key is None: - self.push(RAW("JOIN %s" % channel)) + self.fire(RAW("JOIN %s" % channel)) else: - self.push(RAW("JOIN %s %s" % (channel, key))) + self.fire(RAW("JOIN %s %s" % (channel, key))) def PART(self, channel, message="Leaving"): - self.push(RAW("PART %s :%s" % (channel, message))) + self.fire(RAW("PART %s :%s" % (channel, message))) def PRIVMSG(self, target, message): - self.push(RAW("PRIVMSG %s :%s" % (target, message))) + self.fire(RAW("PRIVMSG %s :%s" % (target, message))) def NOTICE(self, target, message): - self.push(RAW("NOTICE %s :%s" % (target, message))) + self.fire(RAW("NOTICE %s :%s" % (target, message))) def CTCP(self, target, type, message): - self.push(PRIVMSG(target, "%s %s" % (type, message))) + self.fire(PRIVMSG(target, "%s %s" % (type, message))) def CTCPREPLY(self, target, type, message): - self.push(NOTICE(target, "%s %s" % (type, message))) + self.fire(NOTICE(target, "%s %s" % (type, message))) def KICK(self, channel, target, message=""): - self.push(RAW("KICK %s %s :%s" % (channel, target, message))) + self.fire(RAW("KICK %s %s :%s" % (channel, target, message))) def TOPIC(self, channel, topic): - self.push(RAW("TOPIC %s :%s" % (channel, topic))) + self.fire(RAW("TOPIC %s :%s" % (channel, topic))) def MODE(self, modes, channel=None): if channel is None: - self.push(RAW("MODE :%s" % modes)) + self.fire(RAW("MODE :%s" % modes)) else: - self.push(RAW("MODE %s :%s" % (channel, modes))) + self.fire(RAW("MODE %s :%s" % (channel, modes))) def INVITE(self, target, channel): - self.push(RAW("INVITE %s %s" % (target, channel))) + self.fire(RAW("INVITE %s %s" % (target, channel))) def NAMES(self, channel=None): if channel: - self.push(RAW("NAMES %s" % channel)) + self.fire(RAW("NAMES %s" % channel)) else: - self.push(RAW("NAMES")) + self.fire(RAW("NAMES")) ### ### Event Processing @@ -281,7 +281,7 @@ tokens = line.split(" ") if tokens[0] == "PING": - self.push(Ping(strip(tokens[1]))) + self.fire(Ping(strip(tokens[1]))) elif re.match("[0-9]+", tokens[1]): source = strip(tokens[0]) @@ -295,7 +295,7 @@ arg = tokens[3] message = strip(" ".join(tokens[4:])) - self.push(Numeric(source, target, numeric, arg, message)) + self.fire(Numeric(source, target, numeric, arg, message)) elif tokens[1] == "PRIVMSG": source = sourceSplit(strip(tokens[0])) @@ -306,43 +306,43 @@ tokens = strip(message, color=True).split(" ") type = tokens[0] message = " ".join(tokens[1:]) - self.push(Ctcp(source, target, type, message)) + self.fire(Ctcp(source, target, type, message)) else: - self.push(Message(source, target, message)) + self.fire(Message(source, target, message)) elif tokens[1] == "NOTICE": source = sourceSplit(strip(tokens[0])) target = tokens[2] message = strip(" ".join(tokens[3:])) - self.push(Notice(source, target, message)) + self.fire(Notice(source, target, message)) elif tokens[1] == "JOIN": source = sourceSplit(strip(tokens[0])) channel = strip(tokens[2]) - self.push(Join(source, channel)) + self.fire(Join(source, channel)) elif tokens[1] == "PART": source = sourceSplit(strip(tokens[0])) channel = strip(tokens[2]) message = strip(" ".join(tokens[3:])) - self.push(Part(source, channel, message)) + self.fire(Part(source, channel, message)) elif tokens[1] == "QUIT": source = sourceSplit(strip(tokens[0])) message = strip(" ".join(tokens[2:])) - self.push(Quit(source, message)) + self.fire(Quit(source, message)) elif tokens[1] == "NICK": source = sourceSplit(strip(tokens[0])) newNick = strip(tokens[2]) - self.push(Nick(source, newNick)) + self.fire(Nick(source, newNick)) elif tokens[1] == "MODE": source = sourceSplit(strip(tokens[0])) target = tokens[2] modes = strip(" ".join(tokens[3:])) - self.push(Mode(source, target, modes)) + self.fire(Mode(source, target, modes)) ### ### Default Events @@ -358,7 +358,7 @@ or sending your own Pong reponse. """ - self.push(PONG(server)) + self.fire(PONG(server)) ### ### Errors and Numeric Replies diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/net/protocols/line.py --- a/circuits/net/protocols/line.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/net/protocols/line.py Fri Dec 16 22:18:11 2011 +1000 @@ -102,12 +102,12 @@ data, = args lines, self.buffer = self.splitter(data, self.buffer) for line in lines: - self.push(Line(line.decode(self.encoding, "replace"))) + self.fire(Line(line.decode(self.encoding, "replace"))) else: # Server read sock, data = args lines, buffer = self.splitter(data, self.getBuffer(sock)) self.updateBuffer(sock, buffer) for line in lines: - self.push(Line(sock, + self.fire(Line(sock, line.decode(self.encoding, "replace"))) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/net/sockets.py --- a/circuits/net/sockets.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/net/sockets.py Fri Dec 16 22:18:11 2011 +1000 @@ -19,13 +19,8 @@ from socket import gaierror, error as SocketError from socket import gethostname, gethostbyname, socket +from socket import AF_INET, IPPROTO_TCP, SOCK_STREAM, SOCK_DGRAM from socket import SOL_SOCKET, SO_BROADCAST, SO_REUSEADDR, TCP_NODELAY -from socket import AF_INET, IPPROTO_TCP, SOCK_STREAM, SOCK_DGRAM -try: - from socket import AF_UNIX -except: - # not running on Unix - pass try: from ssl import wrap_socket as ssl_socket @@ -284,26 +279,26 @@ if self._poller is None: if isinstance(component, BasePoller): self._poller = component - self.push(Ready(self), "ready", self.channel) + self.fire(Ready(self), "ready", self.channel) else: component = findcmp(self.root, BasePoller, subclass=False) if component is not None: self._poller = component - self.push(Ready(self), "ready", self.channel) + self.fire(Ready(self), "ready", self.channel) else: self._poller = Poller().register(self) - self.push(Ready(self), "ready", self.channel) + self.fire(Ready(self), "ready", self.channel) @handler("started", filter=True, target="*") def _on_started(self, component, mode): if self._poller is None: self._poller = Poller().register(self) - self.push(Ready(self), "ready", self.channel) + self.fire(Ready(self), "ready", self.channel) return True @handler("stopped", target="*") def _on_stopped(self, component): - self.push(Close(), "close", self.channel) + self.fire(Close(), "close", self.channel) def _close(self): if not self._connected: @@ -321,7 +316,7 @@ except SocketError: pass - self.push(Disconnected(), "disconnected", self.channel) + self.fire(Disconnected(), "disconnected", self.channel) def close(self): if not self._buffer: @@ -337,14 +332,14 @@ data = self._sock.recv(self._bufsize) if data: - self.push(Read(data), "read", self.channel) + self.fire(Read(data), "read", self.channel) else: self.close() except SocketError as e: if e.args[0] == EWOULDBLOCK: return else: - self.push(Error(e), "error", self.channel) + self.fire(Error(e), "error", self.channel) self._close() def _write(self, data): @@ -360,7 +355,7 @@ if e.args[0] in (EPIPE, ENOTCONN): self._close() else: - self.push(Error(e), "error", self.channel) + self.fire(Error(e), "error", self.channel) def write(self, data): if not self._poller.isWriting(self._sock): @@ -422,7 +417,7 @@ if r in (EISCONN, EWOULDBLOCK, EINPROGRESS, EALREADY): self._connected = True else: - self.push(Error(r), "error", self.channel) + self.fire(Error(r), "error", self.channel) return self._connected = True @@ -432,12 +427,14 @@ if self.secure: self._ssock = ssl_socket(self._sock, self.keyfile, self.certfile) - self.push(Connected(host, port), "connected", self.channel) + self.fire(Connected(host, port), "connected", self.channel) class UNIXClient(Client): def _create_socket(self): + from socket import AF_UNIX + sock = socket(AF_UNIX, SOCK_STREAM) if self._bind is not None: sock.bind(self._bind) @@ -471,7 +468,7 @@ if r in (EISCONN, EWOULDBLOCK, EINPROGRESS, EALREADY): self._connected = True else: - self.push(Error(r), "error", self.channel) + self.fire(Error(r), "error", self.channel) return self._connected = True @@ -481,7 +478,7 @@ if self.secure: self._ssock = ssl_socket(self._sock, self.keyfile, self.certfile) - self.push(Connected(gethostname(), path), "connected", self.channel) + self.fire(Connected(gethostname(), path), "connected", self.channel) class Server(Component): @@ -552,29 +549,29 @@ if isinstance(component, BasePoller): self._poller = component self._poller.addReader(self, self._sock) - self.push(Ready(self), "ready", self.channel) + self.fire(Ready(self), "ready", self.channel) else: component = findcmp(self.root, BasePoller, subclass=False) if component is not None: self._poller = component self._poller.addReader(self, self._sock) - self.push(Ready(self), "ready", self.channel) + self.fire(Ready(self), "ready", self.channel) else: self._poller = Poller().register(self) self._poller.addReader(self, self._sock) - self.push(Ready(self), "ready", self.channel) + self.fire(Ready(self), "ready", self.channel) @handler("started", filter=True, target="*") def _on_started(self, component, mode): if self._poller is None: self._poller = Poller().register(self) self._poller.addReader(self, self._sock) - self.push(Ready(self), "ready", self.channel) + self.fire(Ready(self), "ready", self.channel) return True @handler("stopped", target="*") def _on_stopped(self, component): - self.push(Close(), "close", self.channel) + self.fire(Close(), "close", self.channel) def _close(self, sock): if sock is None: @@ -598,7 +595,7 @@ except SocketError: pass - self.push(Disconnect(sock), "disconnect", self.channel) + self.fire(Disconnect(sock), "disconnect", self.channel) def close(self, sock=None): closed = sock is None @@ -616,7 +613,7 @@ self._closeq.append(sock) if closed: - self.push(Closed(), "closed", self.channel) + self.fire(Closed(), "closed", self.channel) def _read(self, sock): if sock not in self._clients: @@ -625,14 +622,14 @@ try: data = sock.recv(self._bufsize) if data: - self.push(Read(sock, data), "read", self.channel) + self.fire(Read(sock, data), "read", self.channel) else: self.close(sock) except SocketError as e: if e.args[0] == EWOULDBLOCK: return else: - self.push(Error(sock, e), "error", self.channel) + self.fire(Error(sock, e), "error", self.channel) self._close(sock) def _write(self, sock, data): @@ -645,7 +642,7 @@ self._buffers[sock].appendleft(data[nbytes:]) except SocketError as e: if e.args[0] not in (EINTR, EWOULDBLOCK, ENOBUFS): - self.push(Error(sock, e), "error", self.channel) + self.fire(Error(sock, e), "error", self.channel) self._close(sock) else: self._buffers[sock].appendleft(data) @@ -703,7 +700,7 @@ newsock.setblocking(False) self._poller.addReader(self, newsock) self._clients.append(newsock) - self.push(Connect(newsock, *host), "connect", self.channel) + self.fire(Connect(newsock, *host), "connect", self.channel) @handler("_disconnect", filter=True) def _on_disconnect(self, sock): @@ -747,6 +744,8 @@ class UNIXServer(Server): def _create_socket(self): + from socket import AF_UNIX + if os.path.exists(self._bind): os.unlink(self._bind) @@ -782,15 +781,18 @@ try: sock.shutdown(2) + except SocketError: + pass + try: sock.close() except SocketError: pass - self.push(Disconnect(sock), "disconnect", self.channel) + self.fire(Disconnect(sock), "disconnect", self.channel) @handler("close", override=True) def close(self): - self.push(Closed(), "closed", self.channel) + self.fire(Closed(), "closed", self.channel) if self._buffers[self._sock] and self._sock not in self._closeq: self._closeq.append(self._sock) @@ -801,12 +803,11 @@ try: data, address = self._sock.recvfrom(self._bufsize) if data: - self.push(Read(address, data), "read", self.channel) + self.fire(Read(address, data), "read", self.channel) except SocketError as e: if e.args[0] in (EWOULDBLOCK, EAGAIN): return - self.push(Error(self._sock, e), "error", self.channel) - print "Closing socket... (1)" + self.fire(Error(self._sock, e), "error", self.channel) self._close(self._sock) def _write(self, address, data): @@ -816,10 +817,9 @@ self._buffers[self._sock].appendleft(data[bytes:]) except SocketError as e: if e.args[0] in (EPIPE, ENOTCONN): - print "Closing socket... (2)" self._close(self._sock) else: - self.push(Error(self._sock, e), "error", self.channel) + self.fire(Error(self._sock, e), "error", self.channel) @handler("write", override=True) def write(self, address, data): @@ -833,7 +833,6 @@ @handler("_disconnect", filter=True, override=True) def _on_disconnect(self, sock): - print "Closing socket... (3)" self._close(sock) @handler("_read", filter=True, override=True) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/tools/__init__.py --- a/circuits/tools/__init__.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/tools/__init__.py Fri Dec 16 22:18:11 2011 +1000 @@ -11,6 +11,7 @@ from hashlib import md5 from warnings import warn +from circuits.core.events import Unregister def tryimport(modules, message=None): if isinstance(modules, str): diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/client.py --- a/circuits/web/client.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/client.py Fri Dec 16 22:18:11 2011 +1000 @@ -79,17 +79,17 @@ @handler("write") def write(self, data): if self._transport.connected: - self.push(Write(data), target=self._transport) + self.fire(Write(data), target=self._transport) @handler("close") def close(self): if self._transport.connected: - self.push(Close(), target=self._transport) + self.fire(Close(), target=self._transport) @handler("connect") def connect(self): if not self._transport.connected: - self.push(Connect(self._host, self._port, self._secure), + self.fire(Connect(self._host, self._port, self._secure), target=self._transport) @handler("request") @@ -98,9 +98,9 @@ headers = Headers([(k, v) for k, v in headers.items()]) command = "%s %s HTTP/1.1" % (method, path) message = "%s\r\n%s" % (command, headers) - self.push(Write(message.encode('utf-8')), target=self._transport) + self.fire(Write(message.encode('utf-8')), target=self._transport) if body: - self.push(Write(body), target=self._transport) + self.fire(Write(body), target=self._transport) else: raise NotConnected() @@ -108,7 +108,7 @@ def _on_response(self, response): self._response = response if response.headers.get("Connection") == "Close": - self.push(Close(), target=self._transport) + self.fire(Close(), target=self._transport) @property def connected(self): diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/dispatchers/dispatcher.py --- a/circuits/web/dispatchers/dispatcher.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/dispatchers/dispatcher.py Fri Dec 16 22:18:11 2011 +1000 @@ -169,4 +169,4 @@ if vpath: req.args += tuple(vpath) - return self.push(req, channel, target) + return self.fire(req, channel, target) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/dispatchers/jsonrpc.py --- a/circuits/web/dispatchers/jsonrpc.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/dispatchers/jsonrpc.py Fri Dec 16 22:18:11 2011 +1000 @@ -39,7 +39,7 @@ id = value.id response = value.response response.body = self._response(id, value.value) - self.push(Response(response), target=self.channel) + self.fire(Response(response), target=self.channel) value.handled = True @handler("request", filter=True, priority=0.1) @@ -62,9 +62,9 @@ t, c = self.target, method if type(params) is dict: - value = self.push(RPC(**params), c, t) + value = self.fire(RPC(**params), c, t) else: - value = self.push(RPC(*params), c, t) + value = self.fire(RPC(*params), c, t) value.id = id value.response = response diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/dispatchers/routes.py --- a/circuits/web/dispatchers/routes.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/dispatchers/routes.py Fri Dec 16 22:18:11 2011 +1000 @@ -153,7 +153,7 @@ if vpath: req.args += tuple(vpath) - return self.push(req, channel, target=target) + return self.fire(req, channel, target=target) @handler("registered", target="*") def _on_registered(self, event, component, manager): diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/dispatchers/websockets.py --- a/circuits/web/dispatchers/websockets.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/dispatchers/websockets.py Fri Dec 16 22:18:11 2011 +1000 @@ -87,14 +87,14 @@ @handler("write", target=WebSocketEvent._target) def _on_write(self, sock, data): payload = b'\x00' + data.encode("utf-8") + b'\xff' - self.push(Write(sock, payload)) + self.fire(Write(sock, payload)) @handler("value_changed", target=WebSocketEvent._target) def _on_value_changed(self, value): sock, message = value.event.args result, data = value.result, value.value if result and isinstance(data, basestring): - self.push(Write(sock, data), + self.fire(Write(sock, data), target=WebSocketEvent._target) @handler("read", filter=True) @@ -103,7 +103,7 @@ self._buffers[sock] += data messages = self._parse_messages(sock) for message in messages: - value = self.push(Message(sock, message)) + value = self.fire(Message(sock, message)) value.onSet = "value_changed", WebSocketEvent._target return True diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/dispatchers/xmlrpc.py --- a/circuits/web/dispatchers/xmlrpc.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/dispatchers/xmlrpc.py Fri Dec 16 22:18:11 2011 +1000 @@ -36,7 +36,7 @@ def _on_value_changed(self, value): response = value.response response.body = self._response(value.value) - self.push(Response(response), target=self.channel) + self.fire(Response(response), target=self.channel) value.handled = True @handler("request", filter=True, priority=0.1) @@ -55,7 +55,7 @@ else: t, c = self.target, method - value = self.push(RPC(*params), c, t) + value = self.fire(RPC(*params), c, t) value.response = response value.onSet = ("value_changed", self) except Exception as e: diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/events.py --- a/circuits/web/events.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/events.py Fri Dec 16 22:18:11 2011 +1000 @@ -13,38 +13,47 @@ _target = "web" + def __init__(self, *args, **kwargs): + if 'target' in kwargs: + self._target = kwargs.pop('target') + super(WebEvent, self).__init__(*args, **kwargs) + + class Request(WebEvent): """Request(WebEvent) -> Request WebEvent args: request, response """ - - success = "request_success", WebEvent._target - failure = "request_failure", WebEvent._target - filter = "request_filtered", WebEvent._target - start = "request_started", WebEvent._target - end = "request_completed", WebEvent._target + def __init__(self, *args, **kwargs): + super(Request, self).__init__(*args, **kwargs) + self.success = "request_success", self._target + self.failure = "request_failure", self._target + self.filter = "request_filtered", self._target + self.start = "request_started", self._target + self.end = "request_completed", self._target class Response(WebEvent): """Response(WebEvent) -> Response WebEvent args: request, response """ - - success = "response_success", WebEvent._target - failure = "response_failure", WebEvent._target - filter = "response_filtered", WebEvent._target - start = "response_started", WebEvent._target - end = "response_completed", WebEvent._target + def __init__(self, *args, **kwargs): + super(Response, self).__init__(*args, **kwargs) + self.success = "response_success", self._target + self.failure = "response_failure", self._target + self.filter = "response_filtered", self._target + self.start = "response_started", self._target + self.end = "response_completed", self._target class Stream(WebEvent): """Stream(WebEvent) -> Stream WebEvent args: request, response """ - - success = "stream_success", WebEvent._target - failure = "stream_failure", WebEvent._target - filter = "stream_filtered", WebEvent._target - start = "stream_started", WebEvent._target - end = "stream_completed", WebEvent._target + def __init__(self, *args, **kwargs): + super(Stream, self).__init__(*args, **kwargs) + self.success = "stream_success", self._target + self.failure = "stream_failure", self._target + self.filter = "stream_filtered", self._target + self.start = "stream_started", self._target + self.end = "stream_completed", self._target diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/http.py --- a/circuits/web/http.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/http.py Fri Dec 16 22:18:11 2011 +1000 @@ -62,25 +62,25 @@ if response.chunked: buf = [hex(len(data))[2:], b"\r\n", data, b"\r\n"] data = b"".join(buf) - self.push(Write(response.request.sock, data)) + self.fire(Write(response.request.sock, data)) if response.body and not response.done: try: data = next(response.body) except StopIteration: data = None - self.push(Stream(response, data)) + self.fire(Stream(response, data)) else: if response.body: response.body.close() if response.chunked: - self.push(Write(response.request.sock, b"0\r\n\r\n")) + self.fire(Write(response.request.sock, b"0\r\n\r\n")) if response.close: - self.push(Close(response.request.sock)) + self.fire(Close(response.request.sock)) response.done = True @handler("response") def _on_response(self, response): - self.push( + self.fire( Write(response.request.sock, str(response).encode(HTTP_ENCODING))) @@ -89,7 +89,7 @@ data = next(response.body) except StopIteration: data = None - self.push(Stream(response, data)) + self.fire(Stream(response, data)) else: if isinstance(response.body, bytes): body = response.body @@ -103,14 +103,14 @@ if response.chunked: buf = [hex(len(body))[2:].encode(), b"\r\n", body, b"\r\n"] body = b"".join(buf) - self.push(Write(response.request.sock, body)) + self.fire(Write(response.request.sock, body)) if response.chunked: - self.push(Write(response.request.sock, b"0\r\n\r\n")) + self.fire(Write(response.request.sock, b"0\r\n\r\n")) if not response.stream: if response.close: - self.push(Close(response.request.sock)) + self.fire(Close(response.request.sock)) response.done = True @handler("disconnect") @@ -164,7 +164,7 @@ self._clients[sock] = request, response if frag: - return self.push(HTTPError(request, response, 400)) + return self.fire(HTTPError(request, response, 400)) if params: path = "%s;%s" % (path, params) @@ -190,7 +190,7 @@ # the client only understands 1.0. RFC 2616 10.5.6 says we should # only return 505 if the _major_ version is different. if not request.protocol[0] == request.server_protocol[0]: - return self.push(HTTPError(request, response, 505)) + return self.fire(HTTPError(request, response, 505)) rp = request.protocol sp = request.server_protocol @@ -207,7 +207,7 @@ request.body.write(data[(end_of_headers + 4):]) if headers.get("Expect", "") == "100-continue": - return self.push(Response(wrappers.Response(request, 100), + return self.fire(Response(wrappers.Response(request, 100), encoding=self._encoding)) contentLength = int(headers.get("Content-Length", "0")) @@ -235,7 +235,7 @@ else: req = Request(request, response) - self.push(req) + self.fire(req) @handler("httperror") def _on_httperror(self, event, request, response, code, **kwargs): @@ -247,7 +247,7 @@ """ response.body = str(event) - self.push(Response(response)) + self.fire(Response(response)) @handler("value_changed") def _on_value_changed(self, value): @@ -256,10 +256,10 @@ request, response = value.event.args[:2] if value.result and not value.errors: response.body = value.value - self.push(Response(response)) + self.fire(Response(response)) else: # This possibly never occurs. - self.push(HTTPError(request, response, error=value.value)) + self.fire(HTTPError(request, response, error=value.value)) @handler("request_success", "request_filtered") def _on_request_success_or_filtered(self, evt, handler, retval): @@ -268,28 +268,28 @@ if not request.handled and retval is not None: request.handled = True if isinstance(retval, HTTPError): - self.push(retval) + self.fire(retval) elif isinstance(retval, wrappers.Response): - self.push(Response(retval)) + self.fire(Response(retval)) elif isinstance(retval, Value): if retval.result and not retval.errors: response.body = retval.value - self.push(Response(response)) + self.fire(Response(response)) elif retval.errors: error = retval.value etype, evalue, traceback = error if isinstance(evalue, RedirectException): - self.push(RedirectError(request, response, + self.fire(RedirectError(request, response, evalue.urls, evalue.status)) elif isinstance(evalue, HTTPException): if evalue.traceback: - self.push(HTTPError(request, response, evalue.code, + self.fire(HTTPError(request, response, evalue.code, description=evalue.description, error=error)) else: - self.push(HTTPError(request, response, evalue.code, + self.fire(HTTPError(request, response, evalue.code, description=evalue.description)) else: - self.push(HTTPError(request, response, error=error)) + self.fire(HTTPError(request, response, error=error)) else: if retval.manager is None: retval.manager = self @@ -297,7 +297,7 @@ retval.onSet = "value_changed", self elif type(retval) is not bool: response.body = retval - self.push(Response(response)) + self.fire(Response(response)) @handler("request_failure", "response_failure") def _on_request_or_response_failure(self, evt, handler, error): @@ -318,17 +318,17 @@ etype, evalue, traceback = error if isinstance(evalue, RedirectException): - self.push(RedirectError(request, response, + self.fire(RedirectError(request, response, evalue.urls, evalue.status)) elif isinstance(evalue, HTTPException): if evalue.traceback: - self.push(HTTPError(request, response, evalue.code, + self.fire(HTTPError(request, response, evalue.code, description=evalue.description, error=error)) else: - self.push(HTTPError(request, response, evalue.code, + self.fire(HTTPError(request, response, evalue.code, description=evalue.description)) else: - self.push(HTTPError(request, response, error=error)) + self.fire(HTTPError(request, response, error=error)) @handler("request_completed") def _on_request_completed(self, evt, handler, retval): @@ -342,4 +342,4 @@ if not request.handled or handler is None or \ (evt.value.value is None and not evt.future): - self.push(NotFound(request, response)) + self.fire(NotFound(request, response)) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/servers.py --- a/circuits/web/servers.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/servers.py Fri Dec 16 22:18:11 2011 +1000 @@ -163,9 +163,9 @@ @handler("read", target="stdin") def read(self, data): - self.push(Read(FakeSock(), data), "read", self.channel) + self.fire(Read(FakeSock(), data), "read", self.channel) @handler("write") def write(self, sock, data): - self.push(Write(data), "write", "stdout") + self.fire(Write(data), "write", "stdout") diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f circuits/web/wsgi.py --- a/circuits/web/wsgi.py Fri Dec 16 06:01:19 2011 -0600 +++ b/circuits/web/wsgi.py Fri Dec 16 22:18:11 2011 +1000 @@ -89,7 +89,7 @@ def __call__(self, environ, start_response, exc_info=None): self.request, self.response = self.getRequestResponse(environ) - self.push(Request(self.request, self.response)) + self.fire(Request(self.request, self.response)) self._finished = False while not self._finished: diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/api/circuits_app.rst --- a/docs/source/api/circuits_app.rst Fri Dec 16 06:01:19 2011 -0600 +++ b/docs/source/api/circuits_app.rst Fri Dec 16 22:18:11 2011 +1000 @@ -1,5 +1,5 @@ -:mod:`circuits.app` -- Application Componetns -============================================= +:mod:`circuits.app` -- Application Support +========================================== .. automodule :: circuits.app diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/api/circuits_core.rst --- a/docs/source/api/circuits_core.rst Fri Dec 16 06:01:19 2011 -0600 +++ b/docs/source/api/circuits_core.rst Fri Dec 16 22:18:11 2011 +1000 @@ -1,5 +1,5 @@ -:mod:`circuits.core` -- Core -============================ +:mod:`circuits.core` -- Core Functionality +========================================== .. automodule :: circuits.core diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/api/circuits_core_loader.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/source/api/circuits_core_loader.rst Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,22 @@ +:mod:`circuits.core.loader` -- Loader +===================================== + +.. automodule :: circuits.core.loader + + +Events +------ + +**none** + + +Components +---------- + +.. autoclass :: Loader + :members: + +Functions +--------- + +**none** diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/api/circuits_io.rst --- a/docs/source/api/circuits_io.rst Fri Dec 16 06:01:19 2011 -0600 +++ b/docs/source/api/circuits_io.rst Fri Dec 16 22:18:11 2011 +1000 @@ -1,31 +1,10 @@ -:mod:`circuits.io` -- Input/Output Components -============================================= +:mod:`circuits.io` -- I/O Support +================================= -.. module :: circuits.io +.. automodule :: circuits.io -Events ------- - -.. autoclass :: circuits.io.Close - :members: - -.. autoclass :: circuits.io.Read - :members: - -.. autoclass :: circuits.io.Write - :members: - - -Components ----------- - -.. autoclass :: circuits.io.File - :members: - -.. autoclass :: circuits.io.Serial - :members: - -Functions ---------- - - +.. toctree:: + :maxdepth: 1 + :glob: + + circuits_io* diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/api/circuits_io_events.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/source/api/circuits_io_events.rst Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,42 @@ +:mod:`circuits.io.events` -- I/O Events +======================================= + +.. module :: circuits.io.events + +Events +------ + +.. autoclass :: Close + :members: + +.. autoclass :: Closed + :members: + +.. autoclass :: EOF + :members: + +.. autoclass :: Error + :members: + +.. autoclass :: Opened + :members: + +.. autoclass :: Read + :members: + +.. autoclass :: Seek + :members: + +.. autoclass :: Write + :members: + + +Components +---------- + +**none** + +Functions +--------- + +**none** diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/api/circuits_io_file.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/source/api/circuits_io_file.rst Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,21 @@ +:mod:`circuits.io.file` -- File I/O +=================================== + +.. module :: circuits.io.file + +Events +------ + +**none** + + +Components +---------- + +.. autoclass :: File + :members: + +Functions +--------- + +**none** diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/api/circuits_io_serial.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/source/api/circuits_io_serial.rst Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,21 @@ +:mod:`circuits.io.serial` -- Serial I/O +======================================= + +.. module :: circuits.io.serial + +Events +------ + +**none** + + +Components +---------- + +.. autoclass :: Serial + :members: + +Functions +--------- + +**none** diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/api/circuits_web.rst --- a/docs/source/api/circuits_web.rst Fri Dec 16 06:01:19 2011 -0600 +++ b/docs/source/api/circuits_web.rst Fri Dec 16 22:18:11 2011 +1000 @@ -1,5 +1,5 @@ -:mod:`circuits.web` -- circuits.web Framework -============================================= +:mod:`circuits.web` -- Web Framework +==================================== .. automodule :: circuits.web diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/changes.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/source/changes.rst Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,8 @@ +:tocdepth: 2 + +.. _changes: + +History of circuits +=================== + +.. include:: ../../CHANGES diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/conf.py --- a/docs/source/conf.py Fri Dec 16 06:01:19 2011 -0600 +++ b/docs/source/conf.py Fri Dec 16 22:18:11 2011 +1000 @@ -54,7 +54,7 @@ # Devel or Release mode for the documentation (if devel, include TODOs, # can also be used in conditionals: .. ifconfig :: devel) -devel = True +devel = False if devel: release += "dev" diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/contributors.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/source/contributors.rst Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,20 @@ +Contributors +============ + +circuits was originally designed, written and primarily maintained by James +Mills (http://prologic.shortcircuit.net.au/). + +The following users and developers have contributed to circuits: + +- Alessio Deiana +- Dariusz Suchojad +- Tim Miller +- Holger Krekel +- Justin Giorgi +- Edwin Marshall +- Alex Mayfield +- Toni Alatalo + +Anyone not listed here (*apologies as this list is taken directly from +Mercurial's churn command and output*). We appreciate any and all +contributions to circuits. diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/index.rst --- a/docs/source/index.rst Fri Dec 16 06:01:19 2011 -0600 +++ b/docs/source/index.rst Fri Dec 16 22:18:11 2011 +1000 @@ -18,6 +18,8 @@ api/index dev/index roadmap + changes + contributors users faq @@ -38,7 +40,7 @@ Indices and tables ================== -* :ref:`General Index ` +* :ref:`Index ` * :ref:`modindex` * :ref:`search` * :doc:`glossary` diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/requirements.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/source/requirements.txt Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,1 @@ +sphinxcontrib-bitbucket diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/roadmap.rst --- a/docs/source/roadmap.rst Fri Dec 16 06:01:19 2011 -0600 +++ b/docs/source/roadmap.rst Fri Dec 16 22:18:11 2011 +1000 @@ -1,21 +1,13 @@ -Road Map -======== - - -circuits - 1.6 (oceans) ------------------------ - -- Python 2.x / Python 3.x compatibility. -- Drop Python 2.5 support -- All tests passing -- Better documentation -- More flexible and intuitive channel separation - - Deprecates the use of "target" +Future of circuits +================== circuits - 1.7 (rocket) ----------------------- +- IPv6 support - Fix performance of Poll/EPoll pollers - Result Object Proxying - Auto Component Init +- More flexible and intuitive channel separation + - Deprecates the use of "target" diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f docs/source/start/requirements.rst --- a/docs/source/start/requirements.rst Fri Dec 16 06:01:19 2011 -0600 +++ b/docs/source/start/requirements.rst Fri Dec 16 22:18:11 2011 +1000 @@ -3,7 +3,7 @@ Requirements and Dependencies ============================= -circuits has no **requird** dependencies beyond the `Python Standard Library`_. +circuits has no **required** dependencies beyond the `Python Standard Library`_. (*with the exception of Python 2.5 installations*). Python 2.5 @@ -18,7 +18,7 @@ Other Optional Dependencies --------------------------- -These depdencies are not strictly requiree and only add additional +These dependencies are not strictly required and only add additional features such as the option for a routes dispatcher for circuits.web and rendering of component graphs for your application. diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f examples/dirwatch.py --- a/examples/dirwatch.py Fri Dec 16 06:01:19 2011 -0600 +++ b/examples/dirwatch.py Fri Dec 16 22:18:11 2011 +1000 @@ -3,8 +3,8 @@ import sys from circuits import Debugger -from circuits.drivers._inotify import INotifyDriver +from circuits.io import Notify -driver = INotifyDriver() + Debugger() -driver.add(sys.argv[1]) +driver = Notify() + Debugger() +driver.add_path(sys.argv[1]) driver.run() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f examples/keyecho.py --- a/examples/keyecho.py Fri Dec 16 06:01:19 2011 -0600 +++ b/examples/keyecho.py Fri Dec 16 22:18:11 2011 +1000 @@ -1,7 +1,7 @@ #!/usr/bin/env python from circuits.io import File -from circuits import Component, Debugger +from circuits import Component import sys import tty diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f examples/portforward.py --- a/examples/portforward.py Fri Dec 16 06:01:19 2011 -0600 +++ b/examples/portforward.py Fri Dec 16 22:18:11 2011 +1000 @@ -2,11 +2,12 @@ import optparse -from circuits import __version__ -from circuits import Event, Component, Debugger +from circuits import Event from circuits.net.sockets import TCPClient, TCPServer from circuits.net.sockets import Close, Connect, Write +__version__ = "0.1" + USAGE = "%prog [options]" VERSION = "%prog v" + __version__ @@ -97,7 +98,7 @@ else: target = (opts.target, 8000) - (Server(bind) + Client(*target) + Debugger()).run() + (Server(bind) + Client(*target)).run() if __name__ == "__main__": main() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f examples/telnet.py --- a/examples/telnet.py Fri Dec 16 06:01:19 2011 -0600 +++ b/examples/telnet.py Fri Dec 16 22:18:11 2011 +1000 @@ -22,7 +22,6 @@ import os import optparse -from socket import gethostname from circuits.io import stdin from circuits import handler, Component @@ -82,18 +81,16 @@ dest = host, port print "Trying %s ..." % host - self.fire(Connect(*dest), "connect") + self.fire(Connect(*dest)) def connected(self, host, port=None): print "Connected to %s" % host def error(self, *args): if len(args) == 3: - type, value, traceback = args + value = args[1] else: value = args[0] - type = type(value) - traceback = None print "ERROR: %s" % value @@ -102,7 +99,7 @@ @handler("read", target="stdin") def stdin_read(self, data): - self.fire(Write(data), "write") + self.fire(Write(data)) ### ### Main diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f examples/web/fileupload.py --- a/examples/web/fileupload.py Fri Dec 16 06:01:19 2011 -0600 +++ b/examples/web/fileupload.py Fri Dec 16 22:18:11 2011 +1000 @@ -44,7 +44,6 @@ if file is None: return UPLOAD_FORM else: - filename = file.filename return UPLOADED_FILE % (file.filename, desc, file.value) (Server(8000) + Debugger() + Root()).run() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f examples/web/shadowauth.py --- a/examples/web/shadowauth.py Fri Dec 16 06:01:19 2011 -0600 +++ b/examples/web/shadowauth.py Fri Dec 16 22:18:11 2011 +1000 @@ -5,7 +5,6 @@ against /etc/passwd and /etc/shadow before letting them into the web site.""" import os, re -from commands import getstatusoutput from circuits import handler, Component from circuits.web import _httpauth, Server, Controller from circuits.web.errors import HTTPError, Unauthorized diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f examples/web/ssl-forward-cert.py --- a/examples/web/ssl-forward-cert.py Fri Dec 16 06:01:19 2011 -0600 +++ b/examples/web/ssl-forward-cert.py Fri Dec 16 22:18:11 2011 +1000 @@ -3,8 +3,7 @@ # stdlib import ssl -from circuits import Event, Component, Debugger -from circuits.net.sockets import TCPClient +from circuits import Debugger from circuits.web import Server, Controller class Root(Controller): diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f examples/web/terminal/terminal.py --- a/examples/web/terminal/terminal.py Fri Dec 16 06:01:19 2011 -0600 +++ b/examples/web/terminal/terminal.py Fri Dec 16 22:18:11 2011 +1000 @@ -6,9 +6,9 @@ from StringIO import StringIO from subprocess import Popen, PIPE -from circuits.io import File -from circuits.tools import kill +from circuits.io import File, Write from circuits.web.events import Stream +from circuits.tools import inspect, kill from circuits import handler, Event, Component from circuits.web import Server, Controller, Logger, Static, Sessions @@ -50,7 +50,7 @@ @handler("disconnect", target="server") def disconnect(self, sock): if sock == self._request.sock: - self.push(Kill(), target=self) + self.fire(Kill(), target=self) @handler("response", target="http", priority=-1) def response(self, response): @@ -63,15 +63,15 @@ def input(self, data): if self._stdin is not None: - self.push(Write(data), target=self._stdin) + self.fire(Write(data), target=self._stdin) def _on_stdout_eof(self): if self._buffer is not None: self._buffer.flush() data = self._buffer.getvalue() - self.push(Stream(self._response, data), target="http") - self.push(Stream(self._response, None), target="http") - self.push(Kill()) + self.fire(Stream(self._response, data), target="http") + self.fire(Stream(self._response, None), target="http") + self.fire(Kill()) def _on_stdout_read(self, data): if self._state == BUFFERING: @@ -84,9 +84,9 @@ self._buffer.flush() data = self._buffer.getvalue() self._buffer = None - self.push(Stream(self._response, data), target="http") + self.fire(Stream(self._response, data), target="http") else: - self.push(Stream(self._response, data), target="http") + self.fire(Stream(self._response, data), target="http") class Root(Controller): diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f examples/web/wiki/macros/__init__.py --- a/examples/web/wiki/macros/__init__.py Fri Dec 16 06:01:19 2011 -0600 +++ b/examples/web/wiki/macros/__init__.py Fri Dec 16 22:18:11 2011 +1000 @@ -47,7 +47,7 @@ name = name.replace("_", "-") try: macros[name] = function - except Exception, e: + except Exception: continue return macros diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f scripts/circuits.bench --- a/scripts/circuits.bench Fri Dec 16 06:01:19 2011 -0600 +++ b/scripts/circuits.bench Fri Dec 16 22:18:11 2011 +1000 @@ -144,20 +144,20 @@ concurrency = 1 def received(self, message=""): - self.push(Hello("hello")) + self.fire(Hello("hello")) class Receiver(Base): def helo(self, address, port): - self.push(Hello("hello")) + self.fire(Hello("hello")) def hello(self, message=""): - self.push(Received(message)) + self.fire(Received(message)) class SpeedTest(Base): def hello(self, message): - self.push(Hello(message)) + self.fire(Hello(message)) class LatencyTest(Base): @@ -166,18 +166,18 @@ def received(self, message=""): print("Latency: %0.3f us" % ((time.time() - self.t) * 1e6)) time.sleep(1) - self.push(Hello("hello")) + self.fire(Hello("hello")) def hello(self, message=""): self.t = time.time() - self.push(Received(message)) + self.fire(Received(message)) class State(Base): done = False def stop(self): - self.push(Term()) + self.fire(Term()) def term(self): self.done = True diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f setup.py --- a/setup.py Fri Dec 16 06:01:19 2011 -0600 +++ b/setup.py Fri Dec 16 22:18:11 2011 +1000 @@ -52,7 +52,7 @@ url="http://bitbucket.org/prologic/circuits/", download_url="http://bitbucket.org/prologic/circuits/downloads/", classifiers=[ - "Development Status :: 4 - Beta", + "Development Status :: 5 - Production/Stable", "Environment :: Console", "Environment :: No Input/Output (Daemon)", "Environment :: Other Environment", @@ -66,29 +66,20 @@ "License :: OSI Approved", "License :: OSI Approved :: MIT License", "Natural Language :: English", - "Operating System :: POSIX", "Operating System :: POSIX :: Linux", - "Programming Language :: Python", - "Programming Language :: Python 2", - "Programming Language :: Python :: 2.5", + "Operating System :: MacOS :: MacOS X", + "Operating System :: Microsoft :: Windows :: Windows NT/2000", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", - "Programming Language :: Python 3", "Programming Language :: Python :: 3.2", "Topic :: Adaptive Technologies", - "Topic :: Communications :: Chat", "Topic :: Communications :: Chat :: Internet Relay Chat", - "Topic :: Communications :: Email", "Topic :: Communications :: Email :: Mail Transport Agents", "Topic :: Database", - "Topic :: Internet", - "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: HTTP Servers", - "Topic :: Internet :: WWW/HTTP :: WSGI", "Topic :: Internet :: WWW/HTTP :: WSGI :: Application", "Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware", "Topic :: Internet :: WWW/HTTP :: WSGI :: Server", - "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Clustering", diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/app/app.py --- a/tests/app/app.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/app/app.py Fri Dec 16 22:18:11 2011 +1000 @@ -3,8 +3,6 @@ import os import sys -from coverage import coverage - from circuits import Component from circuits.app import Daemon @@ -16,15 +14,9 @@ Daemon(pidfile).register(self) def main(): - _coverage = coverage(data_suffix=True) - _coverage.start() - pidfile = os.path.abspath(sys.argv[1]) app = App(pidfile) app.run() - _coverage.stop() - _coverage.save() - if __name__ == "__main__": main() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/app/test_config.py --- a/tests/app/test_config.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/app/test_config.py Fri Dec 16 22:18:11 2011 +1000 @@ -20,11 +20,9 @@ path.write(CONFIG) config = Config(str(path)) - from circuits import Debugger - Debugger().register(config) config.start() - config.push(Load()) + config.fire(Load()) assert pytest.wait_event(config, "load_success") @@ -79,11 +77,9 @@ path.write(CONFIG) config = Config(str(path)) - from circuits import Debugger - Debugger().register(config) config.start() - config.push(Load()) + config.fire(Load()) assert pytest.wait_event(config, "load_success") @@ -99,14 +95,12 @@ path = tmpdir.ensure("test.ini") config = Config(str(path)) - from circuits import Debugger - Debugger().register(config) config.start() config.add_section("test") config.set("test", "foo", "bar") - config.push(Save()) + config.fire(Save()) assert pytest.wait_event(config, "save_success") diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/app/test_env.py --- a/tests/app/test_env.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/app/test_env.py Fri Dec 16 22:18:11 2011 +1000 @@ -34,7 +34,7 @@ def test_create(env, path): from circuits.app.env import Create - env.push(Create()) + env.fire(Create()) assert pytest.wait_event(env, "create_success") files = ("conf/test.ini", "README", "VERSION") @@ -46,7 +46,7 @@ def test_load(env, path): from circuits.app.env import Create, Load - env.push(Create()) + env.fire(Create()) assert pytest.wait_event(env, "create_success") @@ -55,7 +55,7 @@ for filename in files: assert path.join(filename).check(exists=True, file=True) - env.push(Load()) + env.fire(Load()) assert pytest.wait_event(env, "load_success") @@ -63,7 +63,7 @@ def test_load_verify(env, path): from circuits.app.env import Create, Load - env.push(Create()) + env.fire(Create()) assert pytest.wait_event(env, "create_success") @@ -72,7 +72,7 @@ for filename in files: assert path.join(filename).check(exists=True, file=True) - env.push(Load(verify=True)) + env.fire(Load(verify=True)) assert pytest.wait_event(env, "load_success") @@ -81,7 +81,7 @@ from circuits.app.env import Create, Load from circuits.app.env import EnvironmentError, ERRORS - env.push(Create()) + env.fire(Create()) assert pytest.wait_event(env, "create_success") @@ -92,7 +92,7 @@ path.join("VERSION").write("") - v = env.push(Load(verify=True)) + v = env.fire(Load(verify=True)) assert pytest.wait_event(env, "verify_failure") @@ -104,7 +104,7 @@ from circuits.app.env import Create, Load from circuits.app.env import EnvironmentError, ERRORS - env.push(Create()) + env.fire(Create()) assert pytest.wait_event(env, "create_success") @@ -115,7 +115,7 @@ env.version = 100 - v = env.push(Load(verify=True)) + v = env.fire(Load(verify=True)) assert pytest.wait_event(env, "verify_failure") diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/app/test_logger.py --- a/tests/app/test_logger.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/app/test_logger.py Fri Dec 16 22:18:11 2011 +1000 @@ -13,7 +13,7 @@ class App(Component): def test(self, level="debug"): - self.push(Log(level, "Hello World!")) + self.fire(Log(level, "Hello World!")) def test(tmpdir): filepath = tmpdir.ensure("test.log") @@ -29,7 +29,7 @@ f = open(filename, "r+") def test(f, level="debug"): - app.push(Test(level)) + app.fire(Test(level)) while app: app.flush() now = strftime("%H:%M:%S") diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/signalapp.py --- a/tests/core/signalapp.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/signalapp.py Fri Dec 16 22:18:11 2011 +1000 @@ -3,8 +3,6 @@ import os import sys -from coverage import coverage - from circuits import Component from circuits.app import Daemon @@ -24,15 +22,9 @@ f.close() def main(): - _coverage = coverage(data_suffix=True) - _coverage.start() - pidfile = os.path.abspath(sys.argv[1]) signalfile = os.path.abspath(sys.argv[2]) App(pidfile, signalfile).run() - _coverage.stop() - _coverage.save() - if __name__ == "__main__": main() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_all_channels.py --- a/tests/core/test_all_channels.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_all_channels.py Fri Dec 16 22:18:11 2011 +1000 @@ -32,7 +32,7 @@ while m: m.flush() - m.push(Event(), "*") + m.fire(Event(), "*") m.flush() assert not a.flag diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_bridge.py --- a/tests/core/test_bridge.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_bridge.py Fri Dec 16 22:18:11 2011 +1000 @@ -32,7 +32,7 @@ pid = os.getpid() e = Hello() assert e.future == False - x = app.push(e) + x = app.fire(e) assert pytest.wait_for(e, "future", True) assert e.future == True diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_component_repr.py --- a/tests/core/test_component_repr.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_component_repr.py Fri Dec 16 22:18:11 2011 +1000 @@ -25,16 +25,16 @@ id = "%s:%s" % (os.getpid(), current_thread().getName()) app = App() - assert repr(app) == "" % id + assert repr(app) == "" % id app.flush() - assert repr(app) == "" % id + assert repr(app) == "" % id - app.push(Event(), "test") - assert repr(app) == "" % id + app.fire(Event(), "test") + assert repr(app) == "" % id app.flush() - assert repr(app) == "" % id + assert repr(app) == "" % id app.unregister() assert repr(app) == "" % id diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_core.py --- a/tests/core/test_core.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_core.py Fri Dec 16 22:18:11 2011 +1000 @@ -17,7 +17,7 @@ while app: app.flush() def test_fire(): - x = m.push(Test()) + x = m.fire(Test()) m.flush() assert x.value == "Hello World!" diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_debugger.py --- a/tests/core/test_debugger.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_debugger.py Fri Dec 16 22:18:11 2011 +1000 @@ -50,7 +50,7 @@ assert debugger.events e = Event() - app.push(e) + app.fire(e) app.flush() stderr.seek(0) @@ -63,7 +63,7 @@ assert not debugger.events e = Event() - app.push(e) + app.fire(e) stderr.seek(0) s = stderr.read().strip() @@ -86,7 +86,7 @@ assert debugger.events e = Event() - app.push(e) + app.fire(e) app.flush() stderr.seek(0) @@ -99,7 +99,7 @@ assert not debugger.events e = Event() - app.push(e) + app.fire(e) stderr.seek(0) s = stderr.read().strip() @@ -122,7 +122,7 @@ assert debugger.events e = Event() - app.push(e) + app.fire(e) app.flush() stderr.seek(0) @@ -135,7 +135,7 @@ assert not debugger.events e = Event() - app.push(e) + app.fire(e) stderr.seek(0) s = stderr.read().strip() @@ -157,7 +157,7 @@ assert debugger.errors e = Test(raiseException=True) - app.push(e) + app.fire(e) app.flush() stderr.seek(0) @@ -180,7 +180,7 @@ assert not debugger.errors e = Test(raiseException=True) - app.push(e) + app.fire(e) app.flush() stderr.seek(0) @@ -200,7 +200,7 @@ debugger = Debugger(file=stderr) debugger.register(app) while app: - app.flush() + app.tick() stderr.seek(0) stderr.truncate() @@ -212,8 +212,9 @@ stderr.seek(0) s = stderr.read().strip() + assert s.startswith(", Exception()") \ - or s.startswith(", Exception()") + or s.startswith(", Exception()") stderr.seek(0) stderr.truncate() @@ -237,7 +238,7 @@ debugger.IgnoreEvents.extend([Test]) e = Event() - app.push(e) + app.fire(e) app.flush() stderr.seek(0) @@ -247,7 +248,7 @@ stderr.truncate() e = Test() - app.push(e) + app.fire(e) app.flush() stderr.seek(0) @@ -270,7 +271,7 @@ debugger.IgnoreChannels.extend([("*", "test")]) e = Event() - app.push(e) + app.fire(e) app.flush() stderr.seek(0) @@ -280,7 +281,7 @@ stderr.truncate() e = Test() - app.push(e) + app.fire(e) app.flush() stderr.seek(0) @@ -298,7 +299,7 @@ app.flush() e = Event() - app.push(e) + app.fire(e) app.flush() assert logger.msg == repr(e) @@ -312,7 +313,7 @@ app.flush() e = Test(raiseException=True) - app.push(e) + app.fire(e) app.flush() app.flush() assert logger.msg.startswith("ERROR ():") \ diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_dynamic_handlers.py --- a/tests/core/test_dynamic_handlers.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_dynamic_handlers.py Fri Dec 16 22:18:11 2011 +1000 @@ -25,7 +25,7 @@ app = App() e = Test() - app.push(e) + app.fire(e) app.flush() assert app._event == e @@ -34,7 +34,7 @@ app = App() e = Test() - app.push(e, target="foo") + app.fire(e, target="foo") app.flush() assert app._event == e diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_errors.py --- a/tests/core/test_errors.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_errors.py Fri Dec 16 22:18:11 2011 +1000 @@ -34,7 +34,7 @@ while app: app.flush() - app.push(Test()) + app.fire(Test()) while app: app.flush() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_event.py --- a/tests/core/test_event.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_event.py Fri Dec 16 22:18:11 2011 +1000 @@ -25,7 +25,7 @@ s = repr(e) assert s == "" - app.push(e) + app.fire(e) s = repr(e) assert s == "" diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_event_serialization.py --- a/tests/core/test_event_serialization.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_event_serialization.py Fri Dec 16 22:18:11 2011 +1000 @@ -23,7 +23,7 @@ while app: app.flush() e = Test() - app.push(e) + app.fire(e) app.flush() s = dumps(e, -1) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_feedback.py --- a/tests/core/test_feedback.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_feedback.py Fri Dec 16 22:18:11 2011 +1000 @@ -78,7 +78,7 @@ app.flush() e = Test() - x = app.push(e) + x = app.fire(e) app.flush() @@ -114,7 +114,7 @@ app.flush() e = Test(error=True) - x = app.push(e) + x = app.fire(e) app.flush() @@ -153,7 +153,7 @@ app.flush() e = Test(filter=True) - x = app.push(e) + x = app.fire(e) app.flush() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_filters.py --- a/tests/core/test_filters.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_filters.py Fri Dec 16 22:18:11 2011 +1000 @@ -17,6 +17,6 @@ def test(): app = App() while app: app.flush() - x = app.push(Test()) + x = app.fire(Test()) app.flush() assert x.value == "Hello World!" diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_future.py --- a/tests/core/test_future.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_future.py Fri Dec 16 22:18:11 2011 +1000 @@ -20,7 +20,7 @@ @future() def test(self): - return self.push(Hello()) + return self.fire(Hello()) @future() def error(self): @@ -35,7 +35,7 @@ @handler("test") @future() def _on_test(self): - return self.push(Hello()) + return self.fire(Hello()) @handler("error") @future() @@ -50,7 +50,7 @@ while app: app.flush() e = Test() assert e.future == False - x = app.push(e) + x = app.fire(e) while not x.result: app.flush() assert e.future == True @@ -61,7 +61,7 @@ while app: app.flush() e = Error() assert e.future == False - x = app.push(e) + x = app.fire(e) while not x.errors: app.flush() assert e.future == True @@ -76,7 +76,7 @@ while app: app.flush() e = Test() assert e.future == False - x = app.push(e) + x = app.fire(e) while not x.result: app.flush() assert e.future == True @@ -87,7 +87,7 @@ while app: app.flush() e = Error() assert e.future == False - x = app.push(e) + x = app.fire(e) while not x.errors: app.flush() assert e.future == True diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_generator_value.py --- a/tests/core/test_generator_value.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_generator_value.py Fri Dec 16 22:18:11 2011 +1000 @@ -24,7 +24,7 @@ app = App() while app: app.flush() - v = app.push(Test()) + v = app.fire(Test()) app.flush() g = v.value @@ -35,7 +35,7 @@ app = App() while app: app.flush() - v = app.push(Hello()) + v = app.fire(Hello()) app.flush() g = v.value diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_greenlet.py --- a/tests/core/test_greenlet.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_greenlet.py Fri Dec 16 22:18:11 2011 +1000 @@ -34,10 +34,24 @@ self.waitEvent(e, 30) return x.value + def test_call_event(self): + e = Bar() + x = self.callEvent(e) + return x.value + + def test_call_event2(self): + e = Bar2() + x = self.callEvent(e) + return x.value + def bar(self): - self.push(BarDone()) + self.fire(BarDone()) return "Foobar!" + def bar2(self): + self.fire(BarDone()) + return + def test_wait_class(): test = Test() @@ -65,3 +79,23 @@ test.stop() + +def test_call_event(): + test = Test() + test.start() + + e = Foo() + x = test.fire(e, "test_call_event") + pytest.wait_event(test, "bardone") + + value = x.value + assert value == "Foobar!" + + x = test.fire(e, "test_call_event2") + pytest.wait_event(test, "bardone") + + value = x.value + assert value == None + + test.stop() + diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_inheritence.py --- a/tests/core/test_inheritence.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_inheritence.py Fri Dec 16 22:18:11 2011 +1000 @@ -27,7 +27,7 @@ app = App1() app.start() - x = app.push(Test()) + x = app.fire(Test()) assert pytest.wait_for(x, "result") v = x.value assert v == ["Hello World!", "Foobar"] @@ -38,7 +38,7 @@ app = App2() app.start() - x = app.push(Test()) + x = app.fire(Test()) assert pytest.wait_for(x, "result") v = x.value assert v == "Foobar" diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_ipc.py --- a/tests/core/test_ipc.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_ipc.py Fri Dec 16 22:18:11 2011 +1000 @@ -21,7 +21,7 @@ assert pytest.wait_for(app._bridge, "ready") - x = m.push(Hello()) + x = m.fire(Hello()) assert pytest.wait_for(x, "result") s = str(x) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_loader.py --- a/tests/core/test_loader.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_loader.py Fri Dec 16 22:18:11 2011 +1000 @@ -19,7 +19,7 @@ loader.load("app") - x = m.push(Test()) + x = m.fire(Test()) assert pytest.wait_for(x, "result") diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_manager_repr.py --- a/tests/core/test_manager_repr.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_manager_repr.py Fri Dec 16 22:18:11 2011 +1000 @@ -29,16 +29,16 @@ app = App() app.register(m) - assert repr(m) == "" % id + assert repr(m) == "" % id m.flush() - assert repr(m) == "" % id + assert repr(m) == "" % id - m.push(Event(), "test") - assert repr(m) == "" % id + m.fire(Event(), "test") + assert repr(m) == "" % id m.flush() - assert repr(m) == "" % id + assert repr(m) == "" % id app.unregister() assert repr(m) == "" % id diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_pools.py --- a/tests/core/test_pools.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_pools.py Fri Dec 16 22:18:11 2011 +1000 @@ -22,7 +22,7 @@ p = Pool() p.start() - x = p.push(Task(f)) + x = p.fire(Task(f)) assert pytest.wait_for(x, "result") diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_priority.py --- a/tests/core/test_priority.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_priority.py Fri Dec 16 22:18:11 2011 +1000 @@ -26,7 +26,7 @@ while m: m.flush() def test(): - v = m.push(Test()) + v = m.fire(Test()) while m: m.flush() x = list(v) assert x == [3, 2, 0] diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_value.py --- a/tests/core/test_value.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_value.py Fri Dec 16 22:18:11 2011 +1000 @@ -20,7 +20,7 @@ return "Hello World!" def test(self): - return self.push(Hello()) + return self.fire(Hello()) def error(self): raise Exception("Error!") @@ -35,7 +35,7 @@ @handler("values", priority=0.0) def _value3(self): - return self.push(Hello()) + return self.fire(Hello()) m = Manager() @@ -45,19 +45,19 @@ while m: m.flush() def test_value(): - x = m.push(Hello()) + x = m.fire(Hello()) while m: m.flush() assert "Hello World!" in x assert x.value == "Hello World!" def test_nested_value(): - x = m.push(Test()) + x = m.fire(Test()) while m: m.flush() assert x.value == "Hello World!" assert str(x) == "Hello World!" def test_error_value(): - x = m.push(Error()) + x = m.fire(Error()) while m: m.flush() etype, evalue, etraceback = x assert etype is Exception @@ -65,7 +65,7 @@ assert isinstance(etraceback, list) def test_multiple_values(): - v = m.push(Values()) + v = m.fire(Values()) while m: m.flush() assert isinstance(v.value, list) x = list(v) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_value_serialization.py --- a/tests/core/test_value_serialization.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_value_serialization.py Fri Dec 16 22:18:11 2011 +1000 @@ -22,7 +22,7 @@ app = App() while app: app.flush() - v = app.push(Test()) + v = app.fire(Test()) while app: app.flush() s = dumps(v, -1) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/core/test_workers.py --- a/tests/core/test_workers.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/core/test_workers.py Fri Dec 16 22:18:11 2011 +1000 @@ -17,7 +17,7 @@ def test(): w = Worker() - x = w.push(Task(f)) + x = w.fire(Task(f)) while not x.result: pass diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/io/test_io.py --- a/tests/io/test_io.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/io/test_io.py Fri Dec 16 22:18:11 2011 +1000 @@ -28,7 +28,7 @@ app = App(filename, "w") app.start() - app.push(Write(b"Hello World!")) + app.fire(Write(b"Hello World!")) sleep(1) app.stop() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/io/test_notify.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/io/test_notify.py Fri Dec 16 22:18:11 2011 +1000 @@ -0,0 +1,45 @@ +import pytest +pytest.importorskip("pyinotify") + +from circuits.io.notify import Notify, AddPath, RemovePath +from circuits import Component, handler + + +class App(Component): + + def __init__(self, *args, **kwargs): + super(App, self).__init__() + self.add_path = False + self.remove_path = False + self.created = False + + def add_path(self, path): + self.add_path = True + + def remove_path(self, path): + self.remove_path = True + + @handler('created', target='notify') + def created(self, *args, **kwargs): + self.created = True + +def test_notify(tmpdir): + app = App() + Notify().register(app) + from circuits import Debugger + Debugger().register(app) + app.start() + try: + app.fire(AddPath(str(tmpdir))) + pytest.wait_for(app, 'add_path') + tmpdir.ensure("helloworld.txt") + assert pytest.wait_for(app, 'created') + app.created = False + app.fire(RemovePath(str(tmpdir))) + pytest.wait_for(app, 'remove_path') + tmpdir.ensure("helloworld2.txt") + assert not pytest.wait_for(app, 'created') + finally: + app.stop() + + assert True diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/net/protocols/test_irc.py --- a/tests/net/protocols/test_irc.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/net/protocols/test_irc.py Fri Dec 16 22:18:11 2011 +1000 @@ -91,7 +91,7 @@ def test_PASS(app): app.reset() - app.push(PASS("secret")) + app.fire(PASS("secret")) while app: app.flush() @@ -118,7 +118,7 @@ def test_USER(app): app.reset() - app.push(USER("foo", "localhost", "localhost", "Test Client")) + app.fire(USER("foo", "localhost", "localhost", "Test Client")) while app: app.flush() @@ -148,7 +148,7 @@ def test_NICK(app): app.reset() - app.push(NICK("test")) + app.fire(NICK("test")) while app: app.flush() @@ -175,7 +175,7 @@ def test_PING(app): app.reset() - app.push(PING("localhost")) + app.fire(PING("localhost")) while app: app.flush() @@ -202,7 +202,7 @@ def test_PONG(app): app.reset() - app.push(PONG("localhost")) + app.fire(PONG("localhost")) while app: app.flush() @@ -229,7 +229,7 @@ def test_QUIT(app): app.reset() - app.push(QUIT()) + app.fire(QUIT()) while app: app.flush() @@ -254,7 +254,7 @@ app.reset() - app.push(QUIT("Test")) + app.fire(QUIT("Test")) while app: app.flush() @@ -281,7 +281,7 @@ def test_JOIN(app): app.reset() - app.push(JOIN("#test")) + app.fire(JOIN("#test")) while app: app.flush() @@ -306,7 +306,7 @@ app.reset() - app.push(JOIN("#test", "secret")) + app.fire(JOIN("#test", "secret")) while app: app.flush() @@ -334,7 +334,7 @@ def test_PART(app): app.reset() - app.push(PART("#test")) + app.fire(PART("#test")) while app: app.flush() @@ -359,7 +359,7 @@ app.reset() - app.push(PART("#test", "Test")) + app.fire(PART("#test", "Test")) while app: app.flush() @@ -387,7 +387,7 @@ def test_PRIVMSG(app): app.reset() - app.push(PRIVMSG("test", "Hello")) + app.fire(PRIVMSG("test", "Hello")) while app: app.flush() @@ -415,7 +415,7 @@ def test_NOTICE(app): app.reset() - app.push(NOTICE("test", "Hello")) + app.fire(NOTICE("test", "Hello")) while app: app.flush() @@ -443,7 +443,7 @@ def test_CTCP(app): app.reset() - app.push(CTCP("test", "PING", "1234567890")) + app.fire(CTCP("test", "PING", "1234567890")) while app: app.flush() @@ -477,7 +477,7 @@ def test_CTCPREPLY(app): app.reset() - app.push(CTCPREPLY("test", "PING", "1234567890")) + app.fire(CTCPREPLY("test", "PING", "1234567890")) while app: app.flush() @@ -511,7 +511,7 @@ def test_KICK(app): app.reset() - app.push(KICK("#test", "test")) + app.fire(KICK("#test", "test")) while app: app.flush() @@ -537,7 +537,7 @@ app.reset() - app.push(KICK("#test", "test", "Bye")) + app.fire(KICK("#test", "test", "Bye")) while app: app.flush() @@ -566,7 +566,7 @@ def test_TOPIC(app): app.reset() - app.push(TOPIC("#test", "Hello World!")) + app.fire(TOPIC("#test", "Hello World!")) while app: app.flush() @@ -594,7 +594,7 @@ def test_MODE(app): app.reset() - app.push(MODE("+i")) + app.fire(MODE("+i")) while app: app.flush() @@ -619,7 +619,7 @@ app.reset() - app.push(MODE("+o test", "#test")) + app.fire(MODE("+o test", "#test")) while app: app.flush() @@ -647,7 +647,7 @@ def test_INVITE(app): app.reset() - app.push(INVITE("test", "#test")) + app.fire(INVITE("test", "#test")) while app: app.flush() @@ -675,7 +675,7 @@ def test_NAMES(app): app.reset() - app.push(NAMES()) + app.fire(NAMES()) while app: app.flush() @@ -700,7 +700,7 @@ app.reset() - app.push(NAMES("#test")) + app.fire(NAMES("#test")) while app: app.flush() @@ -731,7 +731,7 @@ def test_ping(app): app.reset() - app.push(Read(b"PING :localhost\r\n")) + app.fire(Read(b"PING :localhost\r\n")) while app: app.flush() @@ -770,7 +770,7 @@ def test_numerics(app): app.reset() - app.push(Read(b":localhost 001 test " + + app.fire(Read(b":localhost 001 test " + b":Welcome to the circuits Internet Relay Chat Network test\r\n")) while app: app.flush() @@ -798,7 +798,7 @@ app.reset() - app.push(Read(b":localhost 332 test #test :Hello World!\r\n")) + app.fire(Read(b":localhost 332 test #test :Hello World!\r\n")) while app: app.flush() @@ -824,7 +824,7 @@ def test_ctcp(app): app.reset() - app.push(Read(b":test!foo@localhost PRIVMSG test :TIME\r\n")) + app.fire(Read(b":test!foo@localhost PRIVMSG test :TIME\r\n")) while app: app.flush() @@ -849,7 +849,7 @@ def test_message(app): app.reset() - app.push(Read(b":test!foo@localhost PRIVMSG test :Hello\r\n")) + app.fire(Read(b":test!foo@localhost PRIVMSG test :Hello\r\n")) while app: app.flush() @@ -873,7 +873,7 @@ def test_notice(app): app.reset() - app.push(Read(b":test!foo@localhost NOTICE test :Hello\r\n")) + app.fire(Read(b":test!foo@localhost NOTICE test :Hello\r\n")) while app: app.flush() @@ -897,7 +897,7 @@ def test_join(app): app.reset() - app.push(Read(b":test!foo@localhost JOIN #test\r\n")) + app.fire(Read(b":test!foo@localhost JOIN #test\r\n")) while app: app.flush() @@ -920,7 +920,7 @@ def test_part(app): app.reset() - app.push(Read(b":test!foo@localhost PART #test :Leaving\r\n")) + app.fire(Read(b":test!foo@localhost PART #test :Leaving\r\n")) while app: app.flush() @@ -944,7 +944,7 @@ def test_quit(app): app.reset() - app.push(Read(b":test!foo@localhost QUIT :Leaving\r\n")) + app.fire(Read(b":test!foo@localhost QUIT :Leaving\r\n")) while app: app.flush() @@ -967,7 +967,7 @@ def test_nick(app): app.reset() - app.push(Read(b":test!foo@localhost NICK :test_\r\n")) + app.fire(Read(b":test!foo@localhost NICK :test_\r\n")) while app: app.flush() @@ -990,7 +990,7 @@ def test_mode(app): app.reset() - app.push(Read(b":test!foo@localhost MODE #test +o test\r\n")) + app.fire(Read(b":test!foo@localhost MODE #test +o test\r\n")) while app: app.flush() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/net/protocols/test_line.py --- a/tests/net/protocols/test_line.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/net/protocols/test_line.py Fri Dec 16 22:18:11 2011 +1000 @@ -35,7 +35,7 @@ while app: app.flush() - app.push(Read(b"1\n2\r\n3\n4")) + app.fire(Read(b"1\n2\r\n3\n4")) while app: app.flush() @@ -54,8 +54,8 @@ while app: app.flush() - app.push(Read(1, b"1\n2\r\n3\n4")) - app.push(Read(2, b"1\n2\r\n3\n4")) + app.fire(Read(1, b"1\n2\r\n3\n4")) + app.fire(Read(2, b"1\n2\r\n3\n4")) while app: app.flush() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/net/server.py --- a/tests/net/server.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/net/server.py Fri Dec 16 22:18:11 2011 +1000 @@ -27,7 +27,7 @@ def connect(self, sock, *args): self.connected = True self.client = args - self.push(Write(sock, b"Ready")) + self.fire(Write(sock, b"Ready")) def disconnect(self, sock): self.client = None diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/net/test_pipe.py --- a/tests/net/test_pipe.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/net/test_pipe.py Fri Dec 16 22:18:11 2011 +1000 @@ -28,16 +28,16 @@ assert pytest.wait_for(a, "ready") assert pytest.wait_for(b, "ready") - a.push(Write(b"foo")) + a.fire(Write(b"foo")) assert pytest.wait_for(b, "data", b"foo") - b.push(Write(b"foo")) + b.fire(Write(b"foo")) assert pytest.wait_for(a, "data", b"foo") - a.push(Close()) + a.fire(Close()) assert pytest.wait_for(a, "disconnected") - b.push(Close()) + b.fire(Close()) assert pytest.wait_for(b, "disconnected") finally: m.stop() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/net/test_tcp.py --- a/tests/net/test_tcp.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/net/test_tcp.py Fri Dec 16 22:18:11 2011 +1000 @@ -54,19 +54,19 @@ assert pytest.wait_for(client, "ready") assert pytest.wait_for(server, "ready") - client.push(Connect(server.host, server.port)) + client.fire(Connect(server.host, server.port)) assert pytest.wait_for(client, "connected") assert pytest.wait_for(server, "connected") assert pytest.wait_for(client, "data", b"Ready") - client.push(Write(b"foo")) + client.fire(Write(b"foo")) assert pytest.wait_for(server, "data", b"foo") - client.push(Close()) + client.fire(Close()) assert pytest.wait_for(client, "disconnected") assert pytest.wait_for(server, "disconnected") - server.push(Close()) + server.fire(Close()) assert pytest.wait_for(server, "closed") finally: m.stop() @@ -87,32 +87,32 @@ assert pytest.wait_for(server, "ready") # 1st connect - client.push(Connect(server.host, server.port)) + client.fire(Connect(server.host, server.port)) assert pytest.wait_for(client, "connected") assert pytest.wait_for(server, "connected") assert pytest.wait_for(client, "data", b"Ready") - client.push(Write(b"foo")) + client.fire(Write(b"foo")) assert pytest.wait_for(server, "data", b"foo") # disconnect - client.push(Close()) + client.fire(Close()) assert pytest.wait_for(client, "disconnected") # 2nd reconnect - client.push(Connect(server.host, server.port)) + client.fire(Connect(server.host, server.port)) assert pytest.wait_for(client, "connected") assert pytest.wait_for(server, "connected") assert pytest.wait_for(client, "data", b"Ready") - client.push(Write(b"foo")) + client.fire(Write(b"foo")) assert pytest.wait_for(server, "data", b"foo") - client.push(Close()) + client.fire(Close()) assert pytest.wait_for(client, "disconnected") assert pytest.wait_for(server, "disconnected") - server.push(Close()) + server.fire(Close()) assert pytest.wait_for(server, "closed") finally: m.stop() @@ -137,11 +137,15 @@ tcp_server._sock.close() # 1st connect - client.push(Connect(host, port)) + client.fire(Connect(host, port)) assert pytest.wait_for(client, "connected") - client.push(Write(b"foo")) + client.fire(Write(b"foo")) assert pytest.wait_for(client, "disconnected") + + client.disconnected = False + client.fire(Write(b"foo")) + assert pytest.wait_for(client, "disconnected", timeout=1.0) is None finally: m.stop() @@ -164,21 +168,21 @@ assert pytest.wait_for(client, "ready") assert pytest.wait_for(server, "ready") - client.push(Connect(server.host, server.port)) + client.fire(Connect(server.host, server.port)) assert pytest.wait_for(client, "connected") assert pytest.wait_for(server, "connected") assert pytest.wait_for(client, "data", b"Ready") assert server.client[1] == bind_port - client.push(Write(b"foo")) + client.fire(Write(b"foo")) assert pytest.wait_for(server, "data", b"foo") - client.push(Close()) + client.fire(Close()) assert pytest.wait_for(client, "disconnected") assert pytest.wait_for(server, "disconnected") - server.push(Close()) + server.fire(Close()) assert pytest.wait_for(server, "closed") finally: m.stop() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/net/test_udp.py --- a/tests/net/test_udp.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/net/test_udp.py Fri Dec 16 22:18:11 2011 +1000 @@ -7,6 +7,7 @@ from circuits import Manager from circuits.tools import kill from circuits.core.pollers import Select +from circuits.core.events import Unregister from circuits.net.sockets import Close, Write from circuits.net.sockets import UDPServer, UDPClient @@ -54,33 +55,34 @@ assert pytest.wait_for(server, "ready") assert pytest.wait_for(client, "ready") - client.push(Write((server.host, server.port), b"foo")) + client.fire(Write((server.host, server.port), b"foo")) assert pytest.wait_for(server, "data", b"foo") - client.push(Close()) + client.fire(Close()) assert pytest.wait_for(client, "closed") - server.push(Close()) + server.fire(Close()) assert pytest.wait_for(server, "closed") finally: m.stop() def test_udp_close(Poller): - from circuits import Debugger - m = Manager() + Poller() + Debugger() - server = Server() + UDPServer(2345) + m = Manager() + Poller() + server = Server() + UDPServer(0) server.register(m) m.start() try: assert pytest.wait_for(server, "ready") - server.push(Close()) + host, port = server.host, server.port + + server.fire(Close()) assert pytest.wait_for(server, "disconnected") - kill(server) # FIXME: This fails :/ + server.fire(Unregister(server)) - server = Server() + UDPServer(2345) + server = Server() + UDPServer((host, port)) server.register(m) assert pytest.wait_for(server, "ready") diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/net/test_unix.py --- a/tests/net/test_unix.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/net/test_unix.py Fri Dec 16 22:18:11 2011 +1000 @@ -60,19 +60,19 @@ assert pytest.wait_for(server, "ready") assert pytest.wait_for(client, "ready") - client.push(Connect(filename)) + client.fire(Connect(filename)) assert pytest.wait_for(client, "connected") assert pytest.wait_for(server, "connected") assert pytest.wait_for(client, "data", b"Ready") - client.push(Write(b"foo")) + client.fire(Write(b"foo")) assert pytest.wait_for(server, "data", b"foo") - client.push(Close()) + client.fire(Close()) assert pytest.wait_for(client, "disconnected") assert pytest.wait_for(server, "disconnected") - server.push(Close()) + server.fire(Close()) assert pytest.wait_for(server, "closed") finally: m.stop() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/tools/test_tools.py --- a/tests/tools/test_tools.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/tools/test_tools.py Fri Dec 16 22:18:11 2011 +1000 @@ -72,9 +72,11 @@ Registered Components: 0 Tick Functions: 1 - > + > - Channels and Event Handlers: 1 + Channels and Event Handlers: 2 + *:unregister; 1 + *:foo; 1 """ diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/conftest.py --- a/tests/web/conftest.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/conftest.py Fri Dec 16 22:18:11 2011 +1000 @@ -48,5 +48,5 @@ def teardownwebapp(webapp): from circuits.net.sockets import Close - webapp.push(Close(), target=webapp.server) + webapp.fire(Close(), target=webapp.server) webapp.stop() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/multipartform.py --- a/tests/web/multipartform.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/multipartform.py Fri Dec 16 22:18:11 2011 +1000 @@ -45,5 +45,4 @@ flattened = list(itertools.chain(*parts)) flattened.append("--%s--" % self.boundary) flattened.append("") - print(repr(flattened)) return "\r\n".join(flattened) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/test_client.py --- a/tests/web/test_client.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/test_client.py Fri Dec 16 22:18:11 2011 +1000 @@ -13,10 +13,10 @@ client = Client(webapp.server.base) client.start() - client.push(Connect()) + client.fire(Connect()) assert pytest.wait_event(client, 'connected', target='client') - client.push(Request("GET", "/")) + client.fire(Request("GET", "/")) while client.response is None: pass client.stop() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/test_core.py --- a/tests/web/test_core.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/test_core.py Fri Dec 16 22:18:11 2011 +1000 @@ -1,8 +1,9 @@ #!/usr/bin/env python -from circuits.web import Controller +from circuits.web import Controller, BaseServer from .helpers import urlencode, urlopen, HTTPError +import pytest class Root(Controller): @@ -23,7 +24,7 @@ def test_notfound(self): return self.notfound() -def test(webapp): +def test_simple(webapp): f = urlopen(webapp.server.base) s = f.read() assert s == b"Hello World!" @@ -69,3 +70,13 @@ assert e.msg == "Not Found" else: assert False + +def test_dual_server(webapp): + server = BaseServer(0, channel='web2') + server.register(webapp) + try: + f = urlopen('%s/alt' % server.base) + assert False + except HTTPError as e: + assert e.code == 404 + \ No newline at end of file diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/test_future.py --- a/tests/web/test_future.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/test_future.py Fri Dec 16 22:18:11 2011 +1000 @@ -18,7 +18,7 @@ @future() def index(self): - return self.push(Hello()) + return self.fire(Hello()) def test(webapp): Test().register(webapp) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/test_gzip.py --- a/tests/web/test_gzip.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/test_gzip.py Fri Dec 16 22:18:11 2011 +1000 @@ -32,9 +32,6 @@ return "Hello World!" def test(webapp): - from circuits import Debugger - Debugger().register(webapp) - gzip = Gzip() gzip.register(webapp) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/test_http.py --- a/tests/web/test_http.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/test_http.py Fri Dec 16 22:18:11 2011 +1000 @@ -29,15 +29,15 @@ def test(webapp): transport = TCPClient() client = Client() - client += transport + Debugger() + client += transport client.start() host, port, resource, secure = parse_url(webapp.server.base) - client.push(Connect(host, port)) + client.fire(Connect(host, port)) assert pytest.wait_for(transport, "connected") - client.push(Write(b"GET / HTTP/1.1\r\n")) - client.push(Write(b"Content-Type: text/plain\r\n\r\n")) + client.fire(Write(b"GET / HTTP/1.1\r\n")) + client.fire(Write(b"Content-Type: text/plain\r\n\r\n")) assert pytest.wait_for(client, "done") client.stop() diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/test_main.py --- a/tests/web/test_main.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/test_main.py Fri Dec 16 22:18:11 2011 +1000 @@ -5,7 +5,7 @@ from errno import ECONNREFUSED from subprocess import Popen, PIPE -from .helpers import urlopen, URLError +from .helpers import urlopen, URLError, HTTPError SERVER_CMD = ["python", "-m", "circuits.web.main"] @@ -31,15 +31,21 @@ sleep(1) + f = None + for _ in range(3): try: f = urlopen("http://127.0.0.1:8000/hello") + except HTTPError as e: + raise AssertionError(e) except URLError as e: if e.args[0][0] == ECONNREFUSED: sleep(1) else: raise AssertionError(e) + assert f + s = f.read() assert s == b"Hello World!" diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/test_value.py --- a/tests/web/test_value.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/test_value.py Fri Dec 16 22:18:11 2011 +1000 @@ -17,7 +17,7 @@ class Root(Controller): def index(self): - return self.push(Hello()) + return self.fire(Hello()) def test(webapp): Test().register(webapp) diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/test_web_task.py --- a/tests/web/test_web_task.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/test_web_task.py Fri Dec 16 22:18:11 2011 +1000 @@ -14,7 +14,7 @@ class Root(Controller): def index(self): - return self.push(Hello(os.getpid())) + return self.fire(Hello(os.getpid())) class Task(Component): diff -r 695978aaf92c8583bf211dbaa4f8288bb5995305 -r 9c27ee47262a3e16870724f309385156cbdade2f tests/web/test_websockets.py --- a/tests/web/test_websockets.py Fri Dec 16 06:01:19 2011 -0600 +++ b/tests/web/test_websockets.py Fri Dec 16 22:18:11 2011 +1000 @@ -17,7 +17,7 @@ channel = "ws" def message(self, sock, data): - self.push(Write(sock, data)) + self.fire(Write(sock, data)) class Test2(Component):