annofabcli 1.98.0__py3-none-any.whl → 1.99.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.
@@ -9,7 +9,7 @@ import annofabapi
9
9
  import more_itertools
10
10
  import pandas
11
11
  from annofabapi.models import Task, TaskHistory, TaskPhase, TaskStatus
12
- from annofabapi.util.task_history import find_rejected_task_history_indices
12
+ from annofabapi.util.task_history import find_rejected_task_history_indices, get_task_creation_datetime
13
13
  from annofabapi.utils import get_task_history_index_skipped_acceptance, get_task_history_index_skipped_inspection
14
14
 
15
15
  import annofabcli
@@ -93,162 +93,165 @@ def get_post_rejection_acceptance_worktime_hour(task_histories: list[TaskHistory
93
93
  )
94
94
 
95
95
 
96
- class AddingAdditionalInfoToTask:
97
- """タスクに付加的な情報を追加するためのクラス
96
+ def get_completed_datetime(task: dict[str, Any], task_histories: list[TaskHistory]) -> Optional[str]:
97
+ """受入完了状態になった日時を取得する。
98
98
 
99
99
  Args:
100
- service: annofabapiにアクセスするためのインスタンス
101
- project_id: プロジェクトID
100
+ task_histories (List[TaskHistory]): [description]
102
101
 
102
+ Returns:
103
+ str: 受入完了状態になった日時
103
104
  """
105
+ # 受入完了日時を設定
106
+ if task["phase"] == TaskPhase.ACCEPTANCE.value and task["status"] == TaskStatus.COMPLETE.value:
107
+ assert len(task_histories) > 0, (
108
+ f"task_id='{task['task_id']}'のタスク履歴が0件です。参照しているタスク履歴情報が古い可能性があります。 "
109
+ f":: phase='{task['phase']}', status='{task['status']}'"
110
+ )
111
+ return task_histories[-1]["ended_datetime"]
112
+ else:
113
+ return None
104
114
 
105
- def __init__(self, service: annofabapi.Resource, project_id: str) -> None:
106
- self.service = service
107
- self.project_id = project_id
108
- self.visualize = AddProps(self.service, project_id)
109
115
 
110
- @staticmethod
111
- def get_completed_datetime(task: dict[str, Any], task_histories: list[TaskHistory]) -> Optional[str]:
112
- """受入完了状態になった日時を取得する。
116
+ def get_first_acceptance_completed_datetime(task_histories: list[TaskHistory]) -> Optional[str]:
117
+ """はじめて受入完了状態になった日時を取得する。
113
118
 
114
- Args:
115
- task_histories (List[TaskHistory]): [description]
119
+ Args:
120
+ task_histories (List[TaskHistory]): [description]
116
121
 
117
- Returns:
118
- str: 受入完了状態になった日時
119
- """
120
- # 受入完了日時を設定
121
- if task["phase"] == TaskPhase.ACCEPTANCE.value and task["status"] == TaskStatus.COMPLETE.value:
122
- assert len(task_histories) > 0, (
123
- f"task_id='{task['task_id']}'のタスク履歴が0件です。参照しているタスク履歴情報が古い可能性があります。 "
124
- f":: phase='{task['phase']}', status='{task['status']}'"
125
- )
126
- return task_histories[-1]["ended_datetime"]
127
- else:
128
- return None
122
+ Returns:
123
+ str: はじめて受入完了状態になった日時
124
+ """
125
+ # 受入フェーズで完了日時がnot Noneの場合は、受入を合格したか差し戻したとき。
126
+ # したがって、後続のタスク履歴を見て、初めて受入完了状態になった日時を取得する。
129
127
 
130
- @staticmethod
131
- def get_task_created_datetime(task: dict[str, Any], task_histories: list[TaskHistory]) -> Optional[str]:
132
- """タスクの作成日時を取得する。
128
+ for index, history in enumerate(task_histories):
129
+ if history["phase"] != TaskPhase.ACCEPTANCE.value or history["ended_datetime"] is None:
130
+ continue
133
131
 
134
- Args:
135
- task_histories (List[TaskHistory]): タスク履歴
132
+ if index == len(task_histories) - 1:
133
+ # 末尾履歴なら、受入完了状態
134
+ return history["ended_datetime"]
136
135
 
137
- Returns:
138
- タスクの作成日時
139
- """
140
- # 受入フェーズで完了日時がnot Noneの場合は、受入を合格したか差し戻したとき。
141
- # したがって、後続のタスク履歴を見て、初めて受入完了状態になった日時を取得する。
142
- if len(task_histories) == 0:
143
- return None
144
-
145
- first_history = task_histories[0]
146
- # 2020年以前は、先頭のタスク履歴はタスク作成ではなく、教師付けの履歴である。2020年以前はタスク作成日時を取得できないのでNoneを返す。
147
- # https://annofab.com/docs/releases/2020.html#v01020
148
- if (
149
- first_history["account_id"] is None
150
- and first_history["accumulated_labor_time_milliseconds"] == "PT0S"
151
- and first_history["phase"] == TaskPhase.ANNOTATION.value
152
- ):
153
- if len(task_histories) == 1:
154
- # 一度も作業されていないタスクは、先頭のタスク履歴のstarted_datetimeはNoneである
155
- # 替わりにタスクの`operation_updated_datetime`をタスク作成日時とする
156
- return task["operation_updated_datetime"]
157
- return first_history["started_datetime"]
158
- return None
136
+ next_history = task_histories[index + 1]
137
+ if next_history["phase"] == TaskPhase.ACCEPTANCE.value:
138
+ # 受入完了後、受入取り消し実行
139
+ return history["ended_datetime"]
140
+ # そうでなければ、受入フェーズでの差し戻し
159
141
 
160
- @staticmethod
161
- def get_first_acceptance_completed_datetime(task_histories: list[TaskHistory]) -> Optional[str]:
162
- """はじめて受入完了状態になった日時を取得する。
142
+ return None
163
143
 
164
- Args:
165
- task_histories (List[TaskHistory]): [description]
166
144
 
167
- Returns:
168
- str: はじめて受入完了状態になった日時
169
- """
170
- # 受入フェーズで完了日時がnot Noneの場合は、受入を合格したか差し戻したとき。
171
- # したがって、後続のタスク履歴を見て、初めて受入完了状態になった日時を取得する。
145
+ def get_first_acceptance_reached_datetime(task_histories: list[TaskHistory]) -> Optional[str]:
146
+ """
147
+ はじめて受入フェーズに到達した日時を取得する。
148
+ 受入フェーズを着手した日時とは異なる。
149
+ 必ず`first_acceptance_started_datetime`よりも前の日時になる。
172
150
 
173
- for index, history in enumerate(task_histories):
174
- if history["phase"] != TaskPhase.ACCEPTANCE.value or history["ended_datetime"] is None:
175
- continue
151
+ たとえば教師付フェーズで提出して受入フェーズに到達した場合、教師付フェーズを提出した日時が「受入フェーズに到達した日時」になる。
176
152
 
177
- if index == len(task_histories) - 1:
178
- # 末尾履歴なら、受入完了状態
179
- return history["ended_datetime"]
153
+ """
154
+ for index, history in enumerate(task_histories):
155
+ if history["phase"] != TaskPhase.ACCEPTANCE.value:
156
+ continue
180
157
 
181
- next_history = task_histories[index + 1]
182
- if next_history["phase"] == TaskPhase.ACCEPTANCE.value:
183
- # 受入完了後、受入取り消し実行
184
- return history["ended_datetime"]
185
- # そうでなければ、受入フェーズでの差し戻し
158
+ first_acceptance_reached_datetime = task_histories[index - 1]["ended_datetime"]
159
+ assert first_acceptance_reached_datetime is not None
160
+ return first_acceptance_reached_datetime
161
+ return None
186
162
 
187
- return None
188
163
 
189
- @staticmethod
190
- def get_first_acceptance_reached_datetime(task_histories: list[TaskHistory]) -> Optional[str]:
191
- """はじめて受入フェーズに到達した日時を取得する。
192
- 受入フェーズを着手した日時とは異なる。
193
- 必ず`first_acceptance_started_datetime`よりも前の日時になる。
164
+ def is_acceptance_phase_skipped(task_histories: list[TaskHistory]) -> bool:
165
+ """抜取受入によって、受入フェーズでスキップされたことがあるかを取得する。
194
166
 
195
- Args:
196
- task_histories (List[TaskHistory]): [description]
167
+ Args:
168
+ task_histories (List[TaskHistory]): タスク履歴
197
169
 
198
- """
199
- for index, history in enumerate(task_histories):
200
- if history["phase"] != TaskPhase.ACCEPTANCE.value:
201
- continue
170
+ Returns:
171
+ bool: 受入フェーズでスキップされたことがあるかどうか
172
+ """
173
+ task_history_index_list = get_task_history_index_skipped_acceptance(task_histories)
174
+ if len(task_history_index_list) == 0:
175
+ return False
176
+
177
+ # スキップされた履歴より後に受入フェーズがなければ、受入がスキップされたタスクとみなす
178
+ # ただし、スキップされた履歴より後で、「アノテーション一覧で修正された」受入フェーズがある場合(account_id is None)は、スキップされた受入とみなす。 # noqa: E501
179
+ last_task_history_index = task_history_index_list[-1]
180
+ return (
181
+ more_itertools.first_true(
182
+ task_histories[last_task_history_index + 1 :],
183
+ pred=lambda e: e["phase"] == TaskPhase.ACCEPTANCE.value and e["account_id"] is not None,
184
+ )
185
+ is None
186
+ )
202
187
 
203
- first_acceptance_reached_datetime = task_histories[index - 1]["ended_datetime"]
204
- assert first_acceptance_reached_datetime is not None
205
- return first_acceptance_reached_datetime
206
- return None
207
188
 
208
- @staticmethod
209
- def is_acceptance_phase_skipped(task_histories: list[TaskHistory]) -> bool:
210
- """抜取受入によって、受入フェーズでスキップされたことがあるかを取得する。
189
+ def calculate_total_worktime_in_phase(task_histories: list[TaskHistory], phase: TaskPhase) -> float:
190
+ """指定したフェーズの合計作業時間を計算する。
211
191
 
212
- Args:
213
- task_histories (List[TaskHistory]): タスク履歴
192
+ Args:
193
+ task_histories: タスク履歴
194
+ phase: 計算対象のフェーズ
214
195
 
215
- Returns:
216
- bool: 受入フェーズでスキップされたことがあるかどうか
217
- """
218
- task_history_index_list = get_task_history_index_skipped_acceptance(task_histories)
219
- if len(task_history_index_list) == 0:
220
- return False
196
+ Returns:
197
+ 合計作業時間
198
+ """
199
+ return sum(isoduration_to_hour(history["accumulated_labor_time_milliseconds"]) for history in task_histories if history["phase"] == phase.value)
221
200
 
222
- # スキップされた履歴より後に受入フェーズがなければ、受入がスキップされたタスクとみなす
223
- # ただし、スキップされた履歴より後で、「アノテーション一覧で修正された」受入フェーズがある場合(account_id is None)は、スキップされた受入とみなす。 # noqa: E501
224
- last_task_history_index = task_history_index_list[-1]
225
- return (
226
- more_itertools.first_true(
227
- task_histories[last_task_history_index + 1 :],
228
- pred=lambda e: e["phase"] == TaskPhase.ACCEPTANCE.value and e["account_id"] is not None,
229
- )
230
- is None
231
- )
232
201
 
233
- @staticmethod
234
- def is_inspection_phase_skipped(task_histories: list[TaskHistory]) -> bool:
235
- """抜取検査によって、検査フェーズでスキップされたことがあるかを取得する。
202
+ def get_first_task_history(task_histories: list[TaskHistory], phase: TaskPhase) -> Optional[TaskHistory]:
203
+ """
204
+ 指定したフェーズの最初に作業したタスク履歴を取得します。
205
+ 取得したタスク履歴には、account_idはnot Noneで、作業時間は0より大きいです。
236
206
 
237
- Args:
238
- task_histories (List[TaskHistory]): タスク履歴
207
+ Args:
208
+ task_histories: タスク履歴
209
+ phase: フェーズ
239
210
 
240
- Returns:
241
- bool: 検査フェーズでスキップされたことがあるかどうか
242
- """
243
- task_history_index_list = get_task_history_index_skipped_inspection(task_histories)
244
- if len(task_history_index_list) == 0:
245
- return False
211
+ Returns:
212
+ 最初のタスク履歴
213
+ """
214
+ for history in task_histories:
215
+ if (
216
+ history["phase"] == phase.value
217
+ and history["account_id"] is not None
218
+ and isoduration_to_hour(history["accumulated_labor_time_milliseconds"]) > 0
219
+ ):
220
+ return history
221
+ return None
246
222
 
247
- # スキップされた履歴より後に検査フェーズがなければ、検査がスキップされたタスクとみなす
248
- last_task_history_index = task_history_index_list[-1]
249
- return (
250
- more_itertools.first_true(task_histories[last_task_history_index + 1 :], pred=lambda e: e["phase"] == TaskPhase.INSPECTION.value) is None
251
- )
223
+
224
+ def is_inspection_phase_skipped(task_histories: list[TaskHistory]) -> bool:
225
+ """抜取検査によって、検査フェーズでスキップされたことがあるかを取得する。
226
+
227
+ Args:
228
+ task_histories (List[TaskHistory]): タスク履歴
229
+
230
+ Returns:
231
+ bool: 検査フェーズでスキップされたことがあるかどうか
232
+ """
233
+ task_history_index_list = get_task_history_index_skipped_inspection(task_histories)
234
+ if len(task_history_index_list) == 0:
235
+ return False
236
+
237
+ # スキップされた履歴より後に検査フェーズがなければ、検査がスキップされたタスクとみなす
238
+ last_task_history_index = task_history_index_list[-1]
239
+ return more_itertools.first_true(task_histories[last_task_history_index + 1 :], pred=lambda e: e["phase"] == TaskPhase.INSPECTION.value) is None
240
+
241
+
242
+ class AddingAdditionalInfoToTask:
243
+ """タスクに付加的な情報を追加するためのクラス
244
+
245
+ Args:
246
+ service: annofabapiにアクセスするためのインスタンス
247
+ project_id: プロジェクトID
248
+
249
+ """
250
+
251
+ def __init__(self, service: annofabapi.Resource, project_id: str) -> None:
252
+ self.service = service
253
+ self.project_id = project_id
254
+ self.visualize = AddProps(self.service, project_id)
252
255
 
253
256
  def _add_task_history_info(self, task: Task, task_history: Optional[TaskHistory], column_prefix: str) -> Task:
254
257
  """
@@ -294,26 +297,6 @@ class AddingAdditionalInfoToTask:
294
297
 
295
298
  return task
296
299
 
297
- def _add_task_history_info_by_phase(self, task: dict[str, Any], task_histories: list[TaskHistory], phase: TaskPhase) -> Task:
298
- task_history_by_phase = [
299
- e
300
- for e in task_histories
301
- if e["phase"] == phase.value
302
- and e["account_id"] is not None
303
- and annofabcli.common.utils.isoduration_to_hour(e["accumulated_labor_time_milliseconds"]) > 0
304
- ]
305
-
306
- # 最初の対象フェーズに関する情報を設定
307
- first_task_history = task_history_by_phase[0] if len(task_history_by_phase) > 0 else None
308
- self._add_task_history_info(task, first_task_history, column_prefix=f"first_{phase.value}")
309
-
310
- # 作業時間に関する情報を設定
311
- task[f"{phase.value}_worktime_hour"] = sum(
312
- annofabcli.common.utils.isoduration_to_hour(e["accumulated_labor_time_milliseconds"]) for e in task_history_by_phase
313
- )
314
-
315
- return task
316
-
317
300
  def add_additional_info_to_task(self, task: dict[str, Any]) -> None:
318
301
  """タスクの付加的情報を、タスクに追加する。
319
302
  以下の列を追加する。
@@ -351,23 +334,25 @@ class AddingAdditionalInfoToTask:
351
334
 
352
335
  """
353
336
  # タスク作成日時
354
- task["created_datetime"] = self.get_task_created_datetime(task, task_histories)
337
+ task["created_datetime"] = get_task_creation_datetime(task, task_histories)
355
338
 
356
339
  # フェーズごとのタスク履歴情報を追加する
357
- self._add_task_history_info_by_phase(task, task_histories, phase=TaskPhase.ANNOTATION)
358
- self._add_task_history_info_by_phase(task, task_histories, phase=TaskPhase.INSPECTION)
359
- self._add_task_history_info_by_phase(task, task_histories, phase=TaskPhase.ACCEPTANCE)
340
+ for phase in TaskPhase:
341
+ # タスク履歴から取得した作業時間を設定
342
+ task[f"{phase.value}_worktime_hour"] = calculate_total_worktime_in_phase(task_histories, phase)
343
+ first_task_history = get_first_task_history(task_histories, phase)
344
+ self._add_task_history_info(task, first_task_history, column_prefix=f"first_{phase.value}")
360
345
 
361
346
  # 初めて受入が完了した日時
362
- task["first_acceptance_reached_datetime"] = self.get_first_acceptance_reached_datetime(task_histories)
363
- task["first_acceptance_completed_datetime"] = self.get_first_acceptance_completed_datetime(task_histories)
347
+ task["first_acceptance_reached_datetime"] = get_first_acceptance_reached_datetime(task_histories)
348
+ task["first_acceptance_completed_datetime"] = get_first_acceptance_completed_datetime(task_histories)
364
349
 
365
350
  # 受入完了日時を設定
366
- task["completed_datetime"] = self.get_completed_datetime(task, task_histories)
351
+ task["completed_datetime"] = get_completed_datetime(task, task_histories)
367
352
 
368
353
  # 抜取検査/受入によって、スキップされたかどうか
369
- task["inspection_is_skipped"] = self.is_inspection_phase_skipped(task_histories)
370
- task["acceptance_is_skipped"] = self.is_acceptance_phase_skipped(task_histories)
354
+ task["inspection_is_skipped"] = is_inspection_phase_skipped(task_histories)
355
+ task["acceptance_is_skipped"] = is_acceptance_phase_skipped(task_histories)
371
356
 
372
357
  task["post_rejection_annotation_worktime_hour"] = get_post_rejection_annotation_worktime_hour(task_histories)
373
358
  task["post_rejection_inspection_worktime_hour"] = get_post_rejection_inspection_worktime_hour(task_histories)
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import argparse
4
4
  import logging
5
5
  import multiprocessing
6
+ import sys
6
7
  import tempfile
7
8
  from collections import defaultdict
8
9
  from enum import Enum
@@ -15,6 +16,7 @@ from annofabapi.models import JobStatus, ProjectJobType, ProjectMemberRole
15
16
 
16
17
  import annofabcli
17
18
  from annofabcli.common.cli import (
19
+ COMMAND_LINE_ERROR_STATUS_CODE,
18
20
  PARALLELISM_CHOICES,
19
21
  ArgumentParser,
20
22
  CommandLine,
@@ -230,13 +232,16 @@ class PutTask(CommandLine):
230
232
 
231
233
  if args.csv is not None:
232
234
  csv_file = args.csv
233
- task_relation_dict = get_task_relation_dict(csv_file)
234
- main_obj.generate_task(api_with_creating_task, task_relation_dict)
235
+ task_relation_dict_from_csv = get_task_relation_dict(csv_file)
236
+ main_obj.generate_task(api_with_creating_task, task_relation_dict_from_csv)
235
237
 
236
238
  elif args.json is not None:
237
239
  # CSVファイルに変換する
238
- task_relation_dict = get_json_from_args(args.json)
239
- main_obj.generate_task(api_with_creating_task, task_relation_dict)
240
+ task_relation_dict_from_json = get_json_from_args(args.json)
241
+ if not isinstance(task_relation_dict_from_json, dict):
242
+ print("annofabcli task put: error: JSON形式が不正です。オブジェクトを指定してください。", file=sys.stderr) # noqa: T201
243
+ sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
244
+ main_obj.generate_task(api_with_creating_task, task_relation_dict_from_json)
240
245
 
241
246
 
242
247
  def main(args: argparse.Namespace) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annofabcli
3
- Version: 1.98.0
3
+ Version: 1.99.0
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,6 +1,6 @@
1
1
  annofabcli/__init__.py,sha256=NMA7kFxmLlCiILQPHJa9mEuqXxtLALw_dwyXYsvz4VM,71
2
2
  annofabcli/__main__.py,sha256=JzfycqVG9ENhWOCxTouZwpHwWTSrI-grLsaMudxjyBM,5283
3
- annofabcli/__version__.py,sha256=dHLiPS6l0hIriGlUklNuZkVcdn7vcXe4J9YqcWD68UA,132
3
+ annofabcli/__version__.py,sha256=3vcSVu6yWUIItVt25unwZ7jMczwQM4BnBXs-Kszfrkc,132
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
6
  annofabcli/annotation/change_annotation_attributes.py,sha256=zHXyENZfbMGL_15xiK7Cy4cQ2sV0GjSVmKuPm3sOX7Y,17173
@@ -27,18 +27,18 @@ annofabcli/annotation_specs/list_annotation_specs_history.py,sha256=DtF8X8hA3N54
27
27
  annofabcli/annotation_specs/list_annotation_specs_label.py,sha256=5k7lDJS1oCi1JS0sLsjyczQ_9W5-jR2AOrZn8dAx1ys,11755
28
28
  annofabcli/annotation_specs/list_attribute_restriction.py,sha256=J1QhnUwRX09KRv2Gn7J_BITJu3IuIL3tkYe8CWcyQAw,14740
29
29
  annofabcli/annotation_specs/list_label_color.py,sha256=huHBAb-LVLe-tj5ZALiBkFgZlZSTvi2ZDsPYgJPDZ2Q,2356
30
- annofabcli/annotation_specs/put_label_color.py,sha256=uI56c-x2DRR6xmPXcJQO6dJv3qMO9j23EdBNndcOPD4,5730
30
+ annofabcli/annotation_specs/put_label_color.py,sha256=HJTczQiE7uwdnpHh0Lyz_WuvtyXOxYt8RThBXpvjKgA,6057
31
31
  annofabcli/annotation_specs/subcommand_annotation_specs.py,sha256=lhs4M5KHSGA59z-XsDuzFascZNbPxq-QnPHrUcntMf4,2384
32
32
  annofabcli/comment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- annofabcli/comment/delete_comment.py,sha256=oskNpugZdiug6Up9SkW7ettr-f031OXZhHwjU63NFVQ,11188
33
+ annofabcli/comment/delete_comment.py,sha256=EsQtUCq-HZtYmHQiXq4KbkgjqS4NPlC44MJQKgUzhnY,11458
34
34
  annofabcli/comment/download_comment_json.py,sha256=YfqUnMgvLgVFV7FJPIXwirREkQ2E63fXeCaF4hfwk8c,2338
35
35
  annofabcli/comment/list_all_comment.py,sha256=p5STKKQ4SV-vDvY1F3pKOrveZcteLTHIUEO-ci1nGes,6090
36
36
  annofabcli/comment/list_comment.py,sha256=gZSzeBeYLt0dhCi-8GcuEEB1NuJoXRdptp4oxkOtAMQ,4947
37
37
  annofabcli/comment/put_comment.py,sha256=yrxCtP9JkPvBtmZZ3vbm8XFYNKBTgwKwfGcauVvu5e8,12144
38
38
  annofabcli/comment/put_comment_simply.py,sha256=Y_RSKWMs8j5VAVV8iiJOOBHnJHEH5s3HLJrXnmmQT3o,8184
39
- annofabcli/comment/put_inspection_comment.py,sha256=ZkkAId5Hz--vtuiTJ1VUCeIme1BTUDetH2O6vtnkg_o,3599
39
+ annofabcli/comment/put_inspection_comment.py,sha256=F7m6lsbN0FHk0adwiapvD2UOv-8fbCdqfA9CtuJcnY8,3869
40
40
  annofabcli/comment/put_inspection_comment_simply.py,sha256=6oKYuihsOKkAKMzcLeUzgMu9SIJC9fWzM1VBis3asfo,6870
41
- annofabcli/comment/put_onhold_comment.py,sha256=TvJg-ojTONevgPefLRH2BK3xFNv2eiaHgYpTFajVDLo,3259
41
+ annofabcli/comment/put_onhold_comment.py,sha256=9tJ6zzOwqr80SqCSyPFEyqkWpVahHvEEsWIaHxPrB-A,3529
42
42
  annofabcli/comment/put_onhold_comment_simply.py,sha256=8w-E8aIK2SbHI9pnsfGF6IlVGC8qDt60Yjrr7Hfz1Rw,3308
43
43
  annofabcli/comment/subcommand_comment.py,sha256=gd8w8ArXM1Tq9VUduDgn8m4G6HwevRWJ36VBtGHg-5I,1537
44
44
  annofabcli/comment/utils.py,sha256=aUj7U6MtGh64F3Ko83y4NKPKyWAqcg-c1XLqjkmIpSk,350
@@ -69,7 +69,7 @@ annofabcli/filesystem/mask_user_info.py,sha256=Evmr9QhSpMG900bbOXbJNHwXHapUlNfvV
69
69
  annofabcli/filesystem/merge_annotation.py,sha256=MkGy1T9F-1tHq_BS_L_mTtgKpOMmXscrydzfSc0JKAo,10588
70
70
  annofabcli/filesystem/subcommand_filesystem.py,sha256=ZM2td5iZYIQ3TCI-9xAue8LugFlIc3WMRXrJqnjJ8-s,1186
71
71
  annofabcli/input_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- annofabcli/input_data/change_input_data_name.py,sha256=vhii3jHaEE_J8jcJ2bW66VxC9k-jtWN4tSD9vnatON4,9665
72
+ annofabcli/input_data/change_input_data_name.py,sha256=cQWoGTZKwr2_fU1WGALmRyJY39ruf9t4eMxpI06eT9g,9943
73
73
  annofabcli/input_data/copy_input_data.py,sha256=Lbyq2aW5lmJCPB8-WHdOI93a2ND5E0qOWrhBHRluQyw,14656
74
74
  annofabcli/input_data/delete_input_data.py,sha256=GLg58XNz9_Njq9eq2sc2BAzfLy9tJefcDYL6J4TOim4,8836
75
75
  annofabcli/input_data/delete_metadata_key_of_input_data.py,sha256=PVv9HXQVFLKQh-4RSHas_ckFxDxtqAzWnXnWYFFYy08,8464
@@ -77,7 +77,7 @@ annofabcli/input_data/download_input_data_json.py,sha256=vxGoeM3ZEggQbWiWsrDK0_G
77
77
  annofabcli/input_data/list_all_input_data.py,sha256=Kq261WCkma5UNKfMDT7O6Z-dzzqp-KP1wL0DvHe5fH8,9879
78
78
  annofabcli/input_data/list_all_input_data_merged_task.py,sha256=UaBJW-nMHytmQ4okg69Ew1jhC2vMNnRMgl2lEBabtUI,12850
79
79
  annofabcli/input_data/list_input_data.py,sha256=RBxsHyKg1bVIEQUFDkfrq-nJmEdEYNoCjJ2L2GgSfeU,11519
80
- annofabcli/input_data/put_input_data.py,sha256=x54C-rLJVzr1YF2GlMR0w0HJReOE3E7YKiBeuh0RsTI,17934
80
+ annofabcli/input_data/put_input_data.py,sha256=QrIe_RBXfGzpTYazy4cN8iSdHTQjq96sI0bXq6g1G_k,18233
81
81
  annofabcli/input_data/put_input_data_with_zip.py,sha256=SA4aMAwMBFgc9Lh0zmRCbmkXG4AMrcBqd5zeTSdr8lc,5566
82
82
  annofabcli/input_data/subcommand_input_data.py,sha256=X8EoxsF6PMiKrvk_r7PIe2D0WZuaPlgLJRuTiljPIdM,2048
83
83
  annofabcli/input_data/update_metadata_of_input_data.py,sha256=_cZh0GYGK6Lx5arKuTjblolkXsRdTlwuKcIHa8Nm5yQ,11583
@@ -133,12 +133,13 @@ annofabcli/statistics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
133
133
  annofabcli/statistics/histogram.py,sha256=CvzDxT2cKLSnBGSqkZE6p92PayGxYYja1YyB24M4ALU,3245
134
134
  annofabcli/statistics/linegraph.py,sha256=0kr7jVBNMiM2ECYhv3Ry5RitElKerSl9ZKxbKzfiplI,12494
135
135
  annofabcli/statistics/list_annotation_attribute.py,sha256=87jjNCOXJUbWnmswMCLN7GTjGsBfqpFJ6hViWmnj8Y4,12557
136
- annofabcli/statistics/list_annotation_count.py,sha256=GVlYYubWqjNLJD7GGxv1WivCYv0rMgYxRLeZsM3Y8hA,50344
137
- annofabcli/statistics/list_annotation_duration.py,sha256=1OFvhi5QQJDcUO4iHi3lV2fDFK8ZFaAP8vlbGpVR2s0,31907
136
+ annofabcli/statistics/list_annotation_attribute_filled_count.py,sha256=vwWeFHwTnEMdrLBauIKPFDkUCa6lXXd0GQgUAQ0LCqU,28890
137
+ annofabcli/statistics/list_annotation_count.py,sha256=nzmlHRCWt5mjeksZkeQyWqm4UaCa9SrdbNtuX9TPP5w,52907
138
+ annofabcli/statistics/list_annotation_duration.py,sha256=N7nnVUDfX_thIapqe6-z_MqReiIqNS8rhp6ewRnvXBU,32027
138
139
  annofabcli/statistics/list_video_duration.py,sha256=uNeMteRBX2JG_AWmcgMJj0Jzbq_qF7bvAwr25GmeIiw,9124
139
140
  annofabcli/statistics/list_worktime.py,sha256=C7Yu3IOW2EvhkJJv6gY3hNdS9_TOLmT_9LZsB7vLJ1o,6493
140
141
  annofabcli/statistics/scatter.py,sha256=IUCwXix9GbZb6V82wjjb5q2eamrT5HQsU_bzDTjAFnM,11011
141
- annofabcli/statistics/subcommand_statistics.py,sha256=JPixzhJGClQYVH6Tgby3KTD85df-aEJKvLAjfJCv-1E,2259
142
+ annofabcli/statistics/subcommand_statistics.py,sha256=mx18Fgxz2eG4LrF-x0vISw2qh9aLommxuQLD8cfoZhw,2416
142
143
  annofabcli/statistics/summarize_task_count.py,sha256=8OH6BBRYRjHJkWRTjU0A0OfXa7f3NIRHrxPNFlRt_hM,9707
143
144
  annofabcli/statistics/summarize_task_count_by_task_id_group.py,sha256=TSSmcFv615NLcq6uqXmg3ilYqSHl3A5qp90msVQM1gE,8646
144
145
  annofabcli/statistics/summarize_task_count_by_user.py,sha256=TRoJXpt2HOVb8QO2YtRejkOAxyK80_NsPt3Vk9es9C8,6948
@@ -186,8 +187,8 @@ annofabcli/task/download_task_json.py,sha256=Ocjecmdf2WV_Sq3u1InfMLIsT3XSw0ojyJm
186
187
  annofabcli/task/list_all_tasks.py,sha256=F9GpzzgWffF3lUeGrFIvjweq-iEwJ1c-g8usskO_2dE,6506
187
188
  annofabcli/task/list_all_tasks_added_task_history.py,sha256=fkdiuo64iS7xxvIfGKzSiUPPEMiCVnJjjcAtMxe2Ngs,9551
188
189
  annofabcli/task/list_tasks.py,sha256=O4jjp_zdmurcGNWXFp9JXHJsH4nhlR5e3ok96YnD1SI,10237
189
- annofabcli/task/list_tasks_added_task_history.py,sha256=IferAd2Q-fHvXMkuzGvEOzYlpokbykm-TkvUcAlMpGY,23151
190
- annofabcli/task/put_tasks.py,sha256=hT2xPowJmcNJhjxoAm-MFiKTw_RFcJUYlpeanegVrAU,13400
190
+ annofabcli/task/list_tasks_added_task_history.py,sha256=Yjvv5fJjSjJ-v9bhwl4PDyU8aeT94LLMBcPhmUWlFUI,21639
191
+ annofabcli/task/put_tasks.py,sha256=c_Vw5qnDlfpa21S-aMVxmXy8pF-z_YEUi6a0c3IV9gc,13770
191
192
  annofabcli/task/put_tasks_by_count.py,sha256=MUHfWhqtSAXnB3O36p3bMSSgQ_3Zek9GT5qRvHGx8Lo,6041
192
193
  annofabcli/task/reject_tasks.py,sha256=5ByAN6VnKwvU5BT_cfsHwA1jLDl74bonqk3bwtnrkPU,23139
193
194
  annofabcli/task/subcommand_task.py,sha256=L_5Dwe58eblrtOrUYxjJAvkSmu6savRUxIqGjsFq-R4,2436
@@ -202,8 +203,8 @@ annofabcli/task_history_event/download_task_history_event_json.py,sha256=hQLVbQ0
202
203
  annofabcli/task_history_event/list_all_task_history_event.py,sha256=JQEgwOIXbbTIfeX23AVaoySHViOR9UGm9uoXuhVEBqo,6446
203
204
  annofabcli/task_history_event/list_worktime.py,sha256=9jsRYa2C9bva8E1Aqxv9CCKDuCP0MvbiaIyQFTDpjqY,13150
204
205
  annofabcli/task_history_event/subcommand_task_history_event.py,sha256=mJVJoT4RXk4HWnY7-Nrsl4If-gtaIIEXd2z7eFZwM2I,1260
205
- annofabcli-1.98.0.dist-info/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
206
- annofabcli-1.98.0.dist-info/METADATA,sha256=QOFLl_jHIBCsV06Dj8l_UQ-ZnJ5RiVxSCuaOjHNHQFk,5630
207
- annofabcli-1.98.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
208
- annofabcli-1.98.0.dist-info/entry_points.txt,sha256=A8vlN9fiMhbYRcdBfSpl7piYzAwvkMhRXIPQUAvQFUo,55
209
- annofabcli-1.98.0.dist-info/RECORD,,
206
+ annofabcli-1.99.0.dist-info/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
207
+ annofabcli-1.99.0.dist-info/METADATA,sha256=YTn2PV9tc0pWHXD1sQ88yiulbIhZc29WlLIOcz9jCE4,5630
208
+ annofabcli-1.99.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
209
+ annofabcli-1.99.0.dist-info/entry_points.txt,sha256=A8vlN9fiMhbYRcdBfSpl7piYzAwvkMhRXIPQUAvQFUo,55
210
+ annofabcli-1.99.0.dist-info/RECORD,,