annofabcli 1.100.5__py3-none-any.whl → 1.102.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 (30) hide show
  1. annofabcli/annotation/change_annotation_attributes.py +3 -2
  2. annofabcli/annotation/change_annotation_properties.py +8 -7
  3. annofabcli/annotation/copy_annotation.py +4 -4
  4. annofabcli/annotation/delete_annotation.py +254 -29
  5. annofabcli/annotation/dump_annotation.py +14 -7
  6. annofabcli/annotation/import_annotation.py +304 -227
  7. annofabcli/annotation/restore_annotation.py +7 -7
  8. annofabcli/annotation_specs/list_annotation_specs_attribute.py +1 -1
  9. annofabcli/annotation_specs/list_annotation_specs_choice.py +1 -1
  10. annofabcli/annotation_specs/list_annotation_specs_label.py +1 -1
  11. annofabcli/annotation_specs/list_annotation_specs_label_attribute.py +1 -1
  12. annofabcli/comment/delete_comment.py +7 -5
  13. annofabcli/comment/put_comment.py +1 -1
  14. annofabcli/comment/put_comment_simply.py +7 -5
  15. annofabcli/common/cli.py +10 -10
  16. annofabcli/common/download.py +28 -29
  17. annofabcli/common/image.py +4 -2
  18. annofabcli/input_data/delete_input_data.py +4 -4
  19. annofabcli/input_data/update_metadata_of_input_data.py +1 -1
  20. annofabcli/instruction/upload_instruction.py +2 -2
  21. annofabcli/statistics/list_annotation_area.py +320 -0
  22. annofabcli/statistics/subcommand_statistics.py +2 -0
  23. annofabcli/statistics/visualize_statistics.py +1 -7
  24. annofabcli/supplementary/delete_supplementary_data.py +8 -4
  25. {annofabcli-1.100.5.dist-info → annofabcli-1.102.0.dist-info}/METADATA +3 -2
  26. {annofabcli-1.100.5.dist-info → annofabcli-1.102.0.dist-info}/RECORD +29 -29
  27. annofabcli/__version__.py +0 -1
  28. {annofabcli-1.100.5.dist-info → annofabcli-1.102.0.dist-info}/WHEEL +0 -0
  29. {annofabcli-1.100.5.dist-info → annofabcli-1.102.0.dist-info}/entry_points.txt +0 -0
  30. {annofabcli-1.100.5.dist-info → annofabcli-1.102.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,320 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import logging
5
+ import sys
6
+ import tempfile
7
+ import zipfile
8
+ from collections.abc import Collection, Iterator
9
+ from dataclasses import dataclass
10
+ from pathlib import Path
11
+ from typing import Any, Optional
12
+
13
+ import numpy
14
+ import pandas
15
+ from annofabapi.models import InputDataType, ProjectMemberRole
16
+ from annofabapi.parser import (
17
+ SimpleAnnotationParser,
18
+ lazy_parse_simple_annotation_dir,
19
+ lazy_parse_simple_annotation_zip,
20
+ )
21
+ from annofabapi.segmentation import read_binary_image
22
+ from dataclasses_json import DataClassJsonMixin
23
+
24
+ import annofabcli
25
+ import annofabcli.common.cli
26
+ from annofabcli.common.cli import (
27
+ COMMAND_LINE_ERROR_STATUS_CODE,
28
+ ArgumentParser,
29
+ CommandLine,
30
+ build_annofabapi_resource_and_login,
31
+ )
32
+ from annofabcli.common.download import DownloadingFile
33
+ from annofabcli.common.enums import FormatArgument
34
+ from annofabcli.common.facade import (
35
+ AnnofabApiFacade,
36
+ TaskQuery,
37
+ match_annotation_with_task_query,
38
+ )
39
+ from annofabcli.common.utils import print_csv, print_json
40
+
41
+ logger = logging.getLogger(__name__)
42
+
43
+
44
+ def lazy_parse_simple_annotation_by_input_data(annotation_path: Path) -> Iterator[SimpleAnnotationParser]:
45
+ if not annotation_path.exists():
46
+ raise RuntimeError(f"'{annotation_path}' は存在しません。")
47
+
48
+ if annotation_path.is_dir():
49
+ return lazy_parse_simple_annotation_dir(annotation_path)
50
+ elif zipfile.is_zipfile(str(annotation_path)):
51
+ return lazy_parse_simple_annotation_zip(annotation_path)
52
+ else:
53
+ raise RuntimeError(f"'{annotation_path}'は、zipファイルまたはディレクトリではありません。")
54
+
55
+
56
+ @dataclass(frozen=True)
57
+ class AnnotationAreaInfo(DataClassJsonMixin):
58
+ task_id: str
59
+ task_status: str
60
+ task_phase: str
61
+ task_phase_stage: int
62
+
63
+ input_data_id: str
64
+ input_data_name: str
65
+
66
+ label: str
67
+ annotation_id: str
68
+ annotation_area: int
69
+
70
+
71
+ def calculate_bounding_box_area(data: dict[str, Any]) -> int:
72
+ width = abs(data["right_bottom"]["x"] - data["left_top"]["x"])
73
+ height = abs(data["right_bottom"]["y"] - data["left_top"]["y"])
74
+ return width * height
75
+
76
+
77
+ def calculate_segmentation_area(outer_file: Path) -> int:
78
+ nd_array = read_binary_image(outer_file)
79
+ return numpy.count_nonzero(nd_array)
80
+
81
+
82
+ def get_annotation_area_info_list(parser: SimpleAnnotationParser, simple_annotation: dict[str, Any]) -> list[AnnotationAreaInfo]:
83
+ result = []
84
+ for detail in simple_annotation["details"]:
85
+ if detail["data"]["_type"] in {"Segmentation", "SegmentationV2"}:
86
+ annotation_area = calculate_segmentation_area(parser.open_outer_file(detail["data"]["data_uri"]))
87
+ elif detail["data"]["_type"] == "BoundingBox":
88
+ annotation_area = calculate_bounding_box_area(detail["data"])
89
+
90
+ else:
91
+ continue
92
+
93
+ result.append(
94
+ AnnotationAreaInfo(
95
+ task_id=simple_annotation["task_id"],
96
+ task_phase=simple_annotation["task_phase"],
97
+ task_phase_stage=simple_annotation["task_phase_stage"],
98
+ task_status=simple_annotation["task_status"],
99
+ input_data_id=simple_annotation["input_data_id"],
100
+ input_data_name=simple_annotation["input_data_name"],
101
+ label=detail["label"],
102
+ annotation_id=detail["annotation_id"],
103
+ annotation_area=annotation_area,
104
+ )
105
+ )
106
+
107
+ return result
108
+
109
+
110
+ def get_annotation_area_info_list_from_annotation_path(
111
+ annotation_path: Path,
112
+ *,
113
+ target_task_ids: Optional[Collection[str]] = None,
114
+ task_query: Optional[TaskQuery] = None,
115
+ ) -> list[AnnotationAreaInfo]:
116
+ annotation_area_list = []
117
+ target_task_ids = set(target_task_ids) if target_task_ids is not None else None
118
+ iter_parser = lazy_parse_simple_annotation_by_input_data(annotation_path)
119
+ logger.debug("アノテーションzip/ディレクトリを読み込み中")
120
+ for index, parser in enumerate(iter_parser):
121
+ if (index + 1) % 1000 == 0:
122
+ logger.debug(f"{index + 1} 件目のJSONを読み込み中")
123
+ if target_task_ids is not None and parser.task_id not in target_task_ids:
124
+ continue
125
+ simple_annotation_dict = parser.load_json()
126
+ if task_query is not None: # noqa: SIM102
127
+ if not match_annotation_with_task_query(simple_annotation_dict, task_query):
128
+ continue
129
+ sub_annotation_area_list = get_annotation_area_info_list(parser, simple_annotation_dict)
130
+ annotation_area_list.extend(sub_annotation_area_list)
131
+ return annotation_area_list
132
+
133
+
134
+ def create_df(
135
+ annotation_area_list: list[AnnotationAreaInfo],
136
+ ) -> pandas.DataFrame:
137
+ columns = [
138
+ "task_id",
139
+ "task_status",
140
+ "task_phase",
141
+ "task_phase_stage",
142
+ "input_data_id",
143
+ "input_data_name",
144
+ "label",
145
+ "annotation_id",
146
+ "annotation_area",
147
+ ]
148
+ df = pandas.DataFrame(e.to_dict() for e in annotation_area_list)
149
+ if len(df) == 0:
150
+ df = pandas.DataFrame(columns=columns)
151
+
152
+ df = df.fillna({"annotation_area": 0})
153
+ return df[columns]
154
+
155
+
156
+ def print_annotation_area(
157
+ annotation_path: Path,
158
+ output_file: Path,
159
+ output_format: FormatArgument,
160
+ *,
161
+ target_task_ids: Optional[Collection[str]] = None,
162
+ task_query: Optional[TaskQuery] = None,
163
+ ) -> None:
164
+ annotation_area_list = get_annotation_area_info_list_from_annotation_path(
165
+ annotation_path,
166
+ target_task_ids=target_task_ids,
167
+ task_query=task_query,
168
+ )
169
+
170
+ logger.info(f"{len(annotation_area_list)} 件のタスクに含まれる塗りつぶしアノテーションのピクセル数情報を出力します。")
171
+
172
+ if output_format == FormatArgument.CSV:
173
+ df = create_df(annotation_area_list)
174
+ print_csv(df, output_file)
175
+
176
+ elif output_format in [FormatArgument.PRETTY_JSON, FormatArgument.JSON]:
177
+ json_is_pretty = output_format == FormatArgument.PRETTY_JSON
178
+ print_json(
179
+ [e.to_dict(encode_json=True) for e in annotation_area_list],
180
+ is_pretty=json_is_pretty,
181
+ output=output_file,
182
+ )
183
+
184
+ else:
185
+ raise RuntimeError(f"出力形式 '{output_format}' はサポートされていません。")
186
+
187
+
188
+ class ListAnnotationArea(CommandLine):
189
+ COMMON_MESSAGE = "annofabcli statistics list_annotation_area: error:"
190
+
191
+ def validate(self, args: argparse.Namespace) -> bool:
192
+ if args.project_id is None and args.annotation is None:
193
+ print( # noqa: T201
194
+ f"{self.COMMON_MESSAGE} argument --project_id: '--annotation'が未指定のときは、'--project_id' を指定してください。",
195
+ file=sys.stderr,
196
+ )
197
+ return False
198
+ return True
199
+
200
+ def main(self) -> None:
201
+ args = self.args
202
+
203
+ if not self.validate(args):
204
+ sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
205
+
206
+ project_id: Optional[str] = args.project_id
207
+ if project_id is not None:
208
+ super().validate_project(project_id, project_member_roles=[ProjectMemberRole.OWNER, ProjectMemberRole.TRAINING_DATA_USER])
209
+ project, _ = self.service.api.get_project(project_id)
210
+ if project["input_data_type"] != InputDataType.IMAGE.value:
211
+ logger.warning(f"project_id='{project_id}'であるプロジェクトは、画像プロジェクトでないので、出力されるデータは0件になります。")
212
+
213
+ annotation_path = Path(args.annotation) if args.annotation is not None else None
214
+
215
+ task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id) if args.task_id is not None else None
216
+ task_query = TaskQuery.from_dict(annofabcli.common.cli.get_json_from_args(args.task_query)) if args.task_query is not None else None
217
+
218
+ output_file: Path = args.output
219
+ output_format = FormatArgument(args.format)
220
+
221
+ downloading_obj = DownloadingFile(self.service)
222
+
223
+ def download_and_print_annotation_area(project_id: str, temp_dir: Path, *, is_latest: bool, annotation_path: Optional[Path]) -> None:
224
+ if annotation_path is None:
225
+ annotation_path = temp_dir / f"{project_id}__annotation.zip"
226
+ downloading_obj.download_annotation_zip(
227
+ project_id,
228
+ dest_path=annotation_path,
229
+ is_latest=is_latest,
230
+ )
231
+ print_annotation_area(
232
+ output_format=output_format,
233
+ output_file=output_file,
234
+ target_task_ids=task_id_list,
235
+ task_query=task_query,
236
+ annotation_path=annotation_path,
237
+ )
238
+
239
+ if project_id is not None:
240
+ if args.temp_dir is not None:
241
+ download_and_print_annotation_area(
242
+ project_id=project_id, temp_dir=args.temp_dir, is_latest=args.latest, annotation_path=annotation_path
243
+ )
244
+ else:
245
+ with tempfile.TemporaryDirectory() as str_temp_dir:
246
+ download_and_print_annotation_area(
247
+ project_id=project_id, temp_dir=Path(str_temp_dir), is_latest=args.latest, annotation_path=annotation_path
248
+ )
249
+ else:
250
+ assert annotation_path is not None
251
+ print_annotation_area(
252
+ output_format=output_format,
253
+ output_file=output_file,
254
+ target_task_ids=task_id_list,
255
+ task_query=task_query,
256
+ annotation_path=annotation_path,
257
+ )
258
+
259
+
260
+ def parse_args(parser: argparse.ArgumentParser) -> None:
261
+ argument_parser = ArgumentParser(parser)
262
+
263
+ parser.add_argument(
264
+ "--annotation",
265
+ type=str,
266
+ help="アノテーションzip、またはzipを展開したディレクトリを指定します。指定しない場合はAnnofabからダウンロードします。",
267
+ )
268
+
269
+ parser.add_argument(
270
+ "-p",
271
+ "--project_id",
272
+ type=str,
273
+ help="project_id。``--annotation`` が未指定のときは必須です。\n"
274
+ "``--annotation`` が指定されているときに ``--project_id`` を指定すると、アノテーション仕様を参照して、集計対象の属性やCSV列順が決まります。",
275
+ )
276
+
277
+ argument_parser.add_format(
278
+ choices=[FormatArgument.CSV, FormatArgument.JSON, FormatArgument.PRETTY_JSON],
279
+ default=FormatArgument.CSV,
280
+ )
281
+
282
+ argument_parser.add_output()
283
+
284
+ parser.add_argument(
285
+ "-tq",
286
+ "--task_query",
287
+ type=str,
288
+ help="集計対象タスクを絞り込むためのクエリ条件をJSON形式で指定します。使用できるキーは task_id, status, phase, phase_stage です。"
289
+ " ``file://`` を先頭に付けると、JSON形式のファイルを指定できます。",
290
+ )
291
+ argument_parser.add_task_id(required=False)
292
+
293
+ parser.add_argument(
294
+ "--latest",
295
+ action="store_true",
296
+ help="``--annotation`` を指定しないとき、最新のアノテーションzipを参照します。このオプションを指定すると、アノテーションzipを更新するのに数分待ちます。", # noqa: E501
297
+ )
298
+
299
+ parser.add_argument(
300
+ "--temp_dir",
301
+ type=Path,
302
+ help="指定したディレクトリに、アノテーションZIPなどの一時ファイルをダウンロードします。",
303
+ )
304
+
305
+ parser.set_defaults(subcommand_func=main)
306
+
307
+
308
+ def main(args: argparse.Namespace) -> None:
309
+ service = build_annofabapi_resource_and_login(args)
310
+ facade = AnnofabApiFacade(service)
311
+ ListAnnotationArea(service, facade, args).main()
312
+
313
+
314
+ def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
315
+ subcommand_name = "list_annotation_area"
316
+ subcommand_help = "塗りつぶしアノテーションまたは矩形アノテーションの面積を出力します。"
317
+ epilog = "オーナロールまたはアノテーションユーザロールを持つユーザで実行してください。"
318
+ parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description=subcommand_help, epilog=epilog)
319
+ parse_args(parser)
320
+ return parser
@@ -4,6 +4,7 @@ from typing import Optional
4
4
  import annofabcli
