import os import subprocess import sys HEAVY = ["aiogram", "pyrogram", "fastapi", "google.genai"] SERVICES = { {%- if 'api' in backend_services %} "api": (["api.app"], {"fastapi"}), {%- endif %} {%- if 'aiogram_bot' in backend_services %} "bot": ({% if include_payments %}["bot"]{% else %}["bot.common", "bot.handlers"]{% endif %}, {"aiogram"}), {%- endif %} {%- if 'kurigram_userbot' in backend_services %} "userbot": (["userbot.runner", "userbot.handlers"], {"pyrogram"}), {%- endif %} {%- if 'taskiq_worker' in backend_services %} "worker": (["worker.broker", "worker.tasks"], {% if 'api' in backend_services %}{"fastapi"}{% else %}set(){% endif %}), {%- elif 'scheduler' in backend_services %} "scheduler": (["scheduler"], set()), {%- endif %} } PROBE = """ import importlib, sys for module in sys.argv[1].split(","): importlib.import_module(module) print(" ".join(name for name in sys.argv[2:] if name in sys.modules)) """ {%- if 'aiogram_bot' in backend_services %} ENV = {**os.environ, "BOT__TOKEN": "1:check"} {%- else %} ENV = dict(os.environ) {%- endif %} def loaded(modules: list[str]) -> tuple[set[str], str]: result = subprocess.run( # noqa: S603 [sys.executable, "-c", PROBE, ",".join(modules), *HEAVY], capture_output=True, text=True, cwd="src", env=ENV, check=False, ) error = (result.stderr.strip().splitlines() or ["exit code"])[-1] return set(result.stdout.split()) & set(HEAVY), error if result.returncode else "" def main() -> int: failed = False for service, (modules, allowed) in SERVICES.items(): found, error = loaded(modules) extra = sorted(found - allowed) status = error or ("imports " + ", ".join(extra) if extra else "") print(f"{service:10s} {'FAIL: ' + status if status else 'ok'}") failed |= bool(status) return int(failed) if __name__ == "__main__": sys.exit(main())