annofabcli 1.100.0__py3-none-any.whl → 100.2__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 (28) hide show
  1. annofabcli/__version__.py +1 -1
  2. annofabcli/annotation/change_annotation_attributes.py +2 -2
  3. annofabcli/annotation_specs/list_annotation_specs_attribute.py +51 -33
  4. annofabcli/annotation_specs/list_annotation_specs_choice.py +42 -17
  5. annofabcli/annotation_specs/list_annotation_specs_label.py +26 -93
  6. annofabcli/annotation_specs/list_annotation_specs_label_attribute.py +220 -0
  7. annofabcli/annotation_specs/subcommand_annotation_specs.py +2 -0
  8. annofabcli/common/annofab/annotation_specs.py +25 -0
  9. annofabcli/common/download.py +1 -1
  10. annofabcli/common/exceptions.py +2 -2
  11. annofabcli/common/facade.py +2 -2
  12. annofabcli/common/image.py +2 -2
  13. annofabcli/input_data/delete_input_data.py +6 -7
  14. annofabcli/job/delete_job.py +4 -4
  15. annofabcli/organization_member/list_organization_member.py +2 -3
  16. annofabcli/project_member/change_project_members.py +2 -3
  17. annofabcli/project_member/drop_project_members.py +8 -8
  18. annofabcli/project_member/invite_project_members.py +5 -6
  19. annofabcli/project_member/list_users.py +4 -4
  20. annofabcli/task/complete_tasks.py +2 -2
  21. annofabcli/task/reject_tasks.py +76 -100
  22. annofabcli/task/update_metadata_of_task.py +1 -1
  23. annofabcli/task_history/list_task_history.py +1 -1
  24. {annofabcli-1.100.0.dist-info → annofabcli-100.2.dist-info}/METADATA +1 -1
  25. {annofabcli-1.100.0.dist-info → annofabcli-100.2.dist-info}/RECORD +28 -26
  26. {annofabcli-1.100.0.dist-info → annofabcli-100.2.dist-info}/LICENSE +0 -0
  27. {annofabcli-1.100.0.dist-info → annofabcli-100.2.dist-info}/WHEEL +0 -0
  28. {annofabcli-1.100.0.dist-info → annofabcli-100.2.dist-info}/entry_points.txt +0 -0
@@ -27,7 +27,6 @@ from annofabcli.common.cli import (
27
27
  )
28
28
  from annofabcli.common.enums import CustomProjectType
29
29
  from annofabcli.common.facade import AnnofabApiFacade, TaskQuery, match_task_with_query
30
- from annofabcli.common.utils import add_dryrun_prefix
31
30
 
32
31
  logger = logging.getLogger(__name__)
33
32
 
@@ -39,12 +38,12 @@ class RejectTasksMain(CommandLineWithConfirm):
39
38
  self.comment_data = comment_data
40
39
  CommandLineWithConfirm.__init__(self, all_yes)
41
40
 
42
- def add_inspection_comment( # noqa: ANN201
41
+ def add_inspection_comment(
43
42
  self,
44
43
  project_id: str,
45
44
  task: dict[str, Any],
46
45
  inspection_comment: str,
47
- ):
46
+ ) -> None:
48
47
  """
49
48
  検査コメントを付与する。
50
49
 
@@ -53,9 +52,6 @@ class RejectTasksMain(CommandLineWithConfirm):
53
52
  task:
54
53
  inspection_comment:
55
54
 
56
- Returns:
57
- 更新した検査コメントの一覧
58
-
59
55
  """
60
56
  first_input_data_id = task["input_data_id_list"][0]
61
57
 
@@ -72,14 +68,14 @@ class RejectTasksMain(CommandLineWithConfirm):
72
68
  }
73
69
  ]
74
70
 
75
- return self.service.api.batch_update_comments(project_id, task["task_id"], first_input_data_id, request_body=req_inspection)[0]
71
+ self.service.api.batch_update_comments(project_id, task["task_id"], first_input_data_id, request_body=req_inspection)
76
72
 
77
73
  def confirm_reject_task(self, task_id: str, assign_last_annotator: bool, assigned_annotator_user_id: Optional[str]) -> bool: # noqa: FBT001
78
- confirm_message = f"task_id = {task_id} のタスクを差し戻しますか?"
74
+ confirm_message = f"task_id='{task_id}' のタスクを差し戻しますか?"
79
75
  if assign_last_annotator:
80
- confirm_message += "最後のannotation phaseの担当者を割り当てます。"
76
+ confirm_message += "最後の教師付フェーズの担当者を割り当てます。"
81
77
  elif assigned_annotator_user_id is not None:
82
- confirm_message += f"ユーザ '{assigned_annotator_user_id}' を担当者に割り当てます。"
78
+ confirm_message += f"user_id='{assigned_annotator_user_id}'のユーザーを担当者に割り当てます。"
83
79
  else:
84
80
  confirm_message += "担当者は割り当てません。"
85
81
 
@@ -99,50 +95,53 @@ class RejectTasksMain(CommandLineWithConfirm):
99
95
 
100
96
  task_id = task["task_id"]
101
97
  last_updated_datetime = task["updated_datetime"]
102
- try:
103
- if task["account_id"] != self.service.api.account_id:
104
- _task = self.service.wrapper.change_task_operator(
105
- project_id,
106
- task_id,
107
- operator_account_id=self.service.api.account_id,
108
- last_updated_datetime=last_updated_datetime,
109
- )
110
- last_updated_datetime = _task["updated_datetime"]
111
- logger.debug(f"{task_id}: 担当者を自分自身に変更しました。")
112
-
113
- changed_task = self.service.wrapper.change_task_status_to_working(project_id, task_id, last_updated_datetime=last_updated_datetime)
114
- return changed_task # noqa: TRY300
98
+ if task["account_id"] != self.service.api.account_id:
99
+ _task = self.service.wrapper.change_task_operator(
100
+ project_id,
101
+ task_id,
102
+ operator_account_id=self.service.api.account_id,
103
+ last_updated_datetime=last_updated_datetime,
104
+ )
105
+ last_updated_datetime = _task["updated_datetime"]
106
+ logger.debug(f"task_id='{task_id}'のタスクの担当者を自分自身に変更しました。")
115
107
 
