NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #528 most downloaded on PyPI
Human friendly output for text interfaces using Python
Last release 5 years ago
no release in 18 months
Release timing varies
gaps range from 9 days to 12 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
13 years old
118 releases · first in 2013
Fixed issue #7_ (TypeError when calling show_pager() on Python 3) and added a test.
Fixed issue #7 (TypeError when calling show_pager() on Python 3) and added a test.
Minor improvements to the setup.py script.
Stop testing tags on Travis CI.
Minor improvements to usage message reformatting.
Minor improvements to usage message reformatting.
Minor improvements to usage message reformatting.
One column per quarter.
Remove an undocumented .strip() call from join_lines().
Remove an undocumented .strip() call from join_lines().
Why I noticed this: It has the potential to eat significant white space in usage messages that are marked up in reStructuredText syntax.
Why I decided to change it: The behavior isn't documented and on second thought I wouldn't expect a function called join_lines() to strip any and all leading/trailing white space.
Improved the usage message parsing algorithm (also added a proper test). Refer to test_parse_usage_tricky() for an example of a usage message that is
Improved the usage message parsing algorithm (also added a proper test). Refer to test_parse_usage_tricky() for an example of a usage message that is now parsed correctly but would previously confuse the dumb "parsing" algorithm in parse_usage().
Made usage message parsing a bit more strict. Admittedly this still needs a lot more love to make it more robust but I lack the time to implement this
Made usage message parsing a bit more strict. Admittedly this still needs a lot more love to make it more robust but I lack the time to implement this at the moment. Some day soon! :-)
Unbreak conditional importlib dependency after breakage observed here: https://travis-ci.org/xolox/python-humanfriendly/builds/110585766
Unbreak conditional importlib dependency after breakage observed here: https://travis-ci.org/xolox/python-humanfriendly/builds/110585766
Make conditional importlib dependency compatible with wheels: While running tox tests of another project of mine that uses the humanfriendly package I
Make conditional importlib dependency compatible with wheels: While running tox tests of another project of mine that uses the humanfriendly package I noticed a traceback when importing the humanfriendly package (because importlib was missing). After some digging I found that tox uses pip to install packages and pip converts source distributions to wheel distributions before/during installation, thereby dropping the conditional importlib dependency.
Added the Sphinx extension trove classifier to the setup.py script.
Fixed a non-fatal but obviously wrong log format error in prompt_for_choice().
Fixed a non-fatal but obviously wrong log format error in prompt_for_choice().
Added Python 3.5 to supported versions on Travis CI and in the documentation.
Bug fix for Python 2.6 compatibility in setup.py script.
Bug fix for Python 2.6 compatibility in setup.py script.
Replaced import_module() with a conditional dependency on importlib.
Replaced import_module() with a conditional dependency on importlib.
Added proper tests for ANSI escape sequence support.
Added proper tests for ANSI escape sequence support.
Moved hard coded ANSI text style codes to a module level ANSI_TEXT_STYLES dictionary.
Moved hard coded ANSI text style codes to a module level ANSI_TEXT_STYLES dictionary.
Improved the related error reporting based on the new dictionary.
Added support for custom delimiters in humanfriendly.text.split().
Added support for custom delimiters in humanfriendly.text.split().
Added the prompt_for_confirmation() function to render (y/n) prompts.
Added the prompt_for_confirmation() function to render (y/n) prompts.
Improved the prompt rendered by prompt_for_choice().
Extracted supporting prompt functionality to separate functions.
Added support for wrapping ANSI escape sequences in "readline hints".
Added support for wrapping ANSI escape sequences in "readline hints".
Work around incompatibility between flake8-pep257==1.0.3 and pep257==0.7.0.
Added message() and warning() functions to write informational and warning messages to the terminal (on the standard error stream).
Added message() and warning() functions to write informational and warning messages to the terminal (on the standard error stream).
Implemented the feature request in issue #6: Support for milleseconds in timespan parsing/formatting. Technically speaking this breaks backwards compa
Implemented the feature request in issue #6: Support for milleseconds in timespan parsing/formatting. Technically speaking this breaks backwards compatibility but only by dropping a nasty (not documented) implementation detail. Quoting from the old code:
# All of the first letters of the time units are unique, so # although this check is not very strict I believe it to be # sufficient.
That no longer worked with [m]illiseconds versus [m]inutes as was also evident from the feature request / bug report on GitHub.
Added format_length() and parse_length() functions via pull request #5`_.
Added format_length() and parse_length()` functions via pull request #5.
Added the humanfriendly.text.split() function.
Added the humanfriendly.text.split() function.
Added support for rendering of usage messages to reStructuredText.
Added support for rendering of usage messages to reStructuredText.
Started moving functions to separate modules.
Started moving functions to separate modules.
Added the parse_timespan() function.
Added the parse_timespan() function.
Changed table formatting to right-align table columns with numeric data (and pimped the documentation).
Changed table formatting to right-align table columns with numeric data (and pimped the documentation).
Make table formatting 'smart' by having it automatically handle overflow of columns by switching to a different more verbose vertical table layout.
Make table formatting 'smart' by having it automatically handle overflow of columns by switching to a different more verbose vertical table layout.
Bug fix for a somewhat obscure UnicodeDecodeError in setup.py on Python 3.
Bug fix for a somewhat obscure UnicodeDecodeError in setup.py on Python 3.
Travis CI now also runs the test suite on PyPy.
Documented PyPy compatibility.
Added the humanfriendly.terminal.usage() function for nice rendering of usage messages on interactive terminals (try humanfriendly --help to see it in
Added the humanfriendly.terminal.usage() function for nice rendering of usage messages on interactive terminals (try humanfriendly --help to see it in action).
Added the humanfriendly.terminal module with support for ANSI escape sequences, detecting interactive terinals, finding the terminal size, etc.
Added the humanfriendly.terminal module with support for ANSI escape sequences, detecting interactive terinals, finding the terminal size, etc.
Bug fix for Python 3 compatibility in format_table().
Bug fix for Python 3 compatibility in format_table().
Added format_table() function to format tabular data in simple textual tables.
Added format_table() function to format tabular data in simple textual tables.
Added additional string formatting functions compact(), dedent(), format(), is_empty_line() and trim_empty_lines().
Added additional string formatting functions compact(), dedent(), format(), is_empty_line() and trim_empty_lines().
Added support for formatting numbers with thousands separators.
Added support for formatting numbers with thousands separators.
Added a simple command line interface.
Added a simple command line interface.
Added trove classifiers to setup.py.
Made it possible to use spinners as context managers.
Made it possible to use spinners as context managers.
Improved interaction between spinner & verbose log outputs: The spinner until now didn't end each string of output with a carriage return because then
Improved interaction between spinner & verbose log outputs: The spinner until now didn't end each string of output with a carriage return because then the text cursor would jump to the start of the screen line and disturb the spinner, however verbose log output and the spinner don't interact well because of this, so I've decided to hide the text cursor while the spinner is active.
Added another example to the documentation of parse_date().
Change spinners to use the 'Erase in Line' ANSI escape code to properly clear screen lines.
Change spinners to use the 'Erase in Line' ANSI escape code to properly clear screen lines.
Improve performance of Travis CI and increase multiprocessing test coverage.
Added support for AutomaticSpinner that animates without requiring step() calls.
Added support for AutomaticSpinner that animates without requiring step() calls.
Changed the Python package layout so that all *.py files are in one directory.
Added tests for parse_path() and Timer.rounded.
Changed coerce_boolean() to coerce empty strings to False.
Changed coerce_boolean() to coerce empty strings to False.
Added parse_path() function (a simple combination of standard library functions that I've repeated numerous times).
Added support for spinners with an embedded timer.
Added support for spinners with an embedded timer.
Added coerce_boolean() function.
Added coerce_boolean() function.
Improved pluralize() by making it handle the simple case of pluralizing by adding 's'.
Improved pluralize() by making it handle the simple case of pluralizing by adding 's'.
Improved the documentation by adding a few docstring examples via pull request #3_.
Improved the documentation by adding a few docstring examples via pull request #3.
Fixed Python 3 compatibility (input() versus raw_input()). See https://travis-ci.org/xolox/python-humanfriendly/jobs/28700750.
Fixed Python 3 compatibility (input() versus raw_input()). See https://travis-ci.org/xolox/python-humanfriendly/jobs/28700750.
Removed a print() in the test suite, left over from debugging.
Automatically disable Spinner when stream.isatty() returns False.
Automatically disable Spinner when stream.isatty() returns False.
Improve the makefile by adding install and coverage targets.
Remove the makefile generated by Sphinx (all we need from it is one command).
Add unit tests for prompt_for_choice() bringing coverage back up to 95%.
Added support for 'B' bytes unit to parse_size() via pull request #2_.
Added support for 'B' bytes unit to parse_size() via pull request #2.
Improved the prompt_for_choice() function by clearly presenting the default choice (if any).
Improved the prompt_for_choice() function by clearly presenting the default choice (if any).
Added the prompt_for_choice() function.
Added the prompt_for_choice() function.
Enable Spinner to show progress counter (percentage).
Enable Spinner to show progress counter (percentage).
Make the Spinner(label=...) argument optional.
Make the Spinner(label=...) argument optional.
Make it possible to override the label for individual steps of spinners.
Make it possible to override the label for individual steps of spinners.
Automatically rate limit Spinner instances.
Automatically rate limit Spinner instances.
Improve Python 3 compatibility: Make sure sequences passed to concatenate() are lists.
Improve Python 3 compatibility: Make sure sequences passed to concatenate() are lists.
Submit test coverage from Travis CI to Coveralls.io.
Increase test coverage of concatenate(), Spinner() and Timer().
Use assertRaises() instead of try, except and isinstance() in test suite.
Added support for Python 3 thanks to a pull request.
Added support for Python 3 thanks to a pull request.
Document the supported Python versions (2.6, 2.7 and 3.4).
Started using Travis CI to automatically run the test suite.
Bug fix for concatenate() when given only one item.
Bug fix for concatenate() when given only one item.
Added functions concatenate() and pluralize(), both originally developed in private scripts.
Added functions concatenate() and pluralize(), both originally developed in private scripts.
Added a Spinner class that I originally developed for pip-accel _.
Added a Spinner class that I originally developed for pip-accel.
Added a Timer class to easily keep track of long running operations.
Added a Timer class to easily keep track of long running operations.
Improved the project description in setup.py and added a link to online documentation on PyPI.
Improved the project description in setup.py and added a link to online documentation on PyPI.
Renamed the package from human-friendly to humanfriendly.
Renamed the package from human-friendly to humanfriendly.
Your coding agent can read these notes before it upgrades. Set up the MCP server →