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.
Files changed (184) hide show
  1. annofabcli/__main__.py +1 -2
  2. annofabcli/annotation/annotation_query.py +10 -10
  3. annofabcli/annotation/change_annotation_attributes.py +9 -9
  4. annofabcli/annotation/change_annotation_attributes_per_annotation.py +3 -4
  5. annofabcli/annotation/change_annotation_properties.py +13 -13
  6. annofabcli/annotation/copy_annotation.py +5 -5
  7. annofabcli/annotation/create_classification_annotation.py +6 -6
  8. annofabcli/annotation/delete_annotation.py +8 -8
  9. annofabcli/annotation/download_annotation_zip.py +1 -3
  10. annofabcli/annotation/dump_annotation.py +7 -7
  11. annofabcli/annotation/import_annotation.py +12 -12
  12. annofabcli/annotation/list_annotation.py +8 -8
  13. annofabcli/annotation/list_annotation_count.py +1 -2
  14. annofabcli/annotation/merge_segmentation.py +5 -5
  15. annofabcli/annotation/remove_segmentation_overlap.py +4 -4
  16. annofabcli/annotation/restore_annotation.py +6 -6
  17. annofabcli/annotation/subcommand_annotation.py +1 -2
  18. annofabcli/annotation_specs/add_attribute_restriction.py +4 -5
  19. annofabcli/annotation_specs/attribute_restriction.py +8 -8
  20. annofabcli/annotation_specs/export_annotation_specs.py +4 -5
  21. annofabcli/annotation_specs/get_annotation_specs_with_attribute_id_replaced.py +3 -4
  22. annofabcli/annotation_specs/get_annotation_specs_with_choice_id_replaced.py +3 -4
  23. annofabcli/annotation_specs/get_annotation_specs_with_label_id_replaced.py +3 -4
  24. annofabcli/annotation_specs/list_annotation_specs_attribute.py +9 -10
  25. annofabcli/annotation_specs/list_annotation_specs_choice.py +9 -10
  26. annofabcli/annotation_specs/list_annotation_specs_history.py +2 -2
  27. annofabcli/annotation_specs/list_annotation_specs_label.py +8 -9
  28. annofabcli/annotation_specs/list_annotation_specs_label_attribute.py +10 -11
  29. annofabcli/annotation_specs/list_attribute_restriction.py +2 -4
  30. annofabcli/annotation_specs/list_label_color.py +2 -3
  31. annofabcli/annotation_specs/put_label_color.py +3 -4
  32. annofabcli/annotation_specs/subcommand_annotation_specs.py +1 -3
  33. annofabcli/annotation_zip/list_annotation_3d_bounding_box.py +365 -0
  34. annofabcli/annotation_zip/list_annotation_bounding_box_2d.py +11 -12
  35. annofabcli/annotation_zip/list_range_annotation.py +24 -14
  36. annofabcli/annotation_zip/list_single_point_annotation.py +11 -12
  37. annofabcli/annotation_zip/subcommand_annotation_zip.py +3 -2
  38. annofabcli/annotation_zip/validate_annotation.py +8 -7
  39. annofabcli/comment/delete_comment.py +4 -6
  40. annofabcli/comment/download_comment_json.py +4 -6
  41. annofabcli/comment/list_all_comment.py +5 -6
  42. annofabcli/comment/list_comment.py +3 -4
  43. annofabcli/comment/put_comment.py +9 -10
  44. annofabcli/comment/put_comment_simply.py +5 -6
  45. annofabcli/comment/put_inspection_comment.py +1 -3
  46. annofabcli/comment/put_inspection_comment_simply.py +1 -3
  47. annofabcli/comment/put_onhold_comment.py +1 -3
  48. annofabcli/comment/put_onhold_comment_simply.py +1 -3
  49. annofabcli/comment/subcommand_comment.py +1 -3
  50. annofabcli/common/bokeh.py +4 -4
  51. annofabcli/common/cli.py +17 -17
  52. annofabcli/common/download.py +28 -29
  53. annofabcli/common/facade.py +37 -38
  54. annofabcli/common/image.py +14 -14
  55. annofabcli/common/utils.py +8 -8
  56. annofabcli/common/visualize.py +13 -13
  57. annofabcli/experimental/list_out_of_range_annotation_for_movie.py +3 -4
  58. annofabcli/experimental/subcommand_experimental.py +1 -3
  59. annofabcli/filesystem/draw_annotation.py +26 -26
  60. annofabcli/filesystem/filter_annotation.py +9 -10
  61. annofabcli/filesystem/mask_user_info.py +14 -14
  62. annofabcli/filesystem/merge_annotation.py +8 -8
  63. annofabcli/filesystem/subcommand_filesystem.py +1 -3
  64. annofabcli/input_data/copy_input_data.py +8 -9
  65. annofabcli/input_data/delete_input_data.py +2 -2
  66. annofabcli/input_data/delete_metadata_key_of_input_data.py +3 -5
  67. annofabcli/input_data/download_input_data_json.py +4 -6
  68. annofabcli/input_data/list_all_input_data.py +8 -8
  69. annofabcli/input_data/list_all_input_data_merged_task.py +4 -4
  70. annofabcli/input_data/list_input_data.py +4 -4
  71. annofabcli/input_data/put_input_data.py +5 -5
  72. annofabcli/input_data/put_input_data_with_zip.py +2 -3
  73. annofabcli/input_data/subcommand_input_data.py +1 -3
  74. annofabcli/input_data/update_input_data.py +6 -8
  75. annofabcli/input_data/update_metadata_of_input_data.py +3 -5
  76. annofabcli/instruction/copy_instruction.py +4 -5
  77. annofabcli/instruction/download_instruction.py +4 -5
  78. annofabcli/instruction/list_instruction_history.py +2 -2
  79. annofabcli/instruction/subcommand_instruction.py +1 -3
  80. annofabcli/instruction/upload_instruction.py +2 -3
  81. annofabcli/job/delete_job.py +1 -2
  82. annofabcli/job/list_job.py +4 -4
  83. annofabcli/job/list_last_job.py +3 -3
  84. annofabcli/job/subcommand_job.py +1 -3
  85. annofabcli/job/wait_job.py +4 -5
  86. annofabcli/my_account/get_my_account.py +1 -2
  87. annofabcli/my_account/subcommand_my_account.py +1 -3
  88. annofabcli/organization/list_organization.py +1 -2
  89. annofabcli/organization/subcommand_organization.py +1 -3
  90. annofabcli/organization_member/change_organization_member.py +3 -4
  91. annofabcli/organization_member/delete_organization_member.py +3 -4
  92. annofabcli/organization_member/invite_organization_member.py +1 -3
  93. annofabcli/organization_member/list_organization_member.py +2 -2
  94. annofabcli/organization_member/subcommand_organization_member.py +1 -3
  95. annofabcli/project/change_organization_of_project.py +3 -3
  96. annofabcli/project/change_project_status.py +3 -3
  97. annofabcli/project/copy_project.py +4 -4
  98. annofabcli/project/create_project.py +7 -7
  99. annofabcli/project/diff_projects.py +4 -5
  100. annofabcli/project/list_project.py +4 -4
  101. annofabcli/project/put_project.py +1 -2
  102. annofabcli/project/subcommand_project.py +1 -2
  103. annofabcli/project/update_configuration.py +3 -3
  104. annofabcli/project/update_project.py +6 -8
  105. annofabcli/project_member/change_project_members.py +7 -7
  106. annofabcli/project_member/copy_project_members.py +3 -3
  107. annofabcli/project_member/drop_project_members.py +1 -2
  108. annofabcli/project_member/invite_project_members.py +1 -3
  109. annofabcli/project_member/list_users.py +1 -2
  110. annofabcli/project_member/put_project_members.py +5 -5
  111. annofabcli/project_member/subcommand_project_member.py +1 -3
  112. annofabcli/stat_visualization/mask_visualization_dir.py +8 -9
  113. annofabcli/stat_visualization/merge_visualization_dir.py +6 -7
  114. annofabcli/stat_visualization/subcommand_stat_visualization.py +1 -2
  115. annofabcli/stat_visualization/summarize_whole_performance_csv.py +1 -2
  116. annofabcli/stat_visualization/write_graph.py +2 -3
  117. annofabcli/stat_visualization/write_performance_rating_csv.py +20 -27
  118. annofabcli/statistics/histogram.py +5 -6
  119. annofabcli/statistics/linegraph.py +13 -14
  120. annofabcli/statistics/list_annotation_area.py +38 -13
  121. annofabcli/statistics/list_annotation_attribute.py +9 -10
  122. annofabcli/statistics/list_annotation_attribute_filled_count.py +30 -31
  123. annofabcli/statistics/list_annotation_count.py +57 -58
  124. annofabcli/statistics/list_annotation_duration.py +33 -34
  125. annofabcli/statistics/list_video_duration.py +4 -5
  126. annofabcli/statistics/list_worktime.py +3 -3
  127. annofabcli/statistics/scatter.py +9 -8
  128. annofabcli/statistics/subcommand_statistics.py +1 -4
  129. annofabcli/statistics/summarize_task_count.py +4 -6
  130. annofabcli/statistics/summarize_task_count_by_task_id_group.py +2 -4
  131. annofabcli/statistics/summarize_task_count_by_user.py +1 -3
  132. annofabcli/statistics/visualization/dataframe/annotation_count.py +5 -4
  133. annofabcli/statistics/visualization/dataframe/annotation_duration.py +2 -3
  134. annofabcli/statistics/visualization/dataframe/cumulative_productivity.py +15 -17
  135. annofabcli/statistics/visualization/dataframe/productivity_per_date.py +17 -19
  136. annofabcli/statistics/visualization/dataframe/project_performance.py +3 -12
  137. annofabcli/statistics/visualization/dataframe/task.py +11 -12
  138. annofabcli/statistics/visualization/dataframe/task_worktime_by_phase_user.py +9 -10
  139. annofabcli/statistics/visualization/dataframe/user_performance.py +21 -19
  140. annofabcli/statistics/visualization/dataframe/whole_performance.py +3 -4
  141. annofabcli/statistics/visualization/dataframe/whole_productivity_per_date.py +12 -14
  142. annofabcli/statistics/visualization/dataframe/worktime_per_date.py +11 -13
  143. annofabcli/statistics/visualization/filtering_query.py +7 -7
  144. annofabcli/statistics/visualization/project_dir.py +27 -14
  145. annofabcli/statistics/visualize_annotation_count.py +22 -23
  146. annofabcli/statistics/visualize_annotation_duration.py +21 -22
  147. annofabcli/statistics/visualize_statistics.py +36 -33
  148. annofabcli/statistics/visualize_video_duration.py +18 -20
  149. annofabcli/supplementary/delete_supplementary_data.py +4 -4
  150. annofabcli/supplementary/list_supplementary_data.py +3 -3
  151. annofabcli/supplementary/put_supplementary_data.py +8 -8
  152. annofabcli/supplementary/subcommand_supplementary.py +1 -3
  153. annofabcli/task/cancel_acceptance.py +16 -17
  154. annofabcli/task/change_operator.py +10 -12
  155. annofabcli/task/change_status_to_break.py +7 -9
  156. annofabcli/task/change_status_to_on_hold.py +10 -12
  157. annofabcli/task/complete_tasks.py +17 -18
  158. annofabcli/task/copy_tasks.py +3 -5
  159. annofabcli/task/delete_metadata_key_of_task.py +4 -6
  160. annofabcli/task/delete_tasks.py +6 -6
  161. annofabcli/task/download_task_json.py +4 -6
  162. annofabcli/task/list_all_tasks.py +7 -7
  163. annofabcli/task/list_all_tasks_added_task_history.py +12 -12
  164. annofabcli/task/list_tasks.py +6 -6
  165. annofabcli/task/list_tasks_added_task_history.py +9 -9
  166. annofabcli/task/put_tasks.py +4 -5
  167. annofabcli/task/put_tasks_by_count.py +1 -2
  168. annofabcli/task/reject_tasks.py +18 -20
  169. annofabcli/task/subcommand_task.py +1 -3
  170. annofabcli/task/update_metadata_of_task.py +5 -6
  171. annofabcli/task_history/download_task_history_json.py +4 -6
  172. annofabcli/task_history/list_all_task_history.py +5 -6
  173. annofabcli/task_history/list_task_history.py +3 -4
  174. annofabcli/task_history/subcommand_task_history.py +1 -3
  175. annofabcli/task_history_event/download_task_history_event_json.py +4 -6
  176. annofabcli/task_history_event/list_all_task_history_event.py +6 -6
  177. annofabcli/task_history_event/list_worktime.py +15 -15
  178. annofabcli/task_history_event/subcommand_task_history_event.py +1 -2
  179. {annofabcli-1.111.2.dist-info → annofabcli-1.112.0.dist-info}/METADATA +9 -15
  180. annofabcli-1.112.0.dist-info/RECORD +229 -0
  181. {annofabcli-1.111.2.dist-info → annofabcli-1.112.0.dist-info}/WHEEL +1 -1
  182. annofabcli-1.111.2.dist-info/RECORD +0 -228
  183. {annofabcli-1.111.2.dist-info → annofabcli-1.112.0.dist-info}/entry_points.txt +0 -0
  184. {annofabcli-1.111.2.dist-info → annofabcli-1.112.0.dist-info}/licenses/LICENSE +0 -0
