Ver. 0.9.0 - Development
- Dropped support for python 3.3, the supported versions are now python 2.7,
python 3.4 and pypy.
- Works with trollius 1.0
- Added FlowControl and Timeout protocol mixins,
PulsarProtocol now inherits from FlowControl
- Better handling of streaming responses by the wsgi server
- Added the –reload command line option and
configuration parameter. If used, pulsar auto-reload code changes (useful
- Added file log handler
(https://github.com/quantmind/jslibs) and the json file
(http://quantmind.github.io/jslibs/libs.json) lazily loaded if needed by
either Links or Scripts classes
- The HttpClient can be used in conjunction with
greenlet support to write implicit asynchronous HTTP
- Finally removed the get_request_loop method. Full compatibility with
- Bug fix in Store constructor
- Twisted integration via the tx() decorator
- When throwing an ImproperlyConfigured exception, pulsar will log
and error without the full stack-trace
(exit_code attribute is set to 2).
Useful when stopping execution because of a wrong input rather than an
- Critical bug fix in Router when children are added via a decorated
- trollius and asyncio added as dependencies in the setup.py
script during installation
- Better slugify() function
- EventHandler requires a valid event loop
- Removed arbiter and monitor module in async.
Ver. 0.8.4 - 2014-Jul-07
- Several bug fixes in wsgi Router
- Added Route.name attribute
- WsgiResponse does not send cookies back to the client by default
- Critical bug fix for multiprocessing sockets when running on python 3.4 and
Ver. 0.8.2 - 2014-May-30
- –pep8 is a new command line option for the
- ProtocolConsumer has its own _loop attribute rather than
obtaining indirectly from the underling Connection.
This avoids several logging errors when a connection is dropped
- Added utilities to execute PostgreSql queries via
psycopg2 in asynchronous mode via the greenio module.
- Django pulse application can be run asynchronously
when using PostgreSql database.
It requires the greenlet module
- Improved management of meta tags in the HTML5 Head class
- Added OAuth1 and OAuth2 hooks to the
http module (alpha and untested)
- Bug fix in HttpParser when Transfer-Encoding=chunked
- Both wsgi request wrappers and content don’t use coroutines but
straight Future for compatibility with other frameworks.
- pulsar can be imported and used (with limited scope) in the google appengine
Ver. 0.8.1 - 2014-Apr-14
- Added pulsar.apps.greenio application for writing asynchronous code
using the greenlet library.
- Moved PulsarDS server into its own pulsar.apps.ds
- The task application can run on redis.
- Added support for couchdb datastore (alpha)
- Added twisted integration (alpha)
- Removed Server and Date from Hop headers
- Fixed installation problem with extensions
- More documentation for data stores
- Added ability to serve directories in MediaRouter if the
path contain a default_file (index.html). This also means
show_indexes in MediaRouter initialisation is by default
- The callable method in a AsyncString always returns a
Ver. 0.8.0 - 2014-Mar-06
- Backward incompatible version
- Asyncio Integration
- asyncio integration with several changes in internals. The integration
works with all supported python versions: 2.7, 3.3 and 3.4
- Asyncio event loop functions get_event_loop(),
are available from pulsar top level module as well as asyncio.
In other words from pulsar import get_event_loop and
from asyncio import get_event_loop are equivalent (provided pulsar is
- Replaced the Deferred class with asyncio.Future.
- Replaced the EventLoop class with
asyncio event loop.
- Core library
- Removed support for python 2.6 and python 3.2.
- Coroutines can return a value via the
- Added run_in_loop() high level function. This utility
runs a callable in the event loop thread and returns a
Future called back once the callable has
- Added in_loop() and task() decorators for
member functions of async objects.
- async() is now a function, not a decorator.
- Added the new Pool class for managing a pool of asynchronous
connection with a server.
- Embedding third-party asynchronous frameworks can be achieved via the
new add_async_binding() function.
- Removed Client class and replaced by AbstractClient which
in turns is a subclass of connections Producer.
- Removed force_sync parameter when creating synchronous components.
Synchronous objects are now created by explicitly passing a new event
loop during initialisation.
Check the the synchronous components tutorial
- Added the data-store setting for specifying
the default data store of a running application.
- Added the exc-id setting which uniquely specify
the identity of a running application. This is useful during testing.
- Unified the handshake across all actors
- New data store module
- New pulsar.apps.data module for managing asynchronous data stores.
- Two stores available: redis and pulsar-ds.
- Additional stores can be created by subclassing the Store
abstract class and registering it via the register_store() function.
- The pulsar-ds is a python implementation of
the popular redis server. It implements most redis commands including
- The web socket on_open() method is invoked soon
after upgrade headers are sent. No need to send a message from the client
to kick start the bidirectional communication.
- Websocket C extensions for faster parsing/masking.
- Added support for sending close()
frames with an optional status code, and for parsing close frames
with a body via the parse_close() function (for websocket clients).
- Better handling of cookies in WsgiResponse
- Router can have children even if it is a leaf node
- Dropped support for http-parser, only HTTP python parser used
- The pulsar.apps.pubsub has been removed. Publish/subscribe
implementations are now available in the new pulsar.apps.data module.
- The Backend class has been removed.
- Improved django example with possibility to
choose different data stores for messages.
- Removed the twisted integration module and moved it to the example directory.
The integration is not tested enough and therefore cannot be part of the
- Application does not require to create picklable objects.
- More robust serialisation of TestCase methods when used with the
- The shell application runs on a worker thread in the
- The Configurator.start() method returns a Future
called back once the applications in the configurator are running.
- Added a new script for building releases for pypi (buildrelease.py)
- 1,166 regression tests, 91% coverage.
Ver. 0.7.4 - 2013-Dec-22
- A bug fix release.
- Fixes an issue with Cookie handling in the wsgi application.
- Don’t log errors when writing back to a stale client
- 822 regression tests, 91% coverage
Ver. 0.7.3 - 2013-Dec-12
- A bug fix release.
- setup.py only import pulsar version and skip the rest
- The wait_for_body_middleware() read the HTTP body only without
- C extensions included in MANIFEST.in so that they can be compiled from PyPi
- 823 regression tests, 91% coverage
Ver. 0.7.1 - 2013-Oct-14
- Documentation fixes
- Critical fix in setup.py for python 2.
- Replaced the favicon in documentation.
- 807 regression tests, 90% coverage.
Ver. 0.7.0 - 2013-Oct-13
- Several improvements and bug fixes in the Http Client
* SSL support
* Proxy and Tunnelling
* Cookie support
* File upload
- Code coverage can be turned on by using the --coverage option. By
passing in the command line --coveralls when testing, coverage is
published to coveralls.io.
- WSGI responses 400 Bad Request to request with no Host header if the
request URI is not an absolute URI. Follows the rfc2616 sec 5.2
- Removed the specialised application worker and monitor classes.
Use standard actor and monitor with specialised
start hooks instead.
- Removed the global event dispatcher. No longer used. Less global variables
- Protocol consumer to handle one request only. Better upgrade method for
- Proper handling of secure connections in wsgi applications.
- Added accept_content_type method to WSGI Router.
- Ability to add embedded css rules into the head
element of an Html document.
- Added Actor.stream attribute to write messages without using
- Pass pep8 test.
- 807 regression tests, 90% coverage.
Ver. 0.6.0 - 2013-Sep-05
- Several new features, critical bug fixes and increased tests coverage.
- Core library:
- Removed is_async function. Not used.
- The async decorator always return a
Deferred, it never throws.
- Created the Poller base class for implementing different
types of event loop pollers. Implementation available for epoll,
kqueue and select.
- Modified Failure implementation to handle one exc_info
only and better handling of unlogged failures.
- Added an asynchronous FIFO Queue.
- Added async_while() utility function.
- Socket servers handle IPV6 addresses.
- Added SSL support for socket servers.
- Tasks throw errors back to the coroutine via the generator throw
- 50% Faster Deferred initialisation.
- Added Deferred.then() method for adding a deferred to a
deferred’s callbacks without affecting the result.
- Added flush method to the
task queue backend.
The metod can be used to remove all tasks and empty the task queue.
- Better handling of non-overlapping jobs
in a task queue.
- Added when_exit application hook.
- Added –io option for controlling the default
selector from python selectors module.
- Critical bug fix in python 3 WSGI server.
- Added full_route and rule attributes to wsgi Router.
- Added –show_leaks option
for showing a memory leak report after a test run.
- Added -e, –exclude-labels option
for excluding labels in a test run.
- Several fixes in the test application.
- Critical bug fix in python Http parser (4bd8a54).
- Bug fix and enhancement of Router metaclass. It
is now possible to overwrite the relative position of children routes
via the route decorator.
- Proxy server example uses the new Queue.
- Added exceptions documentation.
- 558 regression tests, 88% coverage.
Ver. 0.5.2 - 2013-June-30
- Introduced the Router parameter for propagating
attributes to children routes. router can also have a name so that
they can easily be retrieved via the get_route method.
- Bug fix in Asynchronous Wsgi String __repr__ method.
- Critical bug fix in Wsgi server when a failure without a stack trace occurs.
- Critical bug fix in WebSocket frame parser.
- WebSocket handlers accept the WebSocket protocol as first argument.
- 448 regression tests, 87% coverage.
Ver. 0.5.1 - 2013-June-03
- Several bug fixes and more docs.
- Fixed ThreadPool for for python 2.6.
- Added the safe_async() function for safely executing synchronous
and asynchronous callables.
- The Config.get() method never fails. It return the
default value if the setting key is not available.
- Improved setup.py so that it does not log a python 2 module syntax error
when installing for python 3.
- Wsgi Router makes sure that the pulsar.cache key in
the environ does not contain asynchronous data before invoking the
callable serving the request.
- 443 regression tests, 87% coverage.
Ver. 0.5.0 - 2013-May-22
- This is a major release with considerable amount of internal refactoring.
- Core library
- pep-3156 implementation.
- New pep-3156 compatible EventLoop.
- Added the Deferred.cancel() method to cancel asynchronous
- Deferred accepts a timeout as initialisation parameter.
If a value greater than 0 is given, the deferred will add a timeout to the
event loop to cancel itself in timeout seconds.
- DeferredTask stops after the first error by default.
This class replace the old DeferredGenerator and provides a cleaner
API with inline syntax. Check the
asynchronous components tutorial for
- Added async_sleep() function.
- Actor internal message passing uses the (unmasked)
websocket protocol in a bidirectional communication between the
Arbiter and actors.
- Spawning and stopping actors is monitored using a timeout set at 5 seconds.
- Added pulsar.async.consts module for low level pulsar constants.
- Removed the requestloop attribute, the actor event loop is now accessed
via the Actor._loop attribute or via the pep-3156
- Initial twisted integration
- Introduced in this application.
- Added set_async() function which can be used to change
the asynchronous discovery functions maybe_async()
and maybe_failure(). The function is used in the
implementation of twisted integration and could
be used in conjunction with other asynchronous libraries as well.
- New Webmail example application using twisted
IMAP4 protocol implementation.
- Added FrozenDict.
- 444 regression tests, 87% coverage.
Ver. 0.4.6 - 2013-Feb-8
- Added websocket chat example.
- Fixed bug in wsgi parser.
- Log WSGI environ on HTTP response errors.
- Several bug-fixes in tasks application.
- 374 regression tests, 87% coverage.
Ver. 0.4.5 - 2013-Jan-27
- Refactored pulsar.apps.rpc.JsonProxy class.
- Websocket does not support any extensions by default.
- 374 regression tests, 87% coverage.
Ver. 0.4.4 - 2013-Jan-13
- Documentation for development version hosted on github.
- Modified Actor.exit() so that it shuts down Actor.mailbox
after closing the Actor.requestloop.
- Fixed bug which prevented daemonisation in posix systems.
- Changed the Deferred.result_or_self() method to return the
result when the it is called and no callbacks are available.
It avoids several unnecessary calls on deeply nested Deferred
(which sometimes caused maximum recursion depth exceeded).
- Fixed calculator example script.
- 374 regression tests, 87% coverage.
Ver. 0.4.3 - 2012-Dec-28
- Removed the tasks in event loop. A task can only be added by appending
callbacks or timeouts.
- Fixed critical bug in MultiDeferred.
- Test suite works with multiple test workers.
- Fixed issue #17 on asynchronous shell application.
- Dining philosophers example works on events only.
- Removed obsolete safe_monitor decorator in pulsar.apps.
- 365 regression tests, 87% coverage.
Ver. 0.4.2 - 2012-Dec-12
- Fixed bug in boolean validation.
- Refactored TestPlugin to handle multi-parameters.
- Removed unused code and increased test coverage.
- 338 regression tests, 86% coverage.
Ver. 0.4.1 - 2012-Dec-04
- Test suite can load test from single files as well as directories.
- handle_wsgi_error() accepts optional content_type
and encoding parameters.
- Fix issue #20, test plugins not included are not available in the command line.
- Application call Config.on_start() before starting.
- 304 regression tests, 83% coverage.
Ver. 0.4 - 2012-Nov-19
- Overall refactoring of API and therefore incompatible with previous versions.
- Development status set to Beta.
- Support pypy and python 3.3.
- Added the new pulsar.utils.httpurl module for HTTP tools and HTTP
synchronous and asynchronous clients.
- Refactored Deferred to be more compatible with twisted. You
can add separate callbacks for handling errors.
- Added MultiDeferred for handling a group of asynchronous
elements independent from each other.
- The pulsar.Mailbox does not derive from threading.Thread so
that the eventloop can be restarted.
- Removed the ActorMetaClass. Remote functions are specified using
- Socket and WSGI Application are built on top of the new
AsyncSocketServer framework class.
- 303 regression tests, 83% coverage.
Ver. 0.3 - 2012-May-03
- Development status set to Alpha.
- This version brings several bug fixes, more tests, more docs, and improvements
in the pulsar.apps.tasks application.
- Added Job.send_to_queue() method for allowing
Task to create new tasks.
- The current Actor is always available on the current thread
- Trap errors in pulsar.IOLoop.do_loop_tasks() to avoid having monitors
crashing the arbiter.
- Added pulsar.system.system_info() function which returns system information
regarding a running process. It requires psutil.
- Added global spawn() and send() functions for
creating and communicating between Actor.
- Fixed critical bug in pulsar.net.HttpResponse.default_headers().
- Added pulsar.utils.http.Headers.pop() method.
- Allow pulsar.apps.tasks.Job.can_overlap to be a callable.
- Added pulsar.apps.tasks.Job.doc_syntax attribute which defaults to
- Application can specify a version which overrides
- Added Profile test plugin to test application.
- Task scheduler check for expired tasks via the
- PEP 386-compliant version number.
- Setup does not fail when C extensions fail to compile.
- 95 regression tests, 75% coverage.
Ver. 0.2.1 - 2011-Dec-18
- Catch errors in pulsar.apps.test.run_on_arbiter().
- Added new setting for configuring http responses when an unhandled error
occurs (Issue #7).
- It is possible to access the actor Actor.ioloop form the
current thread ioloop attribute.
- Removed outbox and replaced inbox with Actor.mailbox.
- windowsservice wrapper handle pulsar command lines options.
- Modified the WsgiResponse handling of streamed content.
- Tests can be run in python 2.6 if unittest2 package is installed.
- Fixed chunked transfer encoding.
- Fixed critical bug in socket server pulsar.Mailbox. Each client connections
has its own buffer.
- 71 regression tests
Ver. 0.2.0 - 2011-Nov-05
- A more stable pre-alpha release with overall code refactoring and a lot
- Fully asynchronous applications.
- Complete re-design of pulsar.apps.test application.
- Added Mailbox classes for handling message passing between actors.
- Added pulsar.apps.ws, an asynchronous websocket application for pulsar.
- Created the pulsar.net module for internet primitive.
- Added a wrapper class for using pulsar with windows services.
- Removed the pulsar.worker module.
- Moved http.rpc module to apps.
- Introduced context manager for pulsar.apps.tasks to handle logs and exceptions.
- 61 regression tests
Ver. 0.1.0 - 2011-Aug-24
- First (very) pre-alpha release.
- Working for python 2.6 and up, including python 3.
- Five different applications: HTTP server, RPC server, distributed task queue,
asynchronous test suite and asynchronous shell.
- 35 regression tests