Bug 1466211 - Vendor blessings via |mach vendor python|; r?ahal draft
authorDave Hunt <dhunt@mozilla.com>
Thu, 31 May 2018 13:54:43 +0100
changeset 803745 4d50cf199f00abe1e60f635b46ac42e381701bf9
parent 803744 dd71cbb96f27586fea7a9230839226b8bc50ab75
child 803746 e73ed427438d92bc2e720f8ef7e70f625b86fc91
push id112168
push userbmo:dave.hunt@gmail.com
push dateMon, 04 Jun 2018 19:30:22 +0000
reviewersahal
bugs1466211
milestone62.0a1
Bug 1466211 - Vendor blessings via |mach vendor python|; r?ahal MozReview-Commit-ID: 6hT5jYwgMdO
Pipfile
Pipfile.lock
third_party/python/blessings/MANIFEST.in
third_party/python/blessings/PKG-INFO
third_party/python/blessings/README.rst
third_party/python/blessings/setup.cfg
third_party/python/blessings/setup.py
third_party/python/blessings/tox.ini
--- a/Pipfile
+++ b/Pipfile
@@ -8,11 +8,12 @@ name = "pypi"
 [packages]
 pipenv = "==2018.5.18"
 virtualenv = "==15.2.0"
 six = "==1.10.0"
 attrs = "==18.1.0"
 pytest = "==3.2.5"
 jsmin = "==2.1.0"
 python-hglib = "==2.4"
