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.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