@@ -11,7 +11,6 @@ from collections.abc import Collection, Sequence
11
11
  from enum import Enum
12
12
  from functools import partial
13
13
  from pathlib import Path
14
- from typing import Optional, Union
15
14
 
16
15
  import bokeh
17
16
  import numpy
@@ -22,7 +21,6 @@ from bokeh.models.annotations.labels import Title
22
21
  from bokeh.models.widgets.markups import PreText
23
22
  from bokeh.plotting import ColumnDataSource, figure
24
23
 
25
- import annofabcli
26
24
  import annofabcli.common.cli
27
25
  from annofabcli.common.cli import (
28
26
  COMMAND_LINE_ERROR_STATUS_CODE,
@@ -49,9 +47,9 @@ def plot_video_duration(
49
47
  output_file: Path,
50
48
  *,
51
49
  time_unit: TimeUnit,
52
- bin_width: Optional[float] = None,
53
- project_id: Optional[str] = None,
54
- project_title: Optional[str] = None,
50
+ bin_width: float | None = None,
51
+ project_id: str | None = None,
52
+ project_title: str | None = None,
55
53
  ) -> None:
56
54
  """
57
55
  ラベルごとの区間アノテーションの長さのヒストグラムを出力します。
@@ -66,7 +64,7 @@ def plot_video_duration(
66
64
 
67
65
  def create_figure(
68
66
  durations: Sequence[float],
69
- bins: Union[int, numpy.ndarray],
67
+ bins: int | numpy.ndarray,
70
68
  histogram_range: tuple[float, float],
71
69
  title: str,
72
70
  x_axis_label: str,
@@ -75,10 +73,10 @@ def plot_video_duration(
75
73
  hist, bin_edges = numpy.histogram(durations, bins=bins, range=histogram_range)
76
74
 
77
75
  df_histogram = pandas.DataFrame({"frequency": hist, "left": bin_edges[:-1], "right": bin_edges[1:]})
78
- df_histogram["interval"] = [f"{left:.1f} to {right:.1f}" for left, right in zip(df_histogram["left"], df_histogram["right"])]
76
+ df_histogram["interval"] = [f"{left:.1f} to {right:.1f}" for left, right in zip(df_histogram["left"], df_histogram["right"], strict=False)]
79
77
 
80
78
  source = ColumnDataSource(df_histogram)
81
- fig = figure(
79
+ fig = figure( # type: ignore[call-arg]
82
80
  width=400,
83
81
  height=300,
84
82
  x_axis_label=x_axis_label,
@@ -108,7 +106,7 @@ def plot_video_duration(
108
106
  if bins_sequence[-1] == max_duration:
109
107
  bins_sequence = numpy.append(bins_sequence, bins_sequence[-1] + bin_width)
110
108
 
111
- bins: Union[int, numpy.ndarray] = bins_sequence
109
+ bins: int | numpy.ndarray = bins_sequence
112
110
  else:
113
111
  bins = BIN_COUNT
114
112
 
@@ -142,10 +140,10 @@ def get_video_duration_list(
142
140
  input_data_json: Path,
143
141
  task_json: Path,
144
142
  *,
145
- input_data_ids: Optional[Collection[str]] = None,
143
+ input_data_ids: Collection[str] | None = None,
146
144
  from_datetime: datetime.datetime | None = None,
147
145
  to_datetime: datetime.datetime | None = None,
148
- task_ids: Optional[Collection[str]] = None,
146
+ task_ids: Collection[str] | None = None,
149
147
  ) -> list[float]:
150
148
  """
151
149
  入力データである動画の長さ(単位は秒)の一覧を取得します。
@@ -214,13 +212,13 @@ class VisualizeVideoDuration(CommandLine):
214
212
  output_html: Path,
215
213
  *,
216
214
  time_unit: TimeUnit,
217
- project_id: Optional[str] = None,
218
- project_title: Optional[str] = None,
219
- bin_width: Optional[float] = None,
220
- input_data_ids: Optional[Collection[str]] = None,
221
- task_ids: Optional[Collection[str]] = None,
222
- from_date: Optional[str] = None,
223
- to_date: Optional[str] = None,
215
+ project_id: str | None = None,
216
+ project_title: str | None = None,
217
+ bin_width: float | None = None,
218
+ input_data_ids: Collection[str] | None = None,
219
+ task_ids: Collection[str] | None = None,
220
+ from_date: str | None = None,
221
+ to_date: str | None = None,
224
222
  ) -> None:
225
223
  tz_info = datetime.datetime.now().astimezone().tzinfo
226
224
  from_datetime = datetime.datetime.fromisoformat(from_date).astimezone(tz_info) if from_date is not None else None
@@ -250,7 +248,7 @@ class VisualizeVideoDuration(CommandLine):
250
248
  if not self.validate(args):
251
249
  sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
252
250
 
253
- project_id: Optional[str] = args.project_id
251
+ project_id: str | None = args.project_id
254
252
  if project_id is not None:
255
253
  super().validate_project(project_id, project_member_roles=[ProjectMemberRole.OWNER, ProjectMemberRole.TRAINING_DATA_USER])
256
254
  project, _ = self.service.api.get_project(project_id)
@@ -392,7 +390,7 @@ def main(args: argparse.Namespace) -> None:
392
390
  VisualizeVideoDuration(service, facade, args).main()
393
391
 
394
392
 
395
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
393
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
396
394
  subcommand_name = "visualize_video_duration"
397
395
  subcommand_help = "動画の長さをヒストグラムで可視化します。"
398
396
  epilog = "オーナロールまたはアノテーションユーザロールを持つユーザで実行してください。"
@@ -3,7 +3,7 @@ import logging
3
3
  import sys
4
4
  from collections import defaultdict
5
5
  from pathlib import Path
