[Python-modules-commits] [python-boltons] 01/02: Imported Upstream version 16.2.2

Hugo Lefeuvre hle at moszumanska.debian.org
Wed Sep 14 12:01:10 UTC 2016


This is an automated email from the git hooks/post-receive script.

hle pushed a commit to branch master
in repository python-boltons.

commit 66f6222f909a7d0bab3b3105211e39ab025fd0ac
Author: Hugo Lefeuvre <hle at debian.org>
Date:   Wed Sep 14 14:00:13 2016 +0200

    Imported Upstream version 16.2.2
---
 .gitignore                   |  47 +++
 .travis.yml                  |  12 +
 CHANGELOG.md                 | 662 +++++++++++++++++++++++++++++
 LICENSE                      |  29 ++
 README.md                    |  93 +++++
 TODO.rst                     |  60 +++
 boltons/__init__.py          |   0
 boltons/cacheutils.py        | 674 ++++++++++++++++++++++++++++++
 boltons/debugutils.py        |  66 +++
 boltons/deprutils.py         |  41 ++
 boltons/dictutils.py         | 696 +++++++++++++++++++++++++++++++
 boltons/easterutils.py       |  16 +
 boltons/excutils.py          | 258 ++++++++++++
 boltons/fileutils.py         | 650 +++++++++++++++++++++++++++++
 boltons/formatutils.py       | 327 +++++++++++++++
 boltons/funcutils.py         | 206 +++++++++
 boltons/gcutils.py           | 136 ++++++
 boltons/iterutils.py         | 970 +++++++++++++++++++++++++++++++++++++++++++
 boltons/jsonutils.py         | 227 ++++++++++
 boltons/listutils.py         | 328 +++++++++++++++
 boltons/mathutils.py         |  57 +++
 boltons/mboxutils.py         | 121 ++++++
 boltons/namedutils.py        | 369 ++++++++++++++++
 boltons/queueutils.py        | 193 +++++++++
 boltons/setutils.py          | 421 +++++++++++++++++++
 boltons/socketutils.py       | 728 ++++++++++++++++++++++++++++++++
 boltons/statsutils.py        | 414 ++++++++++++++++++
 boltons/strutils.py          | 847 +++++++++++++++++++++++++++++++++++++
 boltons/tableutils.py        | 548 ++++++++++++++++++++++++
 boltons/tbutils.py           | 764 ++++++++++++++++++++++++++++++++++
 boltons/timeutils.py         | 430 +++++++++++++++++++
 boltons/typeutils.py         | 131 ++++++
 docs/Makefile                | 192 +++++++++
 docs/_templates/page.html    |   5 +
 docs/architecture.rst        |  91 ++++
 docs/cacheutils.rst          |  51 +++
 docs/conf.py                 | 310 ++++++++++++++
 docs/debugutils.rst          |   6 +
 docs/dictutils.rst           |   6 +
 docs/fileutils.rst           |  52 +++
 docs/formatutils.rst         |   6 +
 docs/funcutils.rst           |  18 +
 docs/gcutils.rst             |   6 +
 docs/index.rst               | 114 +++++
 docs/iterutils.rst           |  86 ++++
 docs/jsonutils.rst           |   6 +
 docs/listutils.rst           |   6 +
 docs/make.bat                | 263 ++++++++++++
 docs/mathutils.rst           |  18 +
 docs/mboxutils.rst           |   6 +
 docs/namedutils.rst          |   6 +
 docs/queueutils.rst          |   6 +
 docs/setutils.rst            |   5 +
 docs/socketutils.rst         |  36 ++
 docs/statsutils.rst          |   6 +
 docs/strutils.rst            |   6 +
 docs/tableutils.rst          |   6 +
 docs/tbutils.rst             |   5 +
 docs/timeutils.rst           |  48 +++
 docs/typeutils.rst           |   5 +
 misc/bench_omd.py            | 122 ++++++
 misc/linkify_changelog.py    |  55 +++
 misc/table_html_app.py       | 167 ++++++++
 requirements-rtd.txt         |   2 +
 requirements-test.txt        |   3 +
 setup.cfg                    |   2 +
 setup.py                     |  44 ++
 tests/__init__.py            |   0
 tests/jsonl_test_data.txt    |   5 +
 tests/newlines_test_data.txt |  10 +
 tests/test_cacheutils.py     | 136 ++++++
 tests/test_dictutils.py      | 257 ++++++++++++
 tests/test_fileutils.py      |  21 +
 tests/test_formatutils.py    |  64 +++
 tests/test_funcutils.py      |  41 ++
 tests/test_gcutils.py        |  34 ++
 tests/test_iterutils.py      | 418 +++++++++++++++++++
 tests/test_jsonutils.py      |  31 ++
 tests/test_listutils.py      | 125 ++++++
 tests/test_mathutils.py      |  56 +++
 tests/test_namedutils.py     |  31 ++
 tests/test_queueutils.py     |  30 ++
 tests/test_setutils.py       |  68 +++
 tests/test_socketutils.py    | 362 ++++++++++++++++
 tests/test_statsutils.py     |  33 ++
 tests/test_strutils.py       |  26 ++
 tests/test_tableutils.py     |  52 +++
 tests/test_tbutils.py        | 119 ++++++
 tests/test_timeutils.py      |  29 ++
 tox.ini                      |   6 +
 90 files changed, 14241 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..97f7d7f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,47 @@
