0.9 series¶
Release 0.9.1¶
This release was quickly made to restore compatibility with Python 2.4, which version 0.9 accidentally broke. No new features were introduced, other than some additional testing support for internal use.
Release 0.9¶
New features¶
- All furl files and security certificates are now put in a read-only directory named ~/.ipython/security.
- A single function
get_ipython_dir(), inIPython.genutilsthat determines the user’s IPython directory in a robust manner. - Laurent’s WX application has been given a top-level script called ipython-wx, and it has received numerous fixes. We expect this code to be architecturally better integrated with Gael’s WX ‘ipython widget’ over the next few releases.
- The Editor synchronization work by Vivian De Smedt has been merged in. This code adds a number of new editor hooks to synchronize with editors under Windows.
- A new, still experimental but highly functional, WX shell by Gael Varoquaux. This work was sponsored by Enthought, and while it’s still very new, it is based on a more cleanly organized arhictecture of the various IPython components. We will continue to develop this over the next few releases as a model for GUI components that use IPython.
- Another GUI frontend, Cocoa based (Cocoa is the OSX native GUI framework), authored by Barry Wark. Currently the WX and the Cocoa ones have slightly different internal organizations, but the whole team is working on finding what the right abstraction points are for a unified codebase.
- As part of the frontend work, Barry Wark also implemented an experimental event notification system that various ipython components can use. In the next release the implications and use patterns of this system regarding the various GUI options will be worked out.
- IPython finally has a full test system, that can test docstrings with IPython-specific functionality. There are still a few pieces missing for it to be widely accessible to all users (so they can run the test suite at any time and report problems), but it now works for the developers. We are working hard on continuing to improve it, as this was probably IPython’s major Achilles heel (the lack of proper test coverage made it effectively impossible to do large-scale refactoring). The full test suite can now be run using the iptest command line program.
- The notion of a task has been completely reworked. An
ITaskinterface has been created. This interface defines the methods that tasks need to implement. These methods are now responsible for things like submitting tasks and processing results. There are two basic task types:IPython.kernel.task.StringTask(this is the oldTaskobject, but renamed) and the newIPython.kernel.task.MapTask, which is based on a function. - A new interface,
IPython.kernel.mapper.IMapperhas been defined to standardize the idea of amapmethod. This interface has a singlemapmethod that has the same syntax as the built-inmap. We have also defined amapperfactory interface that creates objects that implementIPython.kernel.mapper.IMapperfor different controllers. Both the multiengine and task controller now have mapping capabilties. - The parallel function capabilities have been reworks. The major changes are
that i) there is now an
@parallelmagic that creates parallel functions, ii) the syntax for multiple variable follows that ofmap, iii) both the multiengine and task controller now have a parallel function implementation. - All of the parallel computing capabilities from
ipython1-devhave been merged into IPython proper. This resulted in the following new subpackages:IPython.kernel,IPython.kernel.core,traitlets.config,IPython.toolsandIPython.testing. - As part of merging in the
ipython1-devstuff, thesetup.pyscript and friends have been completely refactored. Now we are checking for dependencies using the approach that matplotlib uses. - The documentation has been completely reorganized to accept the
documentation from
ipython1-dev. - We have switched to using Foolscap for all of our network protocols in
IPython.kernel. This gives us secure connections that are both encrypted and authenticated. - We have a brand new
COPYING.txtfiles that describes the IPython license and copyright. The biggest change is that we are putting “The IPython Development Team” as the copyright holder. We give more details about exactly what this means in this file. All developer should read this and use the new banner in all IPython source code files. - sh profile: ./foo runs foo as system command, no need to do !./foo anymore
- String lists now support
sort(field, nums = True)method (to easily sort system command output). Try it witha = !ls -l ; a.sort(1, nums=1). - ‘%cpaste foo’ now assigns the pasted block as string list, instead of string
- The ipcluster script now run by default with no security. This is done because the main usage of the script is for starting things on localhost. Eventually when ipcluster is able to start things on other hosts, we will put security back.
- ‘cd –foo’ searches directory history for string foo, and jumps to that dir. Last part of dir name is checked first. If no matches for that are found, look at the whole path.
Bug fixes¶
- The Windows installer has been fixed. Now all IPython scripts have
.batversions created. Also, the Start Menu shortcuts have been updated. - The colors escapes in the multiengine client are now turned off on win32 as they don’t print correctly.
- The
IPython.kernel.scripts.ipenginescript was exec’ing mpi_import_statement incorrectly, which was leading the engine to crash when mpi was enabled. - A few subpackages had missing
__init__.pyfiles. - The documentation is only created if Sphinx is found. Previously, the
setup.pyscript would fail if it was missing. - Greedy
cdcompletion has been disabled again (it was enabled in 0.8.4) as it caused problems on certain platforms.
Backwards incompatible changes¶
- The
clusterfileoptions of the ipcluster command has been removed as it was not working and it will be replaced soon by something much more robust. - The
IPython.kernelconfiguration now properly find the user’s IPython directory. - In ipapi, the
make_user_ns()function has been replaced withmake_user_namespaces(), to support dict subclasses in namespace creation. IPython.kernel.client.Taskhas been renamedIPython.kernel.client.StringTaskto make way for new task types.- The keyword argument
stylehas been renameddistinscatter,gatherandmap. - Renamed the values that the rename
distkeyword argument can have from'basic'to'b'. - IPython has a larger set of dependencies if you want all of its capabilities.
See the
setup.pyscript for details. - The constructors for
IPython.kernel.client.MultiEngineClientandIPython.kernel.client.TaskClientno longer take the (ip,port) tuple. Instead they take the filename of a file that contains the FURL for that client. If the FURL file is in your IPYTHONDIR, it will be found automatically and the constructor can be left empty. - The asynchronous clients in
IPython.kernel.asyncclientare now created using the factory functionsget_multiengine_client()andget_task_client(). These return aDeferredto the actual client. - The command line options to
ipcontrollerandipenginehave changed to reflect the new Foolscap network protocol and the FURL files. Please see the help for these scripts for details. - The configuration files for the kernel have changed because of the Foolscap stuff. If you were using custom config files before, you should delete them and regenerate new ones.
Changes merged in from IPython1¶
New features¶
- Much improved
setup.pyandsetupegg.pyscripts. Because Twisted and zope.interface are now easy installable, we can declare them as dependencies in our setupegg.py script. - IPython is now compatible with Twisted 2.5.0 and 8.x.
- Added a new example of how to use
ipython1.kernel.asynclient. - Initial draft of a process daemon in
ipython1.daemon. This has not been merged into IPython and is still inipython1-dev. - The
TaskControllernow has methods for getting the queue status. - The
TaskResultobjects not have information about how long the task took to run. - We are attaching additional attributes to exceptions
(_ipython_*)that we use to carry additional info around. - New top-level module
asyncclientthat has asynchronous versions (that return deferreds) of the client classes. This is designed to users who want to run their own Twisted reactor. - All the clients in
clientare now based on Twisted. This is done by running the Twisted reactor in a separate thread and using theblockingCallFromThread()function that is in recent versions of Twisted. - Functions can now be pushed/pulled to/from engines using
MultiEngineClient.push_function()andMultiEngineClient.pull_function(). - Gather/scatter are now implemented in the client to reduce the work load of the controller and improve performance.
- Complete rewrite of the IPython docuementation. All of the documentation from the IPython website has been moved into docs/source as restructured text documents. PDF and HTML documentation are being generated using Sphinx.
- New developer oriented documentation: development guidelines and roadmap.
- Traditional
ChangeLoghas been changed to a more usefulchanges.txtfile that is organized by release and is meant to provide something more relevant for users.
Bug fixes¶
- Created a proper
MANIFEST.infile to create source distributions. - Fixed a bug in the
MultiEngineinterface. Previously, multi-engine actions were being collected with aDeferredListwithfireononeerrback=1. This meant that methods were returning before all engines had given their results. This was causing extremely odd bugs in certain cases. To fix this problem, we have 1) setfireononeerrback=0to make sure all results (or exceptions) are in before returning and 2) introduced aCompositeErrorexception that wraps all of the engine exceptions. This is a huge change as it means that users will have to catchCompositeErrorrather than the actual exception.
Backwards incompatible changes¶
- All names have been renamed to conform to the lowercase_with_underscore
convention. This will require users to change references to all names like
queueStatustoqueue_status. - Previously, methods like
MultiEngineClient.push()andMultiEngineClient.push()used*argsand**kwargs. This was becoming a problem as we weren’t able to introduce new keyword arguments into the API. Now these methods simple take a dict or sequence. This has also allowed us to get rid of the*Allmethods likepushAll()andpullAll(). These things are now handled with thetargetskeyword argument that defaults to'all'. - The
MultiEngineClient.magicTargetshas been renamed toMultiEngineClient.targets. - All methods in the MultiEngine interface now accept the optional keyword
argument
block. - Renamed
RemoteControllertoMultiEngineClientandTaskControllertoTaskClient. - Renamed the top-level module from
apitoclient. - Most methods in the multiengine interface now raise a
CompositeErrorexception that wraps the user’s exceptions, rather than just raising the raw user’s exception. - Changed the
setupNSandresultNamesin theTaskclass topushandpull.