From 6b6a2d47e061be5086c41eb0dbadb13b1abc5ea4 Mon Sep 17 00:00:00 2001 From: "Maxime Alves LIRMM@home" Date: Sun, 13 Jun 2021 18:30:06 +0200 Subject: [PATCH] [cli] `halfapi route update`, creates the router tree --- halfapi/cli/route.py | 86 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/halfapi/cli/route.py b/halfapi/cli/route.py index 9a8f0b4..508cee3 100644 --- a/halfapi/cli/route.py +++ b/halfapi/cli/route.py @@ -9,14 +9,17 @@ from half_orm.model import Model from .cli import cli from halfapi.lib.domain import VERBS - -def get_package_module(name): +def get_package_name(): hop_conf_path = os.path.join('.hop', 'config') config = ConfigParser() config.read([ hop_conf_path ]) assert os.path.isdir(config.get('halfORM', 'package_name')) - package_name = config.get('halfORM', 'package_name') + return config.get('halfORM', 'package_name') + + +def get_package_module(name): + package_name = get_package_name() if sys.path[0] != '.': sys.path.insert(0, '.') @@ -65,7 +68,7 @@ def endpoint_create(verb, endpoint, endpoint_type): EndpointType = EndpointType_mod.EndpointType EndpointType.create(endpoint_type) - return endpoint_create(package_name, verb, endpoint, endpoint_type) + return endpoint_create(verb, endpoint, endpoint_type) @click.option('--type', prompt=True, type=str, default='JSON') @@ -93,3 +96,78 @@ def list(): for endpoint in Endpoint().select(): elt = Endpoint(**endpoint) click.echo(f'{elt.method}: {elt.path}') + + +@click.option('--target', default='./Lib/api', type=str) +@route.command() +def update(target): + """ + The "halfapi route update" command for hop projects + + Creates the router tree under , and add missing methods + for endpoints, that raise NotImplementedError + """ + from time import sleep + + package = get_package_name() + target_path = os.path.join(os.path.abspath('.'), package, target) + + if not os.path.isdir(target_path): + raise Exception('Missing target path {}'.format(target_path)) + + click.echo('Will create router tree in {}'.format(target_path)) + proceed = click.prompt( + 'Proceed? [Y/n]', + default='y', + type=click.Choice(['Y', 'n'], case_sensitive=False) + ) + + if proceed.lower() == 'n': + sys.exit() + + Endpoint_mod = get_package_module('endpoint') + Endpoint = Endpoint_mod.Endpoint + + missing_methods = {} + + for endpoint in Endpoint().select(): + elt = Endpoint(**endpoint) + path = elt.path + stack = [target_path] + + for segment in path.split('/'): + stack.append(segment) + if os.path.isdir(os.path.join(*stack)): + continue + + print(f'Create {os.path.join(*stack)}') + os.mkdir(os.path.join(*stack)) + sleep(.1) + + endpoint_mod_path = '.'.join([package, *target.split('/')[1:], *path.split('/')[1:]]) + try: + endpoint_mod = importlib.import_module(endpoint_mod_path) + if not hasattr(endpoint_mod, str(elt.method)): + if endpoint_mod.__path__[0] not in missing_methods: + missing_methods[endpoint_mod.__path__[0]] = [] + + missing_methods[endpoint_mod.__path__[0]].append(str(elt.method)) + + except Exception as exc: + print(f'Could not import {endpoint_mod_path}, may be a bug') + print(exc) + endpoint_mod_path = endpoint_mod_path.replace('.', '/') + if endpoint_mod_path not in missing_methods: + missing_methods[endpoint_mod_path] = [] + + missing_methods[endpoint_mod_path].append(str(elt.method)) + + pass + + + for path, methods in missing_methods.items(): + with open(os.path.join(path, '__init__.py'), 'a+') as f: + for method in methods: + f.write('\n'.join(( + f'def {method}():', + ' raise NotImplementedError\n')))