Source code for ebonite.client.autogen

from typing import List

import ebonite.client.base
from ebonite import Ebonite
from ebonite.client.expose import ExposedMethod, get_exposed_method
from ebonite.core.objects import Image, Model, Pipeline, Project, RuntimeEnvironment, RuntimeInstance, Task
from ebonite.repository.metadata.base import MetadataRepository

AUTOGEN_CLASSES = {
    MetadataRepository: '#  ########## AUTOGEN META END #',
    Project: '#  ########## AUTOGEN PROJECT END #',
    Task: '#  ########## AUTOGEN TASK END #',
    Model: '#  ########## AUTOGEN MODEL END #',
    Pipeline: '#  ########## AUTOGEN PIPELINE END #',
    Image: '#  ########## AUTOGEN IMAGE END #',
    RuntimeInstance: '#  ########## AUTOGEN INSTANCE END #',
    RuntimeEnvironment: '#  ########## AUTOGEN ENVIRONMENT END #'
}

FILENAME = ebonite.client.base.__file__


[docs]def find_exposed_methods(base_class, new_only=True) -> List[ExposedMethod]: new_methods = [] for name in dir(base_class): if name.startswith('_'): continue value = getattr(base_class, name) exposed = get_exposed_method(value) if exposed is not None and (not new_only or exposed.name not in Ebonite.__dict__): new_methods.append(exposed) return new_methods
[docs]def patch(classes, filename, dry_run=True): anchors = {a: cls for cls, a in AUTOGEN_CLASSES.items() if cls in classes} code = [] with open(filename, 'r') as f: for line in f: strip = line.strip() if strip in anchors: base_class = anchors[strip] for exposed in find_exposed_methods(base_class): code.append(exposed.generate_code() + '\n\n') code.append(line) if dry_run: print(''.join(code)) else: with open(filename, 'w') as f: f.write(''.join(code))
[docs]def clear(filename, dry_run=True): code = [] is_autogen = False with open(filename, 'r') as f: for line in f: sline = line.strip() if sline.startswith('#') and 'AUTOGEN' in sline: if 'END' in sline: is_autogen = False else: is_autogen = True code.append(line + '\n') if not is_autogen: code.append(line) if dry_run: print(''.join(code)) else: with open(filename, 'w') as f: f.write(''.join(code))
[docs]def main(): dry_run = True # clear(FILENAME, dry_run) patch(AUTOGEN_CLASSES, FILENAME, dry_run)
if __name__ == '__main__': main()