コンテンツにスキップ

pytilpack.cli

pytilpack.cli

CLIユーティリティ。

babel

Babelメッセージ管理CLIユーティリティ。

add_parser(subparsers)

babelサブコマンドのパーサーを追加する。

ソースコード位置: pytilpack/cli/babel.py
def add_parser(subparsers: argparse._SubParsersAction) -> None:
    """babelサブコマンドのパーサーを追加する。"""
    parser = subparsers.add_parser(
        "babel",
        help="Babelメッセージ管理",
        description="gettextメッセージの抽出・初期化・更新・コンパイルを行う",
    )
    babel_sub = parser.add_subparsers(dest="babel_command", help="Babelサブコマンド")

    # extract サブコマンド
    extract_parser = babel_sub.add_parser("extract", help="メッセージを抽出する")
    extract_parser.add_argument("input_dirs", nargs="+", help="抽出元ディレクトリ")
    extract_parser.add_argument("-o", "--output", default="messages.pot", help="出力POTファイル")
    extract_parser.add_argument(
        "-k",
        "--keywords",
        nargs="*",
        default=None,
        help="キーワード(デフォルト: python標準)",
    )
    extract_parser.add_argument("--charset", default="utf-8", help="文字コード")

    # init サブコマンド
    init_parser = babel_sub.add_parser("init", help="新しいロケールのカタログを初期化する")
    init_parser.add_argument("-l", "--locale", required=True, help="ロケール")
    init_parser.add_argument("-i", "--input-file", default="messages.pot", help="入力POTファイル")
    init_parser.add_argument("-d", "--output-dir", default="locales", help="出力ディレクトリ")
    init_parser.add_argument("--domain", default="messages", help="ドメイン")

    # update サブコマンド
    update_parser = babel_sub.add_parser("update", help="既存カタログを更新する")
    update_parser.add_argument("-i", "--input-file", default="messages.pot", help="入力POTファイル")
    update_parser.add_argument("-d", "--output-dir", default="locales", help="出力ディレクトリ")
    update_parser.add_argument("--domain", default="messages", help="ドメイン")

    # compile サブコマンド
    compile_parser = babel_sub.add_parser("compile", help="カタログをコンパイルする")
    compile_parser.add_argument("-d", "--directory", default="locales", help="ロケールディレクトリ")
    compile_parser.add_argument("--domain", default="messages", help="ドメイン")

run(args)

babelコマンドを実行する。

ソースコード位置: pytilpack/cli/babel.py
def run(args: argparse.Namespace) -> None:
    """babelコマンドを実行する。"""
    if args.babel_command == "extract":
        _run_extract(args)
    elif args.babel_command == "init":
        _run_init(args)
    elif args.babel_command == "update":
        _run_update(args)
    elif args.babel_command == "compile":
        _run_compile(args)
    else:
        logger.error("サブコマンドを指定してください: extract, init, update, compile")

delete_empty_dirs

空のディレクトリを削除するCLIユーティリティ。

add_parser(subparsers)

delete-empty-dirsサブコマンドのパーサーを追加する。

ソースコード位置: pytilpack/cli/delete_empty_dirs.py
def add_parser(subparsers: argparse._SubParsersAction) -> None:
    """delete-empty-dirsサブコマンドのパーサーを追加する。"""
    parser = subparsers.add_parser(
        "delete-empty-dirs",
        help="空のディレクトリを削除",
        description="空のディレクトリを削除します",
    )
    parser.add_argument(
        "path",
        type=str,
        help="対象のディレクトリパス",
    )
    parser.add_argument(
        "--no-keep-root",
        action="store_false",
        dest="keep_root",
        help="空の場合はルートディレクトリも削除(デフォルトは保持)",
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="詳細なログを出力",
    )

run(args)

delete-empty-dirsコマンドを実行する。

ソースコード位置: pytilpack/cli/delete_empty_dirs.py
def run(args: argparse.Namespace) -> None:
    """delete-empty-dirsコマンドを実行する。"""
    pytilpack.pathlib.delete_empty_dirs(
        pathlib.Path(args.path),
        keep_root=args.keep_root,
    )

delete_old_files

古いファイルを削除するCLIユーティリティ。

add_parser(subparsers)

delete-old-filesサブコマンドのパーサーを追加する。