+docs/_build
+tmp.py
+
+*.py[cod]
+
+# emacs
+*~
+._*
+.\#*
+\#*\#
+
+# C extensions
+*.so
+
+# Packages
+*.egg
+*.egg-info
+dist
+build
+eggs
+parts
+bin
+var
+sdist
+develop-eggs
+.installed.cfg
+lib
+lib64
+
+# Installer logs
+pip-log.txt
+
+# Unit test / coverage reports
+.coverage
+.tox
+nosetests.xml
+
+# Translations
+*.mo
+
+# Mr Developer
+.mr.developer.cfg
+.project
+.pydevproject
+
+# Vim
+*.sw[op]
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..d9e52d4
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,12 @@
+language: python
+sudo: false
+cache: pip
+python:
+  - "2.6"
+  - "2.7"
+  - "3.4"
+  - "3.5"
+  - "pypy"
+
+install: "pip install -r requirements-test.txt"
+script: "py.test --doctest-modules boltons tests"
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..900c744
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,662 @@
+boltons Changelog
+=================
+
+Since February 20, 2013 there have been 23 releases and 826 commits for
+an average of one 35-commit release every 7.5 weeks.
+
+16.2.1
+------
+*(April 29, 2016)*
+
+This version sees the soft debut of [socketutils][socketutils], which
+includes wrappers and tools for working with the built-in socket. A
+lot of [socketutils.BufferedSocket][socketutils.BufferedSocket] changes.
+
+  * [BufferedSocket.recv_until][socketutils.BufferedSocket.recv_until] now
+    supports multibyte delimiters and also includes the delimiter in its returns.
+  * Better BufferedSocket timeout discipline throughout.
+  * Various BufferedSocket argument name changes, *maxbytes* became
+    *maxsize*, *n* became *size*, *marker* became *delimiter*, etc.
+  * [BufferedSocket][socketutils.BufferedSocket] BufferedSocket became
+    threadsafe
+  * [BufferedSocket.recv][socket.BufferedSocket.recv] now always returns the
+    contents of the internal buffer before doing a socket call.
+  * [BufferedSocket.recv_close][BufferedSocket.recv_close] now exists
+    to receive until the sending end closes the connection.
+  * Can now pass *recvsize* to
+    [BufferedSocket][socketutils.BufferedSocket] constructor to tune
+    the size passed to the lower-level recv call.
+  * [socketutils][socketutils] got documented and tested.
+
+16.2.0
+------
+*(April 18, 2016)*
+
+adding shell args escaper-joiners to strutils (escape_shell_args,
+args2cmd, args2sh) as well as a rare breaking fix to
+[iterutils.pairwise][iterutils.pairwise].
+
+  * Argument joiners, functions to join command line arguments in
+    context-appropriate ways:
+    * [strutils.escape_shell_args][strutils.escape_shell_args]
+    * [strutils.args2cmd][strutils.args2cmd]
+    * [strutils.args2sh][strutils.args2sh]
+  * BREAKING: finally fixing
+    [iterutils.pairwise][iterutils.pairwise]. pairwise used to call to
+    `chunked`, now it calls to `windowed`. `pairwise([1, 2, 3, 4])` no
+    longer returns `[(1, 2), (3, 4)]`. Instead, it returns
+    `[(1, 2), (2, 3), (3, 4)]`, which is what I always mean when I say
+    pairwise, but not what the original contributor implemented.
+  * Adding a universal wheel distribution option!
+
+16.1.1
+------
+*(March 6, 2016)*
+
+Added [iterutils.same][iterutils.same], improvement of Windows
+[fileutils.AtomicSaver][fileutils.AtomicSaver] behavior for old
+filesystems, bugfix on [strutils.is_uuid][strutils.is_uuid], expansion
+of [strutils.pluralize][strutils.pluralize], new trove classifiers and
+docs improvements!
+
+  * [fileutils.replace][fileutils.replace]: use bak file option for
+    win32 ReplaceFile for slightly better corner case coverage on less
+    featureful filesystems
+  * [strutils.pluralize][strutils.pluralize]: Add more irregular plurals
+  * [strutils.is_uuid][strutils.is_uuid]: Catch un-parsable UUIDs.
+  * [iterutils.same][iterutils.same]: Return `True` when all values in
+    iterable are the same.
+
+
+16.1.0
+------
+*(February 24, 2016)*
+
+The centerpiece of this release is highly improved Windows support for
+[fileutils.atomic_save][fileutils.atomic_save] via
+[ReplaceFile](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365512%28v=vs.85%29.aspx)
+system call. This functionality is also made available directly via
+[fileutils.replace][fileutils.replace], which is akin to Python 3.3+'s
+[os.replace][os.replace], except that `os.replace`'s approach has
+[arguably poorer behavior and atomicity](http://stupidpythonideas.blogspot.com/2014/07/getting-atomic-writes-right.html)
+compared to `fileutils.replace`.
+
+Also, a couple new strutils, and
+[iterutils.backoff][iterutils.backoff] grew a jitter argument.
+
+  * [iterutils.backoff][iterutils.backoff] now supports start=0
+  * More comprehensive [iterutils.backoff][iterutils.backoff] argument checking/validation
+  * [fileutils.replace][fileutils.replace] and
+    [fileutils.atomic_rename][fileutils.atomic_rename] are now public
+    functions in [fileutils][fileutils] with cross-platform implementations ([discussion here](https://github.com/mahmoud/boltons/issues/60))
+  * [tableutils.Table][tableutils.Table]s have a metadata argument and
+    attribute for miscellaneous metadata.
+  * [strutils.is_ascii][strutils.is_ascii] and
+    [strutils.is_uuid][strutils.is_uuid]: About as straightforward as
+    they are handy.
+  * Tox testing improvements
+
+
+16.0.1
+------
+*(January 24, 2016)*
+
+DummyFile, Table.metadata, better exception handling, and in-progress
+iterutils.get_path
+
+  * Small format fix in [iterutils.one][iterutils.one] for None
+  * Initial implementation of
+    [fileutils.DummyFile][fileutils.DummyFile], which allows for easy
+    no-op file handling without restructuring code. Sort of like a
+    dummy RLock for systems without threading, if you've seen those.
+  * avoid catching BaseException in all boltons
+  * better error handling in iterutils.get_path
+
+16.0.0
+------
+
+One important fix and one small but handy string function.
+
+* Fixed an [LRU][cacheutils.LRU] bug related to the 15.1.1
+  refactor. Also enhanced LRU testing with doubly-linked list
+  invariant enforcement.
+* Added [strutils.indent][strutils.indent], the counterpart to
+  [textwrap.dedent](https://docs.python.org/2/library/textwrap.html#textwrap.dedent).
+
+15.1.1
+------
+*(November 18, 2015)*
+
+A lot of bugfixes and docfixes in 15.1.1.
+
+updated AtomicSaver for better permissions handling, update
+BufferedSocket message sending, beta version of iterutils.get_path,
+several docs fixes, Stats zscore and cache bugfix, and an LRU refactor
+with significantly improved behavior and code factoring.
+
+  * Updated [fileutils.AtomicSaver][fileutils.AtomicSaver] handling of
+    filesystem permissions to be simpler and more secure. This also
+    merges `dest_perms` and `part_perms` arguments to AtomicSaver and
+    atomic_save.
+  * Fix large message sending with [socketutils.BufferedSocket][socketutils.BufferedSocket]
+  * [strutils.iter_splitlines][strutils.iter_splitlines] is now in the docs.
+  * [cacheutils][cacheutils]: now imports RLock from the right place for python 2
+  * [statsutils][statsutils]: Only `delattr` when `hasattr` in
+    [Stats.clear_cache][statsutils.Stats.clearcache]
+  * [statsutils.Stats][statsutils.Stats]: Add
+    [Stats.get_zscore][statsutils.Stats.get_zscore] to support
+    calculating the [z-score][zscore] (see also: t-statistic)
+  * [cacheutils.LRU][cacheutils.LRU]: Massive refactor of the backing
+    linked list for better handling of duplicate data in the
+    cache. More aggressive locking and better `__eq__`
+
+15.1.0
+------
+*(September 23, 2015)*
+
+Reached the first release version of
+[iterutils.remap][iterutils.remap](), fully tested and
+documented. Also a couple of tweaks to expose the
+[iterutils.unique][iterutils.unique] docs.
+
+15.0.2
+------
+*(September 9, 2015)*
+
+a couple [dictutils.OMD][dictutils.OMD] fixes to
+[dictutils.OMD.pop][dictutils.OMD.pop] and
+[dictutils.OMD.popall][dictutils.OMD.popall] to make them consistent
+with the docstrings. and the accompanying tests of course.
+
+* fix [dictutils.OMD.setdefault][dictutils.OMD.setdefault] to default
+to None and not empty list, per documentation (and add a test to the
+same effect)
+
+
+15.0.1
+------
+*(August 27, 2015)*
+
+* Added
+  [OrderedMultiDict.sortedvalues()][OrderedMultiDict.sortedvalues],
+  which returns a copy of the OMD with sublists within a keyspace
+  sorted.
+* Fixing a bug in
+  [dictutils.OrderedMultiDict][dictutils.OrderedMultiDict]'s addlist
+  method that caused values to be added multiple times.
+* Fixing a [iterutils.backoff][iterutils.backoff] string identity check
+
+[OrderedMultiDict.sortedvalues]: http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict.sortedvalues
+
+15.0.0
+------
+*(August 19, 2015)*
+
+Finally the 15.0 major release. All passing PRs and feature requests
+from the first wave addressed and closed. tzutils merged into
+timeutils. AtomicSaver approach and API much improved. Several other
+features added:
+
+  * [iterutils.backoff][iterutils.backoff] and [iterutils.backoff_iter][iterutils.backoff_iter] for exponential backoff
+  * [iterutils.frange][iterutils.frange] and [iterutils.xfrange][iterutils.xfrange] for floating point range generation
+  * Slightly more permissive [jsonutils.JSONLIterator][jsonutils.JSONLIterator] blank line ignoring
+  * [strutils.iter_splitlines][strutils.iter_splitlines] for lazily getting lines from a larger string
+  * [timeutils.dt_to_timestamp][timeutils.dt_to_timestamp], per the long-lived PR [#13][i13].
+  * Merged tzutils into timeutils
+  * [fileutils.AtomicSaver][fileutils.AtomicSaver] rewrite and redoc
+  * -teens support for [strutils.ordinalize][strutils.ordinalize]
+  * made [iterutils.one][iterutils.one] consistent with [iterutils.first][iterutils.first]
+
+
+0.6.6
+-----
+*(July 31, 2015)*
+
+Fix atomic saving open-file issue for Windows.
+
+  * Patch for AtomicSaver on Windows. Full rewrite comes in 15.0.0.
+  * [strutils.gunzip_bytes][strutils.gunzip_bytes] for decompressing a gzip bytestring
+
+
+0.6.5
+-----
+*(July 30, 2015)*
+
+BufferedSocket work, html2text, pairwise shortcut, is_container, plural
+typo fix, [timeutils.isoparse][timeutils.isoparse], [cacheutils.ThresholdCounter][cacheutils.ThresholdCounter], and lots of
+testing
+
+  * Add [iterutils.first][iterutils.first] function
+  * Add [cacheutils.ThresholdCounter][cacheutils.ThresholdCounter]
+  * Add JSONL verification to jsonutils
+  * Add [timeutils.isoparse][timeutils.isoparse]
+  * Add [strutils.html2text][strutils.html2text] and [strutils.HTMLTextExtractor][strutils.HTMLTextExtractor]
+  * Fix [strutils.pluralize][strutils.pluralize] (indeces -> indices, per [#41][i41])
+  * Add [iterutils.is_container][iterutils.is_container] function
+  * Fixed a small formatting bug in [tbutils.ExceptionInfo][tbutils.ExceptionInfo] that added
+    an extra 'builtins.' for builtin exceptions under python 3
+  * Added tests for many modules
+  * Create [iterutils.pairwise][iterutils.pairwise] shortcuts for pairwise chunks since
+    pairs (key/val) are common
+  * Additional 2.6 compatibility and tests
+  * Fixed CachedInstancePartial to be Python 3 friendly without breaking
+    PyPy.
+  * Made formatutils Python 3 compatible
+  * Rename sockutils to socketutils and other changes
+
+
+0.6.4
+-----
+*(May 10, 2015)*
+
+Fixed multiline exception message handling in ParsedException. added
+mathutils. adding a tentative version of socketutils. fix LRU.popitem. fix
+OMD.__eq__.
+
+  * Fix a bug where [dictutils.OrderedMultiDict][dictutils.OrderedMultiDict]'s __eq__ would fail
+    with non-iterable objects of comparison
+  * Fixed `LRU.popitem` to return a key value pair
+  * Added mathutils with [mathutils.ceil][mathutils.ceil] and [mathutils.floor][mathutils.floor]
+    implementations that can search a fixed set of choices using the
+    bisect module.
+  * Fix [excutils.ParsedException][excutils.ParsedException] so exception message would not start
+    with whitespace
+  * Fix multiline exception messages
+  * Adding [socketutils.BufferedSocket][socketutils.BufferedSocket] and [socketutils.NetstringSocket][socketutils.NetstringSocket]
+
+
+0.6.3
+-----
+*(April 20, 2015)*
+
+Add typeutils, remove compat.py, make ParsedException work with eval()ed
+code
+
+  * Properly parse tracebacks with missing source.  Resolves [#30][i30]
+  * Tweak the docs for [typeutils.get_all_subclasses][typeutils.get_all_subclasses]
+  * Moved [typeutils.make_sentinel][typeutils.make_sentinel] into typeutils and removed the
+    confusing compat module
+  * Add in typeutils with modifications per the caveats of [#15][i15]
+  * Added function [iterutils.one][iterutils.one]
+
+0.6.2
+-----
+*(April 11, 2015)*
+
+Add partial_ordering, fix LRU repr and addition behavior
+
+  * Add [funcutils.partial_ordering][funcutils.partial_ordering](), decorator similar to
+    functools.total_ordering()
+  * Fixed [cacheutils.LRU][cacheutils.LRU]'s behavior per [#21][i21]
+  * Fix [cacheutils.LRU][cacheutils.LRU] repr reversal, fixes [#20][i20]
+
+0.6.0
+-----
+*(April 10, 2015)*
+
+Python 3 support and several community bugfixes. Docs clarifications, too.
+
+  * Make boltons Python 3 compatible without any external
+    dependencies. All modules are independent and work in Python 2.6,
+    2.7, 3.4, and PyPy.
+  * clarify TracebackInfo.from_current() method gap, per user 'dl__'
+    here: http://www.reddit.com/r/Python/comments/321d3o/boltons_over_100_python_utilities/
+  * Fix the [cacheutils.cached][cacheutils.cached] decorator, adding a sanity test, fixes [#12][i12]
+  * Fix bytes2human when builtin zip returns iterators
+  * Simplified logic of [iterutils.chunked][iterutils.chunked]
+
+0.5.1
+-----
+*(April 10, 2015)*
+
+A lot of bugfixes and Python 2.6 and PyPy compatibility changes thanks
+to community contributions and encouragement.
+
+  * Corrected cases where OMD was not exactly a dropin for OrderedDict
+  * conditional availability of [gcutils.get_all][gcutils.get_all] based on pypy or cpython, also
+    [gcutils.is_tracked][gcutils.is_tracked] was added in 2.7, so making [gcutils.get_all][gcutils.get_all] work with 2.6
+  * Made namedutils backwards compatibilty for python 2.6 best effort
+  * Fix invalid part_path usage in [fileutils.AtomicSaver][fileutils.AtomicSaver]
+
+0.5.0
+-----
+*(April  9, 2015)*
+
+First publicly released version. The major focus of this release was
+docs, docstrings, and Read The Docs.
+
+  * Cleared out __init__ module for maximum independence
+  * making [statsutils.median][statsutils.median] use _get_quantile and add [statsutils.trimean][statsutils.trimean]
+  * Switching the [statsutils.Stats][statsutils.Stats] type to be more sorted-data oriented, since it's
+    only for offline analysis of unordered data
+  * Made consistent multi-line string formats, as well as usage of the
+    term 'builtin' vs 'built-in' (noun vs adjective)
+  * Instrumented LRI with stats tracking
+  * Made [timeutils.decimal_relative_time][timeutils.decimal_relative_time] cardinalization optional
+  * Removed timeutils dependency on strutils
+  * Made [tbutils.TracebackInfo][tbutils.TracebackInfo] classmethods work with no arguments.
+  * Renamed ParsedTB to [tbutils.ParsedException][tbutils.ParsedException]
+  * Made [dictutils.OMD][dictutils.OMD] .get()/.getlist() semantics more consistent.
+  * finalizing .todict() and adding .sorted() to the [dictutils.OMD][dictutils.OMD]
+  * Removed osutils and adding a note about utils in general
+  * Made cacheutils more consistent between LRU and LRI, adding some
+    cacheutils docs
+  * Deprecate osutils, moving its contents into fileutils
+  * Adding in-process statsutils2, with new DataAnalyzer and
+    get_pearson_type (not merged yet)
+
+
+0.4.2
+-----
+*(March  8, 2015)*
+
+Mostly a dictutils API update (addlist), but also gcutils.
+
+  * [dictutils.OMD][dictutils.OMD]: split out addlist() from add(), removing the multi
+    kwarg
+  * adding gcutils with [gcutils.GCToggler][gcutils.GCToggler] and gc.get_all
+
+
+0.4.1
+-----
+*(February 26, 2015)*
+
+adding mboxutils
+
+  * adding mboxutils for handy dandy /var/mail integrations like cronfed
+
+
+0.4.0
+-----
+*(February 23, 2015)*
+
+updated tbutils, JSONL support, initial cacheutils, atomic writer,
+hashtags
+
+  * tbutils: Changed the way exceptions are parsed out of tracebacks
+  * tbutils: Guard against potential linecache issues
+  * Defined/implemented [iterutils.windowed_iter][iterutils.windowed_iter] corner case behavior
+  * Added from_path to [fileutils.FilePerms][fileutils.FilePerms]
+  * Adding [strutils.find_hashtags][strutils.find_hashtags]
+  * Add ignore patterns to [fileutils.iter_find_files][fileutils.iter_find_files]
+
+
+0.3.0
+-----
+*(October 19, 2014)*
+
+First alpha release. Practically, everything not mentioned above was
+added in this release.
+
+  * tbutils: add ContextualTracebackInfo and ContextualExceptionInfo
+  * cacheutils: a few minor changes to the BasicCache
+  * update tbutils with some critical bits. still need to add
+    convenience method for ExceptionInfo -> default exception print,
+    also need to add more docstrings.
+  * adding initial jsonutils with JSONL support
+  * added [cacheutils.LRU][cacheutils.LRU]
+  * added [timeutils.parse_timedelta][timeutils.parse_timedelta]
+  * fixing iteritems with multi=False in the
+    [dictutils.OrderedMultiDict][dictutils.OrderedMultiDict] (should return first key, but last
+    value not first)
+  * debugutils: add pdb excepthook and [debugutils.pdb_on_signal][debugutils.pdb_on_signal]
+  * add [fileutils.mkdir_p][fileutils.mkdir_p]
+  * tableutils: add maxlen to table text stuff
+  * fix date citation for gob's
+  * adding pure-Python implementation of Gob's algorithm
+  * fix object header guessing
+  * namedutils: add namedtuple support
+  * fix a headers bug in tableutils
+  * tableutils: add a couple more do-not-recurse types, add
+    UnsupportedData exception for better recursion, insert recursive
+    entries in-line, improve 'Object' strategy heuristic
+  * wrap up html tag customization and fix a related bug
+  * make html configurable via class attributes
+  * strengthen the max_depth check
+  * InputType classes are just shorter and clearer, imo
+  * new from_dict, from_list, from_object, removing old ones. almost
+    used a MetaClass for this
+  * starting new table
+  * only update the integer for the field being updated
+  * fixing a verbalization/pronunciation issue
+  * no regex for better error messages
+  * being opinionated about some FilePerms things
+  * adding initial version of fileutils/FilePerms
+  * update formatutils
+  * fix a slightly nasty namedlist bug
+  * make OrderedMultiDict.get()'s default allow singulars
+  * sync over ExceptionInfo
+  * add from_current() classmethod with depth option to Callpoint class
+    for easier instantiation
+  * it's called a numeronym
+  * add a repr to ParsedTB. A bit verbose, but better than nothing.
+  * add ParsedTB, which provides the ability to parse tracebacks dumped
+    out to logs, the command line, etc.
+  * improve test output and make assertion that new except hook is the
+    same as the builtin.
+  * update tbutils to use the more-powerful Callpoint type.
+  * copy_function
+  * partially clean up partial stuff
+  * first version of the namedlist
+  * fixing up namedtuple, groundwork for namedlist. humorously named
+    module.
+  * embed value in cell for incremental iteration boost on OMD
+  * reorganize code, add 'default' argument to poplast()
+  * make key argument optional to OMD.poplast
+  * rectifying inconsistent names and adjusting respective tests
+    accordingly. using smashcase because that's what builtin dict()
+    uses.
+  * fix reverse; missing yield from!
+  * add initial table biz
+  * add get_counts
+  * add [dictutils.OrderedMultiDict.get_inverted][dictutils.OrderedMultiDict.get_inverted]() for those handy reverse lookups
+  * break out skip list to FastIter OMD + bench
+  * add [strutils.a10n][strutils.a10n]()
+  * fix a bug in [dictutils.OrderedMultiDict][dictutils.OrderedMultiDict]'s .add()
+  * adding initial reimplementation of OMD
+  * adding some tests to dictutils
+  * update boltons formatutils to match what's goin on in lithoxyl
+  * remove infer_pos_args() from strutils (already in formatutils)
+  * add formatutils to boltons
+  * fix a potential infinite recursion in LocalTZ
+  * use more explicit names for Local/Constant tzinfo types
+  * add a basic but handy file finder
+  * add infer_positional_args() to strutils (from lithoxyl)
+  * split BasicCache out of dictutils into cacheutils
+  * update median calculation slightly
+  * add appropriate stacklevel to deprutils warning
+  * add an initial version of deprutils (basic utils for facilitating
+    deprecation)
+  * add bytes2human
+  * first version of some basic timezone utils which came in handy for a
+    train scheduling application I wrote (etavta)
+  * reorder imports for pep8
+  * redo plain-english relative_time() to have a decimal rounding factor
+    and handle future dates
+  * swap the order of cardinalize()'s arguments after intuiting the
+    wrong order a couple times. gotta be consistent, this isn't PHP.
+  * a weird little relative time approach
+  * add total_seconds() implementation for Python <2.7, rename
+    relative_datetime to relative_time
+  * add a relative datetime function in a new module: timeutils
+  * a little more transparency with orderedmultidict's maphistory
+  * add a test for BasicCache
+  * add the super simple BasicCache, a size-limited defaultdict-like
+    thing
+  * add a cheesy little splay list construct that can be used for splay-
+    like manual reordering for eventual optimization
+  * traceback utils, first draft
+  * add strip_ansi() (need to make a cliutils or something)
+  * add ansi strip task
+  * mess with list tuning
+  * add ordinalize()
+  * add __all__ to statsutils
+  * add more stats docs and doctests
+  * add some stats functions
+  * add unit_len()
+  * add pluralize/singularize/cardinalize to strutils
+  * add __all__s all around, clean up imports a bit
+  * adding license
+  * add sorted queue type, make it the default
+  * fix little bug in insert
+  * inheriting from list necessitates overriding the deprecated __get-,
+    __set-, and __del- slice methods
+  * hacky refactor to have a BasePriorityQueue to make room for
+    SortedPriorityQueue with peek_n, etc.
+  * add a little docstring and update sort method in BarrelList
+  * add HeapPriorityQueue
+  * tidy up listutils comments and imports
+  * move treeutils out of boltons since I don't really think a pure
+    python version actually adds much. i'll make an academic one-off
+    repo for less practical data structure experiments like that.
+  * inherit from list
+  * add reverse() to blist
+  * add index() to blist
+  * cheesy __setitem__() for blist
+  * add __delitem__() to BarrelList
+  * change the way the in-place sort works with just one list
+  * tune the list size a bit
+  * add slicing to BarrelList
+  * add initial version of BarrelList, a pure-python b-list-y thing to
+    approximate O(log(n)) behavior by multiplexing the fast O(n) list
+    operations
+  * switch to new dead index interval approach; the IndexedSet is about
+    half the speed of a list in the ultra-pathological case of random
+    popping on the low end of the IndexedSet
+  * made BisectTree's get() defaulting work a bit more like a dict's
+  * added get_adjacent and miscellaneous to BisectTree
+  * added a default name and always-falsy __nonzero__ to Sentinel
+  * add pop() for BisectTree and export the generic Tree
+  * make a bisect tree, because O(n) is still pretttttty fast up to
+    about 100k items
+  * add a little hack to chunked/chunked_iter to make it work nicely
+    with strings
+  * tidy up ki_vs_vi_lrh usage just a titch
+  * revamp indices behavior (key_size and value_size)
+  * switch to new multi-key mode
+  * pretty much done porting insert, delete, balance (the basic
+    operations)
+  * switch to negative refs, arbitrary length nodes
+  * add sentinel utility thing
+  * add .index() for list compat, updated exception messages, and added
+    a silly test to show off slicing and indexing
+  * add slicing support and .clear()
+  * remove ifilter dependency (using generator expression)
+  * add .reverse and .sort() to IndexedSet, fix bisection related bug
+    exposing MISSING (insort requested index, not real_index)
+  * pretty much all fundy IndexedSet bugs hit and fixed, looks like
+  * IndexedSet getting much closer
+  * initial rough draft of IndexedSet with a short docstring and a bunch
+    of fixes already (still not workin tho)
+  * add dictutils (OrderedMultiDict)
+  * it was a long time coming, but I'm finally halfway happy with this
+    wrapped exception
+  * add uniqueification capabilities
+  * go back to using __new__ and positional arguments
+  * exception wrapping green path mostly working
+  * working on a wrapping exception mixin thing for less lossy
+    nonraising.
+  * add asciify and update slugify with ascii flag
+  * add basic docs and doctests to strutils
+  * scratch that, regexes still faster
+  * add under2camel, camel2under, and slugify (and split_punct_ws, which
+    is much faster than re-based punctuation splitting)
+  * python3-compatible doctest for bucketize_bool
+  * bucketize and bucketize_bool, with docs
+  * add examples to chunked and chunked_iter
+  * update split() docs with more examples.
+  * [iterutils.chunked_iter][iterutils.chunked_iter] and [iterutils.chunked][iterutils.chunked]
+  * [iterutils.split][iterutils.split] and [iterutils.split_iter][iterutils.split_iter] work
+
+
+[os.replace]: https://docs.python.org/3/library/os.html#os.replace
+
+[cacheutils]: http://boltons.readthedocs.org/en/latest/cacheutils.html
+[cacheutils.LRU]: http://boltons.readthedocs.org/en/latest/cacheutils.html#boltons.cacheutils.LRU
+[cacheutils.ThresholdCounter]: http://boltons.readthedocs.org/en/latest/cacheutils.html#boltons.cacheutils.ThresholdCounter
+[cacheutils.cached]: http://boltons.readthedocs.org/en/latest/cacheutils.html#boltons.cacheutils.cached
+[debugutils.pdb_on_signal]: http://boltons.readthedocs.org/en/latest/debugutils.html#boltons.debugutils.pdb_on_signal
+[dictutils.OMD]: http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OMD
+[dictutils.OMD.pop]: http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict.pop
+[dictutils.OMD.popall]: http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict.popall
+[dictutils.OMD.setdefault]: http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict.setdefault
+[dictutils.OrderedMultiDict]: http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict
+[dictutils.OrderedMultiDict.get_inverted]: http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict.get_inverted
+[excutils.ParsedException]: http://boltons.readthedocs.org/en/latest/excutils.html#boltons.excutils.ParsedException
+[fileutils]: http://boltons.readthedocs.org/en/latest/fileutils.html
+[fileutils.replace]: http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.replace
+[fileutils.atomic_rename]: http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.atomic_rename
+[fileutils.atomic_save]: http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.atomic_save
+[fileutils.AtomicSaver]: http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.AtomicSaver
+[fileutils.FilePerms]: http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.FilePerms
+[fileutils.iter_find_files]: http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.iter_find_files
+[fileutils.mkdir_p]: http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.mkdir_p
+[fileutils.DummyFile]: http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.DummyFile
+[funcutils.partial_ordering]: http://boltons.readthedocs.org/en/latest/funcutils.html#boltons.funcutils.partial_ordering
+[gcutils.GCToggler]: http://boltons.readthedocs.org/en/latest/gcutils.html#boltons.gcutils.GCToggler
+[gcutils.get_all]: http://boltons.readthedocs.org/en/latest/gcutils.html#boltons.gcutils.get_all
+[gcutils.is_tracked]: http://boltons.readthedocs.org/en/latest/gcutils.html#boltons.gcutils.is_tracked
+[i12]: https://github.com/mahmoud/boltons/issues/12
+[i13]: https://github.com/mahmoud/boltons/issues/13
+[i15]: https://github.com/mahmoud/boltons/issues/15
+[i20]: https://github.com/mahmoud/boltons/issues/20
+[i21]: https://github.com/mahmoud/boltons/issues/21
+[i30]: https://github.com/mahmoud/boltons/issues/30
+[i41]: https://github.com/mahmoud/boltons/issues/41
+[iterutils.backoff]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.backoff
+[iterutils.backoff_iter]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.backoff_iter
+[iterutils.chunked]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.chunked
+[iterutils.chunked_iter]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.chunked_iter
+[iterutils.first]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.first
+[iterutils.backoff]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.backoff
+[iterutils.frange]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.frange
+[iterutils.is_container]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.is_container
+[iterutils.one]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.one
+[iterutils.pairwise]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.pairwise
+[iterutils.same]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.same
+[iterutils.remap]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.remap
+[iterutils.split]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.split
+[iterutils.split_iter]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.split_iter
+[iterutils.unique]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.unique
+[iterutils.windowed_iter]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.windowed_iter
+[iterutils.xfrange]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.xfrange
+[jsonutils.JSONLIterator]: http://boltons.readthedocs.org/en/latest/jsonutils.html#boltons.jsonutils.JSONLIterator
+[mathutils.ceil]: http://boltons.readthedocs.org/en/latest/mathutils.html#boltons.mathutils.ceil
+[mathutils.floor]: http://boltons.readthedocs.org/en/latest/mathutils.html#boltons.mathutils.floor
+[socketutils.BufferedSocket]: http://boltons.readthedocs.org/en/latest/socketutils.html#boltons.socketutils.BufferedSocket
+[socketutils.BufferedSocket.recv]: http://boltons.readthedocs.org/en/latest/socketutils.html#boltons.socketutils.BufferedSocket.recv
+[socketutils.BufferedSocket.recv_until]: http://boltons.readthedocs.org/en/latest/socketutils.html#boltons.socketutils.BufferedSocket.recv_until
+[socketutils.BufferedSocket.recv_close]: http://boltons.readthedocs.org/en/latest/socketutils.html#boltons.socketutils.BufferedSocket.recv_close
+[socketutils.NetstringSocket]: http://boltons.readthedocs.org/en/latest/socketutils.html#boltons.socketutils.NetstringSocket
+[statsutils]: http://boltons.readthedocs.org/en/latest/statsutils.html
+[statsutils.Stats]: http://boltons.readthedocs.org/en/latest/statsutils.html#boltons.statsutils.Stats
+[statsutils.Stats.clearcache]: http://boltons.readthedocs.org/en/latest/statsutils.html#boltons.statsutils.Stats.clear_cache
+[statsutils.Stats.get_zscore]: http://boltons.readthedocs.org/en/latest/statsutils.html#boltons.statsutils.Stats.get_zscore
+[statsutils.median]: http://boltons.readthedocs.org/en/latest/statsutils.html#boltons.statsutils.median
+[statsutils.trimean]: http://boltons.readthedocs.org/en/latest/statsutils.html#boltons.statsutils.trimean
+[strutils.HTMLTextExtractor]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.HTMLTextExtractor
+[strutils.a10n]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.a10n
+[strutils.args2cmd]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.args2cmd
+[strutils.args2sh]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.args2sh
+[strutils.escape_shell_args]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.escape_shell_args
+[strutils.find_hashtags]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.find_hashtags
+[strutils.gunzip_bytes]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.gunzip_bytes
+[strutils.html2text]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.html2text
+[strutils.indent]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.indent
+[strutils.iter_splitlines]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.iter_splitlines
+[strutils.ordinalize]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.ordinalize
+[strutils.pluralize]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.pluralize
+[strutils.is_ascii]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.is_ascii
+[strutils.is_uuid]: http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.is_uuid
+[tableutils]: http://boltons.readthedocs.org/en/latest/tableutils.html
+[tableutils.Table]: http://boltons.readthedocs.org/en/latest/tableutils.html#boltons.tableutils.Table
+[tbutils.ExceptionInfo]: http://boltons.readthedocs.org/en/latest/tbutils.html#boltons.tbutils.ExceptionInfo
+[tbutils.ParsedException]: http://boltons.readthedocs.org/en/latest/tbutils.html#boltons.tbutils.ParsedException
+[tbutils.TracebackInfo]: http://boltons.readthedocs.org/en/latest/tbutils.html#boltons.tbutils.TracebackInfo
+[timeutils.decimal_relative_time]: http://boltons.readthedocs.org/en/latest/timeutils.html#boltons.timeutils.decimal_relative_time
+[timeutils.dt_to_timestamp]: http://boltons.readthedocs.org/en/latest/timeutils.html#boltons.timeutils.dt_to_timestamp
+[timeutils.isoparse]: http://boltons.readthedocs.org/en/latest/timeutils.html#boltons.timeutils.isoparse
+[timeutils.parse_timedelta]: http://boltons.readthedocs.org/en/latest/timeutils.html#boltons.timeutils.parse_timedelta
+[typeutils.get_all_subclasses]: http://boltons.readthedocs.org/en/latest/typeutils.html#boltons.typeutils.get_all_subclasses
+[typeutils.make_sentinel]: http://boltons.readthedocs.org/en/latest/typeutils.html#boltons.typeutils.make_sentinel
+[zscore]: https://en.wikipedia.org/wiki/Standard_score
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..6a4c9d2
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,29 @@
+Copyright (c) 2013, Mahmoud Hashemi
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * The names of the contributors may not be used to endorse or
+      promote products derived from this software without specific
+      prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..199e76d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,93 @@
+# Boltons
+
+*boltons should be builtins.*
+
+**Boltons** is a set of over 160 BSD-licensed, pure-Python utilities
+in the same spirit as — and yet conspicuously missing from —
+[the standard library][stdlib], including:
+
+  * [Atomic file saving][atomic], bolted on with [fileutils][fileutils]
+  * A highly-optimized [OrderedMultiDict][omd], in [dictutils][dictutils]
+  * *Two* types of [PriorityQueue][pq], in [queueutils][queueutils]
+  * [Chunked][chunked] and [windowed][windowed] iteration, in [iterutils][iterutils]
+  * Recursive data structure [iteration and merging][remap], with [iterutils.remap][iterutils.remap]
+  * Exponential backoff functionality, including jitter, through [iterutils.backoff][iterutils.backoff]
+  * A full-featured [TracebackInfo][tbinfo] type, for representing stack traces,
+    in [tbutils][tbutils]
+
+**[Full and extensive docs are available on Read The Docs.][rtd]** See
+what's new [by checking the CHANGELOG][changelog].
+
+Boltons is tested against Python 2.6, 2.7, 3.4, 3.5, and PyPy.
+
+[stdlib]: https://docs.python.org/2.7/library/index.html
+[rtd]: https://boltons.readthedocs.org/en/latest/
+[changelog]: https://github.com/mahmoud/boltons/blob/master/CHANGELOG.md
+
+[atomic]: https://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.atomic_save
+[omd]: https://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict
+[pq]: https://boltons.readthedocs.org/en/latest/queueutils.html#boltons.queueutils.PriorityQueue
+[chunked]: https://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.chunked
+[windowed]: https://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.windowed
+[tbinfo]: https://boltons.readthedocs.org/en/latest/tbutils.html#boltons.tbutils.TracebackInfo
+
+[fileutils]: https://boltons.readthedocs.org/en/latest/fileutils.html#module-boltons.fileutils
+[dictutils]: https://boltons.readthedocs.org/en/latest/dictutils.html#module-boltons.dictutils
+[queueutils]: https://boltons.readthedocs.org/en/latest/queueutils.html#module-boltons.queueutils
+[iterutils]: https://boltons.readthedocs.org/en/latest/iterutils.html#module-boltons.iterutils
+[iterutils.remap]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.remap
+[iterutils.backoff]: http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.backoff
+[tbutils]: https://boltons.readthedocs.org/en/latest/tbutils.html#module-boltons.tbutils
+
+[remap]: http://sedimental.org/remap.html
+
+## Installation
+
+Boltons can be added to a project in a few ways. There's the obvious one:
+
+```
+    pip install boltons
+```
+
+Then, [thanks to PyPI][boltons_pypi], dozens of boltons are just an import away:
+
+```python
+    from boltons.cacheutils import LRU
+    my_cache = LRU()
+```
+
+However, due to the nature of utilities, application developers might
+want to consider other options, including vendorization of individual
+modules into a project. Boltons is pure-Python and has no
+dependencies. If the whole project is too big, each module is
+independent, and can be copied directly into a project. See the
+[Integration][integration] section of the docs for more details.
+
+[boltons_pypi]: https://pypi.python.org/pypi/boltons
+[integration]: https://boltons.readthedocs.org/en/latest/architecture.html#integration
+
+## Third-party packages
+
+The majority of boltons strive to be "good enough" for a wide range of
+basic uses, leaving advanced use cases to Python's [myriad specialized
+3rd-party libraries][pypi]. In many cases the respective ``boltons`` module
+will describe 3rd-party alternatives worth investigating when use
+cases outgrow `boltons`. If you've found a natural "next-step"
+library worth mentioning, see the next section!
+
+[pypi]: https://pypi.python.org/pypi
+
+## Gaps
+
+Found something missing in the standard library that should be in
+`boltons`? Found something missing in `boltons`? First, take a
+moment to read the very brief [architecture statement][architecture] to make
+sure the functionality would be a good fit.
+
+Then, if you are very motivated, submit [a Pull Request][prs]. Otherwise,
+submit a short feature request on [the Issues page][issues], and we will
+figure something out.
+
+[architecture]: https://boltons.readthedocs.org/en/latest/architecture.html
+[issues]: https://github.com/mahmoud/boltons/issues
+[prs]: https://github.com/mahmoud/boltons/pulls
diff --git a/TODO.rst b/TODO.rst
new file mode 100644
index 0000000..462e0ce
--- /dev/null
+++ b/TODO.rst
@@ -0,0 +1,60 @@
+TODO
+====
+
+- dummy context manager
+- dummy file
+
+cacheutils
+----------
+
+- counting dictionary (with sys.modules example)
+
+dictutils
+---------
+
+- autoindexing list for dictionaries. As records get added, uses a
+  basic proportion-based heuristic to create subdictionaries as
+  indexes over the same data. Maybe automatically does a full-scan
+  option too.
+- non-overwriting version of dict.update()
+
+jsonutils
+---------
+
... 13873 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-boltons.git



More information about the Python-modules-commits mailing list