From e5fe171691411b75ea4828e299bdbac6c1c05d44 Mon Sep 17 00:00:00 2001 From: aviau Date: Wed, 19 Jul 2017 14:06:01 -0400 Subject: [PATCH] New upstream version 6.7 --- CHANGES | 11 ++ PKG-INFO | 2 +- click.egg-info/PKG-INFO | 2 +- click.egg-info/SOURCES.txt | 12 -- click/__init__.py | 2 +- click/_bashcomplete.py | 4 +- click/_compat.py | 12 +- click/_termui_impl.py | 2 +- click/_unicodefun.py | 5 +- click/core.py | 6 + click/testing.py | 2 +- .../printer_bold.egg-info/PKG-INFO | 10 -- .../printer_bold.egg-info/SOURCES.txt | 8 - .../dependency_links.txt | 1 - .../printer_bold.egg-info/entry_points.txt | 4 - .../printer_bold.egg-info/top_level.txt | 1 - examples/plugins/printer.egg-info/PKG-INFO | 10 -- examples/plugins/printer.egg-info/SOURCES.txt | 8 - .../printer.egg-info/dependency_links.txt | 1 - .../plugins/printer.egg-info/entry_points.txt | 4 - .../plugins/printer.egg-info/top_level.txt | 1 - examples/termui/build/lib/termui.py | 145 ------------------ .../dist/click_example_termui-1.0-py3.4.egg | Bin 4871 -> 0 bytes tests/test_bashcomplete.py | 44 +++++- tests/test_imports.py | 2 +- tests/test_testing.py | 19 +++ 26 files changed, 98 insertions(+), 220 deletions(-) delete mode 100644 examples/plugins/BrokenPlugin/printer_bold.egg-info/PKG-INFO delete mode 100644 examples/plugins/BrokenPlugin/printer_bold.egg-info/SOURCES.txt delete mode 100644 examples/plugins/BrokenPlugin/printer_bold.egg-info/dependency_links.txt delete mode 100644 examples/plugins/BrokenPlugin/printer_bold.egg-info/entry_points.txt delete mode 100644 examples/plugins/BrokenPlugin/printer_bold.egg-info/top_level.txt delete mode 100644 examples/plugins/printer.egg-info/PKG-INFO delete mode 100644 examples/plugins/printer.egg-info/SOURCES.txt delete mode 100644 examples/plugins/printer.egg-info/dependency_links.txt delete mode 100644 examples/plugins/printer.egg-info/entry_points.txt delete mode 100644 examples/plugins/printer.egg-info/top_level.txt delete mode 100644 examples/termui/build/lib/termui.py delete mode 100644 examples/termui/dist/click_example_termui-1.0-py3.4.egg diff --git a/CHANGES b/CHANGES index c76edbb..07b1694 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,17 @@ Click Changelog This contains all major version changes between Click releases. +Version 6.7 +----------- + +(bugfix release; released on January 6th 2017) + +- Make `click.progressbar` work with `codecs.open` files. See #637. +- Fix bug in bash completion with nested subcommands. See #639. +- Fix test runner not saving caller env correctly. See #644. +- Fix handling of SIGPIPE. See #626 +- Deal with broken Windows environments such as Google App Engine's. See #711. + Version 6.6 ----------- diff --git a/PKG-INFO b/PKG-INFO index d569270..bbb17b3 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: click -Version: 6.6 +Version: 6.7 Summary: A simple wrapper around optparse for powerful command line utilities. Home-page: http://github.com/mitsuhiko/click Author: Armin Ronacher diff --git a/click.egg-info/PKG-INFO b/click.egg-info/PKG-INFO index d569270..bbb17b3 100644 --- a/click.egg-info/PKG-INFO +++ b/click.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: click -Version: 6.6 +Version: 6.7 Summary: A simple wrapper around optparse for powerful command line utilities. Home-page: http://github.com/mitsuhiko/click Author: Armin Ronacher diff --git a/click.egg-info/SOURCES.txt b/click.egg-info/SOURCES.txt index e524cba..5eed434 100644 --- a/click.egg-info/SOURCES.txt +++ b/click.egg-info/SOURCES.txt @@ -87,24 +87,12 @@ examples/inout/setup.py examples/naval/README examples/naval/naval.py examples/naval/setup.py -examples/plugins/BrokenPlugin/printer_bold.egg-info/PKG-INFO -examples/plugins/BrokenPlugin/printer_bold.egg-info/SOURCES.txt -examples/plugins/BrokenPlugin/printer_bold.egg-info/dependency_links.txt -examples/plugins/BrokenPlugin/printer_bold.egg-info/entry_points.txt -examples/plugins/BrokenPlugin/printer_bold.egg-info/top_level.txt -examples/plugins/printer.egg-info/PKG-INFO -examples/plugins/printer.egg-info/SOURCES.txt -examples/plugins/printer.egg-info/dependency_links.txt -examples/plugins/printer.egg-info/entry_points.txt -examples/plugins/printer.egg-info/top_level.txt examples/repo/README examples/repo/repo.py examples/repo/setup.py examples/termui/README examples/termui/setup.py examples/termui/termui.py -examples/termui/build/lib/termui.py -examples/termui/dist/click_example_termui-1.0-py3.4.egg examples/validation/README examples/validation/setup.py examples/validation/validation.py diff --git a/click/__init__.py b/click/__init__.py index 3a7e3ee..971e55d 100644 --- a/click/__init__.py +++ b/click/__init__.py @@ -95,4 +95,4 @@ __all__ = [ disable_unicode_literals_warning = False -__version__ = '6.6' +__version__ = '6.7' diff --git a/click/_bashcomplete.py b/click/_bashcomplete.py index d97b66a..d9d26d2 100644 --- a/click/_bashcomplete.py +++ b/click/_bashcomplete.py @@ -30,8 +30,8 @@ def get_completion_script(prog_name, complete_var): def resolve_ctx(cli, prog_name, args): ctx = cli.make_context(prog_name, args, resilient_parsing=True) - while ctx.args + ctx.protected_args and isinstance(ctx.command, MultiCommand): - a = ctx.args + ctx.protected_args + while ctx.protected_args + ctx.args and isinstance(ctx.command, MultiCommand): + a = ctx.protected_args + ctx.args cmd = ctx.command.get_command(ctx, a[0]) if cmd is None: return None diff --git a/click/_compat.py b/click/_compat.py index 6bbebd3..2b43412 100644 --- a/click/_compat.py +++ b/click/_compat.py @@ -160,8 +160,16 @@ if PY2: # # This code also lives in _winconsole for the fallback to the console # emulation stream. - if WIN: + # + # There are also Windows environments where the `msvcrt` module is not + # available (which is why we use try-catch instead of the WIN variable + # here), such as the Google App Engine development server on Windows. In + # those cases there is just nothing we can do. + try: import msvcrt + except ImportError: + set_binary_mode = lambda x: x + else: def set_binary_mode(f): try: fileno = f.fileno() @@ -170,8 +178,6 @@ if PY2: else: msvcrt.setmode(fileno, os.O_BINARY) return f - else: - set_binary_mode = lambda x: x def isidentifier(x): return _identifier_re.search(x) is not None diff --git a/click/_termui_impl.py b/click/_termui_impl.py index a2c1eb0..7cfd3d5 100644 --- a/click/_termui_impl.py +++ b/click/_termui_impl.py @@ -31,7 +31,7 @@ def _length_hint(obj): """Returns the length hint of an object.""" try: return len(obj) - except TypeError: + except (AttributeError, TypeError): try: get_hint = type(obj).__length_hint__ except AttributeError: diff --git a/click/_unicodefun.py b/click/_unicodefun.py index 24b7031..9e17a38 100644 --- a/click/_unicodefun.py +++ b/click/_unicodefun.py @@ -114,6 +114,5 @@ def _verify_python3_env(): raise RuntimeError('Click will abort further execution because Python 3 ' 'was configured to use ASCII as encoding for the ' - 'environment. Either run this under Python 2 or ' - 'consult http://click.pocoo.org/python3/ for ' - 'mitigation steps.' + extra) + 'environment. Consult http://click.pocoo.org/python3/' + 'for mitigation steps.' + extra) diff --git a/click/core.py b/click/core.py index 33a527a..7456451 100644 --- a/click/core.py +++ b/click/core.py @@ -1,3 +1,4 @@ +import errno import os import sys from contextlib import contextmanager @@ -705,6 +706,11 @@ class BaseCommand(object): raise e.show() sys.exit(e.exit_code) + except IOError as e: + if e.errno == errno.EPIPE: + sys.exit(1) + else: + raise except Abort: if not standalone_mode: raise diff --git a/click/testing.py b/click/testing.py index d43581f..4416c77 100644 --- a/click/testing.py +++ b/click/testing.py @@ -213,7 +213,7 @@ class CliRunner(object): old_env = {} try: for key, value in iteritems(env): - old_env[key] = os.environ.get(value) + old_env[key] = os.environ.get(key) if value is None: try: del os.environ[key] diff --git a/examples/plugins/BrokenPlugin/printer_bold.egg-info/PKG-INFO b/examples/plugins/BrokenPlugin/printer_bold.egg-info/PKG-INFO deleted file mode 100644 index 97a4724..0000000 --- a/examples/plugins/BrokenPlugin/printer_bold.egg-info/PKG-INFO +++ /dev/null @@ -1,10 +0,0 @@ -Metadata-Version: 1.0 -Name: printer-bold -Version: 0.1dev0 -Summary: UNKNOWN -Home-page: UNKNOWN -Author: UNKNOWN -Author-email: UNKNOWN -License: UNKNOWN -Description: UNKNOWN -Platform: UNKNOWN diff --git a/examples/plugins/BrokenPlugin/printer_bold.egg-info/SOURCES.txt b/examples/plugins/BrokenPlugin/printer_bold.egg-info/SOURCES.txt deleted file mode 100644 index 34aba44..0000000 --- a/examples/plugins/BrokenPlugin/printer_bold.egg-info/SOURCES.txt +++ /dev/null @@ -1,8 +0,0 @@ -README.rst -printer_bold/__init__.py -printer_bold/core.py -printer_bold.egg-info/PKG-INFO -printer_bold.egg-info/SOURCES.txt -printer_bold.egg-info/dependency_links.txt -printer_bold.egg-info/entry_points.txt -printer_bold.egg-info/top_level.txt \ No newline at end of file diff --git a/examples/plugins/BrokenPlugin/printer_bold.egg-info/dependency_links.txt b/examples/plugins/BrokenPlugin/printer_bold.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/examples/plugins/BrokenPlugin/printer_bold.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/examples/plugins/BrokenPlugin/printer_bold.egg-info/entry_points.txt b/examples/plugins/BrokenPlugin/printer_bold.egg-info/entry_points.txt deleted file mode 100644 index 1635389..0000000 --- a/examples/plugins/BrokenPlugin/printer_bold.egg-info/entry_points.txt +++ /dev/null @@ -1,4 +0,0 @@ - - [printer.plugins] - bold=printer_bold.core:bolddddddddddd - \ No newline at end of file diff --git a/examples/plugins/BrokenPlugin/printer_bold.egg-info/top_level.txt b/examples/plugins/BrokenPlugin/printer_bold.egg-info/top_level.txt deleted file mode 100644 index be45b4b..0000000 --- a/examples/plugins/BrokenPlugin/printer_bold.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -printer_bold diff --git a/examples/plugins/printer.egg-info/PKG-INFO b/examples/plugins/printer.egg-info/PKG-INFO deleted file mode 100644 index 7f22902..0000000 --- a/examples/plugins/printer.egg-info/PKG-INFO +++ /dev/null @@ -1,10 +0,0 @@ -Metadata-Version: 1.0 -Name: printer -Version: 0.1dev0 -Summary: UNKNOWN -Home-page: UNKNOWN -Author: UNKNOWN -Author-email: UNKNOWN -License: UNKNOWN -Description: UNKNOWN -Platform: UNKNOWN diff --git a/examples/plugins/printer.egg-info/SOURCES.txt b/examples/plugins/printer.egg-info/SOURCES.txt deleted file mode 100644 index a1d305e..0000000 --- a/examples/plugins/printer.egg-info/SOURCES.txt +++ /dev/null @@ -1,8 +0,0 @@ -README.rst -printer/__init__.py -printer/cli.py -printer.egg-info/PKG-INFO -printer.egg-info/SOURCES.txt -printer.egg-info/dependency_links.txt -printer.egg-info/entry_points.txt -printer.egg-info/top_level.txt \ No newline at end of file diff --git a/examples/plugins/printer.egg-info/dependency_links.txt b/examples/plugins/printer.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/examples/plugins/printer.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/examples/plugins/printer.egg-info/entry_points.txt b/examples/plugins/printer.egg-info/entry_points.txt deleted file mode 100644 index f2e6982..0000000 --- a/examples/plugins/printer.egg-info/entry_points.txt +++ /dev/null @@ -1,4 +0,0 @@ - - [console_scripts] - printer=printer.cli:cli - \ No newline at end of file diff --git a/examples/plugins/printer.egg-info/top_level.txt b/examples/plugins/printer.egg-info/top_level.txt deleted file mode 100644 index 24b8a4f..0000000 --- a/examples/plugins/printer.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -printer diff --git a/examples/termui/build/lib/termui.py b/examples/termui/build/lib/termui.py deleted file mode 100644 index 007ac42..0000000 --- a/examples/termui/build/lib/termui.py +++ /dev/null @@ -1,145 +0,0 @@ -# coding: utf-8 -import click -import time -import random - -try: - range_type = xrange -except NameError: - range_type = range - - -@click.group() -def cli(): - """This script showcases different terminal UI helpers in Click.""" - pass - - -@cli.command() -def colordemo(): - """Demonstrates ANSI color support.""" - for color in 'red', 'green', 'blue': - click.echo(click.style('I am colored %s' % color, fg=color)) - click.echo(click.style('I am background colored %s' % color, bg=color)) - - -@cli.command() -def pager(): - """Demonstrates using the pager.""" - lines = [] - for x in range_type(200): - lines.append('%s. Hello World!' % click.style(str(x), fg='green')) - click.echo_via_pager('\n'.join(lines)) - - -@cli.command() -@click.option('--count', default=8000, type=click.IntRange(1, 100000), - help='The number of items to process.') -def progress(count): - """Demonstrates the progress bar.""" - items = range_type(count) - - def process_slowly(item): - time.sleep(0.002 * random.random()) - - def filter(items): - for item in items: - if random.random() > 0.3: - yield item - - with click.progressbar(items, label='Processing accounts', - fill_char=click.style('#', fg='green')) as bar: - for item in bar: - process_slowly(item) - - def show_item(item): - if item is not None: - return 'Item #%d' % item - - with click.progressbar(filter(items), label='Committing transaction', - fill_char=click.style('#', fg='yellow'), - item_show_func=show_item) as bar: - for item in bar: - process_slowly(item) - - with click.progressbar(length=count, label='Counting', - bar_template='%(label)s %(bar)s | %(info)s', - fill_char=click.style(u'█', fg='cyan'), - empty_char=' ') as bar: - for item in bar: - process_slowly(item) - - with click.progressbar(length=count, width=0, show_percent=False, - show_eta=False, - fill_char=click.style('#', fg='magenta')) as bar: - for item in bar: - process_slowly(item) - - -@cli.command() -@click.argument('url') -def open(url): - """Opens a file or URL In the default application.""" - click.launch(url) - - -@cli.command() -@click.argument('url') -def locate(url): - """Opens a file or URL In the default application.""" - click.launch(url, locate=True) - - -@cli.command() -def edit(): - """Opens an editor with some text in it.""" - MARKER = '# Everything below is ignored\n' - message = click.edit('\n\n' + MARKER) - if message is not None: - msg = message.split(MARKER, 1)[0].rstrip('\n') - if not msg: - click.echo('Empty message!') - else: - click.echo('Message:\n' + msg) - else: - click.echo('You did not enter anything!') - - -@cli.command() -def clear(): - """Clears the entire screen.""" - click.clear() - - -@cli.command() -def pause(): - """Waits for the user to press a button.""" - click.pause() - - -@cli.command() -def menu(): - """Shows a simple menu.""" - menu = 'main' - while 1: - if menu == 'main': - click.echo('Main menu:') - click.echo(' d: debug menu') - click.echo(' q: quit') - char = click.getchar() - if char == 'd': - menu = 'debug' - elif char == 'q': - menu = 'quit' - else: - click.echo('Invalid input') - elif menu == 'debug': - click.echo('Debug menu') - click.echo(' b: back') - char = click.getchar() - if char == 'b': - menu = 'main' - else: - click.echo('Invalid input') - elif menu == 'quit': - return diff --git a/examples/termui/dist/click_example_termui-1.0-py3.4.egg b/examples/termui/dist/click_example_termui-1.0-py3.4.egg deleted file mode 100644 index 4bb967cca1e816c75489a3779dfbcc83c0fe185f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4871 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 re^JC9rTAU%M``|~