annofabcli 1.107.1__py3-none-any.whl → 1.109.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/input_data/subcommand_input_data.py +2 -2
- annofabcli/input_data/update_input_data.py +308 -0
- annofabcli/project/create_project.py +151 -0
- annofabcli/project/put_project.py +14 -129
- annofabcli/project/subcommand_project.py +6 -0
- annofabcli/project/update_configuration.py +151 -0
- annofabcli/project/update_project.py +298 -0
- annofabcli/statistics/list_video_duration.py +2 -2
- annofabcli/task/complete_tasks.py +20 -20
- {annofabcli-1.107.1.dist-info → annofabcli-1.109.0.dist-info}/METADATA +2 -2
- {annofabcli-1.107.1.dist-info → annofabcli-1.109.0.dist-info}/RECORD +19 -15
- annofabcli/input_data/change_input_data_name.py +0 -245
- {annofabcli-1.107.1.dist-info → annofabcli-1.109.0.dist-info}/WHEEL +0 -0
- {annofabcli-1.107.1.dist-info → annofabcli-1.109.0.dist-info}/entry_points.txt +0 -0
- {annofabcli-1.107.1.dist-info → annofabcli-1.109.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
|
|
@@ -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
|
|
@@ -119,10 +120,13 @@ annofabcli/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
|
119
120
|
annofabcli/project/change_organization_of_project.py,sha256=yeR8Xu4nmvrA4jGfsPDmFxf-qJxvEVQAvluierJRMxc,11300
|
|
120
121
|
annofabcli/project/change_project_status.py,sha256=AQQFFYjUnwrFshuYS_xSGyLAp2lJ-7SSIuaigPTLBYk,8657
|
|
121
122
|
annofabcli/project/copy_project.py,sha256=O1TooJ0VVbRP84d4Y-8e6Z7pKMwhBEwPu3EBv15hPlY,7131
|
|
123
|
+
annofabcli/project/create_project.py,sha256=WK1mh6c_2sh-98Q_ZxYIGOZPKe22KnmJS8q_l2gNUdA,6051
|
|
122
124
|
annofabcli/project/diff_projects.py,sha256=OsR0otV6MOCbUgGEDsYganu5cuHYZbpHbBAqujwBAw8,16531
|
|
123
125
|
annofabcli/project/list_project.py,sha256=OWnbCyShI4ceugxML8kSAD2nkyld5MlpXfbvQu2__4Y,10367
|
|
124
|
-
annofabcli/project/put_project.py,sha256=
|
|
125
|
-
annofabcli/project/subcommand_project.py,sha256=
|
|
126
|
+
annofabcli/project/put_project.py,sha256=b_ZaMhYTgqC-W5q2FpT-BycnPm9QmduHRvG0cVpAK_A,1567
|
|
127
|
+
annofabcli/project/subcommand_project.py,sha256=ZfaBWUP3r7QW1avj_FBI8kyz5CtHt39v1MOii1Ju8TQ,1651
|
|
128
|
+
annofabcli/project/update_configuration.py,sha256=Gnymx6SwnLARY8oSgVLbG9q7y6WRt06i5RQpv6LTcFI,6491
|
|
129
|
+
annofabcli/project/update_project.py,sha256=OqEieEQyIoVjtJxeaaZfeKjrCl7_YXzQBzC8lCVwqN4,12089
|
|
126
130
|
annofabcli/project_member/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
127
131
|
annofabcli/project_member/change_project_members.py,sha256=T7l7--T2Mb8zLKKfGq3qB-wiAie6rkt2V-iq9e2LDp4,9337
|
|
128
132
|
annofabcli/project_member/copy_project_members.py,sha256=Rm98Ks0PE4zdoXqpu_itNLvBkh1d5x_J7CKjdTkhKLk,8839
|
|
@@ -146,7 +150,7 @@ annofabcli/statistics/list_annotation_attribute.py,sha256=lmvT3b1mVX4PRGWrBUfZaf
|
|
|
146
150
|
annofabcli/statistics/list_annotation_attribute_filled_count.py,sha256=UF8wB-kfUnHCIPykb2Z2slyEcp9aHrzcbFbOs_3Z8-A,29341
|
|
147
151
|
annofabcli/statistics/list_annotation_count.py,sha256=4uTRR63Db-WDGRQt3AC8mPaRfFgbG5d27A036GNG3D0,53151
|
|
148
152
|
annofabcli/statistics/list_annotation_duration.py,sha256=WxHfzF4tYkveIdkaWoJZ6x7ddBMWkfz1YM_vxMub3jY,32165
|
|
149
|
-
annofabcli/statistics/list_video_duration.py,sha256=
|
|
153
|
+
annofabcli/statistics/list_video_duration.py,sha256=11DvuWgbJoxq7hXN7HRCWFjEAK_VG9C33QTSh7bJb0Y,9195
|
|
150
154
|
annofabcli/statistics/list_worktime.py,sha256=nr--GtFY-oyFuu8M0EsUqcVxX26gjeP09LYUcdeptyk,6456
|
|
151
155
|
annofabcli/statistics/scatter.py,sha256=C3hTlm_QfGBiY4KjZ-8D_u_Rk53a9f4jszx4iNZgp9w,10945
|
|
152
156
|
annofabcli/statistics/subcommand_statistics.py,sha256=Pvd7s0vvDU9tSpAphPrv94IDhhR1p8iFH2tjdt7I7ZU,2536
|
|
@@ -189,7 +193,7 @@ annofabcli/task/cancel_acceptance.py,sha256=QG9GhGNfBXntqYTKdYjLUczjD4p_ATkPc_xY
|
|
|
189
193
|
annofabcli/task/change_operator.py,sha256=q6pMd1SdsTRgMHS0705dnosTSHprTpYgXtNd0rli2Zg,11793
|
|
190
194
|
annofabcli/task/change_status_to_break.py,sha256=hwdFTFW-zV0VxuinoBB5n6mvHJ7g9ChjrSOXZcNk88w,8621
|
|
191
195
|
annofabcli/task/change_status_to_on_hold.py,sha256=vWRyk6IK3HcgTWDIbbhXzsrtuoa7OlXCf8CvUpFp_Uw,12981
|
|
192
|
-
annofabcli/task/complete_tasks.py,sha256=
|
|
196
|
+
annofabcli/task/complete_tasks.py,sha256=ouTxqw5_MxLhwCkp_EcBThqA7MhHIZKQsfXxhRJut28,25145
|
|
193
197
|
annofabcli/task/copy_tasks.py,sha256=EcaCaSzqddlSKSUYqDOD53-r1GFpIl38KL3FriSfMeI,8735
|
|
194
198
|
annofabcli/task/delete_metadata_key_of_task.py,sha256=Cjqe3fWKeRzVxxlrGyt3TS-x1riD55LnNXLIS9JPoTw,8029
|
|
195
199
|
annofabcli/task/delete_tasks.py,sha256=7T5eNCMW06ABekNGLwhTitDK5qn0tiPKrEXyJXyQNvs,13098
|
|
@@ -213,8 +217,8 @@ annofabcli/task_history_event/download_task_history_event_json.py,sha256=hQLVbQ0
|
|
|
213
217
|
annofabcli/task_history_event/list_all_task_history_event.py,sha256=EeKMyPUxGwYCFtWQHHW954ZserGm8lUqrwNnV1iX9X4,6830
|
|
214
218
|
annofabcli/task_history_event/list_worktime.py,sha256=Y7Pu5DP7scPf7HPt6CTiTvB1_5_Nfi1bStUIaCpkhII,15507
|
|
215
219
|
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.
|
|
220
|
+
annofabcli-1.109.0.dist-info/METADATA,sha256=pbrL21qmMSLyM9m8jkG-ACFsgHGr9DKBVub588V7jP0,5134
|
|
221
|
+
annofabcli-1.109.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
222
|
+
annofabcli-1.109.0.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
|
|
223
|
+
annofabcli-1.109.0.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
|
|
224
|
+
annofabcli-1.109.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
|