diff --git a/docs/commands.rst b/docs/commands.rst index 31d3aea..1f9a4b9 100644 --- a/docs/commands.rst +++ b/docs/commands.rst @@ -78,7 +78,7 @@ reg-creds .. code-block:: text - usage: ss-manager reg-creds [-h] creds_path + usage: ss-manager reg-creds [-h] [creds_path] Google Docs の API credentials を登録します。詳しい登録方法は :ref:`register_credentials` をご覧ください。 diff --git a/docs/register_credentials.rst b/docs/register_credentials.rst index e6a1381..97a12f6 100644 --- a/docs/register_credentials.rst +++ b/docs/register_credentials.rst @@ -7,6 +7,9 @@ Google Docs API を使用可能にする .. warning:: **Google Docs にある問題文を扱いたい場合は、この操作が必須となります。** 問題文がすべてローカル環境に存在する場合はこの操作は不要です。 +Google Docs にある問題文を初めて扱う場合の操作 +============================================== + 作業ディレクトリ ``WORKING_DIR`` に対して、以下で説明する credentials というものを登録します。 - `Google Docs - Quickstart `_ の手順通りに進め、API を使える状態にします。リンク先のサンプルを実行できるかどうかで動作確認が可能です。 @@ -34,3 +37,15 @@ Google Docs API を使用可能にする :class: highlight $ ss-manager reg-creds CREDS_PATH + +credentials をすでに利用していてエラーが出る場合の操作 +====================================================== + +credentials をすでに利用したことがあっても、有効期限が切れたなどの理由で再登録が必要な場合があります。 + +以下のコマンドを打つことで、再登録できます。不具合が発生する場合は、「Google Docs にある問題文を初めて扱う場合の操作」を再度行ってください。 + +.. code-block:: bash + :class: highlight + + $ ss-manager reg-creds diff --git a/statements_manager/main.py b/statements_manager/main.py index 9f1bb9f..51f5c80 100644 --- a/statements_manager/main.py +++ b/statements_manager/main.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import pathlib import pickle @@ -88,7 +90,9 @@ def get_parser() -> argparse.ArgumentParser: ) subparser.add_argument( "creds_path", - help="path to credentials file (json)\n" + nargs="?", + help="path to credentials file (json). " + "if creds_path is not specified, update existing credentials.\n" "how to create credentials file: " "see https://statements-manager.readthedocs.io/ja/stable/register_credentials.html", ) @@ -111,35 +115,39 @@ def subcommand_run( def subcommand_reg_creds( - creds_path: str, + creds_path: str | None, ) -> None: - # 引数は実在するものでなければならない - if not pathlib.Path(creds_path).exists(): - logger.error(f"credentials '{creds_path}' does not exist") - raise IOError(f"credentials '{creds_path}' does not exist") - - # 隠しディレクトリ homedir = str(pathlib.Path.home()) hidden_dir = pathlib.Path(homedir, ".ss-manager") - logger.info("register credentials") - if not hidden_dir.exists(): - logger.info(f"create hidden directory: {hidden_dir}") - hidden_dir.mkdir() - - # 上書きが発生する場合は確認する + creds_savepath = hidden_dir / "credentials.json" token_path = hidden_dir / "token.pickle" - if token_path.exists() and not ask_ok( - f"{hidden_dir} already exists. Rewrite this?", default_response=False - ): - return + if creds_path is not None: + if not hidden_dir.exists(): + logger.info(f"create hidden directory: {hidden_dir}") + hidden_dir.mkdir() + + # 上書きが発生する場合は確認する + if token_path.exists() and not ask_ok( + f"{hidden_dir} already exists. Rewrite this?", default_response=False + ): + return + else: + creds_path = str(creds_savepath.resolve()) + + logger.info("register credentials") + if not pathlib.Path(creds_path).exists(): + logger.error(f"credentials '{creds_path}' does not exist") + raise IOError(f"credentials '{creds_path}' does not exist") # ファイルを登録 token = create_token(creds_path) with open(token_path, "wb") as f: pickle.dump(token, f) - creds_savepath = hidden_dir / "credentials.json" - shutil.copy2(creds_path, creds_savepath) - logger.info("copied credentials successfully.") + if not creds_savepath.exists() or not creds_savepath.samefile(creds_path): + shutil.copy2(creds_path, creds_savepath) + logger.info("copied credentials successfully.") + else: + logger.info("registered credentials successfully.") logger.debug("reg-creds command ended successfully.") diff --git a/statements_manager/src/convert_task_runner.py b/statements_manager/src/convert_task_runner.py index 2226a7a..71cd7a8 100644 --- a/statements_manager/src/convert_task_runner.py +++ b/statements_manager/src/convert_task_runner.py @@ -85,7 +85,8 @@ def get_docs_contents(self, problem_id: str) -> Tuple[ContentsStatus, str]: # どのパスでも生成できなかったらエラー logger.error("cannot get docs contents") logger.warning( - "tips: try 'ss-manager reg-creds' before running on docs mode.\n" + "tips: try 'ss-manager reg-creds CREDS_PATH' before running on docs mode.\n" + "if you have already registered credentials, try 'ss-manager reg-creds'.\n" "how to create credentials file: " "see https://statements-manager.readthedocs.io/ja/stable/register_credentials.html" )