dcicutils 8.13.3.1b6__py3-none-any.whl → 8.13.3.1b8__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,8 +13,6 @@ import warnings
13
13
  try:
14
14
  import piplicenses
15
15
  except ImportError: # pragma: no cover - not worth unit testing this case
16
- if (sys.version_info[0] == 3) and (sys.version_info[1] >= 12):
17
- print("XYZZY: DEBUG GA FOR PYTHON 3.12 AND SUBMITR")
18
16
  if not ((sys.version_info[0] == 3) and (sys.version_info[1] >= 12)):
19
17
  # For some reason for with Python 3.12 this gets triggered at least for submitr (TODO: track down further).
20
18
  raise Exception("The dcicutils.license_utils module is intended for use at development time, not runtime."
@@ -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:
@@ -202,6 +205,7 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
202
205
  return False
203
206
 
204
207
  def post_or_patch_or_upsert(portal: Portal, file: str, schema_name: Optional[str],
208
+ patch_delete_fields: Optional[str] = None,
205
209
  confirm: bool = False, verbose: bool = False,
206
210
  quiet: bool = False, debug: bool = False) -> None:
207
211
 
@@ -213,8 +217,9 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
213
217
  if isinstance(schema_name, str) and schema_name:
214
218
  if debug:
215
219
  _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)
220
+ update_function(portal, data, schema_name, file=file,
221
+ patch_delete_fields=patch_delete_fields,
222
+ confirm=confirm, verbose=verbose, debug=debug)
218
223
  elif is_schema_name_list(portal, list(data.keys())):
219
224
  if debug:
220
225
  _print(f"DEBUG: File ({file}) contains a dictionary of schema names.")
@@ -223,8 +228,9 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
223
228
  if debug:
224
229
  _print(f"DEBUG: Processing {update_action_name}s for type: {schema_name}")
225
230
  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)
231
+ update_function(portal, item, schema_name, file=file, index=index,
232
+ patch_delete_fields=patch_delete_fields,
233
+ confirm=confirm, verbose=verbose, debug=debug)
228
234
  else:
229
235
  _print(f"WARNING: File ({file}) contains schema item which is not a list: {schema_name}")
230
236
  else:
@@ -233,8 +239,9 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
233
239
  if debug:
234
240
  _print(f"DEBUG: File ({file}) contains a list of objects of type: {schema_name}")
235
241
  for index, item in enumerate(data):
236
- update_function(portal, item, schema_name, confirm=confirm,
237
- file=file, index=index, verbose=verbose, debug=debug)
242
+ update_function(portal, item, schema_name, file=file, index=index,
243
+ patch_delete_fields=patch_delete_fields,
244
+ confirm=confirm, verbose=verbose, debug=debug)
238
245
  if debug:
239
246
  _print(f"DEBUG: Processing {update_action_name} file done: {file}")
240
247
 
