Cmds.py: Run all commands in asyncio event loop

This commit makee Cmds run all sub-commands in an asyncio event loop.
The event loop is currently passed to the commands, which seems
unnecessary and looks like it's using a feature which is bound to be
deprecated in the future.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2019-10-28 13:12:18 +01:00
commit 6123a68195

View file

@ -1,15 +1,16 @@
import os
import sys
import argparse
import jwutils
import importlib
import inspect
import re
import pickle
import asyncio
import jwutils
class Cmds: # export
def __init__(self, description = '', filter = '^Cmd.*', modules=None):
def __init__(self, description = '', filter = '^Cmd.*', modules=None, eloop=None):
self.__description = description
self.__filter = filter
self.__modules = modules
@ -17,6 +18,11 @@ class Cmds: # export
formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=self.__description)
self.__parser.add_argument('--log-flags', help='Log flags', default='stderr,position,prio,color')
self.__parser.add_argument('--log-level', help='Log level', default=jwutils.log.NOTICE)
self.eloop = eloop
self.__own_eloop = False
if eloop is None:
self.eloop = asyncio.get_event_loop()
self.__own_eloop = True
subparsers = self.__parser.add_subparsers(title='Available commands', metavar='')
if self.__modules == None:
self.__modules = [ '__main__' ]
@ -28,17 +34,31 @@ class Cmds: # export
continue
if inspect.isabstract(c):
continue
c().add_parser(subparsers)
cmd = c()
cmd.cmds = self
cmd.add_parser(subparsers)
async def __run(self):
#def __run(self):
args = self.__parser.parse_args()
jwutils.log.set_level(args.log_level)
jwutils.log.set_flags(args.log_flags)
return await args.func(args)
def __del__(self):
if self.__own_eloop:
if self.eloop is not None:
self.eloop.close()
self.eloop = None
self.__own_eloop = False
def parser():
return self.__parser
def run(self):
args = self.__parser.parse_args()
jwutils.log.set_level(args.log_level)
jwutils.log.set_flags(args.log_flags)
args.func(args)
#return self.__run()
return self.eloop.run_until_complete(self.__run())
def run_sub_commands(description = '', filter = '^Cmd.*', modules=None): # export
cmds = Cmds(description, filter, modules)
cmds.run()
return cmds.run()