nci-cidc-api-modules 1.2.45__py3-none-any.whl → 1.2.53__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.
Files changed (27) hide show
  1. boot.py +14 -0
  2. cidc_api/__init__.py +1 -1
  3. cidc_api/config/settings.py +4 -10
  4. cidc_api/models/errors.py +7 -0
  5. cidc_api/models/models.py +14 -2
  6. cidc_api/models/pydantic/base.py +63 -2
  7. cidc_api/models/pydantic/stage1/adverse_event.py +51 -24
  8. cidc_api/models/pydantic/stage1/comorbidity.py +15 -8
  9. cidc_api/models/pydantic/stage1/demographic.py +45 -28
  10. cidc_api/models/pydantic/stage1/disease.py +100 -58
  11. cidc_api/models/pydantic/stage1/exposure.py +14 -8
  12. cidc_api/models/pydantic/stage1/medical_history.py +15 -8
  13. cidc_api/models/pydantic/stage1/other_malignancy.py +17 -11
  14. cidc_api/models/pydantic/stage1/participant.py +26 -14
  15. cidc_api/models/pydantic/stage1/radiotherapy_dose.py +27 -14
  16. cidc_api/models/pydantic/stage1/response.py +41 -22
  17. cidc_api/models/pydantic/stage1/response_by_system.py +138 -30
  18. cidc_api/models/pydantic/stage1/surgery.py +15 -7
  19. cidc_api/models/pydantic/stage1/therapy_agent_dose.py +27 -14
  20. cidc_api/models/pydantic/stage1/treatment.py +28 -14
  21. cidc_api/shared/file_handling.py +2 -0
  22. cidc_api/shared/gcloud_client.py +20 -2
  23. {nci_cidc_api_modules-1.2.45.dist-info → nci_cidc_api_modules-1.2.53.dist-info}/METADATA +13 -12
  24. {nci_cidc_api_modules-1.2.45.dist-info → nci_cidc_api_modules-1.2.53.dist-info}/RECORD +27 -25
  25. {nci_cidc_api_modules-1.2.45.dist-info → nci_cidc_api_modules-1.2.53.dist-info}/WHEEL +1 -1
  26. {nci_cidc_api_modules-1.2.45.dist-info → nci_cidc_api_modules-1.2.53.dist-info}/top_level.txt +1 -0
  27. {nci_cidc_api_modules-1.2.45.dist-info → nci_cidc_api_modules-1.2.53.dist-info}/licenses/LICENSE +0 -0
@@ -1,11 +1,11 @@
1
- from typing import Self
2
-
3
- from pydantic import model_validator
1
+ from cidc_api.models.pydantic.base import forced_validator, forced_validators
4
2
 
3
+ from cidc_api.models.errors import ValueLocError
5
4
  from cidc_api.models.pydantic.base import Base
6
5
  from cidc_api.models.types import YNU, OffTreatmentReason
7
6
 
8
7
 
8
+ @forced_validators
9
9
  class Treatment(Base):
10
10
  __data_category__ = "treatment"
11
11
  __cardinality__ = "many"
@@ -37,14 +37,28 @@ class Treatment(Base):
37
37
  # If "Other" is selected for "off_treatment_reason", provide a description of the reason.
38
38
  off_treatment_reason_other: str | None = None
39
39
 
