annofabcli 1.111.2__py3-none-any.whl → 1.113.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 (186) hide show
  1. annofabcli/__main__.py +1 -2
  2. annofabcli/annotation/annotation_query.py +10 -10
  3. annofabcli/annotation/change_annotation_attributes.py +10 -10
  4. annofabcli/annotation/change_annotation_attributes_per_annotation.py +4 -5
  5. annofabcli/annotation/change_annotation_properties.py +14 -14
  6. annofabcli/annotation/copy_annotation.py +6 -6
  7. annofabcli/annotation/create_classification_annotation.py +7 -7
  8. annofabcli/annotation/delete_annotation.py +9 -9
  9. annofabcli/annotation/download_annotation_zip.py +1 -3
  10. annofabcli/annotation/dump_annotation.py +8 -8
  11. annofabcli/annotation/import_annotation.py +13 -13
  12. annofabcli/annotation/list_annotation.py +9 -9
  13. annofabcli/annotation/list_annotation_count.py +2 -3
  14. annofabcli/annotation/merge_segmentation.py +6 -6
  15. annofabcli/annotation/remove_segmentation_overlap.py +5 -5
  16. annofabcli/annotation/restore_annotation.py +7 -7
  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 +3 -3
  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 +37 -38
  35. annofabcli/annotation_zip/list_polygon_annotation.py +390 -0
  36. annofabcli/annotation_zip/list_polyline_annotation.py +402 -0
  37. annofabcli/annotation_zip/list_range_annotation.py +25 -15
  38. annofabcli/annotation_zip/list_single_point_annotation.py +25 -34
  39. annofabcli/annotation_zip/subcommand_annotation_zip.py +7 -2
  40. annofabcli/annotation_zip/validate_annotation.py +8 -7
  41. annofabcli/comment/delete_comment.py +4 -6
  42. annofabcli/comment/download_comment_json.py +4 -6
  43. annofabcli/comment/list_all_comment.py +5 -6
  44. annofabcli/comment/list_comment.py +3 -4
  45. annofabcli/comment/put_comment.py +9 -10
  46. annofabcli/comment/put_comment_simply.py +5 -6
  47. annofabcli/comment/put_inspection_comment.py +1 -3
  48. annofabcli/comment/put_inspection_comment_simply.py +1 -3
  49. annofabcli/comment/put_onhold_comment.py +1 -3
  50. annofabcli/comment/put_onhold_comment_simply.py +1 -3
  51. annofabcli/comment/subcommand_comment.py +1 -3
  52. annofabcli/common/bokeh.py +4 -4
  53. annofabcli/common/cli.py +18 -17
  54. annofabcli/common/download.py +28 -29
  55. annofabcli/common/facade.py +37 -38
  56. annofabcli/common/image.py +14 -14
  57. annofabcli/common/utils.py +8 -8
  58. annofabcli/common/visualize.py +13 -13
  59. annofabcli/experimental/list_out_of_range_annotation_for_movie.py +3 -4
  60. annofabcli/experimental/subcommand_experimental.py +1 -3
  61. annofabcli/filesystem/draw_annotation.py +27 -27
  62. annofabcli/filesystem/filter_annotation.py +9 -10
  63. annofabcli/filesystem/mask_user_info.py +15 -15
  64. annofabcli/filesystem/merge_annotation.py +9 -9
  65. annofabcli/filesystem/subcommand_filesystem.py +1 -3
  66. annofabcli/input_data/copy_input_data.py +8 -9
  67. annofabcli/input_data/delete_input_data.py +3 -3
  68. annofabcli/input_data/delete_metadata_key_of_input_data.py +3 -5
  69. annofabcli/input_data/download_input_data_json.py +4 -6
  70. annofabcli/input_data/list_all_input_data.py +9 -9
  71. annofabcli/input_data/list_all_input_data_merged_task.py +5 -5
  72. annofabcli/input_data/list_input_data.py +5 -5
  73. annofabcli/input_data/put_input_data.py +6 -6
  74. annofabcli/input_data/put_input_data_with_zip.py +3 -4
  75. annofabcli/input_data/subcommand_input_data.py +1 -3
  76. annofabcli/input_data/update_input_data.py +6 -8
  77. annofabcli/input_data/update_metadata_of_input_data.py +3 -5
  78. annofabcli/instruction/copy_instruction.py +5 -6
  79. annofabcli/instruction/download_instruction.py +5 -6
  80. annofabcli/instruction/list_instruction_history.py +3 -3
  81. annofabcli/instruction/subcommand_instruction.py +1 -3
  82. annofabcli/instruction/upload_instruction.py +3 -4
  83. annofabcli/job/delete_job.py +2 -3
  84. annofabcli/job/list_job.py +5 -5
  85. annofabcli/job/list_last_job.py +4 -4
  86. annofabcli/job/subcommand_job.py +1 -3
  87. annofabcli/job/wait_job.py +4 -5
  88. annofabcli/my_account/get_my_account.py +2 -3
  89. annofabcli/my_account/subcommand_my_account.py +1 -3
  90. annofabcli/organization/list_organization.py +2 -3
  91. annofabcli/organization/subcommand_organization.py +1 -3
  92. annofabcli/organization_member/change_organization_member.py +3 -4
  93. annofabcli/organization_member/delete_organization_member.py +3 -4
  94. annofabcli/organization_member/invite_organization_member.py +1 -3
  95. annofabcli/organization_member/list_organization_member.py +3 -3
  96. annofabcli/organization_member/subcommand_organization_member.py +1 -3
  97. annofabcli/project/change_organization_of_project.py +4 -4
  98. annofabcli/project/change_project_status.py +4 -4
  99. annofabcli/project/copy_project.py +5 -5
  100. annofabcli/project/create_project.py +8 -8
  101. annofabcli/project/diff_projects.py +4 -5
  102. annofabcli/project/list_project.py +5 -5
  103. annofabcli/project/put_project.py +2 -3
  104. annofabcli/project/subcommand_project.py +1 -2
  105. annofabcli/project/update_configuration.py +4 -4
  106. annofabcli/project/update_project.py +6 -8
  107. annofabcli/project_member/change_project_members.py +8 -8
  108. annofabcli/project_member/copy_project_members.py +4 -4
  109. annofabcli/project_member/drop_project_members.py +2 -3
  110. annofabcli/project_member/invite_project_members.py +1 -3
  111. annofabcli/project_member/list_users.py +2 -3
  112. annofabcli/project_member/put_project_members.py +6 -6
  113. annofabcli/project_member/subcommand_project_member.py +1 -3
  114. annofabcli/stat_visualization/mask_visualization_dir.py +8 -9
  115. annofabcli/stat_visualization/merge_visualization_dir.py +6 -7
  116. annofabcli/stat_visualization/subcommand_stat_visualization.py +1 -2
  117. annofabcli/stat_visualization/summarize_whole_performance_csv.py +1 -2
  118. annofabcli/stat_visualization/write_graph.py +2 -3
  119. annofabcli/stat_visualization/write_performance_rating_csv.py +20 -27
  120. annofabcli/statistics/histogram.py +5 -6
  121. annofabcli/statistics/linegraph.py +13 -14
  122. annofabcli/statistics/list_annotation_area.py +38 -13
  123. annofabcli/statistics/list_annotation_attribute.py +9 -10
  124. annofabcli/statistics/list_annotation_attribute_filled_count.py +30 -31
  125. annofabcli/statistics/list_annotation_count.py +57 -58
  126. annofabcli/statistics/list_annotation_duration.py +33 -34
  127. annofabcli/statistics/list_video_duration.py +4 -5
  128. annofabcli/statistics/list_worktime.py +4 -4
  129. annofabcli/statistics/scatter.py +9 -8
  130. annofabcli/statistics/subcommand_statistics.py +1 -4
  131. annofabcli/statistics/summarize_task_count.py +4 -6
  132. annofabcli/statistics/summarize_task_count_by_task_id_group.py +2 -4
  133. annofabcli/statistics/summarize_task_count_by_user.py +1 -3
  134. annofabcli/statistics/visualization/dataframe/annotation_count.py +5 -4
  135. annofabcli/statistics/visualization/dataframe/annotation_duration.py +2 -3
  136. annofabcli/statistics/visualization/dataframe/cumulative_productivity.py +15 -17
  137. annofabcli/statistics/visualization/dataframe/productivity_per_date.py +17 -19
  138. annofabcli/statistics/visualization/dataframe/project_performance.py +3 -12
  139. annofabcli/statistics/visualization/dataframe/task.py +11 -12
  140. annofabcli/statistics/visualization/dataframe/task_worktime_by_phase_user.py +9 -10
  141. annofabcli/statistics/visualization/dataframe/user_performance.py +21 -19
  142. annofabcli/statistics/visualization/dataframe/whole_performance.py +3 -4
  143. annofabcli/statistics/visualization/dataframe/whole_productivity_per_date.py +12 -14
  144. annofabcli/statistics/visualization/dataframe/worktime_per_date.py +11 -13
  145. annofabcli/statistics/visualization/filtering_query.py +7 -7
  146. annofabcli/statistics/visualization/project_dir.py +27 -14
  147. annofabcli/statistics/visualize_annotation_count.py +22 -23
  148. annofabcli/statistics/visualize_annotation_duration.py +21 -22
  149. annofabcli/statistics/visualize_statistics.py +36 -33
  150. annofabcli/statistics/visualize_video_duration.py +18 -20
  151. annofabcli/supplementary/delete_supplementary_data.py +5 -5
  152. annofabcli/supplementary/list_supplementary_data.py +4 -4
  153. annofabcli/supplementary/put_supplementary_data.py +9 -9
  154. annofabcli/supplementary/subcommand_supplementary.py +1 -3
  155. annofabcli/task/cancel_acceptance.py +16 -17
  156. annofabcli/task/change_operator.py +10 -12
  157. annofabcli/task/change_status_to_break.py +7 -9
  158. annofabcli/task/change_status_to_on_hold.py +10 -12
  159. annofabcli/task/complete_tasks.py +17 -18
  160. annofabcli/task/copy_tasks.py +3 -5
  161. annofabcli/task/delete_metadata_key_of_task.py +4 -6
  162. annofabcli/task/delete_tasks.py +7 -7
  163. annofabcli/task/download_task_json.py +4 -6
  164. annofabcli/task/list_all_tasks.py +8 -8
  165. annofabcli/task/list_all_tasks_added_task_history.py +14 -13
  166. annofabcli/task/list_tasks.py +7 -7
  167. annofabcli/task/list_tasks_added_task_history.py +10 -10
  168. annofabcli/task/put_tasks.py +5 -6
  169. annofabcli/task/put_tasks_by_count.py +2 -3
  170. annofabcli/task/reject_tasks.py +18 -20
  171. annofabcli/task/subcommand_task.py +1 -3
  172. annofabcli/task/update_metadata_of_task.py +5 -6
  173. annofabcli/task_history/download_task_history_json.py +4 -6
  174. annofabcli/task_history/list_all_task_history.py +6 -7
  175. annofabcli/task_history/list_task_history.py +4 -5
  176. annofabcli/task_history/subcommand_task_history.py +1 -3
  177. annofabcli/task_history_event/download_task_history_event_json.py +4 -6
  178. annofabcli/task_history_event/list_all_task_history_event.py +7 -7
  179. annofabcli/task_history_event/list_worktime.py +17 -16
  180. annofabcli/task_history_event/subcommand_task_history_event.py +1 -2
  181. {annofabcli-1.111.2.dist-info → annofabcli-1.113.0.dist-info}/METADATA +9 -15
  182. annofabcli-1.113.0.dist-info/RECORD +231 -0
  183. {annofabcli-1.111.2.dist-info → annofabcli-1.113.0.dist-info}/WHEEL +1 -1
  184. annofabcli-1.111.2.dist-info/RECORD +0 -228
  185. {annofabcli-1.111.2.dist-info → annofabcli-1.113.0.dist-info}/entry_points.txt +0 -0
  186. {annofabcli-1.111.2.dist-info → annofabcli-1.113.0.dist-info}/licenses/LICENSE +0 -0
