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.
- dcicutils/license_utils.py +0 -2
- dcicutils/scripts/update_portal_object.py +38 -13
- {dcicutils-8.13.3.1b6.dist-info → dcicutils-8.13.3.1b8.dist-info}/METADATA +1 -1
- {dcicutils-8.13.3.1b6.dist-info → dcicutils-8.13.3.1b8.dist-info}/RECORD +7 -7
- {dcicutils-8.13.3.1b6.dist-info → dcicutils-8.13.3.1b8.dist-info}/LICENSE.txt +0 -0
- {dcicutils-8.13.3.1b6.dist-info → dcicutils-8.13.3.1b8.dist-info}/WHEEL +0 -0
- {dcicutils-8.13.3.1b6.dist-info → dcicutils-8.13.3.1b8.dist-info}/entry_points.txt +0 -0
dcicutils/license_utils.py
CHANGED
@@ -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,
|
217
|
-
|
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,
|
227
|
-
|
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,
|
237
|
-
|
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,
|
273
|
+
def post_data(portal: Portal, data: dict, schema_name: str,
|
267
274
|
file: Optional[str] = None, index: int = 0,
|
268
|
-
|
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,
|
300
|
+
def patch_data(portal: Portal, data: dict, schema_name: str,
|
293
301
|
file: Optional[str] = None, index: int = 0,
|
294
|
-
|
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,
|
329
|
+
def upsert_data(portal: Portal, data: dict, schema_name: str,
|
319
330
|
file: Optional[str] = None, index: int = 0,
|
320
|
-
|
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
|
-
|
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"):
|
@@ -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=
|
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=
|
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.
|
79
|
-
dcicutils-8.13.3.
|
80
|
-
dcicutils-8.13.3.
|
81
|
-
dcicutils-8.13.3.
|
82
|
-
dcicutils-8.13.3.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|