40
- @model_validator(mode="after")
41
- def validate_off_treatment_reason_cr(self) -> Self:
42
- if self.off_treatment == "Yes" and not self.off_treatment_reason:
43
- raise ValueError('If off_treatment is "Yes", please provide off_treatment_reason.')
44
- return self
45
-
46
- @model_validator(mode="after")
47
- def validate_off_treatment_reason_other_cr(self) -> Self:
48
- if self.off_treatment_reason == "Other" and not self.off_treatment_reason_other:
49
- raise ValueError('If off_treatment_reason is "Other", please provide off_treatment_reason_other.')
50
- return self
40
+ @forced_validator
41
+ @classmethod
42
+ def validate_off_treatment_reason_cr(cls, data, info) -> None:
43
+ off_treatment = data.get("off_treatment", None)
44
+ off_treatment_reason = data.get("off_treatment_reason", None)
45
+
46
+ if off_treatment == "Yes" and not off_treatment_reason:
47
+ raise ValueLocError(
48
+ 'If off_treatment is "Yes", please provide off_treatment_reason.',
49
+ loc="off_treatment_reason",
50
+ )
51
+ return off_treatment_reason
52
+
53
+ @forced_validator
54
+ @classmethod
55
+ def validate_off_treatment_reason_other_cr(cls, data, info) -> None:
56
+ off_treatment_reason = data.get("off_treatment_reason", None)
57
+ off_treatment_reason_other = data.get("off_treatment_reason_other", None)
58
+
59
+ if off_treatment_reason == "Other" and not off_treatment_reason_other:
60
+ raise ValueLocError(
61
+ 'If off_treatment_reason is "Other", please provide off_treatment_reason_other.',
62
+ loc="off_treatment_reason_other",
63
+ )
64
+ return off_treatment_reason_other
@@ -14,6 +14,8 @@ from ..telemetry import trace_
14
14
 
15
15
  logger = get_logger(__name__)
16
16
 
17
+ MASTER_APPENDIX_A_VERSION_PREFIX = "Master Appendix A Version:"
18
+
17
19
 
18
20
  @trace_()
