annofabcli 1.111.2__py3-none-any.whl → 1.112.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- annofabcli/__main__.py +1 -2
- annofabcli/annotation/annotation_query.py +10 -10
- annofabcli/annotation/change_annotation_attributes.py +9 -9
- annofabcli/annotation/change_annotation_attributes_per_annotation.py +3 -4
- annofabcli/annotation/change_annotation_properties.py +13 -13
- annofabcli/annotation/copy_annotation.py +5 -5
- annofabcli/annotation/create_classification_annotation.py +6 -6
- annofabcli/annotation/delete_annotation.py +8 -8
- annofabcli/annotation/download_annotation_zip.py +1 -3
- annofabcli/annotation/dump_annotation.py +7 -7
- annofabcli/annotation/import_annotation.py +12 -12
- annofabcli/annotation/list_annotation.py +8 -8
- annofabcli/annotation/list_annotation_count.py +1 -2
- annofabcli/annotation/merge_segmentation.py +5 -5
- annofabcli/annotation/remove_segmentation_overlap.py +4 -4
- annofabcli/annotation/restore_annotation.py +6 -6
- annofabcli/annotation/subcommand_annotation.py +1 -2
- annofabcli/annotation_specs/add_attribute_restriction.py +4 -5
- annofabcli/annotation_specs/attribute_restriction.py +8 -8
- annofabcli/annotation_specs/export_annotation_specs.py +4 -5
- annofabcli/annotation_specs/get_annotation_specs_with_attribute_id_replaced.py +3 -4
- annofabcli/annotation_specs/get_annotation_specs_with_choice_id_replaced.py +3 -4
- annofabcli/annotation_specs/get_annotation_specs_with_label_id_replaced.py +3 -4
- annofabcli/annotation_specs/list_annotation_specs_attribute.py +9 -10
- annofabcli/annotation_specs/list_annotation_specs_choice.py +9 -10
- annofabcli/annotation_specs/list_annotation_specs_history.py +2 -2
- annofabcli/annotation_specs/list_annotation_specs_label.py +8 -9
- annofabcli/annotation_specs/list_annotation_specs_label_attribute.py +10 -11
- annofabcli/annotation_specs/list_attribute_restriction.py +2 -4
- annofabcli/annotation_specs/list_label_color.py +2 -3
- annofabcli/annotation_specs/put_label_color.py +3 -4
- annofabcli/annotation_specs/subcommand_annotation_specs.py +1 -3
- annofabcli/annotation_zip/list_annotation_3d_bounding_box.py +365 -0
- annofabcli/annotation_zip/list_annotation_bounding_box_2d.py +11 -12
- annofabcli/annotation_zip/list_range_annotation.py +24 -14
- annofabcli/annotation_zip/list_single_point_annotation.py +11 -12
- annofabcli/annotation_zip/subcommand_annotation_zip.py +3 -2
- annofabcli/annotation_zip/validate_annotation.py +8 -7
- annofabcli/comment/delete_comment.py +4 -6
- annofabcli/comment/download_comment_json.py +4 -6
- annofabcli/comment/list_all_comment.py +5 -6
- annofabcli/comment/list_comment.py +3 -4
- annofabcli/comment/put_comment.py +9 -10
- annofabcli/comment/put_comment_simply.py +5 -6
- annofabcli/comment/put_inspection_comment.py +1 -3
- annofabcli/comment/put_inspection_comment_simply.py +1 -3
- annofabcli/comment/put_onhold_comment.py +1 -3
- annofabcli/comment/put_onhold_comment_simply.py +1 -3
- annofabcli/comment/subcommand_comment.py +1 -3
- annofabcli/common/bokeh.py +4 -4
- annofabcli/common/cli.py +17 -17
- annofabcli/common/download.py +28 -29
- annofabcli/common/facade.py +37 -38
- annofabcli/common/image.py +14 -14
- annofabcli/common/utils.py +8 -8
- annofabcli/common/visualize.py +13 -13
- annofabcli/experimental/list_out_of_range_annotation_for_movie.py +3 -4
- annofabcli/experimental/subcommand_experimental.py +1 -3
- annofabcli/filesystem/draw_annotation.py +26 -26
- annofabcli/filesystem/filter_annotation.py +9 -10
- annofabcli/filesystem/mask_user_info.py +14 -14
- annofabcli/filesystem/merge_annotation.py +8 -8
- annofabcli/filesystem/subcommand_filesystem.py +1 -3
- annofabcli/input_data/copy_input_data.py +8 -9
- annofabcli/input_data/delete_input_data.py +2 -2
- annofabcli/input_data/delete_metadata_key_of_input_data.py +3 -5
- annofabcli/input_data/download_input_data_json.py +4 -6
- annofabcli/input_data/list_all_input_data.py +8 -8
- annofabcli/input_data/list_all_input_data_merged_task.py +4 -4
- annofabcli/input_data/list_input_data.py +4 -4
- annofabcli/input_data/put_input_data.py +5 -5
- annofabcli/input_data/put_input_data_with_zip.py +2 -3
- annofabcli/input_data/subcommand_input_data.py +1 -3
- annofabcli/input_data/update_input_data.py +6 -8
- annofabcli/input_data/update_metadata_of_input_data.py +3 -5
- annofabcli/instruction/copy_instruction.py +4 -5
- annofabcli/instruction/download_instruction.py +4 -5
- annofabcli/instruction/list_instruction_history.py +2 -2
- annofabcli/instruction/subcommand_instruction.py +1 -3
- annofabcli/instruction/upload_instruction.py +2 -3
- annofabcli/job/delete_job.py +1 -2
- annofabcli/job/list_job.py +4 -4
- annofabcli/job/list_last_job.py +3 -3
- annofabcli/job/subcommand_job.py +1 -3
- annofabcli/job/wait_job.py +4 -5
- annofabcli/my_account/get_my_account.py +1 -2
- annofabcli/my_account/subcommand_my_account.py +1 -3
- annofabcli/organization/list_organization.py +1 -2
- annofabcli/organization/subcommand_organization.py +1 -3
- annofabcli/organization_member/change_organization_member.py +3 -4
- annofabcli/organization_member/delete_organization_member.py +3 -4
- annofabcli/organization_member/invite_organization_member.py +1 -3
- annofabcli/organization_member/list_organization_member.py +2 -2
- annofabcli/organization_member/subcommand_organization_member.py +1 -3
- annofabcli/project/change_organization_of_project.py +3 -3
- annofabcli/project/change_project_status.py +3 -3
- annofabcli/project/copy_project.py +4 -4
- annofabcli/project/create_project.py +7 -7
- annofabcli/project/diff_projects.py +4 -5
- annofabcli/project/list_project.py +4 -4
- annofabcli/project/put_project.py +1 -2
- annofabcli/project/subcommand_project.py +1 -2
- annofabcli/project/update_configuration.py +3 -3
- annofabcli/project/update_project.py +6 -8
- annofabcli/project_member/change_project_members.py +7 -7
- annofabcli/project_member/copy_project_members.py +3 -3
- annofabcli/project_member/drop_project_members.py +1 -2
- annofabcli/project_member/invite_project_members.py +1 -3
- annofabcli/project_member/list_users.py +1 -2
- annofabcli/project_member/put_project_members.py +5 -5
- annofabcli/project_member/subcommand_project_member.py +1 -3
- annofabcli/stat_visualization/mask_visualization_dir.py +8 -9
- annofabcli/stat_visualization/merge_visualization_dir.py +6 -7
- annofabcli/stat_visualization/subcommand_stat_visualization.py +1 -2
- annofabcli/stat_visualization/summarize_whole_performance_csv.py +1 -2
- annofabcli/stat_visualization/write_graph.py +2 -3
- annofabcli/stat_visualization/write_performance_rating_csv.py +20 -27
- annofabcli/statistics/histogram.py +5 -6
- annofabcli/statistics/linegraph.py +13 -14
- annofabcli/statistics/list_annotation_area.py +38 -13
- annofabcli/statistics/list_annotation_attribute.py +9 -10
- annofabcli/statistics/list_annotation_attribute_filled_count.py +30 -31
- annofabcli/statistics/list_annotation_count.py +57 -58
- annofabcli/statistics/list_annotation_duration.py +33 -34
- annofabcli/statistics/list_video_duration.py +4 -5
- annofabcli/statistics/list_worktime.py +3 -3
- annofabcli/statistics/scatter.py +9 -8
- annofabcli/statistics/subcommand_statistics.py +1 -4
- annofabcli/statistics/summarize_task_count.py +4 -6
- annofabcli/statistics/summarize_task_count_by_task_id_group.py +2 -4
- annofabcli/statistics/summarize_task_count_by_user.py +1 -3
- annofabcli/statistics/visualization/dataframe/annotation_count.py +5 -4
- annofabcli/statistics/visualization/dataframe/annotation_duration.py +2 -3
- annofabcli/statistics/visualization/dataframe/cumulative_productivity.py +15 -17
- annofabcli/statistics/visualization/dataframe/productivity_per_date.py +17 -19
- annofabcli/statistics/visualization/dataframe/project_performance.py +3 -12
- annofabcli/statistics/visualization/dataframe/task.py +11 -12
- annofabcli/statistics/visualization/dataframe/task_worktime_by_phase_user.py +9 -10
- annofabcli/statistics/visualization/dataframe/user_performance.py +21 -19
- annofabcli/statistics/visualization/dataframe/whole_performance.py +3 -4
- annofabcli/statistics/visualization/dataframe/whole_productivity_per_date.py +12 -14
- annofabcli/statistics/visualization/dataframe/worktime_per_date.py +11 -13
- annofabcli/statistics/visualization/filtering_query.py +7 -7
- annofabcli/statistics/visualization/project_dir.py +27 -14
- annofabcli/statistics/visualize_annotation_count.py +22 -23
- annofabcli/statistics/visualize_annotation_duration.py +21 -22
- annofabcli/statistics/visualize_statistics.py +36 -33
- annofabcli/statistics/visualize_video_duration.py +18 -20
- annofabcli/supplementary/delete_supplementary_data.py +4 -4
- annofabcli/supplementary/list_supplementary_data.py +3 -3
- annofabcli/supplementary/put_supplementary_data.py +8 -8
- annofabcli/supplementary/subcommand_supplementary.py +1 -3
- annofabcli/task/cancel_acceptance.py +16 -17
- annofabcli/task/change_operator.py +10 -12
- annofabcli/task/change_status_to_break.py +7 -9
- annofabcli/task/change_status_to_on_hold.py +10 -12
- annofabcli/task/complete_tasks.py +17 -18
- annofabcli/task/copy_tasks.py +3 -5
- annofabcli/task/delete_metadata_key_of_task.py +4 -6
- annofabcli/task/delete_tasks.py +6 -6
- annofabcli/task/download_task_json.py +4 -6
- annofabcli/task/list_all_tasks.py +7 -7
- annofabcli/task/list_all_tasks_added_task_history.py +12 -12
- annofabcli/task/list_tasks.py +6 -6
- annofabcli/task/list_tasks_added_task_history.py +9 -9
- annofabcli/task/put_tasks.py +4 -5
- annofabcli/task/put_tasks_by_count.py +1 -2
- annofabcli/task/reject_tasks.py +18 -20
- annofabcli/task/subcommand_task.py +1 -3
- annofabcli/task/update_metadata_of_task.py +5 -6
- annofabcli/task_history/download_task_history_json.py +4 -6
- annofabcli/task_history/list_all_task_history.py +5 -6
- annofabcli/task_history/list_task_history.py +3 -4
- annofabcli/task_history/subcommand_task_history.py +1 -3
- annofabcli/task_history_event/download_task_history_event_json.py +4 -6
- annofabcli/task_history_event/list_all_task_history_event.py +6 -6
- annofabcli/task_history_event/list_worktime.py +15 -15
- annofabcli/task_history_event/subcommand_task_history_event.py +1 -2
- {annofabcli-1.111.2.dist-info → annofabcli-1.112.0.dist-info}/METADATA +9 -15
- annofabcli-1.112.0.dist-info/RECORD +229 -0
- {annofabcli-1.111.2.dist-info → annofabcli-1.112.0.dist-info}/WHEEL +1 -1
- annofabcli-1.111.2.dist-info/RECORD +0 -228
- {annofabcli-1.111.2.dist-info → annofabcli-1.112.0.dist-info}/entry_points.txt +0 -0
- {annofabcli-1.111.2.dist-info → annofabcli-1.112.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -8,12 +8,10 @@ import multiprocessing
|
|
|
8
8
|
import sys
|
|
9
9
|
from collections.abc import Collection
|
|
10
10
|
from functools import partial
|
|
11
|
-
from typing import Optional
|
|
12
11
|
|
|
13
12
|
import annofabapi
|
|
14
13
|
from annofabapi.models import ProjectMemberRole
|
|
15
14
|
|
|
16
|
-
import annofabcli
|
|
17
15
|
import annofabcli.common.cli
|
|
18
16
|
from annofabcli.common.cli import (
|
|
19
17
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -40,7 +38,7 @@ class DeleteMetadataKeyOfInputDataMain(CommandLineWithConfirm):
|
|
|
40
38
|
self.project_id = project_id
|
|
41
39
|
super().__init__(all_yes=all_yes)
|
|
42
40
|
|
|
43
|
-
def delete_metadata_keys_for_one_input_data(self, input_data_id: str, metadata_keys: Collection[str], *, input_data_index:
|
|
41
|
+
def delete_metadata_keys_for_one_input_data(self, input_data_id: str, metadata_keys: Collection[str], *, input_data_index: int | None = None) -> bool:
|
|
44
42
|
"""
|
|
45
43
|
1個の入力データに対して、メタデータのキーを削除します。
|
|
46
44
|
|
|
@@ -100,7 +98,7 @@ class DeleteMetadataKeyOfInputDataMain(CommandLineWithConfirm):
|
|
|
100
98
|
logger.warning(f"input_data_id='{input_data_id}' :: 入力データのメタデータのキーを削除するのに失敗しました。", exc_info=True)
|
|
101
99
|
return False
|
|
102
100
|
|
|
103
|
-
def delete_metadata_keys_for_input_data_list(self, input_data_id_list: list[str], metadata_keys: Collection[str], *, parallelism:
|
|
101
|
+
def delete_metadata_keys_for_input_data_list(self, input_data_id_list: list[str], metadata_keys: Collection[str], *, parallelism: int | None = None) -> None:
|
|
104
102
|
logger.info(f"{len(input_data_id_list)} 件の入力データのメタデータから、キー'{metadata_keys}'を削除します。")
|
|
105
103
|
|
|
106
104
|
success_count = 0
|
|
@@ -185,7 +183,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
185
183
|
parser.set_defaults(subcommand_func=main)
|
|
186
184
|
|
|
187
185
|
|
|
188
|
-
def add_parser(subparsers:
|
|
186
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
189
187
|
subcommand_name = "delete_metadata_key"
|
|
190
188
|
subcommand_help = "入力データのメタデータのキーを削除します。"
|
|
191
189
|
epilog = "オーナロールを持つユーザで実行してください。"
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import logging
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from annofabapi.models import ProjectMemberRole
|
|
7
6
|
|
|
8
|
-
import annofabcli
|
|
9
7
|
import annofabcli.common.cli
|
|
10
8
|
from annofabcli.common.cli import CommandLine, build_annofabapi_resource_and_login
|
|
11
9
|
from annofabcli.common.download import DownloadingFile
|
|
@@ -15,10 +13,10 @@ logger = logging.getLogger(__name__)
|
|
|
15
13
|
|
|
16
14
|
|
|
17
15
|
class DownloadingInputData(CommandLine):
|
|
18
|
-
def download_input_data_json(self, project_id: str, output_file: Path, is_latest: bool): # noqa:
|
|
16
|
+
def download_input_data_json(self, project_id: str, output_file: Path, is_latest: bool) -> None: # noqa: FBT001
|
|
19
17
|
super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.TRAINING_DATA_USER])
|
|
20
18
|
project_title = self.facade.get_project_title(project_id)
|
|
21
|
-
logger.info(f"{project_title}
|
|
19
|
+
logger.info(f"project_id='{project_id}'の入力データ全件ファイルをダウンロードします。 :: project_title='{project_title}'")
|
|
22
20
|
|
|
23
21
|
obj = DownloadingFile(self.service)
|
|
24
22
|
obj.download_input_data_json(
|
|
@@ -26,7 +24,7 @@ class DownloadingInputData(CommandLine):
|
|
|
26
24
|
str(output_file),
|
|
27
25
|
is_latest=is_latest,
|
|
28
26
|
)
|
|
29
|
-
logger.info(f"
|
|
27
|
+
logger.info(f"project_id='{project_id}'の入力データ全件ファイルをダウンロードしました。 :: output='{output_file}', project_title='{project_title}'")
|
|
30
28
|
|
|
31
29
|
def main(self) -> None:
|
|
32
30
|
args = self.args
|
|
@@ -58,7 +56,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
58
56
|
parser.set_defaults(subcommand_func=main)
|
|
59
57
|
|
|
60
58
|
|
|
61
|
-
def add_parser(subparsers:
|
|
59
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
62
60
|
subcommand_name = "download"
|
|
63
61
|
subcommand_help = "入力データ全件ファイルをダウンロードします。"
|
|
64
62
|
epilog = "オーナロールまたはアノテーションユーザロールを持つユーザで実行してください。"
|
|
@@ -6,7 +6,7 @@ import json
|
|
|
6
6
|
import logging
|
|
7
7
|
import tempfile
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Any
|
|
9
|
+
from typing import Any
|
|
10
10
|
|
|
11
11
|
import annofabapi
|
|
12
12
|
import pandas
|
|
@@ -23,7 +23,7 @@ from annofabcli.input_data.utils import remove_unnecessary_keys_from_input_data
|
|
|
23
23
|
|
|
24
24
|
logger = logging.getLogger(__name__)
|
|
25
25
|
|
|
26
|
-
DatetimeRange = tuple[
|
|
26
|
+
DatetimeRange = tuple[datetime.datetime | None, datetime.datetime | None]
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
class ListInputDataWithJsonMain:
|
|
@@ -33,8 +33,8 @@ class ListInputDataWithJsonMain:
|
|
|
33
33
|
@staticmethod
|
|
34
34
|
def filter_input_data_list(
|
|
35
35
|
input_data: dict[str, Any],
|
|
36
|
-
input_data_id_set:
|
|
37
|
-
input_data_query:
|
|
36
|
+
input_data_id_set: set[str] | None = None,
|
|
37
|
+
input_data_query: InputDataQuery | None = None,
|
|
38
38
|
) -> bool:
|
|
39
39
|
result = True
|
|
40
40
|
|
|
@@ -64,10 +64,10 @@ class ListInputDataWithJsonMain:
|
|
|
64
64
|
def get_input_data_list(
|
|
65
65
|
self,
|
|
66
66
|
project_id: str,
|
|
67
|
-
input_data_json:
|
|
67
|
+
input_data_json: Path | None,
|
|
68
68
|
*,
|
|
69
|
-
input_data_id_list:
|
|
70
|
-
input_data_query:
|
|
69
|
+
input_data_id_list: list[str] | None = None,
|
|
70
|
+
input_data_query: InputDataQuery | None = None,
|
|
71
71
|
contain_parent_task_id_list: bool = False,
|
|
72
72
|
contain_supplementary_data_count: bool = False,
|
|
73
73
|
is_latest: bool = False,
|
|
@@ -209,7 +209,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
209
209
|
parser.set_defaults(subcommand_func=main)
|
|
210
210
|
|
|
211
211
|
|
|
212
|
-
def add_parser(subparsers:
|
|
212
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
213
213
|
subcommand_name = "list_all"
|
|
214
214
|
subcommand_help = "すべての入力データの一覧を出力します。"
|
|
215
215
|
description = "すべての入力データの一覧を出力します。\n出力される入力データは、コマンドを実行した日の02:00(JST)頃の状態です。最新の情報を出力したい場合は、 ``--latest`` を指定してください。"
|
|
@@ -7,7 +7,7 @@ import logging
|
|
|
7
7
|
import sys
|
|
8
8
|
from collections import defaultdict
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
10
|
+
from typing import Any
|
|
11
11
|
|
|
12
12
|
import pandas
|
|
13
13
|
from annofabapi.dataclass.input import InputData
|
|
@@ -105,8 +105,8 @@ def create_df_input_data_with_merged_task(input_data_list: list[dict[str, Any]])
|
|
|
105
105
|
|
|
106
106
|
def match_input_data(
|
|
107
107
|
input_data: dict[str, Any],
|
|
108
|
-
input_data_id_set:
|
|
109
|
-
input_data_query:
|
|
108
|
+
input_data_id_set: set[str] | None = None,
|
|
109
|
+
input_data_query: InputDataQuery | None = None,
|
|
110
110
|
) -> bool:
|
|
111
111
|
result = True
|
|
112
112
|
|
|
@@ -273,7 +273,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
273
273
|
parser.set_defaults(subcommand_func=main)
|
|
274
274
|
|
|
275
275
|
|
|
276
|
-
def add_parser(subparsers:
|
|
276
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
277
277
|
subcommand_name = "list_all_merged_task"
|
|
278
278
|
subcommand_help = "タスク一覧と結合したすべての入力データ一覧の情報を出力します。"
|
|
279
279
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import logging
|
|
3
3
|
import urllib.parse
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
import annofabapi
|
|
7
7
|
import pandas
|
|
@@ -122,8 +122,8 @@ class ListInputDataMain:
|
|
|
122
122
|
def get_input_data_list(
|
|
123
123
|
self,
|
|
124
124
|
*,
|
|
125
|
-
input_data_id_list:
|
|
126
|
-
input_data_query:
|
|
125
|
+
input_data_id_list: list[str] | None = None,
|
|
126
|
+
input_data_query: dict[str, Any] | None = None,
|
|
127
127
|
contain_parent_task_id_list: bool = False,
|
|
128
128
|
contain_supplementary_data_count: bool = False,
|
|
129
129
|
) -> list[InputData]:
|
|
@@ -235,7 +235,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
235
235
|
parser.set_defaults(subcommand_func=main)
|
|
236
236
|
|
|
237
237
|
|
|
238
|
-
def add_parser(subparsers:
|
|
238
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
239
239
|
subcommand_name = "list"
|
|
240
240
|
subcommand_help = "入力データ一覧を出力します。"
|
|
241
241
|
description = "入力データ一覧を出力します。Annofabの制約上、10,000件までしか出力されません。"
|
|
@@ -6,7 +6,7 @@ from dataclasses import dataclass
|
|
|
6
6
|
from functools import partial
|
|
7
7
|
from multiprocessing import Pool
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Any
|
|
9
|
+
from typing import Any
|
|
10
10
|
|
|
11
11
|
import annofabapi
|
|
12
12
|
import pandas
|
|
@@ -39,7 +39,7 @@ class CsvInputData(DataClassJsonMixin):
|
|
|
39
39
|
|
|
40
40
|
input_data_name: str
|
|
41
41
|
input_data_path: str
|
|
42
|
-
input_data_id:
|
|
42
|
+
input_data_id: str | None = None
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
@dataclass
|
|
@@ -129,7 +129,7 @@ class SubPutInputData:
|
|
|
129
129
|
self.facade = facade
|
|
130
130
|
self.all_yes = all_yes
|
|
131
131
|
|
|
132
|
-
def put_input_data(self, project_id: str, csv_input_data: InputDataForPut, last_updated_datetime:
|
|
132
|
+
def put_input_data(self, project_id: str, csv_input_data: InputDataForPut, last_updated_datetime: str | None = None) -> None:
|
|
133
133
|
request_body: dict[str, Any] = {"last_updated_datetime": last_updated_datetime}
|
|
134
134
|
|
|
135
135
|
file_path = get_file_scheme_path(csv_input_data.input_data_path)
|
|
@@ -246,7 +246,7 @@ class PutInputData(CommandLine):
|
|
|
246
246
|
project_id: str,
|
|
247
247
|
input_data_list: list[CsvInputData],
|
|
248
248
|
overwrite: bool = False, # noqa: FBT001, FBT002
|
|
249
|
-
parallelism:
|
|
249
|
+
parallelism: int | None = None,
|
|
250
250
|
) -> None:
|
|
251
251
|
"""
|
|
252
252
|
入力データを一括で登録する。
|
|
@@ -423,7 +423,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
423
423
|
parser.set_defaults(subcommand_func=main)
|
|
424
424
|
|
|
425
425
|
|
|
426
|
-
def add_parser(subparsers:
|
|
426
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
427
427
|
subcommand_name = "put"
|
|
428
428
|
subcommand_help = "入力データを登録します。"
|
|
429
429
|
epilog = "オーナロールを持つユーザで実行してください。"
|
|
@@ -4,7 +4,6 @@ import sys
|
|
|
4
4
|
import uuid
|
|
5
5
|
import zipfile
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import Optional
|
|
8
7
|
|
|
9
8
|
from annofabapi.models import ProjectJobType, ProjectMemberRole
|
|
10
9
|
|
|
@@ -35,7 +34,7 @@ class PutInputData(CommandLine):
|
|
|
35
34
|
project_id: str,
|
|
36
35
|
zip_file: Path,
|
|
37
36
|
wait_options: WaitOptions,
|
|
38
|
-
input_data_name_prefix:
|
|
37
|
+
input_data_name_prefix: str | None = None,
|
|
39
38
|
wait: bool = False, # noqa: FBT001, FBT002
|
|
40
39
|
) -> None:
|
|
41
40
|
"""
|
|
@@ -137,7 +136,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
137
136
|
parser.set_defaults(subcommand_func=main)
|
|
138
137
|
|
|
139
138
|
|
|
140
|
-
def add_parser(subparsers:
|
|
139
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
141
140
|
subcommand_name = "put_with_zip"
|
|
142
141
|
subcommand_help = "zipファイルを入力データとして登録します。"
|
|
143
142
|
description = "zipファイルを入力データとして登録します。"
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import argparse
|
|
2
|
-
from typing import Optional
|
|
3
2
|
|
|
4
|
-
import annofabcli
|
|
5
3
|
import annofabcli.common.cli
|
|
6
4
|
import annofabcli.input_data.copy_input_data
|
|
7
5
|
import annofabcli.input_data.delete_input_data
|
|
@@ -33,7 +31,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
33
31
|
annofabcli.input_data.update_metadata_of_input_data.add_parser(subparsers)
|
|
34
32
|
|
|
35
33
|
|
|
36
|
-
def add_parser(subparsers:
|
|
34
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
37
35
|
subcommand_name = "input_data"
|
|
38
36
|
subcommand_help = "入力データ関係のサブコマンド"
|
|
39
37
|
description = "入力データ関係のサブコマンド"
|
|
@@ -9,13 +9,11 @@ from dataclasses import dataclass
|
|
|
9
9
|
from enum import Enum
|
|
10
10
|
from functools import partial
|
|
11
11
|
from pathlib import Path
|
|
12
|
-
from typing import Optional
|
|
13
12
|
|
|
14
13
|
import annofabapi
|
|
15
14
|
import pandas
|
|
16
15
|
from dataclasses_json import DataClassJsonMixin
|
|
17
16
|
|
|
18
|
-
import annofabcli
|
|
19
17
|
import annofabcli.common.cli
|
|
20
18
|
from annofabcli.common.cli import (
|
|
21
19
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -50,9 +48,9 @@ class UpdatedInputData(DataClassJsonMixin):
|
|
|
50
48
|
|
|
51
49
|
input_data_id: str
|
|
52
50
|
"""更新対象の入力データを表すID"""
|
|
53
|
-
input_data_name:
|
|
51
|
+
input_data_name: str | None = None
|
|
54
52
|
"""変更後の入力データ名(指定した場合のみ更新)"""
|
|
55
|
-
input_data_path:
|
|
53
|
+
input_data_path: str | None = None
|
|
56
54
|
"""変更後の入力データパス(指定した場合のみ更新)"""
|
|
57
55
|
|
|
58
56
|
|
|
@@ -66,9 +64,9 @@ class UpdateInputDataMain(CommandLineWithConfirm):
|
|
|
66
64
|
project_id: str,
|
|
67
65
|
input_data_id: str,
|
|
68
66
|
*,
|
|
69
|
-
new_input_data_name:
|
|
70
|
-
new_input_data_path:
|
|
71
|
-
input_data_index:
|
|
67
|
+
new_input_data_name: str | None = None,
|
|
68
|
+
new_input_data_path: str | None = None,
|
|
69
|
+
input_data_index: int | None = None,
|
|
72
70
|
) -> UpdateResult:
|
|
73
71
|
"""
|
|
74
72
|
1個の入力データを更新します。
|
|
@@ -299,7 +297,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
299
297
|
parser.set_defaults(subcommand_func=main)
|
|
300
298
|
|
|
301
299
|
|
|
302
|
-
def add_parser(subparsers:
|
|
300
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
303
301
|
subcommand_name = "update"
|
|
304
302
|
subcommand_help = "入力データの名前または入力データのパスを更新します。"
|
|
305
303
|
epilog = "オーナロールを持つユーザで実行してください。"
|
|
@@ -8,12 +8,10 @@ import multiprocessing
|
|
|
8
8
|
import sys
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from functools import partial
|
|
11
|
-
from typing import Optional
|
|
12
11
|
|
|
13
12
|
import annofabapi
|
|
14
13
|
from annofabapi.models import ProjectMemberRole
|
|
15
14
|
|
|
16
|
-
import annofabcli
|
|
17
15
|
import annofabcli.common.cli
|
|
18
16
|
from annofabcli.common.cli import (
|
|
19
17
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -52,7 +50,7 @@ class UpdateMetadataMain(CommandLineWithConfirm):
|
|
|
52
50
|
metadata: Metadata,
|
|
53
51
|
*,
|
|
54
52
|
overwrite_metadata: bool = False,
|
|
55
|
-
input_data_index:
|
|
53
|
+
input_data_index: int | None = None,
|
|
56
54
|
) -> bool:
|
|
57
55
|
def get_confirm_message() -> str:
|
|
58
56
|
if overwrite_metadata:
|
|
@@ -97,7 +95,7 @@ class UpdateMetadataMain(CommandLineWithConfirm):
|
|
|
97
95
|
metadata_by_input_data_id: dict[str, Metadata],
|
|
98
96
|
*,
|
|
99
97
|
overwrite_metadata: bool = False,
|
|
100
|
-
parallelism:
|
|
98
|
+
parallelism: int | None = None,
|
|
101
99
|
) -> None:
|
|
102
100
|
metadata_info_list = [InputDataMetadataInfo(input_data_id, metadata) for input_data_id, metadata in metadata_by_input_data_id.items()]
|
|
103
101
|
if overwrite_metadata:
|
|
@@ -256,7 +254,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
256
254
|
parser.set_defaults(subcommand_func=main)
|
|
257
255
|
|
|
258
256
|
|
|
259
|
-
def add_parser(subparsers:
|
|
257
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
260
258
|
subcommand_name = "update_metadata"
|
|
261
259
|
subcommand_help = "入力データのメタデータを更新します。"
|
|
262
260
|
description = "入力データのメタデータを更新します。"
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import logging
|
|
3
3
|
import mimetypes
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
import requests
|
|
7
6
|
from annofabapi.models import ProjectMemberRole
|
|
@@ -36,7 +35,7 @@ class CopyInstruction(CommandLine):
|
|
|
36
35
|
return url_without_query.split("/")[-1]
|
|
37
36
|
|
|
38
37
|
@staticmethod
|
|
39
|
-
def _get_mime_type_from_filename(filename:
|
|
38
|
+
def _get_mime_type_from_filename(filename: str | None) -> str:
|
|
40
39
|
"""
|
|
41
40
|
ファイル名からMIME TYPEを取得する。
|
|
42
41
|
"""
|
|
@@ -47,7 +46,7 @@ class CopyInstruction(CommandLine):
|
|
|
47
46
|
content_type = mimetypes.guess_type(filename)[0]
|
|
48
47
|
return content_type if content_type is not None else DEFAULT_MIME_TYPE
|
|
49
48
|
|
|
50
|
-
def upload_instruction_image(self, src_project_id: str, dest_project_id: str, pq_img: PyQuery) ->
|
|
49
|
+
def upload_instruction_image(self, src_project_id: str, dest_project_id: str, pq_img: PyQuery) -> str | None:
|
|
51
50
|
"""
|
|
52
51
|
コピー元の作業ガイド画像を、コピー先にアップロードする。
|
|
53
52
|
Args:
|
|
@@ -60,7 +59,7 @@ class CopyInstruction(CommandLine):
|
|
|
60
59
|
|
|
61
60
|
"""
|
|
62
61
|
|
|
63
|
-
src_instruction_image_url:
|
|
62
|
+
src_instruction_image_url: str | None = pq_img.attr["src"]
|
|
64
63
|
if src_instruction_image_url is None:
|
|
65
64
|
logger.warning(f"{pq_img=} にsrc属性がないのでスキップします。")
|
|
66
65
|
return None
|
|
@@ -148,7 +147,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
148
147
|
parser.set_defaults(subcommand_func=main)
|
|
149
148
|
|
|
150
149
|
|
|
151
|
-
def add_parser(subparsers:
|
|
150
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
152
151
|
subcommand_name = "copy"
|
|
153
152
|
subcommand_help = "作業ガイドをコピーします。"
|
|
154
153
|
description = "作業ガイドを別プロジェクトにコピーします。"
|
|
@@ -2,7 +2,6 @@ import argparse
|
|
|
2
2
|
import logging.handlers
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Optional
|
|
6
5
|
|
|
7
6
|
import annofabapi
|
|
8
7
|
import pyquery
|
|
@@ -62,7 +61,7 @@ class DownloadInstructionMain:
|
|
|
62
61
|
img_dir = output_dir / "img"
|
|
63
62
|
img_dir.mkdir(exist_ok=True, parents=True)
|
|
64
63
|
for img_elm in pq_img:
|
|
65
|
-
src_value:
|
|
64
|
+
src_value: str | None = img_elm.attrib.get("src")
|
|
66
65
|
if src_value is None:
|
|
67
66
|
continue
|
|
68
67
|
|
|
@@ -81,7 +80,7 @@ class DownloadInstructionMain:
|
|
|
81
80
|
|
|
82
81
|
return pq.outer_html()
|
|
83
82
|
|
|
84
|
-
def download_instruction(self, project_id: str, output_dir: Path, history_id:
|
|
83
|
+
def download_instruction(self, project_id: str, output_dir: Path, history_id: str | None = None, is_download_image: bool = False): # noqa: ANN201, FBT001, FBT002
|
|
85
84
|
"""
|
|
86
85
|
作業ガイドをダウンロードする
|
|
87
86
|
|
|
@@ -115,7 +114,7 @@ class DownloadInstructionMain:
|
|
|
115
114
|
class DownloadInstruction(CommandLine):
|
|
116
115
|
COMMON_MESSAGE = "annofabcli instruction download"
|
|
117
116
|
|
|
118
|
-
def get_history_id_from_before_index(self, project_id: str, before: int) ->
|
|
117
|
+
def get_history_id_from_before_index(self, project_id: str, before: int) -> str | None:
|
|
119
118
|
histories, _ = self.service.api.get_instruction_history(project_id, query_params={"limit": 10000})
|
|
120
119
|
if before + 1 > len(histories):
|
|
121
120
|
logger.warning(f"作業ガイドの変更履歴は{len(histories)}個のため、最新より{before}個前の作業ガイドは見つかりませんでした。")
|
|
@@ -190,7 +189,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
190
189
|
parser.set_defaults(subcommand_func=main)
|
|
191
190
|
|
|
192
191
|
|
|
193
|
-
def add_parser(subparsers:
|
|
192
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
194
193
|
subcommand_name = "download"
|
|
195
194
|
subcommand_help = "作業ガイドをダウンロードします。"
|
|
196
195
|
description = "作業ガイドをダウンロードします。HTMLファイルにはbodyタグの内部が記載されています。"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
import annofabcli
|
|
6
6
|
from annofabcli.common.cli import ArgumentParser, CommandLine, build_annofabapi_resource_and_login
|
|
@@ -45,7 +45,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
45
45
|
parser.set_defaults(subcommand_func=main)
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def add_parser(subparsers:
|
|
48
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
49
49
|
subcommand_name = "list_history"
|
|
50
50
|
subcommand_help = "作業ガイドの変更履歴を出力します。"
|
|
51
51
|
description = "作業ガイドの変更履歴を出力します。"
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import argparse
|
|
2
|
-
from typing import Optional
|
|
3
2
|
|
|
4
|
-
import annofabcli
|
|
5
3
|
import annofabcli.common.cli
|
|
6
4
|
import annofabcli.instruction.copy_instruction
|
|
7
5
|
import annofabcli.instruction.download_instruction
|
|
@@ -19,7 +17,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
19
17
|
annofabcli.instruction.upload_instruction.add_parser(subparsers)
|
|
20
18
|
|
|
21
19
|
|
|
22
|
-
def add_parser(subparsers:
|
|
20
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
23
21
|
subcommand_name = "instruction"
|
|
24
22
|
subcommand_help = "作業ガイド関係のサブコマンド"
|
|
25
23
|
description = "作業ガイド関係のサブコマンド"
|
|
@@ -7,7 +7,6 @@ import logging.handlers
|
|
|
7
7
|
import tempfile
|
|
8
8
|
import uuid
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Optional
|
|
11
10
|
|
|
12
11
|
import pyquery
|
|
13
12
|
from datauri import DataURI
|
|
@@ -60,7 +59,7 @@ class UploadInstruction(CommandLine):
|
|
|
60
59
|
img_path_dict: dict[str, str] = {}
|
|
61
60
|
# 画像をすべてアップロードして、img要素のsrc属性値を annofab urlに変更する
|
|
62
61
|
for img_elm in pq_img:
|
|
63
|
-
src_value:
|
|
62
|
+
src_value: str | None = img_elm.attrib.get("src")
|
|
64
63
|
if src_value is None:
|
|
65
64
|
continue
|
|
66
65
|
|
|
@@ -144,7 +143,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
144
143
|
parser.set_defaults(subcommand_func=main)
|
|
145
144
|
|
|
146
145
|
|
|
147
|
-
def add_parser(subparsers:
|
|
146
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
148
147
|
subcommand_name = "upload"
|
|
149
148
|
subcommand_help = "HTMLファイルを作業ガイドとして登録します。"
|
|
150
149
|
description = "HTMLファイルを作業ガイドとして登録します。img要素のsrc属性がローカルの画像を参照している場合(http, https, dataスキーマが付与されていない)、画像もアップロードします。"
|
annofabcli/job/delete_job.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Optional
|
|
4
3
|
|
|
5
4
|
import annofabapi
|
|
6
5
|
from annofabapi.models import ProjectJobType, ProjectMemberRole
|
|
@@ -77,7 +76,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
77
76
|
parser.set_defaults(subcommand_func=main)
|
|
78
77
|
|
|
79
78
|
|
|
80
|
-
def add_parser(subparsers:
|
|
79
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
81
80
|
subcommand_name = "delete"
|
|
82
81
|
subcommand_help = "ジョブを削除する。"
|
|
83
82
|
description = "ジョブを削除する。"
|
annofabcli/job/list_job.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import copy
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
from annofabapi.models import ProjectJobInfo, ProjectJobType
|
|
7
7
|
|
|
@@ -18,7 +18,7 @@ class ListJob(CommandLine):
|
|
|
18
18
|
ジョブ一覧を表示する。
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
-
def get_job_list(self, project_id: str, job_type: ProjectJobType, job_query:
|
|
21
|
+
def get_job_list(self, project_id: str, job_type: ProjectJobType, job_query: dict[str, Any] | None = None) -> list[ProjectJobInfo]:
|
|
22
22
|
"""
|
|
23
23
|
ジョブ一覧を取得する。
|
|
24
24
|
"""
|
|
@@ -34,7 +34,7 @@ class ListJob(CommandLine):
|
|
|
34
34
|
job_list = self.service.wrapper.get_all_project_job(project_id, query_params=query_params)
|
|
35
35
|
return job_list
|
|
36
36
|
|
|
37
|
-
def print_job_list(self, project_id: str, job_type: ProjectJobType, job_query:
|
|
37
|
+
def print_job_list(self, project_id: str, job_type: ProjectJobType, job_query: dict[str, Any] | None = None) -> None:
|
|
38
38
|
"""
|
|
39
39
|
ジョブ一覧を出力する
|
|
40
40
|
|
|
@@ -83,7 +83,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
83
83
|
parser.set_defaults(subcommand_func=main)
|
|
84
84
|
|
|
85
85
|
|
|
86
|
-
def add_parser(subparsers:
|
|
86
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
87
87
|
subcommand_name = "list"
|
|
88
88
|
subcommand_help = "ジョブ一覧を出力します。"
|
|
89
89
|
description = "ジョブ一覧を出力します。"
|
annofabcli/job/list_last_job.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import logging
|
|
3
3
|
import sys
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
from annofabapi.models import Project, ProjectJobInfo, ProjectJobType
|
|
7
7
|
|
|
@@ -23,7 +23,7 @@ class ListLastJob(CommandLine):
|
|
|
23
23
|
ジョブ一覧を表示する。
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
|
-
def get_last_job(self, project_id: str, job_type: ProjectJobType) ->
|
|
26
|
+
def get_last_job(self, project_id: str, job_type: ProjectJobType) -> ProjectJobInfo | None:
|
|
27
27
|
"""
|
|
28
28
|
最新のジョブを取得する。ジョブが存在しない場合はNoneを返す。
|
|
29
29
|
|
|
@@ -163,7 +163,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
163
163
|
parser.set_defaults(subcommand_func=main)
|
|
164
164
|
|
|
165
165
|
|
|
166
|
-
def add_parser(subparsers:
|
|
166
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
167
167
|
subcommand_name = "list_last"
|
|
168
168
|
subcommand_help = "複数のプロジェクトに対して、最新のジョブを出力します。"
|
|
169
169
|
description = "複数のプロジェクトに対して、最新のジョブを出力します。"
|
annofabcli/job/subcommand_job.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import argparse
|
|
2
|
-
from typing import Optional
|
|
3
2
|
|
|
4
|
-
import annofabcli
|
|
5
3
|
import annofabcli.common.cli
|
|
6
4
|
import annofabcli.job.delete_job
|
|
7
5
|
import annofabcli.job.list_job
|
|
@@ -20,7 +18,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
20
18
|
annofabcli.job.wait_job.add_parser(subparsers)
|
|
21
19
|
|
|
22
20
|
|
|
23
|
-
def add_parser(subparsers:
|
|
21
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
24
22
|
subcommand_name = "job"
|
|
25
23
|
subcommand_help = "ジョブ関係のサブコマンド"
|
|
26
24
|
description = "ジョブ関係のサブコマンド"
|
annofabcli/job/wait_job.py
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import dataclasses
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
import annofabapi
|
|
7
7
|
from annofabapi.models import ProjectJobType
|
|
8
8
|
|
|
9
|
-
import annofabcli
|
|
10
9
|
import annofabcli.common.cli
|
|
11
10
|
from annofabcli.common.cli import (
|
|
12
11
|
ArgumentParser,
|
|
@@ -20,7 +19,7 @@ from annofabcli.common.facade import AnnofabApiFacade
|
|
|
20
19
|
logger = logging.getLogger(__name__)
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
def get_wait_options_from_args(dict_wait_options:
|
|
22
|
+
def get_wait_options_from_args(dict_wait_options: dict[str, Any] | None) -> WaitOptions:
|
|
24
23
|
"""
|
|
25
24
|
デフォルト値とマージして、wait_optionsを取得する。
|
|
26
25
|
|
|
@@ -45,7 +44,7 @@ class WaitJobMain:
|
|
|
45
44
|
self.service = service
|
|
46
45
|
self.facade = AnnofabApiFacade(service)
|
|
47
46
|
|
|
48
|
-
def wait_job(self, project_id: str, job_type: ProjectJobType, wait_options: WaitOptions, job_id:
|
|
47
|
+
def wait_job(self, project_id: str, job_type: ProjectJobType, wait_options: WaitOptions, job_id: str | None = None) -> None:
|
|
49
48
|
MAX_WAIT_MINUTE = wait_options.max_tries * wait_options.interval / 60 # noqa: N806
|
|
50
49
|
logger.info(f"job_type='{job_type.value}', job_id='{job_id}' :: ジョブが完了するまで、最大{MAX_WAIT_MINUTE}分間待ちます。")
|
|
51
50
|
result = self.service.wrapper.wait_until_job_finished(
|
|
@@ -100,7 +99,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
100
99
|
parser.set_defaults(subcommand_func=main)
|
|
101
100
|
|
|
102
101
|
|
|
103
|
-
def add_parser(subparsers:
|
|
102
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
104
103
|
subcommand_name = "wait"
|
|
105
104
|
subcommand_help = "ジョブの終了を待ちます。"
|
|
106
105
|
description = "ジョブの終了を待ちます。"
|