annofabcli 1.106.5__py3-none-any.whl → 1.106.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- annofabcli/annotation/change_annotation_attributes_per_annotation.py +49 -25
- annofabcli/annotation/import_annotation.py +13 -4
- annofabcli/stat_visualization/write_performance_rating_csv.py +1 -1
- annofabcli/task/change_operator.py +35 -17
- {annofabcli-1.106.5.dist-info → annofabcli-1.106.7.dist-info}/METADATA +1 -1
- {annofabcli-1.106.5.dist-info → annofabcli-1.106.7.dist-info}/RECORD +9 -9
- {annofabcli-1.106.5.dist-info → annofabcli-1.106.7.dist-info}/WHEEL +0 -0
- {annofabcli-1.106.5.dist-info → annofabcli-1.106.7.dist-info}/entry_points.txt +0 -0
- {annofabcli-1.106.5.dist-info → annofabcli-1.106.7.dist-info}/licenses/LICENSE +0 -0
|
@@ -6,7 +6,7 @@ import logging
|
|
|
6
6
|
import sys
|
|
7
7
|
from collections import defaultdict
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import
|
|
9
|
+
from typing import Optional, Union
|
|
10
10
|
|
|
11
11
|
import annofabapi
|
|
12
12
|
import pandas
|
|
@@ -76,7 +76,7 @@ class ChangeAnnotationAttributesPerAnnotationMain(CommandLineWithConfirm):
|
|
|
76
76
|
self.dump_annotation_obj = DumpAnnotationMain(service, project_id)
|
|
77
77
|
super().__init__(all_yes)
|
|
78
78
|
|
|
79
|
-
def change_annotation_attributes_by_frame(self, task_id: str, input_data_id: str, anno_list: list[TargetAnnotation]) ->
|
|
79
|
+
def change_annotation_attributes_by_frame(self, task_id: str, input_data_id: str, anno_list: list[TargetAnnotation]) -> tuple[int, int]:
|
|
80
80
|
"""
|
|
81
81
|
フレームごとにアノテーション属性値を変更する。
|
|
82
82
|
|
|
@@ -85,6 +85,10 @@ class ChangeAnnotationAttributesPerAnnotationMain(CommandLineWithConfirm):
|
|
|
85
85
|
input_data_id: 入力データID
|
|
86
86
|
additional_data_list: 変更後の属性値(`AdditionalDataListV2`スキーマ)
|
|
87
87
|
|
|
88
|
+
Returns:
|
|
89
|
+
[1]: 属性値の変更に成功したアノテーション数
|
|
90
|
+
[2]: 属性値を変更できなかった(変更対象のアノテーションが存在しなかった)アノテーション数
|
|
91
|
+
|
|
88
92
|
"""
|
|
89
93
|
editor_annotation, _ = self.service.api.get_editor_annotation(self.project_id, task_id=task_id, input_data_id=input_data_id, query_params={"v": "2"})
|
|
90
94
|
|
|
@@ -94,26 +98,47 @@ class ChangeAnnotationAttributesPerAnnotationMain(CommandLineWithConfirm):
|
|
|
94
98
|
|
|
95
99
|
details_map = {detail["annotation_id"]: detail for detail in editor_annotation["details"]}
|
|
96
100
|
|
|
97
|
-
|
|
101
|
+
request_body = []
|
|
102
|
+
non_target_annotation_count = 0
|
|
103
|
+
for anno in anno_list:
|
|
104
|
+
if anno.annotation_id not in details_map:
|
|
105
|
+
logger.warning(
|
|
106
|
+
f"task_id='{task_id}', input_data_id='{input_data_id}' :: "
|
|
107
|
+
f"annotation_id='{anno.annotation_id}'であるアノテーションが存在しないため、"
|
|
108
|
+
"このアノテーションの属性値の変更をスキップします。"
|
|
109
|
+
)
|
|
110
|
+
non_target_annotation_count += 1
|
|
111
|
+
continue
|
|
112
|
+
|
|
113
|
+
label_id = details_map[anno.annotation_id]["label_id"]
|
|
98
114
|
additional_data_list = convert_attributes_from_cli_to_additional_data_list_v2(anno.attributes, annotation_specs=self.annotation_specs)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
"
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
request_body.append(
|
|
116
|
+
{
|
|
117
|
+
"data": {
|
|
118
|
+
"project_id": editor_annotation["project_id"],
|
|
119
|
+
"task_id": editor_annotation["task_id"],
|
|
120
|
+
"input_data_id": editor_annotation["input_data_id"],
|
|
121
|
+
"updated_datetime": editor_annotation["updated_datetime"],
|
|
122
|
+
"annotation_id": anno.annotation_id,
|
|
123
|
+
"label_id": label_id,
|
|
124
|
+
"additional_data_list": additional_data_list,
|
|
125
|
+
},
|
|
126
|
+
"_type": "PutV2",
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
if request_body:
|
|
131
|
+
self.service.api.batch_update_annotations(self.project_id, request_body=request_body)
|
|
132
|
+
else:
|
|
133
|
+
logger.debug(f"task_id='{task_id}', input_data_id='{input_data_id}' :: 変更対象のアノテーションがありませんでした。")
|
|
134
|
+
|
|
135
|
+
succeed_to_change_annotation_count = len(request_body)
|
|
136
|
+
logger.debug(
|
|
137
|
+
f"task_id='{task_id}', input_data_id='{input_data_id}' :: "
|
|
138
|
+
f"{succeed_to_change_annotation_count}/{len(anno_list)}件の属性値を変更しました。"
|
|
139
|
+
f"{non_target_annotation_count}件のアノテーションは存在しなかったため、属性値の変更をスキップしました。"
|
|
140
|
+
)
|
|
141
|
+
return succeed_to_change_annotation_count, non_target_annotation_count
|
|
117
142
|
|
|
118
143
|
def change_annotation_attributes_for_task(self, task_id: str, annotation_list_per_input_data_id: dict[str, list[TargetAnnotation]]) -> tuple[bool, int, int]:
|
|
119
144
|
"""
|
|
@@ -159,10 +184,9 @@ class ChangeAnnotationAttributesPerAnnotationMain(CommandLineWithConfirm):
|
|
|
159
184
|
|
|
160
185
|
for input_data_id, sub_anno_list in annotation_list_per_input_data_id.items():
|
|
161
186
|
try:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
failed_to_change_annotation_count += len(sub_anno_list)
|
|
187
|
+
tmp_succeed_to_change_annotation_count, tmp_failed_to_change_annotation_count = self.change_annotation_attributes_by_frame(task_id, input_data_id, sub_anno_list)
|
|
188
|
+
succeed_to_change_annotation_count += tmp_succeed_to_change_annotation_count
|
|
189
|
+
failed_to_change_annotation_count += tmp_failed_to_change_annotation_count
|
|
166
190
|
except Exception:
|
|
167
191
|
logger.warning(f"task_id='{task_id}', input_data_id='{input_data_id}' :: アノテーションの属性値変更に失敗しました。", exc_info=True)
|
|
168
192
|
failed_to_change_annotation_count += len(sub_anno_list)
|
|
@@ -540,12 +540,12 @@ class ImportAnnotationMain(CommandLineWithConfirm):
|
|
|
540
540
|
logger.warning(f"task_id='{task_parser.task_id}' のアノテーションのインポートに失敗しました。", exc_info=True)
|
|
541
541
|
return False
|
|
542
542
|
|
|
543
|
-
def main(
|
|
543
|
+
def main(
|
|
544
544
|
self,
|
|
545
545
|
iter_task_parser: Iterator[SimpleAnnotationParserByTask],
|
|
546
546
|
target_task_ids: Optional[set[str]] = None,
|
|
547
547
|
parallelism: Optional[int] = None,
|
|
548
|
-
):
|
|
548
|
+
) -> None:
|
|
549
549
|
def get_iter_task_parser_from_task_ids(_iter_task_parser: Iterator[SimpleAnnotationParserByTask], _target_task_ids: set[str]) -> Iterator[SimpleAnnotationParserByTask]:
|
|
550
550
|
for task_parser in _iter_task_parser:
|
|
551
551
|
if task_parser.task_id in _target_task_ids:
|
|
@@ -608,6 +608,13 @@ class ImportAnnotation(CommandLine):
|
|
|
608
608
|
print(f"{COMMON_MESSAGE} argument --annotation: ZIPファイルまたはディレクトリを指定してください。", file=sys.stderr) # noqa: T201
|
|
609
609
|
return False
|
|
610
610
|
|
|
611
|
+
if args.parallelism is not None and annotation_path.is_file() and zipfile.is_zipfile(annotation_path):
|
|
612
|
+
print( # noqa: T201
|
|
613
|
+
f"{COMMON_MESSAGE} argument --parallelism: '--annotation'にZIPファイルを指定した場合は、'--parallelism'を指定できません。",
|
|
614
|
+
file=sys.stderr,
|
|
615
|
+
)
|
|
616
|
+
return False
|
|
617
|
+
|
|
611
618
|
if args.parallelism is not None and not args.yes:
|
|
612
619
|
print( # noqa: T201
|
|
613
620
|
f"{COMMON_MESSAGE} argument --parallelism: '--parallelism'を指定するときは、必ず '--yes' を指定してください。",
|
|
@@ -632,7 +639,7 @@ class ImportAnnotation(CommandLine):
|
|
|
632
639
|
# Simpleアノテーションの読み込み
|
|
633
640
|
if annotation_path.is_dir():
|
|
634
641
|
iter_task_parser = lazy_parse_simple_annotation_dir_by_task(annotation_path)
|
|
635
|
-
elif zipfile.is_zipfile(
|
|
642
|
+
elif zipfile.is_zipfile(annotation_path):
|
|
636
643
|
iter_task_parser = lazy_parse_simple_annotation_zip_by_task(annotation_path)
|
|
637
644
|
else:
|
|
638
645
|
logger.warning(f"annotation_path: '{annotation_path}' は、zipファイルまたはディレクトリではありませんでした。")
|
|
@@ -708,7 +715,9 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
708
715
|
"--parallelism",
|
|
709
716
|
type=int,
|
|
710
717
|
choices=PARALLELISM_CHOICES,
|
|
711
|
-
help="
|
|
718
|
+
help="並列度。指定しない場合は、逐次的に処理します。"
|
|
719
|
+
"ただし ``--annotation`` にZIPファイルを指定した場合は、``--parallelism`` を指定できません。"
|
|
720
|
+
"また、``--parallelism`` を指定した場合は、``--yes`` も指定してください。",
|
|
712
721
|
)
|
|
713
722
|
|
|
714
723
|
parser.set_defaults(subcommand_func=main)
|
|
@@ -413,7 +413,7 @@ def create_rank_df(df: pandas.DataFrame, *, user_ids: Optional[Collection[str]]
|
|
|
413
413
|
df_rank[col] = to_rank(df[col])
|
|
414
414
|
|
|
415
415
|
if user_ids is not None:
|
|
416
|
-
return df_rank[df_rank[("user_id", "")].isin(user_ids)]
|
|
416
|
+
return df_rank[df_rank[("user_id", "", "")].isin(user_ids)]
|
|
417
417
|
else:
|
|
418
418
|
return df_rank
|
|
419
419
|
|
|
@@ -26,10 +26,11 @@ logger = logging.getLogger(__name__)
|
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class ChangeOperatorMain:
|
|
29
|
-
def __init__(self, service: annofabapi.Resource, all_yes: bool) -> None:
|
|
29
|
+
def __init__(self, service: annofabapi.Resource, *, all_yes: bool, include_on_hold: bool = False) -> None:
|
|
30
30
|
self.service = service
|
|
31
31
|
self.facade = AnnofabApiFacade(service)
|
|
32
32
|
self.all_yes = all_yes
|
|
33
|
+
self.include_on_hold = include_on_hold
|
|
33
34
|
|
|
34
35
|
def confirm_processing(self, confirm_message: str) -> bool:
|
|
35
36
|
"""
|
|
@@ -55,10 +56,10 @@ class ChangeOperatorMain:
|
|
|
55
56
|
return yes
|
|
56
57
|
|
|
57
58
|
def confirm_change_operator(self, task: Task) -> bool:
|
|
58
|
-
confirm_message = f"task_id
|
|
59
|
+
confirm_message = f"task_id='{task.task_id}' のタスクの担当者を変更しますか?"
|
|
59
60
|
return self.confirm_processing(confirm_message)
|
|
60
61
|
|
|
61
|
-
def change_operator_for_task(
|
|
62
|
+
def change_operator_for_task( # noqa: PLR0911
|
|
62
63
|
self,
|
|
63
64
|
project_id: str,
|
|
64
65
|
task_id: str,
|
|
@@ -69,7 +70,7 @@ class ChangeOperatorMain:
|
|
|
69
70
|
logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
|
|
70
71
|
dict_task = self.service.wrapper.get_task_or_none(project_id, task_id)
|
|
71
72
|
if dict_task is None:
|
|
72
|
-
logger.warning(f"{logging_prefix}
|
|
73
|
+
logger.warning(f"{logging_prefix} :: task_id='{task_id}'のタスクは存在しないので、スキップします。")
|
|
73
74
|
return False
|
|
74
75
|
|
|
75
76
|
task: Task = Task.from_dict(dict_task)
|
|
@@ -78,14 +79,23 @@ class ChangeOperatorMain:
|
|
|
78
79
|
if task.account_id is not None:
|
|
79
80
|
now_user_id = self.facade.get_user_id_from_account_id(project_id, task.account_id)
|
|
80
81
|
|
|
81
|
-
logger.debug(f"{logging_prefix}
|
|
82
|
+
logger.debug(f"{logging_prefix} :: task_id='{task.task_id}', status='{task.status.value}', phase='{task.phase.value}', phase_stage='{task.phase_stage}', user_id='{now_user_id}'")
|
|
83
|
+
if task.account_id == new_account_id:
|
|
84
|
+
logger.info(f"{logging_prefix} :: task_id='{task_id}' :: タスクの担当者はすでにuser_id='{now_user_id}'のユーザーです。担当者を変更する必要がないのでスキップします。")
|
|
85
|
+
return False
|
|
82
86
|
|
|
83
87
|
if task.status in [TaskStatus.COMPLETE, TaskStatus.WORKING]:
|
|
84
|
-
logger.warning(f"{logging_prefix}
|
|
88
|
+
logger.warning(f"{logging_prefix} :: task_id='{task_id}' :: タスクが作業中状態または完了状態なので、担当者を変更できません。 :: status='{task.status.value}'")
|
|
89
|
+
return False
|
|
90
|
+
|
|
91
|
+
if task.status == TaskStatus.ON_HOLD and not self.include_on_hold:
|
|
92
|
+
logger.warning(
|
|
93
|
+
f"{logging_prefix} :: task_id='{task_id}' :: タスクが保留中状態なので、担当者を変更できません。保留中状態のタスクの担当者も変更する場合は、'--include_on_hold'を指定してください。"
|
|
94
|
+
)
|
|
85
95
|
return False
|
|
86
96
|
|
|
87
97
|
if not match_task_with_query(task, task_query):
|
|
88
|
-
logger.debug(f"{logging_prefix}
|
|
98
|
+
logger.debug(f"{logging_prefix} :: task_id='{task_id}' :: `--task_query` の条件にマッチしないため、スキップします。task_query='{task_query}'")
|
|
89
99
|
return False
|
|
90
100
|
|
|
91
101
|
if not self.confirm_change_operator(task):
|
|
@@ -94,11 +104,11 @@ class ChangeOperatorMain:
|
|
|
94
104
|
try:
|
|
95
105
|
# 担当者を変更する
|
|
96
106
|
self.service.wrapper.change_task_operator(project_id, task_id, operator_account_id=new_account_id)
|
|
97
|
-
logger.debug(f"{logging_prefix}
|
|
107
|
+
logger.debug(f"{logging_prefix} :: task_id='{task_id}'であるタスクの担当者を変更しました。 :: phase='{dict_task['phase']}'")
|
|
98
108
|
return True # noqa: TRY300
|
|
99
109
|
|
|
100
110
|
except requests.exceptions.HTTPError:
|
|
101
|
-
logger.warning(f"{logging_prefix}
|
|
111
|
+
logger.warning(f"{logging_prefix} :: task_id='{task_id}'である担当者を変更するのに失敗しました。", exc_info=True)
|
|
102
112
|
return False
|
|
103
113
|
|
|
104
114
|
def change_operator_for_task_wrapper(
|
|
@@ -118,19 +128,21 @@ class ChangeOperatorMain:
|
|
|
118
128
|
new_account_id=new_account_id,
|
|
119
129
|
)
|
|
120
130
|
except Exception: # pylint: disable=broad-except
|
|
121
|
-
logger.warning(f"
|
|
131
|
+
logger.warning(f"task_id='{task_id}'であるタスク担当者の変更に失敗しました。", exc_info=True)
|
|
122
132
|
return False
|
|
123
133
|
|
|
124
134
|
def change_operator(
|
|
125
135
|
self,
|
|
126
136
|
project_id: str,
|
|
127
137
|
task_id_list: list[str],
|
|
138
|
+
*,
|
|
128
139
|
new_user_id: Optional[str] = None,
|
|
129
140
|
task_query: Optional[TaskQuery] = None,
|
|
130
141
|
parallelism: Optional[int] = None,
|
|
131
142
|
) -> None:
|
|
132
143
|
"""
|
|
133
|
-
|
|
144
|
+
指定した複数のタスクの担当者を変更します。
|
|
145
|
+
|
|
134
146
|
Args:
|
|
135
147
|
project_id:
|
|
136
148
|
task_id_list:
|
|
@@ -143,13 +155,13 @@ class ChangeOperatorMain:
|
|
|
143
155
|
if new_user_id is not None:
|
|
144
156
|
new_account_id = self.facade.get_account_id_from_user_id(project_id, new_user_id)
|
|
145
157
|
if new_account_id is None:
|
|
146
|
-
logger.error(f"
|
|
158
|
+
logger.error(f"user_id='{new_user_id}'であるユーザーは、project_id='{project_id}'のプロジェクトのメンバーではありません。終了します。")
|
|
147
159
|
return
|
|
148
160
|
else:
|
|
149
|
-
logger.info(f"{len(task_id_list)} 件のタスクの担当者を、{new_user_id}
|
|
161
|
+
logger.info(f"{len(task_id_list)} 件のタスクの担当者を、user_id='{new_user_id}'のユーザーに変更します。")
|
|
150
162
|
else:
|
|
151
163
|
new_account_id = None
|
|
152
|
-
logger.info(f"{len(task_id_list)}
|
|
164
|
+
logger.info(f"{len(task_id_list)} 件のタスクの担当者を「未割り当て」に変更します。")
|
|
153
165
|
|
|
154
166
|
success_count = 0
|
|
155
167
|
|
|
@@ -172,7 +184,7 @@ class ChangeOperatorMain:
|
|
|
172
184
|
if result:
|
|
173
185
|
success_count += 1
|
|
174
186
|
except Exception: # pylint: disable=broad-except
|
|
175
|
-
logger.warning(f"
|
|
187
|
+
logger.warning(f"task_id='{task_id}'であるタスクの担当者の変更に失敗しました。", exc_info=True)
|
|
176
188
|
continue
|
|
177
189
|
|
|
178
190
|
logger.info(f"{success_count} / {len(task_id_list)} 件 タスクの担当者を変更しました。")
|
|
@@ -212,7 +224,7 @@ class ChangeOperator(CommandLine):
|
|
|
212
224
|
project_id = args.project_id
|
|
213
225
|
super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER])
|
|
214
226
|
|
|
215
|
-
main_obj = ChangeOperatorMain(self.service, all_yes=self.all_yes)
|
|
227
|
+
main_obj = ChangeOperatorMain(self.service, all_yes=self.all_yes, include_on_hold=args.include_on_hold)
|
|
216
228
|
main_obj.change_operator(
|
|
217
229
|
project_id,
|
|
218
230
|
task_id_list=task_id_list,
|
|
@@ -242,6 +254,12 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
242
254
|
|
|
243
255
|
argument_parser.add_task_query()
|
|
244
256
|
|
|
257
|
+
parser.add_argument(
|
|
258
|
+
"--include_on_hold",
|
|
259
|
+
action="store_true",
|
|
260
|
+
help="指定した場合、保留中のタスクの担当者も変更します。指定しない場合、保留中のタスクはスキップされます。",
|
|
261
|
+
)
|
|
262
|
+
|
|
245
263
|
parser.add_argument(
|
|
246
264
|
"--parallelism",
|
|
247
265
|
type=int,
|
|
@@ -255,7 +273,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
255
273
|
def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
|
|
256
274
|
subcommand_name = "change_operator"
|
|
257
275
|
subcommand_help = "タスクの担当者を変更します。"
|
|
258
|
-
description = "
|
|
276
|
+
description = "タスクの担当者を変更します。作業中状態、完了状態のタスクは、担当者を変更できません。保留中状態のタスクは、デフォルトでは担当者を変更できません。"
|
|
259
277
|
epilog = "チェッカーまたはオーナロールを持つユーザで実行してください。"
|
|
260
278
|
|
|
261
279
|
parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description, epilog=epilog)
|
|
@@ -4,13 +4,13 @@ annofabcli/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
4
4
|
annofabcli/annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
annofabcli/annotation/annotation_query.py,sha256=VwfPWpLOpVa2SeEJ264LmCKkBGDJvpX8o7GbWIrDE0o,15712
|
|
6
6
|
annofabcli/annotation/change_annotation_attributes.py,sha256=Zjqax-sb7ujJnTUVv4io0GFmZzfqx0rpN2N1W86uVTs,17092
|
|
7
|
-
annofabcli/annotation/change_annotation_attributes_per_annotation.py,sha256=
|
|
7
|
+
annofabcli/annotation/change_annotation_attributes_per_annotation.py,sha256=g_SqH1xzAdA8D1Hy1aoOPlpF86nc7F1PENeUX8XftDs,15529
|
|
8
8
|
annofabcli/annotation/change_annotation_properties.py,sha256=Kp_LZ5sSoVmmjGE80ABVO3InxsXBIxiFFvVcIJNsOMk,18309
|
|
9
9
|
annofabcli/annotation/copy_annotation.py,sha256=Pih2k3vvpgfT3Ovb3gZw2L_8fK_ws_wKR7ARYG5hG_8,18407
|
|
10
10
|
annofabcli/annotation/delete_annotation.py,sha256=hQApNrx2Ci1bBWk0dRGA0oJkIgDHwl6Jy0-33gYF6jo,22989
|
|
11
11
|
annofabcli/annotation/download_annotation_zip.py,sha256=P_ZpdqIaSFEmB8jjpdykcRhh2tVlHxSlXFrYreJjShE,3282
|
|
12
12
|
annofabcli/annotation/dump_annotation.py,sha256=Q-p6f5XBs7khDgrfY5Q3CGLBMKEerJWO_CQ8_73UXVM,9972
|
|
13
|
-
annofabcli/annotation/import_annotation.py,sha256=
|
|
13
|
+
annofabcli/annotation/import_annotation.py,sha256=w0iSTmkIY8tz3cTUy2FJ6LCVpVUtKzcD7ej2cznot4A,34533
|
|
14
14
|
annofabcli/annotation/list_annotation.py,sha256=uKcOuGC7lzd6vVbzizkiZtYdXJ7EzY0iifuiqKl2wQM,10707
|
|
15
15
|
annofabcli/annotation/list_annotation_count.py,sha256=T9fbaoxWeDJIVgW_YgHRldbwrVZWiE-57lfJrDQrj80,6474
|
|
16
16
|
annofabcli/annotation/merge_segmentation.py,sha256=kIsCeXtJxzd6nobQPpi0fscaRDlTx3tg1qpy5PDfSJI,18107
|
|
@@ -133,7 +133,7 @@ annofabcli/stat_visualization/merge_visualization_dir.py,sha256=7rOluAY7X5rcukWs
|
|
|
133
133
|
annofabcli/stat_visualization/subcommand_stat_visualization.py,sha256=vk-LPAjhfkTaGHC-pDLhwLCc0opF3hMz-0af3yichuA,1484
|
|
134
134
|
annofabcli/stat_visualization/summarize_whole_performance_csv.py,sha256=gPldqPECBqC61IdTw7JPAscUVRz76YluDiF3QOVnSEk,3099
|
|
135
135
|
annofabcli/stat_visualization/write_graph.py,sha256=gRO0LcZ6x7Jgln9ALUUM3BHTMaAt1H15PB4_0bRo8TI,9101
|
|
136
|
-
annofabcli/stat_visualization/write_performance_rating_csv.py,sha256
|
|
136
|
+
annofabcli/stat_visualization/write_performance_rating_csv.py,sha256=-eC_Nv9ohrLe3J4wvVHxvE8HJ35u1UMJP_fJCJHSKoU,31269
|
|
137
137
|
annofabcli/statistics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
138
138
|
annofabcli/statistics/histogram.py,sha256=CvzDxT2cKLSnBGSqkZE6p92PayGxYYja1YyB24M4ALU,3245
|
|
139
139
|
annofabcli/statistics/linegraph.py,sha256=0kr7jVBNMiM2ECYhv3Ry5RitElKerSl9ZKxbKzfiplI,12494
|
|
@@ -182,7 +182,7 @@ annofabcli/supplementary/put_supplementary_data.py,sha256=Pyq9G6xQFyJ8qrdWLOQvIU
|
|
|
182
182
|
annofabcli/supplementary/subcommand_supplementary.py,sha256=F8qfuNQzgW5HV1QKB4h0DWN7-kPVQcoFQwPfW_vjZVk,1079
|
|
183
183
|
annofabcli/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
184
184
|
annofabcli/task/cancel_acceptance.py,sha256=QG9GhGNfBXntqYTKdYjLUczjD4p_ATkPc_xYCpTO24Y,13851
|
|
185
|
-
annofabcli/task/change_operator.py,sha256=
|
|
185
|
+
annofabcli/task/change_operator.py,sha256=q6pMd1SdsTRgMHS0705dnosTSHprTpYgXtNd0rli2Zg,11793
|
|
186
186
|
annofabcli/task/change_status_to_break.py,sha256=hwdFTFW-zV0VxuinoBB5n6mvHJ7g9ChjrSOXZcNk88w,8621
|
|
187
187
|
annofabcli/task/change_status_to_on_hold.py,sha256=vWRyk6IK3HcgTWDIbbhXzsrtuoa7OlXCf8CvUpFp_Uw,12981
|
|
188
188
|
annofabcli/task/complete_tasks.py,sha256=ssg_Z7ADRQRXvXgK2k5TEmvbRjrJQ33cXeb8kG8Y3jc,24917
|
|
@@ -209,8 +209,8 @@ annofabcli/task_history_event/download_task_history_event_json.py,sha256=hQLVbQ0
|
|
|
209
209
|
annofabcli/task_history_event/list_all_task_history_event.py,sha256=EeKMyPUxGwYCFtWQHHW954ZserGm8lUqrwNnV1iX9X4,6830
|
|
210
210
|
annofabcli/task_history_event/list_worktime.py,sha256=Y7Pu5DP7scPf7HPt6CTiTvB1_5_Nfi1bStUIaCpkhII,15507
|
|
211
211
|
annofabcli/task_history_event/subcommand_task_history_event.py,sha256=mJVJoT4RXk4HWnY7-Nrsl4If-gtaIIEXd2z7eFZwM2I,1260
|
|
212
|
-
annofabcli-1.106.
|
|
213
|
-
annofabcli-1.106.
|
|
214
|
-
annofabcli-1.106.
|
|
215
|
-
annofabcli-1.106.
|
|
216
|
-
annofabcli-1.106.
|
|
212
|
+
annofabcli-1.106.7.dist-info/METADATA,sha256=3zYEhS25YYDmpQ1FV9qAyccpPSLvajgcXFrydflKzUE,5286
|
|
213
|
+
annofabcli-1.106.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
214
|
+
annofabcli-1.106.7.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
|
|
215
|
+
annofabcli-1.106.7.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
|
|
216
|
+
annofabcli-1.106.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|