6
- from typing import Any, Optional
6
+ from typing import Any
7
7
 
8
8
  import annofabapi
9
9
  import pandas
@@ -36,7 +36,7 @@ def get_input_data_supplementary_data_dict_from_csv(csv_path: Path) -> InputData
36
36
  dtype={"input_data_id": "string", "supplementary_data_id": "string"},
37
37
  )
38
38
  input_data_dict: InputDataSupplementaryDataDict = defaultdict(list)
39
- for input_data_id, supplementary_data_id in zip(df["input_data_id"], df["supplementary_data_id"]):
39
+ for input_data_id, supplementary_data_id in zip(df["input_data_id"], df["supplementary_data_id"], strict=False):
40
40
  input_data_dict[input_data_id].append(supplementary_data_id)
41
41
  return input_data_dict
42
42
 
@@ -70,7 +70,7 @@ class DeleteSupplementaryDataMain(CommandLineWithConfirm):
70
70
 
71
71
  """
72
72
 
73
- def _get_supplementary_data_list(supplementary_data_id: str) -> Optional[dict[str, Any]]:
73
+ def _get_supplementary_data_list(supplementary_data_id: str) -> dict[str, Any] | None:
74
74
  return first_true(supplementary_data_list, pred=lambda e: e["supplementary_data_id"] == supplementary_data_id)
75
75
 
76
76
  input_data = self.service.wrapper.get_input_data_or_none(project_id, input_data_id)
@@ -275,7 +275,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
275
275
  parser.set_defaults(subcommand_func=main)
276
276
 
277
277
 
278
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
278
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
279
279
  subcommand_name = "delete"
280
280
  subcommand_help = "補助情報を削除します。"
281
281
  description = "補助情報を削除します。"
@@ -7,7 +7,7 @@ import logging
7
7
  import multiprocessing
8
8
  import tempfile
9
9
  from pathlib import Path
10
- from typing import Any, Optional
10
+ from typing import Any
11
11
 
12
12
  import annofabapi
13
13
  from annofabapi.models import SupplementaryData
@@ -72,7 +72,7 @@ class ListSupplementaryDataMain:
72
72
  logger.warning(f"input_data_id='{input_data_index}': 補助情報の取得に失敗しました。", exc_info=True)
73
73
  return []
74
74
 
75
- def get_all_supplementary_data_list(self, input_data_id_list: list[str], *, parallelism: Optional[int] = None) -> list[SupplementaryData]:
75
+ def get_all_supplementary_data_list(self, input_data_id_list: list[str], *, parallelism: int | None = None) -> list[SupplementaryData]:
76
76
  """
77
77
  補助情報一覧を取得する。
