=============
 0.12 Series
=============

Release 0.12
============

IPython 0.12 contains several major new features, as well as a large amount of
bug and regression fixes.  The 0.11 release brought with it a lot of new
functionality and major refactorings of the codebase; by and large this has
proven to be a success as the number of contributions to the project has
increased dramatically, proving that the code is now much more approachable.
But in the refactoring inevitably some bugs were introduced, and we have also
squashed many of those as well as recovered some functionality that had been
temporarily disabled due to the API changes.

The following major new features appear in this version.


An interactive browser-based Notebook with rich media support
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A powerful new interface puts IPython in your browser. You can start it with
the command ``ipython notebook``:

.. figure:: ../_static/notebook_specgram.png
    :width: 400px
    :alt: The IPython notebook with embedded text, code, math and figures.
    :align: center
    :target: ../_static/notebook_specgram.png

    The new IPython notebook showing text, mathematical expressions in LaTeX,
    code, results and embedded figures created with Matplotlib.

This new interface maintains all the features of IPython you are used to, as it
is a new client that communicates with the same IPython kernels used by the
terminal and Qt console.  But the web notebook provides for a different
workflow where you can integrate, along with code execution, also text,
mathematical expressions, graphics, video, and virtually any content that a
modern browser is capable of displaying.

You can save your work sessions as documents that retain all these elements and
which can be version controlled, emailed to colleagues or saved as HTML or PDF
files for printing or publishing statically on the web.  The internal storage
format is a JSON file that can be easily manipulated for manual exporting to
other formats.

This Notebook is a major milestone for IPython, as for years we have tried to
build this kind of system.  We were inspired originally by the excellent
implementation in Mathematica, we made a number of attempts using older
technologies in earlier Summer of Code projects in 2005 (both students and
Robert Kern developed early prototypes), and in recent years we have seen the
excellent implementation offered by the `Sage <http://sagemath.org>` system.
But we continued to work on something that would be consistent with the rest of
IPython's design, and it is clear now that the effort was worth it: based on
the ZeroMQ communications architecture introduced in version 0.11, the notebook
can now retain 100% of the features of the real IPython.  But it can also
provide the rich media support and high quality Javascript libraries that were
not available in browsers even one or two years ago (such as high-quality
mathematical rendering or built-in video).

The notebook has too many useful and important features to describe in these
release notes; our documentation now contains a directory called
``examples/notebooks`` with several notebooks that illustrate various aspects
of the system.  You should start by reading those named
``00_notebook_tour.ipynb`` and ``01_notebook_introduction.ipynb`` first, and
then can proceed to read the others in any order you want.

To start the notebook server, go to a directory containing the notebooks you
want to open (or where you want to create new ones) and type::

  ipython notebook

You can see all the relevant options with::

  ipython notebook --help
  ipython notebook --help-all  # even more

and just like the Qt console, you can start the notebook server with pylab
support by using::
  
  ipython notebook --pylab

for floating matplotlib windows or::
  
  ipython notebook --pylab inline

for plotting support with automatically inlined figures.  Note that it is now
possible also to activate pylab support at runtime via ``%pylab``, so you do
not need to make this decision when starting the server.
  
See :ref:`the Notebook docs <htmlnotebook>` for technical details.


Two-process terminal console
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Based on the same architecture as the notebook and the Qt console, we also have
now a terminal-based console that can connect to an external IPython kernel
(the same kernels used by the Qt console or the notebook, in fact).  While this
client behaves almost identically to the usual IPython terminal application,
this capability can be very useful to attach an interactive console to an
existing kernel that was started externally.  It lets you use the interactive
``%debug`` facilities in a notebook, for example (the web browser can't
interact directly with the debugger) or debug a third-party code where you may
have embedded an IPython kernel.

This is also something that we have wanted for a long time, and which is a
culmination (as a team effort) of the work started last year during the 2010
Google Summer of Code project.
  
