From a90431e9b486ba92c2c7db1e3428e94257519bae Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 25 Jan 2014 22:32:53 +0100 Subject: [PATCH 1/2] tests: Make sure the help message is printed if no command is given --- tests.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests.py b/tests.py index 0ea54ec..af7c8ef 100644 --- a/tests.py +++ b/tests.py @@ -473,12 +473,15 @@ def test_run_not_existing(self, capsys): assert code == 2 assert 'OK' not in out - def test_run_no_name(self): + def test_run_no_name(self, capsys): manager = Manager(self.app) + manager.add_command('simple', SimpleCommand()) code = run('manage.py', lambda: manager.run()) + out, err = capsys.readouterr() assert code == 2 + assert 'simple command' in out def test_run_good_options(self, capsys): From 84e9568cfa234ec1ce7ce72b5c74c4fd216bbfb9 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 26 Jan 2014 00:02:34 +0100 Subject: [PATCH 2/2] Show full help for submanagers if called without arguments --- flask_script/__init__.py | 24 ++++++++++++++++++++---- tests.py | 5 ++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/flask_script/__init__.py b/flask_script/__init__.py index 182b5c6..5a08aea 100644 --- a/flask_script/__init__.py +++ b/flask_script/__init__.py @@ -4,6 +4,7 @@ import os import re import sys +import types import inspect import warnings @@ -156,6 +157,8 @@ def create_parser(self, prog, parents=None): description=self.description, parents=[options_parser]) + self._patch_argparser(parser) + subparsers = parser.add_subparsers() for name, command in self._commands.items(): @@ -174,6 +177,8 @@ def create_parser(self, prog, parents=None): description=description, parents=[command_parser], add_help=False) + if isinstance(command, Manager): + self._patch_argparser(subparser) ## enable autocomplete only for parent parser when argcomplete is ## imported and it is NOT disabled in constructor @@ -186,6 +191,21 @@ def create_parser(self, prog, parents=None): # def foo(self, app, *args, **kwargs): # print(args) + def _patch_argparser(self, parser): + """ + Patches the parser to print the full help if no arguments are supplied + """ + + def _parse_known_args(self, arg_strings, *args, **kw): + if not arg_strings: + self.print_help() + self.exit(2) + + return self._parse_known_args2(arg_strings, *args, **kw) + + parser._parse_known_args2 = parser._parse_known_args + parser._parse_known_args = types.MethodType(_parse_known_args, parser) + def get_options(self): if self.parent: return self.parent._options @@ -341,10 +361,6 @@ def handle(self, prog, args=None): app_parser = self.create_parser(prog) - if args is None or len(args) == 0: - app_parser.print_help() - return 2 - args = list(args or []) app_namespace, remaining_args = app_parser.parse_known_args(args) diff --git a/tests.py b/tests.py index af7c8ef..92a1c10 100644 --- a/tests.py +++ b/tests.py @@ -718,7 +718,10 @@ def test_submanager_usage_and_help_and_description(self, capsys): code = run('manage.py sub_manager', lambda: manager.run()) out, err = capsys.readouterr() assert code == 2 - assert 'too few arguments' in err + assert 'sub_manager [--foo]' in out + assert 'shorter desc for submanager' not in out + assert 'longer desc for submanager' in out + assert 'simple command' in out code = run('manage.py sub_manager -h', lambda: manager.run()) out, err = capsys.readouterr()