_(August 11, 2020)_
- Improve import time of [iterutils][iterutils] by deferring hashlib/socket imports
- Add custom `repr` parameter to [funcutils.format_invocation][funcutils.format_invocation]
20.2.0
---
_(June 21, 2020)_
- Added [iterutils.lstrip][iterutils.lstrip], [iterutils.rstrip][iterutils.rstrip], [iterutils.strip][iterutils.strip]
- More robust and complete [strutils.strip_ansi][strutils.strip_ansi]
- Add [iterutils.untyped_sorted][iterutils.untyped_sorted]
- Fixes to [IndexedSet][IndexedSet] rsub and index methods
- Expose text mode flag in [fileutils.AtomicSaver][fileutils.AtomicSaver]
- Add [strutils.int_list_complement][strutils.int_list_complement] and [strutils.int_list_to_int_tuples][strutils.int_list_to_int_tuples] to the _int_list_ suite.
- Docs: intersphinx links finally point to Python 3 docs
20.1.0
---
_(March 29, 2020)_
- Add [funcutils.update_wrapper][funcutils.update_wrapper], used to
make a wrapper function reflect various aspects of the wrapped
function's API.
- Fix [FunctionBuilder][FunctionBuilder] handling of functions without `__module__`
- Add `partial` support to [FunctionBuilder][FunctionBuilder]
- Fix [NetstringSocket][socketutils.NetstringSocket]'s handling of arguments in `read_ns`
- Fix [IndexedSet][IndexedSet]'s `index()` method to account for removals
- Add `seekable`, `readable`, and `writable` to SpooledIOBase
- Add a special case to `singularize`
- Fix various warnings for Py3.9
20.0.0
---
_(January 8, 2020)_
- New module [pathutils][pathutils]:
- [pathutils.augpath][pathutils.augpath] augments a path by modifying its components
- [pathutils.shrinkuser][pathutils.shrinkuser] inverts :func:`os.path.expanduser`.
- [pathutils.expandpath][pathutils.expandpath] shell-like environ and tilde expansion
- add `include_dirs` param to [fileutils.iter_find_files][fileutils.iter_find_files]
- Make [funcutils.format_invocation][funcutils.format_invocation] more deterministic
- add [strutils.unwrap_text][strutils.unwrap_text] which does what you think to wrapped text
- Py3 fixes
- [iterutils.chunked][iterutils.chunked] to work with the `bytes` type ([231][i231])
- [cacheutils.ThresholdCounter][cacheutils.ThresholdCounter]'s `get_common_count()`
[i231]: https://github.com/mahmoud/boltons/issues/231
[pathutils]: https://boltons.readthedocs.io/en/latest/pathutils.html
[pathutils.augpath]: https://boltons.readthedocs.io/en/latest/pathutils.html#boltons.pathutils.augpath
[pathutils.augpath]: https://boltons.readthedocs.io/en/latest/pathutils.html#boltons.pathutils.augpath
[pathutils.shrinkuser]: https://boltons.readthedocs.io/en/latest/pathutils.html#boltons.pathutils.shrinkuser
[pathutils.expandpath]: https://boltons.readthedocs.io/en/latest/pathutils.html#boltons.pathutils.expandpath
[strutils.unwrap_text]: https://boltons.readthedocs.io/en/latest/strutils.html#boltons.strutils.unwrap_text