dcicutils 8.13.3.1b7__py3-none-any.whl → 8.13.3.1b9__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.
@@ -13,6 +13,7 @@ import glob
13
13
  import io
14
14
  import json
15
15
  import os
16
+ import re
16
17
  import sys
17
18
  from typing import Callable, List, Optional, Tuple, Union
18
19
  from dcicutils.command_utils import yes_or_no
@@ -162,6 +163,7 @@ def main():
162
163
  explicit_schema_name=explicit_schema_name,
163
164
  update_function=patch_data,
164
165
  update_action_name="PATCH",
166
+ patch_delete_fields=args.delete,
165
167
  confirm=args.confirm, verbose=args.verbose, quiet=args.quiet, debug=args.debug)
166
168
  if args.upsert:
167
169
  _post_or_patch_or_upsert(portal=portal,
@@ -169,6 +171,7 @@ def main():
169
171
  explicit_schema_name=explicit_schema_name,
170
172
  update_function=upsert_data,
171
173
  update_action_name="UPSERT",
174
+ patch_delete_fields=args.delete,
172
175
  confirm=args.confirm, verbose=args.verbose, quiet=args.quiet, debug=args.debug)
173
176
 
174
177
  if args.delete:
@@ -190,6 +193,7 @@ def main():
190
193
  def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
191
194
  explicit_schema_name: str,
192
195
  update_function: Callable, update_action_name: str,
196
+ patch_delete_fields: Optional[str] = None,
193
197
  confirm: bool = False, verbose: bool = False,
194
198
  quiet: bool = False, debug: bool = False) -> None:
195
199
 
@@ -202,6 +206,7 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
202
206
  return False
203
207
 
204
208
  def post_or_patch_or_upsert(portal: Portal, file: str, schema_name: Optional[str],
209
+ patch_delete_fields: Optional[str] = None,
205
210
  confirm: bool = False, verbose: bool = False,
206
211
  quiet: bool = False, debug: bool = False) -> None:
207
212
 
@@ -213,8 +218,9 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
213
218
  if isinstance(schema_name, str) and schema_name:
214
219
  if debug:
215
220
  _print(f"DEBUG: File ({file}) contains an object of type: {schema_name}")
216
- update_function(portal, data, schema_name, confirm=confirm,
217
- file=file, verbose=verbose, debug=debug)
221
+ update_function(portal, data, schema_name, file=file,
222
+ patch_delete_fields=patch_delete_fields,
223
+ confirm=confirm, verbose=verbose, debug=debug)
218
224
  elif is_schema_name_list(portal, list(data.keys())):
219
225
  if debug:
220
226
  _print(f"DEBUG: File ({file}) contains a dictionary of schema names.")
@@ -223,8 +229,9 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
223
229
  if debug:
224
230
  _print(f"DEBUG: Processing {update_action_name}s for type: {schema_name}")
225
231
  for index, item in enumerate(schema_data):
226
- update_function(portal, item, schema_name, confirm=confirm,
227
- file=file, index=index, verbose=verbose, debug=debug)
232
+ update_function(portal, item, schema_name, file=file, index=index,
233
+ patch_delete_fields=patch_delete_fields,
234
+ confirm=confirm, verbose=verbose, debug=debug)
228
235
  else:
229
236
  _print(f"WARNING: File ({file}) contains schema item which is not a list: {schema_name}")
230
237
  else:
@@ -233,8 +240,9 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
233
240
  if debug:
234
241
  _print(f"DEBUG: File ({file}) contains a list of objects of type: {schema_name}")
235
242
  for index, item in enumerate(data):
236
- update_function(portal, item, schema_name, confirm=confirm,
237
- file=file, index=index, verbose=verbose, debug=debug)
243
+ update_function(portal, item, schema_name, file=file, index=index,
244
+ patch_delete_fields=patch_delete_fields,
245
+ confirm=confirm, verbose=verbose, debug=debug)
238
246
  if debug:
239
247
  _print(f"DEBUG: Processing {update_action_name} file done: {file}")
240
248
 
@@ -263,9 +271,10 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
263
271
  _print(f"ERROR: Cannot find file or directory: {file_or_directory}")
264
272
 
265
273
 