116
- except requests.HTTPError:
117
- logger.warning(f"{task_id}: 担当者の変更、または作業中状態への変更に失敗しました。", exc_info=True)
118
- raise
108
+ changed_task = self.service.wrapper.change_task_status_to_working(project_id, task_id, last_updated_datetime=last_updated_datetime)
109
+ logger.debug(f"task_id='{task_id}'のタスクのステータスを作業中に変更しました。")
110
+ return changed_task
119
111
 
120
- def _can_reject_task( # noqa: ANN202
112
+ def _can_reject_task(
121
113
  self,
122
114
  task: dict[str, Any],
123
- assign_last_annotator: bool, # noqa: FBT001
115
+ *,
116
+ assign_last_annotator: bool,
124
117
  assigned_annotator_user_id: Optional[str],
125
- cancel_acceptance: bool = False, # noqa: FBT001, FBT002
118
+ cancel_acceptance: bool = False,
126
119
  task_query: Optional[TaskQuery] = None,
127
- ):
120
+ ) -> bool:
121
+ """
122
+ 以下の状態を見て、差し戻し可能かどうかを判断します。
123
+ * タスクのフェーズやステータス
124
+ * `--task_query`の条件にマッチするかどうか
125
+ * 差し戻しの確認メッセージに対して、ユーザがOKしたかどうか
126
+ """
128
127
  task_id = task["task_id"]
129
128
  if task["phase"] == TaskPhase.ANNOTATION.value:
130
- logger.warning(f"task_id = {task_id}: annotation phaseのため、差し戻しできません。")
129
+ logger.warning(f"task_id='{task_id}' :: 教師付フェーズのため、差し戻しできません。")
131
130
  return False
132
131
 
133
132
  if task["status"] == TaskStatus.WORKING.value:
134
- logger.warning(f"task_id = {task_id} : タスクのstatusが'作業中'なので、差し戻しできません。")
133
+ logger.warning(f"task_id='{task_id}' :: タスクのstatusが'作業中'なので、差し戻しできません。")
135
134
  return False
136
135
 
137
136
  if task["status"] == TaskStatus.COMPLETE.value and not cancel_acceptance:
138
137
  logger.warning(
139
- f"task_id = {task_id} : タスクのstatusが'完了'なので、差し戻しできません。"
138
+ f"task_id='{task_id}' :: タスクのstatusが'完了'なので、差し戻しできません。"
140
139
  f"受入完了を取消す場合は、コマンドライン引数に'--cancel_acceptance'を追加してください。"
141
140
  )
142
141
  return False
143
142
 
144
143
  if not match_task_with_query(Task.from_dict(task), task_query):
145
- logger.debug(f"task_id = {task_id} : `--task_query`の条件にマッチしないため、スキップします。task_query={task_query}")
144
+ logger.debug(f"task_id='{task_id}' : `--task_query`の条件にマッチしないため、スキップします。 :: task_query='{task_query}'")
146
145
  return False
147
146
 
148
147
  if not self.confirm_reject_task(task_id, assign_last_annotator=assign_last_annotator, assigned_annotator_user_id=assigned_annotator_user_id): # noqa: SIM103
@@ -150,29 +149,20 @@ class RejectTasksMain(CommandLineWithConfirm):
150
149
 
151
150
  return True
152
151
 
153
- def _cancel_acceptance(self, task: dict[str, Any]) -> dict[str, Any]:
154
- request_body = {
155
- "status": "not_started",
156
- "account_id": self.service.api.account_id,
157
- "last_updated_datetime": task["updated_datetime"],
158
- }
159
- content, _ = self.service.api.operate_task(task["project_id"], task["task_id"], request_body=request_body)
160
- return content
161
-
162
152
  def reject_task_with_adding_comment(
163
153
  self,
164
154
  project_id: str,
165
155
  task_id: str,
156
+ *,
166
157
  inspection_comment: Optional[str] = None,
167
- assign_last_annotator: bool = True, # noqa: FBT001, FBT002
158
+ assign_last_annotator: bool = True,
168
159
  assigned_annotator_user_id: Optional[str] = None,
169
- cancel_acceptance: bool = False, # noqa: FBT001, FBT002
160
+ cancel_acceptance: bool = False,
170
161
  task_query: Optional[TaskQuery] = None,
171
162
  task_index: Optional[int] = None,
172
- dryrun: bool = False, # noqa: FBT001, FBT002
173
163
  ) -> bool:
174
164
  """
175
- タスクを強制的に差し戻す
165
+ タスクを差し戻します。
176
166
 
177
167
  Args:
178
168
  project_id:
@@ -185,36 +175,14 @@ class RejectTasksMain(CommandLineWithConfirm):
185
175
  タスクを差し戻したかどうか
186
176
  """
187
177
 
