importosimportshutilimportsubprocessimportsysdef_get_run_args(print_args:bool=True):fromjina.helperimportget_rich_consolefromjina.parsersimportget_main_parserconsole=get_rich_console()silent_print={'help','hub'}parser=get_main_parser()iflen(sys.argv)>1:fromargparseimport_StoreAction,_StoreTrueActionfromrichimportboxfromrich.tableimportTableargs,unknown=parser.parse_known_args()ifunknown:fromjina.helperimportwarn_unknown_argsunknown=list(filter(lambdax:x.startswith('--'),unknown))warn_unknown_args(unknown)ifargs.clinotinsilent_printandprint_args:fromjinaimport__resources_path__p=parser._actions[-1].choices[sys.argv[1]]default_args={a.dest:a.defaultforainp._actionsifisinstance(a,(_StoreAction,_StoreTrueAction))}withopen(os.path.join(__resources_path__,'jina.logo'))asfp:logo_str=fp.read()param_str=Table(title=' '.join(sys.argv),box=box.ROUNDED,highlight=True,title_justify='left',)param_str.add_column('Argument',justify='right')param_str.add_column('Value',justify='left')fork,vinsorted(vars(args).items()):param=k.replace('_','-')value=str(v)ifnotdefault_args.get(k,None)==v:value=f'[b]{value}[/]'param_str.add_row(param,value)if'JINA_LOG_NO_COLOR'notinos.environ:print(f'\n{logo_str}\n')console.print(param_str)returnargselse:parser.print_help()exit()def_quick_ac_lookup():fromcli.autocompleteimportac_tableiflen(sys.argv)>1:ifsys.argv[1]=='commands':forkinac_table['commands']:print(k)exit()elifsys.argv[1]=='completions':# search with the longest shared prefixforjinrange(len(sys.argv),2,-1):_input=' '.join(sys.argv[2:j]).strip()if_inputinac_table['completions']:compl=ac_table['completions'][_input]forkincompl:ifknotinsys.argv:print(k)breakexit()def_try_plugin_command():"""Tries to call the CLI of an external Jina project. :return: if the plugin has been found (locally or among the known plugins) """argv=sys.argviflen(argv)<2:# no command givenreturnFalsefromcli.autocompleteimportac_tableifargv[1]inac_table['commands']:# native command can't be plugin commandreturnFalsedef_cmd_exists(cmd):returnshutil.which(cmd)isnotNonesubcommand=argv[1]cmd='jina-'+subcommandif_cmd_exists(cmd):subprocess.run([cmd]+argv[2:])returnTruefromcli.known_pluginsimportplugin_infoifsubcommandinplugin_info:fromjina.helperimportget_rich_consolecmd_info=plugin_info[subcommand]project,package=cmd_info['display-name'],cmd_info['pip-package']console=get_rich_console()console.print(f"It seems like [yellow]{project}[/yellow] is not installed in your environment."f"To use it via the [green]'jina {subcommand}'[/green] command, "f"install it first: [green]'pip install {package}'[/green].")returnTruereturnFalse
[docs]defmain():"""The main entrypoint of the CLI"""classEnvVariableSet:def__init__(self,key,value):self.key=keyself.value=valueself.unset=Falsedef__enter__(self):ifself.keynotinos.environ:self.unset=Trueos.environ[self.key]=self.valuedef__exit__(self,exc_type,exc_val,exc_tb):ifself.unset:os.unsetenv(self.key)withEnvVariableSet('JINA_CHECK_VERSION','True'):found_plugin=_try_plugin_command()ifnotfound_plugin:_quick_ac_lookup()fromcliimportapiargs=_get_run_args()getattr(api,args.cli.replace('-','_'))(args)