266
- def post_data(portal: Portal, data: dict, schema_name: str, confirm: bool = False,
274
+ def post_data(portal: Portal, data: dict, schema_name: str,
267
275
  file: Optional[str] = None, index: int = 0,
268
- verbose: bool = False, debug: bool = False) -> None:
276
+ patch_delete_fields: Optional[str] = None, # unused here
277
+ confirm: bool = False, verbose: bool = False, debug: bool = False) -> None:
269
278
  if not (identifying_path := portal.get_identifying_path(data, portal_type=schema_name)):
270
279
  if isinstance(file, str) and isinstance(index, int):
271
280
  _print(f"ERROR: Item for POST has no identifying property: {file} (#{index + 1})")
@@ -289,9 +298,10 @@ def post_data(portal: Portal, data: dict, schema_name: str, confirm: bool = Fals
289
298
  return
290
299
 
291
300
 
292
- def patch_data(portal: Portal, data: dict, schema_name: str, confirm: bool = False,
301
+ def patch_data(portal: Portal, data: dict, schema_name: str,
293
302
  file: Optional[str] = None, index: int = 0,
294
- verbose: bool = False, debug: bool = False) -> None:
303
+ patch_delete_fields: Optional[str] = None,
304
+ confirm: bool = False, verbose: bool = False, debug: bool = False) -> None:
295
305
  if not (identifying_path := portal.get_identifying_path(data, portal_type=schema_name)):
296
306
  if isinstance(file, str) and isinstance(index, int):
297
307
  _print(f"ERROR: Item for PATCH has no identifying property: {file} (#{index + 1})")
@@ -306,6 +316,8 @@ def patch_data(portal: Portal, data: dict, schema_name: str, confirm: bool = Fal
306
316
  if verbose:
307
317
  _print(f"PATCH {schema_name} item: {identifying_path}")
308
318
  try:
319
+ if delete_fields := _parse_delete_fields(patch_delete_fields):
320
+ identifying_path += f"?delete_fields={delete_fields}"
309
321
  portal.patch_metadata(identifying_path, data)
310
322
  if debug:
311
323
  _print(f"DEBUG: PATCH {schema_name} item OK: {identifying_path}")
@@ -315,9 +327,10 @@ def patch_data(portal: Portal, data: dict, schema_name: str, confirm: bool = Fal
315
327
  return
316
328
 
317
329
 
318
- def upsert_data(portal: Portal, data: dict, schema_name: str, confirm: bool = False,
330
+ def upsert_data(portal: Portal, data: dict, schema_name: str,
319
331
  file: Optional[str] = None, index: int = 0,
320
- verbose: bool = False, debug: bool = False) -> None:
332
+ patch_delete_fields: Optional[str] = None,
333
+ confirm: bool = False, verbose: bool = False, debug: bool = False) -> None:
321
334
  if not (identifying_path := portal.get_identifying_path(data, portal_type=schema_name)):
322
335
  if isinstance(file, str) and isinstance(index, int):
323
336
  _print(f"ERROR: Item for UPSERT has no identifying property: {file} (#{index + 1})")
@@ -330,7 +343,12 @@ def upsert_data(portal: Portal, data: dict, schema_name: str, confirm: bool = Fa
330
343
  if verbose:
331
344
  _print(f"{'PATCH' if exists else 'POST'} {schema_name} item: {identifying_path}")
332
345
  try:
333
- portal.post_metadata(schema_name, data) if not exists else portal.patch_metadata(identifying_path, data)
346
+ if not exists:
347
+ portal.post_metadata(schema_name, data)
348
+ else:
349
+ if delete_fields := _parse_delete_fields(patch_delete_fields):
350
+ identifying_path += f"?delete_fields={delete_fields}"
351
+ portal.patch_metadata(identifying_path, data)
334
352
  if debug:
335
353
  _print(f"DEBUG: UPSERT {schema_name} item OK: {identifying_path}")
336
354
  except Exception as e:
@@ -396,6 +414,14 @@ def _file_names_to_ordered_file_and_schema_names(portal: Portal,
396
414
  return ordered_results
397
415
 
398
416
 
417
+ def _parse_delete_fields(value: str) -> str:
418
+ if not isinstance(value, str):
419
+ value = []
420
+ else:
421
+ value = list(set([part.strip() for part in re.split(r'[,;|\s]+', value) if part.strip()]))
422
+ return ",".join(value)
423
+
424
+
399
425
  def _get_schema_name_from_schema_named_json_file_name(portal: Portal, value: str) -> Optional[str]:
400
426
  try:
401
427
  if not value.endswith(".json"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dcicutils
3
- Version: 8.13.3.1b7
3
+ Version: 8.13.3.1b9
4
4
  Summary: Utility package for interacting with the 4DN Data Portal and other 4DN resources
5
5
  Home-page: https://github.com/4dn-dcic/utils
6
6
  License: MIT
@@ -60,7 +60,7 @@ dcicutils/s3_utils.py,sha256=h2B9ftOo-kxqfiKth5ZDC_cAUFy1Pbu7BrVanFnE5Iw,28839
60
60
  dcicutils/schema_utils.py,sha256=GmRm-XqZKJ6qine16SQF1txcby9WougDav_sYmKNs9E,12400
61
61
  dcicutils/scripts/publish_to_pypi.py,sha256=sMd4WASQGlxlh7uLrt2eGkFRXYgONVmvIg8mClMS5RQ,13903
62
62
  dcicutils/scripts/run_license_checker.py,sha256=z2keYnRDZsHQbTeo1XORAXSXNJK5axVzL5LjiNqZ7jE,4184
63
- dcicutils/scripts/update_portal_object.py,sha256=p9pFkoA3ZZOWvh-GMDpgR8qOfx_jQppOVNOjsuZndAU,18810
63
+ dcicutils/scripts/update_portal_object.py,sha256=UbvDMtBtZirTAk5JZ7IGZqGn-QiNS1S7v0gn5rtIlUg,20084
64
64
  dcicutils/scripts/view_portal_object.py,sha256=h8COy0lcLNWF9b5spjrlQ28wfqyTTMqAeC_xpFXutus,32262
65
65
  dcicutils/secrets_utils.py,sha256=8dppXAsiHhJzI6NmOcvJV5ldvKkQZzh3Fl-cb8Wm7MI,19745
66
66
  dcicutils/sheet_utils.py,sha256=VlmzteONW5VF_Q4vo0yA5vesz1ViUah1MZ_yA1rwZ0M,33629
@@ -75,8 +75,8 @@ dcicutils/trace_utils.py,sha256=g8kwV4ebEy5kXW6oOrEAUsurBcCROvwtZqz9fczsGRE,1769
75
75
  dcicutils/validation_utils.py,sha256=cMZIU2cY98FYtzK52z5WUYck7urH6JcqOuz9jkXpqzg,14797
76
76
  dcicutils/variant_utils.py,sha256=2H9azNx3xAj-MySg-uZ2SFqbWs4kZvf61JnK6b-h4Qw,4343
77
77
  dcicutils/zip_utils.py,sha256=_Y9EmL3D2dUZhxucxHvrtmmlbZmK4FpSsHEb7rGSJLU,3265
78
- dcicutils-8.13.3.1b7.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
79
- dcicutils-8.13.3.1b7.dist-info/METADATA,sha256=ckiRajeWxze3ot0XmSV2dOrvw4iN5UozwYeAWF0HJTw,3439
80
- dcicutils-8.13.3.1b7.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
81
- dcicutils-8.13.3.1b7.dist-info/entry_points.txt,sha256=W6kEWdUJk9tQ4myAgpehPdebcwvCAZ7UgB-wyPgDUMg,335
82
- dcicutils-8.13.3.1b7.dist-info/RECORD,,
78
+ dcicutils-8.13.3.1b9.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
79
+ dcicutils-8.13.3.1b9.dist-info/METADATA,sha256=Rw87lqJzYwFrz2nivFVNRXlvqZ8AM2hfi3Ae6nidGKk,3439
80
+ dcicutils-8.13.3.1b9.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
81
+ dcicutils-8.13.3.1b9.dist-info/entry_points.txt,sha256=W6kEWdUJk9tQ4myAgpehPdebcwvCAZ7UgB-wyPgDUMg,335
82
+ dcicutils-8.13.3.1b9.dist-info/RECORD,,