1+ from os import path
2+
13from code42cli import MAIN_COMMAND
24from code42cli .main import MainSubcommandLoader
5+ from code42cli .tree_nodes import ArgNode
6+ from code42cli .util import get_files_in_path
37
48
59def _get_matches (current , options ):
@@ -11,46 +15,67 @@ def _get_matches(current, options):
1115 return matches
1216
1317
14- def _get_next_full_set_of_commands (cmd_loader , current ):
15- cmd_loader = cmd_loader .subtrees [current ]
16- return cmd_loader .names
18+ def _get_next_full_set_of_options (node , current ):
19+ node = node [current ]
20+ names = list (node .names )
21+ if _can_complete_with_local_files (current , node ):
22+ files = get_files_in_path ("" )
23+ names .extend (files )
24+ return names
25+
26+
27+ def _can_complete_with_local_files (current , node ):
28+ return isinstance (node , ArgNode ) and (not current or current [0 ] != u"-" )
1729
1830
1931class Completer (object ):
2032 def __init__ (self , main_cmd_loader = None ):
21- self ._main_cmd_loader = main_cmd_loader or MainSubcommandLoader (u"" )
33+ self ._main_cmd_loader = main_cmd_loader or MainSubcommandLoader ()
2234
2335 def complete (self , cmdline , point = None ):
2436 try :
2537 point = point or len (cmdline )
2638 args = cmdline [0 :point ].split ()
39+ # Complete with main commands if `code42` is typed out.
40+ # Note that the command `code42` should complete on its own.
2741 if len (args ) < 2 :
28- # `code42` already completes w/o
2942 return self ._main_cmd_loader .names if args [0 ] == MAIN_COMMAND else []
3043
3144 current = args [- 1 ]
32- cmd_loader = self ._search_trees (args )
33- if not cmd_loader :
34- return []
45+ search_results , options = self ._get_completion_options (args )
3546
36- options = cmd_loader . names
47+ # Complete with full set of arg/command options
3748 if current in options :
38- # `current` is already complete
39- return _get_next_full_set_of_commands (cmd_loader , current )
49+ return _get_next_full_set_of_options (search_results , current )
50+
51+ if _can_complete_with_local_files (current , search_results ):
52+ files = get_files_in_path (current )
53+ if current [0 ] == "~" :
54+ replace = path .expanduser ("~" )
55+ files = [f .replace (replace , "~" ) for f in files ]
56+ options .extend (files )
4057
4158 return _get_matches (current , options ) if options else []
4259 except :
4360 return []
4461
4562 def _search_trees (self , args ):
4663 # Find cmd_loader at lowest level from given args
47- cmd_loader = self ._main_cmd_loader
64+ node = self ._main_cmd_loader . get_node ()
4865 if len (args ) > 2 :
4966 for arg in args [1 :- 1 ]:
50- cmd_loader = cmd_loader .subtrees [arg ]
51- return cmd_loader
67+ next_node = node [arg ]
68+ if next_node :
69+ node = next_node
70+ else :
71+ return node
72+ return node
73+
74+ def _get_completion_options (self , args ):
75+ search_results = self ._search_trees (args )
76+ return search_results , search_results .names
5277
5378
5479def complete (cmdline , point ):
55- choices = Completer ().complete (cmdline , point )
80+ choices = Completer ().complete (cmdline , point ) or []
5681 print (u" \n " .join (choices ))
0 commit comments