Skip to content

Commit 84f13af

Browse files
committed
Automatically setup argcomplete
1 parent b682355 commit 84f13af

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

flask_script/__init__.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@
2525
argparse._CountAction)
2626

2727

28+
try:
29+
import argcomplete
30+
ARGCOMLETE_IMPORTED = True
31+
except ImportError:
32+
ARGCOMLETE_IMPORTED = False
33+
34+
2835
class Manager(object):
2936
"""
3037
Controller class for handling a set of commands.
@@ -52,9 +59,12 @@ def run(self):
5259
:param app: Flask instance or callable returning a Flask instance.
5360
:param with_default_commands: load commands **runserver** and **shell**
5461
by default.
62+
:param disable_argcomplete: disable automatic loading of argcomplete.
63+
5564
"""
5665

57-
def __init__(self, app=None, with_default_commands=None, usage=None):
66+
def __init__(self, app=None, with_default_commands=None, usage=None,
67+
disable_argcomplete=False):
5868

5969
self.app = app
6070

@@ -67,6 +77,7 @@ def __init__(self, app=None, with_default_commands=None, usage=None):
6777
self.add_default_commands()
6878

6979
self.usage = self.description = usage
80+
self.disable_argcomplete = disable_argcomplete
7081

7182
self.parent = None
7283

@@ -135,27 +146,31 @@ def create_parser(self, prog, parents=None):
135146
for option in self.get_options():
136147
option_parser.add_argument(*option.args, **option.kwargs)
137148

138-
if parents is None:
139-
parents = [option_parser]
149+
parser_parents = [option_parser] if parents is None else parents
140150

141151
def _create_command(item):
142152
name, command = item
143153
description = getattr(command, 'description',
144154
command.__doc__)
145155
return name, command, description, \
146-
command.create_parser(name, parents=parents)
156+
command.create_parser(name, parents=parser_parents)
147157

148158
commands = map(_create_command, self._commands.iteritems())
149159

150160
parser = argparse.ArgumentParser(prog=prog, usage=self.usage,
151-
parents=parents)
152-
153-
#parser.set_defaults(func_handle=self._handle)
161+
parents=parser_parents)
154162

155163
subparsers = parser.add_subparsers()
156164
for name, command, description, parent in commands:
157165
subparsers.add_parser(name, usage=description, help=description,
158166
parents=[parent], add_help=False)
167+
168+
## enable autocomplete only for parent parser when argcomplete is
169+
## imported and it is NOT disabled in constructor
170+
if parents is None and ARGCOMLETE_IMPORTED \
171+
and not self.disable_argcomplete:
172+
argcomplete.autocomplete(parser, always_complete_options=True)
173+
159174
return parser
160175

161176
def get_options(self):
@@ -365,6 +380,7 @@ def handle(self, prog, args=None):
365380
positional_args = []
366381

367382
app = self.create_app(**app_config)
383+
368384
return handle(app, *positional_args, **kwargs)
369385

370386
def run(self, commands=None, default_command=None):

0 commit comments

Comments
 (0)