Added export target to starter script. Allows export of typescript interfaces of backend models
This commit is contained in:
parent
c629f5abf3
commit
233660d452
|
@ -1,11 +1,14 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
import sys
|
import inspect
|
||||||
import argparse
|
import argparse
|
||||||
import bjoern
|
import bjoern
|
||||||
|
import sqlalchemy
|
||||||
|
from sqlalchemy.orm import RelationshipProperty, ColumnProperty
|
||||||
|
|
||||||
|
|
||||||
def install(arguments):
|
def install(arguments):
|
||||||
from flaschengeist.app import create_app, install_all
|
from flaschengeist.app import create_app, install_all
|
||||||
|
|
||||||
app = create_app()
|
app = create_app()
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
install_all()
|
install_all()
|
||||||
|
@ -13,6 +16,7 @@ def install(arguments):
|
||||||
|
|
||||||
def run(arguments):
|
def run(arguments):
|
||||||
from flaschengeist.app import create_app
|
from flaschengeist.app import create_app
|
||||||
|
|
||||||
app = create_app()
|
app = create_app()
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
if arguments.debug:
|
if arguments.debug:
|
||||||
|
@ -21,18 +25,69 @@ def run(arguments):
|
||||||
bjoern.run(app, arguments.host, arguments.port, reuse_port=True)
|
bjoern.run(app, arguments.host, arguments.port, reuse_port=True)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
def export(arguments):
|
||||||
|
import flaschengeist.system.models as models
|
||||||
|
known = []
|
||||||
|
done = []
|
||||||
|
|
||||||
|
def orm_type(attr):
|
||||||
|
if hasattr(attr, 'type'):
|
||||||
|
tt = attr.type
|
||||||
|
if isinstance(attr, ColumnProperty):
|
||||||
|
tt = attr.columns[0].type
|
||||||
|
elif isinstance(attr, RelationshipProperty):
|
||||||
|
proto = "{}"
|
||||||
|
if attr.key.endswith("s"):
|
||||||
|
proto = "Array<{}>"
|
||||||
|
return proto.format(attr.mapper.class_.__name__)
|
||||||
|
else:
|
||||||
|
raise TypeError("Couldn't inspect type.")
|
||||||
|
tt = tt.__str__().split("(")[0]
|
||||||
|
return {"INTEGER": "number",
|
||||||
|
"VARCHAR": "string",
|
||||||
|
"DATETIME": "Date"}[tt]
|
||||||
|
|
||||||
|
def walker(mod, file):
|
||||||
|
if inspect.isclass(mod[1]) and mod[1].__module__.startswith(models.__name__) and mod[0] not in done:
|
||||||
|
mapper = sqlalchemy.inspect(mod[1], False)
|
||||||
|
if mapper is not None:
|
||||||
|
file.write("interface {} {{\n".format(mod[0]))
|
||||||
|
for desc in mapper.attrs:
|
||||||
|
file.write(" {}: {};\n".format(desc.key, orm_type(desc)))
|
||||||
|
file.write("}\n")
|
||||||
|
done.append(mod[0])
|
||||||
|
|
||||||
|
elif inspect.ismodule(mod[1]) and mod[1].__name__.startswith(models.__name__) and mod[1].__name__ not in known:
|
||||||
|
known.append(mod[1].__name__)
|
||||||
|
for cls in inspect.getmembers(mod[1], lambda x: inspect.isclass(x) or inspect.ismodule(x)):
|
||||||
|
walker(cls, file)
|
||||||
|
|
||||||
|
from flaschengeist.app import create_app
|
||||||
|
|
||||||
|
app = create_app()
|
||||||
|
with app.app_context():
|
||||||
|
with open(arguments.file, "w") as file:
|
||||||
|
walker(("models", models), file)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
# create the top-level parser
|
# create the top-level parser
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
subparsers = parser.add_subparsers(help='sub-command help', dest="sub_command")
|
subparsers = parser.add_subparsers(help="sub-command help", dest="sub_command")
|
||||||
subparsers.required = True
|
subparsers.required = True
|
||||||
parser_run = subparsers.add_parser('run', help='run flaschengeist')
|
parser_run = subparsers.add_parser("run", help="run flaschengeist")
|
||||||
parser_run.set_defaults(func=run)
|
parser_run.set_defaults(func=run)
|
||||||
parser_run.add_argument("--host", help="set hostname to listen on", default="127.0.0.1")
|
parser_run.add_argument("--host", help="set hostname to listen on", default="127.0.0.1")
|
||||||
parser_run.add_argument("--port", help="set port to listen on", type=int, default=5000)
|
parser_run.add_argument("--port", help="set port to listen on", type=int, default=5000)
|
||||||
parser_run.add_argument("--debug", help="run in debug mode", action="store_true")
|
parser_run.add_argument("--debug", help="run in debug mode", action="store_true")
|
||||||
parser_install = subparsers.add_parser('install', help='run database setup for flaschengeist and all installed plugins')
|
parser_install = subparsers.add_parser(
|
||||||
|
"install", help="run database setup for flaschengeist and all installed plugins"
|
||||||
|
)
|
||||||
parser_install.set_defaults(func=install)
|
parser_install.set_defaults(func=install)
|
||||||
|
parser_export = subparsers.add_parser("export", help="export models to typescript interfaces")
|
||||||
|
parser_export.set_defaults(func=export)
|
||||||
|
parser_export.add_argument("--file", help="Filename where to save", default="flaschengeist.d.ts")
|
||||||
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
args.func(args)
|
args.func(args)
|
||||||
|
|
Loading…
Reference in New Issue