188
- def _add_inspection_comment(task: dict[str, Any], inspection_comment: str) -> dict[str, Any]:
189
- # 検査コメントを付与する
190
- if not dryrun:
191
- # 検査コメントを付与するには「作業中」状態にする必要があるので、担当者を自分自身に変更して作業中状態にする
192
- task = self.change_to_working_status(project_id, task)
193
-
194
- try:
195
- self.add_inspection_comment(project_id, task, inspection_comment)
196
- # 作業時間が増えすぎないようにするため、すぐに休憩中状態にする
197
- task = self.service.wrapper.change_task_status_to_break(project_id, task_id, last_updated_datetime=task["updated_datetime"])
198
- logger.debug(f"{logging_prefix} : task_id = {task_id}, 検査コメントを付与しました。")
199
- return task # noqa: TRY300
200
- except requests.exceptions.HTTPError:
201
- logger.warning(f"{logging_prefix} : task_id = {task_id} 検査コメントの付与に失敗しました。", exc_info=True)
202
- # 作業時間が増えすぎないようにするため、すぐに休憩中状態にする
203
- self.service.wrapper.change_task_status_to_break(project_id, task_id, last_updated_datetime=task["updated_datetime"])
204
- raise
205
- else:
206
- task, _ = self.service.api.get_task(project_id, task_id)
207
- logger.debug(f"{logging_prefix} : task_id = {task_id}, 検査コメントを付与しました。")
208
- return task
209
-
210
178
  logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
211
179
 
212
180
  task = self.service.wrapper.get_task_or_none(project_id, task_id)
213
181
  if task is None:
214
- logger.warning(f"{logging_prefix} : task_id='{task_id}'のタスクをは存在しないので、スキップします。")
182
+ logger.warning(f"{logging_prefix} :: task_id='{task_id}'のタスクをは存在しないので、スキップします。")
215
183
  return False
216
184
 
217
- logger.debug(f"{logging_prefix} : task_id = {task['task_id']}, status = {task['status']}, phase = {task['phase']}, ")
185
+ logger.debug(f"{logging_prefix} :: task_id='{task['task_id']}', status='{task['status']}', phase='{task['phase']}'")
218
186
 
219
187
  if not self._can_reject_task(
220
188
  task=task,
@@ -225,19 +193,27 @@ class RejectTasksMain(CommandLineWithConfirm):
225
193
  ):
226
194
  return False
227
195
 
228
- if task["status"] == TaskStatus.COMPLETE.value and cancel_acceptance and not dryrun:
229
- task = self._cancel_acceptance(task)
196
+ if task["status"] == TaskStatus.COMPLETE.value and cancel_acceptance:
197
+ task = self.service.wrapper.cancel_completed_task(
198
+ project_id, task_id, operator_account_id=self.service.api.account_id, last_updated_datetime=task["updated_datetime"]
199
+ )
200
+ logger.debug(f"{logging_prefix} :: task_id='{task_id}'のタスクに対して受入取消を実施(完了状態から未着手状態に変更)しました。")
230
201
 
231
- if inspection_comment is not None:
232
- task = _add_inspection_comment(task, inspection_comment)
233
202
  try:
234
- if not dryrun:
235
- # タスクを差し戻す
236
- # 担当者やステータスに関係なく差し戻すため、`force=True`を指定する
237
- self.service.wrapper.reject_task(project_id, task_id, force=True, last_updated_datetime=task["updated_datetime"])
203
+ if inspection_comment is not None:
204
+ # タスクを作業中状態にして、検査コメントを付与できる状態にする
205
+ task = self.change_to_working_status(project_id, task)
206
+ # 検査コメントを付与する
207
+ self.add_inspection_comment(project_id, task, inspection_comment)
208
+ logger.debug(f"{logging_prefix} :: task_id='{task_id}'のタスクに検査コメントを付与しました。")
209
+
210
+ # `reject_task`の`force`引数について
211
+ # 検査コメントを付与しない場合は、強制差し戻しが必要なのでTrueを指定する
212
+ # 検査コメントを付与する場合は、 強制差し戻しは不要。チェッカーロールでも実行できるようにするため、Falseにする
213
+ self.service.wrapper.reject_task(project_id, task_id, force=(inspection_comment is None), last_updated_datetime=task["updated_datetime"])
238
214
 
239
215
  if assign_last_annotator:
240
- logger.info(f"{logging_prefix} : task_id = {task_id} のタスクを差し戻しました。タスクの担当者は直前の教師付フェーズの担当者です。")
216
+ logger.debug(f"{logging_prefix} :: task_id='{task_id}' のタスクを差し戻しました。タスクの担当者は直前の教師付フェーズの担当者です。")
241
217
  return True
242
218
 
243
219
  else:
@@ -247,14 +223,21 @@ class RejectTasksMain(CommandLineWithConfirm):
247
223
  else None
248
224
  )
249
225
 
250
- if not dryrun:
251
- self.service.wrapper.change_task_operator(project_id, task_id, operator_account_id=assigned_annotator_account_id)
226
+ self.service.wrapper.change_task_operator(project_id, task_id, operator_account_id=assigned_annotator_account_id)
252
227
 
253
- logger.info(f"{logging_prefix} : task_id = {task_id} のタスクを差し戻しました。タスクの担当者: {assigned_annotator_user_id}")
228
+ logger.debug(f"{logging_prefix} :: task_id='{task_id}' のタスクを差し戻しました。タスクの担当者: '{assigned_annotator_user_id}'")
254
229
  return True
255
230
 
256
231
  except requests.exceptions.HTTPError:
257
- logger.warning(f"{logging_prefix} : task_id = {task_id} タスクの差し戻しに失敗しました。", exc_info=True)
232
+ logger.warning(f"{logging_prefix} : task_id='{task_id}'のタスクの差し戻しに失敗しました。", exc_info=True)
233
+
234
+ task, _ = self.service.api.get_task(project_id, task_id)
235
+ assert task is not None
236
+ # 作業中状態のまま放置すると、作業時間が超過してしまうため、休憩状態にする
237
+ if task["status"] == TaskStatus.WORKING.value:
238
+ self.service.wrapper.change_task_status_to_break(project_id, task_id, last_updated_datetime=task["updated_datetime"])
239
+ logger.debug(f"{logging_prefix} :: task_id='{task_id}' のタスクを休憩状態に戻しました。")
240
+
258
241
  return False