5
5
  import annofabcli.common.cli
6
6
  import annofabcli.stat_visualization.merge_visualization_dir
7
+ import annofabcli.statistics.list_annotation_area
7
8
  import annofabcli.statistics.list_annotation_attribute
8
9
  import annofabcli.statistics.list_annotation_attribute_filled_count
9
10
  import annofabcli.statistics.list_annotation_count
@@ -27,6 +28,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
27
28
  annofabcli.statistics.list_annotation_attribute_filled_count.add_parser(subparsers)
28
29
  annofabcli.statistics.list_annotation_count.add_parser(subparsers)
29
30
  annofabcli.statistics.list_annotation_duration.add_parser(subparsers)
31
+ annofabcli.statistics.list_annotation_area.add_parser(subparsers)
30
32
 
31
33
  annofabcli.statistics.list_video_duration.add_parser(subparsers)
32
34
  annofabcli.statistics.list_worktime.add_parser(subparsers)
@@ -4,7 +4,6 @@ import argparse
4
4
  import functools
5
5
  import json
6
6
  import logging.handlers
7
- import re
8
7
  import sys
9
8
  import tempfile
10
9
  from multiprocessing import Pool
@@ -64,10 +63,6 @@ from annofabcli.statistics.visualization.visualization_source_files import Visua
64
63
  logger = logging.getLogger(__name__)