ソースコード位置: pytilpack/cli/delete_old_files.py
def add_parser(subparsers: argparse._SubParsersAction) -> None:
    """delete-old-filesサブコマンドのパーサーを追加する。"""
    parser = subparsers.add_parser(
        "delete-old-files",
        help="古いファイルを削除",
        description="古いファイルを削除します",
    )
    parser.add_argument(
        "path",
        type=str,
        help="対象のディレクトリパス",
    )
    parser.add_argument(
        "--days",
        type=float,
        required=True,
        help="指定した日数より古いファイルを削除",
    )
    parser.add_argument(
        "--no-delete-empty-dirs",
        action="store_false",
        dest="delete_empty_dirs",
        help="空のディレクトリを削除しない(デフォルトは削除)",
    )
    parser.add_argument(
        "--no-keep-root-empty-dir",
        action="store_false",
        dest="keep_root_empty_dir",
        help="空の場合はルートディレクトリも削除(デフォルトは保持)",
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="詳細なログを出力",
    )

run(args)

delete-old-filesコマンドを実行する。

ソースコード位置: pytilpack/cli/delete_old_files.py
def run(args: argparse.Namespace) -> None:
    """delete-old-filesコマンドを実行する。"""
    days = max(0, args.days)
    before = datetime.datetime.now() - datetime.timedelta(days=days)
    pytilpack.pathlib.delete_old_files(
        pathlib.Path(args.path),
        before=before,
        delete_empty_dirs=args.delete_empty_dirs,
        keep_root_empty_dir=args.keep_root_empty_dir,
    )

fetch

URLアクセスコマンド。

add_parser(subparsers)

fetchサブコマンドのパーサーを追加する。

ソースコード位置: pytilpack/cli/fetch.py
def add_parser(subparsers: argparse._SubParsersAction) -> None:
    """fetchサブコマンドのパーサーを追加する。"""
    parser = subparsers.add_parser(
        "fetch",
        help="URLの内容を取得",
        description="URL先のHTMLを取得し、簡略化して標準出力に出力します",
    )
    parser.add_argument(
        "url",
        help="URL",
        type=str,
    )
    parser.add_argument(
        "--no-verify",
        action="store_true",
        help="SSL証明書の検証を無効化する",
    )
    parser.add_argument(
        "--accept",
        type=str,
        default=pytilpack.htmlrag.DEFAULT_ACCEPT,
        help=f"受け入れるコンテンツタイプ(デフォルト: {pytilpack.htmlrag.DEFAULT_ACCEPT!r})",
    )
    default_user_agent = pytilpack.htmlrag.get_default_user_agent()
    parser.add_argument(
        "--user-agent",
        type=str,
        default=default_user_agent,
        help=f"User-Agentヘッダー(デフォルト: {default_user_agent!r})",
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="詳細なログを出力",
    )

run(args)

fetchコマンドを実行する。

ソースコード位置: pytilpack/cli/fetch.py
def run(args: argparse.Namespace) -> None:
    """fetchコマンドを実行する。"""
    output = pytilpack.htmlrag.fetch_url(
        url=args.url,
        no_verify=args.no_verify,
        accept=args.accept,
        user_agent=args.user_agent,
    )
    print(output)

main

pytilpackメインCLIエントリーポイント。

main(sys_args=None)

メインのエントリーポイント。

ソースコード位置: pytilpack/cli/main.py
def main(sys_args: list[str] | None = None) -> None:
    """メインのエントリーポイント。"""
    argv = sys.argv[1:] if sys_args is None else list(sys_args)

    # サブコマンドを遅延登録する。
    # extras 欠落により import できないサブコマンドは「スタブ」として登録し、
    # 実行時に明確なエラーメッセージへ誘導する。
    loaded: dict[str, types.ModuleType] = {}
    missing: dict[str, str] = {}

    parser = argparse.ArgumentParser(
        prog="pytilpack",
        description="pytilpackコマンドラインツール",
    )
    subparsers = parser.add_subparsers(dest="command", help="コマンド")
    for name, module_path, extras in _SUBCOMMANDS:
        _register(subparsers, name, module_path, extras, loaded, missing)

    # argparse に渡す前に先頭の非オプション引数を確認する。
    # 未インストールサブコマンドが指定された場合、argparse の --help や
    # unrecognized arguments 処理よりも前に統一エラーへ誘導する。
    for token in argv:
        if token.startswith("-"):
            continue
        if token in missing:
            _die_missing_extras(token, missing[token])
        break

    args = parser.parse_args(argv)
    if args.command is None:
        parser.print_help()
        sys.exit(1)

    # ログの基本設定
    logging.basicConfig(
        level=logging.DEBUG if getattr(args, "verbose", False) else logging.INFO,
        format="[%(levelname)-5s] %(message)s",
    )

    # 各サブコマンドの実行
    if args.command in missing:
        # 先読みで捕捉できなかった場合の保険ルート。
        _die_missing_extras(args.command, missing[args.command])
    loaded[args.command].run(args)