@@ -6,16 +6,14 @@ 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
12
- import annofabapi.utils
13
12
  import requests
14
13
  from annofabapi.dataclass.task import Task
15
14
  from annofabapi.models import InputDataType, ProjectMemberRole, TaskPhase, TaskStatus
16
15
  from annofabapi.plugin import EditorPluginId
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,
@@ -32,7 +30,7 @@ logger = logging.getLogger(__name__)
32
30
 
33
31
 
34
32
  class RejectTasksMain(CommandLineWithConfirm):
35
- def __init__(self, service: annofabapi.Resource, *, comment_data: Optional[dict[str, Any]], all_yes: bool = False) -> None:
33
+ def __init__(self, service: annofabapi.Resource, *, comment_data: dict[str, Any] | None, all_yes: bool = False) -> None:
36
34
  self.service = service
37
35
  self.facade = AnnofabApiFacade(service)
38
36
  self.comment_data = comment_data
@@ -70,7 +68,7 @@ class RejectTasksMain(CommandLineWithConfirm):
70
68
 
71
69
  self.service.api.batch_update_comments(project_id, task["task_id"], first_input_data_id, request_body=req_inspection)
72
70
 
73
- def confirm_reject_task(self, task_id: str, assign_last_annotator: bool, assigned_annotator_user_id: Optional[str]) -> bool: # noqa: FBT001
71
+ def confirm_reject_task(self, task_id: str, assign_last_annotator: bool, assigned_annotator_user_id: str | None) -> bool: # noqa: FBT001
74
72
  confirm_message = f"task_id='{task_id}' のタスクを差し戻しますか?"
