Source code for crossbar.shell.idl.generator
###############################################################################
#
# Crossbar.io Shell
# Copyright (c) typedef int GmbH. Licensed under EUPLv1.2.
#
###############################################################################
import argparse
import json
import os
import pprint
import docutils
import jinja2
from jinja2 import Environment, FileSystemLoader
from crossbar.shell.util import hl
[docs]
def rst_filter(rst):
html = docutils.core.publish_parts(source=rst, writer_name="html")["html_body"]
return jinja2.Markup(html)
[docs]
def process(schema, template_paths=["templates", "tests/idl"]):
# http://jinja.pocoo.org/docs/latest/api/#loaders
loader = FileSystemLoader(template_paths, encoding="utf-8", followlinks=False)
env = Environment(loader=loader, autoescape=True)
env.filters["rst"] = rst_filter
tmpl = env.get_template("service.py")
print(tmpl)
contents = tmpl.render(schema=schema)
print(contents)
if __name__ == "__main__":
[docs]
parser = argparse.ArgumentParser()
parser.add_argument("infile", help="FlatBuffers JSON schema input file (.json)")
parser.add_argument("-t", "--templates", help="Templates folder")
parser.add_argument("-v", "--verbose", action="store_true", help="Enable verbose processing output.")
parser.add_argument("-d", "--debug", action="store_true", help="Enable debug output.")
options = parser.parse_args()
import txaio
txaio.use_twisted()
log = txaio.make_logger()
txaio.start_logging(level="debug" if options.debug else "info")
infile_path = os.path.abspath(options.infile)
with open(infile_path, "rb") as f:
buf = f.read()
log.info("Loading FlatBuffers JSON schema ({} bytes) ...".format(len(buf)))
try:
schema = json.loads(buf, encoding="utf8")
except Exception as e:
log.error(e)
if options.verbose:
log.info("Schema metadata:")
schema_meta_str = pprint.pformat(schema["meta"])
# log.info(schema_meta_str)
# log.info('{}'.format(schema_meta_str))
print(schema_meta_str)
for o in schema["types"].values():
if o["type"] == "interface":
log.info("interface: {}".format(hl(o["name"], bold=True)))
for s in o["slots"].values():
log.info("{:>12}: {}".format(s["type"], hl(s["name"])))
process(schema)