Source code for riaps.gen.gen

import sys
import os
import argparse
import shutil
import json
from riaps.gen.target.cpp import cppgen, sync_cpp
from riaps.gen.target.python import pygen, sync_python
from riaps.gen.target.capnp import capnpgen, sync_capnp

from multigen.jinja import JinjaTask, JinjaGenerator

[docs]def preprocess(model): items={ "appname" : model['name'], "py" : [], "cpp" : [], "messages" : [m['name'] for m in model['messages']] } cppspec = ['c++', 'cpp', 'C++'] for part in ['components', 'devices']: for comp_name, comp_params in model[part].items(): newitem = comp_params newitem['is_device'] = (part == 'devices') newitem['appname'] = model['name'] if comp_params['language'] in cppspec : items['cpp'].append(newitem) else: items['py'].append(newitem) return items
[docs]def main(): if sys.version_info[0] < 3 or sys.version_info[0] == 3 and sys.version_info[1]<6: print("riaps_gen requires python3.6 or above") model = {} parser = argparse.ArgumentParser() output_dir = "" parser.add_argument("-m", "--model", help="Model file path.",required=True) parser.add_argument("-o", "--output", help="Output directory. Default is the directory of the model file.") parser.add_argument("-w", "--overwrite", help="Overwrite the existing code.", action="store_true") args = parser.parse_args() # Load json model try: fp = open(args.model, 'r') model = json.load(fp) except IOError as e: print("I/O error({0}): {1} {2}".format(e.errno, e.strerror, e.filename)) os._exit(1) except: print("Unexpected error:", sys.exc_info()[0]) os._exit(1) model = preprocess(model) # If the output dir is not specified, the output is generated into the {json file dir}/generated if args.output: output_dir = args.output else: output_dir = os.path.join(os.path.abspath(os.path.dirname(args.model)), "generated") if output_dir == "./" or output_dir == ".": output_dir = os.path.dirname(os.path.abspath(args.model)) # Backup the source to keep implementation parts if not args.overwrite: backup_dir = f"{output_dir}_bak" if os.path.isdir(backup_dir): shutil.rmtree(backup_dir) if os.path.isdir(output_dir): shutil.copytree(output_dir, backup_dir) if model['cpp']: gen = cppgen.CompGenerator() gen.generate(model, output_dir) if not args.overwrite: sync = sync_cpp.FileSync(model['cpp']) sync.sync_all(output_dir) if model['py']: gen = pygen.CompGenerator() gen.generate(model, output_dir) if not args.overwrite: sync = sync_python.FileSync(model['py']) sync.sync_code(output_dir) # always generate capnp gen = capnpgen.CapnpGenerator(model['cpp'], output_dir) gen.generate(model, output_dir) if not args.overwrite: sync = sync_capnp.FileSync(model) sync.sync_capnp(output_dir)
if __name__ == '__main__': main()