Source code for argus_api.helpers.generator

from os import mkdir
from os.path import join, exists, sep
from re import sub

from argus_api.helpers.log import log

[docs]def write_endpoints_to_disk(endpoints, output, with_plugin_decorators=False) -> None: """Outputs the directory structure with all endpoints :param list endpoints: List of endpoints generated with build_endpoint_structure """ EMPTY_INIT_FILE = "" log.info("Generating static API files to %s" % output) def find(key, dictionary): """Finds all occurances of a key in nested list """ for k, v in dictionary.items(): if k == key: yield v elif isinstance(v, dict): for result in find(key, v): yield result elif isinstance(v, list): for d in v: for result in find(key, d): yield result endpoints = [endpoint for endpoint in find("__METADATA__", endpoints)] def create_python_module(path): if not exists(join(*path)): mkdir(join(*path)) with open(join(*(path + ["__init__.py"])), "w") as init: init.write(EMPTY_INIT_FILE) for endpoint in endpoints: path = [sep] + output.split(sep) # Create directory tree if not exists(join(*path)): mkdir(join(*path)) with open(join(*(path + ["__init__.py"])), "w") as init: from time import time init.write(EMPTY_INIT_FILE + "\n__CREATED_AT__ = %f" % time()) for directory in endpoint["__PATH__"]: path.append(directory) # Write file if directory == endpoint["__PATH__"][-1]: log.info("Generating endpoint: %s" % "/".join(endpoint["__PATH__"][:-1])) with open(join(*(path[:-1] + ["%s.py" % endpoint["__MODULE_NAME__"]])), "w+") as endpoint_file: method_names = [] endpoint_request_methods = [] # Never print the same method twice for method in endpoint["__REQUEST_METHODS__"]: if method.name not in method_names: endpoint_request_methods.append(method) method_names.append(method.name) # Write endpoint templates to file, and decorate them # with the plugin command registration decorator if with_plugin_decorators=True endpoint_file.write( "\n".join( ['"""Autogenerated API"""'] + ["import requests"] + ["from argus_cli.plugin import register_command"] + [""] + [""] + [ ("@register_command(extending=({path}))".format( path="'%s'" % "','".join(endpoint["__PATH__"]) ) if with_plugin_decorators else "") + request_method.to_template for request_method in endpoint_request_methods ]) ) log.info("Generating test helpers for endpoint: %s" % "/".join(endpoint["__PATH__"][:-1])) # Create a directory for test decorators create_python_module(path[:-1] + ["test_helpers"]) create_python_module(path[:-1] + ["test_helpers", endpoint["__MODULE_NAME__"]]) for request_method in endpoint["__REQUEST_METHODS__"]: test_helper_path = path[:-1] + ["test_helpers", endpoint["__MODULE_NAME__"], "%s.py" % request_method.name] # create_python_module(test_helper_path) with open(join(*test_helper_path), "w") as test_helper: test_helper.write( '\n'.join( [ request_method.decorator_template(200), request_method.decorator_template(401), request_method.decorator_template(403), request_method.decorator_template(404), ]) ) else: # Create directory tree create_python_module(path)