78
78
  """
@@ -168,7 +168,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
168
168
  parser.set_defaults(subcommand_func=main)
169
169
 
170
170
 
171
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
171
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
172
172
  subcommand_name = "list"
173
173
  subcommand_help = "補助情報一覧を出力します。"
174
174
  description = "補助情報一覧を出力します。"
@@ -7,7 +7,7 @@ from dataclasses import dataclass
7
7
  from functools import partial
8
8
  from multiprocessing import Pool
9
9
  from pathlib import Path
10
- from typing import Any, Optional
10
+ from typing import Any
11
11
 
12
12
  import annofabapi
13
13
  import pandas
@@ -49,9 +49,9 @@ class CliSupplementaryData(DataClassJsonMixin):
49
49
  input_data_id: str
50
50
  supplementary_data_name: str
51
51
  supplementary_data_path: str
52
- supplementary_data_id: Optional[str] = None
53
- supplementary_data_type: Optional[str] = None
54
- supplementary_data_number: Optional[int] = None
52
+ supplementary_data_id: str | None = None
53
+ supplementary_data_type: str | None = None
54
+ supplementary_data_number: int | None = None
55
55
 
56
56
 
57
57
  @dataclass
@@ -64,9 +64,9 @@ class SupplementaryDataForPut:
64
64
  supplementary_data_id: str
65
65
  supplementary_data_name: str
66
66
  supplementary_data_path: str
67
- supplementary_data_type: Optional[str]
67
+ supplementary_data_type: str | None
68
68
  supplementary_data_number: int
69
- last_updated_datetime: Optional[str]
69
+ last_updated_datetime: str | None
70
70
 
71
71
 
72
72
  class SubPutSupplementaryData:
@@ -249,7 +249,7 @@ class PutSupplementaryData(CommandLine):
249
249
  supplementary_data_list: list[CliSupplementaryData],
250
250
  *,
251
251
  overwrite: bool = False,
252
- parallelism: Optional[int] = None,
252
+ parallelism: int | None = None,
253
253
  ) -> None:
254
254
  """
255
255
  補助情報を一括で登録する。
@@ -412,7 +412,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
412
412
  parser.set_defaults(subcommand_func=main)
413
413
 
414
414
 
415
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
415
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
416
416
  subcommand_name = "put"
417
417
  subcommand_help = "補助情報を登録します。"
418
418
  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.supplementary.delete_supplementary_data
7
5
  import annofabcli.supplementary.list_supplementary_data
@@ -17,7 +15,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
17
15
  annofabcli.supplementary.put_supplementary_data.add_parser(subparsers)
18
16
 
19
17
 
20
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
18
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
21
19
  subcommand_name = "supplementary"
22
20
  subcommand_help = "補助情報関係のサブコマンド"
23
21
  description = "補助情報関係のサブコマンド"
@@ -6,7 +6,7 @@ import multiprocessing
6
6
  import sys
7
7
  from dataclasses import dataclass
8
8
  from functools import partial
9
- from typing import Any, Optional
9
+ from typing import Any
10
10
 
11
11
  import annofabapi
12
12
  import more_itertools
@@ -14,7 +14,6 @@ import requests
14
14
  from annofabapi.dataclass.task import Task
15
15
  from annofabapi.models import ProjectMemberRole, TaskPhase, TaskStatus
16
16
 
17
- import annofabcli
18
17
  import annofabcli.common.cli
