mayureshagashe2105's picture
Add logger to CLI
aa7111b
raw
history blame contribute delete
4.02 kB
import argparse
import json
from typing import Dict, List, Optional, Any, Callable
import importlib.resources
import techdocs
from .dtypes import data_types
from .utils.functools import *
from .utils.parse import *
parser = argparse.ArgumentParser(
description='Code documentation generation',
epilog="Thanks for using Techdocs")
parser.add_argument('--version', action='version', version=f'{techdocs.__version__}')
subparsers = parser.add_subparsers(help='subcommands')
def depends_login(func: Callable):
def update_config(cls: Any, config: Dict[str, Any]):
data = {
"username":config['username'],
"password":config['password']
}
config.update({"access_token":get_access_token(data)})
return func(cls, config)
return update_config
class _SubCommand:
def __init__(self, name: str, help: str, args_parse: Optional[List[Dict[str, Any]]] = None, pre_compile: bool = False):
self.name = name
self.parser = subparsers.add_parser(name, help=help)
self.parser.set_defaults(subcommand=name)
self.pre_compile = pre_compile
if args_parse and pre_compile:
self.build(args_parse)
else:
self.arg_parse = args_parse
def _run(self):
raise NotImplementedError()
def build(self, args_parse: Optional[List[Dict[str, Any]]] = None):
if not args_parse:
args_parse = self.arg_parse
if not isinstance(args_parse, list):
args_parse = list(args_parse)
for args_sig in args_parse:
args_sig['kwargs']['type'] = data_types[args_sig['kwargs']['type']]
self.parser.add_argument(*args_sig['args'], **args_sig['kwargs'])
@property
def bind(self):
raise PermissionError('Property bind is not allowed to be accessed')
@bind.setter
def bind(self, func: Callable):
self._run = func
self.parser.set_defaults(ops=self._run)
class Ops:
sub_commands: Dict[str, _SubCommand] = {}
with importlib.resources.open_text('techdocs.signatures', 'subcommand_signatures.json') as f:
encoded_sub_commands = json.load(f)
if encoded_sub_commands['dynamic signatures']:
sub_commands.update({sub_command['name']: _SubCommand(**sub_command, pre_compile=False)
for sub_command in encoded_sub_commands['dynamic signatures']
})
if encoded_sub_commands['pre-compiled signatures']:
sub_commands.update({sub_command['name']: _SubCommand(**sub_command, pre_compile=True)
for sub_command in encoded_sub_commands['pre-compiled signatures']
})
@classmethod
def configure_and_build_subcommand(cls, func):
config = None
try:
args = parser.parse_args()
sub_command = cls.sub_commands[args.subcommand]
if not sub_command.pre_compile:
sub_command.build()
sub_command.bind = cls.__getattribute__(cls(), args.subcommand)
func = sub_command.parser.get_default('ops')
config = {k: v for k, v in vars(args).items() if k not in ['subcommand', 'ops']}
except AttributeError as e:
config = True
def run_subcommand(**kwargs):
return func(config)
return run_subcommand
@classmethod
@depends_login
def generate(cls, config: Dict[str, Any]):
extract_functions_from_directory(config)
@classmethod
@depends_login
def apikey(cls, config: Dict[str, Any]):
issue_api_key(config)
@classmethod
def signup(cls, config: Dict[str, Any]):
signup(config)
@classmethod
def version(cls, config: Dict[str, Any]):
print(f"{techdocs.__version__}")