19
21
  def set_current_file(
@@ -61,6 +61,7 @@ from ..config.settings import (
61
61
  GOOGLE_HL_CLINICAL_VALIDATION_TOPIC,
62
62
  GOOGLE_DL_CLINICAL_VALIDATION_TOPIC,
63
63
  GOOGLE_ASSAY_METADATA_VALIDATION_TOPIC,
64
+ GOOGLE_CLINICAL_DATA_INGESTION_PROCESSING_TOPIC,
64
65
  TESTING,
65
66
  ENV,
66
67
  IS_EMAIL_ON,
@@ -479,13 +480,24 @@ async def async_gcs_files_to_pandas_dataframes(bucket_name: str, blob_names: Lis
479
480
 
480
481
  for blob_name, contents in zip(blob_names, all_contents):
481
482
  extension = blob_name.split(".")[-1]
482
- dataframes.append(prepare_dataframe(extension, contents))
483
+ try:
484
+ dataframes.append(prepare_dataframe(extension, contents))
485
+ except pd.errors.EmptyDataError:
486
+ logger.warning(f"The dataframe retrieved from {blob_name} was empty!")
483
487
  return dataframes
484
488
 
485
489
 
490
+ async def async_gcs_files_to_bytes(bucket_name: str, blob_names: List[str]) -> List[DataFrame]:
491
+ """Async reads a XLSX or CSV files from Google Cloud Storage into a list of raw bytes"""
492
+
493
+ all_contents = await asyncio.gather(
494
+ *[async_get_file_bytes_from_gcs(bucket_name, blob_name) for blob_name in blob_names]
495
+ )
496
+ return all_contents
497
+
498
+
486
499
  async def async_get_file_bytes_from_gcs(bucket_name: str, blob_name: str) -> io.BytesIO:
487
500
  """Async reads a file from Google Cloud Storage and returns it as BytesIO."""
488
-
489
501
  async with Storage() as client:
490
502
  sheet_data = await client.download(bucket_name, blob_name)
491
503
  return io.BytesIO(sheet_data)
@@ -1056,6 +1068,12 @@ def publish_assay_metadata_validation(job_id: int) -> None:
1056
1068
  _report = _encode_and_publish(str(job_id), GOOGLE_ASSAY_METADATA_VALIDATION_TOPIC)
1057
1069
 
1058
1070
 
1071
+ def publish_clinical_data_ingestion(job_id: int) -> None:
1072
+ """Start ingestion of clinical data job"""
1073
+ # Start asynchronously
1074
+ _report = _encode_and_publish(str(job_id), GOOGLE_CLINICAL_DATA_INGESTION_PROCESSING_TOPIC)
1075
+
1076
+
1059
1077
  def send_email(to_emails: List[str], subject: str, html_content: str, **kw) -> None:
1060
1078
  """
1061
1079
  Publish an email-to-send to the emails topic.
@@ -1,30 +1,31 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nci_cidc_api_modules
3
- Version: 1.2.45
3
+ Version: 1.2.53
4
4
  Summary: SQLAlchemy data models and configuration tools used in the NCI CIDC API
5
5
  Home-page: https://github.com/NCI-CIDC/cidc-api-gae
6
6
  License: MIT license
7
7
  Requires-Python: >=3.13
8
8
  Description-Content-Type: text/markdown
9
9
  License-File: LICENSE
10
- Requires-Dist: certifi>=2025.11.12
11
- Requires-Dist: cloud-sql-python-connector[pg8000]>=1.19.0
10
+ Requires-Dist: cachetools>=6.2.4
11
+ Requires-Dist: certifi>=2026.1.4
12
+ Requires-Dist: cloud-sql-python-connector[pg8000]>=1.20.0
12
13
  Requires-Dist: flask>=3.1.2
13
14
  Requires-Dist: flask-migrate>=4.1.0
14
15
  Requires-Dist: flask-sqlalchemy>=3.1.1
15
16
  Requires-Dist: flask-talisman>=0.7.0
16
17
  Requires-Dist: gcloud-aio-storage~=9.6.1
17
- Requires-Dist: google-auth==2.45.0
18
- Requires-Dist: google-api-python-client>=2.187.0
19
- Requires-Dist: google-cloud-bigquery>=3.39.0
18
+ Requires-Dist: google-api-python-client>=2.188.0
19
+ Requires-Dist: google-auth==2.47.0
20
+ Requires-Dist: google-cloud-bigquery>=3.40.0
20
21
  Requires-Dist: google-cloud-pubsub>=2.34.0
21
22
  Requires-Dist: google-cloud-secret-manager>=2.26.0
22
- Requires-Dist: google-cloud-storage>=3.7.0
23
+ Requires-Dist: google-cloud-storage>=3.8.0
23
24
  Requires-Dist: jinja2>=3.1.6
24
- Requires-Dist: joserfc>=1.6.0
25
- Requires-Dist: marshmallow>=4.1.2
25
+ Requires-Dist: joserfc>=1.6.1
26
+ Requires-Dist: marshmallow>=4.2.0
26
27
  Requires-Dist: marshmallow-sqlalchemy>=1.4.2
27
- Requires-Dist: numpy>=2.4.0
28
+ Requires-Dist: numpy>=2.4.1
28
29
  Requires-Dist: packaging>=25.0
29
30
  Requires-Dist: pandas>=2.3.3
30
31
  Requires-Dist: pyarrow>=22.0.0
@@ -33,7 +34,7 @@ Requires-Dist: python-dotenv>=1.2.1
33
34
  Requires-Dist: requests>=2.32.5
34
35
  Requires-Dist: sqlalchemy>=2.0.45
35
36
  Requires-Dist: sqlalchemy-mixins~=2.0.5
36
- Requires-Dist: werkzeug>=3.1.4
37
+ Requires-Dist: werkzeug>=3.1.5
37
38
  Requires-Dist: opentelemetry-api>=1.39.1
38
39
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.39.1
39
40
  Requires-Dist: opentelemetry-sdk>=1.39.1
@@ -42,7 +43,7 @@ Requires-Dist: opentelemetry-instrumentation-requests>=0.59b0
42
43
  Requires-Dist: opentelemetry-instrumentation-sqlalchemy>=0.59b0
43
44
  Requires-Dist: opentelemetry-exporter-gcp-trace>=1.11.0
44
45
  Requires-Dist: opentelemetry-propagator-gcp>=1.11.0
45
- Requires-Dist: nci-cidc-schemas==0.28.11
46
+ Requires-Dist: nci-cidc-schemas==0.28.12
46
47
  Dynamic: description
47
48
  Dynamic: description-content-type
48
49
  Dynamic: home-page
@@ -1,14 +1,16 @@
1
- cidc_api/__init__.py,sha256=TdZZy40X_55kxtHKjwbGqPrDr5qQe_uUz_Fvup_EuNI,23
1
+ boot.py,sha256=oS_16OgU34iDxyFNpJl5rb5KbfbsCXroUCNLwVPxPNg,416
2
+ cidc_api/__init__.py,sha256=X7WSWc7i6nvghhrqNxUUTAI8_CLJ7jRVdust93y4RdY,23
2
3
  cidc_api/telemetry.py,sha256=LuZWkG8CKCn23O41RTNxEOQwMmfpp-fQ6zSInZhVJg8,3333
3
4
  cidc_api/config/__init__.py,sha256=5mX8GAPxUKV84iS-aGOoE-4m68LsOCGCDptXNdlgvj0,148
4
5
  cidc_api/config/db.py,sha256=mEz8ugjvRNGylCqDYHaaMqaZfDh7sbd76BowmfBvq5c,2428
5
6
  cidc_api/config/logging.py,sha256=abhVYtn8lfhIt0tyV2WHFgSmp_s2eeJh7kodB6LH4J0,1149
6
7
  cidc_api/config/secrets.py,sha256=jRFj7W43pWuPf9DZQLCKF7WPXf5cUv-BAaS3ASqhV_Q,1481
7
- cidc_api/config/settings.py,sha256=Zql6Gxb5MNBW-rxcDNIPUqPiYHnD9nxd2-ievHaEYcI,4744
8
+ cidc_api/config/settings.py,sha256=IlOSJhSyYYK4XQQ4uBdD58kXO-a2AHPWTSN1AT95b9Y,4545
8
9
  cidc_api/models/__init__.py,sha256=bl445G8Zic9YbhZ8ZBni07wtBMhLJRMBA-JqjLxx2bw,66
9
10
  cidc_api/models/data.py,sha256=TyVXk5jJO1NN05CLqejLf5BPp6yLSNNxPmFOgXUnA1M,1313
11
+ cidc_api/models/errors.py,sha256=UncRrh-4v0CR5mpLO0erWD1y9ctus3Nk6XOSvrTjfco,338
10
12
  cidc_api/models/migrations.py,sha256=UlS5How3J4ryaRuZT6F5VQtAKikkl0LTv9MgMO_ltiQ,11161
11
- cidc_api/models/models.py,sha256=DTt0eFkFVVxVn23Aqr6TA8CQ7qb2hdqQ0xVJ3RakBBw,153684
13
+ cidc_api/models/models.py,sha256=RycbGNQHIud9mqCyIH_yrnN7PVSFwbUCjP6pe6sX5VA,154106
12
14
  cidc_api/models/schemas.py,sha256=6IE2dJoEMcMbi0Vr1V3cYKnPKU0hv9vRKBixOZHe88s,2766
13
15
  cidc_api/models/types.py,sha256=WVOTEH61FH5aGVwRbEcfNOce8NLjiEnl1ixtPWav2OA,30058
14
16
  cidc_api/models/db/stage1/__init__.py,sha256=zsxOSoogzL_xZ8B5OwcwLXvAmm6g2GYx1Zf6LLw8dq8,1917
@@ -79,32 +81,32 @@ cidc_api/models/db/stage2/trial_orm.py,sha256=7_5kA1Yv80GFQykK8AIlFC0vtrsb2H8xLs
79
81
  cidc_api/models/files/__init__.py,sha256=8BMTnUSHzUbz0lBeEQY6NvApxDD3GMWMduoVMos2g4Y,213
80
82
  cidc_api/models/files/details.py,sha256=sZkGM7iEV4-J6IDQCdiMV6KBDLbPxCOqUMaU3aY9rX8,65153
81
83
  cidc_api/models/files/facets.py,sha256=vieZ3z_tYB29NqtvNzvKqajVwxM5ZLLZKeyQTq5lheU,33776
82
- cidc_api/models/pydantic/base.py,sha256=6Lsf4fekIS1E-DwZmgCXlfm3Qq9_23dA_v3iz1w2JoA,1427
84
+ cidc_api/models/pydantic/base.py,sha256=sL_0PwEH2vS8BMT_w-zL7CPeaU-R7ih5afRigX6k2DM,4069
83
85
  cidc_api/models/pydantic/stage1/__init__.py,sha256=H-NDjCd8isHTgZ7sqz-MIbzC-PpW1kEtR-x-Dyc8r6Q,1667
84
86
  cidc_api/models/pydantic/stage1/additional_treatment.py,sha256=TFVzjd1NPLSfH9UnL2W3aZhpZSzDsg97j9IK8t882YA,1050
85
- cidc_api/models/pydantic/stage1/adverse_event.py,sha256=zPy02xoRQeyaXBSmqDdQt4BaRTD6OHBjycVHVtBaAow,3880
87
+ cidc_api/models/pydantic/stage1/adverse_event.py,sha256=ZW5iVnMmX7NtZcsgDAjzPorWPZDSJSmTXGK1EsU9AaQ,5167
86
88
  cidc_api/models/pydantic/stage1/baseline_clinical_assessment.py,sha256=5FYvtOVf_nIK1h3xTs3vQgJe2ivQSVHt_wfrTSDgVxU,1119
87
- cidc_api/models/pydantic/stage1/comorbidity.py,sha256=dk4SJnkaaju-boexf2SW_rNNGXl-Os2LR5lnIxCb-dA,1413
89
+ cidc_api/models/pydantic/stage1/comorbidity.py,sha256=IfxFb0dZAdCY--Ze5kiZ3CrzVKJtuknpcpvrQ3ki-gI,1769
88
90
  cidc_api/models/pydantic/stage1/consent_group.py,sha256=aP_nd0GKK6K7VH-6IZRSDDX2RxFM_j9B36FIRGwysOU,1216
89
- cidc_api/models/pydantic/stage1/demographic.py,sha256=X0YoFdK7S8JQ9p_Jm3l-R5HgEl9sZnZVFXrECA2i_zw,6007
90
- cidc_api/models/pydantic/stage1/disease.py,sha256=fwK1FSxTm33BzViGTNsb6AahoDc2BTTXMitCGY3KyDk,7650
91
- cidc_api/models/pydantic/stage1/exposure.py,sha256=ERoVQLuNWynw2zugh5bVdUT0NzNbJ6fIUmKhPSCQfqk,1306
91
+ cidc_api/models/pydantic/stage1/demographic.py,sha256=9r3AFlymwFLwbV0YCHQt1tqTc1g2ywT3zCD66StkYHA,6872
92
+ cidc_api/models/pydantic/stage1/disease.py,sha256=G8d2iqsMhmDA3uxjOitxzmlFKIRxyUMp-o-H7eUfZFg,9250
93
+ cidc_api/models/pydantic/stage1/exposure.py,sha256=bd9gUmOQ7ge-xvoxD17pX95MKxfHKD2xNaFEJAMAkn4,1571
92
94
  cidc_api/models/pydantic/stage1/gvhd_diagnosis_acute.py,sha256=jVMoWuLfspOZtOpC7rg1EzdvEAg8qEabcTaS6RRobZ8,1395
93
95
  cidc_api/models/pydantic/stage1/gvhd_diagnosis_chronic.py,sha256=SRwkAL07YyIZM4bYCqm01aKqSvj3yRmpsqFKxAZEZoM,1382
94
96
  cidc_api/models/pydantic/stage1/gvhd_organ_acute.py,sha256=VxlNGRJYjm9tW2lyLll8pD0t9JZs18gicnH-Ci_nR2I,771
95
97
  cidc_api/models/pydantic/stage1/gvhd_organ_chronic.py,sha256=Fnp1Qm-ZDDtDLrgOAnEOUnQVNWI9WrTSomiFPStGmjc,810
96
- cidc_api/models/pydantic/stage1/medical_history.py,sha256=IXtEvXrrLhTt6JEsj2MpDiZtLAkmrrsUS4aoe7sxans,1697
97
- cidc_api/models/pydantic/stage1/other_malignancy.py,sha256=V-Jru6uukipocKs7lDbmkGyJsHBxlM3A3NJoTShjJ9I,2188
98
- cidc_api/models/pydantic/stage1/participant.py,sha256=iDQrwYYtJY_XrkdbhsRNZuL44ighvW8JHCGxH-qo8jk,2199
98
+ cidc_api/models/pydantic/stage1/medical_history.py,sha256=z-cE_ChyWUKTvWjVhKMUAYvap9YfpZn6Z2BiHhBXx6g,2000
99
+ cidc_api/models/pydantic/stage1/other_malignancy.py,sha256=VIzhbkauaDfZdPxhTYpqNtwYBxE_4osE9wyZ67LQJx4,2622
100
+ cidc_api/models/pydantic/stage1/participant.py,sha256=QfRkK2okY7nM84y9QMK12kZLURBGk-HNWWHL4pQZjec,2655
99
101
  cidc_api/models/pydantic/stage1/prior_treatment.py,sha256=axhyPHwYCoIvcIonjyPJ95HUyaAXqIuOd6hhoDM3LJU,2101
100
- cidc_api/models/pydantic/stage1/radiotherapy_dose.py,sha256=c5q0TxPOrYHX9KTd9he5B01zirKgcCxMnvW_7adzCrI,3327
101
- cidc_api/models/pydantic/stage1/response.py,sha256=rPqfYZhaZRcA1E7dkGOaHe9f2_YIcIg9-KtIPSTh1s8,2886
102
- cidc_api/models/pydantic/stage1/response_by_system.py,sha256=f8ZnLfNXGJLCfFL1X2jxlSUJPGvJKnOCf6PYbJVMXW8,4909
102
+ cidc_api/models/pydantic/stage1/radiotherapy_dose.py,sha256=gDaL1OQuSuTauml6HafBiVvBn8gcynS3G1fa9KNhEPA,3833
103
+ cidc_api/models/pydantic/stage1/response.py,sha256=TJlKmUz9SypbbDnv6iSmLb4KPEuFUPe9Q8iNSGsLbfI,3491
104
+ cidc_api/models/pydantic/stage1/response_by_system.py,sha256=gjyo_jDyc2xHNNrUwoFqH3Fz51v2eSr3JRHkH0xwVqI,9851
103
105
  cidc_api/models/pydantic/stage1/specimen.py,sha256=scDekZ-RtXOQTTLburhqT3RF4KM34iY9NAV1wYi_HSg,1281
104
106
  cidc_api/models/pydantic/stage1/stem_cell_transplant.py,sha256=XsDVUksqbIprPxHwLlwHGyji4jsIFNMcIk-S0H4rDnQ,1228
105
- cidc_api/models/pydantic/stage1/surgery.py,sha256=53NrET_kNOlXXPP-mH5ecIPrNqDpDQt5s9WfsjPDM-s,2149
106
- cidc_api/models/pydantic/stage1/therapy_agent_dose.py,sha256=Y2L0vAqkfA5eI2qg7iQrqzCORwbkjyVEsthc6f5HKas,3021
107
- cidc_api/models/pydantic/stage1/treatment.py,sha256=1TeBaDJ352IfB10AtJH2iREdex3SZgDRXNUkhT0FZMo,2033
107
+ cidc_api/models/pydantic/stage1/surgery.py,sha256=sHPzYMNusYIQrC6gjWopwxo0j9BNOq_Tcl6HKAMvuAQ,2421
108
+ cidc_api/models/pydantic/stage1/therapy_agent_dose.py,sha256=XX7JM4CdvTuAsbI5rI4wYDcbevP46BetTk_z7N_EL-M,3527
109
+ cidc_api/models/pydantic/stage1/treatment.py,sha256=eEjCcmkLdPmS2kg9dtUm3pt9apo1sRypBbte_xUVAYU,2607
108
110
  cidc_api/models/pydantic/stage1/trial.py,sha256=EFsMVMxxHbPeaBb6JG9JpX1qjtoho2t-GZnaI0gsYrY,1859
109
111
  cidc_api/models/pydantic/stage2/__init__.py,sha256=OQRG5wFkNsyAU_0KI1W5PDn8pBDe1EJDcgKZ19shh_g,2331
110
112
  cidc_api/models/pydantic/stage2/additional_treatment.py,sha256=TFVzjd1NPLSfH9UnL2W3aZhpZSzDsg97j9IK8t882YA,1050
@@ -153,13 +155,13 @@ cidc_api/shared/assay_handling.py,sha256=zzWSqQ-ddLVzX5IuHvsaSib2H1lnjXpo9Lbxaoq
153
155
  cidc_api/shared/auth.py,sha256=EIP9AKokLNrI79Fkpv3P7WdzaddJIsuGGICc1W494X0,9110
154
156
  cidc_api/shared/email_layout.html,sha256=pBoTNw3ACHH-ncZFaNvcy5bXMqPwizR78usb0uCYtIc,7670
155
157
  cidc_api/shared/emails.py,sha256=8kNFEaSnKpY-GX_iE59QUhSp3c4_uzy3SpHYt2QjuqI,6121
156
- cidc_api/shared/file_handling.py,sha256=ObsLvBrkwHo6Nv48GvFXDKElNNl4inGpxv--001H_xc,5843
157
- cidc_api/shared/gcloud_client.py,sha256=0B13MRF_CUMbzaKtKVDd9fxErNdNGBpxfkknQ5deu7w,39972
158
+ cidc_api/shared/file_handling.py,sha256=9MZXx5RfXO3A_pXf8Ulb7DQEuyp9j12eO9ad-PcTBXo,5908
159
+ cidc_api/shared/gcloud_client.py,sha256=EJ2ZzZ0gwDOZx18PEzXil4F-jpruacShkVIoecw8qzY,40751
158
160
  cidc_api/shared/jose.py,sha256=-qzGzEDAlokEp9E7WtBtQkXyyfPWTYXlwYpCqVJWmqM,1830
159
161
  cidc_api/shared/rest_utils.py,sha256=RwR30WOUAYCxL7V-i2totEyeriG30GbBDvBcpLXhM9w,6594
160
162
  cidc_api/shared/utils.py,sha256=-gLnzxCR9E6h0plt2xrNisUG5_Y6GhhVwz3DgDIzpvs,367
161
- nci_cidc_api_modules-1.2.45.dist-info/licenses/LICENSE,sha256=pNYWVTHaYonnmJyplmeAp7tQAjosmDpAWjb34jjv7Xs,1102
162
- nci_cidc_api_modules-1.2.45.dist-info/METADATA,sha256=ierSCHEAC0omx7bg4gjb-XPMPRTK_Qs6VMJXdW65C6A,40270
163
- nci_cidc_api_modules-1.2.45.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
164
- nci_cidc_api_modules-1.2.45.dist-info/top_level.txt,sha256=rNiRzL0lJGi5Q9tY9uSoMdTbJ-7u5c_D2E86KA94yRA,9
165
- nci_cidc_api_modules-1.2.45.dist-info/RECORD,,
163
+ nci_cidc_api_modules-1.2.53.dist-info/licenses/LICENSE,sha256=pNYWVTHaYonnmJyplmeAp7tQAjosmDpAWjb34jjv7Xs,1102
164
+ nci_cidc_api_modules-1.2.53.dist-info/METADATA,sha256=JWWYI8eyF0_QbM-bqoNO5N_jsnoocDjNiwKR1Ba4x9Y,40301
165
+ nci_cidc_api_modules-1.2.53.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
166
+ nci_cidc_api_modules-1.2.53.dist-info/top_level.txt,sha256=BSJqF6ura8-bWCKZvarvQEKvidMM05lH0bLQsNOrI0o,14
167
+ nci_cidc_api_modules-1.2.53.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5