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)
Exemple #3
0
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)
Exemple #4
0
 def calculate_import_path(self) -> 'Import':
     import_path = get_type_path(self.clazz, as_object=True)
     return import_path