Tabbed QtConsole
~~~~~~~~~~~~~~~~

The QtConsole now supports starting multiple kernels in tabs, and has a
menubar, so it looks and behaves more like a real application.  Keyboard
enthusiasts can disable the menubar with ctrl-shift-M (:ghpull:`887`).

.. figure:: ../_static/qtconsole_tabbed.png
    :width: 400px
    :alt: Tabbed IPython Qt console with embedded plots and menus.
    :align: center
    :target: ../_static/qtconsole_tabbed.png

    The improved Qt console for IPython, now with tabs to control multiple
    kernels and full menu support.


Full Python 3 compatibility
~~~~~~~~~~~~~~~~~~~~~~~~~~~

IPython can now be installed from a single codebase on Python 2 and
Python 3. The installation process for Python 3 automatically runs 2to3. The
same 'default' profile is now used for Python 2 and 3 (the previous version had
a separate 'python3' profile).

Standalone Kernel
~~~~~~~~~~~~~~~~~

The ``ipython kernel`` subcommand has been added, to allow starting a
standalone kernel, that can be used with various frontends.  You can then later
connect a Qt console or a terminal console to this kernel by typing e.g.::

  ipython qtconsole --existing

if it's the only one running, or by passing explicitly the connection
parameters (printed by the kernel at startup).


PyPy support
~~~~~~~~~~~~

The terminal interface to IPython now runs under `PyPy <http://pypy.org/>`_.
We will continue to monitor PyPy's progress, and hopefully before long at least
we'll be able to also run the notebook.  The Qt console may take longer, as Qt
is a very complex set of bindings to a huge C++ library, and that is currently
the area where PyPy still lags most behind.  But for everyday interactive use
at the terminal, with this release and PyPy 1.7, things seem to work quite well
from our admittedly limited testing.

  
Other important new features
----------------------------

* **SSH Tunnels**: In 0.11, the :mod:`IPython.parallel` Client could tunnel its
  connections to the Controller via ssh. Now, the QtConsole :ref:`supports
  <ssh_tunnels>` ssh tunneling, as do parallel engines.

* **relaxed command-line parsing**: 0.11 was released with overly-strict
  command-line parsing, preventing the ability to specify arguments with spaces,
  e.g. ``ipython --pylab qt`` or ``ipython -c "print 'hi'"``. This has
  been fixed, by using argparse. The new parsing is a strict superset of 0.11, so
  any commands in 0.11 should still work in 0.12.

* **HistoryAccessor**: The :class:`~IPython.core.history.HistoryManager` class
  for interacting with your IPython SQLite history database has been split,
  adding a parent :class:`~IPython.core.history.HistoryAccessor` class, so that
  users can write code to access and search their IPython history without being
  in an IPython session (:ghpull:`824`).

* **kernel %gui and %pylab**: The ``%gui`` and ``%pylab`` magics have been
  restored to the IPython kernel (e.g. in the qtconsole or notebook). This
  allows activation of pylab-mode, or eventloop integration after starting the
  kernel, which was unavailable in 0.11.  Unlike in the terminal, this can be
  set only once, and cannot be changed.

* **%config**: A new ``%config`` magic has been added, giving easy access to the
  IPython configuration system at runtime (:ghpull:`923`).

* **Multiline History**: Multiline readline history has been restored to the
  Terminal frontend by default (:ghpull:`838`).

* **%store**: The ``%store`` magic from earlier versions has been updated and
  re-enabled (:ref:`extensions_storemagic`; :ghpull:`1029`). To autorestore
  stored variables on startup, specify ``c.StoreMagic.autorestore = True`` in
  :file:`ipython_config.py`.


Major Bugs fixed
----------------

In this cycle, we have :ref:`closed over 500 issues <issues_list_012>`, but a
few major ones merit special mention:

* Simple configuration errors should no longer crash IPython. In 0.11, errors
  in config files, as well as invalid trait values, could crash IPython. Now,
  such errors are reported, and help is displayed.

