Skip to content

wrapper.download系メソッドに、レスポンスヘッダの"Last-Modified"を追加 #218

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

Merged
merged 7 commits into from
Oct 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 2 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,8 @@

# 廃止予定

## 2020-05-01以降 utilsのいくつかのメソッドを非公開
以下のメソッドを非公開にします。以下のメソッドは本来非公開用でして、外部で利用することを想定していなかったためです。
* utils.raise_for_status
* utils.log_error_response
* utils.download


## 2020-10-31 以降,
* `AnnofabApiWrapper.download_annotation_archive`メソッドの引数`v2`引数を削除します。WebAPIに渡す必要がなくなったためです。

# Features
cURLやPostmanなどよりも簡単にAnnoFab Web APIにアクセスできます。
Expand Down
39 changes: 15 additions & 24 deletions README_for_developer.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,43 +92,34 @@ $ poetry run pytest --print_log_annofabapi tests

## Release

## 事前作業

### PyPIのアカウントを作成
1. 以下のURLにアクセスして、PyPIのアカウントを作成する。
https://pypi.org/account/register/

2. 管理者に連絡して、Collaboratorsとして招待してもらう
https://pypi.org/project/annofabapi/

## リリース方法

### 1. annofabapiのバージョンを上げる
`annofabapi/__version__.py`に記載されているバージョンを上げてください。バージョンはSemantic Versioning 2.0に従います。
以下のファイルに記載されているバージョンを上げてください。
* `annofabapi/__version__.py`
* `pyproject.toml`

* AnnoFabののバージョンアップにより、annofabapiをリリースするときは、マイナーバージョンを上げる。
バージョンはSemantic Versioning 2.0に従います。
* メソッドが追加されたときは、マイナーバージョンを上げる。
* annofabapiのバグ/ドキュメント修正などにより、annofabapiをリリースするときは、パッチバージョンを上げる。


### 2. PyPIに登録する
1. TestPyPIに登録して、内容を確認する。

```
$ make publish_test
```

2. TestPyPIからインストールして、利用できることを確認する。

```
$ pip uninstall annofabapi
$ pip install --index-url https://test.pypi.org/simple/ annofabapi --upgrade
$ python -c "import annofabapi; print(annofabapi.__version__)"
```

3. PyPIに登録する。

```
$ make publish
```

4. PyPIからインストールして、利用できることを確認する。

```
$ pip uninstall annofabapi
$ pip install annofabapi --upgrade
$ python -c "import annofabapi; print(annofabapi.__version__)"
```
※ PyPIのユーザ名とパスワードの入力が求められます。



Expand Down
2 changes: 1 addition & 1 deletion annofabapi/__version__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.38.9"
__version__ = "0.38.10"
55 changes: 5 additions & 50 deletions annofabapi/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import datetime
import json
import logging
import warnings
from pathlib import Path
from typing import Any, Dict, List, Optional, Union

Expand Down Expand Up @@ -39,24 +38,6 @@ def _raise_for_status(response: requests.Response) -> None:
raise e


def raise_for_status(response: requests.Response) -> None:
"""
HTTP Status CodeがErrorの場合、``requests.exceptions.HTTPError`` を発生させる。
そのとき ``response.text`` もHTTPErrorに加えて、HTTPError発生時にエラーの原因が分かるようにする。

.. deprecated:: 2020-05-01 以降廃止予定です。

Args:
response: Response

Raises:
requests.exceptions.HTTPError:

"""
warnings.warn("deprecated", DeprecationWarning)
_raise_for_status(response)


def _log_error_response(arg_logger: logging.Logger, response: requests.Response) -> None:
"""
HTTP Statusが400以上ならば、loggerにresponse/request情報を出力する
Expand Down Expand Up @@ -99,22 +80,7 @@ def mask_password(d: RequestBodyHeader) -> RequestBodyHeader:
arg_logger.debug("request.body = %s", mask_password(dict_request_body))


def log_error_response(arg_logger: logging.Logger, response: requests.Response) -> None:
"""
HTTP Statusが400以上ならば、loggerにresponse/request情報を出力する

.. deprecated:: 2020-05-01 以降廃止予定です。

Args:
arg_logger: logger
response: Response

"""
warnings.warn("deprecated", DeprecationWarning)
_log_error_response(arg_logger, response)


def _download(url: str, dest_path: str) -> None:
def _download(url: str, dest_path: str) -> requests.Response:
"""
HTTP GETで取得した内容をファイルに保存する(ダウンロードする)

Expand All @@ -123,6 +89,9 @@ def _download(url: str, dest_path: str) -> None:
url: ダウンロード対象のURL
dest_path: 保存先ファイルのパス

Returns:
URLにアクセスしたときのResponse情報

"""
response = requests.get(url)
_raise_for_status(response)
Expand All @@ -131,21 +100,7 @@ def _download(url: str, dest_path: str) -> None:
p.parent.mkdir(parents=True, exist_ok=True)
with open(dest_path, "wb") as f:
f.write(response.content)


def download(url: str, dest_path: str) -> None:
"""
HTTP GETで取得した内容をファイルに保存する(ダウンロードする)

