3.0.1
=====

  - Fix the ``base64`` cast accepting malformed padding depending on the
    interpreter. CPython only rejects it consistently from 3.12.10 on, so
    ``YWJj===`` decoded fine on some versions and raised on others, including
    between patch releases of 3.12. The cast now requires the value to be the
    canonical encoding of what it decodes to, which behaves the same
    everywhere and also rejects non-canonical trailing bits.
  - Add a ``make test-all`` target, which runs the test suite against every
    supported python version, and a ``make check-versions`` check that fails
    when the CI matrix drifts from the classifiers in ``pyproject.toml``.
  - Fix the release workflow passing an empty python version to ``setup-uv``,
    and declaring job permissions that dropped the ``contents: read`` needed by
    the checkout step.

3.0.0
=====

  Backward incompatible changes:

  - Rewrite the ``.env`` parser to follow shell/bash rules. A ``#`` now only
    starts a comment at the beginning of a line or after whitespace, so
    ``PASSWORD=abc#123`` reads as ``abc#123`` instead of ``abc``. A backslash
    now escapes the next character and is dropped from the value, so
    ``VALUE=a\#b`` reads as ``a#b`` instead of ``a``. Quoting state no longer
    leaks from one variable into the next. **This changes values silently**:
    review any ``.env`` entry containing ``#`` or ``\`` before upgrading.
  - Drop support for Python 3.9. The minimum supported version is now 3.10.
  - ``default`` is now an explicit keyword-only argument instead of being read
    from ``**kwargs``. Passing an unexpected keyword argument raises
    ``TypeError`` instead of being silently ignored.
  - ``config.option`` is now a factory function rather than the ``Option`` class
    itself, so the option type survives the attribute access.
  - ``Tuple`` is no longer a subclass of ``List``; both now derive from
    ``DelimitedSequence``, and the undocumented ``List.cast()`` hook is gone.
  - Casts no longer put the value they rejected in their error message, which
    leaked secrets into tracebacks and logs. The message now names the
    configuration that failed and why, and ``Option`` lists the valid choices
    instead of the rejected value.
  - A ``KeyError`` raised by a cast is no longer mistaken for "this loader does
    not have the variable". Only a ``KeyError`` from a loader moves the lookup
    down the chain, as the documentation always described.

  Deprecations:

  - Every exception was renamed to carry the ``Error`` suffix
    (``ConfigurationError``, ``InvalidConfigurationError``, ``InvalidPathError``,
    ``UnknownConfigurationError``, ``InvalidConfigurationFileError`` and
    ``MissingSettingsSectionError``). The old names are aliases of the new ones,
    so existing ``except`` clauses keep working; importing them now emits a
    ``DeprecationWarning`` and they will be removed in a future release.

  Other changes:

  - ``config()`` now infers its return type from the ``cast`` argument, so
    ``config("DEBUG", cast=config.boolean)`` is typed as ``bool`` and
    ``config("PORT", cast=int)`` as ``int``. The package ships a ``py.typed``
    marker, so the annotations reach the type checkers of anyone installing it
  - Add a ``config.base64`` cast, which decodes a whole file encoded as a single
    base64 string, so credentials that only exist as files (a ``.json`` service
    account, a ``.p8`` signing key) fit in one configuration variable. It
    returns ``bytes``, or ``str`` when built as ``Base64("utf-8")``
  - Add support for Python 3.14
  - Fix ``Boolean(values)`` mutating the class-wide ``default_values``
    dictionary, which leaked custom values into every other instance
  - Document the exception hierarchy, which was not documented at all
  - Document the ``.env`` file syntax: comments, quoting, escaping and line
    continuation, including what changed in this release
  - Mention FastAPI alongside Django and Flask in the documentation and in the
    package classifiers, and fix the package keywords, which described a
    different project entirely
  - Fix the Read the Docs build, which pointed at a ``conf.py`` path that does
    not exist, and install the package itself so the API docs are generated
  - Modernize the Sphinx configuration and drop the 2015 ``sphinx-quickstart``
    boilerplate, including the duplicated ``docs/Makefile`` and ``docs/make.bat``
    now that ``make docs`` builds the documentation
  - Document the development workflow and the installation requirements in the
    README
  - Fix the documented ``config.option`` example, the ``RecursiveSearch``
    default arguments, the custom loader example, and several dead links
  - Rewrite the Makefile around uv (setup, update-deps, fix-lock, lint,
    format, typecheck, test, coverage, docs, build, release)
  - Declare an explicit build backend (hatchling)
  - Track the latest version of every development dependency
  - Add type checking with ``ty``
  - Enable a much stricter set of ruff rules
  - Replace ``os.path`` with ``pathlib`` across the discovery chain
  - Skip the parameter store tests when the optional ``aws`` feature is not
    installed, instead of failing to collect the test suite