* Certain SyntaxErrors no longer crash IPython (e.g. just typing keywords, such
  as ``return``, ``break``, etc.). See :ghissue:`704`.

* IPython path utils, such as :func:`~IPython.utils.path.get_ipython_dir` now
  check for write permissions, so IPython should function on systems where the
  default path resolution might point to a read-only location, such as
  ``HOMESHARE`` on Windows (:ghissue:`669`).

* :func:`raw_input` now works in the kernel when multiple frontends are in
  use. The request will be sent to the frontend that made the request, and an
  exception is raised if that frontend does not support stdin requests
  (e.g. the notebook) (:ghissue:`673`).

* :mod:`zmq` version detection no longer uses simple lexicographical comparison
  to check minimum version, which prevents 0.11 from working with pyzmq-2.1.10
  (:ghpull:`758`).

* A bug in PySide < 1.0.7 caused crashes on OSX when tooltips were shown
  (:ghissue:`711`). these tooltips are now disabled on old PySide
  (:ghpull:`963`).

* IPython no longer crashes when started on recent versions of Python 3 in
  Windows (:ghissue:`737`).

* Instances of classes defined interactively can now be pickled (:ghissue:`29`;
:ghpull:`648`). Note that pickling saves a reference to the class definition,
so unpickling the instances will only work where the class has been defined.


Backwards incompatible changes
------------------------------

* IPython connection information is no longer specified via ip/port directly,
  rather via json connection files.  These files are stored in the security
  directory, and enable us to turn on HMAC message authentication by default,
  significantly improving the security of kernels.  Various utility functions
  have been added to :mod:`IPython.lib.kernel`, for easier connecting to existing
  kernels.

* :class:`~IPython.zmq.kernelmanager.KernelManager` now has one ip, and several
  port traits, rather than several ip/port pair ``_addr`` traits. This better
  matches the rest of the code, where the ip cannot not be set separately for
  each channel.

* Custom prompts are now configured using a new class,
:class:`~IPython.core.prompts.PromptManager`, which has traits for
:attr:`in_template`, :attr:`in2_template` (the ``...:`` continuation prompt),
:attr:`out_template` and :attr:`rewrite_template`. This uses Python's string
formatting system, so you can use ``{time}`` and ``{cwd}``, although we have
preserved the abbreviations from previous versions, e.g. ``\#`` (prompt number)
and ``\w`` (working directory). For the list of available fields, refer to the
source of :file:`IPython/core/prompts.py`.

* The class inheritance of the Launchers in
  :mod:`IPython.parallel.apps.launcher` used by ipcluster has changed, so that
  trait names are more consistent across batch systems. This may require a few
  renames in your config files, if you customized the command-line args for
  launching controllers and engines. The configurable names have also been
  changed to be clearer that they point to class names, and can now be
  specified by name only, rather than requiring the full import path of each
  class, e.g.::

    IPClusterEngines.engine_launcher = 'IPython.parallel.apps.launcher.MPIExecEngineSetLauncher'
    IPClusterStart.controller_launcher = 'IPython.parallel.apps.launcher.SSHControllerLauncher'

  would now be specified as::

    IPClusterEngines.engine_launcher_class = 'MPI'
    IPClusterStart.controller_launcher_class = 'SSH'

  The full path will still work, and is necessary for using custom launchers
  not in IPython's launcher module.
  
  Further, MPIExec launcher names are now prefixed with just MPI, to better match
  other batch launchers, and be generally more intuitive.  The MPIExec names are
  deprecated, but continue to work.

* For embedding a shell, note that the parameters ``user_global_ns`` and
  ``global_ns`` have been deprectated in favour of ``user_module`` and
  ``module`` respsectively.  The new parameters expect a module-like object,
  rather than a namespace dict.  The old parameters remain for backwards
  compatibility, although ``user_global_ns`` is now ignored. The ``user_ns``
  parameter works the same way as before, and calling
  :func:`~IPython.frontend.terminal.embed.embed` with no arguments still works
  as before.


