Skip to content
This repository has been archived by the owner on Mar 10, 2020. It is now read-only.

Show full help for submanagers if called without arguments #85

Merged
merged 2 commits into from Jan 27, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 20 additions & 4 deletions flask_script/__init__.py
Expand Up @@ -4,6 +4,7 @@
import os
import re
import sys
import types
import inspect
import warnings

Expand Down Expand Up @@ -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():
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)

Expand Down
10 changes: 8 additions & 2 deletions tests.py
Expand Up @@ -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):

Expand Down Expand Up @@ -715,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()
Expand Down