summaryrefslogtreecommitdiff
path: root/qface/builtin/qtcpp/qtcpp.py
blob: 630e64a4608fc9fe4b620fb1af9a501d87a9a91d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env python3
# Copyright (c) Pelagicore AB 2016

import click
import logging
import logging.config
import yaml
from path import Path

from qface.generator import FileSystem, Generator
from qface.helper.qtcpp import Filters
from qface.helper.doc import parse_doc
from qface.watch import monitor


here = Path(__file__).dirname()

logging.config.dictConfig(yaml.load(open(here / 'log.yaml')))

log = logging.getLogger(__file__)


def run(src, dst):
    log.debug('run {0} {1}'.format(src, dst))
    system = FileSystem.parse(src)
    generator = Generator(search_path=here / 'templates')
    generator.register_filter('returnType', Filters.returnType)
    generator.register_filter('parameterType', Filters.parameterType)
    generator.register_filter('defaultValue', Filters.defaultValue)
    generator.register_filter('parse_doc', parse_doc)
    ctx = {'dst': dst}
    for module in system.modules:
        log.debug('generate code for module %s', module)
        ctx.update({'module': module})
        dst = generator.apply('{{dst}}/{{module|lower|replace(".", "-")}}', ctx)
        generator.destination = dst
        generator.write('qmldir', 'qmldir', ctx, preserve=True)
        generator.write('plugin.cpp', 'plugin.cpp', ctx, preserve=True)
        generator.write('plugin.h', 'plugin.h', ctx, preserve=True)
        generator.write('{{module|lower|replace(".", "-")}}.pro', 'plugin.pro', ctx, preserve=True)
        generator.write('generated/generated.pri', 'generated.pri', ctx)
        generator.write('generated/qml{{module.module_name|lower}}module.h', 'module.h', ctx)
        generator.write('generated/qml{{module.module_name|lower}}module.cpp', 'module.cpp', ctx)
        generator.write('generated/qmlvariantmodel.h', 'variantmodel.h', ctx)
        generator.write('generated/qmlvariantmodel.cpp', 'variantmodel.cpp', ctx)
        generator.write('docs/plugin.qdocconf', 'plugin.qdocconf', ctx)
        generator.write('docs/plugin-project.qdocconf', 'plugin-project.qdocconf', ctx)
        generator.write('docs/docs.pri', 'docs.pri', ctx)
        generator.write('.qmake.conf', 'qmake.conf', ctx)
        for interface in module.interfaces:
            log.debug('generate code for interface %s', interface)
            ctx.update({'interface': interface})
            generator.write('qml{{interface|lower}}.h', 'interface.h', ctx, preserve=True)
            generator.write('qml{{interface|lower}}.cpp', 'interface.cpp', ctx, preserve=True)
            generator.write('generated/qmlabstract{{interface|lower}}.h', 'abstractinterface.h', ctx)
            generator.write('generated/qmlabstract{{interface|lower}}.cpp', 'abstractinterface.cpp', ctx)
        for struct in module.structs:
            log.debug('generate code for struct %s', struct)
            ctx.update({'struct': struct})
            generator.write('generated/qml{{struct|lower}}.h', 'struct.h', ctx)
            generator.write('generated/qml{{struct|lower}}.cpp', 'struct.cpp', ctx)
            generator.write('generated/qml{{struct|lower}}model.h', 'structmodel.h', ctx)
            generator.write('generated/qml{{struct|lower}}model.cpp', 'structmodel.cpp', ctx)


@click.command()
@click.option('--reload/--no-reload', default=False)
@click.argument('src', nargs=-1, type=click.Path(exists=True))
@click.argument('dst', nargs=1, type=click.Path(exists=True))
def app(src, dst, reload):
    """Takes several files or directories as src and generates the code
    in the given dst directory."""
    if reload:
        script = '{0} {1} {2}'.format(Path(__file__).abspath(), ' '.join(src), dst)
        monitor(src, script)
    else:
        run(src, dst)


if __name__ == '__main__':
    app()