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