+blessings = "==1.6.1"
 
 [requires]
 python_version = "2.7"
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,12 +1,12 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "695978bb529a1cffb6f329519ce6fe68adbee73d9f05595dbefb2b9d0ebe4177"
+            "sha256": "83a48089bf48ec175cfa3b8c6f2a338002275e09d82bbbc027c263168f86a3ac"
         },
         "pipfile-spec": 6,
         "requires": {
             "python_version": "2.7"
         },
         "sources": [
             {
                 "name": "pypi",
@@ -19,16 +19,25 @@
         "attrs": {
             "hashes": [
                 "sha256:4b90b09eeeb9b88c35bc642cbac057e45a5fd85367b985bd2809c62b7b939265",
                 "sha256:e0d0eb91441a3b53dab4d9b743eafc1ac44476296a2053b6ca3af0b139faf87b"
             ],
             "index": "pypi",
             "version": "==18.1.0"
         },
+        "blessings": {
+            "hashes": [
+                "sha256:26dbaf2f89c3e6dee11c10f7c0b85756ed75cf602b1bb7935b4efd8ed67a000f",
+                "sha256:466e43ff45723b272311de0437649df464b33b4daba7a54c69493212958e19c7",
+                "sha256:74919575885552e14bc24a68f8b539690bd1b5629180faa830b1a25b8c7fb6ea"
+            ],
+            "index": "pypi",
+            "version": "==1.6.1"
+        },
         "certifi": {
             "hashes": [
                 "sha256:13e698f54293db9f89122b0581843a782ad0934a4fe0172d2a980ba77fc61bb7",
                 "sha256:9fa520c1bacfb634fa7af20a76bcbd3d5fb390481724c597da32c719a7dca4b0"
             ],
             "version": "==2018.4.16"
         },
         "jsmin": {
new file mode 100644
--- /dev/null
+++ b/third_party/python/blessings/MANIFEST.in
@@ -0,0 +1,3 @@
+include README.rst
+include LICENSE
+include tox.ini
new file mode 100644
--- /dev/null
+++ b/third_party/python/blessings/PKG-INFO
@@ -0,0 +1,554 @@
+Metadata-Version: 1.1
+Name: blessings
+Version: 1.6.1
+Summary: A thin, practical wrapper around terminal coloring, styling, and positioning
+Home-page: https://github.com/erikrose/blessings
+Author: Erik Rose
+Author-email: erikrose@grinchcentral.com
+License: MIT
+Description-Content-Type: UNKNOWN
+Description: =========
+        Blessings
+        =========
+        
+        Coding with Blessings looks like this... ::
+        
+            from blessings import Terminal
+        
+            t = Terminal()
+        
+            print t.bold('Hi there!')
+            print t.bold_red_on_bright_green('It hurts my eyes!')
+        
+            with t.location(0, t.height - 1):
+                print 'This is at the bottom.'
+        
+        Or, for byte-level control, you can drop down and play with raw terminal
+        capabilities::
+        
+            print '{t.bold}All your {t.red}bold and red base{t.normal}'.format(t=t)
+            print t.wingo(2)
+        
+        `Full API Reference <https://blessings.readthedocs.io/>`_
+        
+        The Pitch
+        =========
+        
+        Blessings lifts several of curses_' limiting assumptions, and it makes your
+        code pretty, too:
+        
+        * Use styles, color, and maybe a little positioning without necessarily
+          clearing the whole
+          screen first.
+        * Leave more than one screenful of scrollback in the buffer after your program
+          exits, like a well-behaved command-line app should.
+        * Get rid of all those noisy, C-like calls to ``tigetstr`` and ``tparm``, so
+          your code doesn't get crowded out by terminal bookkeeping.
+        * Act intelligently when somebody redirects your output to a file, omitting the
+          terminal control codes the user doesn't want to see (optional).
+        
+        .. _curses: http://docs.python.org/library/curses.html
+        
+        Before And After
+        ----------------
+        
+        Without Blessings, this is how you'd print some underlined text at the bottom
+        of the screen::
+        
+            from curses import tigetstr, setupterm, tparm
+            from fcntl import ioctl
+            from os import isatty
+            import struct
+            import sys
+            from termios import TIOCGWINSZ
+        
+            # If we want to tolerate having our output piped to other commands or
+            # files without crashing, we need to do all this branching:
+            if hasattr(sys.stdout, 'fileno') and isatty(sys.stdout.fileno()):
+                setupterm()
+                sc = tigetstr('sc')
+                cup = tigetstr('cup')
+                rc = tigetstr('rc')
+                underline = tigetstr('smul')
+                normal = tigetstr('sgr0')
+            else:
+                sc = cup = rc = underline = normal = ''
+            print sc  # Save cursor position.
+            if cup:
+                # tigetnum('lines') doesn't always update promptly, hence this:
+                height = struct.unpack('hhhh', ioctl(0, TIOCGWINSZ, '\000' * 8))[0]
+                print tparm(cup, height - 1, 0)  # Move cursor to bottom.
+            print 'This is {under}underlined{normal}!'.format(under=underline,
+                                                              normal=normal)
+            print rc  # Restore cursor position.
+        
+        That was long and full of incomprehensible trash! Let's try it again, this time
+        with Blessings::
+        
+            from blessings import Terminal
+        
+            term = Terminal()
+            with term.location(0, term.height - 1):
+                print 'This is', term.underline('pretty!')
+        
+        Much better.
+        
+        What It Provides
+        ================
+        
+        Blessings provides just one top-level object: ``Terminal``. Instantiating a
+        ``Terminal`` figures out whether you're on a terminal at all and, if so, does
+        any necessary terminal setup. After that, you can proceed to ask it all sorts
+        of things about the terminal. Terminal terminal terminal.
+        
+        Simple Formatting
+        -----------------
+        
+        Lots of handy formatting codes ("capabilities" in low-level parlance) are
+        available as attributes on a ``Terminal``. For example::
+        
+            from blessings import Terminal
+        
+            term = Terminal()
+            print 'I am ' + term.bold + 'bold' + term.normal + '!'
+        
+        Though they are strings at heart, you can also use them as callable wrappers so
+        you don't have to say ``normal`` afterward::
+        
+            print 'I am', term.bold('bold') + '!'
+        
+        Or, if you want fine-grained control while maintaining some semblance of
+        brevity, you can combine it with Python's string formatting, which makes
+        attributes easy to access::
+        
+            print 'All your {t.red}base {t.underline}are belong to us{t.normal}'.format(t=term)
+        
+        Simple capabilities of interest include...
+        
+        * ``bold``
+        * ``reverse``
+        * ``underline``
+        * ``no_underline`` (which turns off underlining)
+        * ``blink``
+        * ``normal`` (which turns off everything, even colors)
+        
+        Here are a few more which are less likely to work on all terminals:
+        
+        * ``dim``
+        * ``italic`` and ``no_italic``
+        * ``shadow`` and ``no_shadow``
+        * ``standout`` and ``no_standout``
+        * ``subscript`` and ``no_subscript``
+        * ``superscript`` and ``no_superscript``
+        * ``flash`` (which flashes the screen once)
+        
+        Note that, while the inverse of ``underline`` is ``no_underline``, the only way
+        to turn off ``bold`` or ``reverse`` is ``normal``, which also cancels any
+        custom colors. This is because there's no portable way to tell the terminal to
+        undo certain pieces of formatting, even at the lowest level.
+        
+        You might also notice that the above aren't the typical incomprehensible
+        terminfo capability names; we alias a few of the harder-to-remember ones for
+        readability. However, you aren't limited to these: you can reference any
+        string-returning capability listed on the `terminfo man page`_ by the name
+        under the "Cap-name" column: for example, ``term.rum``.
+        
+        .. _`terminfo man page`: http://www.manpagez.com/man/5/terminfo/
+        
+        Color
+        -----
+        
+        16 colors, both foreground and background, are available as easy-to-remember
+        attributes::
+        
+            from blessings import Terminal
+        
+            term = Terminal()
+            print term.red + term.on_green + 'Red on green? Ick!' + term.normal
+            print term.bright_red + term.on_bright_blue + 'This is even worse!' + term.normal
+        
+        You can also call them as wrappers, which sets everything back to normal at the
+        end::
+        
+            print term.red_on_green('Red on green? Ick!')
+            print term.yellow('I can barely see it.')
+        
+        The available colors are...
+        
+        * ``black``
+        * ``red``
+        * ``green``
+        * ``yellow``
+        * ``blue``
+        * ``magenta``
+        * ``cyan``
+        * ``white``
+        
+        You can set the background color instead of the foreground by prepending
+        ``on_``, as in ``on_blue``. There is also a ``bright`` version of each color:
+        for example, ``on_bright_blue``.
+        
+        There is also a numerical interface to colors, which takes an integer from
+        0-15::
+        
+            term.color(5) + 'Hello' + term.normal
+            term.on_color(3) + 'Hello' + term.normal
+        
+            term.color(5)('Hello')
+            term.on_color(3)('Hello')
+        
+        If some color is unsupported (for instance, if only the normal colors are
+        available, not the bright ones), trying to use it will, on most terminals, have
+        no effect: the foreground and background colors will stay as they were. You can
+        get fancy and do different things depending on the supported colors by checking
+        `number_of_colors`_.
+        
+        .. _`number_of_colors`: http://packages.python.org/blessings/#blessings.Terminal.number_of_colors
+        
+        Compound Formatting
+        -------------------
+        
+        If you want to do lots of crazy formatting all at once, you can just mash it
+        all together::
+        
+            from blessings import Terminal
+        
+            term = Terminal()
+            print term.bold_underline_green_on_yellow + 'Woo' + term.normal
+        
+        Or you can use your newly coined attribute as a wrapper, which implicitly sets
+        everything back to normal afterward::
+        
+            print term.bold_underline_green_on_yellow('Woo')
+        
+        This compound notation comes in handy if you want to allow users to customize
+        the formatting of your app: just have them pass in a format specifier like
+        "bold_green" on the command line, and do a quick ``getattr(term,
+        that_option)('Your text')`` when you do your formatting.
+        
+        I'd be remiss if I didn't credit couleur_, where I probably got the idea for
+        all this mashing.
+        
+        .. _couleur: http://pypi.python.org/pypi/couleur
+        
+        Moving The Cursor
+        -----------------
+        
+        When you want to move the cursor to output text at a specific spot, you have
+        a few choices.
+        
+        Moving Temporarily
+        ~~~~~~~~~~~~~~~~~~
+        
+        Most often, you'll need to flit to a certain location, print something, and
+        then return: for example, when updating a progress bar at the bottom of the
+        screen. ``Terminal`` provides a context manager for doing this concisely::
+        
+            from blessings import Terminal
+        
+            term = Terminal()
+            with term.location(0, term.height - 1):
+                print 'Here is the bottom.'
+            print 'This is back where I came from.'
+        
+        Parameters to ``location()`` are ``x`` and then ``y``, but you can also pass
+        just one of them, leaving the other alone. For example... ::
+        
+            with term.location(y=10):
+                print 'We changed just the row.'
+        
+        If you're doing a series of ``move`` calls (see below) and want to return the
+        cursor to its original position afterward, call ``location()`` with no
+        arguments, and it will do only the position restoring::
+        
+            with term.location():
+                print term.move(1, 1) + 'Hi'
+                print term.move(9, 9) + 'Mom'
+        
+        Note that, since ``location()`` uses the terminal's built-in
+        position-remembering machinery, you can't usefully nest multiple calls. Use
+        ``location()`` at the outermost spot, and use simpler things like ``move``
+        inside.
+        
+        Moving Permanently
+        ~~~~~~~~~~~~~~~~~~
+        
+        If you just want to move and aren't worried about returning, do something like
+        this::
+        
+            from blessings import Terminal
+        
+            term = Terminal()
+            print term.move(10, 1) + 'Hi, mom!'
+        
+        ``move``
+          Position the cursor elsewhere. Parameters are y coordinate, then x
+          coordinate.
+        ``move_x``
+          Move the cursor to the given column.
+        ``move_y``
+          Move the cursor to the given row.
+        
+        How does all this work? These are simply more terminal capabilities, wrapped to
+        give them nicer names. The added wrinkle--that they take parameters--is also
+        given a pleasant treatment: rather than making you dig up ``tparm()`` all the
+        time, we simply make these capabilities into callable strings. You'd get the
+        raw capability strings if you were to just print them, but they're fully
+        parametrized if you pass params to them as if they were functions.
+        
+        Consequently, you can also reference any other string-returning capability
+        listed on the `terminfo man page`_ by its name under the "Cap-name" column.
+        
+        .. _`terminfo man page`: http://www.manpagez.com/man/5/terminfo/
+        
+        One-Notch Movement
+        ~~~~~~~~~~~~~~~~~~
+        
+        Finally, there are some parameterless movement capabilities that move the
+        cursor one character in various directions:
+        
+        * ``move_left``
+        * ``move_right``
+        * ``move_up``
+        * ``move_down``
+        
+        For example... ::
+        
+            print term.move_up + 'Howdy!'
+        
+        Height And Width
+        ----------------
+        
+        It's simple to get the height and width of the terminal, in characters::
+        
+            from blessings import Terminal
+        
+            term = Terminal()
+            height = term.height
+            width = term.width
+        
+        These are newly updated each time you ask for them, so they're safe to use from
+        SIGWINCH handlers.
+        
+        Clearing The Screen
+        -------------------
+        
+        Blessings provides syntactic sugar over some screen-clearing capabilities:
+        
+        ``clear``
+          Clear the whole screen.
+        ``clear_eol``
+          Clear to the end of the line.
+        ``clear_bol``
+          Clear backward to the beginning of the line.
+        ``clear_eos``
+          Clear to the end of screen.
+        
+        Full-Screen Mode
+        ----------------
+        
+        Perhaps you have seen a full-screen program, such as an editor, restore the
+        exact previous state of the terminal upon exiting, including, for example, the
+        command-line prompt from which it was launched. Curses pretty much forces you
+        into this behavior, but Blessings makes it optional. If you want to do the
+        state-restoration thing, use these capabilities:
+        
+        ``enter_fullscreen``
+            Switch to the terminal mode where full-screen output is sanctioned. Print
+            this before you do any output.
+        ``exit_fullscreen``
+            Switch back to normal mode, restoring the exact state from before
+            ``enter_fullscreen`` was used.
+        
+        Using ``exit_fullscreen`` will wipe away any trace of your program's output, so
+        reserve it for when you don't want to leave anything behind in the scrollback.
+        
+        There's also a context manager you can use as a shortcut::
+        
+            from blessings import Terminal
+        
+            term = Terminal()
+            with term.fullscreen():
+                # Print some stuff.
+        
+        Besides brevity, another advantage is that it switches back to normal mode even
+        if an exception is raised in the ``with`` block.
+        
+        Pipe Savvy
+        ----------
+        
+        If your program isn't attached to a terminal, like if it's being piped to
+        another command or redirected to a file, all the capability attributes on
+        ``Terminal`` will return empty strings. You'll get a nice-looking file without
+        any formatting codes gumming up the works.
+        
+        If you want to override this--like if you anticipate your program being piped
+        through ``less -r``, which handles terminal escapes just fine--pass
+        ``force_styling=True`` to the ``Terminal`` constructor.
+        
+        In any case, there is a ``does_styling`` attribute on ``Terminal`` that lets
+        you see whether your capabilities will return actual, working formatting codes.
+        If it's false, you should refrain from drawing progress bars and other frippery
+        and just stick to content, since you're apparently headed into a pipe::
+        
+            from blessings import Terminal
+        
+            term = Terminal()
+            if term.does_styling:
+                with term.location(0, term.height - 1):
+                    print 'Progress: [=======>   ]'
+            print term.bold('Important stuff')
+        
+        Shopping List
+        =============
+        
+        There are decades of legacy tied up in terminal interaction, so attention to
+        detail and behavior in edge cases make a difference. Here are some ways
+        Blessings has your back:
+        
+        * Uses the terminfo database so it works with any terminal type
+        * Provides up-to-the-moment terminal height and width, so you can respond to
+          terminal size changes (SIGWINCH signals). (Most other libraries query the
+          ``COLUMNS`` and ``LINES`` environment variables or the ``cols`` or ``lines``
+          terminal capabilities, which don't update promptly, if at all.)
+        * Avoids making a mess if the output gets piped to a non-terminal
+        * Works great with standard Python string templating
+        * Provides convenient access to all terminal capabilities, not just a sugared
+          few
+        * Outputs to any file-like object, not just stdout
+        * Keeps a minimum of internal state, so you can feel free to mix and match with
+          calls to curses or whatever other terminal libraries you like
+        
+        Blessings does not provide...
+        
+        * Native color support on the Windows command prompt. However, it should work
+          when used in concert with colorama_.
+        
+        .. _colorama: http://pypi.python.org/pypi/colorama/0.2.4
+        
+        Bugs
+        ====
+        
+        Bugs or suggestions? Visit the `issue tracker`_.
+        
+        .. _`issue tracker`: https://github.com/erikrose/blessings/issues/
+        
+        Blessings tests are run automatically by `Travis CI`_.
+        
+        .. _`Travis CI`: https://travis-ci.org/erikrose/blessings/
+        
+        .. image:: https://secure.travis-ci.org/erikrose/blessings.png
+        
+        
+        License
+        =======
+        
+        Blessings is under the MIT License. See the LICENSE file.
+        
+        Version History
+        ===============
+        
+        1.6.1
+          * Don't crash if ``number_of_colors()`` is called when run in a non-terminal
+            or when ``does_styling`` is otherwise false.
+        
+        1.6
+          * Add ``does_styling`` property. This takes ``force_styling`` into account
+            and should replace most uses of ``is_a_tty``.
+          * Make ``is_a_tty`` a read-only property, like ``does_styling``. Writing to
+            it never would have done anything constructive.
+          * Add ``fullscreen()`` and ``hidden_cursor()`` to the auto-generated docs.
+          * Fall back to ``LINES`` and ``COLUMNS`` environment vars to find height and
+            width. (jquast)
+          * Support terminal types, such as kermit and avatar, that use bytes 127-255
+            in their escape sequences. (jquast)
+        
+        1.5.1
+          * Clean up fabfile, removing the redundant ``test`` command.
+          * Add Travis support.
+          * Make ``python setup.py test`` work without spurious errors on 2.6.
+          * Work around a tox parsing bug in its config file.
+          * Make context managers clean up after themselves even if there's an
+            exception. (Vitja Makarov)
+          * Parametrizing a capability no longer crashes when there is no tty. (Vitja
+            Makarov)
+        
+        1.5
+          * Add syntactic sugar and documentation for ``enter_fullscreen`` and
+            ``exit_fullscreen``.
+          * Add context managers ``fullscreen()`` and ``hidden_cursor()``.
+          * Now you can force a ``Terminal`` never to emit styles by passing
+            ``force_styling=None``.
+        
+        1.4
+          * Add syntactic sugar for cursor visibility control and single-space-movement
+            capabilities.
+          * Endorse the ``location()`` idiom for restoring cursor position after a
+            series of manual movements.
+          * Fix a bug in which ``location()`` wouldn't do anything when passed zeroes.
+          * Allow tests to be run with ``python setup.py test``.
+        
+        1.3
+          * Added ``number_of_colors``, which tells you how many colors the terminal
+            supports.
+          * Made ``color(n)`` and ``on_color(n)`` callable to wrap a string, like the
+            named colors can. Also, make them both fall back to the ``setf`` and
+            ``setb`` capabilities (like the named colors do) if the ANSI ``setaf`` and
+            ``setab`` aren't available.
+          * Allowed ``color`` attr to act as an unparametrized string, not just a
+            callable.
+          * Made ``height`` and ``width`` examine any passed-in stream before falling
+            back to stdout. (This rarely if ever affects actual behavior; it's mostly
+            philosophical.)
+          * Made caching simpler and slightly more efficient.
+          * Got rid of a reference cycle between Terminals and FormattingStrings.
+          * Updated docs to reflect that terminal addressing (as in ``location()``) is
+            0-based.
+        
+        1.2
+          * Added support for Python 3! We need 3.2.3 or greater, because the curses
+            library couldn't decide whether to accept strs or bytes before that
+            (http://bugs.python.org/issue10570).
+          * Everything that comes out of the library is now unicode. This lets us
+            support Python 3 without making a mess of the code, and Python 2 should
+            continue to work unless you were testing types (and badly). Please file a
+            bug if this causes trouble for you.
+          * Changed to the MIT License for better world domination.
+          * Added Sphinx docs.
+        
+        1.1
+          * Added nicely named attributes for colors.
+          * Introduced compound formatting.
+          * Added wrapper behavior for styling and colors.
+          * Let you force capabilities to be non-empty, even if the output stream is
+            not a terminal.
+          * Added the ``is_a_tty`` attribute for telling whether the output stream is a
+            terminal.
+          * Sugared the remaining interesting string capabilities.
+          * Let ``location()`` operate on just an x *or* y coordinate.
+        
+        1.0
+          * Extracted Blessings from nose-progressive, my `progress-bar-having,
+            traceback-shortcutting, rootin', tootin' testrunner`_. It provided the
+            tootin' functionality.
+        
+        .. _`progress-bar-having, traceback-shortcutting, rootin', tootin' testrunner`: http://pypi.python.org/pypi/nose-progressive/
+        
+Keywords: terminal,tty,curses,ncurses,formatting,style,color,console
+Platform: UNKNOWN
+Classifier: Intended Audience :: Developers
+Classifier: Natural Language :: English
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: Environment :: Console :: Curses
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.2
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Software Development :: User Interfaces
+Classifier: Topic :: Terminals
new file mode 100644
--- /dev/null
+++ b/third_party/python/blessings/README.rst
@@ -0,0 +1,526 @@
+=========
+Blessings
+=========
+
+Coding with Blessings looks like this... ::
+
+    from blessings import Terminal
+
+    t = Terminal()
+
+    print t.bold('Hi there!')
+    print t.bold_red_on_bright_green('It hurts my eyes!')
+
+    with t.location(0, t.height - 1):
+        print 'This is at the bottom.'
+
+Or, for byte-level control, you can drop down and play with raw terminal
+capabilities::
+
+    print '{t.bold}All your {t.red}bold and red base{t.normal}'.format(t=t)
+    print t.wingo(2)
+
+`Full API Reference <https://blessings.readthedocs.io/>`_
+
+The Pitch
+=========
+
+Blessings lifts several of curses_' limiting assumptions, and it makes your
+code pretty, too:
+
+* Use styles, color, and maybe a little positioning without necessarily
+  clearing the whole
+  screen first.
+* Leave more than one screenful of scrollback in the buffer after your program
+  exits, like a well-behaved command-line app should.
+* Get rid of all those noisy, C-like calls to ``tigetstr`` and ``tparm``, so
+  your code doesn't get crowded out by terminal bookkeeping.
+* Act intelligently when somebody redirects your output to a file, omitting the
+  terminal control codes the user doesn't want to see (optional).
+
+.. _curses: http://docs.python.org/library/curses.html
+
+Before And After
+----------------
+
+Without Blessings, this is how you'd print some underlined text at the bottom
+of the screen::
+
+    from curses import tigetstr, setupterm, tparm
+    from fcntl import ioctl
+    from os import isatty
+    import struct
+    import sys
+    from termios import TIOCGWINSZ
+
+    # If we want to tolerate having our output piped to other commands or
+    # files without crashing, we need to do all this branching:
+    if hasattr(sys.stdout, 'fileno') and isatty(sys.stdout.fileno()):
+        setupterm()
+        sc = tigetstr('sc')
+        cup = tigetstr('cup')
+        rc = tigetstr('rc')
+        underline = tigetstr('smul')
+        normal = tigetstr('sgr0')
+    else:
+        sc = cup = rc = underline = normal = ''
+    print sc  # Save cursor position.
+    if cup:
+        # tigetnum('lines') doesn't always update promptly, hence this:
+        height = struct.unpack('hhhh', ioctl(0, TIOCGWINSZ, '\000' * 8))[0]
+        print tparm(cup, height - 1, 0)  # Move cursor to bottom.
+    print 'This is {under}underlined{normal}!'.format(under=underline,
+                                                      normal=normal)
+    print rc  # Restore cursor position.
+
+That was long and full of incomprehensible trash! Let's try it again, this time
+with Blessings::
+
+    from blessings import Terminal
+
+    term = Terminal()
+    with term.location(0, term.height - 1):
+        print 'This is', term.underline('pretty!')
+
+Much better.
+
+What It Provides
+================
+
+Blessings provides just one top-level object: ``Terminal``. Instantiating a
+``Terminal`` figures out whether you're on a terminal at all and, if so, does
+any necessary terminal setup. After that, you can proceed to ask it all sorts
+of things about the terminal. Terminal terminal terminal.
+
+Simple Formatting
+-----------------
+
+Lots of handy formatting codes ("capabilities" in low-level parlance) are
+available as attributes on a ``Terminal``. For example::
+
+    from blessings import Terminal
+
+    term = Terminal()
+    print 'I am ' + term.bold + 'bold' + term.normal + '!'
+
+Though they are strings at heart, you can also use them as callable wrappers so
+you don't have to say ``normal`` afterward::
+
+    print 'I am', term.bold('bold') + '!'
+
+Or, if you want fine-grained control while maintaining some semblance of
+brevity, you can combine it with Python's string formatting, which makes
+attributes easy to access::
+
+    print 'All your {t.red}base {t.underline}are belong to us{t.normal}'.format(t=term)
+
+Simple capabilities of interest include...
+
+* ``bold``
+* ``reverse``
+* ``underline``
+* ``no_underline`` (which turns off underlining)
+* ``blink``
+* ``normal`` (which turns off everything, even colors)
+
+Here are a few more which are less likely to work on all terminals:
+
+* ``dim``
+* ``italic`` and ``no_italic``
+* ``shadow`` and ``no_shadow``
+* ``standout`` and ``no_standout``
+* ``subscript`` and ``no_subscript``
+* ``superscript`` and ``no_superscript``
+* ``flash`` (which flashes the screen once)
+
+Note that, while the inverse of ``underline`` is ``no_underline``, the only way
+to turn off ``bold`` or ``reverse`` is ``normal``, which also cancels any
+custom colors. This is because there's no portable way to tell the terminal to
+undo certain pieces of formatting, even at the lowest level.
+
+You might also notice that the above aren't the typical incomprehensible
+terminfo capability names; we alias a few of the harder-to-remember ones for
+readability. However, you aren't limited to these: you can reference any
+string-returning capability listed on the `terminfo man page`_ by the name
+under the "Cap-name" column: for example, ``term.rum``.
+
+.. _`terminfo man page`: http://www.manpagez.com/man/5/terminfo/
+
+Color
+-----
+
+16 colors, both foreground and background, are available as easy-to-remember
+attributes::
+
+    from blessings import Terminal
+
+    term = Terminal()
+    print term.red + term.on_green + 'Red on green? Ick!' + term.normal
+    print term.bright_red + term.on_bright_blue + 'This is even worse!' + term.normal
+
+You can also call them as wrappers, which sets everything back to normal at the
+end::
+
+    print term.red_on_green('Red on green? Ick!')
+    print term.yellow('I can barely see it.')
+
+The available colors are...
+
+* ``black``
+* ``red``
+* ``green``
+* ``yellow``
+* ``blue``
+* ``magenta``
+* ``cyan``
+* ``white``
+
+You can set the background color instead of the foreground by prepending
+``on_``, as in ``on_blue``. There is also a ``bright`` version of each color:
+for example, ``on_bright_blue``.
+
+There is also a numerical interface to colors, which takes an integer from
+0-15::
+
+    term.color(5) + 'Hello' + term.normal
+    term.on_color(3) + 'Hello' + term.normal
+
+    term.color(5)('Hello')
+    term.on_color(3)('Hello')
+
+If some color is unsupported (for instance, if only the normal colors are
+available, not the bright ones), trying to use it will, on most terminals, have
+no effect: the foreground and background colors will stay as they were. You can
+get fancy and do different things depending on the supported colors by checking
+`number_of_colors`_.
+
+.. _`number_of_colors`: http://packages.python.org/blessings/#blessings.Terminal.number_of_colors
+
+Compound Formatting
+-------------------
+
+If you want to do lots of crazy formatting all at once, you can just mash it
+all together::
+
+    from blessings import Terminal
+
+    term = Terminal()
+    print term.bold_underline_green_on_yellow + 'Woo' + term.normal
+
+Or you can use your newly coined attribute as a wrapper, which implicitly sets
+everything back to normal afterward::
+
+    print term.bold_underline_green_on_yellow('Woo')
+
+This compound notation comes in handy if you want to allow users to customize
+the formatting of your app: just have them pass in a format specifier like
+"bold_green" on the command line, and do a quick ``getattr(term,
+that_option)('Your text')`` when you do your formatting.
+
+I'd be remiss if I didn't credit couleur_, where I probably got the idea for
+all this mashing.
+
+.. _couleur: http://pypi.python.org/pypi/couleur
+
+Moving The Cursor
+-----------------
+
+When you want to move the cursor to output text at a specific spot, you have
+a few choices.
+
+Moving Temporarily
+~~~~~~~~~~~~~~~~~~
+
+Most often, you'll need to flit to a certain location, print something, and
+then return: for example, when updating a progress bar at the bottom of the
+screen. ``Terminal`` provides a context manager for doing this concisely::
+
+    from blessings import Terminal
+
+    term = Terminal()
+    with term.location(0, term.height - 1):
+        print 'Here is the bottom.'
+    print 'This is back where I came from.'
+
+Parameters to ``location()`` are ``x`` and then ``y``, but you can also pass
+just one of them, leaving the other alone. For example... ::
+
+    with term.location(y=10):
+        print 'We changed just the row.'
+
+If you're doing a series of ``move`` calls (see below) and want to return the
+cursor to its original position afterward, call ``location()`` with no
+arguments, and it will do only the position restoring::
+
+    with term.location():
+        print term.move(1, 1) + 'Hi'
+        print term.move(9, 9) + 'Mom'
+
+Note that, since ``location()`` uses the terminal's built-in
+position-remembering machinery, you can't usefully nest multiple calls. Use
+``location()`` at the outermost spot, and use simpler things like ``move``
+inside.
+
+Moving Permanently
+~~~~~~~~~~~~~~~~~~
+
+If you just want to move and aren't worried about returning, do something like
+this::
+
+    from blessings import Terminal
+
+    term = Terminal()
+    print term.move(10, 1) + 'Hi, mom!'
+
+``move``
+  Position the cursor elsewhere. Parameters are y coordinate, then x
+  coordinate.
+``move_x``
+  Move the cursor to the given column.
+``move_y``
+  Move the cursor to the given row.
+
+How does all this work? These are simply more terminal capabilities, wrapped to
+give them nicer names. The added wrinkle--that they take parameters--is also
+given a pleasant treatment: rather than making you dig up ``tparm()`` all the
+time, we simply make these capabilities into callable strings. You'd get the
+raw capability strings if you were to just print them, but they're fully
+parametrized if you pass params to them as if they were functions.
+
+Consequently, you can also reference any other string-returning capability
+listed on the `terminfo man page`_ by its name under the "Cap-name" column.
+
+.. _`terminfo man page`: http://www.manpagez.com/man/5/terminfo/
+
+One-Notch Movement
+~~~~~~~~~~~~~~~~~~
+
+Finally, there are some parameterless movement capabilities that move the
+cursor one character in various directions:
+
+* ``move_left``
+* ``move_right``
+* ``move_up``
+* ``move_down``
+
+For example... ::
+
+    print term.move_up + 'Howdy!'
+
+Height And Width
+----------------
+
+It's simple to get the height and width of the terminal, in characters::
+
+    from blessings import Terminal
+
+    term = Terminal()
+    height = term.height
+    width = term.width
+
+These are newly updated each time you ask for them, so they're safe to use from
+SIGWINCH handlers.
+
+Clearing The Screen
+-------------------
+
+Blessings provides syntactic sugar over some screen-clearing capabilities:
+
+``clear``
+  Clear the whole screen.
+``clear_eol``
+  Clear to the end of the line.
+``clear_bol``
+  Clear backward to the beginning of the line.
+``clear_eos``
+  Clear to the end of screen.
+
+Full-Screen Mode
+----------------
+
+Perhaps you have seen a full-screen program, such as an editor, restore the
+exact previous state of the terminal upon exiting, including, for example, the
+command-line prompt from which it was launched. Curses pretty much forces you
+into this behavior, but Blessings makes it optional. If you want to do the
+state-restoration thing, use these capabilities:
+
+``enter_fullscreen``
+    Switch to the terminal mode where full-screen output is sanctioned. Print
+    this before you do any output.
+``exit_fullscreen``
+    Switch back to normal mode, restoring the exact state from before
+    ``enter_fullscreen`` was used.
+
+Using ``exit_fullscreen`` will wipe away any trace of your program's output, so
+reserve it for when you don't want to leave anything behind in the scrollback.
+
+There's also a context manager you can use as a shortcut::
+
+    from blessings import Terminal
+
+    term = Terminal()
+    with term.fullscreen():
+        # Print some stuff.
+
+Besides brevity, another advantage is that it switches back to normal mode even
+if an exception is raised in the ``with`` block.
+
+Pipe Savvy
+----------
+
+If your program isn't attached to a terminal, like if it's being piped to
+another command or redirected to a file, all the capability attributes on
+``Terminal`` will return empty strings. You'll get a nice-looking file without
+any formatting codes gumming up the works.
+
+If you want to override this--like if you anticipate your program being piped
+through ``less -r``, which handles terminal escapes just fine--pass
+``force_styling=True`` to the ``Terminal`` constructor.
+
+In any case, there is a ``does_styling`` attribute on ``Terminal`` that lets
+you see whether your capabilities will return actual, working formatting codes.
+If it's false, you should refrain from drawing progress bars and other frippery
+and just stick to content, since you're apparently headed into a pipe::
+
+    from blessings import Terminal
+
+    term = Terminal()
+    if term.does_styling:
+        with term.location(0, term.height - 1):
+            print 'Progress: [=======>   ]'
+    print term.bold('Important stuff')
+
+Shopping List
+=============
+
+There are decades of legacy tied up in terminal interaction, so attention to
+detail and behavior in edge cases make a difference. Here are some ways
+Blessings has your back:
+
+* Uses the terminfo database so it works with any terminal type
+* Provides up-to-the-moment terminal height and width, so you can respond to
+  terminal size changes (SIGWINCH signals). (Most other libraries query the
+  ``COLUMNS`` and ``LINES`` environment variables or the ``cols`` or ``lines``
+  terminal capabilities, which don't update promptly, if at all.)
+* Avoids making a mess if the output gets piped to a non-terminal
+* Works great with standard Python string templating
+* Provides convenient access to all terminal capabilities, not just a sugared
+  few
+* Outputs to any file-like object, not just stdout
+* Keeps a minimum of internal state, so you can feel free to mix and match with
+  calls to curses or whatever other terminal libraries you like
+
+Blessings does not provide...
+
+* Native color support on the Windows command prompt. However, it should work
+  when used in concert with colorama_.
+
+.. _colorama: http://pypi.python.org/pypi/colorama/0.2.4
+
+Bugs
+====
+
+Bugs or suggestions? Visit the `issue tracker`_.
+
+.. _`issue tracker`: https://github.com/erikrose/blessings/issues/
+
+Blessings tests are run automatically by `Travis CI`_.
+
+.. _`Travis CI`: https://travis-ci.org/erikrose/blessings/
+
+.. image:: https://secure.travis-ci.org/erikrose/blessings.png
+
+
+License
+=======
+
+Blessings is under the MIT License. See the LICENSE file.
+
+Version History
+===============
+
+1.6.1
+  * Don't crash if ``number_of_colors()`` is called when run in a non-terminal
+    or when ``does_styling`` is otherwise false.
+
+1.6
+  * Add ``does_styling`` property. This takes ``force_styling`` into account
+    and should replace most uses of ``is_a_tty``.
+  * Make ``is_a_tty`` a read-only property, like ``does_styling``. Writing to
+    it never would have done anything constructive.
+  * Add ``fullscreen()`` and ``hidden_cursor()`` to the auto-generated docs.
+  * Fall back to ``LINES`` and ``COLUMNS`` environment vars to find height and
+    width. (jquast)
+  * Support terminal types, such as kermit and avatar, that use bytes 127-255
+    in their escape sequences. (jquast)
+
+1.5.1
+  * Clean up fabfile, removing the redundant ``test`` command.
+  * Add Travis support.
+  * Make ``python setup.py test`` work without spurious errors on 2.6.
+  * Work around a tox parsing bug in its config file.
+  * Make context managers clean up after themselves even if there's an
+    exception. (Vitja Makarov)
+  * Parametrizing a capability no longer crashes when there is no tty. (Vitja
+    Makarov)
+
+1.5
+  * Add syntactic sugar and documentation for ``enter_fullscreen`` and
+    ``exit_fullscreen``.
+  * Add context managers ``fullscreen()`` and ``hidden_cursor()``.
+  * Now you can force a ``Terminal`` never to emit styles by passing
+    ``force_styling=None``.
+
+1.4
+  * Add syntactic sugar for cursor visibility control and single-space-movement
+    capabilities.
+  * Endorse the ``location()`` idiom for restoring cursor position after a
+    series of manual movements.
+  * Fix a bug in which ``location()`` wouldn't do anything when passed zeroes.
+  * Allow tests to be run with ``python setup.py test``.
+
+1.3
+  * Added ``number_of_colors``, which tells you how many colors the terminal
+    supports.
+  * Made ``color(n)`` and ``on_color(n)`` callable to wrap a string, like the
+    named colors can. Also, make them both fall back to the ``setf`` and
+    ``setb`` capabilities (like the named colors do) if the ANSI ``setaf`` and
+    ``setab`` aren't available.
+  * Allowed ``color`` attr to act as an unparametrized string, not just a
+    callable.
+  * Made ``height`` and ``width`` examine any passed-in stream before falling
+    back to stdout. (This rarely if ever affects actual behavior; it's mostly
+    philosophical.)
+  * Made caching simpler and slightly more efficient.
+  * Got rid of a reference cycle between Terminals and FormattingStrings.
+  * Updated docs to reflect that terminal addressing (as in ``location()``) is
+    0-based.
+
+1.2
+  * Added support for Python 3! We need 3.2.3 or greater, because the curses
+    library couldn't decide whether to accept strs or bytes before that
+    (http://bugs.python.org/issue10570).
+  * Everything that comes out of the library is now unicode. This lets us
+    support Python 3 without making a mess of the code, and Python 2 should
+    continue to work unless you were testing types (and badly). Please file a
+    bug if this causes trouble for you.
+  * Changed to the MIT License for better world domination.
+  * Added Sphinx docs.
+
+1.1
+  * Added nicely named attributes for colors.
+  * Introduced compound formatting.
+  * Added wrapper behavior for styling and colors.
+  * Let you force capabilities to be non-empty, even if the output stream is
+    not a terminal.
+  * Added the ``is_a_tty`` attribute for telling whether the output stream is a
+    terminal.
+  * Sugared the remaining interesting string capabilities.
+  * Let ``location()`` operate on just an x *or* y coordinate.
+
+1.0
+  * Extracted Blessings from nose-progressive, my `progress-bar-having,
+    traceback-shortcutting, rootin', tootin' testrunner`_. It provided the
+    tootin' functionality.
+
+.. _`progress-bar-having, traceback-shortcutting, rootin', tootin' testrunner`: http://pypi.python.org/pypi/nose-progressive/
new file mode 100644
--- /dev/null
+++ b/third_party/python/blessings/setup.cfg
@@ -0,0 +1,4 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/blessings/setup.py
@@ -0,0 +1,50 @@
+import sys
+
+# Prevent spurious errors during `python setup.py test`, a la
+# http://www.eby-sarna.com/pipermail/peak/2010-May/003357.html:
+try:
+    import multiprocessing
+except ImportError:
+    pass
+
+from setuptools import setup, find_packages
+
+
+extra_setup = {}
+if sys.version_info >= (3,):
+    extra_setup['use_2to3'] = True
+
+setup(
+    name='blessings',
+    version='1.6.1',
+    description='A thin, practical wrapper around terminal coloring, styling, and positioning',
+    long_description=open('README.rst').read(),
+    author='Erik Rose',
+    author_email='erikrose@grinchcentral.com',
+    license='MIT',
+    packages=find_packages(exclude=['ez_setup']),
+    tests_require=['nose'],
+    test_suite='nose.collector',
+    url='https://github.com/erikrose/blessings',
+    include_package_data=True,
+    classifiers=[
+        'Intended Audience :: Developers',
+        'Natural Language :: English',
+        'Development Status :: 5 - Production/Stable',
+        'Environment :: Console',
+        'Environment :: Console :: Curses',
+        'License :: OSI Approved :: MIT License',
+        'Operating System :: POSIX',
+        'Programming Language :: Python :: 2',
+        'Programming Language :: Python :: 2.5',
+        'Programming Language :: Python :: 2.6',
+        'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: 3',
+        'Programming Language :: Python :: 3.2',
+        'Topic :: Software Development :: Libraries',
+        'Topic :: Software Development :: User Interfaces',
+        'Topic :: Terminals'
+        ],
+    keywords=['terminal', 'tty', 'curses', 'ncurses', 'formatting', 'style', 'color', 'console'],
+    **extra_setup
+)
new file mode 100644
--- /dev/null
+++ b/third_party/python/blessings/tox.ini
@@ -0,0 +1,8 @@
+[tox]
+envlist = py26, py27, py33, py36
+
+[testenv]
+commands = nosetests blessings
+deps = nose
+# So Python 3 runs don't pick up incompatible, un-2to3'd source from the cwd:
+changedir = .tox
\ No newline at end of file