Development summary and credits
-------------------------------

The previous version (IPython 0.11) was released on July 31 2011, so this
release cycle was roughly 4 1/2 months long, we closed a total of 515 issues,
257 pull requests and 258 regular issues (a :ref:`detailed list
<issues_list_012>`_ is available).

Many users and developers contributed code, features, bug reports and ideas to
this release.  Please do not hesitate in contacting us if we've failed to
acknowledge your contribution here.  In particular, for this release we have
had commits from the following 45 contributors, a mix of new and regular names
(in alphabetical order by first name):

* Alcides <alcides-at-do-not-span-me.com>
* Ben Edwards <bedwards-at-cs.unm.edu>
* Benjamin Ragan-Kelley <benjaminrk-at-gmail.com>
* Benjamin Thyreau <benjamin.thyreau-at-gmail.com>
* Bernardo B. Marques <bernardo.fire-at-gmail.com>
* Bernard Paulus <bprecyclebin-at-gmail.com>
* Bradley M. Froehle <brad.froehle-at-gmail.com>
* Brian E. Granger <ellisonbg-at-gmail.com>
* Christian Boos <cboos-at-bct-technology.com>
* Daniel Velkov <danielv-at-mylife.com>
* Erik Tollerud <erik.tollerud-at-gmail.com>
* Evan Patterson <epatters-at-enthought.com>
* Felix Werner <Felix.Werner-at-kit.edu>
* Fernando Perez <Fernando.Perez-at-berkeley.edu>
* Gabriel <g2p.code-at-gmail.com>
* Grahame Bowland <grahame-at-angrygoats.net>
* Hannes Schulz <schulz-at-ais.uni-bonn.de>
* Jens Hedegaard Nielsen <jenshnielsen-at-gmail.com>
* Jonathan March <jmarch-at-enthought.com>
* Jörgen Stenarson <jorgen.stenarson-at-bostream.nu>
* Julian Taylor <jtaylor.debian-at-googlemail.com>
* Kefu Chai <tchaikov-at-gmail.com>
* macgyver <neil.rabinowitz-at-merton.ox.ac.uk>
* Matt Cottingham <matt.cottingham-at-gmail.com>
* Matthew Brett <matthew.brett-at-gmail.com>
* Matthias BUSSONNIER <bussonniermatthias-at-gmail.com>
* Michael Droettboom <mdboom-at-gmail.com>
* Nicolas Rougier <Nicolas.Rougier-at-inria.fr>
* Olivier Verdier <olivier.verdier-at-gmail.com>
* Omar Andres Zapata Mesa <andresete.chaos-at-gmail.com>
* Pablo Winant <pablo.winant-at-gmail.com>
* Paul Ivanov <pivanov314-at-gmail.com>
* Pauli Virtanen <pav-at-iki.fi>
* Pete Aykroyd <aykroyd-at-gmail.com>
* Prabhu Ramachandran <prabhu-at-enthought.com>
* Puneeth Chaganti <punchagan-at-gmail.com>
* Robert Kern <robert.kern-at-gmail.com>
* Satrajit Ghosh <satra-at-mit.edu>
* Stefan van der Walt <stefan-at-sun.ac.za>
* Szabolcs Horvát <szhorvat-at-gmail.com>
* Thomas Kluyver <takowl-at-gmail.com>
* Thomas Spura <thomas.spura-at-gmail.com>
* Timo Paulssen <timonator-at-perpetuum-immobile.de>
* Valentin Haenel <valentin.haenel-at-gmx.de>
* Yaroslav Halchenko <debian-at-onerussian.com>
   
.. note::

    This list was generated with the output of
    ``git log rel-0.11..HEAD --format='* %aN <%aE>' | sed 's/@/\-at\-/' | sed 's/<>//' | sort -u``
    after some cleanup.  If you should be on this list, please add yourself.