259
242
 
260
243
  def reject_task_for_task_wrapper(
@@ -266,7 +249,6 @@ class RejectTasksMain(CommandLineWithConfirm):
266
249
  assigned_annotator_user_id: Optional[str] = None,
267
250
  cancel_acceptance: bool = False, # noqa: FBT001, FBT002
268
251
  task_query: Optional[TaskQuery] = None,
269
- dryrun: bool = False, # noqa: FBT001, FBT002
270
252
  ) -> bool:
271
253
  task_index, task_id = tpl
272
254
  try:
@@ -279,7 +261,6 @@ class RejectTasksMain(CommandLineWithConfirm):
279
261
  assigned_annotator_user_id=assigned_annotator_user_id,
280
262
  cancel_acceptance=cancel_acceptance,
281
263
  task_query=task_query,
282
- dryrun=dryrun,
283
264
  )
284
265
  except Exception: # pylint: disable=broad-except
285
266
  logger.warning(f"タスク'{task_id}'の差し戻しに失敗しました。", exc_info=True)
@@ -295,7 +276,6 @@ class RejectTasksMain(CommandLineWithConfirm):
295
276
  cancel_acceptance: bool = False, # noqa: FBT001, FBT002
296
277
  task_query: Optional[TaskQuery] = None,
297
278
  parallelism: Optional[int] = None,
298
- dryrun: bool = False, # noqa: FBT001, FBT002
299
279
  ) -> None:
300
280
  if task_query is not None:
301
281
  task_query = self.facade.set_account_id_of_task_query(project_id, task_query)
@@ -311,7 +291,6 @@ class RejectTasksMain(CommandLineWithConfirm):
311
291
  assigned_annotator_user_id=assigned_annotator_user_id,
312
292
  cancel_acceptance=cancel_acceptance,
313
293
  task_query=task_query,
314
- dryrun=dryrun,
315
294
  )
316
295
  with multiprocessing.Pool(parallelism) as pool:
317
296
  result_bool_list = pool.map(partial_func, enumerate(task_id_list))
@@ -331,7 +310,6 @@ class RejectTasksMain(CommandLineWithConfirm):
331
310
  assigned_annotator_user_id=assigned_annotator_user_id,
332
311
  cancel_acceptance=cancel_acceptance,
333
312
  task_query=task_query,
334
- dryrun=dryrun,
335
313
  )
336
314
  if result:
337
315
  success_count += 1
@@ -360,13 +338,14 @@ class RejectTasks(CommandLine):
360
338
  if not self.validate(args):
361
339
  sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
362
340
 
363
- if args.dryrun:
364
- add_dryrun_prefix(logger)
365
-
366
341
  task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id)
367
342
  assign_last_annotator = not args.not_assign and args.assigned_annotator_user_id is None
368
343
 
369
- super().validate_project(args.project_id, [ProjectMemberRole.OWNER])
344
+ if not args.cancel_acceptance and args.comment is not None:
345
+ # 受入取消を実施しない AND 検査コメントを付与する場合はチェッカーロールでも実行できる
346
+ super().validate_project(args.project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER])
347
+ else:
348
+ super().validate_project(args.project_id, [ProjectMemberRole.OWNER])
370
349
 
371
350
  dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
372
351
  task_query: Optional[TaskQuery] = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
@@ -405,7 +384,6 @@ class RejectTasks(CommandLine):
405
384
  cancel_acceptance=args.cancel_acceptance,
406
385
  task_query=task_query,
407
386
  parallelism=args.parallelism,
408
- dryrun=args.dryrun,
409
387
  )
410
388
 
411
389
 
@@ -474,7 +452,6 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
474
452
  choices=PARALLELISM_CHOICES,
475
453
  help="使用するプロセス数(並列度)を指定してください。指定する場合は必ず ``--yes`` を指定してください。指定しない場合は、逐次的に処理します。", # noqa: E501
476
454
  )
477
- parser.add_argument("--dryrun", action="store_true", help="差し戻しが行われた時の結果を表示しますが、実際はタスクを差し戻しません。")
478
455
 
479
456
  parser.set_defaults(subcommand_func=main)
480
457
 
@@ -482,12 +459,11 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
482
459
  def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
483
460
  subcommand_name = "reject"
484
461
  subcommand_help = "タスクを差し戻します。"
485
- description = (
486
- "タスクを差し戻します。差し戻す際、検査コメントを付与することもできます。"
487
- "作業中状態のタスクに対しては指し戻せません。"
488
- "このコマンドで差し戻したタスクは、画面から差し戻したタスクとは異なり、抜取検査・抜取受入のスキップ判定に影響を及ぼしません。"
462
+ description = "タスクを差し戻します。差し戻す際、検査コメントを付与することもできます。作業中状態のタスクに対しては差し戻せません。"
463
+ epilog = (
464
+ "オーナロールを持つユーザで実行してください。"
465
+ "``--cancel_acceptance`` を指定していない AND ``--comment`` を指定している場合は、チェッカーロールを持つユーザーも実行できます。"
489
466
  )
490
- epilog = "オーナロールを持つユーザで実行してください。"
491
467
 
492
468
  parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description, epilog=epilog)
493
469
  parse_args(parser)
@@ -259,7 +259,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
259
259
  parser.add_argument(
260
260
  "--overwrite",
261
261
  action="store_true",
262
- help="指定した場合、メタデータを上書きして更新します(すでに設定されているメタデータは削除されます)。指定しない場合、 ``--metadata`` に指定されたキーのみ更新されます。", # noqa: E501
262
+ help="指定した場合、メタデータを上書きして更新します(すでに設定されているメタデータは削除されます)。指定しない場合、 ``--metadata`` に指定されたキーのみ更新されます。 ``--yes`` と一緒に指定すると、処理時間は大幅に短くなります。", # noqa: E501
263
263
  )