19
18
  from annofabcli.common.cli import (
20
19
  COMMAND_LINE_ERROR_STATUS_CODE,
@@ -43,12 +42,12 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
43
42
  self.project_id = project_id
44
43
  self.facade = AnnofabApiFacade(service)
45
44
 
46
- self._project_members_dict: Optional[dict[str, dict[str, Any]]] = None
45
+ self._project_members_dict: dict[str, dict[str, Any]] | None = None
47
46
  """プロジェクトメンバー情報を保持する変数"""
48
47
 
49
48
  CommandLineWithConfirm.__init__(self, all_yes)
50
49
 
51
- def get_project_member_from_account_id(self, account_id: str) -> Optional[dict[str, Any]]:
50
+ def get_project_member_from_account_id(self, account_id: str) -> dict[str, Any] | None:
52
51
  """account_idからプロジェクトメンバを取得します。"""
53
52
  if self._project_members_dict is None:
54
53
  project_member_list = self.service.wrapper.get_all_project_members(self.project_id)
@@ -59,10 +58,10 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
59
58
  def cancel_acceptance_for_task(
60
59
  self,
61
60
  task_id: str,
62
- acceptor: Optional[User] = None,
61
+ acceptor: User | None = None,
63
62
  assign_last_acceptor: bool = True, # noqa: FBT001, FBT002
64
- task_query: Optional[TaskQuery] = None,
65
- task_index: Optional[int] = None,
63
+ task_query: TaskQuery | None = None,
64
+ task_index: int | None = None,
66
65
  dryrun: bool = False, # noqa: FBT001, FBT002
67
66
  ) -> bool:
68
67
  logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
@@ -77,7 +76,7 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
77
76
  logger.warning(f"{logging_prefix}: task_id = {task_id} は受入完了でありません。status = {task['status']}, phase={task['phase']}")
78
77
  return False
79
78
 
80
- actual_acceptor: Optional[User] = None
79
+ actual_acceptor: User | None = None
81
80
  if assign_last_acceptor:
82
81
  # 最後の受入フェーズの担当者の情報を取得する
83
82
  acceptor_account_id = task["account_id"]
@@ -119,9 +118,9 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
119
118
  def cancel_acceptance_for_wrapper(
120
119
  self,
121
120
  tpl: tuple[int, str],
122
- acceptor: Optional[User] = None,
121
+ acceptor: User | None = None,
123
122
  assign_last_acceptor: bool = True, # noqa: FBT001, FBT002
124
- task_query: Optional[TaskQuery] = None,
123
+ task_query: TaskQuery | None = None,
125
124
  dryrun: bool = False, # noqa: FBT001, FBT002
126
125
  ) -> bool:
127
126
  task_index, task_id = tpl
@@ -141,10 +140,10 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
141
140
  def cancel_acceptance_for_task_list( # noqa: ANN201
142
141
  self,
143
142
  task_id_list: list[str],
144
- acceptor: Optional[User] = None,
143
+ acceptor: User | None = None,
145
144
  assign_last_acceptor: bool = True, # noqa: FBT001, FBT002
146
- task_query: Optional[TaskQuery] = None,
147
- parallelism: Optional[int] = None,
145
+ task_query: TaskQuery | None = None,
146
+ parallelism: int | None = None,
148
147
  dryrun: bool = False, # noqa: FBT001, FBT002
149
148
  ):
150
149
  """
@@ -221,13 +220,13 @@ class CancelAcceptance(CommandLine):
221
220
 
222
221
  task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id)
223
222
 
224
- assigned_acceptor_user_id: Optional[str] = args.assigned_acceptor_user_id
223
+ assigned_acceptor_user_id: str | None = args.assigned_acceptor_user_id
225
224
 
226
225
  # 最後の受入フェーズの担当者に割り当てるか否か
227
226
  assign_last_acceptor = not args.not_assign and assigned_acceptor_user_id is None
228
227
 
229
228
  # 受入担当者の情報を取得する
230
- acceptor: Optional[User] = None # 受入担当者
229
+ acceptor: User | None = None # 受入担当者
231
230
  if assigned_acceptor_user_id is not None:
232
231
  project_member_list = self.service.wrapper.get_all_project_members(args.project_id)
233
232
  member = more_itertools.first_true(project_member_list, pred=lambda e: e["user_id"] == assigned_acceptor_user_id)
@@ -241,7 +240,7 @@ class CancelAcceptance(CommandLine):
241
240
  acceptor = User(account_id=member["account_id"], user_id=member["user_id"], username=member["username"])
242
241
 
243
242
  dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
244
- task_query: Optional[TaskQuery] = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
243
+ task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
245
244
 
246
245
  super().validate_project(args.project_id, [ProjectMemberRole.OWNER])
247
246
  main_obj = CancelAcceptanceMain(self.service, project_id=args.project_id, all_yes=args.yes)
@@ -304,7 +303,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
304
303
  parser.set_defaults(subcommand_func=main)
305
304
 
306
305
 
307
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
306
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
308
307
  subcommand_name = "cancel_acceptance"
309
308
  subcommand_help = "受入が完了したタスクに対して、受入を取り消します。"
310
309
  description = "受入が完了したタスクに対して、受入を取り消します。"
@@ -3,14 +3,12 @@ import logging
3
3
  import multiprocessing
4
4
  import sys
5
5
  from functools import partial
6
- from typing import Optional
7
6
 
8
7
  import annofabapi
9
8
  import requests
10
9
  from annofabapi.dataclass.task import Task
11
10
  from annofabapi.models import ProjectMemberRole, TaskStatus
12
11
 
13
- import annofabcli
14
12
  import annofabcli.common.cli
15
13
  from annofabcli.common.cli import (
16
14
  COMMAND_LINE_ERROR_STATUS_CODE,
@@ -63,9 +61,9 @@ class ChangeOperatorMain:
63
61
  self,
64
62
  project_id: str,
65
63
  task_id: str,
66
- new_account_id: Optional[str] = None,
67
- task_query: Optional[TaskQuery] = None,
68
- task_index: Optional[int] = None,
64
+ new_account_id: str | None = None,
65
+ task_query: TaskQuery | None = None,
66
+ task_index: int | None = None,
69
67
  ) -> bool:
70
68
  logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
71
69
  dict_task = self.service.wrapper.get_task_or_none(project_id, task_id)
@@ -115,8 +113,8 @@ class ChangeOperatorMain:
115
113
  self,
116
114
  tpl: tuple[int, str],
117
115
  project_id: str,
118
- task_query: Optional[TaskQuery] = None,
119
- new_account_id: Optional[str] = None,
116
+ task_query: TaskQuery | None = None,
117
+ new_account_id: str | None = None,
120
118
  ) -> bool:
121
119
  task_index, task_id = tpl
122
120
  try:
@@ -136,9 +134,9 @@ class ChangeOperatorMain:
136
134
  project_id: str,
137
135
  task_id_list: list[str],
138
136
  *,
139
- new_user_id: Optional[str] = None,
140
- task_query: Optional[TaskQuery] = None,
141
- parallelism: Optional[int] = None,
137
+ new_user_id: str | None = None,
138
+ task_query: TaskQuery | None = None,
139
+ parallelism: int | None = None,
142
140
  ) -> None:
143
141
  """
144
142
  指定した複数のタスクの担当者を変更します。
@@ -219,7 +217,7 @@ class ChangeOperator(CommandLine):
219
217
  return
220
218
 
221
219
  dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
222
- task_query: Optional[TaskQuery] = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
220
+ task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
223
221
 
224
222
  project_id = args.project_id
225
223
  super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER])