75
73
  if assign_last_annotator:
76
74
  confirm_message += "最後の教師付フェーズの担当者を割り当てます。"
@@ -114,9 +112,9 @@ class RejectTasksMain(CommandLineWithConfirm):
114
112
  task: dict[str, Any],
115
113
  *,
116
114
  assign_last_annotator: bool,
117
- assigned_annotator_user_id: Optional[str],
115
+ assigned_annotator_user_id: str | None,
118
116
  cancel_acceptance: bool = False,
119
- task_query: Optional[TaskQuery] = None,
117
+ task_query: TaskQuery | None = None,
120
118
  ) -> bool:
121
119
  """
122
120
  以下の状態を見て、差し戻し可能かどうかを判断します。
@@ -151,12 +149,12 @@ class RejectTasksMain(CommandLineWithConfirm):
151
149
  project_id: str,
152
150
  task_id: str,
153
151
  *,
154
- inspection_comment: Optional[str] = None,
152
+ inspection_comment: str | None = None,
155
153
  assign_last_annotator: bool = True,
156
- assigned_annotator_user_id: Optional[str] = None,
154
+ assigned_annotator_user_id: str | None = None,
157
155
  cancel_acceptance: bool = False,
158
- task_query: Optional[TaskQuery] = None,
159
- task_index: Optional[int] = None,
156
+ task_query: TaskQuery | None = None,
157
+ task_index: int | None = None,
160
158
  ) -> bool:
161
159
  """
