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