@@ -270,7 +268,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
270
268
  parser.set_defaults(subcommand_func=main)
271
269
 
272
270
 
273
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
271
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
274
272
  subcommand_name = "change_operator"
275
273
  subcommand_help = "タスクの担当者を変更します。"
276
274
  description = "タスクの担当者を変更します。作業中状態、完了状態のタスクは、担当者を変更できません。保留中状態のタスクは、デフォルトでは担当者を変更できません。"
@@ -3,14 +3,12 @@ import logging
3
3
  import multiprocessing
4
4
  import sys
5
5
  from functools import partial
6
- from typing import Optional
7
6
 
8
7
  import annofabapi
9
8
  import requests
10
9
  from annofabapi.dataclass.task import Task
11
10
  from annofabapi.models import ProjectMemberRole, TaskStatus
12
11
 
13
- import annofabcli
14
12
  import annofabcli.common.cli
15
13
  from annofabcli.common.cli import (
16
14
  COMMAND_LINE_ERROR_STATUS_CODE,
@@ -39,8 +37,8 @@ class ChangeStatusToBreakMain(CommandLineWithConfirm):
39
37
  self,
40
38
  project_id: str,
41
39
  task_id: str,
42
- task_index: Optional[int] = None,
43
- task_query: Optional[TaskQuery] = None,
40
+ task_index: int | None = None,
41
+ task_query: TaskQuery | None = None,
44
42
  ) -> bool:
45
43
  logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
46
44
  dict_task = self.service.wrapper.get_task_or_none(project_id, task_id)
@@ -79,7 +77,7 @@ class ChangeStatusToBreakMain(CommandLineWithConfirm):
79
77
  self,
80
78
  tpl: tuple[int, str],
81
79
  project_id: str,
82
- task_query: Optional[TaskQuery] = None,
80
+ task_query: TaskQuery | None = None,
83
81
  ) -> bool:
84
82
  task_index, task_id = tpl
85
83
  try:
@@ -97,8 +95,8 @@ class ChangeStatusToBreakMain(CommandLineWithConfirm):
97
95
  self,
98
96
  project_id: str,
99
97
  task_id_list: list[str],
100
- task_query: Optional[TaskQuery] = None,
101
- parallelism: Optional[int] = None,
98
+ task_query: TaskQuery | None = None,
99
+ parallelism: int | None = None,
102
100
  ):
103
101
  """
104
102
  タスクのステータスを休憩中に変更する。
@@ -172,7 +170,7 @@ class ChangeStatusToBreak(CommandLine):
172
170
  task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id)
173
171
 
174
172
  dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
175
- task_query: Optional[TaskQuery] = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
173
+ task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
176
174
 
177
175
  project_id = args.project_id
178
176
  super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER, ProjectMemberRole.WORKER])
@@ -210,7 +208,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
210
208
  parser.set_defaults(subcommand_func=main)
211
209
 
212
210
 
213
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
211
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
214
212
  subcommand_name = "change_status_to_break"
215
213
  subcommand_help = "タスクのステータスを休憩中に変更します。"
216
214
  description = "タスクのステータスを休憩中に変更します。ただし、操作対象のタスクは作業中か保留中である必要があります。"
@@ -6,14 +6,12 @@ import multiprocessing
6
6
  import sys
7
7
  import uuid
8
8
  from functools import partial
9
- from typing import Optional
10
9
 
11
10
  import annofabapi
12
11
  import requests
13
12
  from annofabapi.dataclass.task import Task
14
13
  from annofabapi.models import ProjectMemberRole, TaskStatus
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,
@@ -68,9 +66,9 @@ class ChangingStatusToOnHoldMain(CommandLineWithConfirm):
68
66
  self,
69
67
  task_id: str,
70
68
  *,
71
- comment: Optional[str] = None,
72
- task_index: Optional[int] = None,
73
- task_query: Optional[TaskQuery] = None,
69
+ comment: str | None = None,
70
+ task_index: int | None = None,
71
+ task_query: TaskQuery | None = None,
74
72
  ) -> bool:
75
73
  """
76
74
  Args:
@@ -155,8 +153,8 @@ class ChangingStatusToOnHoldMain(CommandLineWithConfirm):
155
153
  self,
156
154
  tpl: tuple[int, str],
157
155
  *,
158
- comment: Optional[str] = None,
159
- task_query: Optional[TaskQuery] = None,
156
+ comment: str | None = None,
157
+ task_query: TaskQuery | None = None,
160
158
  ) -> bool:
161
159
  task_index, task_id = tpl
162
160
  try:
@@ -174,9 +172,9 @@ class ChangingStatusToOnHoldMain(CommandLineWithConfirm):
174
172
  self,
175
173
  task_id_list: list[str],
176
174
  *,
177
- comment: Optional[str] = None,
178
- task_query: Optional[TaskQuery] = None,
179
- parallelism: Optional[int] = None,
175
+ comment: str | None = None,
176
+ task_query: TaskQuery | None = None,
177
+ parallelism: int | None = None,
180
178
  ):
