annofabcli 1.107.0__py3-none-any.whl → 1.108.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.
- annofabcli/annotation/change_annotation_attributes.py +1 -1
- annofabcli/annotation/create_classification_annotation.py +408 -0
- annofabcli/annotation/delete_annotation.py +50 -14
- annofabcli/annotation/import_annotation.py +7 -8
- annofabcli/annotation/subcommand_annotation.py +2 -0
- annofabcli/common/utils.py +2 -5
- annofabcli/input_data/subcommand_input_data.py +2 -2
- annofabcli/input_data/update_input_data.py +308 -0
- annofabcli/project/subcommand_project.py +2 -0
- annofabcli/project/update_configuration.py +151 -0
- annofabcli/statistics/list_video_duration.py +2 -2
- annofabcli/task/complete_tasks.py +20 -20
- {annofabcli-1.107.0.dist-info → annofabcli-1.108.0.dist-info}/METADATA +2 -2
- {annofabcli-1.107.0.dist-info → annofabcli-1.108.0.dist-info}/RECORD +17 -15
- annofabcli/input_data/change_input_data_name.py +0 -245
- {annofabcli-1.107.0.dist-info → annofabcli-1.108.0.dist-info}/WHEEL +0 -0
- {annofabcli-1.107.0.dist-info → annofabcli-1.108.0.dist-info}/entry_points.txt +0 -0
- {annofabcli-1.107.0.dist-info → annofabcli-1.108.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -3,20 +3,21 @@ annofabcli/__main__.py,sha256=HSKErJxFZARMWsH6GadYeyzcH5YBcZVDsy06wYGTo5c,5431
|
|
|
3
3
|
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=jd69b_QBw8fy0i_bk-3MGNarS_W0XjCDJa1T4GSZjvk,15730
|
|
6
|
-
annofabcli/annotation/change_annotation_attributes.py,sha256=
|
|
6
|
+
annofabcli/annotation/change_annotation_attributes.py,sha256=WKVJcAePT6a1ToOf81Q58_7KvTaz_kyhKX7eaOsaf-c,17886
|
|
7
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
|
-
annofabcli/annotation/
|
|
10
|
+
annofabcli/annotation/create_classification_annotation.py,sha256=Ex9kSVNHZu71UbLSAxZRE1y99p6T8vsCRleCLxCFWv8,18594
|
|
11
|
+
annofabcli/annotation/delete_annotation.py,sha256=bU87ov7NhYFPe-Cldn3nBSK_CY9A9x3mSLN1Ame-cKk,25144
|
|
11
12
|
annofabcli/annotation/download_annotation_zip.py,sha256=SMtfxt6NKkpHGRDoKRCjPqpQB5DBpQ-PD2_3ts51h0Q,3314
|
|
12
13
|
annofabcli/annotation/dump_annotation.py,sha256=Q-p6f5XBs7khDgrfY5Q3CGLBMKEerJWO_CQ8_73UXVM,9972
|
|
13
|
-
annofabcli/annotation/import_annotation.py,sha256=
|
|
14
|
+
annofabcli/annotation/import_annotation.py,sha256=maaxlje3VZ7oN94gdtZFgfZnAQlBfYmljgGJzMcI9HE,35811
|
|
14
15
|
annofabcli/annotation/list_annotation.py,sha256=uKcOuGC7lzd6vVbzizkiZtYdXJ7EzY0iifuiqKl2wQM,10707
|
|
15
16
|
annofabcli/annotation/list_annotation_count.py,sha256=T9fbaoxWeDJIVgW_YgHRldbwrVZWiE-57lfJrDQrj80,6474
|
|
16
17
|
annofabcli/annotation/merge_segmentation.py,sha256=kIsCeXtJxzd6nobQPpi0fscaRDlTx3tg1qpy5PDfSJI,18107
|
|
17
18
|
annofabcli/annotation/remove_segmentation_overlap.py,sha256=JeeBY3PUcBqLYiNItEH8Ae9zhEy6cf4LldNr_4yBdjY,15991
|
|
18
19
|
annofabcli/annotation/restore_annotation.py,sha256=4rrMYbC29HAsCxgcdOVDfZGcJgorbKDro6ewvDBjxwo,17064
|
|
19
|
-
annofabcli/annotation/subcommand_annotation.py,sha256=
|
|
20
|
+
annofabcli/annotation/subcommand_annotation.py,sha256=Xd7v_GGWscIanU2mP5bnmcfxiUmy4ugPYg4z24ZuhZ8,2432
|
|
20
21
|
annofabcli/annotation_specs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
22
|
annofabcli/annotation_specs/add_attribute_restriction.py,sha256=jVA7ltharabR94bf71QuW0x0yVgu6-A7PHn7Dq3kUfg,6825
|
|
22
23
|
annofabcli/annotation_specs/attribute_restriction.py,sha256=Ximx5BHK28raHC2WRwP2W6FfuPvCmHu3PGife9MoZHQ,10687
|
|
@@ -61,7 +62,7 @@ annofabcli/common/image.py,sha256=qUsQXEYmttT443BOiaxLthccE7hLji5toLjgSdneNWA,16
|
|
|
61
62
|
annofabcli/common/pandas.py,sha256=Vyozu52UiZ0aCVtQ9jySxT_LrLMwpQvvpM8Uu3S2nCs,476
|
|
62
63
|
annofabcli/common/type_util.py,sha256=i3r5pFtRYQwJrYkl1-lVQi8XOePQxTUX_cAHgBTsagM,224
|
|
63
64
|
annofabcli/common/typing.py,sha256=_AcEogoaMbib0esfN2RvHshAZH0oyRb2Ro9-rbn7NJ8,330
|
|
64
|
-
annofabcli/common/utils.py,sha256=
|
|
65
|
+
annofabcli/common/utils.py,sha256=Qtx9ZGk4T5IQhndTLhVdU142By8IV_wBbLvHeBpE1sw,9648
|
|
65
66
|
annofabcli/common/visualize.py,sha256=mBPCA5vfYNbE3I1m5oHRpo-E1hsNH11KswILtYRCOKQ,13650
|
|
66
67
|
annofabcli/common/annofab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
67
68
|
annofabcli/common/annofab/annotation_specs.py,sha256=h-YSnuK0riCLoJMmV-KDP3JS-_JMqx0feSvPAB3xCSI,765
|
|
@@ -78,7 +79,6 @@ annofabcli/filesystem/mask_user_info.py,sha256=j-6gZTMGARGy3wQNGGo4xORsl2HOlC64q
|
|
|
78
79
|
annofabcli/filesystem/merge_annotation.py,sha256=D6rzbHwI675p5iKeN9HVa7792fDf6z9ap4Jg0RjFuBI,10522
|
|
79
80
|
annofabcli/filesystem/subcommand_filesystem.py,sha256=ZM2td5iZYIQ3TCI-9xAue8LugFlIc3WMRXrJqnjJ8-s,1186
|
|
80
81
|
annofabcli/input_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
81
|
-
annofabcli/input_data/change_input_data_name.py,sha256=1ca4TqNj4Acg30lWC_vXSPNFe9iy84aYMJpE8Gd0dfc,9877
|
|
82
82
|
annofabcli/input_data/copy_input_data.py,sha256=abt4yBsmMadB5yuwUajHnxnRcK64U1xZpG0PDTxJPhI,14487
|
|
83
83
|
annofabcli/input_data/delete_input_data.py,sha256=IVlijroXVBRTsofY_q80ciRY4GiWGZvhFbWhoOMHOKM,8613
|
|
84
84
|
annofabcli/input_data/delete_metadata_key_of_input_data.py,sha256=8-erhIKYxgRUSbAdQSsco2zO37_uqvzNBwbnFeKrVXQ,8344
|
|
@@ -88,7 +88,8 @@ annofabcli/input_data/list_all_input_data_merged_task.py,sha256=xs1uT9_ToQNA2luL
|
|
|
88
88
|
annofabcli/input_data/list_input_data.py,sha256=Jz5tRDPBLE8CyPV85jmOGd2-aHELyAE4MGi7WVjZaDM,11335
|
|
89
89
|
annofabcli/input_data/put_input_data.py,sha256=D2H5mW7fOQMlJmtKLHIT2S9jc_uHdPshI4oBRXsD3To,18955
|
|
90
90
|
annofabcli/input_data/put_input_data_with_zip.py,sha256=SA4aMAwMBFgc9Lh0zmRCbmkXG4AMrcBqd5zeTSdr8lc,5566
|
|
91
|
-
annofabcli/input_data/subcommand_input_data.py,sha256=
|
|
91
|
+
annofabcli/input_data/subcommand_input_data.py,sha256=6c9Co92nzJFzDh8Ncq_9NGcB4VLgqEl-ey-p9sqNGL0,2038
|
|
92
|
+
annofabcli/input_data/update_input_data.py,sha256=Y7IXmeyuMYwk_PzQB5MoLe5MTSGpIeEJqwVAuAdaiTs,12905
|
|
92
93
|
annofabcli/input_data/update_metadata_of_input_data.py,sha256=E4E-FZaQBmhmhMhddehhtVLxS26TsehZzHRI6Ccr8pc,11460
|
|
93
94
|
annofabcli/input_data/utils.py,sha256=F3mYbWmRwXfEtiIo9dvSysfuZUdyQzJmmq94eM-C5IY,723
|
|
94
95
|
annofabcli/instruction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -122,7 +123,8 @@ annofabcli/project/copy_project.py,sha256=O1TooJ0VVbRP84d4Y-8e6Z7pKMwhBEwPu3EBv1
|
|
|
122
123
|
annofabcli/project/diff_projects.py,sha256=OsR0otV6MOCbUgGEDsYganu5cuHYZbpHbBAqujwBAw8,16531
|
|
123
124
|
annofabcli/project/list_project.py,sha256=OWnbCyShI4ceugxML8kSAD2nkyld5MlpXfbvQu2__4Y,10367
|
|
124
125
|
annofabcli/project/put_project.py,sha256=dsRJfx2ga4mmYci40q91UzXeQN6m_3fMU9mrcFRpY9Q,6033
|
|
125
|
-
annofabcli/project/subcommand_project.py,sha256=
|
|
126
|
+
annofabcli/project/subcommand_project.py,sha256=i2EBEBUp-h--yzwFeg1V5T0iMB_oFp4X_M-zQdZoMRE,1447
|
|
127
|
+
annofabcli/project/update_configuration.py,sha256=Gnymx6SwnLARY8oSgVLbG9q7y6WRt06i5RQpv6LTcFI,6491
|
|
126
128
|
annofabcli/project_member/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
127
129
|
annofabcli/project_member/change_project_members.py,sha256=T7l7--T2Mb8zLKKfGq3qB-wiAie6rkt2V-iq9e2LDp4,9337
|
|
128
130
|
annofabcli/project_member/copy_project_members.py,sha256=Rm98Ks0PE4zdoXqpu_itNLvBkh1d5x_J7CKjdTkhKLk,8839
|
|
@@ -146,7 +148,7 @@ annofabcli/statistics/list_annotation_attribute.py,sha256=lmvT3b1mVX4PRGWrBUfZaf
|
|
|
146
148
|
annofabcli/statistics/list_annotation_attribute_filled_count.py,sha256=UF8wB-kfUnHCIPykb2Z2slyEcp9aHrzcbFbOs_3Z8-A,29341
|
|
147
149
|
annofabcli/statistics/list_annotation_count.py,sha256=4uTRR63Db-WDGRQt3AC8mPaRfFgbG5d27A036GNG3D0,53151
|
|
148
150
|
annofabcli/statistics/list_annotation_duration.py,sha256=WxHfzF4tYkveIdkaWoJZ6x7ddBMWkfz1YM_vxMub3jY,32165
|
|
149
|
-
annofabcli/statistics/list_video_duration.py,sha256=
|
|
151
|
+
annofabcli/statistics/list_video_duration.py,sha256=11DvuWgbJoxq7hXN7HRCWFjEAK_VG9C33QTSh7bJb0Y,9195
|
|
150
152
|
annofabcli/statistics/list_worktime.py,sha256=nr--GtFY-oyFuu8M0EsUqcVxX26gjeP09LYUcdeptyk,6456
|
|
151
153
|
annofabcli/statistics/scatter.py,sha256=C3hTlm_QfGBiY4KjZ-8D_u_Rk53a9f4jszx4iNZgp9w,10945
|
|
152
154
|
annofabcli/statistics/subcommand_statistics.py,sha256=Pvd7s0vvDU9tSpAphPrv94IDhhR1p8iFH2tjdt7I7ZU,2536
|
|
@@ -189,7 +191,7 @@ annofabcli/task/cancel_acceptance.py,sha256=QG9GhGNfBXntqYTKdYjLUczjD4p_ATkPc_xY
|
|
|
189
191
|
annofabcli/task/change_operator.py,sha256=q6pMd1SdsTRgMHS0705dnosTSHprTpYgXtNd0rli2Zg,11793
|
|
190
192
|
annofabcli/task/change_status_to_break.py,sha256=hwdFTFW-zV0VxuinoBB5n6mvHJ7g9ChjrSOXZcNk88w,8621
|
|
191
193
|
annofabcli/task/change_status_to_on_hold.py,sha256=vWRyk6IK3HcgTWDIbbhXzsrtuoa7OlXCf8CvUpFp_Uw,12981
|
|
192
|
-
annofabcli/task/complete_tasks.py,sha256=
|
|
194
|
+
annofabcli/task/complete_tasks.py,sha256=ouTxqw5_MxLhwCkp_EcBThqA7MhHIZKQsfXxhRJut28,25145
|
|
193
195
|
annofabcli/task/copy_tasks.py,sha256=EcaCaSzqddlSKSUYqDOD53-r1GFpIl38KL3FriSfMeI,8735
|
|
194
196
|
annofabcli/task/delete_metadata_key_of_task.py,sha256=Cjqe3fWKeRzVxxlrGyt3TS-x1riD55LnNXLIS9JPoTw,8029
|
|
195
197
|
annofabcli/task/delete_tasks.py,sha256=7T5eNCMW06ABekNGLwhTitDK5qn0tiPKrEXyJXyQNvs,13098
|
|
@@ -213,8 +215,8 @@ annofabcli/task_history_event/download_task_history_event_json.py,sha256=hQLVbQ0
|
|
|
213
215
|
annofabcli/task_history_event/list_all_task_history_event.py,sha256=EeKMyPUxGwYCFtWQHHW954ZserGm8lUqrwNnV1iX9X4,6830
|
|
214
216
|
annofabcli/task_history_event/list_worktime.py,sha256=Y7Pu5DP7scPf7HPt6CTiTvB1_5_Nfi1bStUIaCpkhII,15507
|
|
215
217
|
annofabcli/task_history_event/subcommand_task_history_event.py,sha256=mJVJoT4RXk4HWnY7-Nrsl4If-gtaIIEXd2z7eFZwM2I,1260
|
|
216
|
-
annofabcli-1.
|
|
217
|
-
annofabcli-1.
|
|
218
|
-
annofabcli-1.
|
|
219
|
-
annofabcli-1.
|
|
220
|
-
annofabcli-1.
|
|
218
|
+
annofabcli-1.108.0.dist-info/METADATA,sha256=_6wdJATOZ_8Osteclk0AhLdICK7BAy6dVq_C90XA9f8,5134
|
|
219
|
+
annofabcli-1.108.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
220
|
+
annofabcli-1.108.0.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
|
|
221
|
+
annofabcli-1.108.0.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
|
|
222
|
+
annofabcli-1.108.0.dist-info/RECORD,,
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import argparse
|
|
4
|
-
import logging
|
|
5
|
-
import multiprocessing
|
|
6
|
-
import sys
|
|
7
|
-
from dataclasses import dataclass
|
|
8
|
-
from functools import partial
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
from typing import Optional
|
|
11
|
-
|
|
12
|
-
import annofabapi
|
|
13
|
-
import pandas
|
|
14
|
-
from dataclasses_json import DataClassJsonMixin
|
|
15
|
-
|
|
16
|
-
import annofabcli
|
|
17
|
-
import annofabcli.common.cli
|
|
18
|
-
from annofabcli.common.cli import (
|
|
19
|
-
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
20
|
-
PARALLELISM_CHOICES,
|
|
21
|
-
ArgumentParser,
|
|
22
|
-
CommandLine,
|
|
23
|
-
CommandLineWithConfirm,
|
|
24
|
-
build_annofabapi_resource_and_login,
|
|
25
|
-
get_json_from_args,
|
|
26
|
-
)
|
|
27
|
-
from annofabcli.common.facade import AnnofabApiFacade
|
|
28
|
-
|
|
29
|
-
logger = logging.getLogger(__name__)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@dataclass
|
|
33
|
-
class ChangedInputData(DataClassJsonMixin):
|
|
34
|
-
"""
|
|
35
|
-
変更される入力データ
|
|
36
|
-
"""
|
|
37
|
-
|
|
38
|
-
input_data_id: str
|
|
39
|
-
"""変更対象の入力データを表すID"""
|
|
40
|
-
input_data_name: str
|
|
41
|
-
"""変更後の入力データ名"""
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class ChangeInputDataNameMain(CommandLineWithConfirm):
|
|
45
|
-
def __init__(self, service: annofabapi.Resource, *, all_yes: bool = False) -> None:
|
|
46
|
-
self.service = service
|
|
47
|
-
CommandLineWithConfirm.__init__(self, all_yes)
|
|
48
|
-
|
|
49
|
-
def change_input_data_name(self, project_id: str, input_data_id: str, new_input_data_name: str) -> bool:
|
|
50
|
-
"""
|
|
51
|
-
1個の入力データの名前を変更します。
|
|
52
|
-
"""
|
|
53
|
-
old_input_data = self.service.wrapper.get_input_data_or_none(project_id, input_data_id)
|
|
54
|
-
if old_input_data is None:
|
|
55
|
-
logger.warning(f"input_data_id='{input_data_id}'である入力データは存在しません。")
|
|
56
|
-
return False
|
|
57
|
-
|
|
58
|
-
if not self.confirm_processing(f"input_data_id='{input_data_id}' :: input_data_name='{old_input_data['input_data_name']}'を'{new_input_data_name}'に変更しますか?"):
|
|
59
|
-
return False
|
|
60
|
-
|
|
61
|
-
request_body = old_input_data
|
|
62
|
-
request_body["last_updated_datetime"] = old_input_data["updated_datetime"]
|
|
63
|
-
request_body["input_data_name"] = new_input_data_name
|
|
64
|
-
|
|
65
|
-
self.service.api.put_input_data(project_id, input_data_id, request_body=request_body)
|
|
66
|
-
return True
|
|
67
|
-
|
|
68
|
-
def change_input_data_name_list_sequentially(
|
|
69
|
-
self,
|
|
70
|
-
project_id: str,
|
|
71
|
-
changed_input_data_list: list[ChangedInputData],
|
|
72
|
-
) -> None:
|
|
73
|
-
"""複数の入力データの名前を逐次的に変更します。"""
|
|
74
|
-
success_count = 0
|
|
75
|
-
|
|
76
|
-
logger.info(f"{len(changed_input_data_list)} 件の入力データの名前を変更します。")
|
|
77
|
-
|
|
78
|
-
for input_data_index, changed_input_data in enumerate(changed_input_data_list):
|
|
79
|
-
if (input_data_index + 1) % 100 == 0:
|
|
80
|
-
logger.info(f"{input_data_index + 1}件目の入力データの名前を変更します。")
|
|
81
|
-
|
|
82
|
-
try:
|
|
83
|
-
result = self.change_input_data_name(
|
|
84
|
-
project_id,
|
|
85
|
-
changed_input_data.input_data_id,
|
|
86
|
-
new_input_data_name=changed_input_data.input_data_name,
|
|
87
|
-
)
|
|
88
|
-
if result:
|
|
89
|
-
success_count += 1
|
|
90
|
-
except Exception:
|
|
91
|
-
logger.warning(f"input_data_id='{changed_input_data.input_data_id}'の入力データの名前を変更するのに失敗しました。", exc_info=True)
|
|
92
|
-
continue
|
|
93
|
-
|
|
94
|
-
logger.info(f"{success_count} / {len(changed_input_data_list)} 件の入力データの名前を変更しました。")
|
|
95
|
-
|
|
96
|
-
def _change_input_data_name_wrapper(self, changed_input_data: ChangedInputData, project_id: str) -> bool:
|
|
97
|
-
try:
|
|
98
|
-
return self.change_input_data_name(
|
|
99
|
-
project_id,
|
|
100
|
-
input_data_id=changed_input_data.input_data_id,
|
|
101
|
-
new_input_data_name=changed_input_data.input_data_name,
|
|
102
|
-
)
|
|
103
|
-
except Exception:
|
|
104
|
-
logger.warning(f"input_data_id='{changed_input_data.input_data_id}'の入力データの名前を変更するのに失敗しました。", exc_info=True)
|
|
105
|
-
return False
|
|
106
|
-
|
|
107
|
-
def change_input_data_name_list_in_parallel(
|
|
108
|
-
self,
|
|
109
|
-
project_id: str,
|
|
110
|
-
changed_input_data_list: list[ChangedInputData],
|
|
111
|
-
parallelism: int,
|
|
112
|
-
) -> None:
|
|
113
|
-
"""複数の入力データの名前を並列的に変更します。"""
|
|
114
|
-
|
|
115
|
-
success_count = 0
|
|
116
|
-
|
|
117
|
-
logger.info(f"{len(changed_input_data_list)} 件の入力データの名前を変更します。{parallelism}個のプロセスを使用して並列でに実行します。")
|
|
118
|
-
|
|
119
|
-
partial_func = partial(self._change_input_data_name_wrapper, project_id=project_id)
|
|
120
|
-
with multiprocessing.Pool(parallelism) as pool:
|
|
121
|
-
result_bool_list = pool.map(partial_func, changed_input_data_list)
|
|
122
|
-
success_count = len([e for e in result_bool_list if e])
|
|
123
|
-
|
|
124
|
-
logger.info(f"{success_count} / {len(changed_input_data_list)} 件の入力データの名前を変更しました。")
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def create_changed_input_data_list_from_dict(input_data_dict_list: list[dict[str, str]]) -> list[ChangedInputData]:
|
|
128
|
-
return [ChangedInputData.from_dict(e) for e in input_data_dict_list]
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def create_changed_input_data_list_from_csv(csv_file: Path) -> list[ChangedInputData]:
|
|
132
|
-
"""入力データの情報が記載されているCSVを読み込み、ChangedInputDataのlistを返します。
|
|
133
|
-
CSVには以下の列が存在します。
|
|
134
|
-
* input_data_id
|
|
135
|
-
* input_data_name
|
|
136
|
-
|
|
137
|
-
Args:
|
|
138
|
-
csv_file (Path): CSVファイルのパス
|
|
139
|
-
|
|
140
|
-
Returns:
|
|
141
|
-
変更対象の入力データのlist
|
|
142
|
-
"""
|
|
143
|
-
df_input_data = pandas.read_csv(
|
|
144
|
-
csv_file,
|
|
145
|
-
# 文字列として読み込むようにする
|
|
146
|
-
dtype={"input_data_id": "string", "input_data_name": "string"},
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
input_data_dict_list = df_input_data.to_dict("records")
|
|
150
|
-
return [ChangedInputData.from_dict(e) for e in input_data_dict_list]
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
class ChangeInputDataName(CommandLine):
|
|
154
|
-
@staticmethod
|
|
155
|
-
def validate(args: argparse.Namespace) -> bool:
|
|
156
|
-
COMMON_MESSAGE = "annofabcli input_data change_name: error:" # noqa: N806
|
|
157
|
-
|
|
158
|
-
if args.parallelism is not None and not args.yes:
|
|
159
|
-
print( # noqa: T201
|
|
160
|
-
f"{COMMON_MESSAGE} argument --parallelism: '--parallelism'を指定するときは、必ず ``--yes`` を指定してください。",
|
|
161
|
-
file=sys.stderr,
|
|
162
|
-
)
|
|
163
|
-
return False
|
|
164
|
-
|
|
165
|
-
return True
|
|
166
|
-
|
|
167
|
-
def main(self) -> None:
|
|
168
|
-
args = self.args
|
|
169
|
-
if not self.validate(args):
|
|
170
|
-
sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
|
|
171
|
-
|
|
172
|
-
main_obj = ChangeInputDataNameMain(self.service, all_yes=self.all_yes)
|
|
173
|
-
|
|
174
|
-
if args.csv is not None:
|
|
175
|
-
changed_input_data_list = create_changed_input_data_list_from_csv(args.csv)
|
|
176
|
-
|
|
177
|
-
elif args.json is not None:
|
|
178
|
-
input_data_dict_list = get_json_from_args(args.json)
|
|
179
|
-
if not isinstance(input_data_dict_list, list):
|
|
180
|
-
print("annofabcli input_data change_name: error: JSON形式が不正です。オブジェクトの配列を指定してください。", file=sys.stderr) # noqa: T201
|
|
181
|
-
sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
|
|
182
|
-
changed_input_data_list = create_changed_input_data_list_from_dict(input_data_dict_list)
|
|
183
|
-
else:
|
|
184
|
-
raise RuntimeError("'--csv'または'--json'のいずれかを指定してください。")
|
|
185
|
-
|
|
186
|
-
project_id: str = args.project_id
|
|
187
|
-
if args.parallelism is not None:
|
|
188
|
-
main_obj.change_input_data_name_list_in_parallel(project_id, changed_input_data_list=changed_input_data_list, parallelism=args.parallelism)
|
|
189
|
-
else:
|
|
190
|
-
main_obj.change_input_data_name_list_sequentially(project_id, changed_input_data_list=changed_input_data_list)
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
def main(args: argparse.Namespace) -> None:
|
|
194
|
-
service = build_annofabapi_resource_and_login(args)
|
|
195
|
-
facade = AnnofabApiFacade(service)
|
|
196
|
-
ChangeInputDataName(service, facade, args).main()
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
200
|
-
argument_parser = ArgumentParser(parser)
|
|
201
|
-
argument_parser.add_project_id()
|
|
202
|
-
|
|
203
|
-
file_group = parser.add_mutually_exclusive_group(required=True)
|
|
204
|
-
file_group.add_argument(
|
|
205
|
-
"--csv",
|
|
206
|
-
type=Path,
|
|
207
|
-
help=(
|
|
208
|
-
"変更対象の入力データが記載されたCSVファイルのパスを指定してください。\n"
|
|
209
|
-
"CSVのフォーマットは以下の通りです。"
|
|
210
|
-
"\n"
|
|
211
|
-
" * ヘッダ行あり, カンマ区切り\n"
|
|
212
|
-
" * input_data_id (required)\n"
|
|
213
|
-
" * input_data_name (required)\n"
|
|
214
|
-
),
|
|
215
|
-
)
|
|
216
|
-
|
|
217
|
-
JSON_SAMPLE = '[{"input_data_id":"id", "input_data_name":"new_name"}]' # noqa: N806
|
|
218
|
-
file_group.add_argument(
|
|
219
|
-
"--json",
|
|
220
|
-
type=str,
|
|
221
|
-
help=(
|
|
222
|
-
"変更対象の入力データと変更後の名前をJSON形式で指定してください。\n"
|
|
223
|
-
"JSONの各キーは ``--csv`` に渡すCSVの各列に対応しています。\n"
|
|
224
|
-
"``file://`` を先頭に付けるとjsonファイルを指定できます。\n"
|
|
225
|
-
f"(ex) ``{JSON_SAMPLE}``"
|
|
226
|
-
),
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
parser.add_argument(
|
|
230
|
-
"--parallelism",
|
|
231
|
-
type=int,
|
|
232
|
-
choices=PARALLELISM_CHOICES,
|
|
233
|
-
help="使用するプロセス数(並列度)を指定してください。指定する場合は必ず ``--yes`` を指定してください。指定しない場合は、逐次的に処理します。",
|
|
234
|
-
)
|
|
235
|
-
|
|
236
|
-
parser.set_defaults(subcommand_func=main)
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
|
|
240
|
-
subcommand_name = "change_name"
|
|
241
|
-
subcommand_help = "入力データ名を変更します。"
|
|
242
|
-
epilog = "オーナロールを持つユーザで実行してください。"
|
|
243
|
-
parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, epilog=epilog)
|
|
244
|
-
parse_args(parser)
|
|
245
|
-
return parser
|
|
File without changes
|
|
File without changes
|
|
File without changes
|