diff --git a/.travis.yml b/.travis.yml index fb999765..09105453 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,12 +5,11 @@ python: - "3.7" - "3.8" install: - - pip install . flake8 mypy pylint pytest + - pip install poetry + - poetry install - echo -e "machine annofab.com\nlogin FOO\npassword BAR\n" > ~/.netrc && chmod 600 ~/.netrc script: - - flake8 annofabapi - - mypy annofabapi - - pylint annofabapi + - make lint - pytest tests/test_local*.py branches: only: diff --git a/Makefile b/Makefile index 8be8d62a..fd947356 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ format: lint: poetry run mypy annofabapi tests poetry run flake8 annofabapi tests/create_test_project.py - poetry run pylint annofabapi tests/create_test_project.py + poetry run pylint --jobs=0 annofabapi tests/create_test_project.py test: poetry run pytest -n auto --cov=annofabapi --cov-report=html tests diff --git a/annofabapi/__version__.py b/annofabapi/__version__.py index 3178d0cc..1a923102 100644 --- a/annofabapi/__version__.py +++ b/annofabapi/__version__.py @@ -1 +1 @@ -__version__ = "0.42.2" +__version__ = "0.43.0" diff --git a/annofabapi/dataclass/annotation_specs.py b/annofabapi/dataclass/annotation_specs.py index d03b131b..682c62d7 100644 --- a/annofabapi/dataclass/annotation_specs.py +++ b/annofabapi/dataclass/annotation_specs.py @@ -82,6 +82,9 @@ class LabelV1BoundingBoxMetadata(DataClassJsonMixin): tolerance: Optional[int] """""" + has_direction: Optional[bool] + """`annotation_type` が `polyline` の場合、アノテーションに向きを持たせるかどうかを指定できます。 この値が `true` の場合、AnnoFabの標準画像エディタ上ではポリラインの向きを示す矢印が描画されるようになります。 `annotationType` が `polyline` 以外の場合は必ず `false` となります。 """ + @dataclass class LabelV1SegmentationMetadata(DataClassJsonMixin): diff --git a/annofabapi/dataclass/input.py b/annofabapi/dataclass/input.py index e8a47a80..220aec5c 100644 --- a/annofabapi/dataclass/input.py +++ b/annofabapi/dataclass/input.py @@ -56,15 +56,6 @@ class InputData(DataClassJsonMixin): original_input_data_path: Optional[str] """AF外部のストレージから登録された場合、その外部ストレージ中のパス。 それ以外の場合は値なし """ - original_resolution: Optional[Resolution] - """""" - - resized_resolution: Optional[Resolution] - """""" - - input_duration: Optional[float] - """入力データが動画の場合、動画の長さ(秒)。小数点以下はミリ秒以下を表します。 動画の長さが取得できなかった場合、あるいは入力データが画像の場合は値なし。 """ - updated_datetime: str """""" diff --git a/annofabapi/dataclass/project.py b/annofabapi/dataclass/project.py index 1a9bc999..9d5b3f52 100644 --- a/annofabapi/dataclass/project.py +++ b/annofabapi/dataclass/project.py @@ -15,7 +15,13 @@ from dataclasses_json import DataClassJsonMixin -from annofabapi.models import AssigneeRuleOfResubmittedTask, InputDataType, ProjectStatus, TaskAssignmentType +from annofabapi.models import ( + AssigneeRuleOfResubmittedTask, + InputDataType, + ProjectStatus, + TaskAssignmentProperty, + TaskAssignmentType, +) @dataclass @@ -39,6 +45,9 @@ class ProjectConfiguration(DataClassJsonMixin): task_assignment_type: Optional[TaskAssignmentType] """""" + task_assignment_property: Optional[TaskAssignmentProperty] + """""" + max_tasks_per_member: Optional[int] """保留中のタスクを除き、1人(オーナー以外)に割り当てられるタスク数上限。未指定の場合は10件として扱う。""" diff --git a/annofabapi/generated_api.py b/annofabapi/generated_api.py index 502a5788..75aa4825 100644 --- a/annofabapi/generated_api.py +++ b/annofabapi/generated_api.py @@ -442,9 +442,7 @@ def get_editor_annotation( } return self._request_wrapper(http_method, url_path, **keyword_params) - def post_annotation_archive_update( - self, project_id: str, query_params: Optional[Dict[str, Any]] = None, **kwargs - ) -> Tuple[Any, requests.Response]: + def post_annotation_archive_update(self, project_id: str, **kwargs) -> Tuple[Any, requests.Response]: """アノテーションZIP更新開始 https://annofab.com/docs/api/#operation/postAnnotationArchiveUpdate @@ -456,19 +454,15 @@ def post_annotation_archive_update( Args: project_id (str): プロジェクトID (required) - query_params (Dict[str, Any]): Query Parameters - v (str): APIの戻り型のバージョンを指定します。 値と戻り型の対応は以下です。 - \"1\":Message - \"2\":PostAnnotationArchiveUpdateResponse Returns: - Tuple[PostAnnotationArchiveUpdateResponseWrapper, requests.Response] + Tuple[PostAnnotationArchiveUpdateResponse, requests.Response] """ url_path = f"/projects/{project_id}/archive/update" http_method = "POST" - keyword_params: Dict[str, Any] = { - "query_params": query_params, - } + keyword_params: Dict[str, Any] = {} return self._request_wrapper(http_method, url_path, **keyword_params) def put_annotation( @@ -715,10 +709,10 @@ def get_input_data_list( Args: project_id (str): プロジェクトID (required) query_params (Dict[str, Any]): Query Parameters - input_data_id (str): 入力データIDでの部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。 - input_data_name (str): 入力データ名での部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。 - input_data_path (str): 入力データパスでの部分一致検索で使用。1文字以上あれば使用します。 - task_id (str): 入力データが紐づくタスクIDの部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。条件に合致した先頭100件のタスクに使われている入力データを検索します。 + input_data_id (str): 入力データIDでの部分一致検索で使用。1文字以上あれば使用します。最大文字列長300文字。大文字小文字は区別しません。 + input_data_name (str): 入力データ名での部分一致検索で使用。1文字以上あれば使用します。最大文字列長300文字。大文字小文字は区別しません。 + input_data_path (str): 入力データパスでの部分一致検索で使用。1文字以上あれば使用します。最大文字列長300文字。 + task_id (str): 入力データが紐づくタスクIDの部分一致検索で使用。1文字以上あれば使用します。最大文字列長300文字。大文字小文字は区別しません。条件に合致した先頭100件のタスクに使われている入力データを検索します。 _from (str): 更新日時での範囲検索で使用(ISO 8601 拡張形式) to (str): 更新日時での範囲検索で使用(ISO 8601 拡張形式) page (int): 検索結果のうち、取得したいページの番号(1始まり) @@ -737,12 +731,7 @@ def get_input_data_list( return self._request_wrapper(http_method, url_path, **keyword_params) def put_input_data( - self, - project_id: str, - input_data_id: str, - query_params: Optional[Dict[str, Any]] = None, - request_body: Optional[Any] = None, - **kwargs, + self, project_id: str, input_data_id: str, request_body: Optional[Any] = None, **kwargs ) -> Tuple[Any, requests.Response]: """入力データ更新 https://annofab.com/docs/api/#operation/putInputData @@ -756,8 +745,6 @@ def put_input_data( Args: project_id (str): プロジェクトID (required) input_data_id (str): 入力データID。[値の制約についてはこちら。](#section/API-Convention/APIID) (required) - query_params (Dict[str, Any]): Query Parameters - v (str): zipファイルを受領時のAPIの戻り型のバージョンを指定します。 値と戻り型の対応は以下です。 - \"1\":登録処理を開始した旨の固定メッセージ - \"2\":JobInfo request_body (Any): Request Body input_data_request (InputDataRequest): (required) @@ -769,7 +756,6 @@ def put_input_data( url_path = f"/projects/{project_id}/inputs/{input_data_id}" http_method = "PUT" keyword_params: Dict[str, Any] = { - "query_params": query_params, "request_body": request_body, } return self._request_wrapper(http_method, url_path, **keyword_params) @@ -1803,9 +1789,7 @@ def put_organization_plugin( # NOTE: This method is auto generated by OpenAPI Generator ######################################### - def delete_project( - self, project_id: str, query_params: Optional[Dict[str, Any]] = None, **kwargs - ) -> Tuple[Any, requests.Response]: + def delete_project(self, project_id: str, **kwargs) -> Tuple[Any, requests.Response]: """プロジェクト削除 https://annofab.com/docs/api/#operation/deleteProject @@ -1817,19 +1801,15 @@ def delete_project( Args: project_id (str): プロジェクトID (required) - query_params (Dict[str, Any]): Query Parameters - v (str): APIの戻り型のバージョンを指定します。 値と戻り型の対応は以下です。 - \"1\":Project - \"2\":DeleteProjectResponse Returns: - Tuple[DeleteProjectResponseWrapper, requests.Response] + Tuple[DeleteProjectResponse, requests.Response] """ url_path = f"/projects/{project_id}" http_method = "DELETE" - keyword_params: Dict[str, Any] = { - "query_params": query_params, - } + keyword_params: Dict[str, Any] = {} return self._request_wrapper(http_method, url_path, **keyword_params) def get_organization_of_project(self, project_id: str, **kwargs) -> Tuple[Any, requests.Response]: @@ -1996,11 +1976,7 @@ def get_project_tasks_url(self, project_id: str, **kwargs) -> Tuple[Any, request return self._request_wrapper(http_method, url_path, **keyword_params) def initiate_project_copy( - self, - project_id: str, - query_params: Optional[Dict[str, Any]] = None, - request_body: Optional[Any] = None, - **kwargs, + self, project_id: str, request_body: Optional[Any] = None, **kwargs ) -> Tuple[Any, requests.Response]: """プロジェクト複製 https://annofab.com/docs/api/#operation/initiateProjectCopy @@ -2013,20 +1989,17 @@ def initiate_project_copy( Args: project_id (str): コピー元となるプロジェクトID (required) - query_params (Dict[str, Any]): Query Parameters - v (str): APIの戻り型のバージョンを指定します。 値と戻り型の対応は以下です。 - \"1\":Project - \"2\":ProjectCopyResponse request_body (Any): Request Body project_copy_request (ProjectCopyRequest): (required) Returns: - Tuple[ProjectCopyResponseWrapper, requests.Response] + Tuple[ProjectCopyResponse, requests.Response] """ url_path = f"/projects/{project_id}/copy" http_method = "POST" keyword_params: Dict[str, Any] = { - "query_params": query_params, "request_body": request_body, } return self._request_wrapper(http_method, url_path, **keyword_params) @@ -2054,9 +2027,7 @@ def post_project_inputs_update(self, project_id: str, **kwargs) -> Tuple[Any, re keyword_params: Dict[str, Any] = {} return self._request_wrapper(http_method, url_path, **keyword_params) - def post_project_tasks_update( - self, project_id: str, query_params: Optional[Dict[str, Any]] = None, **kwargs - ) -> Tuple[Any, requests.Response]: + def post_project_tasks_update(self, project_id: str, **kwargs) -> Tuple[Any, requests.Response]: """プロジェクトのタスク全件ファイル更新開始 https://annofab.com/docs/api/#operation/postProjectTasksUpdate @@ -2068,19 +2039,15 @@ def post_project_tasks_update( Args: project_id (str): プロジェクトID (required) - query_params (Dict[str, Any]): Query Parameters - v (str): APIの戻り型のバージョンを指定します。 値と戻り型の対応は以下です。 - \"1\":Message - \"2\":PostProjectTasksUpdateResponse Returns: - Tuple[PostProjectTasksUpdateResponseWrapper, requests.Response] + Tuple[PostProjectTasksUpdateResponse, requests.Response] """ url_path = f"/projects/{project_id}/rawdata/tasks" http_method = "POST" - keyword_params: Dict[str, Any] = { - "query_params": query_params, - } + keyword_params: Dict[str, Any] = {} return self._request_wrapper(http_method, url_path, **keyword_params) def put_project( @@ -2677,11 +2644,7 @@ def get_tasks( return self._request_wrapper(http_method, url_path, **keyword_params) def initiate_tasks_generation( - self, - project_id: str, - query_params: Optional[Dict[str, Any]] = None, - request_body: Optional[Any] = None, - **kwargs, + self, project_id: str, request_body: Optional[Any] = None, **kwargs ) -> Tuple[Any, requests.Response]: """タスク一括作成 https://annofab.com/docs/api/#operation/initiateTasksGeneration @@ -2694,20 +2657,17 @@ def initiate_tasks_generation( Args: project_id (str): プロジェクトID (required) - query_params (Dict[str, Any]): Query Parameters - v (str): APIの戻り型のバージョンを指定します。 値と戻り型の対応は以下です。 - \"1\":Project - \"2\":TaskGenerateResponse request_body (Any): Request Body task_generate_request (TaskGenerateRequest): (required) Returns: - Tuple[TaskGenerateResponseWrapper, requests.Response] + Tuple[TaskGenerateResponse, requests.Response] """ url_path = f"/projects/{project_id}/generate-tasks" http_method = "POST" keyword_params: Dict[str, Any] = { - "query_params": query_params, "request_body": request_body, } return self._request_wrapper(http_method, url_path, **keyword_params) diff --git a/annofabapi/models.py b/annofabapi/models.py index d7c42c8b..c1f6f558 100644 --- a/annofabapi/models.py +++ b/annofabapi/models.py @@ -714,11 +714,11 @@ class AnnotationDataHoldingType(Enum): * task_id: str タスクID。[値の制約についてはこちら。](#section/API-Convention/APIID) * exact_match_task_id: bool - タスクIDの検索方法を指定します。 最大文字列長300文字。 trueの場合は完全一致検索、falseの場合は中間一致検索です。 + タスクIDの検索方法を指定します。 trueの場合は完全一致検索、falseの場合は中間一致検索です。 * input_data_id: str 入力データID。[値の制約についてはこちら。](#section/API-Convention/APIID) * exact_match_input_data_id: bool - 入力データIDの検索方法を指定します。 最大文字列長300文字。 trueの場合は完全一致検索、falseの場合は中間一致検索です。 + 入力データIDの検索方法を指定します。 trueの場合は完全一致検索、falseの場合は中間一致検索です。 * label_id: str * attributes: List[AdditionalData] @@ -1295,39 +1295,6 @@ class AssigneeRuleOfResubmittedTask(Enum): * project: Project -""" - -DeleteProjectResponseWrapper = Dict[str, Any] -""" - - -Kyes of Dict - -* project_id: str - プロジェクトID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* organization_id: str - 組織ID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* title: str - プロジェクトのタイトル -* overview: str - プロジェクトの概要 -* project_status: ProjectStatus - -* input_data_type: InputDataType - -* configuration: ProjectConfiguration - -* created_datetime: str - -* updated_datetime: str - -* summary: ProjectSummary - -* job: JobInfo - -* project: Project - - """ Duplicated = Dict[str, Any] @@ -1657,12 +1624,6 @@ class GraphType(Enum): * original_input_data_path: str AF外部のストレージから登録された場合、その外部ストレージ中のパス。 それ以外の場合は値なし -* original_resolution: Resolution - -* resized_resolution: Resolution - -* input_duration: float - 入力データが動画の場合、動画の長さ(秒)。小数点以下はミリ秒以下を表します。 動画の長さが取得できなかった場合、あるいは入力データが画像の場合は値なし。 * updated_datetime: str * sign_required: bool @@ -2213,31 +2174,6 @@ class InspectionSummary(Enum): * updated_datetime: str -""" - -JobInfo2 = Dict[str, Any] -""" - - -Kyes of Dict - -* project_id: str - プロジェクトID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* job_type: JobType - -* job_id: str - -* job_status: JobStatus - -* job_execution: __DictStrKeyAnyValue__ - ジョブの内部情報 -* job_detail: __DictStrKeyAnyValue__ - ジョブ結果の内部情報 -* created_datetime: str - -* updated_datetime: str - - """ JobInfoContainer = Dict[str, Any] @@ -2363,6 +2299,8 @@ class JobType(Enum): * tolerance: int +* has_direction: bool + `annotation_type` が `polyline` の場合、アノテーションに向きを持たせるかどうかを指定できます。 この値が `true` の場合、AnnoFabの標準画像エディタ上ではポリラインの向きを示す矢印が描画されるようになります。 `annotationType` が `polyline` 以外の場合は必ず `false` となります。 """ @@ -2479,33 +2417,6 @@ class JobType(Enum): * message: str 多言語対応 -""" - -MessageOrJobInfo = Dict[str, Any] -""" - - -Kyes of Dict - -* message: str - 多言語対応 -* project_id: str - プロジェクトID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* job_type: JobType - -* job_id: str - -* job_status: JobStatus - -* job_execution: __DictStrKeyAnyValue__ - ジョブの内部情報 -* job_detail: __DictStrKeyAnyValue__ - ジョブ結果の内部情報 -* created_datetime: str - -* updated_datetime: str - - """ MyAccount = Dict[str, Any] @@ -2937,19 +2848,6 @@ class OrganizationMemberStatus(Enum): * job: JobInfo -""" - -PostAnnotationArchiveUpdateResponseWrapper = Dict[str, Any] -""" - - -Kyes of Dict - -* message: str - 多言語対応 -* job: JobInfo - - """ PostProjectTasksUpdateResponse = Dict[str, Any] @@ -2961,19 +2859,6 @@ class OrganizationMemberStatus(Enum): * job: JobInfo -""" - -PostProjectTasksUpdateResponseWrapper = Dict[str, Any] -""" - - -Kyes of Dict - -* message: str - 多言語対応 -* job: JobInfo - - """ @@ -3011,35 +2896,6 @@ class PricePlan(Enum): * summary: ProjectSummary -""" - -Project2 = Dict[str, Any] -""" - - -Kyes of Dict - -* project_id: str - プロジェクトID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* organization_id: str - 組織ID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* title: str - プロジェクトのタイトル -* overview: str - プロジェクトの概要 -* project_status: ProjectStatus - -* input_data_type: InputDataType - -* configuration: ProjectConfiguration2 - -* created_datetime: str - -* updated_datetime: str - -* summary: ProjectSummary - - """ ProjectAccountStatistics = Dict[str, Any] @@ -3109,40 +2965,7 @@ class PricePlan(Enum): * task_assignment_type: TaskAssignmentType -* max_tasks_per_member: int - 保留中のタスクを除き、1人(オーナー以外)に割り当てられるタスク数上限。未指定の場合は10件として扱う。 -* max_tasks_per_member_including_hold: int - 保留中のタスクを含めて、1人(オーナー以外)に割り当てられるタスク数上限。未指定の場合は20件として扱う。 -* input_data_set_id_list: List[str] - このフィールドは内部用でまだ何も意味を成しません。今は空配列を指定してください。 -* input_data_max_long_side_length: int - 入力データ画像の長辺の最大値(未指定時は4096px)。 画像をアップロードすると、長辺がこの値になるように画像が自動で圧縮されます。 アノテーションの座標は、もとの解像度の画像でつけたものに復元されます。 大きな数値を設定すると入力データ画像のサイズが大きくなり、生産性低下やブラウザで画像を表示できない懸念があります。注意して設定してください。 -* sampling_inspection_rate: int - 抜取検査率。0-100のパーセント値で指定し、未指定の場合は100%として扱う。 -* sampling_acceptance_rate: int - 抜取受入率。0-100のパーセント値で指定し、未指定の場合は100%として扱う。 -* private_storage_aws_iam_role_arn: str - AWS IAMロール。ビジネスプランでのS3プライベートストレージの認可で使います。 [S3プライベートストレージの認可の設定についてはこちら](/docs/faq/#m0b240)をご覧ください。 -* plugin_id: str - プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* custom_task_assignment_plugin_id: str - プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* custom_specs_plugin_id: str - プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) - -""" - -ProjectConfiguration2 = Dict[str, Any] -""" - - -Kyes of Dict - -* number_of_inspections: int - 検査回数。 * 0回:教師付け -> 受入 * 1回:教師付け -> 検査 -> 受入 * n回(n >= 2):教師付け -> 検査1 -> ... -> 検査n -> 受入 -* assignee_rule_of_resubmitted_task: AssigneeRuleOfResubmittedTask - -* task_assignment_type: TaskAssignmentType +* task_assignment_property: TaskAssignmentProperty * max_tasks_per_member: int 保留中のタスクを除き、1人(オーナー以外)に割り当てられるタスク数上限。未指定の場合は10件として扱う。 @@ -3218,39 +3041,6 @@ class PricePlan(Enum): * dest_project: Project -""" - -ProjectCopyResponseWrapper = Dict[str, Any] -""" - - -Kyes of Dict - -* project_id: str - プロジェクトID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* organization_id: str - 組織ID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* title: str - プロジェクトのタイトル -* overview: str - プロジェクトの概要 -* project_status: ProjectStatus - -* input_data_type: InputDataType - -* configuration: ProjectConfiguration - -* created_datetime: str - -* updated_datetime: str - -* summary: ProjectSummary - -* job: JobInfo - -* dest_project: Project - - """ ProjectInputsUpdateResponse = Dict[str, Any] @@ -3566,52 +3356,6 @@ class ProjectStatus(Enum): * project: Project -""" - -PutProjectResponse2 = Dict[str, Any] -""" - - -Kyes of Dict - -* job: JobInfo2 - -* project: Project2 - - -""" - -PutProjectResponseWrapper = Dict[str, Any] -""" - - -Kyes of Dict - -* project_id: str - プロジェクトID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* organization_id: str - 組織ID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* title: str - プロジェクトのタイトル -* overview: str - プロジェクトの概要 -* project_status: ProjectStatus - -* input_data_type: InputDataType - -* configuration: ProjectConfiguration2 - -* created_datetime: str - -* updated_datetime: str - -* summary: ProjectSummary - -* job: JobInfo2 - -* project: Project2 - - """ RefreshTokenRequest = Dict[str, Any] @@ -3930,14 +3674,14 @@ class SupplementaryDataType(Enum): TaskAssignRequestType = Dict[str, Any] """ -* `TaskAssignRequestTypeRandom`: タスクフェーズのみを指定してランダムにタスクを自身に割当します。プロジェクト設定でタスクのランダム割当を有効にした場合のみ利用できます。 * `TaskAssignRequestTypeSelection`: 担当者とタスクを明示的に指定してタスクを割当します。プロジェクトオーナーもしくはチェッカーのみ、自身以外のプロジェクトメンバーを担当者に指定できます。プロジェクト設定でタスクの選択割当を有効にした場合のみ利用できます。 +* `TaskAssignRequestTypeRandom`: タスクフェーズのみを指定してランダムにタスクを自身に割当します。プロジェクト設定でタスクのランダム割当を有効にした場合のみ利用できます。 * `TaskAssignRequestTypeSelection`: 担当者とタスクを明示的に指定してタスクを割当します。プロジェクトオーナーもしくはチェッカーのみ、自身以外のプロジェクトメンバーを担当者に指定できます。プロジェクト設定でタスクの選択割当を有効にした場合のみ利用できます。 * `TaskAssignRequestTypeTaskProperty`: タスクフェーズのみを指定して、タスクプロパティ割当の設定に基づいてタスクを自身に割当します。プロジェクト設定でタスクプロパティ割当を有効にした場合のみ利用できます。 Kyes of Dict * phase: TaskPhase * type: str - Selection + TaskPropertry * user_id: str * task_ids: List[str] @@ -3973,15 +3717,52 @@ class SupplementaryDataType(Enum): """ +TaskAssignRequestTypeTaskProperty = Dict[str, Any] +""" + + +Kyes of Dict + +* phase: TaskPhase + +* type: str + TaskPropertry + +""" + + +class TaskAssignmentOrder(Enum): + """ + タスクの割当優先度を決定するための並び順。 * `asc` - 昇順 * `desc` - 降順 + """ + + ASC = "asc" + DESC = "desc" + + +TaskAssignmentProperty = Dict[str, Any] +""" +プロジェクト設定でタスクプロパティ割当を有効にしている場合のみ指定してください。 + +Kyes of Dict + +* name: str + タスクの割当優先度を決定するためのタスクプロパティ。
指定できるプロパティは次のいずれかです。 * `task_id` * `updated_datetime` * `metadata` (`metadata.{メタデータ名}` の形式で指定してください) +* order: TaskAssignmentOrder + + +""" + class TaskAssignmentType(Enum): """ - プロジェクトで使用するタスクの割当方式。 * `random` - タスクフェーズのみを指定してランダムにタスクを自身に割当する方式です。 * `selection` - 担当者とタスクを明示的に指定してタスクを割当する方式です。プロジェクトオーナーもしくはチェッカーのみ、自身以外のプロジェクトメンバーを担当者に指定できます。 * `random_and_selection` - ランダム割当と選択割当の両機能を使用する方式です。 * `custom` - タスク割当アルゴリズム (API) を独自に定義してタスクを割当する方式です。 + プロジェクトで使用するタスクの割当方式。 * `random` - タスクフェーズのみを指定してランダムにタスクを自身に割当する方式です。 * `selection` - 担当者とタスクを明示的に指定してタスクを割当する方式です。プロジェクトオーナーもしくはチェッカーのみ、自身以外のプロジェクトメンバーを担当者に指定できます。 * `random_and_selection` - ランダム割当と選択割当の両機能を使用する方式です。 * `task_property` - タスクのプロパティ(タスクID/更新日時/メタデータ)と並び順(昇順/降順)を設定して、その順番通りにタスクを割当する方式です。順番が同じタスクが複数ある場合は、その中からランダムに1つのタスクを割当します。プロパティと並び順は`TaskAssignmentProperty` から設定します。 * `custom` - タスク割当アルゴリズム (API) を独自に定義してタスクを割当する方式です。 """ RANDOM = "random" SELECTION = "selection" RANDOM_AND_SELECTION = "random_and_selection" + TASK_PROPERTY = "task_property" CUSTOM = "custom" @@ -4009,39 +3790,6 @@ class TaskAssignmentType(Enum): * project: Project -""" - -TaskGenerateResponseWrapper = Dict[str, Any] -""" - - -Kyes of Dict - -* project_id: str - プロジェクトID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* organization_id: str - 組織ID。[値の制約についてはこちら。](#section/API-Convention/APIID) -* title: str - プロジェクトのタイトル -* overview: str - プロジェクトの概要 -* project_status: ProjectStatus - -* input_data_type: InputDataType - -* configuration: ProjectConfiguration - -* created_datetime: str - -* updated_datetime: str - -* summary: ProjectSummary - -* job: JobInfo - -* project: Project - - """ TaskGenerateRule = Dict[str, Any] diff --git a/generate/partial-header/dataclass/project.py b/generate/partial-header/dataclass/project.py index ad5754f8..76fcee9d 100644 --- a/generate/partial-header/dataclass/project.py +++ b/generate/partial-header/dataclass/project.py @@ -1 +1 @@ -from annofabapi.models import AssigneeRuleOfResubmittedTask, ProjectStatus, InputDataType, TaskAssignmentType +from annofabapi.models import AssigneeRuleOfResubmittedTask, ProjectStatus, InputDataType, TaskAssignmentType, TaskAssignmentProperty diff --git a/generate/swagger/swagger-api-components.yaml b/generate/swagger/swagger-api-components.yaml index 0fa24e04..da75b679 100644 --- a/generate/swagger/swagger-api-components.yaml +++ b/generate/swagger/swagger-api-components.yaml @@ -1097,6 +1097,8 @@ components: default: no_assignee task_assignment_type: $ref: "#/components/schemas/TaskAssignmentType" + task_assignment_property: + $ref: "#/components/schemas/TaskAssignmentProperty" max_tasks_per_member: description: 保留中のタスクを除き、1人(オーナー以外)に割り当てられるタスク数上限。未指定の場合は10件として扱う。 type: integer @@ -1146,6 +1148,7 @@ components: $ref: "#/components/schemas/PluginId" description: | `task_assignment_type`に`custom`を設定している場合のみ、カスタムタスク割当のプラグインIDを設定してください。 + `custom`以外の場合は空文字とするか、値を設定しないでください。 custom_specs_plugin_id: $ref: "#/components/schemas/PluginId" description: | @@ -1164,6 +1167,7 @@ components: - random - selection - random_and_selection + - task_property - custom description: | プロジェクトで使用するタスクの割当方式。 @@ -1171,7 +1175,37 @@ components: * `random` - タスクフェーズのみを指定してランダムにタスクを自身に割当する方式です。 * `selection` - 担当者とタスクを明示的に指定してタスクを割当する方式です。プロジェクトオーナーもしくはチェッカーのみ、自身以外のプロジェクトメンバーを担当者に指定できます。 * `random_and_selection` - ランダム割当と選択割当の両機能を使用する方式です。 + * `task_property` - タスクのプロパティ(タスクID/更新日時/メタデータ)と並び順(昇順/降順)を設定して、その順番通りにタスクを割当する方式です。順番が同じタスクが複数ある場合は、その中からランダムに1つのタスクを割当します。プロパティと並び順は`TaskAssignmentProperty` から設定します。 * `custom` - タスク割当アルゴリズム (API) を独自に定義してタスクを割当する方式です。 + TaskAssignmentProperty: + type: object + description: | + プロジェクト設定でタスクプロパティ割当を有効にしている場合のみ指定してください。 + required: + - name + - order + properties: + name: + type: string + description: | + タスクの割当優先度を決定するためのタスクプロパティ。
+ 指定できるプロパティは次のいずれかです。 + + * `task_id` + * `updated_datetime` + * `metadata` (`metadata.{メタデータ名}` の形式で指定してください) + order: + $ref: "#/components/schemas/TaskAssignmentOrder" + TaskAssignmentOrder: + type: string + enum: + - asc + - desc + description: | + タスクの割当優先度を決定するための並び順。 + + * `asc` - 昇順 + * `desc` - 降順 JobInfo: type: object properties: @@ -2290,6 +2324,14 @@ components: $ref: "#/components/schemas/PositionForMinimumBoundingBoxInsertion" tolerance: type: integer + has_direction: + type: boolean + default: false + description: | + `annotation_type` が `polyline` の場合、アノテーションに向きを持たせるかどうかを指定できます。 + この値が `true` の場合、AnnoFabの標準画像エディタ上ではポリラインの向きを示す矢印が描画されるようになります。 + + `annotationType` が `polyline` 以外の場合は必ず `false` となります。 segmentation_metadata: type: object required: @@ -2372,6 +2414,14 @@ components: $ref: "#/components/schemas/PositionForMinimumBoundingBoxInsertion" tolerance: type: integer + has_direction: + type: boolean + default: false + description: | + `annotation_type` が `polyline` の場合、アノテーションに向きを持たせるかどうかを指定できます。 + この値が `true` の場合、AnnoFabの標準画像エディタ上ではポリラインの向きを示す矢印が描画されるようになります。 + + `annotationType` が `polyline` 以外の場合は必ず `false` となります。 segmentation_metadata: type: object required: @@ -2981,14 +3031,17 @@ components: description: | * `TaskAssignRequestTypeRandom`: タスクフェーズのみを指定してランダムにタスクを自身に割当します。プロジェクト設定でタスクのランダム割当を有効にした場合のみ利用できます。 * `TaskAssignRequestTypeSelection`: 担当者とタスクを明示的に指定してタスクを割当します。プロジェクトオーナーもしくはチェッカーのみ、自身以外のプロジェクトメンバーを担当者に指定できます。プロジェクト設定でタスクの選択割当を有効にした場合のみ利用できます。 + * `TaskAssignRequestTypeTaskProperty`: タスクフェーズのみを指定して、タスクプロパティ割当の設定に基づいてタスクを自身に割当します。プロジェクト設定でタスクプロパティ割当を有効にした場合のみ利用できます。 oneOf: - $ref: "#/components/schemas/TaskAssignRequestTypeRandom" - $ref: "#/components/schemas/TaskAssignRequestTypeSelection" + - $ref: "#/components/schemas/TaskAssignRequestTypeTaskProperty" discriminator: propertyName: "_type" mapping: Random: "#/components/schemas/TaskAssignRequestTypeRandom" Selection: "#/components/schemas/TaskAssignRequestTypeSelection" + TaskProperty: "#/components/schemas/TaskAssignRequestTypeTaskProperty" TaskAssignRequestTypeRandom: type: object required: @@ -3019,6 +3072,18 @@ components: type: string description: Selection example: "Selection" + TaskAssignRequestTypeTaskProperty: + type: object + required: + - phase + properties: + phase: + $ref: "#/components/schemas/TaskPhase" + description: 割当するタスクフェーズ。[詳細はこちら](#section/TaskPhase) + _type: + type: string + description: TaskPropertry + example: "TaskProperty" TaskHistoryShort: description: タスクのあるフェーズを誰が担当したかを表します。 type: object @@ -3223,25 +3288,6 @@ components: description: | AF外部のストレージから登録された場合、その外部ストレージ中のパス。 それ以外の場合は値なし - original_resolution: - deprecated: true - $ref: "#/components/schemas/Resolution" - description: | - 入力データの元画像サイズ。 - AnnoFabにアップロードされる入力データとS3プライベートストレージの場合のみ設定されます。 - resized_resolution: - deprecated: true - $ref: "#/components/schemas/Resolution" - description: | - 入力データのリサイズ後サイズ。 - 入力データ登録時に画像がリサイズされた場合のみ設定される。 - input_duration: - deprecated: true - type: number - description: | - 入力データが動画の場合、動画の長さ(秒)。小数点以下はミリ秒以下を表します。 - - 動画の長さが取得できなかった場合、あるいは入力データが画像の場合は値なし。 updated_datetime: type: string format: date-time @@ -3547,20 +3593,22 @@ components: type: object properties: task_id: + description: | + 最大文字列長300文字。 $ref: "#/components/schemas/TaskId" exact_match_task_id: description: | タスクIDの検索方法を指定します。 - 最大文字列長300文字。 trueの場合は完全一致検索、falseの場合は中間一致検索です。 type: boolean default: true input_data_id: + description: | + 最大文字列長300文字。 $ref: "#/components/schemas/InputDataId" exact_match_input_data_id: description: | 入力データIDの検索方法を指定します。 - 最大文字列長300文字。 trueの場合は完全一致検索、falseの場合は中間一致検索です。 type: boolean default: true @@ -3869,6 +3917,14 @@ components: description: 更新日時。アノテーションが一つもない場合(教師付作業が未着手のときなど)は、未指定。 BatchAnnotation: type: object + required: + - project_id + - task_id + - input_data_id + - annotation_id + - label_id + - additional_data_list + - updated_datetime properties: project_id: $ref: "#/components/schemas/ProjectId" @@ -5118,22 +5174,6 @@ components: 属性の種類に対して有効でない初期値を設定した場合、その設定は無視されます。 なお、トラッキングとリンクには初期値を設定できません。 - DeleteProjectResponseWrapper: - oneOf: - - $ref: "#/components/schemas/Project" - - $ref: "#/components/schemas/DeleteProjectResponse" - ProjectCopyResponseWrapper: - oneOf: - - $ref: "#/components/schemas/Project" - - $ref: "#/components/schemas/ProjectCopyResponse" - PostProjectTasksUpdateResponseWrapper: - oneOf: - - $ref: "#/components/schemas/Message" - - $ref: "#/components/schemas/PostProjectTasksUpdateResponse" - PutProjectResponseWrapper: - oneOf: - - $ref: "swagger-api-components.yaml#/components/schemas/Project" - - $ref: "swagger-api-components.yaml#/components/schemas/PutProjectResponse" AnnotationSpecs: oneOf: - $ref: "#/components/schemas/AnnotationSpecsV1" @@ -5142,15 +5182,3 @@ components: oneOf: - $ref: "#/components/schemas/AnnotationSpecsRequestV1" - $ref: "#/components/schemas/AnnotationSpecsRequestV2" - TaskGenerateResponseWrapper: - oneOf: - - $ref: "#/components/schemas/Project" - - $ref: "#/components/schemas/TaskGenerateResponse" - PostAnnotationArchiveUpdateResponseWrapper: - oneOf: - - $ref: "#/components/schemas/Message" - - $ref: "#/components/schemas/PostAnnotationArchiveUpdateResponse" - MessageOrJobInfo: - oneOf: - - $ref: "#/components/schemas/Message" - - $ref: "#/components/schemas/JobInfo" diff --git a/generate/swagger/swagger.v2.yaml b/generate/swagger/swagger.v2.yaml index a692cd34..05acf429 100644 --- a/generate/swagger/swagger.v2.yaml +++ b/generate/swagger/swagger.v2.yaml @@ -115,10 +115,10 @@ info: 上記例 `account_id_count` は、タスクのフィールド `account_id` でタスクを分類したところ「`account_id` が `c5eee002` であるタスクが9件、`9f110e48` であるタスクが5件、`b25dfeb3` であるタスクが1件」だったという結果を表しています。 - version: 0.105.0 + version: 0.108.0 title: AnnoFab Web API x-logo: - url: "https://annofab.com/images/logo_landscape.png" + url: "https://annofab.com/resource/images/logo_landscape.png" href: "https://annofab.com/" contact: url: "https://annofab.com/docs/forms/trouble-shooting.html" diff --git a/generate/swagger/swagger.yaml b/generate/swagger/swagger.yaml index 38b39f1e..7f1733f6 100644 --- a/generate/swagger/swagger.yaml +++ b/generate/swagger/swagger.yaml @@ -3,7 +3,7 @@ openapi: "3.0.0" info: description: | [AnnoFab](https://annofab.com) のWeb APIです。 - キャッシュが有効になって[大幅に高速化された v2 はこちら](/docs/api/v2) です。 + キャッシュが有効になって[大幅に高速化された v2 はこちら](/docs/api/v2/) です。 APIベースURL: https://annofab.com/api/v1
例) /projects というAPIを使う場合、 https://annofab.com/api/v1/projects をリクエストします。 @@ -116,10 +116,10 @@ info: 上記例 `account_id_count` は、タスクのフィールド `account_id` でタスクを分類したところ「`account_id` が `c5eee002` であるタスクが9件、`9f110e48` であるタスクが5件、`b25dfeb3` であるタスクが1件」だったという結果を表しています。 また、AggregationResultの集約の件数は、合計で10000件以下に制限されており、それを超える件数がある場合は上位10000件が取得されます。もし、省略された部分を取得したい場合は、検索条件を縛って結果に上る集約の数を減らしてください。 - version: 0.105.0 + version: 0.108.0 title: AnnoFab Web API x-logo: - url: "https://annofab.com/images/logo_landscape.png" + url: "https://annofab.com/resource/images/logo_landscape.png" href: "https://annofab.com/" contact: url: "https://annofab.com/docs/forms/trouble-shooting.html" @@ -1817,7 +1817,7 @@ paths: content: application/json: schema: - $ref: "swagger-api-components.yaml#/components/schemas/PutProjectResponseWrapper" + $ref: "swagger-api-components.yaml#/components/schemas/PutProjectResponse" "400": $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest" "401": @@ -1855,25 +1855,13 @@ paths: required: true schema: $ref: "swagger-api-components.yaml#/components/schemas/ProjectId" - - name: v - in: query - description: | - APIの戻り型のバージョンを指定します。 - 値と戻り型の対応は以下です。 - - "1":Project - - "2":DeleteProjectResponse - required: false - schema: - type: string - default: "1" - example: "2" responses: "202": description: バッチにてプロジェクトの削除開始 content: application/json: schema: - $ref: "swagger-api-components.yaml#/components/schemas/DeleteProjectResponseWrapper" + $ref: "swagger-api-components.yaml#/components/schemas/DeleteProjectResponse" "401": $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi" "403": @@ -1956,18 +1944,6 @@ paths: required: true schema: $ref: "swagger-api-components.yaml#/components/schemas/ProjectId" - - name: v - in: query - description: | - APIの戻り型のバージョンを指定します。 - 値と戻り型の対応は以下です。 - - "1":Project - - "2":ProjectCopyResponse - required: false - schema: - type: string - default: "1" - example: "2" requestBody: required: true content: @@ -1980,7 +1956,7 @@ paths: content: application/json: schema: - $ref: "swagger-api-components.yaml#/components/schemas/ProjectCopyResponseWrapper" + $ref: "swagger-api-components.yaml#/components/schemas/ProjectCopyResponse" "400": $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest" "401": @@ -2126,25 +2102,13 @@ paths: required: true schema: $ref: "swagger-api-components.yaml#/components/schemas/ProjectId" - - name: v - in: query - description: | - APIの戻り型のバージョンを指定します。 - 値と戻り型の対応は以下です。 - - "1":Message - - "2":PostProjectTasksUpdateResponse - required: false - schema: - type: string - default: "1" - example: "2" responses: "202": description: 正常 content: application/json: schema: - $ref: "swagger-api-components.yaml#/components/schemas/PostProjectTasksUpdateResponseWrapper" + $ref: "swagger-api-components.yaml#/components/schemas/PostProjectTasksUpdateResponse" "400": $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest" "401": @@ -3399,18 +3363,6 @@ paths: required: true schema: $ref: "swagger-api-components.yaml#/components/schemas/ProjectId" - - name: v - in: query - description: | - APIの戻り型のバージョンを指定します。 - 値と戻り型の対応は以下です。 - - "1":Project - - "2":TaskGenerateResponse - required: false - schema: - type: string - default: "1" - example: "2" requestBody: required: true content: @@ -3423,7 +3375,7 @@ paths: content: application/json: schema: - $ref: "swagger-api-components.yaml#/components/schemas/TaskGenerateResponseWrapper" + $ref: "swagger-api-components.yaml#/components/schemas/TaskGenerateResponse" "401": $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi" "409": @@ -3835,6 +3787,8 @@ paths: $ref: "swagger-api-components.yaml#/components/schemas/TaskHistory" "401": $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi" + "404": + $ref: "swagger-api-components.yaml#/components/responses/ErrorMissingResource" "503": $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance" /projects/{project_id}/annotations: @@ -4237,25 +4191,13 @@ paths: required: true schema: $ref: "swagger-api-components.yaml#/components/schemas/ProjectId" - - name: v - in: query - description: | - APIの戻り型のバージョンを指定します。 - 値と戻り型の対応は以下です。 - - "1":Message - - "2":PostAnnotationArchiveUpdateResponse - required: false - schema: - type: string - default: "1" - example: "2" responses: "202": description: 正常 content: application/json: schema: - $ref: "swagger-api-components.yaml#/components/schemas/PostAnnotationArchiveUpdateResponseWrapper" + $ref: "swagger-api-components.yaml#/components/schemas/PostAnnotationArchiveUpdateResponse" "400": $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest" "401": @@ -4402,25 +4344,25 @@ paths: $ref: "swagger-api-components.yaml#/components/schemas/ProjectId" - name: input_data_id in: query - description: 入力データIDでの部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。 + description: 入力データIDでの部分一致検索で使用。1文字以上あれば使用します。最大文字列長300文字。大文字小文字は区別しません。 required: false schema: $ref: "swagger-api-components.yaml#/components/schemas/InputDataId" - name: input_data_name in: query - description: 入力データ名での部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。 + description: 入力データ名での部分一致検索で使用。1文字以上あれば使用します。最大文字列長300文字。大文字小文字は区別しません。 required: false schema: type: string - name: input_data_path in: query - description: 入力データパスでの部分一致検索で使用。1文字以上あれば使用します。 + description: 入力データパスでの部分一致検索で使用。1文字以上あれば使用します。最大文字列長300文字。 required: false schema: type: string - name: task_id in: query - description: 入力データが紐づくタスクIDの部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。条件に合致した先頭100件のタスクに使われている入力データを検索します。 + description: 入力データが紐づくタスクIDの部分一致検索で使用。1文字以上あれば使用します。最大文字列長300文字。大文字小文字は区別しません。条件に合致した先頭100件のタスクに使われている入力データを検索します。 required: false schema: type: string @@ -4624,18 +4566,6 @@ paths: required: true schema: $ref: "swagger-api-components.yaml#/components/schemas/InputDataId" - - name: v - in: query - description: | - zipファイルを受領時のAPIの戻り型のバージョンを指定します。 - 値と戻り型の対応は以下です。 - - "1":登録処理を開始した旨の固定メッセージ - - "2":JobInfo - required: false - schema: - type: string - default: "1" - example: "2" requestBody: required: true content: @@ -4654,7 +4584,7 @@ paths: content: application/json: schema: - $ref: "swagger-api-components.yaml#/components/schemas/MessageOrJobInfo" + $ref: "swagger-api-components.yaml#/components/schemas/JobInfo" "400": $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest" "401": diff --git a/pyproject.toml b/pyproject.toml index 0bd4a7cb..502f1947 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "annofabapi" -version = "0.42.2" +version = "0.43.0" description = "Python Clinet Library of AnnoFab WebAPI (https://annofab.com/docs/api/)" authors = ["yuji38kwmt"] license = "MIT" diff --git a/tests/test_local_parser.py b/tests/test_local_parser.py index a8df3863..b3365d6e 100644 --- a/tests/test_local_parser.py +++ b/tests/test_local_parser.py @@ -66,7 +66,6 @@ def test_SimpleAnnotationDirParserByTask(self): test_dir / "simple-annotation/sample_1/c6e1c2ec-6c7c-41c6-9639-4244c2ed2839.json" ) - def test_SimpleAnnotationZipParserByTask(self): with zipfile.ZipFile(test_dir / "simple-annotation.zip") as zip_file: task_parser = SimpleAnnotationZipParserByTask(zip_file, "sample_1") @@ -124,8 +123,6 @@ def test_lazy_parse_simple_annotation_zip_by_task(self): assert len([e for e in parser_list if e.input_data_id == "c6e1c2ec-6c7c-41c6-9639-4244c2ed2839"]) == 1 assert len([e for e in parser_list if e.input_data_id == "c86205d1-bdd4-4110-ae46-194e661d622b"]) == 1 - - def test_lazy_parse_simple_annotation_dir_by_task(self): zip_path = Path(test_dir / "simple-annotation") task_parser_list = list(annofabapi.parser.lazy_parse_simple_annotation_dir_by_task(zip_path)) @@ -141,8 +138,6 @@ def test_lazy_parse_simple_annotation_dir_by_task(self): assert len([e for e in parser_list if e.input_data_id == "c86205d1-bdd4-4110-ae46-194e661d622b"]) == 1 - - class TestFullAnnotation: def test_full_annotation_zip(self): zip_path = Path(test_dir / "full-annotation.zip")