def safe_to_file(folder, results): """ Receives a list of results (type :class:`Clazz` or :class:`Function`), and put them into the right files in :var:`folder` :param folder: Where the files should be in. :type folder: str :param results: A list of :class:`Clazz` or :class:`Function` objects, which will be used to calculate the source code. :type results: Union(Clazz, Function) """ functions = [] clazzes = {} # "filepath": [Class, Class, ...] # split results into functions and classes for result in results: assert isinstance(result, (Clazz, Function)) if isinstance(result, Clazz): import_path = get_type_path(result.clazz) import_path = import_path.rstrip(".") file_path = calc_path_and_create_folders(folder, import_path) result.filepath = file_path if file_path not in clazzes: clazzes[file_path] = [] clazzes[file_path].append(result) else: assert isinstance(result, Function) import_path = "pytgbot.bot." file_path = calc_path_and_create_folders(folder, import_path) result.filepath = file_path functions.append(result) # end if # end for bot_template = get_template("bot.template") clazzfile_template = get_template("classfile.template") for path, clazz_list in clazzes.items(): clazz_imports = set() for clazz_ in clazz_list: assert isinstance(clazz_, Clazz) assert isinstance(clazz_.parent_clazz, Type) clazz_imports.add(clazz_.parent_clazz.as_import) # end for clazz_imports = list(clazz_imports) clazz_imports.sort() is_sendable = ("sendable" in path) try: with open(path, "w") as f: result = clazzfile_template.render(clazzes=clazz_list, imports=clazz_imports, is_sendable=is_sendable) result = result.replace("\t", " ") f.write(result) # end with except IOError: raise # lol # end try # end for classes if functions: txt = bot_template.render(functions=functions) with open(functions[0].filepath, "w") as f: f.write(txt)
def safe_to_file(folder, results): """ Receives a list of results (type :class:`Clazz` or :class:`Function`), and put them into the right files in :var:`folder` :param folder: Where the files should be in. :type folder: str :param results: A list of :class:`Clazz` or :class:`Function` objects, which will be used to calculate the source code. :type results: Union(Clazz, Function) """ functions = [] clazzes = {} # "filepath": [Class, Class, ...] # split results into functions and classes for result in results: assert isinstance(result, (Clazz, Function)) if isinstance(result, Clazz): import_path = get_type_path(result.clazz) import_path = import_path.rstrip(".") file_path = calc_path_and_create_folders(folder, import_path) result.filepath = file_path if file_path not in clazzes: clazzes[file_path] = [] clazzes[file_path].append(result) else: assert isinstance(result, Function) import_path = "pytgbot.bot." file_path = calc_path_and_create_folders(folder, import_path) result.filepath = file_path functions.append(result) # end if # end for bot_template = get_template("bot.template") clazzfile_template = get_template("classfile.template") for path, clazz_list in clazzes.items(): clazz_imports = set() for clazz_ in clazz_list: assert isinstance(clazz_, Clazz) assert isinstance(clazz_.parent_clazz, Type) clazz_imports.add(clazz_.parent_clazz.as_import) # end for clazz_imports = list(clazz_imports) clazz_imports.sort() try: with open(path, "w") as f: result = clazzfile_template.render(clazzes=clazz_list, imports=clazz_imports) result = result.replace("\t", " ") f.write(result) # end with except IOError: raise # lol # end try # end for classes if functions: txt = bot_template.render(functions=functions) with open(functions[0].filepath, "w") as f: f.write(txt)
def safe_to_file(folder, results): """ Receives a list of results (type :class:`Clazz` or :class:`Function`), and put them into the right files in :var:`folder` :param folder: Where the files should be in. :type folder: str :param results: A list of :class:`Clazz` or :class:`Function` objects, which will be used to calculate the source code. :type results: Union(Clazz, Function) """ functions = [] message_send_functions = [] clazzes = {} # "filepath": [Class, Class, ...] all_the_clazzes = [] # split results into functions and classes for result in results: assert isinstance(result, (Clazz, Function)) if isinstance(result, Clazz): import_path = get_type_path(result.clazz) import_path = import_path.rstrip(".") file_path = calc_path_and_create_folders(folder, import_path) result.filepath = file_path if file_path not in clazzes: clazzes[file_path] = [] clazzes[file_path].append(result) all_the_clazzes.append(result) else: assert isinstance(result, Function) import_path = "pytgbot.bot." file_path = calc_path_and_create_folders(folder, import_path) result.filepath = file_path functions.append(result) if result.name.startswith('send_'): import_path = "teleflask_messages." file_path = calc_path_and_create_folders(folder, import_path) result2 = safe_eval( repr(result), SAVE_VALUES) # serialize + unserialize = deepcopy result2.filepath = file_path message_send_functions.append(result2) # end if # end if # end for bot_template = get_template("bot.template") clazzfile_template = get_template("classfile.template") teleflask_messages_template = get_template( "teleflask_messages_file.template") typehints_template = get_template("typehintsfile.template") telegram_bot_api_server_funcs_template = get_template( "telegram_bot_api_server/funcs.template") telegram_bot_api_server_class_template = get_template( "telegram_bot_api_server/classes.template") mkdir_p(path_join(folder, 'telegram_bot_api_server', 'generated')) if all_the_clazzes: txt = telegram_bot_api_server_class_template.render( clazzes=all_the_clazzes) render_file_to_disk( path_join(folder, 'telegram_bot_api_server', 'generated', 'models.py'), txt) # end if for path, clazz_list in clazzes.items(): clazz_imports = set() for clazz_ in clazz_list: assert isinstance(clazz_, Clazz) assert isinstance(clazz_.parent_clazz, Type) clazz_imports.add(clazz_.parent_clazz.as_import) # end for clazz_imports = list(clazz_imports) clazz_imports.sort() is_sendable = ("sendable" in path) try: txt = clazzfile_template.render(clazzes=clazz_list, imports=clazz_imports, is_sendable=is_sendable) txt = txt.replace("\t", " ") render_file_to_disk(path, txt) except IOError: raise # lol # end try try: txt = typehints_template.render(clazzes=clazz_list, imports=clazz_imports, is_sendable=is_sendable) txt = txt.replace("\t", " ") render_file_to_disk(path + "i", txt) # "ponies.py" + "i" => "ponies.pyi" except IOError: raise # lol # end try try: txt = typehints_template.render(clazzes=clazz_list, imports=clazz_imports, is_sendable=is_sendable) txt = txt.replace("\t", " ") render_file_to_disk(path + "i", txt) # "ponies.py" + "i" => "ponies.pyi" except IOError: raise # lol # end try # end for classes if functions: txt = bot_template.render(functions=functions) render_file_to_disk(functions[0].filepath, txt) imports = set() imports.add(('enum', 'Enum')) imports.add(('typing', 'Union, List, Optional')) imports.add(('fastapi', 'APIRouter, HTTPException')) imports.add(('telethon', 'TelegramClient')) imports.add(('serializer', 'to_web_api, get_entity')) imports.add(('fastapi.params', 'Query')) imports.add(('telethon.errors', 'BotMethodInvalidError')) imports.add(('telethon.tl.types', 'TypeSendMessageAction')) imports.add(('telethon.client.chats', '_ChatAction')) imports.add(('luckydonaldUtils.logger', 'logging')) imports.add(('telethon.tl.functions.messages', 'SetTypingRequest')) for function in functions: function: Function for the_import in function.imports: the_import: Import imports.add((the_import.path, the_import.name)) # end for # end for # https://stackoverflow.com/a/613218/3423324#how-do-i-sort-a-dictionary-by-value # https://stackoverflow.com/a/4659539/3423324#how-to-sort-by-length-of-string-followed-by-alphabetical-order imports_sorted = [ "from " + path + ' import ' + name for path, name in sorted(imports, key=lambda item: (-len(item[0]), item[0], -len(item[1]), item[1])) ] # imports_sorted.sort(key=lambda item: (-len(item), item)) txt = telegram_bot_api_server_funcs_template.render( functions=functions, imports=imports_sorted) render_file_to_disk( path_join(folder, 'telegram_bot_api_server', 'generated', 'funcs.py'), txt) # end if if message_send_functions: txt = teleflask_messages_template.render( functions=message_send_functions) render_file_to_disk(message_send_functions[0].filepath, txt) # end if if message_send_functions: txt = teleflask_messages_template.render( functions=message_send_functions) render_file_to_disk(message_send_functions[0].filepath, txt)
def calculate_import_path(self) -> 'Import': import_path = get_type_path(self.clazz, as_object=True) return import_path