2.3.0
=====

  - Modernize the project (thanks @hartungstenio)
  - Add support for Python 3.10, 3.11, 3.12 and 3.13
  - Update the codebase to use python>=3.9 features
  - Replace hatch with uv
  - Add support for CI/CD with GitHub Actions
  - Update README.rst badges

2.2.1
=====

  - Fix JSON cast for already parsed default configuration

2.2.0
=====

  - Add new cast `config.json` for JSON configurations

2.1.0
=====

  - Add (optional) support for AWSParameterStore. To enable it install
    ``prettyconf[aws]`` (thanks @ronaldotd)
  - Replace nosetest -> pytest
  - Implemented new .env parser with multiline support (thanks @jaysonsantos)
  - Update and improve ``casts`` session documentation (thanks @hernantz)

2.0.1
=====

  - Hopeful quick and dirty fix of the discovery system (do not install version 2.0.0)

2.0.0
=====

  - Refactor strategy to find configuration files (thanks to @hernantz)
  - Lots of improvements on documentation
  - Dropped support for py2
  - Dropped tox support

1.2.3
=====

  - Fix a blocker issue with ``config.eval`` cast and add a test to prevent regressions
  - Add more informations about python-decouple vs. prettyconf at FAQ (Fixes #16 again)

1.2.2
=====

  - Remove testfixtures requirements (it's broken with pypy)

1.2.1
=====

  - New cast type: config.eval (uses ``ast.literal_eval`` to cast python settings)
  - 3rd-party suggestion: dj-email-url parser in documentation

1.2.0
=====

  - New cast type: config.tuple (converts a comma-separated string in tuple)

1.1.2
=====

  - Ignore errors in ``make clean``

1.1.1
=====

  - Fix a brown paper bug in the last release
  - Force test running in ``make release`` target
  - Add "pragma: no cover" in abstract methods

1.1.0
=====

  - Skip discovering files inside not-directory paths (eg. ``.egg``, ``.zip``
    or wheel packages)

1.0.1
=====

  - Fix a issue that breaks .ini/.cfg loader with "broken" files

1.0.0
=====

  - First stable release! hooray!
  - Make configuration load lazy to make possible change root_path and
    starting_path in prettyconf.config
  - Default root_path is "/" instead of $HOME (backward incompatible change)
  - Add missing requirements in requirements.txt and make tox use it.
  - Small PEP-8 and code formatting fixes

0.4.1
=====

  - Add MacOSX travis builds.

0.4.0
=====

  - Add ``root_path`` to stop looking indefinitely for configuration files until the OS root path
  - Add advanced usage docs
  - Include a simple (but working) tox configuration for py27 + py34 to the project


0.3.3
=====

  - Start a structure to make a better documentation with sphinx and publish it at Read the Docs

0.3.2
=====

  - Stop directories from being traversed up when valid configurations were found.
  - Validates invalid unicode data on INI files (and skip them)
  - Better Python3 support with use of ConfigParser.read_file
  - Code cleanup
  - More test cases for ConfigurationDiscovery added

0.3.1
=====

  - Fix a bad behaviour that make impossible to define a None default

0.3.0
=====

  - Make config.{cast} shortcuts easier to use. This change breaks backward compatibility.

0.2.2
=====

  - Fix an issue with .env parser that breaks with unquoted URL values
  - Fix an issue with magic _get_path used by config discovery (thanks @bertonha)

0.2.0
=====

  - Add basic documentation

0.1.1
=====

  - Fix a small issue in README.txt formatting

0.1
===

  - First version