@@ -263,9 +270,10 @@ def _post_or_patch_or_upsert(portal: Portal, file_or_directory: str,
263
270
  _print(f"ERROR: Cannot find file or directory: {file_or_directory}")
264
271
 
265
272
 
266
- def post_data(portal: Portal, data: dict, schema_name: str, confirm: bool = False,
273
+ def post_data(portal: Portal, data: dict, schema_name: str,
267
274
  file: Optional[str] = None, index: int = 0,
268
- verbose: bool = False, debug: bool = False) -> None:
275
+ patch_delete_fields: Optional[str] = None, # unused here
276
+ confirm: bool = False, verbose: bool = False, debug: bool = False) -> None:
269
277
  if not (identifying_path := portal.get_identifying_path(data, portal_type=schema_name)):
270
278
  if isinstance(file, str) and isinstance(index, int):
271
279
  _print(f"ERROR: Item for POST has no identifying property: {file} (#{index + 1})")
@@ -289,9 +297,10 @@ def post_data(portal: Portal, data: dict, schema_name: str, confirm: bool = Fals
289
297
  return
290
298
 
291
299
 
292
- def patch_data(portal: Portal, data: dict, schema_name: str, confirm: bool = False,
300
+ def patch_data(portal: Portal, data: dict, schema_name: str,
293
301
  file: Optional[str] = None, index: int = 0,
294
- verbose: bool = False, debug: bool = False) -> None:
302
+ patch_delete_fields: Optional[str] = None,
303
+ confirm: bool = False, verbose: bool = False, debug: bool = False) -> None:
295
304
  if not (identifying_path := portal.get_identifying_path(data, portal_type=schema_name)):
296
305
  if isinstance(file, str) and isinstance(index, int):
297
306
  _print(f"ERROR: Item for PATCH has no identifying property: {file} (#{index + 1})")
@@ -306,6 +315,8 @@ def patch_data(portal: Portal, data: dict, schema_name: str, confirm: bool = Fal
306
315
  if verbose:
307
316
  _print(f"PATCH {schema_name} item: {identifying_path}")
308
317
  try:
318
+ if delete_fields := _parse_delete_fields(patch_delete_fields):
319
+ identifying_path += f"?delete_fields={delete_fields}"
309
320
  portal.patch_metadata(identifying_path, data)
310
321
  if debug:
311
322
  _print(f"DEBUG: PATCH {schema_name} item OK: {identifying_path}")
@@ -315,9 +326,10 @@ def patch_data(portal: Portal, data: dict, schema_name: str, confirm: bool = Fal
315
326
  return
316
327
 
317
328
 
318
- def upsert_data(portal: Portal, data: dict, schema_name: str, confirm: bool = False,
329
+ def upsert_data(portal: Portal, data: dict, schema_name: str,
319
330
  file: Optional[str] = None, index: int = 0,
320
- verbose: bool = False, debug: bool = False) -> None:
331
+ patch_delete_fields: Optional[str] = None,
332
+ confirm: bool = False, verbose: bool = False, debug: bool = False) -> None:
321
333
  if not (identifying_path := portal.get_identifying_path(data, portal_type=schema_name)):
322
334
  if isinstance(file, str) and isinstance(index, int):
323
335
  _print(f"ERROR: Item for UPSERT has no identifying property: {file} (#{index + 1})")
@@ -330,7 +342,12 @@ def upsert_data(portal: Portal, data: dict, schema_name: str, confirm: bool = Fa
330
342
  if verbose:
331
343
  _print(f"{'PATCH' if exists else 'POST'} {schema_name} item: {identifying_path}")
332
344
  try:
333
- portal.post_metadata(schema_name, data) if not exists else portal.patch_metadata(identifying_path, data)
345
+ if not exists:
346
+ portal.post_metadata(schema_name, data)
347
+ else:
348
+ if delete_fields := _parse_delete_fields(patch_delete_fields):
349
+ identifying_path += f"?delete_fields={delete_fields}"
350
+ portal.patch_metadata(identifying_path, data)
334
351
  if debug:
335
352
  _print(f"DEBUG: UPSERT {schema_name} item OK: {identifying_path}")
336
353
  except Exception as e:
@@ -396,6 +413,14 @@ def _file_names_to_ordered_file_and_schema_names(portal: Portal,
396
413
  return ordered_results
397
414
 
398
415
 
416
+ def _parse_delete_fields(value: str) -> str:
417
+ if not isinstance(value, str):
418
+ value = []
419
+ else:
420
+ value = list(set([part.strip() for part in re.split(r'[,;|\s]+', value) if part.strip()]))
421
+ return ",".join(value)
422
+
423
+
399
424
  def _get_schema_name_from_schema_named_json_file_name(portal: Portal, value: str) -> Optional[str]:
400
425
  try:
401
426
  if not value.endswith(".json"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dcicutils
3
- Version: 8.13.3.1b6
3
+ Version: 8.13.3.1b8
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
@@ -43,7 +43,7 @@ dcicutils/license_policies/park-lab-common-server.jsonc,sha256=aaK-NdFDT8f8z_gBX
43
43
  dcicutils/license_policies/park-lab-common.jsonc,sha256=QyzpPveVr87RMpjrLLhnxLSp4VuEWta1gehMAqgKKig,18995
44
44
  dcicutils/license_policies/park-lab-gpl-pipeline.jsonc,sha256=vLZkwm3Js-kjV44nug3PizRGDLVnDox4CnvDKu5d2oQ,3260
45
45
  dcicutils/license_policies/park-lab-pipeline.jsonc,sha256=9qlY0ASy3iUMQlr3gorVcXrSfRHnVGbLhkS427UaRy4,283
46
- dcicutils/license_utils.py,sha256=2g-ibqpAK-sgBiO8Gncth3LFSyurg7HkbIs4rW2nrQQ,47330
46
+ dcicutils/license_utils.py,sha256=2Yxnh1T1iuMe6wluwbvpFO_zYSGPxB4-STAMc-vz-YM,47202
47
47
  dcicutils/log_utils.py,sha256=7pWMc6vyrorUZQf-V-M3YC6zrPgNhuV_fzm9xqTPph0,10883
48
48
  dcicutils/misc_utils.py,sha256=-syqTAj8DESiiP_KHoyBv9VvfboFYB03QbBlmXnBZXw,109423
49
49
  dcicutils/obfuscation_utils.py,sha256=fo2jOmDRC6xWpYX49u80bVNisqRRoPskFNX3ymFAmjw,5963
@@ -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=mNNcSx3qjdMdunKXnpNBZGAHrPvn4ya8-3mqfF-5fdA,20012
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.1b6.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
79
- dcicutils-8.13.3.1b6.dist-info/METADATA,sha256=IF9O1IPBNDLjbYBuanKb68Mr5PavinXXF1hbyMnBJrY,3439
80
- dcicutils-8.13.3.1b6.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
81
- dcicutils-8.13.3.1b6.dist-info/entry_points.txt,sha256=W6kEWdUJk9tQ4myAgpehPdebcwvCAZ7UgB-wyPgDUMg,335
82
- dcicutils-8.13.3.1b6.dist-info/RECORD,,
78
+ dcicutils-8.13.3.1b8.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
79
+ dcicutils-8.13.3.1b8.dist-info/METADATA,sha256=YjubFoW96OmvbkZR7E5ZzC1EoBwIGE1Hh_MpQ0yJbVw,3439
80
+ dcicutils-8.13.3.1b8.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
81
+ dcicutils-8.13.3.1b8.dist-info/entry_points.txt,sha256=W6kEWdUJk9tQ4myAgpehPdebcwvCAZ7UgB-wyPgDUMg,335
82
+ dcicutils-8.13.3.1b8.dist-info/RECORD,,