From ca036acaf310c3952f6ff3d94dd78700b0339fdb Mon Sep 17 00:00:00 2001 From: Lorenzo Venerandi <68255980+Lore09@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:28:09 +0100 Subject: [PATCH] Code generation completed --- src/code_generator/generator.py | 18 +++++++-- src/code_generator/template_compiler.py | 54 ++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/code_generator/generator.py b/src/code_generator/generator.py index 2776828..ce4ccf6 100644 --- a/src/code_generator/generator.py +++ b/src/code_generator/generator.py @@ -18,7 +18,7 @@ def __remove_dir_if_exists(dir_path): if os.path.isdir(dir_path): shutil.rmtree(dir_path) -def generate(project_dir): +def generate(project_dir, registry_url): # Parsing del file di configurazione config = __parse_yaml(f"{project_dir}/workflow.yaml") @@ -36,5 +36,17 @@ def generate(project_dir): # for each task in the workflow for task in config['tasks']: - template_compiler.handle_task(task, output_dir) - \ No newline at end of file + + try: + + task['registry_url'] = registry_url + template_compiler.handle_task(task, output_dir) + + # Copy the code file to the output folder + shutil.copy2(f"{project_dir}/tasks/{task['code']}", f"{output_dir}/{task['component_name']}/{task['code']}") + + print(f" - Task {task['component_name']} generated") + + except Exception as e: + logging.error(f"Error generating task {task['component_name']}: {e}") + continue \ No newline at end of file diff --git a/src/code_generator/template_compiler.py b/src/code_generator/template_compiler.py index 4dfd1a5..18d795e 100644 --- a/src/code_generator/template_compiler.py +++ b/src/code_generator/template_compiler.py @@ -1,4 +1,7 @@ import logging +from jinja2 import FileSystemLoader, Environment +import os +import shutil def handle_task(task, output_dir): @@ -19,10 +22,57 @@ def handle_task(task, output_dir): pass def __generate_producer(task, output_dir): - pass + + # Copy the template folder to the output folder + __copytree("src/code_generator/templates/producer_nats", f"{output_dir}/{task['component_name']}") + + # Replace each file of the output dir with the template + for filename in os.listdir(f"{output_dir}/{task['component_name']}"): + + # Skip the following files + if filename in ['Dockerfile', 'go.mod', 'go.sum', 'tools.go']: + continue + + # Skip if it's a directory + if os.path.isdir(f"{output_dir}/{task['component_name']}/{filename}"): + continue + + __replace_file_with_template(filename, f"{output_dir}/{task['component_name']}", task) + def __generate_processor(task, output_dir): pass def __generate_dbsync(task, output_dir): - pass \ No newline at end of file + pass + +def __copytree(src, dst, symlinks=False, ignore=None): + + # Create the destination directory + os.makedirs(dst, exist_ok=True) + + # Copy the files + for item in os.listdir(src): + s = os.path.join(src, item) + d = os.path.join(dst, item) + if os.path.isdir(s): + shutil.copytree(s, d, symlinks, ignore) + else: + shutil.copy2(s, d) + +def __replace_file_with_template(filename, output_dir, template_vars): + + try: + templateLoader = FileSystemLoader(searchpath=output_dir) + templateEnv = Environment(loader=templateLoader) + template = templateEnv.get_template(filename) + + outputText = template.render(template_vars) + + # Replace the file with the rendered template + with open(f"{output_dir}/{filename}", 'w') as f: + f.write(outputText) + + except Exception as e: + logging.error(f"Error rendering template {filename}: {e}") + return \ No newline at end of file