162
160
  タスクを差し戻します。
@@ -235,11 +233,11 @@ class RejectTasksMain(CommandLineWithConfirm):
235
233
  self,
236
234
  tpl: tuple[int, str],
237
235
  project_id: str,
238
- inspection_comment: Optional[str] = None,
236
+ inspection_comment: str | None = None,
239
237
  assign_last_annotator: bool = True, # noqa: FBT001, FBT002
240
- assigned_annotator_user_id: Optional[str] = None,
238
+ assigned_annotator_user_id: str | None = None,
241
239
  cancel_acceptance: bool = False, # noqa: FBT001, FBT002
242
- task_query: Optional[TaskQuery] = None,
240
+ task_query: TaskQuery | None = None,
243
241
  ) -> bool:
244
242
  task_index, task_id = tpl
245
243
  try:
@@ -261,12 +259,12 @@ class RejectTasksMain(CommandLineWithConfirm):
261
259
  self,
262
260
  project_id: str,
263
261
  task_id_list: list[str],
264
- inspection_comment: Optional[str] = None,
262
+ inspection_comment: str | None = None,
265
263
  assign_last_annotator: bool = True, # noqa: FBT001, FBT002
266
- assigned_annotator_user_id: Optional[str] = None,
264
+ assigned_annotator_user_id: str | None = None,
267
265
  cancel_acceptance: bool = False, # noqa: FBT001, FBT002
268
- task_query: Optional[TaskQuery] = None,
269
- parallelism: Optional[int] = None,
266
+ task_query: TaskQuery | None = None,
267
+ parallelism: int | None = None,
270
268
  ) -> None:
271
269
  if task_query is not None:
272
270
  task_query = self.facade.set_account_id_of_task_query(project_id, task_query)
@@ -339,7 +337,7 @@ class RejectTasks(CommandLine):
339
337
  super().validate_project(args.project_id, [ProjectMemberRole.OWNER])
340
338
 
341
339
  dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
342
- task_query: Optional[TaskQuery] = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
340
+ task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
343
341
 
344
342
  comment_data = annofabcli.common.cli.get_json_from_args(args.comment_data)
345
343
  custom_project_type = CustomProjectType(args.custom_project_type) if args.custom_project_type is not None else None
@@ -447,7 +445,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
447
445
  parser.set_defaults(subcommand_func=main)
448
446
 
449
447
 
450
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
448
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
451
449
  subcommand_name = "reject"
452
450
  subcommand_help = "タスクを差し戻します。"
453
451
  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.task.cancel_acceptance
7
5
  import annofabcli.task.change_operator
@@ -45,7 +43,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
45
43
  annofabcli.task.update_metadata_of_task.add_parser(subparsers)
46
44
 
47
45
 
48
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
46
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
49
47
  subcommand_name = "task"
50
48
  subcommand_help = "タスク関係のサブコマンド"
51
49
  description = "タスク関係のサブコマンド"
@@ -8,12 +8,11 @@ import multiprocessing
8
8
  import sys
9
9
  from dataclasses import dataclass
10
10
  from functools import partial
11
- from typing import Any, Optional, Union
11
+ from typing import Any
12
12
 
13
13
  import annofabapi
14
14
  from annofabapi.models import ProjectMemberRole
15
15
 
16
- import annofabcli
17
16
  import annofabcli.common.cli
18
17
  from annofabcli.common.cli import (
19
18
  COMMAND_LINE_ERROR_STATUS_CODE,
@@ -27,7 +26,7 @@ from annofabcli.common.facade import AnnofabApiFacade
27
26
 
28
27
  logger = logging.getLogger(__name__)
29
28
 
30
- Metadata = dict[str, Union[str, bool, int]]
29
+ Metadata = dict[str, str | bool | int]
31
30
 
32
31
 
33
32
  @dataclass(frozen=True)
@@ -42,7 +41,7 @@ class UpdateMetadataOfTaskMain(CommandLineWithConfirm):
42
41
  service: annofabapi.Resource,
43
42
  *,
44
43
  is_overwrite_metadata: bool,
45
- parallelism: Optional[int] = None,
44
+ parallelism: int | None = None,
46
45
  all_yes: bool = False,
47
46
  ) -> None:
48
47
  self.service = service
@@ -61,7 +60,7 @@ class UpdateMetadataOfTaskMain(CommandLineWithConfirm):
61
60
  project_id: str,
62
61
  task_id: str,
63
62
  metadata: dict[str, Any],
64
- task_index: Optional[int] = None,
63
+ task_index: int | None = None,
65
64
  ) -> bool:
66
65
  logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
67
66
  task = self.service.wrapper.get_task_or_none(project_id, task_id)
@@ -272,7 +271,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
272
271
  parser.set_defaults(subcommand_func=main)
273
272
 
274
273
 
275
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
274
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
276
275
  subcommand_name = "update_metadata"
277
276
  subcommand_help = "タスクのメタデータを更新します。"
278
277
  description = "タスクのメタデータを上書きして更新します。"
@@ -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,17 +13,17 @@ logger = logging.getLogger(__name__)
15
13
 
16
14
 
17
15
  class DownloadingTaskHistory(CommandLine):
18
- def download_task_history_json(self, project_id: str, output_file: Path): # noqa: ANN201
16
+ def download_task_history_json(self, project_id: str, output_file: Path) -> None:
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_task_history_json(
25
23
  project_id,
26
24
  str(output_file),
27
25
  )
28
- logger.info(f"タスク履歴全件ファイルをダウンロードしました。output={output_file}")
26
+ logger.info(f"project_id='{project_id}'のタスク履歴全件ファイルをダウンロードしました。 :: output='{output_file}', project_title='{project_title}'")
29
27
 
30
28
  def main(self) -> None:
31
29
  args = self.args
@@ -50,7 +48,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
50
48
  parser.set_defaults(subcommand_func=main)
51
49
 
52
50
 
53
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
51
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
54
52
  subcommand_name = "download"
55
53
  subcommand_help = "タスク履歴全件ファイルをダウンロードします。"
56
54
  epilog = "オーナロールまたはアノテーションユーザロールを持つユーザで実行してください。"
@@ -3,12 +3,11 @@ import json
3
3
  import logging
4
4
  import tempfile
5
5
  from pathlib import Path
6
- from typing import Optional
7
6
 
8
7
  import annofabapi
9
8
  from annofabapi.models import TaskHistory
10
9
 
11
- import annofabcli
10
+ import annofabcli.common.cli
12
11
  from annofabcli.common.cli import ArgumentParser, CommandLine, build_annofabapi_resource_and_login
13
12
  from annofabcli.common.download import DownloadingFile
14
13
  from annofabcli.common.enums import FormatArgument
@@ -27,7 +26,7 @@ class ListTaskHistoryWithJsonMain:
27
26
  self.facade = AnnofabApiFacade(service)
28
27
 
29
28
  @staticmethod
30
- def filter_task_history_dict(task_history_dict: TaskHistoryDict, task_id_list: Optional[list[str]] = None) -> TaskHistoryDict:
29
+ def filter_task_history_dict(task_history_dict: TaskHistoryDict, task_id_list: list[str] | None = None) -> TaskHistoryDict:
31
30
  if task_id_list is None:
32
31
  return task_history_dict
33
32
 
@@ -40,7 +39,7 @@ class ListTaskHistoryWithJsonMain:
40
39
  filtered_task_history_dict[task_id] = task_history_list
41
40
  return filtered_task_history_dict
42
41
 
43
- def get_task_history_dict(self, project_id: str, task_history_json: Optional[Path] = None, task_id_list: Optional[list[str]] = None) -> TaskHistoryDict:
42
+ def get_task_history_dict(self, project_id: str, task_history_json: Path | None = None, task_id_list: list[str] | None = None) -> TaskHistoryDict:
44
43
  """出力対象のタスク履歴情報を取得する"""
45
44
  if task_history_json is None:
46
45
  downloading_obj = DownloadingFile(self.service)
@@ -78,8 +77,8 @@ class ListTaskHistoryWithJson(CommandLine):
78
77
  def print_task_history_list( # noqa: ANN201
79
78
  self,
80
79
  project_id: str,
81
- task_history_json: Optional[Path],
82
- task_id_list: Optional[list[str]],
80
+ task_history_json: Path | None,
81
+ task_id_list: list[str] | None,
83
82
  arg_format: FormatArgument,
84
83
  ):
