-
Notifications
You must be signed in to change notification settings - Fork 2
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
Conversation
* Unauthorize時のlogin&retry処理を、IdPassが渡されていた時のみにした * Patを渡された場合のlogin時、self.tokensにPatを転写するようにした * logoutの処理と対象になるように
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 |
There was a problem hiding this comment.
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]
の方がよいのでしょうか?
There was a problem hiding this comment.
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
は、Pat
とTokens
に定義されているauth_token
という関数が、同じ意味であることを示すためのマーカーとして定義していて、self.tokens
の型として使うことを想定していません。
annofab-api-python-client/annofabapi/api.py
Lines 732 to 736 in 8f044b8
if isinstance(self.tokens, Pat): | |
self.tokens = None | |
return | |
request_body = self.tokens.to_dict() |
annofab-api-python-client/annofabapi/api.py
Lines 753 to 756 in 8f044b8
if isinstance(self.tokens, Pat): | |
return | |
request_body = {"refresh_token": self.tokens.refresh_token} |
Union[HasAuthToken, None]
みたいな定義はオブジェクト指向的なサブタイプポリモフィズムを想定していて、Union[Tokens, Pat, None]
みたいな定義は代数的データ型を想定しています。
それぞれの利点・欠点は、そのままオブジェクト指向的なデータ定義と代数的データ型の利点・欠点を引き継ぎます(cf. Expression Problem
)
オブジェクト指向的なサブタイプポリモフィズムで十全に使えるように、Pat
とTokens
(及び IdPass
)を定義するのは、難しいとは言いませんが、その構造が今のapi.pyの構造から乖離するので面倒です。
login
やlogout
、refresh
の責務自体を(そうなったら名前は変わりますが)HasAuthToken
に持たせなければいけなくなるでしょう(Pat
とTokens
の処理の大きな違いはその辺りであり、その差を吸収する必要があるため)。
また、その場合self.credentials
を含めて抽象化する必要があるでしょう。
今後近いうちに、パーソナルアクセストークンとパスワード認証に加えて新しい認証方法が追加されることが想定されている場合は、オブジェクト指向的に定義しておくと後の手間が省けます。
が、現状そういうことは想定していないので、実装の手間が低い方を選んでいます。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ありがとうございます。理解できました!
annofabapi/util/type_util.py
Outdated
|
||
def assert_noreturn(x: NoReturn) -> NoReturn: | ||
"""python 3.11 以降に追加されたassert_neverの代わり""" | ||
raise AssertionError(f"Invalid value: {x!r}") # x!rは str(x)と等価 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"x!rは str(x)"はrepr(x)
の間違い?
https://docs.python.org/ja/3/library/string.html#format-string-syntax
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
おや、ホントだ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
annofabapi/resource.py
Outdated
@@ -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コードの入力を求められた場合は例外を送出する |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Falseの時にMFAコードの入力を求められた場合は例外を送出する
これは、どの部分でどのような例外が送出されましたか?認識していなかったので質問しました。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
雑にコード読んで判断したんですが、読み直してみると、ここの記述は正確ではないですね。
06eff37
tests/test_build.py
Outdated
@@ -0,0 +1,31 @@ | |||
import os |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
補足情報です。
ファイル名にtest_local_
というプレフィックスが付かないと、CIでテストが実行されません。
最終的にはPytestのmarkers機能を使って、CIで実行しないテストを指定できるようにしたいです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
おっと、なるほど
renameしました
453534d
to
c0db97a
Compare
fix #678
class Resource
のコンストラクタ__init__
は、互換性が壊れています以下の事項について確認しています。
create_test_project.py
によるテスト用プロジェクトの生成が成功することmake test
の大部分が成功すること