264
264
 
265
265
  parser.add_argument(
@@ -42,7 +42,7 @@ class ListTaskHistoryMain:
42
42
  logger.info(f"{task_index + 1} 件のタスクの履歴情報を取得しました。")
43
43
  if task_history_list is not None:
44
44
  if len(task_history_list) == 0:
45
- logger.debug(f"task_id='{task_id}`の履歴情報は0件でした。")
45
+ logger.debug(f"task_id='{task_id}'の履歴情報は0件でした。")
46
46
  task_history_dict[task_id] = task_history_list
47
47
  else:
48
48
  logger.warning(f"task_id='{task_id}'のタスク履歴は見つかりませんでした。")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annofabcli
3
- Version: 1.100.0
3
+ Version: 100.2
4
4
  Summary: Utility Command Line Interface for AnnoFab
5
5
  Home-page: https://github.com/kurusugawa-computer/annofab-cli
6
6
  License: MIT
@@ -1,9 +1,9 @@
1
1
  annofabcli/__init__.py,sha256=NMA7kFxmLlCiILQPHJa9mEuqXxtLALw_dwyXYsvz4VM,71
2
2
  annofabcli/__main__.py,sha256=JzfycqVG9ENhWOCxTouZwpHwWTSrI-grLsaMudxjyBM,5283
3
- annofabcli/__version__.py,sha256=dUr4eX15ANvVvF9dFn0nvORXDPYQuwF3JTLja9gFVYs,133
3
+ annofabcli/__version__.py,sha256=Zf6jptBnhNJPjSKOJvXlAM7MrEmW-Z5EtTA-wLPYOmo,131
4
4
  annofabcli/annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  annofabcli/annotation/annotation_query.py,sha256=ke3W3RT1-WfFzwt-TXcQwGmghG34vcKJkM_jxgbNKjU,15922
6
- annofabcli/annotation/change_annotation_attributes.py,sha256=zHXyENZfbMGL_15xiK7Cy4cQ2sV0GjSVmKuPm3sOX7Y,17173
6
+ annofabcli/annotation/change_annotation_attributes.py,sha256=sNH2CDNATdPGyE5fELj-ddeyEWb55PmKG8qJD1gjocg,17177
7
7
  annofabcli/annotation/change_annotation_properties.py,sha256=Q9uaVSokjtHT0JhEHn22kcKBBqleopPMVOrtbFPOrw0,18386
8
8
  annofabcli/annotation/copy_annotation.py,sha256=j1COCdUj7-VyWZG8q8UrWMbzmWi6ofnW20EnT1GPx04,18201
9
9
  annofabcli/annotation/delete_annotation.py,sha256=4hLpJdP4Ax-z_93ftRu2ua9r1YGXkOrs8ssr5qz6k7s,10513
@@ -23,14 +23,15 @@ annofabcli/annotation_specs/export_annotation_specs.py,sha256=eZF5fj2P5U22_5UKgb
23
23
  annofabcli/annotation_specs/get_annotation_specs_with_attribute_id_replaced.py,sha256=L0H0M31Amnm3ZEg9JdQe2A1vprsCLPTpj0LUFnP6GDY,8330
24
24
  annofabcli/annotation_specs/get_annotation_specs_with_choice_id_replaced.py,sha256=mISJAgRTBMvISPk5__0w0MmhTkyQCcGPDin8K97x5Eg,6943
25
25
  annofabcli/annotation_specs/get_annotation_specs_with_label_id_replaced.py,sha256=5tlvSdUXAUn8uQ1BXNWxkR2MIKnV6AJoxveiwD21IAo,7114
26
- annofabcli/annotation_specs/list_annotation_specs_attribute.py,sha256=FTnChEjC73PDGOTIoxcsyNVrLxMAw7-tCkON2UkLfn8,9840
27
- annofabcli/annotation_specs/list_annotation_specs_choice.py,sha256=-EYegswyBlJRGp65bvqrJ2cAUkkuGQ3mTedQKf1dNXk,8261
26
+ annofabcli/annotation_specs/list_annotation_specs_attribute.py,sha256=3acxTzsxVvL2rYwQ9jzpJrwjr_KHVkTzSS4bRRTXBaM,10780
27
+ annofabcli/annotation_specs/list_annotation_specs_choice.py,sha256=hhkK-i6r4x0fEa-75mZY72YjdoXtfK6epMjzIsyZ0I8,9142
28
28
  annofabcli/annotation_specs/list_annotation_specs_history.py,sha256=DtF8X8hA3N54TLPZjHwc9LKFSMs2xem1QiI_BzPPt5s,2520
29
- annofabcli/annotation_specs/list_annotation_specs_label.py,sha256=5k7lDJS1oCi1JS0sLsjyczQ_9W5-jR2AOrZn8dAx1ys,11755
29
+ annofabcli/annotation_specs/list_annotation_specs_label.py,sha256=YI0vsE4VOfqq5p0mHUiMIQZgUu2tZZ2ZzIWhfnoiJOo,8869
30
+ annofabcli/annotation_specs/list_annotation_specs_label_attribute.py,sha256=inMEDMo4TxhRMkwNKeHZrurK06yydEaywqHjUzSxnQg,9348
30
31
  annofabcli/annotation_specs/list_attribute_restriction.py,sha256=NpCnT2jpTzqtkzksGUqDjhpqJ4-kL_EnfjBTLF9o3Uw,6506
31
32
  annofabcli/annotation_specs/list_label_color.py,sha256=huHBAb-LVLe-tj5ZALiBkFgZlZSTvi2ZDsPYgJPDZ2Q,2356
32
33
  annofabcli/annotation_specs/put_label_color.py,sha256=HJTczQiE7uwdnpHh0Lyz_WuvtyXOxYt8RThBXpvjKgA,6057
33
- annofabcli/annotation_specs/subcommand_annotation_specs.py,sha256=drJSzCmqPYzDZkvkWrMMsyNVAu8qhjnlGV0pOkebZeo,2526
34
+ annofabcli/annotation_specs/subcommand_annotation_specs.py,sha256=yqSjV1S3CSB0sFqelLBNkPy9RrVyGNRnSWCnaLTjUsc,2692
34
35
  annofabcli/comment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
36
  annofabcli/comment/delete_comment.py,sha256=EsQtUCq-HZtYmHQiXq4KbkgjqS4NPlC44MJQKgUzhnY,11458
36
37
  annofabcli/comment/download_comment_json.py,sha256=YfqUnMgvLgVFV7FJPIXwirREkQ2E63fXeCaF4hfwk8c,2338
@@ -46,15 +47,16 @@ annofabcli/comment/subcommand_comment.py,sha256=gd8w8ArXM1Tq9VUduDgn8m4G6HwevRWJ
46
47
  annofabcli/comment/utils.py,sha256=aUj7U6MtGh64F3Ko83y4NKPKyWAqcg-c1XLqjkmIpSk,350
47
48
  annofabcli/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
49
  annofabcli/common/annofab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ annofabcli/common/annofab/annotation_specs.py,sha256=h-YSnuK0riCLoJMmV-KDP3JS-_JMqx0feSvPAB3xCSI,765
49
51
  annofabcli/common/annofab/project.py,sha256=BK96o9OO961yfUvcjuHG1DeJ2bMMEYTS5ujtJCvD_4I,891
50
52
  annofabcli/common/bokeh.py,sha256=x5-Siok3cIhq-biTOb3JG91_q--ob1m48TDgB72P1Hc,1071
51
53
  annofabcli/common/cli.py,sha256=Z19cO7zaoRrIoJYjsjeJ5mQkYs1pHgpY13y1XyGSJaY,24936
52
54
  annofabcli/common/dataclasses.py,sha256=FRDihsB-H5P5ioVE3kfJtorsS5EbSMySlHrp8BJ3ktg,385
53
- annofabcli/common/download.py,sha256=Iq2vzyvS-pV7gBqHo4Wh-h9N-hNcENSshpdr1QWdyms,14510
55
+ annofabcli/common/download.py,sha256=KKfWM546cEClTTKfSmQzupZ1dq34sKEcBvOnkuFo144,14512
54
56
  annofabcli/common/enums.py,sha256=pnMZEk8ADK2qO2Hmujx6NxeCwvSAEDNhmgK4ajPSC9Q,1233
55
- annofabcli/common/exceptions.py,sha256=YNg96v_rSDD-WZ_Z0v_n58BmlDb2VX_k7HCA-RAD9iY,2067
56
- annofabcli/common/facade.py,sha256=rzP2mpEhn__4B13hyjeaB15W8BrjvEaLC8sSPKR_abA,19409
57
- annofabcli/common/image.py,sha256=m5_hi0RD14_l-yyUsILaIniwM_vpgF7wa_jZXJzOZ7c,16724
57
+ annofabcli/common/exceptions.py,sha256=trgC5eqvy7jgqOQ41pbAOC__uxy19GgrM9NAgkH_lBw,2051
58
+ annofabcli/common/facade.py,sha256=1d5DxC4O5yHr0gisqaqgkacY5Omn1X-L1syPnYPyiwQ,19401
59
+ annofabcli/common/image.py,sha256=3uNv5n4NT9W6H_9OyiLBkXJ4lEoTcYCwDFO-HtZ7Wr4,16730
58
60
  annofabcli/common/pandas.py,sha256=IW9xqHkdRF1I6YZc7CP_9tkGxJuu1MKEXFILjhaNUU0,449
59
61
  annofabcli/common/type_util.py,sha256=i3r5pFtRYQwJrYkl1-lVQi8XOePQxTUX_cAHgBTsagM,224
60
62
  annofabcli/common/typing.py,sha256=_AcEogoaMbib0esfN2RvHshAZH0oyRb2Ro9-rbn7NJ8,330
@@ -73,7 +75,7 @@ annofabcli/filesystem/subcommand_filesystem.py,sha256=ZM2td5iZYIQ3TCI-9xAue8LugF
73
75
  annofabcli/input_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
76
  annofabcli/input_data/change_input_data_name.py,sha256=cQWoGTZKwr2_fU1WGALmRyJY39ruf9t4eMxpI06eT9g,9943
75
77
  annofabcli/input_data/copy_input_data.py,sha256=Lbyq2aW5lmJCPB8-WHdOI93a2ND5E0qOWrhBHRluQyw,14656
76
- annofabcli/input_data/delete_input_data.py,sha256=GLg58XNz9_Njq9eq2sc2BAzfLy9tJefcDYL6J4TOim4,8836
78
+ annofabcli/input_data/delete_input_data.py,sha256=NS05kUDCYxCI8M0nZwOZ-OTa3qLLgM0zrplj6W11Mxc,8858
77
79
  annofabcli/input_data/delete_metadata_key_of_input_data.py,sha256=PVv9HXQVFLKQh-4RSHas_ckFxDxtqAzWnXnWYFFYy08,8464
78
80
  annofabcli/input_data/download_input_data_json.py,sha256=vxGoeM3ZEggQbWiWsrDK0_GxQrC_UzSHAtWMYK-k_6I,2794
79
81
  annofabcli/input_data/list_all_input_data.py,sha256=Kq261WCkma5UNKfMDT7O6Z-dzzqp-KP1wL0DvHe5fH8,9879
@@ -91,7 +93,7 @@ annofabcli/instruction/list_instruction_history.py,sha256=xaA98kFqYV6I_JKyeE6Ef4
91
93
  annofabcli/instruction/subcommand_instruction.py,sha256=hSj7iYX-ad23X3wi5iMb9AZJCd1bUxFvynLJ6r3ZFGE,1169
92
94
  annofabcli/instruction/upload_instruction.py,sha256=YVWed68a5AAD0ctojZxkNt-FVMCVuseCOCdYqA-EUNU,6116
93
95
  annofabcli/job/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
- annofabcli/job/delete_job.py,sha256=TcclVS3_pp_3M6yl3mXMPtviaBIFLyf8fiCJQgr7JSY,3296
96
+ annofabcli/job/delete_job.py,sha256=vWC81MgwzAG5SYMZE9fcr1XOiAoS_AryGFuFnABRbcc,3402
95
97
  annofabcli/job/list_job.py,sha256=rePqPfXoDi8w04p6ewNiXEjiLlKv-ML6akTqFURpRVA,3245
96
98
  annofabcli/job/list_last_job.py,sha256=gjFCyfE7l37sGBps3J0h7iKjys7u1OdrRV8LxuZml64,6820
97
99
  annofabcli/job/subcommand_job.py,sha256=kzKAT067Q_zODm6H2bbwOGHMDg8q6juqWzutGQpp2As,1008
@@ -106,7 +108,7 @@ annofabcli/organization_member/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
106
108
  annofabcli/organization_member/change_organization_member.py,sha256=DrRnVHTXRp5kE8ezgkXofuL0tgpvEPxwF8MowCDv27Q,4918
107
109
  annofabcli/organization_member/delete_organization_member.py,sha256=n_TI5oLUwWi3UzaffrtmwoVvsQhqh_KocxCPxAc3JXM,4304
108
110
  annofabcli/organization_member/invite_organization_member.py,sha256=LndGMPOSTn5nlnu_Gg8XUcXe4oG6-31jbPjv7Gz9h0k,4249
109
- annofabcli/organization_member/list_organization_member.py,sha256=F2uPRamhSQBxzfSiGSRLVbSL1_VAx8WCUEVnC8ci0OI,3735
111
+ annofabcli/organization_member/list_organization_member.py,sha256=-pvYSFng4AGqYkKgN0QP6gTEDRO9jLGhL7OFjVsukC8,3721
110
112
  annofabcli/organization_member/subcommand_organization_member.py,sha256=iK-Y4PxG5J8fu0Bnf8NBixv81BRXvr3BiVUyUb3ET7A,1289
111
113
  annofabcli/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
114
  annofabcli/project/change_project_status.py,sha256=ISStxBhScMobh7VvwM7Sua5uPn8WoiuZo4NrMiBWRFY,8659
@@ -116,11 +118,11 @@ annofabcli/project/list_project.py,sha256=IMmI_AZTSFx5unl5tDPaGEzVOSmtTMVM6Nai7c
116
118
  annofabcli/project/put_project.py,sha256=4Nd7hDcUtfCDr0vdyk0eT0vPDXZvDFe79fT95dsL8ak,6084
117
119
  annofabcli/project/subcommand_project.py,sha256=1vf_oeIH-RyNYHjXfIFfuAWJDLfkgpGk2MxtAWHFXoU,1199
118
120
  annofabcli/project_member/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
- annofabcli/project_member/change_project_members.py,sha256=xWVa9KyzTzSmWjW-qpQKV1_Q8zCQ4FqxunyScnUjNC8,9369
121
+ annofabcli/project_member/change_project_members.py,sha256=T4ijjd0upIgtsAPqgo4pG2Szq3jtkd_74As0r5Er3Ks,9351
120
122
  annofabcli/project_member/copy_project_members.py,sha256=-ybJ6ftcbRq0Pl092aag5kuSu2fb05Jf0HaRSA3AKok,8941
121
- annofabcli/project_member/drop_project_members.py,sha256=t_Jqoc89JtnrIpZc1fECjO6s-qttDmsgHHTz03zJTF0,5856
122
- annofabcli/project_member/invite_project_members.py,sha256=bxciqakeSrAX5xjE6KwmhcHj4EU1haETcQ_0BYkR6O4,6377
123
- annofabcli/project_member/list_users.py,sha256=BoavUdDRoRIQjI7q_sQEZjDMcLmUwWOCZdJsR7JimJ8,4844
123
+ annofabcli/project_member/drop_project_members.py,sha256=e2xdSviYQMZc88y96JbiH5FXUyvKAdSnNfHLgazh0IQ,5891
124
+ annofabcli/project_member/invite_project_members.py,sha256=SE0yGZK4UFA_NpJtuKBR98nvNE183kKMW9h6UPmsRSk,6337
125
+ annofabcli/project_member/list_users.py,sha256=4pqvraKWMmtKIasQuowLKmz2j2h-tW_-TUzvGEKdF2I,4843
124
126
  annofabcli/project_member/put_project_members.py,sha256=-2T-XlZw-I6Am4HDf9dsNDEmaflMDvmJvMzStiya_Fc,9183
125
127
  annofabcli/project_member/subcommand_project_member.py,sha256=6cOoMiZJ82j94rSSp1GzmYggGSm1egk3S9e_YYgzhe8,1466
126
128
  annofabcli/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -181,7 +183,7 @@ annofabcli/task/cancel_acceptance.py,sha256=rHKmAzQE1a25szVWb7dexokeW32V12bkyDIY
181
183
  annofabcli/task/change_operator.py,sha256=VWsVRnG6SKhvwrzJzl8ILoLbBfOv5Mi9fbpyXkjAQY4,10592
182
184
  annofabcli/task/change_status_to_break.py,sha256=ahsviMvvzPo-wGY7NW6azU-PyPA3dVoV8x6OiEK1Clw,8635
183
185
  annofabcli/task/change_status_to_on_hold.py,sha256=lAr5vW_8s9Kmu0cUQjAlti93-fwZ6n4gZ4A-oDbCkJg,13189
184
- annofabcli/task/complete_tasks.py,sha256=QrIqsEx1W4FKXPrvoWGy1rhgGnJg7qKFOvFUi1PGU4k,25203
186
+ annofabcli/task/complete_tasks.py,sha256=eSW3sYCZA8fZjkHnmsO-QJ8hSw_TRrfk4psJXpCiPNA,25205
185
187
  annofabcli/task/copy_tasks.py,sha256=sjjauJjsufgMciZYTASm97Uxx2afMgVIwW6CGrc00sg,8692
186
188
  annofabcli/task/delete_metadata_key_of_task.py,sha256=1UnU_hFnakzFOYw8soz2_A8lPr9OdEnnGlydNRYjStM,8073
187
189
  annofabcli/task/delete_tasks.py,sha256=8C2kuq_WdwcPmUhta_yoSRvhWiD_ZfYyGoIGwF_pt3Y,13388
@@ -192,21 +194,21 @@ annofabcli/task/list_tasks.py,sha256=O4jjp_zdmurcGNWXFp9JXHJsH4nhlR5e3ok96YnD1SI
192
194
  annofabcli/task/list_tasks_added_task_history.py,sha256=Yjvv5fJjSjJ-v9bhwl4PDyU8aeT94LLMBcPhmUWlFUI,21639
193
195
  annofabcli/task/put_tasks.py,sha256=c_Vw5qnDlfpa21S-aMVxmXy8pF-z_YEUi6a0c3IV9gc,13770
194
196
  annofabcli/task/put_tasks_by_count.py,sha256=MUHfWhqtSAXnB3O36p3bMSSgQ_3Zek9GT5qRvHGx8Lo,6041
195
- annofabcli/task/reject_tasks.py,sha256=5ByAN6VnKwvU5BT_cfsHwA1jLDl74bonqk3bwtnrkPU,23139
197
+ annofabcli/task/reject_tasks.py,sha256=aW3vl3blmdI-IAuGsTpbr6z8FlJJpJPT4-fr4TV8M_g,22256
196
198
  annofabcli/task/subcommand_task.py,sha256=L_5Dwe58eblrtOrUYxjJAvkSmu6savRUxIqGjsFq-R4,2436
197
- annofabcli/task/update_metadata_of_task.py,sha256=n8RmegF3A1r-ZDOzn6SzNoHuqNuzsSJM9xUJ6EXvTf0,12810
199
+ annofabcli/task/update_metadata_of_task.py,sha256=o-kRyYu-XROgTKnPK8HyKhmKJ5dlTHiJAox-2qyuAAs,12896
198
200
  annofabcli/task_history/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
199
201
  annofabcli/task_history/download_task_history_json.py,sha256=xZnGNKkPYT6RXIUd_wUqZfPiVpGdW5MTBUSpNKbOAC4,2370
200
202
  annofabcli/task_history/list_all_task_history.py,sha256=VY99AEHTSG71O2HQXS81oPX6AAusbT1scika9QoUZEU,6780
201
- annofabcli/task_history/list_task_history.py,sha256=wWPTYG-YCsGWIsRE3-rb-MKWVjEvTMCCc--JAxl3i-I,6172
203
+ annofabcli/task_history/list_task_history.py,sha256=oUtJHUQ7H4nWxbAgmEdC1e_3yawbfwHPQEwIIpWMCBY,6172
202
204
  annofabcli/task_history/subcommand_task_history.py,sha256=_CvM1ts60GT15iXmsb4CHOyL170ier-q-p9edVuNLvc,1066
203
205
  annofabcli/task_history_event/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
206
  annofabcli/task_history_event/download_task_history_event_json.py,sha256=hQLVbQ0HjdiRpXC9tEt_Py3W_b0mo3eVIa-zp0z3fgU,2434
205
207
  annofabcli/task_history_event/list_all_task_history_event.py,sha256=JQEgwOIXbbTIfeX23AVaoySHViOR9UGm9uoXuhVEBqo,6446
206
208
  annofabcli/task_history_event/list_worktime.py,sha256=9jsRYa2C9bva8E1Aqxv9CCKDuCP0MvbiaIyQFTDpjqY,13150
207
209
  annofabcli/task_history_event/subcommand_task_history_event.py,sha256=mJVJoT4RXk4HWnY7-Nrsl4If-gtaIIEXd2z7eFZwM2I,1260
208
- annofabcli-1.100.0.dist-info/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
209
- annofabcli-1.100.0.dist-info/METADATA,sha256=D6vox4mFbf_7OANw2TaeIwWk6j6aPHwm4vYKVvhoD8M,5631
210
- annofabcli-1.100.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
211
- annofabcli-1.100.0.dist-info/entry_points.txt,sha256=A8vlN9fiMhbYRcdBfSpl7piYzAwvkMhRXIPQUAvQFUo,55
212
- annofabcli-1.100.0.dist-info/RECORD,,
210
+ annofabcli-100.2.dist-info/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
211
+ annofabcli-100.2.dist-info/METADATA,sha256=-lB1-fYDD0b_WmOcmwcF7jauX0zpqaadto7Qnkya4KE,5629
212
+ annofabcli-100.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
213
+ annofabcli-100.2.dist-info/entry_points.txt,sha256=A8vlN9fiMhbYRcdBfSpl7piYzAwvkMhRXIPQUAvQFUo,55
214
+ annofabcli-100.2.dist-info/RECORD,,