Version 3.0.0
====

Major features
--------------

* Adds support for developing `asyncio` applications with `python-can` more easily. This can be useful
  when implementing protocols that handles simultaneous connections to many nodes since you can write
  synchronous looking code without handling multiple threads and locking mechanisms. #388
* New can viewer terminal application. (`python -m can.viewer`) #390
* More formally adds task management responsibility to the `Bus`. By default tasks created with
  `bus.send_periodic` will have a reference held by the bus - this means in many cases the user
  doesn't need to keep the task in scope for their periodic messages to continue being sent. If
  this behavior isn't desired pass `store_task=False` to the `send_periodic` method. Stop all tasks
  by calling the bus's new `stop_all_periodic_tasks` method. #412


Breaking changes
----------------

* Interfaces should no longer override `send_periodic` and instead implement
  `_send_periodic_internal` to allow the Bus base class to manage tasks. #426
* writing to closed writers is not supported any more (it was supported only for some)
* the file in the reader/writer is now always stored in the attribute uniformly called `file`, and not in
  something like `fp`, `log_file` or `output_file`. Changed the name of the first parameter of the
  read/writer constructors from `filename` to `file`.


Other notable changes
---------------------

* can.Message class updated #413
    - Addition of a `Message.equals` method.
    - Deprecate id_type in favor of is_extended_id
    - Initializer parameter extended_id deprecated in favor of is_extended_id
    - documentation, testing and example updates
    - Addition of support for various builtins: __repr__, __slots__, __copy__
* IO module updates to bring consistency to the different CAN message writers and readers. #348
    - context manager support for all readers and writers
    - they share a common super class called `BaseIOHandler`
    - all file handles can now be closed with the `stop()` method
    - the table name in `SqliteReader`/`SqliteWriter` can be adjusted
    - append mode added in `CSVWriter` and `CanutilsLogWriter`
    - [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) and
      [path-like](https://docs.python.org/3/glossary.html#term-path-like-object) objects can now be passed to
      the readers and writers (except to the Sqlite handlers)
    - add a `__ne__()` method to the `Message` class (this was required by the tests)
    - added a `stop()` method for `BufferedReader`
    - `SqliteWriter`: this now guarantees that all messages are being written, exposes some previously internal metrics
      and only buffers messages up to a certain limit before writing/committing to the database.
    - the unused `header_line` attribute from `CSVReader` has been removed
    - privatized some attributes that are only to be  used internally in the classes
    - the method `Listener.on_message_received()` is now abstract (using `@abc.abstractmethod`)
* Start testing against Python 3.7 #380
* All scripts have been moved into `can/scripts`. #370, #406
* Added support for additional sections to the config #338
* Code coverage reports added. #346, #374
* Bug fix to thread safe bus. #397

General fixes, cleanup and docs changes: (#347, #348, #367, #368, #370, #371, #373, #420, #417, #419, #432)

Backend Specific Changes
------------------------

3rd party interfaces
~~~~~~~~~~~~~~~~~~~~

* Deprecated `python_can.interface` entry point instead use `can.interface`. #389

neovi
~~~~~

* Added support for CAN-FD #408
* Fix issues checking if bus is open. #381
* Adding multiple channels support. #415

nican
~~~~~

* implements reset instead of custom `flush_tx_buffer`. #364

pcan
~~~~

* now supported on OSX. #365


serial
~~~~~~

* Removed TextIOWrapper from serial. #383
* switch to `serial_for_url` enabling using remote ports via `loop://`, ``socket://` and `rfc2217://` URLs. #393
* hardware handshake using `rtscts` kwarg #402

socketcan
~~~~~~~~~

* socketcan tasks now reuse a bcm socket #404, #425, #426,
* socketcan bugfix to receive error frames #384

vector
~~~~~~

* Vector interface now implements `_detect_available_configs`. #362
* Added support to select device by serial number. #387

Version 2.2.1 (2018-07-12)
=====

* Fix errors and warnings when importing library on Windows
* Fix Vector backend raising ValueError when hardware is not connected

Version 2.2.0 (2018-06-30)
=====

* Fallback message filtering implemented in Python for interfaces that don't offer better accelerated mechanism.
* SocketCAN interfaces have been merged (Now use `socketcan` instead of either `socketcan_native` and `socketcan_ctypes`),
  this is now completely transparent for the library user.
* automatic detection of available configs/channels in supported interfaces.
* Added synchronized (thread-safe) Bus variant.
* context manager support for the Bus class.
* Dropped support for Python 3.3 (officially reached end-of-life in Sept. 2017)
* Deprecated the old `CAN` module, please use the newer `can` entry point (will be removed in an upcoming major version)

Version 2.1.0 (2018-02-17)
=====

* Support for out of tree can interfaces with pluggy.
* Initial support for CAN-FD for socketcan_native and kvaser interfaces.
* Neovi interface now uses Intrepid Control Systems's own interface library.
* Improvements and new documentation for SQL reader/writer.
* Fix bug in neovi serial number decoding.
* Add testing on OSX to TravisCI
* Fix non english decoding error on pcan
* Other misc improvements and bug fixes


Version 2.0.0 (2018-01-05
=====

After an extended baking period we have finally tagged version 2.0.0!

Quite a few major changes from v1.x:

* New interfaces:
  * Vector
  * NI-CAN
  * isCAN
  * neoVI
* Simplified periodic send API with initial support for SocketCAN
* Protocols module including J1939 support removed
* Logger script moved to module `can.logger`
* New `can.player` script to replay log files
* BLF, ASC log file support added in new `can.io` module

You can install from [PyPi](https://pypi.python.org/pypi/python-can/2.0.0) with pip:

```
pip install python-can==2.0.0
```

The documentation for v2.0.0 is available at http://python-can.readthedocs.io/en/2.0.0/
