.. _release-0-12-14:

0.12.14
=======

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

* Addition of several tools to draw and edit point, rect, multi-line
  and patches glyphs (:bokeh-issue:`6370`) by modifying the underlying
  ColumnDataSource.

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

.. _release-0-12-14-migration:

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

Deprecations Removed
~~~~~~~~~~~~~~~~~~~~

The following deprecated features have been removed in this release:

* `DynamicImageRenderer` (consider GeoViews_ instead)
* BokehJS support for `*.tsx` templates (not typically user-facing)
* `autoload_server` (use `server_document` or `server_session` instead)

New Runtime Dependency
~~~~~~~~~~~~~~~~~~~~~~

The package ``packaging``, available via both conda and pip, was added as a
new runtime dependency.

Mapping of Unknown Categorical Factors
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Previously, data (e.g in a CDS column) referring to a categorical factor that
did not exist in the relevant ``FactorRange``, would cause an error in the
browser. Now, any such attempted mappings will silently return ``NaN``. Any
data points with these factors as coordinates will not render.

The practical motivation for this change is that updating a ``FactorRange``
to have a new set of factors could result in an inconsistency triggering the
error condition, causing plots to fail to render. With this change, the use-case
of updating factor ranges should work more smoothly, however there will be no
immediate indication of problems in case "bad" factors are included accidentally
in data other than the data points not being rendered.

Change To Text Glyph Legend
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Previously Text Glyphs added to legends would always unconditionally render
the word "text" as the visual symbol, which was not useful. Now, text glyphs
render an empty space in legends. This is helpful when it is desired to use
an interactive legend mute or hide both a primary glyph, as well as some
associated text that goes with it. For more discussion, see :bokeh-issue:`7337`.

MercatorTileSource change
~~~~~~~~~~~~~~~~~~~~~~~~~

`MercatorTileSource` models previously snapped to the closest zoom
level resulting in user supplied axis ranges to be largely
ignored. The default behavior has now been changed from snapping to
the closest zoom level to simply maintaining the correct aspect ratio,
while keeping the user defined bounds contained within the axis
ranges.

The old behavior may be restored by setting enabling the `snap_to_zoom`
property.

Defining views' CSS classes
~~~~~~~~~~~~~~~~~~~~~~~~~~~

This was previously done through `MyView.prototype.className`, which didn't
respect class structure, so it was often necessary to duplicate CSS rules in
sub-views. The new approach is to override `css_classes()` method, e.g.:

.. code-block:: typescript

    class MyView extends MyOtherView {
        css_classes() {
            return super.css_classes().concat("my-view")
        }
    }

This change affects only creators of custom extensions.

``HasProps.initialize()``
~~~~~~~~~~~~~~~~~~~~~~~~~

Previously ``HasProps.initialize()`` took `attrs` and `options` as its arguments.
This was nearly never used and so it was removed. The preferred way to configure
values of attributes is to use bokehjs' properties system. This change affects
only creators of custom extensions.

.. _GeoViews: http://geo.holoviews.org
.. _project roadmap: https://bokeh.org/roadmap
