dcicutils 8.8.1.1b27__py3-none-any.whl → 8.8.1.1b28__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.
@@ -0,0 +1,67 @@
1
+ import re
2
+ from typing import Optional
3
+ from dcicutils.structured_data import Portal
4
+
5
+
6
+ def ref_lookup_strategy(portal: Portal, type_name: str, schema: dict, value: str) -> (int, Optional[str]):
7
+ #
8
+ # FYI: Note this situation WRT object lookups ...
9
+ #
10
+ # /{submitted_id} # NOT FOUND
11
+ # /UnalignedReads/{submitted_id} # OK
12
+ # /SubmittedFile/{submitted_id} # OK
13
+ # /File/{submitted_id} # NOT FOUND
14
+ #
15
+ # /{accession} # OK
16
+ # /UnalignedReads/{accession} # NOT FOUND
17
+ # /SubmittedFile/{accession} # NOT FOUND
18
+ # /File/{accession} # OK
19
+ #
20
+ def ref_validator(schema: Optional[dict],
21
+ property_name: Optional[str], property_value: Optional[str]) -> Optional[bool]:
22
+ """
23
+ Returns False iff the type represented by the given schema, can NOT be referenced by
24
+ the given property name with the given property value, otherwise returns None.
25
+
26
+ For example, if the schema is for the UnalignedReads type and the property name
27
+ is accession, then we will return False iff the given property value is NOT a properly
28
+ formatted accession ID. Otherwise, we will return None, which indicates that the
29
+ caller (in dcicutils.structured_data.Portal.ref_exists) will continue executing
30
+ its default behavior, which is to check other ways in which the given type can NOT
31
+ be referenced by the given value, i.e. it checks other identifying properties for
32
+ the type and makes sure any patterns (e.g. for submitted_id or uuid) are ahered to.
33
+
34
+ The goal (in structured_data) being to detect if a type is being referenced in such
35
+ a way that cannot possibly be allowed, i.e. because none of its identifying types
36
+ are in the required form (if indeed there any requirements). Note that it is guaranteed
37
+ that the given property name is indeed an identifying property for the given type.
38
+ """
39
+ if property_format := schema.get("properties", {}).get(property_name, {}).get("format"):
40
+ if (property_format == "accession") and (property_name == "accession"):
41
+ if not _is_accession_id(property_value):
42
+ return False
43
+ return None
44
+
45
+ DEFAULT_RESPONSE = (Portal.LOOKUP_DEFAULT, ref_validator)
46
+
47
+ if not value:
48
+ return DEFAULT_RESPONSE
49
+ if not schema:
50
+ if not isinstance(portal, Portal) or not (schema := portal.get_schema(type_name)):
51
+ return DEFAULT_RESPONSE
52
+ if schema_properties := schema.get("properties"):
53
+ if schema_properties.get("accession") and _is_accession_id(value):
54
+ # Case: lookup by accession (only by root).
55
+ return Portal.LOOKUP_ROOT, ref_validator
56
+ elif schema_property_info_submitted_id := schema_properties.get("submitted_id"):
57
+ if schema_property_pattern_submitted_id := schema_property_info_submitted_id.get("pattern"):
58
+ if re.match(schema_property_pattern_submitted_id, value):
59
+ # Case: lookup by submitted_id (only by specified type).
60
+ return Portal.LOOKUP_SPECIFIED_TYPE, ref_validator
61
+ return DEFAULT_RESPONSE
62
+
63
+
64
+ # This is here for now because of problems with circular dependencies.
65
+ # See: smaht-portal/.../schema_formats.py
66
+ def _is_accession_id(value: str) -> bool:
67
+ return isinstance(value, str) and re.match(r"^SMA[1-9A-Z]{9}$", value) is not None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dcicutils
3
- Version: 8.8.1.1b27
3
+ Version: 8.8.1.1b28
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
@@ -64,14 +64,15 @@ dcicutils/snapshot_utils.py,sha256=ymP7PXH6-yEiXAt75w0ldQFciGNqWBClNxC5gfX2FnY,2
64
64
  dcicutils/ssl_certificate_utils.py,sha256=F0ifz_wnRRN9dfrfsz7aCp4UDLgHEY8LaK7PjnNvrAQ,9707
65
65
  dcicutils/structured_data.py,sha256=IjiLOLsxtINOEaz3oVSEscA4lW-t6u9dFfW-NRCRmfs,58451
66
66
  dcicutils/submitr/progress_constants.py,sha256=5bxyX77ql8qEJearfHEvsvXl7D0GuUODW0T65mbRmnE,2895
67
+ dcicutils/submitr/ref_lookup_strategy.py,sha256=Js2cVznTmgjciLWBPLCvMiwLIHXjDn3jww-gJPjYuFw,3467
67
68
  dcicutils/task_utils.py,sha256=MF8ujmTD6-O2AC2gRGPHyGdUrVKgtr8epT5XU8WtNjk,8082
68
69
  dcicutils/tmpfile_utils.py,sha256=n95XF8dZVbQRSXBZTGToXXfSs3JUVRyN6c3ZZ0nhAWI,1403
69
70
  dcicutils/trace_utils.py,sha256=g8kwV4ebEy5kXW6oOrEAUsurBcCROvwtZqz9fczsGRE,1769
70
71
  dcicutils/validation_utils.py,sha256=cMZIU2cY98FYtzK52z5WUYck7urH6JcqOuz9jkXpqzg,14797
71
72
  dcicutils/variant_utils.py,sha256=2H9azNx3xAj-MySg-uZ2SFqbWs4kZvf61JnK6b-h4Qw,4343
72
73
  dcicutils/zip_utils.py,sha256=rnjNv_k6L9jT2SjDSgVXp4BEJYLtz9XN6Cl2Fy-tqnM,2027
73
- dcicutils-8.8.1.1b27.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
74
- dcicutils-8.8.1.1b27.dist-info/METADATA,sha256=10eVXu2Pbsp3riFUY08fAjFnIkywJg2qPNTJqjJ9Noc,3357
75
- dcicutils-8.8.1.1b27.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
76
- dcicutils-8.8.1.1b27.dist-info/entry_points.txt,sha256=51Q4F_2V10L0282W7HFjP4jdzW4K8lnWDARJQVFy_hw,270
77
- dcicutils-8.8.1.1b27.dist-info/RECORD,,
74
+ dcicutils-8.8.1.1b28.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
75
+ dcicutils-8.8.1.1b28.dist-info/METADATA,sha256=BQjxloCg_4ksew6yyy1O5C9CSZ8VUTQrsqgfq1_K9D4,3357
76
+ dcicutils-8.8.1.1b28.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
77
+ dcicutils-8.8.1.1b28.dist-info/entry_points.txt,sha256=51Q4F_2V10L0282W7HFjP4jdzW4K8lnWDARJQVFy_hw,270
78
+ dcicutils-8.8.1.1b28.dist-info/RECORD,,