==========================
- Added
* a :class:`~msl.network.client.Link` can create an exclusive or shared lock
with a :class:`~msl.network.service.Service`
* add :attr:`~msl.network.client.Link.service_max_clients` property to a
:class:`~msl.network.client.Link` and
:class:`~msl.network.client.LinkedClient`
* the :attr:`~msl.network.network.Device.loop_thread_id` property for a
:class:`~msl.network.service.Service` and a :class:`~msl.network.client.Client`
* the :meth:`~msl.network.service.Service.emit_notification_threadsafe` method
for a :class:`~msl.network.service.Service`
* ability to specify the `host` to use when starting a :class:`~msl.network.manager.Manager`
* support for Python 3.9, 3.10 and 3.11
* :func:`~msl.network.network.Network.set_logging_level` to be able to set the
logging level at runtime
* ability to add tasks to the event loop via the
:meth:`~msl.network.network.Device.add_tasks` method
* the :meth:`~msl.network.network.Device.shutdown_handler` method is called
after the connection to the :class:`~msl.network.manager.Manager` is lost
but before the event loop stops
* ability to use all :class:`~msl.network.database.Database` classes as a
context manager (i.e., using a `with` statement)
* the ``--log-level`` flag to the ``start`` command
* the ``delete`` command-line argument to delete files that are created by MSL-Network
* `orjson <https://pypi.org/project/orjson/>`_ as a JSON backend to
:class:`~msl.network.json.Package`
* ``JSON``, ``UJSON``, ``RAPIDJSON`` and ``SIMPLEJSON`` are aliases
for the JSON backends in :class:`~msl.network.json.Package`
* the ``read_limit`` keyword arguments to
:func:`~msl.network.client.connect` and
:meth:`~msl.network.service.Service.start`
* the ``auto_save`` keyword argument to :func:`~msl.network.client.connect`
and :func:`~msl.network.cryptography.get_ssl_context`
* the ``digest_size`` keyword argument to
:func:`~msl.network.cryptography.generate_certificate` and
:func:`~msl.network.cryptography.get_fingerprint`
* the ``name`` and ``extensions`` keyword arguments to
:func:`~msl.network.cryptography.generate_certificate`,
* ``**kwargs`` to :func:`~msl.network.cryptography.get_ssl_context`
- Changed
* the `result` object that is returned by a :class:`~msl.network.service.Service`
response can implement a callable ``to_json()`` method
* the value of the ``algorithm`` keyword argument in
:func:`~msl.network.cryptography.get_fingerprint`
can now also be of type :class:`str`
* renamed ``uuid`` to be ``uid`` in the JSON format
* making an asynchronous request now returns a :class:`concurrent.futures.Future` instance
instead of an :class:`asyncio.Future` instance
* :class:`~msl.network.client.Client` and :class:`~msl.network.service.Service`
are subclasses of :class:`~msl.network.network.Device`
* move the ``utils.localhost_aliases`` function to be defined as
:attr:`~msl.network.constants.LOCALHOST_ALIASES`
* renamed the ``Client.manager`` method to :meth:`~msl.network.client.Client.identities`
* renamed ``certfile`` to ``cert_file`` in :func:`~msl.network.client.connect`,
:meth:`~msl.network.service.Service.start`
and :func:`~msl.network.cryptography.get_ssl_context`
* can now change which JSON backend to use during runtime by calling the
:func:`~msl.network.json.use` function
* moved the ``msl.network.constants.JSONPackage`` class to
:class:`msl.network.json.Package`
* renamed the command line arguments ``--certfile`` to ``--cert-file``,
``--keyfile`` to ``--key-file``, ``--keyfile-password`` to ``--key-file-password``,
and ``--logfile`` to ``--log-file`` for the ``start`` command
* use ``T`` as the separator between the date and time in
a :class:`~msl.network.database.ConnectionsTable`
* rename the keyword arguments ``timestamp1`` to ``start`` and ``timestamp2``
to ``end`` in :meth:`~msl.network.database.ConnectionsTable.connections`
* the default filename for the certificate and key files now use ``'localhost'``
instead of the value of `HOSTNAME`
- Fixed
* an ``AttributeError`` could be raised when generating the identity of a
:class:`~msl.network.service.Service`
* can now handle multiple requests/replies contained within the same network
packet
- Removed
* Support for Python 3.5
* the ``MSLNetworkError`` exception class (a :exc:`RuntimeError` is raised instead)
* the ``Service.set_debug`` method
* the ``termination`` and ``encoding`` class attributes of
:class:`~msl.network.network.Network`
* the ``send_pending_requests``, ``raise_latest_error`` and ``wait``
methods of a :class:`~msl.network.client.Client`
* the ``--debug`` flag from the ``start`` command
* the ``utils.new_selector_event_loop`` function
* the ``constants.JSON`` attribute
* `YAJL <https://pypi.org/project/yajl/>`_ as a JSON backend option