<!--Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->

.. _changelog:

Changelog
=========

0.1.5 (2016-09-09) 
------------------
* clientTime field is represented in ISO 8601 format.
* Sampling ``mouseenter``, ``mouseleave``, and ``dragmove`` events by ``resolution`` parameter.
* Added Apache license headers.
* Updated versioning numbers.
* Added docker support.

0.1.4 (2016-08-04)
------------------
* New events Apache UserAle is tracking:

	* ``move``
	* ``resize``
	* ``scroll``

* Remove timer from ``dragdrop`` log due to incorrect time being recorded.
* Session id is autogenerated if not passed into configuration.

0.1.3 (2016-08-02)
------------------
* New events Apache UserAle is tracking:

	* ``mouseenter``
	* ``mouseleave``

0.1.2 (2016-08-01)
------------------
* The elapsed time for a drag event is being recorded in the ``dragdrop`` log.

0.1.1 (2016-07-29)
------------------

* All logs will be stored to file called userale.log (configurable).
* Users can specify which events to capture by passing in a list of event keys when instantiating Apache UserAle.
* These are the events Apache UserAle is tracking:

	* ``mouseup``
	* ``mousedown``
	* ``mousemove``
	* ``keypress`` (optional)
	* ``keydown`` (optional)
	* ``dragenter``
	* ``dragleave``
	* ``dragmove``
	* ``dragdrop``

0.1.0 (2016-06-24)
------------------

Initial release.