85
84
  """
@@ -151,7 +150,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
151
150
  parser.set_defaults(subcommand_func=main)
152
151
 
153
152
 
154
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
153
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
155
154
  subcommand_name = "list_all"
156
155
  subcommand_help = "すべてのタスク履歴の一覧を出力します。"
157
156
  description = (
@@ -1,11 +1,10 @@
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 TaskHistory
7
6
 
8
- import annofabcli
7
+ import annofabcli.common.cli
9
8
  from annofabcli.common.cli import ArgumentParser, CommandLine, build_annofabapi_resource_and_login
10
9
  from annofabcli.common.enums import FormatArgument
11
10
  from annofabcli.common.facade import AnnofabApiFacade
@@ -53,7 +52,7 @@ class ListTaskHistoryMain:
53
52
  all_task_list = self.service.wrapper.get_all_tasks(project_id)
54
53
  return [e["task_id"] for e in all_task_list]
55
54
 
56
- def get_task_history_dict_for_output(self, project_id: str, task_id_list: Optional[list[str]] = None) -> TaskHistoryDict:
55
+ def get_task_history_dict_for_output(self, project_id: str, task_id_list: list[str] | None = None) -> TaskHistoryDict:
57
56
  """出力対象のタスク履歴情報を取得する"""
58
57
  if task_id_list is None:
59
58
  task_id_list = self.get_all_task_id_list(project_id)
@@ -78,7 +77,7 @@ class ListTaskHistory(CommandLine):
78
77
  def print_task_history_list(
79
78
  self,
80
79
  project_id: str,
81
- task_id_list: Optional[list[str]],
80
+ task_id_list: list[str] | None,
82
81
  arg_format: FormatArgument,
83
82
  ) -> None:
84
83
  """
@@ -143,7 +142,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
143
142
  parser.set_defaults(subcommand_func=main)
144
143
 
145
144
 
146
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
145
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
147
146
  subcommand_name = "list"
148
147
  subcommand_help = "タスク履歴の一覧を出力します。"
149
148
  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.task_history.download_task_history_json
7
5
  import annofabcli.task_history.list_all_task_history
@@ -17,7 +15,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
17
15
  annofabcli.task_history.list_all_task_history.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 = "task_history"
22
20
  subcommand_help = "タスク履歴関係のサブコマンド"
23
21
  description = "タスク履歴関係のサブコマンド"
@@ -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,17 +13,17 @@ logger = logging.getLogger(__name__)
15
13
 
16
14
 
17
15
  class DownloadingTaskHistoryEvent(CommandLine):
18
- def download_task_history_event_json(self, project_id: str, output_file: Path): # noqa: ANN201
16
+ def download_task_history_event_json(self, project_id: str, output_file: Path) -> None:
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_task_history_event_json(
25
23
  project_id,
26
24
  str(output_file),
27
25
  )
28
- logger.info(f"タスク履歴イベント全件ファイルをダウンロードしました。output={output_file}")
26
+ logger.info(f"project_id='{project_id}'のタスク履歴イベント全件ファイルをダウンロードしました。 :: output='{output_file}', project_title='{project_title}'")
29
27
 
30
28
  def main(self) -> None:
31
29
  args = self.args
@@ -50,7 +48,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
50
48
  parser.set_defaults(subcommand_func=main)
51
49
 
52
50
 
53
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
51
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
54
52
  subcommand_name = "download"
55
53
  subcommand_help = "タスク履歴イベント全件ファイルをダウンロードします。"
56
54
  epilog = "オーナロールまたはアノテーションユーザロールを持つユーザで実行してください。"
@@ -5,13 +5,13 @@ import json
5
5
  import logging
6
6
  import tempfile
7
7
  from pathlib import Path
8
- from typing import Any, Optional
8
+ from typing import Any
9
9
 
10
10
  import annofabapi
11
11
  import pandas
12
12
  from annofabapi.models import TaskHistoryEvent
13
13
 
