.. _release-0-12-15:

0.12.15
=======

Bokeh Version ``0.12.15`` (Mar 2018) is an incremental update that adds a few
important features and fixes several bugs. Some of the highlights
include:

* Addressed several WebGL bugs (:bokeh-issue:`6867`, :bokeh-issue:`7087`, :bokeh-issue:`7211`, :bokeh-issue:`7681`)

* Switched to Chrome headless for CI image tests, will support better WebGL testing (:bokeh-issue:`6594`)

* Updated data source selections to be proper Bokeh models (:bokeh-issue:`6845`)

* Fixed memory leaks with certain kinds of Bokeh server usage (:bokeh-issue:`7468`)

* Added new glyphs for hexagon markers and hex tiles, and a new ``hexbin`` method :bokeh-issue:`7638`, (:bokeh-issue:`4786`)

* Completed BokehJS port to TypeScript (:bokeh-issue:`6481`)

Many other small bugfixes and docs additions. For full details see the
:bokeh-tree:`CHANGELOG`.

Additionally, we are pleased to announce `Bokeh joins NumFOCUS Sponsored Projects`_.

.. _Bokeh joins NumFOCUS Sponsored Projects: https://www.numfocus.org/blog/bokeh-joins-sponsored-projects/).

.. _release-0-12-15-migration:

`Migration Guide <releases.html#release-0-12-15-migration>`__
-------------------------------------------------------------

DataTable
~~~~~~~~~

The mis-named property ``DataTable.row_header`` has been deprecated. This
property confusingly controlled the presence of an index column in a
DataTable. Now, use the ``index_position`` property to specify where
an index column should be located in the table (use ``None`` to suppress
the index column).

Additionally, new properties ``index_header`` and ``index_width`` are
now available to further customize the index column appearance.

Selections
~~~~~~~~~~

The handling of selections has needed attention in Bokeh for some time.
This release adds a new Bokeh model :class:`~bokeh.models.selections.Selection`
to represent selections on data sources. Having a proper Bokeh model makes
selections simpler to use and to synchronize in apps than the previous
"bare dict" that represented selections.

The new :class:`~bokeh.models.selections.Selection` model is found in
the same location on data sources, i.e. ``source.selected``. It has the
following properties:

.. code-block:: python

    .indices            # which scatter typer indices have been hit
                        # previously selected["1d"].indices

    .line_indices       # which point(s) on a line have been hit
                        # previously selected["0d"].indices

    .multiline_indices  # which points on which line of a MultiLine
                        # previously selected["2d"].indices

In the near future, a property ``image_indices`` will be added to support
hit testing of image glyphs.

All code should update to use these new properties. For now *read only*
access to things like ``selected['1d'].indices`` will continue to function
as before for compatibility. However, programmatically *setting* selections
must now go through the mode properties, i.e. ``.indices``, ``.line_indices``,
etc.

Grid Bounds
~~~~~~~~~~~

Grids now automatically defer to any existing axis bounds when their
own bounds are set to `"auto"`. Previously grids used always used the full
range bounds. This change makes it simpler to have axes and grids both
use a consistent set of bounds.

Minor Ticks
~~~~~~~~~~~

Minor ticks are no longer displayed outside explicitly set axis bounds.
Previously minor ticks would display one extra "major tick" distance outside
explicit range bounds.

NO_DATA_RENDERERS
~~~~~~~~~~~~~~~~~

This validation warning resulted in false or irrelevant warnings in many
reasonable configurations, and has been removed.

Document and ServerContext callbacks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All `Document` and `ServerContext` methods that add callbacks can now add
the same callback multiple times.
Methods that remove callbacks now receive the value returned from a previous
method call that added the callback. Example:

.. code-block:: python

    # Was
    doc.add_next_tick_callback(my_cb)
    doc.remove_next_tick_callback(my_cb)

    # Now
    cb_id = doc.add_next_tick_callback(my_cb)
    doc.remove_next_tick_callback(cb_id)

Sphinx Version
~~~~~~~~~~~~~~

The `bokeh.sphinxext` Sphinx extension has been updated to work with current
versions. Sphinx >= 1.6 is now required to use the extension.

.. _project roadmap: https://bokeh.org/roadmap
