Changelog Pre Pulsar 1.0

Ver. 0.9.2 - 2014-Nov-18

  • A minor release with several bug fixes.
  • Bug fix in Links
  • A more flexible implementation of the make_router() method
  • Added the copy() method for cloning a router class without its routes.

Ver. 0.9.1 - 2014-Oct-14

  • Several fixes on Html initialisation and the Html.attr() method
  • Critical bug fix in WsgiHandler when passing response middleware
  • unidecode removed as hard dependency, wrong license
  • The Httpbin example shows how to use application hooks
  • Added AsyncString.before_render() method to add callbacks executed just before an asynchronous string is rendered
  • Fixed –daemon mode

Ver. 0.9.0 - 2014-Aug-04

  • Works with trollius 1.0.1 which is now a dependency for all supported python versions
  • 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 during development)
  • Added file log handler
  • Javascript and Css defaults libraries moved to a new project (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 requests
  • Finally removed the get_request_loop method. Full compatibility with asyncio
  • Bug fix in Store constructor
  • 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 internal exception
  • Critical bug fix in Router when children are added via a decorated method
  • trollius and unidecode added as dependencies in the setup.py script during installation
  • Better slugify() function
  • EventHandler requires a valid event loop during initialisation
  • Removed arbiter and monitor modules from async, one Actor class only, implementation differences handled by the different underlying Concurrency classes.
  • The Config adds the default values of excluded settings to the Config.params dictionary. In this way the parameters cannot be set on the command line but still be available.

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 windows

Ver. 0.8.3 - 2014-Jun-23

Ver. 0.8.2 - 2014-May-30

  • 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
  • Added Head.embedded_js for adding javascript code directly in the HtmlDocument
  • 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
  • Added default javascript libraries to the HtmlDocument
  • 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 module
  • The task application can run on redis.
  • 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 False.
  • The callable method in a AsyncString always returns a Future.

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(), new_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 imported first).
    • 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 coroutine_return() function.
    • 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 a result/exception.
    • 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 for details.
    • 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 scripting.
  • Websockets
    • 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).
  • WSGI
    • 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
  • Miscellaneous
    • 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 main distribution.
    • Application does not require to create picklable objects.
    • More robust serialisation of TestCase methods when used with the run_on_arbiter() decorator.
    • The shell application runs on a worker thread in the arbiter domain.
    • 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 decoding it
  • C extensions included in MANIFEST.in so that they can be compiled from PyPi
  • 823 regression tests, 91% coverage

Ver. 0.7.2 - 2013-Oct-16

  • A bug fix release.
  • Must upgrade if using the django pulse application.
  • Use ujson if installed.
  • Fixed wait for body middleware.
  • Fixed django pulse application when the client request has body to load.
  • 821 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 including: * 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 guidelines.
  • 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 the better.
  • Protocol consumer to handle one request only. Better upgrade method for connections.
  • 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 the logger.
  • 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 method.
    • 50% Faster Deferred initialisation.
    • Added Deferred.then() method for adding a deferred to a deferred’s callbacks without affecting the result.
  • Actors:
  • Applications:
    • Added flush method to the task queue backend. The method 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.
  • Miscellaneous:
    • 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 callbacks.
    • 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 further information.
    • Added async_sleep() function.
  • Actors
    • 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 function get_event_loop.
  • Applications
  • 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 a dictionary.
  • 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 actor attribute.
  • 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 "markdown".
  • Application can specify a version which overrides pulsar.__version__.
  • Added Profile test plugin to test application.
  • Task scheduler check for expired tasks via the pulsar.apps.tasks.Task.check_unready_tasks() method.
  • 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 more documentation.
  • 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