14
- import annofabcli
14
+ import annofabcli.common.cli
15
15
  from annofabcli.common.cli import (
16
16
  ArgumentParser,
17
17
  CommandLine,
@@ -31,7 +31,7 @@ class ListTaskHistoryEventWithJsonMain:
31
31
  self.service = service
32
32
 
33
33
  @staticmethod
34
- def filter_task_history_event(task_history_event_list: list[TaskHistoryEvent], task_id_list: Optional[list[str]] = None) -> list[TaskHistoryEvent]:
34
+ def filter_task_history_event(task_history_event_list: list[TaskHistoryEvent], task_id_list: list[str] | None = None) -> list[TaskHistoryEvent]:
35
35
  if task_id_list is not None:
36
36
  result = []
37
37
  task_id_set = set(task_id_list)
@@ -43,7 +43,7 @@ class ListTaskHistoryEventWithJsonMain:
43
43
 
44
44
  return task_history_event_list
45
45
 
46
- def get_task_history_event_list(self, project_id: str, task_history_event_json: Optional[Path] = None, task_id_list: Optional[list[str]] = None) -> list[dict[str, Any]]:
46
+ def get_task_history_event_list(self, project_id: str, task_history_event_json: Path | None = None, task_id_list: list[str] | None = None) -> list[dict[str, Any]]:
47
47
  if task_history_event_json is None:
48
48
  downloading_obj = DownloadingFile(self.service)
49
49
  # `NamedTemporaryFile`を使わない理由: Windowsで`PermissionError`が発生するため
@@ -72,8 +72,8 @@ class ListTaskHistoryEventWithJson(CommandLine):
72
72
  def print_task_history_event_list(
73
73
  self,
74
74
  project_id: str,
75
- task_history_event_json: Optional[Path],
76
- task_id_list: Optional[list[str]],
75
+ task_history_event_json: Path | None,
76
+ task_id_list: list[str] | None,
77
77
  arg_format: FormatArgument,
78
78
  ) -> None:
79
79
  super().validate_project(project_id, project_member_roles=None)
@@ -165,7 +165,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
165
165
  parser.set_defaults(subcommand_func=main)
166
166
 
167
167
 
168
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
168
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
169
169
  subcommand_name = "list_all"
170
170
  subcommand_help = "すべてのタスク履歴イベントの一覧を出力します。"
171
171
  description = "すべてのタスク履歴イベントの一覧を出力します。\n出力されるタスク履歴イベントは、コマンドを実行した日の02:00(JST)頃の状態です。最新の情報を出力する方法はありません。"
@@ -6,7 +6,7 @@ import logging
6
6
  from collections import defaultdict
7
7
  from dataclasses import dataclass
8
8
  from pathlib import Path
9
- from typing import Any, Optional
9
+ from typing import Any
10
10
 
11
11
  import annofabapi
12
12
  import pandas
@@ -14,7 +14,8 @@ from annofabapi.models import TaskHistoryEvent, TaskStatus
14
14
  from dataclasses_json import DataClassJsonMixin
15
15
  from dateutil.parser import parse
16
16
 
17
- import annofabcli
17
+ import annofabcli.common.cli
18
+ import annofabcli.common.utils
18
19
  from annofabcli.common.cli import (
19
20
  ArgumentParser,
20
21
  CommandLine,
@@ -45,9 +46,9 @@ class RequestOfTaskHistoryEvent(DataClassJsonMixin):
45
46
 
46
47
  status: str
47
48
  force: bool
48
- account_id: Optional[str]
49
- user_id: Optional[str]
50
- username: Optional[str]
49
+ account_id: str | None
50
+ user_id: str | None
51
+ username: str | None
51
52
 
52
53
 
53
54
  @dataclass
@@ -72,7 +73,7 @@ class ListWorktimeFromTaskHistoryEventMain:
72
73
  self.visualize = AddProps(service, project_id)
73
74
 
74
75
  @staticmethod
75
- def filter_task_history_event(task_history_event_list: list[TaskHistoryEvent], task_id_list: Optional[list[str]] = None) -> list[TaskHistoryEvent]:
76
+ def filter_task_history_event(task_history_event_list: list[TaskHistoryEvent], task_id_list: list[str] | None = None) -> list[TaskHistoryEvent]:
76
77
  if task_id_list is not None:
77
78
  result = []
78
79
  task_id_set = set(task_id_list)
@@ -84,7 +85,7 @@ class ListWorktimeFromTaskHistoryEventMain:
84
85
 
85
86
  return task_history_event_list
86
87
 
87
- def get_task_history_event_list(self, project_id: str, task_history_event_json: Optional[Path] = None) -> list[dict[str, Any]]:
88
+ def get_task_history_event_list(self, project_id: str, task_history_event_json: Path | None = None) -> list[dict[str, Any]]:
88
89
  if task_history_event_json is None:
89
90
  downloading_obj = DownloadingFile(self.service)
90
91
  cache_dir = annofabcli.common.utils.get_cache_dir()
@@ -103,8 +104,8 @@ class ListWorktimeFromTaskHistoryEventMain:
103
104
  def _create_task_history_event_dict(
104
105
  task_history_event_list: list[TaskHistoryEvent],
105
106
  *,
106
- task_ids: Optional[set[str]],
107
- account_ids: Optional[set[str]],
107
+ task_ids: set[str] | None,
108
+ account_ids: set[str] | None,
108
109
  ) -> dict[str, list[TaskHistoryEvent]]:
109
110
  """
110
111
  keyがtask_id, valueがタスク履歴イベントのlistであるdictを生成する。
@@ -229,9 +230,9 @@ class ListWorktimeFromTaskHistoryEventMain:
229
230
  def get_worktime_list(
230
231
  self,
231
232
  project_id: str,
232
- task_history_event_json: Optional[Path] = None,
233
- task_id_list: Optional[list[str]] = None,
234
- user_id_list: Optional[list[str]] = None,
233
+ task_history_event_json: Path | None = None,
234
+ task_id_list: list[str] | None = None,
235
+ user_id_list: list[str] | None = None,
235
236
  ) -> list[WorktimeFromTaskHistoryEvent]:
236
237
  all_task_history_event_list = self.get_task_history_event_list(project_id, task_history_event_json=task_history_event_json)
237
238
 
@@ -251,9 +252,9 @@ class ListWorktimeFromTaskHistoryEvent(CommandLine):
251
252
  def print_worktime_from_task_history_event(
252
253
  self,
253
254
  project_id: str,
254
- task_history_event_json: Optional[Path],
255
- task_id_list: Optional[list[str]],
256
- user_id_list: Optional[list[str]],
255
+ task_history_event_json: Path | None,
256
+ task_id_list: list[str] | None,
257
+ user_id_list: list[str] | None,
257
258
  arg_format: FormatArgument,
258
259
  ) -> None:
259
260
  super().validate_project(project_id, project_member_roles=None)
@@ -366,7 +367,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
366
367
  parser.set_defaults(subcommand_func=main)
367
368
 
368
369
 
369
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
370
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
370
371
  subcommand_name = "list_worktime"
371
372
  subcommand_help = "タスク履歴イベントから作業時間の一覧を出力します。"
372
373
  description = "タスク履歴イベントから作業時間の一覧を出力します。\nタスク履歴より詳細な作業時間の情報を出力します。"
@@ -1,5 +1,4 @@
1
1
  import argparse
2
- from typing import Optional
3
2
 
4
3
  import annofabcli.task_history_event.download_task_history_event_json
5
4
  import annofabcli.task_history_event.list_all_task_history_event
@@ -16,7 +15,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
16
15
  annofabcli.task_history_event.list_worktime.add_parser(subparsers)
17
16
 
18
17
 
19
- def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
18
+ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
20
19
  subcommand_name = "task_history_event"
21
20
  subcommand_help = "タスク履歴イベント関係のサブコマンド"
22
21
  description = "タスク履歴イベント関係のサブコマンド。task_history_eventコマンドはベータ版です。予告なく変更される場合があります。"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: annofabcli
3
- Version: 1.111.2
3
+ Version: 1.113.0
4
4
  Summary: Utility Command Line Interface for AnnoFab
5
5
  Author: Kurusugawa Computer Inc.
6
6
  License: MIT
@@ -10,25 +10,28 @@ Classifier: Development Status :: 4 - Beta
10
10
  Classifier: Environment :: Console
11
11
  Classifier: Intended Audience :: Developers
12
12
  Classifier: Operating System :: OS Independent
13
- Classifier: Programming Language :: Python :: 3.9
14
13
  Classifier: Programming Language :: Python :: 3.10
15
14
  Classifier: Programming Language :: Python :: 3.11
16
15
  Classifier: Programming Language :: Python :: 3.12
17
16
  Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: 3.14
18
18
  Classifier: Topic :: Utilities
19
- Requires-Python: >=3.9
19
+ Requires-Python: >=3.10
20
+ Requires-Dist: annofabapi-3dpc-extensions
20
21
  Requires-Dist: annofabapi>=1.5.1
21
- Requires-Dist: bokeh<3.7,>=3.3
22
+ Requires-Dist: bokeh>=3.8
22
23
  Requires-Dist: dictdiffer
23
24
  Requires-Dist: isodate
24
25
  Requires-Dist: more-itertools
25
26
  Requires-Dist: numpy
26
27
  Requires-Dist: pandas<3,>=2
27
28
  Requires-Dist: pillow
29
+ Requires-Dist: pydantic>=2.12; python_version >= '3.14'
28
30
  Requires-Dist: pyquery
29
31
  Requires-Dist: python-datauri
30
32
  Requires-Dist: pyyaml
31
33
  Requires-Dist: requests
34
+ Requires-Dist: shapely
32
35
  Requires-Dist: typing-extensions>=4.5
33
36
  Requires-Dist: ulid-py>=1.1.0
34
37
  Description-Content-Type: text/markdown
@@ -58,7 +61,7 @@ Description-Content-Type: text/markdown
58
61
  * TODO
59
62
 
60
63
  # Requirements
61
- * Python 3.9+
64
+ * Python 3.10+
62
65
 
63
66
  # Install
64
67
 
@@ -110,13 +113,4 @@ $ annofabcli annotation list_count --project_id prj1 --task_id file://task.txt -
110
113
  $ annofabcli task reject --project_id prj1 --task_id file://tasks.txt --cancel_acceptance \
111
114
  --comment "carラベルのoccluded属性を見直してください"
112
115
 
113
- ```
114
-
115
- # 補足
116
-
117
- # Windowsでannofabcliを使う場合
118
- WindowsのコマンドプロンプトやPowerShellでannofabcliを使う場合、JSON文字列内の二重引用をエスケープする必要があります。
119
-
120
- ```
121
- > annofabcli task list --project_id prj1 --task_query '{"\status\": \"complete\"}'
122
- ```
116
+ ```