File indexing completed on 2024-05-12 05:22:31

0001 #!python3
0002 from typing import List
0003 import requests
0004 import textwrap
0005 import itertools
0006 
0007 #from property import Property
0008 from schema_types import *
0009 
0010 def generate_schema_code(schema, cppfile, hppfile, kobject=True):
0011     properties = list(map(lambda p: Property(*p), schema['properties'].items()))
0012     with open(hppfile, 'w') as header, open(cppfile, 'w') as source:
0013         header.write(textwrap.dedent("""\
0014             #pragma once
0015 
0016             // This is a generated file. Do not edit!
0017         """))
0018         if kobject:
0019             header.write("#include \"object.h\"\n")
0020         else:
0021             header.write('#include <QSharedDataPointer>\n')
0022 
0023         includes = set(itertools.chain.from_iterable(map(lambda p: p.includes, properties)))
0024         for include in includes:
0025             header.write(f"#include {include}\n")
0026 
0027         header.write("\nnamespace KGAPI2::People {\n\n")
0028         classname = schema['id'][0].upper() + schema['id'][1:]
0029         if kobject:
0030             header.write(textwrap.dedent(f"""\
0031                 class {classname} : public KGAPI2::Object {{
0032                     Q_OBJECT
0033             """))
0034         else:
0035             header.write(textwrap.dedent(f"""\
0036                 class {classname} {{
0037                     Q_GADGET
0038             """))
0039 
0040         for prop in properties:
0041             header.write(f"    /** {prop.description} **/\n")
0042             header.write(f"    {prop.qproperty_string(notify=kobject)}\n")
0043 
0044         # First, write nested types
0045         header.write(textwrap.dedent(f"""\
0046             public:
0047                 explicit {schema['id']}();
0048                 ~{schema['id']}();
0049         """))
0050 
0051         for prop in properties:
0052             header.write("\n")
0053             header.write(f"    {prop.type} {prop.getter}() const;\n")
0054             if not prop.read_only:
0055                 header.write(f"    void {prop.setter}(const {prop.type} &{prop.name});\n")
0056             if prop.is_array:
0057                 var_name = f"{prop.array_type[0].lower()}{prop.array_type[1:]}"
0058                 header.write(f"    void add{prop.array_type}(const {prop.array_type} &{var_name});\n")
0059                 header.write(f"    void remove{prop.array_type}(const {prop.array_type} &{var_name});\n")
0060                 header.write(f"    void clear{prop.name[0].upper()}{prop.name[1:]}();\n")
0061 
0062         ###### Privaet part
0063         header.write(textwrap.dedent(f"""\
0064             private:
0065                 class Private;
0066         """))
0067 
0068         if kobject:
0069             header.write('    Private const *d;\n')
0070         else:
0071             header.write('    const QSharedDataPointer<Private> d;\n')
0072 
0073         header.write(textwrap.dedent(f"""\
0074             }}; // class {schema['id']}
0075 
0076             }} // namespace KGAPI2::People
0077         """))
0078 
0079 
0080 
0081 def parse_enums(schemas: dict):
0082     def find_enum(subtree):
0083         for name, value in subtree.items():
0084             if name == 'properties':
0085                 for type, type_def in value.items():
0086                     if 'enum' in type_def:
0087                         values = type_def['enum']
0088                         # v contains enum, p is the name of the prop
0089                 # look for enum props now
0090             elif isinstance(value, dict):
0091                 find_enum(value)
0092 
0093 
0094 def _parse_object_schema(schema):
0095     o = Object()
0096     
0097 def _parse_schema_type(schema):
0098     if schema['type'] == 'object':
0099         return Object(schema)
0100     else:
0101         print(f"Unknown schema type {schema['type']}")
0102         
0103 
0104 def parse_schema(uri):
0105     disc_req = requests.get(uri)
0106     disc_doc = disc_req.json()
0107 
0108     results = []
0109     for name, schema in disc_doc['schemas'].items():
0110         # Skip schemas representing API call requests/respones
0111         if name.endswith('Request') or name.endswith('Response'):
0112             continue
0113 
0114         results.append(_parse_schema_type(schema))
0115 
0116     return results