.. deprecated:: 2020-05-01 以降廃止予定です。

Args:
url: ダウンロード対象のURL
dest_path: 保存先ファイルのパス

"""
warnings.warn("deprecated", DeprecationWarning)
_download(url, dest_path)
return response


def str_now() -> str:
Expand Down
21 changes: 14 additions & 7 deletions annofabapi/wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,8 @@ def download_annotation_archive(self, project_id: str, dest_path: str, v2: bool

_, response = self.api.get_annotation_archive(project_id, query_params=query_params)
url = response.headers["Location"]
_download(url, dest_path)
response2 = _download(url, dest_path)
logger.debug(f"type=simple_annotation, Last-Modified={response2.headers.get('Last-Modified')}")
return url

def download_full_annotation_archive(self, project_id: str, dest_path: str) -> str:
Expand All @@ -199,7 +200,8 @@ def download_full_annotation_archive(self, project_id: str, dest_path: str) -> s
warnings.warn("deprecated", DeprecationWarning)
_, response = self.api.get_archive_full_with_pro_id(project_id)
url = response.headers["Location"]
_download(url, dest_path)
response2 = _download(url, dest_path)
logger.debug(f"type=full_annotation, Last-Modified={response2.headers.get('Last-Modified')}")
return url

def get_all_annotation_list(
Expand Down Expand Up @@ -1136,7 +1138,8 @@ def download_project_inputs_url(self, project_id: str, dest_path: str) -> str:
"""
content, _ = self.api.get_project_inputs_url(project_id)
url = content["url"]
_download(url, dest_path)
response2 = _download(url, dest_path)
logger.debug(f"type=input_data, Last-Modified={response2.headers.get('Last-Modified')}")
return url

def download_project_tasks_url(self, project_id: str, dest_path: str) -> str:
Expand All @@ -1155,7 +1158,8 @@ def download_project_tasks_url(self, project_id: str, dest_path: str) -> str:

content, _ = self.api.get_project_tasks_url(project_id)
url = content["url"]
_download(url, dest_path)
response2 = _download(url, dest_path)
logger.debug(f"type=task, Last-Modified={response2.headers.get('Last-Modified')}")
return url

def download_project_inspections_url(self, project_id: str, dest_path: str) -> str:
Expand All @@ -1174,7 +1178,8 @@ def download_project_inspections_url(self, project_id: str, dest_path: str) -> s

content, _ = self.api.get_project_inspections_url(project_id)
url = content["url"]
_download(url, dest_path)
response2 = _download(url, dest_path)
logger.debug(f"type=inspection_comment, Last-Modified={response2.headers.get('Last-Modified')}")
return url

def download_project_task_history_events_url(self, project_id: str, dest_path: str) -> str:
Expand All @@ -1193,7 +1198,8 @@ def download_project_task_history_events_url(self, project_id: str, dest_path: s

content, _ = self.api.get_project_task_history_events_url(project_id)
url = content["url"]
_download(url, dest_path)
response2 = _download(url, dest_path)
logger.debug(f"type=task_history_event, Last-Modified={response2.headers.get('Last-Modified')}")
return url

def download_project_task_histories_url(self, project_id: str, dest_path: str) -> str:
Expand All @@ -1212,7 +1218,8 @@ def download_project_task_histories_url(self, project_id: str, dest_path: str) -

content, _ = self.api.get_project_task_histories_url(project_id)
url = content["url"]
_download(url, dest_path)
response2 = _download(url, dest_path)
logger.debug(f"type=task_history, Last-Modified={response2.headers.get('Last-Modified')}")
return url

#########################################
Expand Down
2 changes: 1 addition & 1 deletion generate/swagger/swagger.v2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ info:

上記例 `account_id_count` は、タスクのフィールド `account_id` でタスクを分類したところ「`account_id` が `c5eee002` であるタスクが9件、`9f110e48` であるタスクが5件、`b25dfeb3` であるタスクが1件」だったという結果を表しています。

version: 0.94.4
version: 0.94.7
title: AnnoFab Web API
x-logo:
url: "https://annofab.com/images/logo_landscape.png"
Expand Down
2 changes: 1 addition & 1 deletion generate/swagger/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ info:
上記例 `account_id_count` は、タスクのフィールド `account_id` でタスクを分類したところ「`account_id` が `c5eee002` であるタスクが9件、`9f110e48` であるタスクが5件、`b25dfeb3` であるタスクが1件」だったという結果を表しています。
また、AggregationResultの集約の件数は、合計で10000件以下に制限されており、それを超える件数がある場合は上位10000件が取得されます。もし、省略された部分を取得したい場合は、検索条件を縛って結果に上る集約の数を減らしてください。

version: 0.94.4
version: 0.94.7
title: AnnoFab Web API
x-logo:
url: "https://annofab.com/images/logo_landscape.png"
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "annofabapi"
version = "0.38.9"
version = "0.38.10"
description = "Python Clinet Library of AnnoFab WebAPI (https://annofab.com/docs/api/)"
authors = ["yuji38kwmt <[email protected]>"]
maintainers = ["yuji38kwmt <[email protected]>"]
Expand Down