mcp

MCPサーバーコマンド。

add_parser(subparsers)

mcpサブコマンドのパーサーを追加する。

ソースコード位置: pytilpack/cli/mcp.py
def add_parser(subparsers: argparse._SubParsersAction) -> None:
    """mcpサブコマンドのパーサーを追加する。"""
    parser = subparsers.add_parser(
        "mcp",
        help="MCPサーバーを起動",
        description="Model Context ProtocolサーバーとしてpytilpackのFetch機能を提供します",
    )
    parser.add_argument(
        "--transport",
        type=str,
        choices=["stdio", "http"],
        default="stdio",
        help="通信方式(デフォルト: stdio)",
    )
    parser.add_argument(
        "--host",
        type=str,
        default="localhost",
        help="サーバーのホスト名(httpの場合のみ使用、デフォルト: localhost)",
    )
    parser.add_argument(
        "--port",
        type=int,
        default=8000,
        help="サーバーのポート番号(httpの場合のみ使用、デフォルト: 8000)",
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="詳細なログを出力",
    )

run(args)

mcpコマンドを実行する。

ソースコード位置: pytilpack/cli/mcp.py
def run(args: argparse.Namespace) -> None:
    """mcpコマンドを実行する。"""
    _run_server(transport=args.transport, host=args.host, port=args.port)

sync

ディレクトリ同期コマンド。

add_parser(subparsers)

syncサブコマンドのパーサーを追加する。

ソースコード位置: pytilpack/cli/sync.py
def add_parser(subparsers: argparse._SubParsersAction) -> None:
    """syncサブコマンドのパーサーを追加する。"""
    parser = subparsers.add_parser(
        "sync",
        help="ディレクトリを同期",
        description="ディレクトリを同期します",
    )
    parser.add_argument(
        "src",
        help="コピー元のパス",
        type=str,
    )
    parser.add_argument(
        "dst",
        help="コピー先のパス",
        type=str,
    )
    parser.add_argument(
        "--delete",
        action="store_true",
        help="コピー元に存在しないコピー先のファイル・ディレクトリを削除",
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="詳細なログを出力",
    )

run(args)

syncコマンドを実行する。

ソースコード位置: pytilpack/cli/sync.py
def run(args: argparse.Namespace) -> None:
    """syncコマンドを実行する。"""
    pytilpack.pathlib.sync(
        pathlib.Path(args.src),
        pathlib.Path(args.dst),
        delete=args.delete,
    )

wait_for_db_connection

DB接続待機コマンド。

is_async_url(url)

URLが非同期ドライバを使用しているか判定する。

ソースコード位置: pytilpack/cli/wait_for_db_connection.py
def is_async_url(url: str) -> bool:
    """URLが非同期ドライバを使用しているか判定する。"""
    return any(driver in url for driver in ASYNC_DRIVERS)

add_parser(subparsers)

wait-for-db-connectionサブコマンドのパーサーを追加する。

ソースコード位置: pytilpack/cli/wait_for_db_connection.py
def add_parser(subparsers: argparse._SubParsersAction) -> None:
    """wait-for-db-connectionサブコマンドのパーサーを追加する。"""
    parser = subparsers.add_parser(
        "wait-for-db-connection",
        help="DB接続可能になるまで待機",
        description="指定されたSQLALCHEMY_DATABASE_URIでDBに接続可能になるまで待機します",
    )
    parser.add_argument(
        "url",
        help="SQLALCHEMY_DATABASE_URI",
        type=str,
    )
    parser.add_argument(
        "--timeout",
        type=float,
        default=180.0,
        help="タイムアウト秒数(デフォルト: 180)",
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="詳細なログを出力",
    )

run(args)

wait-for-db-connectionコマンドを実行する。

ソースコード位置: pytilpack/cli/wait_for_db_connection.py
def run(args: argparse.Namespace) -> None:
    """wait-for-db-connectionコマンドを実行する。"""
    if is_async_url(args.url):
        asyncio.run(pytilpack.sqlalchemy.await_for_connection(args.url, timeout=args.timeout))
    else:
        pytilpack.sqlalchemy.wait_for_connection(args.url, timeout=args.timeout)