181
179
  """
182
180
  タスクのステータスを保留中に変更する。
@@ -246,7 +244,7 @@ class ChangingStatusToOnHold(CommandLine):
246
244
  task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id)
247
245
 
248
246
  dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
249
- task_query: Optional[TaskQuery] = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
247
+ task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
250
248
 
251
249
  project_id = args.project_id
252
250
  super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER, ProjectMemberRole.WORKER])
@@ -286,7 +284,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
286
284
  parser.set_defaults(subcommand_func=main)
287
285
 
288
286
 
289
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
287
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
290
288
  subcommand_name = "change_status_to_on_hold"
291
289
  subcommand_help = "タスクのステータスを保留に変更します。"
292
290
  description = "タスクのステータスを保留に変更します。ただし、操作対象のタスクのステータスは休憩中か未着手である必要があります。"
@@ -6,7 +6,7 @@ import multiprocessing
6
6
  import sys
7
7
  import uuid
8
8
  from functools import partial
9
- from typing import Any, Optional
9
+ from typing import Any
10
10
 
11
11
  import annofabapi.utils
12
12
  import dateutil
@@ -15,7 +15,6 @@ from annofabapi.dataclass.task import Task
15
15
  from annofabapi.models import CommentStatus, Inspection, ProjectMemberRole, TaskPhase, TaskStatus
16
16
  from more_itertools import first_true
17
17
 
18
- import annofabcli
19
18
  import annofabcli.common.cli
20
19
  from annofabcli.common.cli import (
21
20
  COMMAND_LINE_ERROR_STATUS_CODE,
@@ -196,7 +195,7 @@ class CompleteTasksMain(CommandLineWithConfirm):
196
195
  def complete_task_for_annotation_phase(
197
196
  self,
198
197
  task: Task,
199
- reply_comment: Optional[str] = None,
198
+ reply_comment: str | None = None,
200
199
  ) -> bool:
201
200
  """
202
201
  annotation phaseのタスクを完了状態にする。
@@ -247,7 +246,7 @@ class CompleteTasksMain(CommandLineWithConfirm):
247
246
  def complete_task_for_inspection_acceptance_phase(
248
247
  self,
249
248
  task: Task,
250
- inspection_status: Optional[CommentStatus] = None,
249
+ inspection_status: CommentStatus | None = None,
251
250
  ) -> bool:
252
251
  unprocessed_inspection_list_dict: dict[str, list[Inspection]] = {}
253
252
  for input_data_id in task.input_data_id_list:
@@ -286,7 +285,7 @@ class CompleteTasksMain(CommandLineWithConfirm):
286
285
  return True
287
286
 
288
287
  @staticmethod
289
- def _validate_task(task: Task, target_phase: TaskPhase, target_phase_stage: int, task_query: Optional[TaskQuery]) -> bool:
288
+ def _validate_task(task: Task, target_phase: TaskPhase, target_phase_stage: int, task_query: TaskQuery | None) -> bool:
290
289
  if not (task.phase == target_phase and task.phase_stage == target_phase_stage):
291
290
  logger.warning(f"task_id='{task.task_id}'のタスクは操作対象のフェーズ、フェーズステージではないため、スキップします。")
292
291
  return False
@@ -306,10 +305,10 @@ class CompleteTasksMain(CommandLineWithConfirm):
306
305
  task_id: str,
307
306
  target_phase: TaskPhase,
308
307
  target_phase_stage: int,
309
- reply_comment: Optional[str] = None,
310
- inspection_status: Optional[CommentStatus] = None,
311
- task_query: Optional[TaskQuery] = None,
312
- task_index: Optional[int] = None,
308
+ reply_comment: str | None = None,
309
+ inspection_status: CommentStatus | None = None,
310
+ task_query: TaskQuery | None = None,
311
+ task_index: int | None = None,
313
312
  ) -> bool:
314
313
  logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
315
314
 
@@ -342,9 +341,9 @@ class CompleteTasksMain(CommandLineWithConfirm):
342
341
  project_id: str,
343
342
  target_phase: TaskPhase,
344
343
  target_phase_stage: int,
345
- reply_comment: Optional[str] = None,
346
- inspection_status: Optional[CommentStatus] = None,
347
- task_query: Optional[TaskQuery] = None,
344
+ reply_comment: str | None = None,
345
+ inspection_status: CommentStatus | None = None,
346
+ task_query: TaskQuery | None = None,
348
347
  ) -> bool:
349
348
  task_index, task_id = tpl
350
349
  try:
@@ -368,10 +367,10 @@ class CompleteTasksMain(CommandLineWithConfirm):
368
367
  task_id_list: list[str],
369
368
  target_phase: TaskPhase,
370
369
  target_phase_stage: int,
371
- reply_comment: Optional[str] = None,
372
- inspection_status: Optional[CommentStatus] = None,
373
- task_query: Optional[TaskQuery] = None,
374
- parallelism: Optional[int] = None,
370
+ reply_comment: str | None = None,
371
+ inspection_status: CommentStatus | None = None,
372
+ task_query: TaskQuery | None = None,
373
+ parallelism: int | None = None,
375
374
  ):
376
375
  """
377
376
  検査コメントのstatusを変更(対応完了 or 対応不要)にした上で、タスクを受け入れ完了状態にする
@@ -465,7 +464,7 @@ class CompleteTasks(CommandLine):
465
464
  super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER])
466
465
 
467
466
  dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
468
- task_query: Optional[TaskQuery] = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
467
+ task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
469
468
 
470
469
  main_obj = CompleteTasksMain(self.service, all_yes=self.all_yes)
471
470
  main_obj.complete_task_list(
@@ -542,7 +541,7 @@ def main(args: argparse.Namespace) -> None:
542
541
  CompleteTasks(service, facade, args).main()
543
542
 
544
543
 
545
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
544
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
546
545
  subcommand_name = "complete"
547
546
  subcommand_help = "タスクを次のフェーズに進めます。(教師付の提出、検査/受入の合格)"
548
547
  description = (