annofabcli 1.106.2__py3-none-any.whl → 1.106.4__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.
@@ -74,21 +74,26 @@ class AttributeRestrictionMessage:
74
74
  属性の種類がドロップダウンかセレクトボックスのときは、選択肢の名前を返す。
75
75
 
76
76
  Args:
77
- value (str): _description_
78
- attribute (Optional[dict[str,Any]]): _description_
77
+ value: 制約条件の値
78
+ attribute: 属性情報
79
79
 
80
80
  Returns:
81
- str: _description_
81
+ valueが'foo'の場合:
82
+ - 属性の種類が排他選択でない場合: `'foo'` (valueを返す)
83
+ - 属性の種類が排他選択である場合: `'FOO'` (選択肢の名前を返す)
84
+ - `OutputFormat.DETAILED_TEXT` AND 属性の種類が排他選択である場合: `'FOO' (id='foo')` (選択肢の名前とIDを返す)
85
+
82
86
  """
83
87
  if attribute is not None and attribute["type"] in ["choice", "select"]:
84
88
  # ラジオボタンかドロップダウンのとき
85
89
  choices = attribute["choices"]
86
90
  choice = first_true(choices, pred=lambda e: e["choice_id"] == value)
87
- if choice is not None:
88
- choice_name = AnnofabApiFacade.get_choice_name_en(choice)
89
- tmp = f"'{value}'"
91
+ if value == "" or choice is not None:
92
+ # `value == ""`を判定条件に加える理由:「排他選択属性が空である/空でない」という制約の場合、`value`は空文字列になるため。
93
+ choice_name = AnnofabApiFacade.get_choice_name_en(choice) if choice is not None else ""
94
+ tmp = f"'{choice_name}'"
90
95
  if self.output_format == OutputFormat.DETAILED_TEXT:
91
- tmp = f"{tmp} (name='{choice_name}')"
96
+ tmp = f"{tmp} (id='{value}')"
92
97
  return tmp
93
98
 
94
99
  else:
@@ -129,7 +129,7 @@ class SubPutInputData:
129
129
  self.facade = facade
130
130
  self.all_yes = all_yes
131
131
 
132
- def put_input_data(self, project_id: str, csv_input_data: InputDataForPut, last_updated_datetime: Optional[str] = None): # noqa: ANN201
132
+ def put_input_data(self, project_id: str, csv_input_data: InputDataForPut, last_updated_datetime: Optional[str] = None) -> None:
133
133
  request_body: dict[str, Any] = {"last_updated_datetime": last_updated_datetime}
134
134
 
135
135
  file_path = get_file_scheme_path(csv_input_data.input_data_path)
@@ -180,22 +180,26 @@ class SubPutInputData:
180
180
 
181
181
  return self.confirm_processing(message_for_confirm)
182
182
 
183
- def put_input_data_main(self, project_id: str, csv_input_data: CsvInputData, *, overwrite: bool = False) -> bool:
183
+ def put_input_data_main_wrapper(self, tpl: tuple[int, CsvInputData], *, project_id: str, overwrite: bool) -> bool:
184
+ input_data_index, csv_input_data = tpl
185
+ return self.put_input_data_main(project_id, csv_input_data, input_data_index=input_data_index, overwrite=overwrite)
186
+
187
+ def put_input_data_main(self, project_id: str, csv_input_data: CsvInputData, *, input_data_index: int, overwrite: bool = False) -> bool:
184
188
  input_data = InputDataForPut(
185
189
  input_data_name=csv_input_data.input_data_name,
186
190
  input_data_path=csv_input_data.input_data_path,
187
191
  input_data_id=csv_input_data.input_data_id if csv_input_data.input_data_id is not None else convert_input_data_name_to_input_data_id(csv_input_data.input_data_name),
188
192
  )
189
-
193
+ log_message_prefix = f"{input_data_index + 1}件目 :: "
190
194
  last_updated_datetime = None
191
195
  dict_input_data = self.service.wrapper.get_input_data_or_none(project_id, input_data.input_data_id)
192
196
 
193
197
  if dict_input_data is not None:
194
198
  if overwrite:
195
- logger.debug(f"input_data_id='{input_data.input_data_id}' はすでに存在します。")
199
+ logger.debug(f"{log_message_prefix}input_data_id='{input_data.input_data_id}' はすでに存在します。")
196
200
  last_updated_datetime = dict_input_data["updated_datetime"]
197
201
  else:
198
- logger.debug(f"input_data_id='{input_data.input_data_id}' がすでに存在するのでスキップします。")
202
+ logger.debug(f"{log_message_prefix}input_data_id='{input_data.input_data_id}' がすでに存在するのでスキップします。")
199
203
  return False
200
204
 
201
205
  file_path = get_file_scheme_path(input_data.input_data_path)
@@ -210,18 +214,18 @@ class SubPutInputData:
210
214
  # 入力データを登録
211
215
  try:
212
216
  self.put_input_data(project_id, input_data, last_updated_datetime=last_updated_datetime)
213
- logger.debug(f"入力データを登録しました。 :: input_data_id='{input_data.input_data_id}', input_data_name='{input_data.input_data_name}'")
217
+ logger.debug(f"{log_message_prefix}入力データを登録しました。 :: input_data_id='{input_data.input_data_id}', input_data_name='{input_data.input_data_name}'")
214
218
  return True # noqa: TRY300
215
219
 
216
220
  except requests.exceptions.HTTPError:
217
221
  logger.warning(
218
- f"入力データの登録に失敗しました。input_data_id='{input_data.input_data_id}', input_data_name='{input_data.input_data_name}'",
222
+ f"{log_message_prefix}入力データの登録に失敗しました。input_data_id='{input_data.input_data_id}', input_data_name='{input_data.input_data_name}'",
219
223
  exc_info=True,
220
224
  )
221
225
  return False
222
226
  except CheckSumError:
223
227
  logger.warning(
224
- f"入力データを登録しましたが、データが破損している可能性があります。input_data_id='{input_data.input_data_id}', input_data_name='{input_data.input_data_name}',",
228
+ f"{log_message_prefix}入力データを登録しましたが、データが破損している可能性があります。input_data_id='{input_data.input_data_id}', input_data_name='{input_data.input_data_name}'",
225
229
  exc_info=True,
226
230
  )
227
231
  return False
@@ -259,14 +263,14 @@ class PutInputData(CommandLine):
259
263
 
260
264
  obj = SubPutInputData(service=self.service, facade=self.facade, all_yes=self.all_yes)
261
265
  if parallelism is not None:
262
- partial_func = partial(obj.put_input_data_main, project_id, overwrite=overwrite)
266
+ partial_func = partial(obj.put_input_data_main_wrapper, project_id=project_id, overwrite=overwrite)
263
267
  with Pool(parallelism) as pool:
264
- result_bool_list = pool.map(partial_func, input_data_list)
268
+ result_bool_list = pool.map(partial_func, enumerate(input_data_list))
265
269
  count_put_input_data = len([e for e in result_bool_list if e])
266
270
 
267
271
  else:
268
- for csv_input_data in input_data_list:
269
- result = obj.put_input_data_main(project_id, csv_input_data=csv_input_data, overwrite=overwrite)
272
+ for input_data_index, csv_input_data in enumerate(input_data_list):
273
+ result = obj.put_input_data_main(project_id, csv_input_data=csv_input_data, input_data_index=input_data_index, overwrite=overwrite)
270
274
  if result:
271
275
  count_put_input_data += 1
272
276
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: annofabcli
3
- Version: 1.106.2
3
+ Version: 1.106.4
4
4
  Summary: Utility Command Line Interface for AnnoFab
5
5
  Author: Kurusugawa Computer Inc.
6
6
  License: MIT
@@ -19,7 +19,7 @@ annofabcli/annotation/restore_annotation.py,sha256=F0_p1k0Yzx0YVOuLYOS48OWutsN5y
19
19
  annofabcli/annotation/subcommand_annotation.py,sha256=PfiU4G_Col3quCXKbZpqWoUXGi5p2uB1XI9BKMwaq1I,2288
20
20
  annofabcli/annotation_specs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  annofabcli/annotation_specs/add_attribute_restriction.py,sha256=jVA7ltharabR94bf71QuW0x0yVgu6-A7PHn7Dq3kUfg,6825
22
- annofabcli/annotation_specs/attribute_restriction.py,sha256=tXcCLWVUdmmLWFHLjtSERcgxwFhqk7_zyKZzps0oyso,10123
22
+ annofabcli/annotation_specs/attribute_restriction.py,sha256=Ximx5BHK28raHC2WRwP2W6FfuPvCmHu3PGife9MoZHQ,10687
23
23
  annofabcli/annotation_specs/export_annotation_specs.py,sha256=hPDkkzVl1alhSEmRim6w9Vcz5_30fRY0np8GmCEkpcY,4791
24
24
  annofabcli/annotation_specs/get_annotation_specs_with_attribute_id_replaced.py,sha256=pJxr90AvE3bd4vg6A4yhq-wjT86ACBxGZu1Lt-Xw08k,8200
25
25
  annofabcli/annotation_specs/get_annotation_specs_with_choice_id_replaced.py,sha256=QrF4k_isyFPN6OKNafl_7rbHhlkQp8ITkfOh39NZizg,6797
@@ -82,7 +82,7 @@ annofabcli/input_data/download_input_data_json.py,sha256=vxGoeM3ZEggQbWiWsrDK0_G
82
82
  annofabcli/input_data/list_all_input_data.py,sha256=C0u2ZmB52NIgn8-S-F6GT6GFS39gLsl5cCNa_oiNKtk,9754
83
83
  annofabcli/input_data/list_all_input_data_merged_task.py,sha256=xs1uT9_ToQNA2luLxTOuPO_AUi5WRf1uMCdoBFZIMaU,12655
84
84
  annofabcli/input_data/list_input_data.py,sha256=Jz5tRDPBLE8CyPV85jmOGd2-aHELyAE4MGi7WVjZaDM,11335
85
- annofabcli/input_data/put_input_data.py,sha256=VDzU6V8mqa5_-kiwWoircqmDgMZRL6SCiRAN6peDrpc,18037
85
+ annofabcli/input_data/put_input_data.py,sha256=3rr5sWGZvlureGyZ4Fga3cfKQOwirLa_cnE7yhybZk0,18600
86
86
  annofabcli/input_data/put_input_data_with_zip.py,sha256=SA4aMAwMBFgc9Lh0zmRCbmkXG4AMrcBqd5zeTSdr8lc,5566
87
87
  annofabcli/input_data/subcommand_input_data.py,sha256=X8EoxsF6PMiKrvk_r7PIe2D0WZuaPlgLJRuTiljPIdM,2048
88
88
  annofabcli/input_data/update_metadata_of_input_data.py,sha256=E4E-FZaQBmhmhMhddehhtVLxS26TsehZzHRI6Ccr8pc,11460
@@ -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.2.dist-info/METADATA,sha256=8kDxW3p5iajthMP9TJNcPUUEhZMOK1HCqPC83tRHcqU,5286
213
- annofabcli-1.106.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
214
- annofabcli-1.106.2.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
215
- annofabcli-1.106.2.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
216
- annofabcli-1.106.2.dist-info/RECORD,,
212
+ annofabcli-1.106.4.dist-info/METADATA,sha256=ww3ad21ZDcJuBWjrPIw1gktGa0f8go2pGkSGi6zNYP8,5286
213
+ annofabcli-1.106.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
214
+ annofabcli-1.106.4.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
215
+ annofabcli-1.106.4.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
216
+ annofabcli-1.106.4.dist-info/RECORD,,