-------------------
* Adapted to latest pytest log wrapping
* Corrected date conversion for empty string
* Allow to not wait for spawned process with ``runez.run(fatal=None, stdout=None, stderr=None)``
* More consistent debug logging on file operations
* Corrected edge case in py2 with coloring of ``μ`` character in ``represented_duration()``
* Added ``clean=True`` option to ``ensure_folder()``
* Added ``click.border()`` option
* Bug fixes
* Reviewed all IO related functions and made them respect the same signature, explained in doc:
* Functions not returning content (``run()``, ``delete()``, ...) all have this signature:
``fatal=True, logger=UNSET, dryrun=UNSET``
* Functions returning content (``read_json()``, ``readlines()``, ...) are simplified to just a:
``default=UNSET`` (aborts on failure when no ``default`` is specified,
``default`` returned otherwise).
* Simplified signatures of: ``ensure_folder``, ``read_json``, ``readlines``
* Made ``readlines`` consistent with all other IO related functions
* Defined signature of ``abort()``, not going via ``**kwargs`` anymore
* Added adhoc "linter" to ensure IO related functions have a consistent signature
* Bug fixes, renamed ``test_resource`` to ``resource_path`` (in ``runez.conftest``),
to avoid pytest thinking it is a test function when imported.
* Fixed docstrings, ``RunResult`` properly evaluates to true-ish on success
* ``runez.run()`` now always returns a ``RunResult``
* ``runez.run()`` now returns a ``RunResult`` object when called with ``fatal=None``,
with fields: ``.output``, ``.error`` and ``.exit_code``
* Removed ``include_error`` kwarg from ``runez.run()``, ``RunResult.full_output`` can now be used instead
* Internal refactor to minimize import time (import time now tested, must be less than 3x slower than ``import sys``)
* Renamed:
* ``first_meaningful_line()`` -> ``first_line()`` applies to strings or list (not file anymore)
* ``shortened()`` -> ``short()``
* ``represented_args()`` -> ``quoted()`` (can quote a single string, or a list of strings)
* Replaced named arg ``separator`` to be more indicative as to what it used for
* ``delimiter`` when the string is used to ``.join()`` a list of things back to a string
(eg: ``represented_bytesize(.., delimiter=" ")``)
* ``split`` when the character is used to split strings (eg: ``flattened(.., split=",")``
* ``flattened()`` now has boolean optional parameters (instead of previously ``split`` enum)
* Reduced number of things exported at top-level, removed:
* ``heartbeat``, use ``from runez.heartbeat import ...``
* ``prompt``, use ``from runez.prompt import ...``
* ``represent``, use ``from runez.render import ...``
* ``schema``, use ``from runez.schema import ...``
* ``thread``, use ``from runez.thread import ...``
* ``set_dryrun`` (better applied via ``runez.log.setup()``)
* ``SANITIZED, SHELL, UNIQUE``, function ``flattened()`` now accepts more explicit boolean flags
* ``class_descendants()``: not so useful after all, using decorators is better
* ``auto_import_siblings``, use ``from runez.inspector import auto_import_siblings``
* ``ActivateColors``, use ``runez.colors.ActivateColors``
* ``is_coloring``, use ``runez.color.is_coloring``
* ``SECONDS_IN_ONE_*``, use ``runez.date.SECONDS_IN_ONE_*``
* ``ini_to_dict``, use ``runez.file.ini_to_dict``
* ``is_younger``, use ``runez.file.is_younger``
* ``current_test``, use ``runez.log.current_test``
* ``dev_folder``, use ``runez.log.dev_folder``
* ``find_parent_folder``, use ``runez.log.find_parent_folder``
* ``program_path``, use ``runez.log.program_path``
* ``require_installed``, use ``runez.program.require_installed``
* ``align``, use ``from runez.render import Align``
* ``header``, use ``from runez.render import Header``
* ``PrettyTable``, use ``from runez.render import PrettyTable``
* ``json_sanitized``, use ``runez.serialize.json_sanitized``
* Enhanced:
* ``quoted()`` can quote a single string, or a list of strings
* ``readlines()`` can now ignore empty lines, and return up to N first lines
* Relevant click decorators are not exposed anymore by default, and auto-apply themselves:
* ``runez.click.color()``
* ``runez.click.config()``
* ``runez.click.dryrun()``
* Added:
* ``PrettyTable``, more flexible than the now abandoned and similar https://pypi.org/project/PrettyTable
* ``runez.inspector`` module, which mostly acts on context (auto-detects caller), and provide a few relevant features:
* ``auto_import_siblings()``: automatically finds all siblings of calling module, and ensure
every single one is ``import``-ed, this is useful to avoid having to manually register ``click``
sub-commands of a large group
* ``run_cmds()``: poor man's ``click``-replacement, finds all ``cmd_`` functions in caller module
and makes a multi-command out of them, with ``--help`` etc