65
64
 
66
65
 
67
- def get_project_output_dir(project_title: str) -> str:
68
- return re.sub(r'[\\/:*?"<>|]+', "__", project_title)
69
-
70
-
71
66
  class WriteCsvGraph:
72
67
  def __init__( # noqa: PLR0913
73
68
  self,
@@ -408,8 +403,7 @@ class VisualizingStatisticsMain:
408
403
  root_output_dir: Path,
409
404
  ) -> Optional[Path]:
410
405
  try:
411
- project_title = self.facade.get_project_title(project_id)
412
- output_project_dir = root_output_dir / get_project_output_dir(project_title)
406
+ output_project_dir = root_output_dir / project_id
413
407
  self.visualize_statistics(
414
408
  project_id=project_id,
415
409
  output_project_dir=output_project_dir,
@@ -201,12 +201,12 @@ class DeleteSupplementaryDataMain(CommandLineWithConfirm):
201
201
 
202
202
 
203
203
  class DeleteSupplementaryData(CommandLine):
204
- @staticmethod
205
- def validate(args: argparse.Namespace) -> bool:
206
- COMMON_MESSAGE = "annofabcli supplementary_data put: error:" # noqa: N806
204
+ COMMON_MESSAGE = "annofabcli supplementary_data delete: error:"
205
+
206
+ def validate(self, args: argparse.Namespace) -> bool:
207
207
  if args.csv is not None: # noqa: SIM102
208
208
  if not Path(args.csv).exists():
209
- print(f"{COMMON_MESSAGE} argument --csv: ファイルパスが存在しません。 '{args.csv}'", file=sys.stderr) # noqa: T201
209
+ print(f"{self.COMMON_MESSAGE} argument --csv: ファイルパスが存在しません。 '{args.csv}'", file=sys.stderr) # noqa: T201
210
210
  return False
211
211
 
212
212
  return True
@@ -227,6 +227,10 @@ class DeleteSupplementaryData(CommandLine):
227
227
 
228
228
  elif args.json is not None:
229
229
  supplementary_data_list = annofabcli.common.cli.get_json_from_args(args.json)
230
+ if not isinstance(supplementary_data_list, list):
231
+ print(f"{self.COMMON_MESSAGE} argument --json: JSON形式が不正です。オブジェクトの配列を指定してください。", file=sys.stderr) # noqa: T201
232
+ sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
233
+
230
234
  input_data_dict = get_input_data_supplementary_data_dict_from_list(supplementary_data_list)
231
235
  main_obj.delete_supplementary_data_list(project_id, input_data_dict)
232
236
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: annofabcli
3
- Version: 1.100.5
3
+ Version: 1.102.0
4
4
  Summary: Utility Command Line Interface for AnnoFab
5
5
  Author: Kurusugawa Computer Inc.
6
6
  License: MIT
@@ -17,7 +17,7 @@ Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Programming Language :: Python :: 3.13
18
18
  Classifier: Topic :: Utilities
19
19
  Requires-Python: >=3.9
20
- Requires-Dist: annofabapi>=1.4.1
20
+ Requires-Dist: annofabapi>=1.4.7
21
21
  Requires-Dist: bokeh<3.7,>=3.3
22
22
  Requires-Dist: dictdiffer
23
23
  Requires-Dist: isodate
@@ -30,6 +30,7 @@ Requires-Dist: python-datauri
30
30
  Requires-Dist: pyyaml
31
31
  Requires-Dist: requests
32
32
  Requires-Dist: typing-extensions>=4.5
33
+ Requires-Dist: ulid-py>=1.1.0
33
34
  Description-Content-Type: text/markdown
34
35
 
35
36
  # annofab-cli
@@ -1,21 +1,20 @@
1
1
  annofabcli/__init__.py,sha256=fdBtxy5rOI8zi26jf0hmXS5KTBjQIsm2b9ZUSAIR558,319
2
2
  annofabcli/__main__.py,sha256=JzfycqVG9ENhWOCxTouZwpHwWTSrI-grLsaMudxjyBM,5283
3
- annofabcli/__version__.py,sha256=1wLzRDMtI76bS4Hg5fHKcg5FD7unbBljbYmf1off3K0,24
4
3
  annofabcli/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
4
  annofabcli/annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
5
  annofabcli/annotation/annotation_query.py,sha256=ke3W3RT1-WfFzwt-TXcQwGmghG34vcKJkM_jxgbNKjU,15922
7
- annofabcli/annotation/change_annotation_attributes.py,sha256=sNH2CDNATdPGyE5fELj-ddeyEWb55PmKG8qJD1gjocg,17177
8
- annofabcli/annotation/change_annotation_properties.py,sha256=Q9uaVSokjtHT0JhEHn22kcKBBqleopPMVOrtbFPOrw0,18386
9
- annofabcli/annotation/copy_annotation.py,sha256=j1COCdUj7-VyWZG8q8UrWMbzmWi6ofnW20EnT1GPx04,18201
10
- annofabcli/annotation/delete_annotation.py,sha256=4hLpJdP4Ax-z_93ftRu2ua9r1YGXkOrs8ssr5qz6k7s,10513
6
+ annofabcli/annotation/change_annotation_attributes.py,sha256=GcabzuTeUhGHibYxOhoSgB9RR1ACmtrdxdmGGCiUnNQ,17200
7
+ annofabcli/annotation/change_annotation_properties.py,sha256=Zgxl2GVuoMsFComW5Wkaip3UKeOyPpH9T0FMsngpswc,18427
8
+ annofabcli/annotation/copy_annotation.py,sha256=Zy8sS7Hy4DVPLgtRrppEVuesfzj4rq07vXM783k6Akg,18165
9
+ annofabcli/annotation/delete_annotation.py,sha256=1rwuPTd_bnrmq_pVrzojy-1i7nAAme6MaTQEfKmq4n0,22696
11
10
  annofabcli/annotation/download_annotation_zip.py,sha256=P_ZpdqIaSFEmB8jjpdykcRhh2tVlHxSlXFrYreJjShE,3282
12
- annofabcli/annotation/dump_annotation.py,sha256=YIl9eP6cfvMcE13CLooZO7siHzotc67bu-wMFIILKh0,7098
13
- annofabcli/annotation/import_annotation.py,sha256=BlGAcXF9T19Ea1wtplUMPrOfiWYLBajK2XizOctdUtA,29304
11
+ annofabcli/annotation/dump_annotation.py,sha256=bVEQeRYfskEKo5QjZ-bT6zsBon8u4bRySVy-CmJJTm8,7493
12
+ annofabcli/annotation/import_annotation.py,sha256=Yg032TQgnBVUaG12Kjvta2YLvSk4NN9CvdZTWtZta28,33799
14
13
  annofabcli/annotation/list_annotation.py,sha256=B8ZFI7SRQPy-TgbpaX-tzXhveViY17YuCPE9BuK9mrs,10790
15
14
  annofabcli/annotation/list_annotation_count.py,sha256=T9fbaoxWeDJIVgW_YgHRldbwrVZWiE-57lfJrDQrj80,6474
16
15
  annofabcli/annotation/merge_segmentation.py,sha256=ldEQlcyCrog0KFYn92sTkScZQ7gmTjlujuCsKBemjhU,17950
17
16
  annofabcli/annotation/remove_segmentation_overlap.py,sha256=gONYqaI0PMEGYJduB4JsmGBn3LCY9JtLSFgosWYyc3M,15957
18
- annofabcli/annotation/restore_annotation.py,sha256=naUEbt48ION9JSijCBR2aQdaoCrRu005tYq0vgUtyp0,14683
17
+ annofabcli/annotation/restore_annotation.py,sha256=B3zitm-xB5ZuZy7c-6umiltK49Gdu3Di7YWTqNhJ22g,14704
19
18
  annofabcli/annotation/subcommand_annotation.py,sha256=ku9mzb7zZilHcjf1MFV1E7EJ8OvfSUDHpcunM38teto,2122
20
19
  annofabcli/annotation_specs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
20
  annofabcli/annotation_specs/add_attribute_restriction.py,sha256=kOFTZN3m_WNZZBeMqoMxN0wSu9x5gaDY1FkqEHiwLJI,6920
@@ -24,22 +23,22 @@ annofabcli/annotation_specs/export_annotation_specs.py,sha256=eZF5fj2P5U22_5UKgb
24
23
  annofabcli/annotation_specs/get_annotation_specs_with_attribute_id_replaced.py,sha256=L0H0M31Amnm3ZEg9JdQe2A1vprsCLPTpj0LUFnP6GDY,8330
25
24
  annofabcli/annotation_specs/get_annotation_specs_with_choice_id_replaced.py,sha256=mISJAgRTBMvISPk5__0w0MmhTkyQCcGPDin8K97x5Eg,6943
26
25
  annofabcli/annotation_specs/get_annotation_specs_with_label_id_replaced.py,sha256=5tlvSdUXAUn8uQ1BXNWxkR2MIKnV6AJoxveiwD21IAo,7114
27
- annofabcli/annotation_specs/list_annotation_specs_attribute.py,sha256=3acxTzsxVvL2rYwQ9jzpJrwjr_KHVkTzSS4bRRTXBaM,10780
28
- annofabcli/annotation_specs/list_annotation_specs_choice.py,sha256=hhkK-i6r4x0fEa-75mZY72YjdoXtfK6epMjzIsyZ0I8,9142
26
+ annofabcli/annotation_specs/list_annotation_specs_attribute.py,sha256=m7ZA7SbAnTuWirOypHT_Y_prObjMWR_NMLo6NGHqf94,10788
27
+ annofabcli/annotation_specs/list_annotation_specs_choice.py,sha256=mxcyZ2CV6zeFj0o-FGbbIv99J81PniOYdUl21Bx_JOE,9150
29
28
  annofabcli/annotation_specs/list_annotation_specs_history.py,sha256=Wbc9_NVx3haU_Vcm5RVTiryEmS-isqL3L350SBvIbao,2488
30
- annofabcli/annotation_specs/list_annotation_specs_label.py,sha256=YI0vsE4VOfqq5p0mHUiMIQZgUu2tZZ2ZzIWhfnoiJOo,8869
31
- annofabcli/annotation_specs/list_annotation_specs_label_attribute.py,sha256=inMEDMo4TxhRMkwNKeHZrurK06yydEaywqHjUzSxnQg,9348
29
+ annofabcli/annotation_specs/list_annotation_specs_label.py,sha256=ZFzytOqbz094JW8h5xxI1kvu8b2jnOnB8hMi4dhBWuY,8877
30
+ annofabcli/annotation_specs/list_annotation_specs_label_attribute.py,sha256=B96-aK3UJ5Aqt8RxDA6e0_PTlcsyBpP5jRhT_RSpdXE,9356
32
31
  annofabcli/annotation_specs/list_attribute_restriction.py,sha256=NpCnT2jpTzqtkzksGUqDjhpqJ4-kL_EnfjBTLF9o3Uw,6506
33
32
  annofabcli/annotation_specs/list_label_color.py,sha256=huHBAb-LVLe-tj5ZALiBkFgZlZSTvi2ZDsPYgJPDZ2Q,2356
34
33
  annofabcli/annotation_specs/put_label_color.py,sha256=HJTczQiE7uwdnpHh0Lyz_WuvtyXOxYt8RThBXpvjKgA,6057
35
34
  annofabcli/annotation_specs/subcommand_annotation_specs.py,sha256=yqSjV1S3CSB0sFqelLBNkPy9RrVyGNRnSWCnaLTjUsc,2692
36
35
  annofabcli/comment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- annofabcli/comment/delete_comment.py,sha256=EsQtUCq-HZtYmHQiXq4KbkgjqS4NPlC44MJQKgUzhnY,11458
36
+ annofabcli/comment/delete_comment.py,sha256=6b-cdu10EWvelvdcFQp8j8wuCEp8WULEY2evZgo-ALM,11535
38
37
  annofabcli/comment/download_comment_json.py,sha256=YfqUnMgvLgVFV7FJPIXwirREkQ2E63fXeCaF4hfwk8c,2338
39
38
  annofabcli/comment/list_all_comment.py,sha256=p5STKKQ4SV-vDvY1F3pKOrveZcteLTHIUEO-ci1nGes,6090
40
39
  annofabcli/comment/list_comment.py,sha256=gZSzeBeYLt0dhCi-8GcuEEB1NuJoXRdptp4oxkOtAMQ,4947
41
- annofabcli/comment/put_comment.py,sha256=yrxCtP9JkPvBtmZZ3vbm8XFYNKBTgwKwfGcauVvu5e8,12144
42
- annofabcli/comment/put_comment_simply.py,sha256=Y_RSKWMs8j5VAVV8iiJOOBHnJHEH5s3HLJrXnmmQT3o,8184
40
+ annofabcli/comment/put_comment.py,sha256=4mU41K30iIsTjjoZNfthwnDgutCgwJdBDM988y3wD1U,12150
41
+ annofabcli/comment/put_comment_simply.py,sha256=P9eMKVvVXA6E6SS8gmBM7gcFcF7GQL3K3Tg5cf9cEEg,8245
43
42
  annofabcli/comment/put_inspection_comment.py,sha256=F7m6lsbN0FHk0adwiapvD2UOv-8fbCdqfA9CtuJcnY8,3869
44
43
  annofabcli/comment/put_inspection_comment_simply.py,sha256=6oKYuihsOKkAKMzcLeUzgMu9SIJC9fWzM1VBis3asfo,6870
45
44
  annofabcli/comment/put_onhold_comment.py,sha256=9tJ6zzOwqr80SqCSyPFEyqkWpVahHvEEsWIaHxPrB-A,3529
@@ -48,13 +47,13 @@ annofabcli/comment/subcommand_comment.py,sha256=gd8w8ArXM1Tq9VUduDgn8m4G6HwevRWJ
48
47
  annofabcli/comment/utils.py,sha256=aUj7U6MtGh64F3Ko83y4NKPKyWAqcg-c1XLqjkmIpSk,350
49
48
  annofabcli/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
49
  annofabcli/common/bokeh.py,sha256=x5-Siok3cIhq-biTOb3JG91_q--ob1m48TDgB72P1Hc,1071
51
- annofabcli/common/cli.py,sha256=bbC7WS9bZ6Kgl7152YSNntyDlFCJbRSDAK5dKYeKigc,23938
50
+ annofabcli/common/cli.py,sha256=lurVBiacGMzlZBEA_HQbX_37lUh_U7chio56JwqQ8qQ,23814
52
51
  annofabcli/common/dataclasses.py,sha256=FRDihsB-H5P5ioVE3kfJtorsS5EbSMySlHrp8BJ3ktg,385
53
- annofabcli/common/download.py,sha256=KKfWM546cEClTTKfSmQzupZ1dq34sKEcBvOnkuFo144,14512
52
+ annofabcli/common/download.py,sha256=ZTy2lOL5a66rm8H1lhU53T5SuaoE4vb6bSmLQu5K_OQ,14307
54
53
  annofabcli/common/enums.py,sha256=pnMZEk8ADK2qO2Hmujx6NxeCwvSAEDNhmgK4ajPSC9Q,1233
55
54
  annofabcli/common/exceptions.py,sha256=trgC5eqvy7jgqOQ41pbAOC__uxy19GgrM9NAgkH_lBw,2051
56
55
  annofabcli/common/facade.py,sha256=1d5DxC4O5yHr0gisqaqgkacY5Omn1X-L1syPnYPyiwQ,19401
57
- annofabcli/common/image.py,sha256=3uNv5n4NT9W6H_9OyiLBkXJ4lEoTcYCwDFO-HtZ7Wr4,16730
56
+ annofabcli/common/image.py,sha256=lATm80lgU4s0Y0DnAC2H0eVB8eBbhXPxpQ5OZk0kyB0,16772
58
57
  annofabcli/common/pandas.py,sha256=IW9xqHkdRF1I6YZc7CP_9tkGxJuu1MKEXFILjhaNUU0,449
59
58
  annofabcli/common/type_util.py,sha256=i3r5pFtRYQwJrYkl1-lVQi8XOePQxTUX_cAHgBTsagM,224
60
59
  annofabcli/common/typing.py,sha256=_AcEogoaMbib0esfN2RvHshAZH0oyRb2Ro9-rbn7NJ8,330
@@ -76,7 +75,7 @@ annofabcli/filesystem/subcommand_filesystem.py,sha256=ZM2td5iZYIQ3TCI-9xAue8LugF
76
75
  annofabcli/input_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
76
  annofabcli/input_data/change_input_data_name.py,sha256=cQWoGTZKwr2_fU1WGALmRyJY39ruf9t4eMxpI06eT9g,9943
78
77
  annofabcli/input_data/copy_input_data.py,sha256=Lbyq2aW5lmJCPB8-WHdOI93a2ND5E0qOWrhBHRluQyw,14656
79
- annofabcli/input_data/delete_input_data.py,sha256=NS05kUDCYxCI8M0nZwOZ-OTa3qLLgM0zrplj6W11Mxc,8858
78
+ annofabcli/input_data/delete_input_data.py,sha256=AKYyBsUq-renK46s_Yqyr4G8vB2Uok_6gXxJ5jBpM2Y,8870
80
79
  annofabcli/input_data/delete_metadata_key_of_input_data.py,sha256=PVv9HXQVFLKQh-4RSHas_ckFxDxtqAzWnXnWYFFYy08,8464
81
80
  annofabcli/input_data/download_input_data_json.py,sha256=vxGoeM3ZEggQbWiWsrDK0_GxQrC_UzSHAtWMYK-k_6I,2794
82
81
  annofabcli/input_data/list_all_input_data.py,sha256=Kq261WCkma5UNKfMDT7O6Z-dzzqp-KP1wL0DvHe5fH8,9879
@@ -85,14 +84,14 @@ annofabcli/input_data/list_input_data.py,sha256=-ZtcUM3aOzdvBjOeeWFO5UGjHWd3OhIi
85
84
  annofabcli/input_data/put_input_data.py,sha256=QrIe_RBXfGzpTYazy4cN8iSdHTQjq96sI0bXq6g1G_k,18233
86
85
  annofabcli/input_data/put_input_data_with_zip.py,sha256=SA4aMAwMBFgc9Lh0zmRCbmkXG4AMrcBqd5zeTSdr8lc,5566
87
86
  annofabcli/input_data/subcommand_input_data.py,sha256=X8EoxsF6PMiKrvk_r7PIe2D0WZuaPlgLJRuTiljPIdM,2048
88
- annofabcli/input_data/update_metadata_of_input_data.py,sha256=_cZh0GYGK6Lx5arKuTjblolkXsRdTlwuKcIHa8Nm5yQ,11583
87
+ annofabcli/input_data/update_metadata_of_input_data.py,sha256=b-pzVKQcP29ExZh8j5kwu3rKeuCTpqY3u8V4cEjXhH4,11589
89
88
  annofabcli/input_data/utils.py,sha256=F3mYbWmRwXfEtiIo9dvSysfuZUdyQzJmmq94eM-C5IY,723
90
89
  annofabcli/instruction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
90
  annofabcli/instruction/copy_instruction.py,sha256=24zBMkelSI2mpJq7Esgzo3uB_f1Z3hitBeX68HFqV00,6704
92
91
  annofabcli/instruction/download_instruction.py,sha256=mxlAp3Yr4HZrtNHpNc_VOiNLHyKQc7HCqF6X9kHKEKU,8317
93
92
  annofabcli/instruction/list_instruction_history.py,sha256=P9L4goeCQbWB4y_9Bgk_R4JYlsFGL73RI0KeQTnNDCU,2122
94
93
  annofabcli/instruction/subcommand_instruction.py,sha256=hSj7iYX-ad23X3wi5iMb9AZJCd1bUxFvynLJ6r3ZFGE,1169
95
- annofabcli/instruction/upload_instruction.py,sha256=YVWed68a5AAD0ctojZxkNt-FVMCVuseCOCdYqA-EUNU,6116
94
+ annofabcli/instruction/upload_instruction.py,sha256=GPC37S1yJxWjOb9AXm_lMlxi7xmSByPteQzkBLtu2Bg,6108
96
95
  annofabcli/job/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
96
  annofabcli/job/delete_job.py,sha256=vWC81MgwzAG5SYMZE9fcr1XOiAoS_AryGFuFnABRbcc,3402
98
97
  annofabcli/job/list_job.py,sha256=cJsfDQDIIRUHFAknM2FPVgRQe0UqMzxV3IlEAIovSgo,3213
@@ -136,6 +135,7 @@ annofabcli/stat_visualization/write_performance_rating_csv.py,sha256=TDn7-poyFt2
136
135
  annofabcli/statistics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
136
  annofabcli/statistics/histogram.py,sha256=CvzDxT2cKLSnBGSqkZE6p92PayGxYYja1YyB24M4ALU,3245
138
137
  annofabcli/statistics/linegraph.py,sha256=0kr7jVBNMiM2ECYhv3Ry5RitElKerSl9ZKxbKzfiplI,12494
138
+ annofabcli/statistics/list_annotation_area.py,sha256=1LFYqc1JodVuHKM2ceTwWriDCabMmkOnHiNptvEyXAw,12325
139
139
  annofabcli/statistics/list_annotation_attribute.py,sha256=87jjNCOXJUbWnmswMCLN7GTjGsBfqpFJ6hViWmnj8Y4,12557
140
140
  annofabcli/statistics/list_annotation_attribute_filled_count.py,sha256=vwWeFHwTnEMdrLBauIKPFDkUCa6lXXd0GQgUAQ0LCqU,28890
141
141
  annofabcli/statistics/list_annotation_count.py,sha256=nzmlHRCWt5mjeksZkeQyWqm4UaCa9SrdbNtuX9TPP5w,52907
@@ -143,13 +143,13 @@ annofabcli/statistics/list_annotation_duration.py,sha256=N7nnVUDfX_thIapqe6-z_Mq
143
143
  annofabcli/statistics/list_video_duration.py,sha256=uNeMteRBX2JG_AWmcgMJj0Jzbq_qF7bvAwr25GmeIiw,9124
144
144
  annofabcli/statistics/list_worktime.py,sha256=C7Yu3IOW2EvhkJJv6gY3hNdS9_TOLmT_9LZsB7vLJ1o,6493
145
145
  annofabcli/statistics/scatter.py,sha256=IUCwXix9GbZb6V82wjjb5q2eamrT5HQsU_bzDTjAFnM,11011
146
- annofabcli/statistics/subcommand_statistics.py,sha256=mx18Fgxz2eG4LrF-x0vISw2qh9aLommxuQLD8cfoZhw,2416
146
+ annofabcli/statistics/subcommand_statistics.py,sha256=Pvd7s0vvDU9tSpAphPrv94IDhhR1p8iFH2tjdt7I7ZU,2536
147
147
  annofabcli/statistics/summarize_task_count.py,sha256=8OH6BBRYRjHJkWRTjU0A0OfXa7f3NIRHrxPNFlRt_hM,9707
148
148
  annofabcli/statistics/summarize_task_count_by_task_id_group.py,sha256=TSSmcFv615NLcq6uqXmg3ilYqSHl3A5qp90msVQM1gE,8646
149
149
  annofabcli/statistics/summarize_task_count_by_user.py,sha256=TRoJXpt2HOVb8QO2YtRejkOAxyK80_NsPt3Vk9es9C8,6948
150
150
  annofabcli/statistics/visualize_annotation_count.py,sha256=p73K4Bb3FTebEpvT_Lrn3l2YOvZ9YrYq3AQtQdguZdU,22334
151
151
  annofabcli/statistics/visualize_annotation_duration.py,sha256=J4Z3Ql1sdiTraMnRaRi00slRzmAtyvExS3LkeVVzpc0,21198
152
- annofabcli/statistics/visualize_statistics.py,sha256=3bP9WRALADkAxPePa1Ix49apahi1V_qjAL6Dbrwtxd0,39550
152
+ annofabcli/statistics/visualize_statistics.py,sha256=JyVDw0tiU7buJlg8sxnY7BWb38LOEHlaGZXTa0ge8PU,39329
153
153
  annofabcli/statistics/visualize_video_duration.py,sha256=A6Q91aWx7GO4F0TGxbiQI0za8BFr7IqiUaYyw3__BgY,16842
154
154
  annofabcli/statistics/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
155
  annofabcli/statistics/visualization/filtering_query.py,sha256=0_3QcS1weGIC9THH7NGqjYCb4rDLiftnmA-2MVgeNDI,4174
@@ -174,7 +174,7 @@ annofabcli/statistics/visualization/dataframe/whole_performance.py,sha256=qcQALk
174
174
  annofabcli/statistics/visualization/dataframe/whole_productivity_per_date.py,sha256=W8g9_4WcUHxvPw31gUY_MVheBfllsHHY6g-M0FKScUk,52141
175
175
  annofabcli/statistics/visualization/dataframe/worktime_per_date.py,sha256=56izC5flXOiu_lKPSk0s0aNGgqr-FiVA4t6pBWSNuwk,21321
176
176
  annofabcli/supplementary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
- annofabcli/supplementary/delete_supplementary_data.py,sha256=BZ5NzEQ7CdOIxfCHY7vTLG5vutueXNPh6Teyno9NY-U,13542
177
+ annofabcli/supplementary/delete_supplementary_data.py,sha256=pEy-qwKqNvnJnaEiJfaUJCZcLf54TLiqk_Tv3xO0QPA,13823
178
178
  annofabcli/supplementary/list_supplementary_data.py,sha256=F4iJnQi_4W7S_d7ahqxWFSFcnfiKYhNuysC28v0QUWA,7649
179
179
  annofabcli/supplementary/put_supplementary_data.py,sha256=BBgW3Kx5qnc4-VCfAO1bg1M1dvcFqMSt-7e4Dknkqks,18126
180
180
  annofabcli/supplementary/subcommand_supplementary.py,sha256=F8qfuNQzgW5HV1QKB4h0DWN7-kPVQcoFQwPfW_vjZVk,1079
@@ -207,8 +207,8 @@ annofabcli/task_history_event/download_task_history_event_json.py,sha256=hQLVbQ0
207
207
  annofabcli/task_history_event/list_all_task_history_event.py,sha256=JQEgwOIXbbTIfeX23AVaoySHViOR9UGm9uoXuhVEBqo,6446
208
208
  annofabcli/task_history_event/list_worktime.py,sha256=9jsRYa2C9bva8E1Aqxv9CCKDuCP0MvbiaIyQFTDpjqY,13150
209
209
  annofabcli/task_history_event/subcommand_task_history_event.py,sha256=mJVJoT4RXk4HWnY7-Nrsl4If-gtaIIEXd2z7eFZwM2I,1260
210
- annofabcli-1.100.5.dist-info/METADATA,sha256=p6RF7h2AlFqd50lTGqNIhbd-OWaynT-LViAHBIT8E2g,5256
211
- annofabcli-1.100.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
212
- annofabcli-1.100.5.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
213
- annofabcli-1.100.5.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
214
- annofabcli-1.100.5.dist-info/RECORD,,
210
+ annofabcli-1.102.0.dist-info/METADATA,sha256=nxOd0drqHnw28-7Kf3aA0qxKodxsNDV8HgqjX5Nnqxw,5286
211
+ annofabcli-1.102.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
212
+ annofabcli-1.102.0.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
213
+ annofabcli-1.102.0.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
214
+ annofabcli-1.102.0.dist-info/RECORD,,
annofabcli/__version__.py DELETED
@@ -1 +0,0 @@
1
- __version__ = "1.100.5"