From 4981e96633143b88d629a11e5dc752dc1dd8a759 Mon Sep 17 00:00:00 2001 From: Mahmoud Hashemi Date: Sat, 22 Aug 2015 16:48:52 -0700 Subject: [PATCH] more readable linkification for the CHANGELOG --- CHANGELOG.md | 118 +++++++++++++++++++------------------- misc/linkify_changelog.py | 19 +++++- 2 files changed, 74 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ab30ec..6766414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,15 +13,15 @@ from the first wave addressed and closed. tzutils merged into timeutils. AtomicSaver approach and API much improved. Several other features added: - * [iterutils.backoff](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.backoff) and [iterutils.backoff_iter](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.backoff_iter) for exponential backoff - * [iterutils.frange](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.frange) and [iterutils.xfrange](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.xfrange) for floating point range generation - * Slightly more permissive [jsonutils.JSONLIterator](http://boltons.readthedocs.org/en/latest/jsonutils.html#boltons.jsonutils.JSONLIterator) blank line ignoring - * [strutils.iter_splitlines](http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.iter_splitlines) for lazily getting lines from a larger string - * [timeutils.dt_to_timestamp](http://boltons.readthedocs.org/en/latest/timeutils.html#boltons.timeutils.dt_to_timestamp), per the long-lived PR [#13](https://github.com/mahmoud/boltons/issues/13). + * iterutils.backoff and iterutils.backoff_iter for exponential backoff + * iterutils.frange and iterutils.xfrange for floating point range generation + * Slightly more permissive jsonutils.JSONLIterator blank line ignoring + * strutils.iter_splitlines for lazily getting lines from a larger string + * timeutils.dt_to_timestamp, per the long-lived PR #13. * Merged tzutils into timeutils - * [fileutils.AtomicSaver](http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.AtomicSaver) rewrite and redoc - * -teens support for [strutils.ordinalize](http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.ordinalize) - * made [iterutils.one](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.one) consistent with [iterutils.first](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.first) + * fileutils.AtomicSaver rewrite and redoc + * -teens support for strutils.ordinalize + * made iterutils.one consistent with iterutils.first 0.6.6 @@ -31,7 +31,7 @@ features added: Fix atomic saving open-file issue for Windows. * Patch for AtomicSaver on Windows. Full rewrite comes in 15.0.0. - * [strutils.gunzip_bytes](http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.gunzip_bytes) for decompressing a gzip bytestring + * strutils.gunzip_bytes for decompressing a gzip bytestring 0.6.5 @@ -39,20 +39,20 @@ Fix atomic saving open-file issue for Windows. *(July 30, 2015)* BufferedSocket work, html2text, pairwise shortcut, is_container, plural -typo fix, [timeutils.isoparse](http://boltons.readthedocs.org/en/latest/timeutils.html#boltons.timeutils.isoparse), [cacheutils.ThresholdCounter](http://boltons.readthedocs.org/en/latest/cacheutils.html#boltons.cacheutils.ThresholdCounter), and lots of +typo fix, timeutils.isoparse, cacheutils.ThresholdCounter, and lots of testing - * Add [iterutils.first](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.first) function - * Add [cacheutils.ThresholdCounter](http://boltons.readthedocs.org/en/latest/cacheutils.html#boltons.cacheutils.ThresholdCounter) + * Add iterutils.first function + * Add cacheutils.ThresholdCounter * Add JSONL verification to jsonutils - * Add [timeutils.isoparse](http://boltons.readthedocs.org/en/latest/timeutils.html#boltons.timeutils.isoparse) - * Add [strutils.html2text](http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.html2text) and [strutils.HTMLTextExtractor](http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.HTMLTextExtractor) - * Fix [strutils.pluralize](http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.pluralize) (indeces -> indices, per [#41](https://github.com/mahmoud/boltons/issues/41)) - * Add [iterutils.is_container](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.is_container) function - * Fixed a small formatting bug in [tbutils.ExceptionInfo](http://boltons.readthedocs.org/en/latest/tbutils.html#boltons.tbutils.ExceptionInfo) that added + * Add timeutils.isoparse + * Add strutils.html2text and strutils.HTMLTextExtractor + * Fix strutils.pluralize (indeces -> indices, per #41) + * Add iterutils.is_container function + * Fixed a small formatting bug in tbutils.ExceptionInfo that added an extra 'builtins.' for builtin exceptions under python 3 * Added tests for many modules - * Create [iterutils.pairwise](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.pairwise) shortcuts for pairwise chunks since + * Create 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 @@ -69,16 +69,16 @@ 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](http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict)'s __eq__ would fail + * Fix a bug where 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](http://boltons.readthedocs.org/en/latest/mathutils.html#boltons.mathutils.ceil) and [mathutils.floor](http://boltons.readthedocs.org/en/latest/mathutils.html#boltons.mathutils.floor) + * Added mathutils with mathutils.ceil and mathutils.floor implementations that can search a fixed set of choices using the bisect module. - * Fix [excutils.ParsedException](http://boltons.readthedocs.org/en/latest/excutils.html#boltons.excutils.ParsedException) so exception message would not start + * Fix excutils.ParsedException so exception message would not start with whitespace * Fix multiline exception messages - * Adding [socketutils.BufferedSocket](http://boltons.readthedocs.org/en/latest/socketutils.html#boltons.socketutils.BufferedSocket) and [socketutils.NetstringSocket](http://boltons.readthedocs.org/en/latest/socketutils.html#boltons.socketutils.NetstringSocket) + * Adding socketutils.BufferedSocket and socketutils.NetstringSocket 0.6.3 @@ -88,12 +88,12 @@ OMD.__eq__. Add typeutils, remove compat.py, make ParsedException work with eval()ed code - * Properly parse tracebacks with missing source. Resolves [#30](https://github.com/mahmoud/boltons/issues/30) - * Tweak the docs for [typeutils.get_all_subclasses](http://boltons.readthedocs.org/en/latest/typeutils.html#boltons.typeutils.get_all_subclasses) - * Moved [typeutils.make_sentinel](http://boltons.readthedocs.org/en/latest/typeutils.html#boltons.typeutils.make_sentinel) into typeutils and removed the + * Properly parse tracebacks with missing source. Resolves #30 + * Tweak the docs for typeutils.get_all_subclasses + * Moved typeutils.make_sentinel into typeutils and removed the confusing compat module - * Add in typeutils with modifications per the caveats of [#15](https://github.com/mahmoud/boltons/issues/15) - * Added function [iterutils.one](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.one) + * Add in typeutils with modifications per the caveats of #15 + * Added function iterutils.one 0.6.2 ----- @@ -101,10 +101,10 @@ code Add partial_ordering, fix LRU repr and addition behavior - * Add [funcutils.partial_ordering](http://boltons.readthedocs.org/en/latest/funcutils.html#boltons.funcutils.partial_ordering)(), decorator similar to + * Add funcutils.partial_ordering(), decorator similar to functools.total_ordering() - * Fixed [cacheutils.LRU](http://boltons.readthedocs.org/en/latest/cacheutils.html#boltons.cacheutils.LRU)'s behavior per [#21](https://github.com/mahmoud/boltons/issues/21) - * Fix [cacheutils.LRU](http://boltons.readthedocs.org/en/latest/cacheutils.html#boltons.cacheutils.LRU) repr reversal, fixes [#20](https://github.com/mahmoud/boltons/issues/20) + * Fixed cacheutils.LRU's behavior per #21 + * Fix cacheutils.LRU repr reversal, fixes #20 0.6.0 ----- @@ -117,9 +117,9 @@ Python 3 support and several community bugfixes. Docs clarifications, too. 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](http://boltons.readthedocs.org/en/latest/cacheutils.html#boltons.cacheutils.cached) decorator, adding a sanity test, fixes [#12](https://github.com/mahmoud/boltons/issues/12) + * Fix the cacheutils.cached decorator, adding a sanity test, fixes #12 * Fix bytes2human when builtin zip returns iterators - * Simplified logic of [iterutils.chunked](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.chunked) + * Simplified logic of iterutils.chunked 0.5.1 ----- @@ -129,10 +129,10 @@ 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](http://boltons.readthedocs.org/en/latest/gcutils.html#boltons.gcutils.get_all) based on pypy or cpython, also - [gcutils.is_tracked](http://boltons.readthedocs.org/en/latest/gcutils.html#boltons.gcutils.is_tracked) was added in 2.7, so making [gcutils.get_all](http://boltons.readthedocs.org/en/latest/gcutils.html#boltons.gcutils.get_all) work with 2.6 + * conditional availability of gcutils.get_all based on pypy or cpython, also + gcutils.is_tracked was added in 2.7, so making 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](http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.AtomicSaver) + * Fix invalid part_path usage in fileutils.AtomicSaver 0.5.0 ----- @@ -142,18 +142,18 @@ 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](http://boltons.readthedocs.org/en/latest/statsutils.html#boltons.statsutils.median) use _get_quantile and add [statsutils.trimean](http://boltons.readthedocs.org/en/latest/statsutils.html#boltons.statsutils.trimean) - * Switching the [statsutils.Stats](http://boltons.readthedocs.org/en/latest/statsutils.html#boltons.statsutils.Stats) type to be more sorted-data oriented, since it's + * making statsutils.median use _get_quantile and add statsutils.trimean + * Switching the 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](http://boltons.readthedocs.org/en/latest/timeutils.html#boltons.timeutils.decimal_relative_time) cardinalization optional + * Made timeutils.decimal_relative_time cardinalization optional * Removed timeutils dependency on strutils - * Made [tbutils.TracebackInfo](http://boltons.readthedocs.org/en/latest/tbutils.html#boltons.tbutils.TracebackInfo) classmethods work with no arguments. - * Renamed ParsedTB to [tbutils.ParsedException](http://boltons.readthedocs.org/en/latest/tbutils.html#boltons.tbutils.ParsedException) - * Made [dictutils.OMD](http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OMD) .get()/.getlist() semantics more consistent. - * finalizing .todict() and adding .sorted() to the [dictutils.OMD](http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OMD) + * Made tbutils.TracebackInfo classmethods work with no arguments. + * Renamed ParsedTB to tbutils.ParsedException + * Made dictutils.OMD .get()/.getlist() semantics more consistent. + * finalizing .todict() and adding .sorted() to the dictutils.OMD * Removed osutils and adding a note about utils in general * Made cacheutils more consistent between LRU and LRI, adding some cacheutils docs @@ -168,9 +168,9 @@ docs, docstrings, and Read The Docs. Mostly a dictutils API update (addlist), but also gcutils. - * [dictutils.OMD](http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OMD): split out addlist() from add(), removing the multi + * dictutils.OMD: split out addlist() from add(), removing the multi kwarg - * adding gcutils with [gcutils.GCToggler](http://boltons.readthedocs.org/en/latest/gcutils.html#boltons.gcutils.GCToggler) and gc.get_all + * adding gcutils with gcutils.GCToggler and gc.get_all 0.4.1 @@ -191,10 +191,10 @@ hashtags * tbutils: Changed the way exceptions are parsed out of tracebacks * tbutils: Guard against potential linecache issues - * Defined/implemented [iterutils.windowed_iter](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.windowed_iter) corner case behavior - * Added from_path to [fileutils.FilePerms](http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.FilePerms) - * Adding [strutils.find_hashtags](http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.find_hashtags) - * Add ignore patterns to [fileutils.iter_find_files](http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.iter_find_files) + * Defined/implemented iterutils.windowed_iter corner case behavior + * Added from_path to fileutils.FilePerms + * Adding strutils.find_hashtags + * Add ignore patterns to fileutils.iter_find_files 0.3.0 @@ -210,13 +210,13 @@ added in this release. convenience method for ExceptionInfo -> default exception print, also need to add more docstrings. * adding initial jsonutils with JSONL support - * added [cacheutils.LRU](http://boltons.readthedocs.org/en/latest/cacheutils.html#boltons.cacheutils.LRU) - * added [timeutils.parse_timedelta](http://boltons.readthedocs.org/en/latest/timeutils.html#boltons.timeutils.parse_timedelta) + * added cacheutils.LRU + * added timeutils.parse_timedelta * fixing iteritems with multi=False in the - [dictutils.OrderedMultiDict](http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict) (should return first key, but last + dictutils.OrderedMultiDict (should return first key, but last value not first) - * debugutils: add pdb excepthook and [debugutils.pdb_on_signal](http://boltons.readthedocs.org/en/latest/debugutils.html#boltons.debugutils.pdb_on_signal) - * add [fileutils.mkdir_p](http://boltons.readthedocs.org/en/latest/fileutils.html#boltons.fileutils.mkdir_p) + * debugutils: add pdb excepthook and debugutils.pdb_on_signal + * add fileutils.mkdir_p * tableutils: add maxlen to table text stuff * fix date citation for gob's * adding pure-Python implementation of Gob's algorithm @@ -265,10 +265,10 @@ added in this release. * fix reverse; missing yield from! * add initial table biz * add get_counts - * add [dictutils.OrderedMultiDict.get_inverted](http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict.get_inverted)() for those handy reverse lookups + * add dictutils.OrderedMultiDict.get_inverted() for those handy reverse lookups * break out skip list to FastIter OMD + bench - * add [strutils.a10n](http://boltons.readthedocs.org/en/latest/strutils.html#boltons.strutils.a10n)() - * fix a bug in [dictutils.OrderedMultiDict](http://boltons.readthedocs.org/en/latest/dictutils.html#boltons.dictutils.OrderedMultiDict)'s .add() + * add strutils.a10n() + * fix a bug in 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 @@ -381,7 +381,5 @@ added in this release. * bucketize and bucketize_bool, with docs * add examples to chunked and chunked_iter * update split() docs with more examples. - * [iterutils.chunked_iter](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.chunked_iter) and [iterutils.chunked](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.chunked) - * [iterutils.split](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.split) and [iterutils.split_iter](http://boltons.readthedocs.org/en/latest/iterutils.html#boltons.iterutils.split_iter) work - -ckof± \ No newline at end of file + * iterutils.chunked_iter and iterutils.chunked + * iterutils.split and iterutils.split_iter work diff --git a/misc/linkify_changelog.py b/misc/linkify_changelog.py index b63faa4..a43eee9 100644 --- a/misc/linkify_changelog.py +++ b/misc/linkify_changelog.py @@ -8,12 +8,14 @@ BASE_ISSUES_URL = 'https://github.com/mahmoud/boltons/issues/' _issues_re = re.compile('#(\d+)') _member_re = re.compile('((\w+utils)\.[a-zA-Z0-9_.]+)') +URL_MAP = {} def sub_member_match(match): full_name = match.group(1) mod_name = match.group(2) url = BASE_RTD_URL + mod_name + '.html#boltons.' + full_name - ret = '[%s](%s)' % (full_name, url) + ret = '[%s][%s]' % (full_name, full_name) + URL_MAP[full_name] = url # print ret return ret @@ -21,8 +23,10 @@ def sub_member_match(match): def sub_issue_match(match): link_text = match.group(0) issue_num = match.group(1) - link_target = BASE_ISSUES_URL + issue_num - ret = '[%s](%s)' % (link_text, link_target) + link_target = 'i%s' % issue_num + link_url = BASE_ISSUES_URL + issue_num + ret = '[%s][%s]' % (link_text, link_target) + URL_MAP[link_target] = link_url # print ret return ret @@ -35,7 +39,16 @@ def main(): cl_text = open(cl_filename).read().decode('utf-8') ret = _member_re.sub(sub_member_match, cl_text) ret = _issues_re.sub(sub_issue_match, ret) + + link_map_lines = [] + for (name, url) in sorted(URL_MAP.items()): + link_map_lines.append('[%s]: %s' % (name, url)) + print ret + print + print + print '\n'.join(link_map_lines) + print if __name__ == '__main__':