Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PersonalAccessTokenに対応しました #679

Merged
merged 9 commits into from
Sep 11, 2024
Merged

PersonalAccessTokenに対応しました #679

merged 9 commits into from
Sep 11, 2024

Conversation

seraphr
Copy link
Contributor

@seraphr seraphr commented Sep 9, 2024

fix #678

  • インスタンス生成のためのbuild関数は互換性を維持しています
    • class Resourceのコンストラクタ__init__は、互換性が壊れています

以下の事項について確認しています。

  • PersonalAccessTokenが有効になっている環境を対向としてcreate_test_project.pyによるテスト用プロジェクトの生成が成功すること
  • ↑で作ったプロジェクトに対して、make testの大部分が成功すること
    • 作ったばかりのプロジェクトには統計情報が無いので、そのあたりのテストがMissingResourceで失敗しました
    • AnnotationZip関係も失敗してたけど、そちらは手動で作ったら通りました

@seraphr seraphr requested a review from yuji38kwmt September 9, 2024 21:30
@seraphr seraphr marked this pull request as ready for review September 9, 2024 21:42
self.endpoint_url = endpoint_url
self.input_mfa_code_via_stdin = input_mfa_code_via_stdin
self.url_prefix = f"{endpoint_url}/api/v1"
self.session = requests.Session()

self.token_dict: Optional[Dict[str, Any]] = None
self.tokens: Union[Tokens, Pat, None] = None
Copy link
Collaborator

@yuji38kwmt yuji38kwmt Sep 10, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

興味による質問です。
self.tokensの型はUnion[HasAuthToken, None]でもよいように思ったのですが、Union[Tokens, Pat, None]の方がよいのでしょうか?

Copy link
Contributor Author

@seraphr seraphr Sep 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

その定義だと、以下の部分で型チェックが通りません。
class HasAuthTokenは、別の場所で継承が可能であり、PatでもNoneでも無いことがわかっていても、Tokensであるとは限らないからです。
class HasAuthTokenは、PatTokensに定義されているauth_tokenという関数が、同じ意味であることを示すためのマーカーとして定義していて、self.tokensの型として使うことを想定していません。

if isinstance(self.tokens, Pat):
self.tokens = None
return
request_body = self.tokens.to_dict()

if isinstance(self.tokens, Pat):
return
request_body = {"refresh_token": self.tokens.refresh_token}


Union[HasAuthToken, None]みたいな定義はオブジェクト指向的なサブタイプポリモフィズムを想定していて、Union[Tokens, Pat, None]みたいな定義は代数的データ型を想定しています。
それぞれの利点・欠点は、そのままオブジェクト指向的なデータ定義と代数的データ型の利点・欠点を引き継ぎます(cf. Expression Problem

オブジェクト指向的なサブタイプポリモフィズムで十全に使えるように、PatTokens(及び IdPass)を定義するのは、難しいとは言いませんが、その構造が今のapi.pyの構造から乖離するので面倒です。
loginlogoutrefreshの責務自体を(そうなったら名前は変わりますが)HasAuthTokenに持たせなければいけなくなるでしょう(PatTokensの処理の大きな違いはその辺りであり、その差を吸収する必要があるため)。
また、その場合self.credentialsを含めて抽象化する必要があるでしょう。

今後近いうちに、パーソナルアクセストークンとパスワード認証に加えて新しい認証方法が追加されることが想定されている場合は、オブジェクト指向的に定義しておくと後の手間が省けます。
が、現状そういうことは想定していないので、実装の手間が低い方を選んでいます。

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます。理解できました!


def assert_noreturn(x: NoReturn) -> NoReturn:
"""python 3.11 以降に追加されたassert_neverの代わり"""
raise AssertionError(f"Invalid value: {x!r}") # x!rは str(x)と等価
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

おや、ホントだ

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -19,7 +20,7 @@ class Resource:
login_user_id: AnnofabにログインするときのユーザID
login_password: Annofabにログインするときのパスワード
endpoint_url: Annofab APIのエンドポイント。
input_mfa_code_via_stdin: MFAコードを標準入力から入力するかどうか
input_mfa_code_via_stdin: MFAコードを標準入力から入力するかどうか Falseの時にMFAコードの入力を求められた場合は例外を送出する
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Falseの時にMFAコードの入力を求められた場合は例外を送出する

これは、どの部分でどのような例外が送出されましたか?認識していなかったので質問しました。

Copy link
Contributor Author

@seraphr seraphr Sep 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

雑にコード読んで判断したんですが、読み直してみると、ここの記述は正確ではないですね。
06eff37

@@ -0,0 +1,31 @@
import os
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

補足情報です。
ファイル名にtest_local_というプレフィックスが付かないと、CIでテストが実行されません。

#680

最終的にはPytestのmarkers機能を使って、CIで実行しないテストを指定できるようにしたいです。

Copy link
Contributor Author

@seraphr seraphr Sep 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

おっと、なるほど
renameしました

c0db97a

@yuji38kwmt yuji38kwmt merged commit e118b8f into main Sep 11, 2024
8 checks passed
@yuji38kwmt yuji38kwmt deleted the feature/678_pat branch September 11, 2024 14:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

パーソナルアクセストークン対応
2 participants