This document is the `change log`_ for this distribution. It is a
record of all notable changes in each version released.

Version strings conform to the `Semantic Versioning`_ specification,
`version 2.0.0 <http://semver.org/spec/v2.0.0.html>`__.

..  _change log: http://keepachangelog.com/
..  _Semantic Versioning: https://semver.org/


Version 2.3.0
=============

:Released: 2021-02-21
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Removed:

* Remove support for Python versions older than Python 3.

  Python 2 has been unsupported by the Python project since 2020.

* Remove dependency on back-ported `unittest2` and `mock`.
  Depend instead on standard library `unittest` and `unittest.mock`.

  Thanks to Michał Górny for the merge requests.


Version 2.2.4
=============

:Released: 2019-10-27
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* Run the Setuptools `egg-info` command as part of the `build`
  command.

  Closes: Pagure #31. Thanks to Stanislav Levin for the bug report and
  diagnosis.

* Create the socket and catch “non-socket” errors.

  Closes: Pagure #34. Thanks to Miro Hrončok for the bug report and
  patch.

* Only deal with a range of file descriptors if the range is not empty.

  Closes: Pagure #39. Thanks to Alex Pyrgiotis for the test scenario.

* Declare Twine as a build dependency.

* Reformat the change log entries with keepachangelog.com sub-sections.

Changed:

* Upgrade Tox dependency to version “3.7.0”.

  Thanks to Miro Hrončok for the contribution.

* Significant speed-up to discovery of file descriptors to close.

  By using a native `tuple` for the heavily-used file descriptor range
  representation, this gives approximately 5× faster calls to
  `close_all_open_files` in the typical case. This partially addresses
  Pagure #40.

  Thanks to Alex Pyrgiotis for testing various alternative proposals.

* Refactor the build system to use Makefile modules for each topic.


Version 2.2.3
=============

:Released: 2019-01-21
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* Use custom fake file type for testing `fileno` behaviour.

  This works around an incompatibility in Python 2.7 `file` type that
  caused test cases to fail.

Deprecated:

* Promote the warning for `runner` module to a `DeprecationWarning`.
  This has been an unofficial example module from the beginning, and
  it will be removed in a future version.


Version 2.2.2
=============

:Released: 2019-01-19
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* Remove from the build system specification a white space character
  not permitted in TOML format.

Added:

* Implement test suite automation in virtualenvs, using Tox.


Version 2.2.1
=============

:Released: 2019-01-18
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Add a :PEP:`518` conformant build system specification (the
  ``pyproject.toml`` file).


Version 2.2.0
=============

:Released: 2018-08-15
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* Correct the description of the return value for
  `daemon.is_detach_process_context_required`.

  Closes: Pagure #6.

* Set a sensible default for `Distribution.script_name`.

  This works around a bug in Setuptools which calls commands before
  the `Distribution` is initialised.

  Closes: Pagure #2.

Changed:

* The test suite now relies on the test discovery feature in
  ‘unittest’. This feature is in Python version 2.7 and later.

* Improve performance of `daemon.close_all_open_files`.

  Thanks to Darek Działak for the implementation.

  Closes: Pagure #10.


Version 2.1.2
=============

:Released: 2016-10-26
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Add a README document for the code base.

Changed:

* Migrate code project hosting to Pagure.
  Record the change of homepage URL in PyPI metadata.

Deprecated:

* Raise a warning that the ‘runner’ module is pending deprecation.
  This has been an unofficial example module from the beginning, and
  it will be removed in a future version.

Bugs Fixed:

* Ensure custom types are part of the Python type hierarchy.
* Avoid a circular dependency for the version string at install time.
  Thanks to Maarten van Gompel for the reproducible test case.


Version 2.1.1
=============

:Released: 2016-01-30
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* Default ‘initgroups’ option to False. Using ‘os.initgroups’ requires
  permission to set process GID, so this now needs to be explicitly
  requested.


Version 2.1.0
=============

:Released: 2015-11-26
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Add a DaemonContext option, ‘initgroups’, which specifies whether to
  set the daemon process's supplementary groups.
* Set the process groups using ‘os.initgroups’.
  Thanks to Malcolm Purvis for contributing an implementation of this
  feature.


Version 2.0.6
=============

:Released: 2015-08-30
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Changed:

* Lower dependency for ‘unittest2’, we can work with an earlier version.
* Specify development status “Production/Stable” in Trove classifiers.
* Migrate to ‘mock’ version 1.3 with corresponding API changes.

Bugs Fixed:

* Use current Python concept of “basestring” to test for an attribute name.
  Thanks to Arthur de Jong for the bug report.


Version 2.0.5
=============

:Released: 2015-02-02
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* Refine compatibility of exceptions for file operations.
* Specify the text encoding when opening the changelog file.


Version 2.0.4
=============

:Released: 2015-01-23
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Changed:

* Record version info via Setuptools commands.

Removed:

* Remove the custom Setuptools entry points.
  This closes Alioth bug#314948.


Version 2.0.3
=============

:Released: 2015-01-14
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Changed:

* Refactor all initial metadata functionality to ‘daemon._metadata’.
* Build a “universal” (Python 2 and Python 3) wheel.

Removed:

* Distribute ‘version’ (and its tests) only in source, not install.

Bugs Fixed:

* Break circular import dependency for ‘setup.py’.


Version 2.0.2
=============

:Released: 2015-01-13
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Include unit tests for ‘version’ module with source distribution.
* Record version info consistent with distribution metadata.

Bugs Fixed:

* Declare test-time dependency on recent ‘unittest2’.
* Declare packaging-time dependency on ‘docutils’ library.


Version 2.0.1
=============

:Released: 2015-01-11
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* Include the ‘version’ module with source distribution.


Version 2.0
===========

:Released: 2015-01-10
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Support both Python 3 (version 3.2 or later) and Python 2 (version
  2.7 or later).
* Document the API of all functions comprehensively in docstrings.
* Add a hacking guide for developers.
* Add explicit credit for contributors.
* Document the security impact of the default umask.

* Specify explicit text or binary mode when opening files.
* Preserve exception context in custom exceptions.

* Declare compatibility with current Python versions.
* Use ‘pydoc.splitdoc’ to get package description text.
* Include test suite with source distribution.
* Add unit tests for metadata.
* Store and retrieve version info in Setuptools metadata.

Changed:

* Depend on Python 3 compatible libraries.
* Update package homepage to Alioth hosted project page.
* Migrate to ‘str.format’ for interpolation of values into text.
* Migrate to ‘mock’ library for mock objects in tests.
* Migrate to ‘testscenarios’ library for unit test scenarios.
* Migrate to ‘unittest2’ library for back-ported improvements.
* Discriminate Python 2-and-3 compatible usage of dict methods.
* Discriminate Python 2-and-3 compatible bytes versus text.
* Declare explicit absolute and relative imports.
* Discriminate between different ‘fileno’ method behaviours.
  In Python 3, ‘StringIO.fileno’ is callable but raises an exception.
* Migrate to built-in ‘next’ function.
* Wrap the ‘fromlist’ parameter of ‘__import__’ for Python 3
  compatibility.
* Wrap function introspection for Python 3 compatibility.
* Wrap standard library imports where names changed in Python 3.
* Move package metadata to ‘daemon/_metadata.py’.
* Migrate to JSON (instead of Python) for serialised version info.

Removed:

* Remove ASCII translation of package description, not needed now the
  docstring is a proper Unicode text value.
* Remove custom test suite creation.


Version 1.6.1
=============

:Released: 2014-08-04
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Add editor hints for most files.

Changed:

* Distinguish continuation-line indentation versus block indentation.
* Use unicode literals by default, specifying bytes where necessary.
  This is to ease the port to Python 3, where the default string type
  is unicode.
* Update copyright notices.
* Update the GPL license file to version 3, as declared in our
  copyright notices.

* Change license of library code to Apache License 2.0. Rationale at
  <URL:http://wiki.python.org/moin/PythonSoftwareFoundationLicenseFaq#Contributing_Code_to_Python>.

Bugs Fixed:

* Use unambiguous “except FooType as foo” syntax.
  This is to ease the port to Python 3, where the ambiguous comma
  usage is an error.
* Ensure a ‘basestring’ name bound to the base type for strings.
  This is to allow checks to work on Python 2 and 3.
* Specify versions of Python supported, as trove classifiers.


Version 1.6
===========

:Released: 2010-05-10
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* FAQ: Add some entries and re-structure the document.
* MANIFEST.in: Include the documentation in the distribution.

Changed:

* Use absolute imports to disambiguate provenance of names.
* setup.py: Require ‘lockfile >=0.9’.

* Use ‘unicode’ data type for all text values.
* Prepare for Python 3 upgrade by tweaking some names and imports.

Removed:

* daemon/pidfile.py: Renamed from ‘daemon/pidlockfile.py’. Change
  references elsewhere to use this new name.
* test/test_pidfile.py: Renamed from ‘test/test_pidlockfile.py’.
  Change references elsewhere to use this new name.
* daemon/pidfile.py: Remove functionality now migrated to ‘lockfile’
  library.


Version 1.5.5
=============

:Released: 2010-03-02
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* Stop using ‘pkg_resources’ and revert to pre-1.5.3 version-string
  handling, until a better way that doesn't break everyone else's
  installation can be found.


Version 1.5.4
=============

:Released: 2010-02-27
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* MANIFEST.in: Explicitly include version data file, otherwise
  everything breaks for users of the sdist.


Version 1.5.3
=============

:Released: 2010-02-26
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* version: New plain-text data file to store project version string.
* Add ‘pylint’ configuration for this project.

Changed:

* setup.py: Read version string from data file.
* daemon/version/__init__.py: Query version string with ‘pkg_resources’.

* Update copyright notices.

Bugs Fixed:

* daemon/daemon.py: Invoke the pidfile context manager's ‘__exit__’
  method with the correct arguments (as per
  <URL:http://docs.python.org/library/stdtypes.html#typecontextmanager>).
  Thanks to Ludvig Ericson for the bug report.


Version 1.5.2
=============

:Released: 2009-10-24
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Add initial Frequently Asked Questions document.

Bugs Fixed:

* Ensure we only prevent core dumps if ‘prevent_core’ is true.
  Thanks to Denis Bilenko for reporting the lacking implementation of
  this documented option.


Version 1.5.1
=============

:Released: 2009-09-26
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Make a separate collection of DaemonRunner test scenarios.
* Handle a start request with a timeout on the PID file lock acquire.

* Implement ‘TimeoutPIDLockFile’ to specify a timeout in advance of
  lock acquisition.
* Use lock with timeout for ‘DaemonRunner’.


Version 1.5
===========

:Released: 2009-09-24
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Make a separate collection of PIDLockFile test scenarios.

Changed:

* Refactor code to ‘_terminate_daemon_process’ method.
* Improve explanations in comments and docstrings.
* Don't set pidfile at all if no path specified to constructor.
* Implement ‘PIDLockFile’ as subclass of ‘lockfile.LinkFileLock’.
* Remove redundant checks for file existence.

* Manage the excluded file descriptors as a set (not a list).

Bugs Fixed:

* Raise specific errors on ‘DaemonRunner’ failures.
* Distinguish different conditions on reading and parsing PID file.
* Write the PID file using correct OS locking and permissions.
* Close the PID file after writing.
* Only inspect the file descriptor of streams if they actually have
  one (via a ‘fileno’ method) when determining which file descriptors
  to close. Thanks to Ask Solem for revealing this bug.


Version 1.4.8
=============

:Released: 2009-09-17
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Document requirement for ensuring any operating-system specific
  signal handlers are considered.
* Add specific license terms for unit test suite scaffold.

Changed:

* Refactor ‘fork_then_exit_parent’ functionality to avoid duplicate
  code.

Removed:

* Remove redundant imports.
* Remove unused code from unit test suite scaffold.

Bugs Fixed:

* Remove child-exit signal (‘SIGCLD’, ‘SIGCHLD’) from default signal
  map. Thanks to Joel Martin for pinpointing this issue.


Version 1.4.7
=============

:Released: 2009-09-03
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Removed:

* Exclude ‘test’ package from distribution installation.

Bugs Fixed:

* Fix keywords argument for distribution setup.


Version 1.4.6
=============

:Released: 2009-06-21
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Update documentation for changes from latest PEP 3143 revision.
* Implement DaemonContext.is_open method.


Version 1.4.5
=============

:Released: 2009-05-17
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Improve docstrings by reference to, and copy from, PEP 3143.
* Use mock checking capabilities of newer ‘MiniMock’ library.
* Automate building a versioned distribution tarball.
* Include developer documentation files in source distribution.

Bugs Fixed:

* Register DaemonContext.close method for atexit processing.
* Move PID file cleanup to close method.


Version 1.4.4
=============

:Released: 2009-03-26
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Changed:

* Conform to current PEP version, now released as PEP 3143 “Standard
  daemon process library”.
* Redirect standard streams to null device by default.

Bugs Fixed:

* Ensure UID and GID are set in correct order.
* Delay closing all open files until just before re-binding standard
  streams.


Version 1.4.3
=============

:Released: 2009-03-19
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Bugs Fixed:

* Close the PID file context on exit.


Version 1.4.2
=============

:Released: 2009-03-18
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Context manager methods for DaemonContext.


Version 1.4.1
=============

:Released: 2009-03-18
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Changed:

* Improvements to docstrings.
* Further conformance with draft PEP.


Version 1.4
===========

:Released: 2009-03-17
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Complete statement coverage from unit test suite.

Changed:

* Implement the interface from a draft PEP for process daemonisation.


Version 1.3
===========

:Released: 2009-03-12
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Huge increase in unit test suite.

Changed:

* Separate controller (now ‘DaemonRunner’) from daemon process
  context (now ‘DaemonContext’).

Bugs Fixed:

* Fix many corner cases and bugs.


Version 1.2
===========

:Released: 2009-01-27
:Maintainer: Ben Finney <ben+python@benfinney.id.au>

Added:

* Begin unit test suite.

Changed:

* Initial release of this project forked from ‘bda.daemon’. Thanks,
  Robert Niederreiter.
* Refactor some functionality out to helper functions.


..
    This document is written using `reStructuredText`_ markup, and can
    be rendered with `Docutils`_ to other formats.

    ..  _Docutils: http://docutils.sourceforge.net/
    ..  _reStructuredText: http://docutils.sourceforge.net/rst.html

..
    This is free software: you may copy, modify, and/or distribute this work
    under the terms of the Apache License version 2.0 as published by the
    Apache Software Foundation.
    No warranty expressed or implied. See the file ‘LICENSE.ASF-2’ for details.

..
    Local variables:
    coding: utf-8
    mode: rst
    mode: text
    End:
    vim: fileencoding=utf-8 filetype=rst :
