Newer
Older
TIASjudge / src / tiasjudge / __main__.py
"""エントリポイント(`python -m tiasjudge`).

`QApplication` を生成してメイン画面(SPEC_01)を表示する.
ログの出力先設定はエントリポイント側の責務とする(error-handling.md「ログ」).

起動オプション:

- `--check`: 画面を生成して即終了する(起動可能性の確認用.イベントループを回さない)
"""

from __future__ import annotations

import logging
import sys
from collections.abc import Sequence

#: `--check`(イベントループを回さずに終了する)オプション
CHECK_OPTION = "--check"

#: ログの書式(診断の入出力は `core` が INFO で記録する)
LOG_FORMAT = "%(asctime)s %(levelname)s %(name)s: %(message)s"


def main(argv: Sequence[str] | None = None) -> int:
    """アプリを起動する.戻り値はプロセスの終了コード.

    Args:
        argv: コマンドライン引数(プログラム名を含まない).省略時は `sys.argv[1:]`.

    Returns:
        プロセスの終了コード(0 が正常終了).
    """
    arguments = list(sys.argv[1:] if argv is None else argv)
    logging.basicConfig(level=logging.INFO, format=LOG_FORMAT)

    # GUI ツールキットの import は起動時のみに限定する(`core` は GUI 非依存)
    from PySide6.QtWidgets import QApplication

    from tiasjudge.gui.main_window import MainWindow

    app = QApplication.instance() or QApplication(sys.argv[:1])
    window = MainWindow()

    if CHECK_OPTION in arguments:
        # 画面を構築できることだけを確認して終了する(ヘッドレス環境での確認用)
        window.close()
        return 0

    window.show()
    return int(app.exec())


if __name__ == "__main__":
    raise SystemExit(main())