nci-cidc-api-modules 1.0.16__tar.gz → 1.0.19__tar.gz
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.
- {nci_cidc_api_modules-1.0.16/nci_cidc_api_modules.egg-info → nci_cidc_api_modules-1.0.19}/PKG-INFO +6 -4
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/config/settings.py +0 -1
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/files/details.py +5 -15
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/files/facets.py +4 -12
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/models.py +30 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/shared/auth.py +5 -88
- nci_cidc_api_modules-1.0.19/cidc_api/shared/jose.py +72 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19/nci_cidc_api_modules.egg-info}/PKG-INFO +6 -4
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/nci_cidc_api_modules.egg-info/SOURCES.txt +1 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/nci_cidc_api_modules.egg-info/requires.txt +5 -3
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/pyproject.toml +5 -4
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/requirements.modules.txt +5 -3
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/tests/test_api.py +1 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/LICENSE +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/MANIFEST.in +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/README.md +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/config/__init__.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/config/db.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/config/logging.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/config/secrets.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/csms/__init__.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/csms/auth.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/__init__.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/csms_api.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/files/__init__.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/migrations.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/schemas.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/shared/__init__.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/shared/emails.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/shared/gcloud_client.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/shared/rest_utils.py +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/nci_cidc_api_modules.egg-info/dependency_links.txt +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/nci_cidc_api_modules.egg-info/not-zip-safe +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/nci_cidc_api_modules.egg-info/top_level.txt +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/setup.cfg +0 -0
- {nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/setup.py +0 -0
{nci_cidc_api_modules-1.0.16/nci_cidc_api_modules.egg-info → nci_cidc_api_modules-1.0.19}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: nci_cidc_api_modules
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.19
|
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
|
@@ -14,11 +14,12 @@ Requires-Dist: flask-sqlalchemy==2.5.1
|
|
14
14
|
Requires-Dist: sqlalchemy~=1.3.0
|
15
15
|
Requires-Dist: marshmallow==3.19.0
|
16
16
|
Requires-Dist: marshmallow-sqlalchemy==0.22.3
|
17
|
-
Requires-Dist: google-cloud-storage==
|
18
|
-
Requires-Dist: google-cloud-secret-manager==2.
|
19
|
-
Requires-Dist: google-cloud-pubsub==
|
17
|
+
Requires-Dist: google-cloud-storage==2.18.0
|
18
|
+
Requires-Dist: google-cloud-secret-manager==2.20.1
|
19
|
+
Requires-Dist: google-cloud-pubsub==2.22.0
|
20
20
|
Requires-Dist: google-cloud-bigquery==3.18.0
|
21
21
|
Requires-Dist: google-api-python-client==2.64.0
|
22
|
+
Requires-Dist: google-auth==2.32.0
|
22
23
|
Requires-Dist: packaging>=20.0.0
|
23
24
|
Requires-Dist: pyarrow==14.0.1
|
24
25
|
Requires-Dist: numpy<2,>=1.16.5
|
@@ -26,6 +27,7 @@ Requires-Dist: pandas==1.5.3
|
|
26
27
|
Requires-Dist: python-dotenv==0.10.3
|
27
28
|
Requires-Dist: requests==2.32.3
|
28
29
|
Requires-Dist: jinja2==3.1.4
|
30
|
+
Requires-Dist: certifi==2024.7.4
|
29
31
|
Requires-Dist: nci-cidc-schemas==0.26.35
|
30
32
|
|
31
33
|
# NCI CIDC API <!-- omit in TOC -->
|
@@ -62,7 +62,6 @@ DEV_CFUNCTIONS_SERVER = environ.get("DEV_CFUNCTIONS_SERVER")
|
|
62
62
|
### Configure Auth0 ###
|
63
63
|
AUTH0_DOMAIN = environ.get("AUTH0_DOMAIN")
|
64
64
|
AUTH0_CLIENT_ID = environ.get("AUTH0_CLIENT_ID")
|
65
|
-
ALGORITHMS = ["RS256"]
|
66
65
|
|
67
66
|
### Configure GCP ###
|
68
67
|
GOOGLE_CLOUD_PROJECT = environ["GOOGLE_CLOUD_PROJECT"]
|
{nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/files/details.py
RENAMED
@@ -957,24 +957,14 @@ details_dict = {
|
|
957
957
|
"TSV-formatted table containing metadata about the run",
|
958
958
|
"",
|
959
959
|
),
|
960
|
-
"/mibi
|
961
|
-
"
|
960
|
+
"/mibi/.ome.tiff": FileDetails(
|
961
|
+
"source",
|
962
962
|
"Analysis-ready multilayer OME-TIFF image file",
|
963
963
|
"",
|
964
964
|
),
|
965
|
-
"/mibi/
|
966
|
-
"
|
967
|
-
"
|
968
|
-
"",
|
969
|
-
),
|
970
|
-
"/mibi/channel_names.csv": FileDetails(
|
971
|
-
"miscellaneous",
|
972
|
-
"CSV-formatted table of each channel and the corresponding mass",
|
973
|
-
"",
|
974
|
-
),
|
975
|
-
"/mibi/single_cell_table.csv": FileDetails(
|
976
|
-
"miscellaneous",
|
977
|
-
"Single cell data table containing eg integrated expression values, XY location",
|
965
|
+
"/mibi/he_file.": FileDetails(
|
966
|
+
"source",
|
967
|
+
"H and E file from MIBI analysis",
|
978
968
|
"",
|
979
969
|
),
|
980
970
|
}
|
@@ -340,20 +340,12 @@ assay_facets: Facets = {
|
|
340
340
|
"TSV-formatted table containing metadata about the run",
|
341
341
|
),
|
342
342
|
"Multichannel OME TIFFs": FacetConfig(
|
343
|
-
["/mibi
|
343
|
+
["/mibi/.ome.tiff"],
|
344
344
|
"Analysis-ready multilayer OME-TIFF image file",
|
345
345
|
),
|
346
|
-
"
|
347
|
-
["/mibi/
|
348
|
-
"
|
349
|
-
),
|
350
|
-
"Channel Names": FacetConfig(
|
351
|
-
["/mibi/channel_names.csv"],
|
352
|
-
"CSV-formatted table of each channel and the corresponding mass",
|
353
|
-
),
|
354
|
-
"Single-cell Data": FacetConfig(
|
355
|
-
["/mibi/single_cell_table.csv"],
|
356
|
-
"Single cell data table containing eg integrated expression values, XY location",
|
346
|
+
"H&E File": FacetConfig(
|
347
|
+
["/mibi/he_file."],
|
348
|
+
"H and E file from MIBI analysis",
|
357
349
|
),
|
358
350
|
},
|
359
351
|
"mIF": {
|
@@ -2194,6 +2194,12 @@ class UploadJobs(CommonColumns):
|
|
2194
2194
|
return None
|
2195
2195
|
return upload
|
2196
2196
|
|
2197
|
+
@classmethod
|
2198
|
+
@with_default_session
|
2199
|
+
def find_by_trial_id(cls, trial_id: str, session):
|
2200
|
+
uploads = session.query(UploadJobs).filter_by(trial_id=trial_id)
|
2201
|
+
return uploads
|
2202
|
+
|
2197
2203
|
@with_default_session
|
2198
2204
|
def ingestion_success(
|
2199
2205
|
self, trial, session: Session, commit: bool = False, send_email: bool = False
|
@@ -2803,6 +2809,30 @@ class DownloadableFiles(CommonColumns):
|
|
2803
2809
|
)
|
2804
2810
|
return results
|
2805
2811
|
|
2812
|
+
@classmethod
|
2813
|
+
@with_default_session
|
2814
|
+
def remove_participants_and_samples_info_files(
|
2815
|
+
cls, trial_id: str, session: Session
|
2816
|
+
):
|
2817
|
+
"""
|
2818
|
+
Remove participants info and samples info downloadable files
|
2819
|
+
"""
|
2820
|
+
files_to_delete = (
|
2821
|
+
session.query(cls)
|
2822
|
+
.filter(cls.trial_id == trial_id)
|
2823
|
+
.filter(
|
2824
|
+
or_(
|
2825
|
+
cls.upload_type == "participants info",
|
2826
|
+
cls.upload_type == "samples info",
|
2827
|
+
)
|
2828
|
+
)
|
2829
|
+
.all()
|
2830
|
+
)
|
2831
|
+
|
2832
|
+
for file in files_to_delete:
|
2833
|
+
file.delete(commit=True)
|
2834
|
+
session.execute("REFRESH MATERIALIZED VIEW CONCURRENTLY trial_summaries_mv")
|
2835
|
+
|
2806
2836
|
@classmethod
|
2807
2837
|
@with_default_session
|
2808
2838
|
def get_trial_facets_with_permissions(
|
@@ -1,19 +1,18 @@
|
|
1
1
|
from functools import wraps
|
2
2
|
from typing import List
|
3
3
|
|
4
|
-
import requests
|
5
4
|
from packaging import version
|
6
|
-
|
5
|
+
|
7
6
|
from flask import g, request, current_app as app, Flask
|
8
7
|
from werkzeug.exceptions import Unauthorized, BadRequest, PreconditionFailed
|
9
8
|
|
10
9
|
from ..models import Users, UserSchema
|
11
|
-
|
10
|
+
|
12
11
|
from ..config.logging import get_logger
|
13
12
|
|
14
|
-
|
13
|
+
from ..shared.jose import decode_id_token
|
15
14
|
|
16
|
-
|
15
|
+
logger = get_logger(__name__)
|
17
16
|
|
18
17
|
|
19
18
|
### Main auth utility functions ###
|
@@ -147,8 +146,7 @@ _user_schema = UserSchema()
|
|
147
146
|
|
148
147
|
def authenticate() -> Users:
|
149
148
|
id_token = _extract_token()
|
150
|
-
|
151
|
-
token_payload = _decode_id_token(id_token, public_key)
|
149
|
+
token_payload = decode_id_token(id_token)
|
152
150
|
profile = {"email": token_payload["email"]}
|
153
151
|
return _user_schema.load(profile)
|
154
152
|
|
@@ -173,87 +171,6 @@ def _extract_token() -> str:
|
|
173
171
|
return id_token
|
174
172
|
|
175
173
|
|
176
|
-
def _get_issuer_public_key(token: str) -> dict:
|
177
|
-
"""
|
178
|
-
Get the appropriate public key to check this token for authenticity.
|
179
|
-
|
180
|
-
Args:
|
181
|
-
token: an encoded JWT.
|
182
|
-
|
183
|
-
Raises:
|
184
|
-
Unauthorized: if no public key can be found.
|
185
|
-
|
186
|
-
Returns:
|
187
|
-
str: the public key.
|
188
|
-
"""
|
189
|
-
try:
|
190
|
-
header = jwt.get_unverified_header(token)
|
191
|
-
except jwt.JWTError as e:
|
192
|
-
raise Unauthorized(str(e)) from e
|
193
|
-
|
194
|
-
# Get public keys from our Auth0 domain
|
195
|
-
jwks_url = f"https://{AUTH0_DOMAIN}/.well-known/jwks.json"
|
196
|
-
jwks = requests.get(jwks_url, timeout=TIMEOUT_IN_SECONDS).json()
|
197
|
-
|
198
|
-
# Obtain the public key used to sign this token
|
199
|
-
public_key = None
|
200
|
-
for key in jwks["keys"]:
|
201
|
-
if key["kid"] == header["kid"]:
|
202
|
-
public_key = key
|
203
|
-
|
204
|
-
# If no matching public key was found, we can't validate the token
|
205
|
-
if not public_key:
|
206
|
-
raise Unauthorized(f"Found no public key with id {header['kid']}")
|
207
|
-
|
208
|
-
return public_key
|
209
|
-
|
210
|
-
|
211
|
-
def _decode_id_token(token: str, public_key: dict) -> dict:
|
212
|
-
"""
|
213
|
-
Decodes the token and checks it for validity.
|
214
|
-
|
215
|
-
Args:
|
216
|
-
token: the JWT to validate and decode
|
217
|
-
public_key: public_key
|
218
|
-
|
219
|
-
Raises:
|
220
|
-
Unauthorized:
|
221
|
-
- if token is expired
|
222
|
-
- if token has invalid claims
|
223
|
-
- if token signature is invalid in any way
|
224
|
-
- if no `.email` field on token
|
225
|
-
|
226
|
-
Returns:
|
227
|
-
dict: the decoded token as a dictionary.
|
228
|
-
"""
|
229
|
-
try:
|
230
|
-
payload = jwt.decode(
|
231
|
-
token,
|
232
|
-
public_key,
|
233
|
-
algorithms=ALGORITHMS,
|
234
|
-
audience=AUTH0_CLIENT_ID,
|
235
|
-
issuer=f"https://{AUTH0_DOMAIN}/",
|
236
|
-
options={"verify_at_hash": False},
|
237
|
-
)
|
238
|
-
except jwt.ExpiredSignatureError as e:
|
239
|
-
raise Unauthorized(
|
240
|
-
f"{e} Token expired. Obtain a new login token from the CIDC Portal, then try logging in again."
|
241
|
-
) from e
|
242
|
-
except jwt.JWTClaimsError as e:
|
243
|
-
raise Unauthorized(str(e)) from e
|
244
|
-
except jwt.JWTError as e:
|
245
|
-
raise Unauthorized(str(e)) from e
|
246
|
-
|
247
|
-
# Currently, only id_tokens are accepted for authentication.
|
248
|
-
# Going forward, we could also accept access tokens that we
|
249
|
-
# use to query the userinfo endpoint.
|
250
|
-
if "email" not in payload:
|
251
|
-
msg = "An id_token with an 'email' field is required to authenticate"
|
252
|
-
raise Unauthorized(msg)
|
253
|
-
|
254
|
-
return payload
|
255
|
-
|
256
|
-
|
257
174
|
### Authorization logic ###
|
258
175
|
def authorize(
|
259
176
|
user: Users, allowed_roles: List[str], resource: str, method: str
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# external modules
|
2
|
+
import requests
|
3
|
+
from joserfc import jwt
|
4
|
+
from joserfc.jwk import RSAKey
|
5
|
+
from werkzeug.exceptions import Unauthorized
|
6
|
+
from cachetools import cached, TTLCache
|
7
|
+
|
8
|
+
# loacal modules
|
9
|
+
from ..config.settings import AUTH0_DOMAIN, AUTH0_CLIENT_ID
|
10
|
+
|
11
|
+
|
12
|
+
ALGORITHMS = ["RS256"]
|
13
|
+
TIMEOUT_IN_SECONDS = 20
|
14
|
+
PUBLIC_KEYS_CACHE = TTLCache(maxsize=3600, ttl=1024) # 1 hour, 1 MB
|
15
|
+
|
16
|
+
|
17
|
+
@cached(cache=PUBLIC_KEYS_CACHE)
|
18
|
+
def get_jwks() -> list:
|
19
|
+
# get jwks from our Auth0 domain
|
20
|
+
return requests.get(
|
21
|
+
f"https://{AUTH0_DOMAIN}/.well-known/jwks.json", timeout=TIMEOUT_IN_SECONDS
|
22
|
+
).json()
|
23
|
+
|
24
|
+
|
25
|
+
def decode_id_token(token: str) -> dict:
|
26
|
+
"""
|
27
|
+
Decodes the token and checks it for validity.
|
28
|
+
|
29
|
+
Args:
|
30
|
+
token: the JWT to validate and decode
|
31
|
+
|
32
|
+
Raises:
|
33
|
+
Unauthorized:
|
34
|
+
- if token is expired
|
35
|
+
- if token has invalid claims (email, aud and iss)
|
36
|
+
- if token signature is invalid
|
37
|
+
|
38
|
+
Returns:
|
39
|
+
dict: claims as a dictionary.
|
40
|
+
"""
|
41
|
+
|
42
|
+
jwks = get_jwks()["keys"]
|
43
|
+
if not jwks:
|
44
|
+
raise Unauthorized("No public keys found")
|
45
|
+
|
46
|
+
decoded_token = False
|
47
|
+
|
48
|
+
for jwk in jwks:
|
49
|
+
if decoded_token:
|
50
|
+
continue
|
51
|
+
try:
|
52
|
+
key = RSAKey.import_key(jwk)
|
53
|
+
decoded_token = jwt.decode(token, key, ALGORITHMS)
|
54
|
+
except Exception as e:
|
55
|
+
pass
|
56
|
+
|
57
|
+
if decoded_token:
|
58
|
+
claims = decoded_token.claims
|
59
|
+
else:
|
60
|
+
raise Unauthorized("No valid public key found")
|
61
|
+
|
62
|
+
try:
|
63
|
+
claims_requests = jwt.JWTClaimsRegistry(
|
64
|
+
iss={"essential": True, "value": f"https://{AUTH0_DOMAIN}/"},
|
65
|
+
aud={"essential": True, "value": AUTH0_CLIENT_ID},
|
66
|
+
email={"essential": True},
|
67
|
+
)
|
68
|
+
claims_requests.validate(claims)
|
69
|
+
except Exception as e:
|
70
|
+
raise Unauthorized(str(e)) from e
|
71
|
+
|
72
|
+
return claims
|
{nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19/nci_cidc_api_modules.egg-info}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: nci_cidc_api_modules
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.19
|
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
|
@@ -14,11 +14,12 @@ Requires-Dist: flask-sqlalchemy==2.5.1
|
|
14
14
|
Requires-Dist: sqlalchemy~=1.3.0
|
15
15
|
Requires-Dist: marshmallow==3.19.0
|
16
16
|
Requires-Dist: marshmallow-sqlalchemy==0.22.3
|
17
|
-
Requires-Dist: google-cloud-storage==
|
18
|
-
Requires-Dist: google-cloud-secret-manager==2.
|
19
|
-
Requires-Dist: google-cloud-pubsub==
|
17
|
+
Requires-Dist: google-cloud-storage==2.18.0
|
18
|
+
Requires-Dist: google-cloud-secret-manager==2.20.1
|
19
|
+
Requires-Dist: google-cloud-pubsub==2.22.0
|
20
20
|
Requires-Dist: google-cloud-bigquery==3.18.0
|
21
21
|
Requires-Dist: google-api-python-client==2.64.0
|
22
|
+
Requires-Dist: google-auth==2.32.0
|
22
23
|
Requires-Dist: packaging>=20.0.0
|
23
24
|
Requires-Dist: pyarrow==14.0.1
|
24
25
|
Requires-Dist: numpy<2,>=1.16.5
|
@@ -26,6 +27,7 @@ Requires-Dist: pandas==1.5.3
|
|
26
27
|
Requires-Dist: python-dotenv==0.10.3
|
27
28
|
Requires-Dist: requests==2.32.3
|
28
29
|
Requires-Dist: jinja2==3.1.4
|
30
|
+
Requires-Dist: certifi==2024.7.4
|
29
31
|
Requires-Dist: nci-cidc-schemas==0.26.35
|
30
32
|
|
31
33
|
# NCI CIDC API <!-- omit in TOC -->
|
@@ -23,6 +23,7 @@ cidc_api/shared/__init__.py
|
|
23
23
|
cidc_api/shared/auth.py
|
24
24
|
cidc_api/shared/emails.py
|
25
25
|
cidc_api/shared/gcloud_client.py
|
26
|
+
cidc_api/shared/jose.py
|
26
27
|
cidc_api/shared/rest_utils.py
|
27
28
|
nci_cidc_api_modules.egg-info/PKG-INFO
|
28
29
|
nci_cidc_api_modules.egg-info/SOURCES.txt
|
@@ -5,11 +5,12 @@ flask-sqlalchemy==2.5.1
|
|
5
5
|
sqlalchemy~=1.3.0
|
6
6
|
marshmallow==3.19.0
|
7
7
|
marshmallow-sqlalchemy==0.22.3
|
8
|
-
google-cloud-storage==
|
9
|
-
google-cloud-secret-manager==2.
|
10
|
-
google-cloud-pubsub==
|
8
|
+
google-cloud-storage==2.18.0
|
9
|
+
google-cloud-secret-manager==2.20.1
|
10
|
+
google-cloud-pubsub==2.22.0
|
11
11
|
google-cloud-bigquery==3.18.0
|
12
12
|
google-api-python-client==2.64.0
|
13
|
+
google-auth==2.32.0
|
13
14
|
packaging>=20.0.0
|
14
15
|
pyarrow==14.0.1
|
15
16
|
numpy<2,>=1.16.5
|
@@ -17,4 +18,5 @@ pandas==1.5.3
|
|
17
18
|
python-dotenv==0.10.3
|
18
19
|
requests==2.32.3
|
19
20
|
jinja2==3.1.4
|
21
|
+
certifi==2024.7.4
|
20
22
|
nci-cidc-schemas==0.26.35
|
@@ -19,7 +19,7 @@ python = ">=3.9,<3.10"
|
|
19
19
|
flask-cors = "4.0.1"
|
20
20
|
flask-cachecontrol = "0.3.0"
|
21
21
|
six = "1.13.0"
|
22
|
-
|
22
|
+
joserfc = "1.0.0"
|
23
23
|
psycopg2-binary = ">=2,<3"
|
24
24
|
packaging = ">=20.0.0"
|
25
25
|
protobuf = "3.20.3"
|
@@ -30,6 +30,7 @@ webargs = "6.0.0"
|
|
30
30
|
dash = "2.15.0"
|
31
31
|
markupsafe = "2.1.5"
|
32
32
|
pyarrow="14.0.1"
|
33
|
+
certifi="2024.7.4"
|
33
34
|
|
34
35
|
[tool.poetry.group.dev.dependencies]
|
35
36
|
pytest = ">=8.0.1,<8.1.0"
|
@@ -51,9 +52,9 @@ flask-sqlalchemy = "2.5.1"
|
|
51
52
|
sqlalchemy = ">=1.3.0,<1.4.0"
|
52
53
|
marshmallow = "3.19.0"
|
53
54
|
marshmallow-sqlalchemy = "0.22.3"
|
54
|
-
google-cloud-storage = "
|
55
|
-
google-cloud-secret-manager = "2.
|
56
|
-
google-cloud-pubsub = "
|
55
|
+
google-cloud-storage = "2.18.0"
|
56
|
+
google-cloud-secret-manager = "2.20.1"
|
57
|
+
google-cloud-pubsub = "2.22.0"
|
57
58
|
google-cloud-bigquery = "3.18.0"
|
58
59
|
google-api-python-client = "2.64.0"
|
59
60
|
pandas = ">=1,<2"
|
@@ -5,11 +5,12 @@ flask-sqlalchemy==2.5.1
|
|
5
5
|
sqlalchemy~=1.3.0
|
6
6
|
marshmallow==3.19.0
|
7
7
|
marshmallow-sqlalchemy==0.22.3
|
8
|
-
google-cloud-storage==
|
9
|
-
google-cloud-secret-manager==2.
|
10
|
-
google-cloud-pubsub==
|
8
|
+
google-cloud-storage==2.18.0
|
9
|
+
google-cloud-secret-manager==2.20.1
|
10
|
+
google-cloud-pubsub==2.22.0
|
11
11
|
google-cloud-bigquery==3.18.0
|
12
12
|
google-api-python-client==2.64.0
|
13
|
+
google-auth==2.32.0
|
13
14
|
packaging>=20.0.0
|
14
15
|
pyarrow==14.0.1
|
15
16
|
numpy>=1.16.5,<2
|
@@ -17,4 +18,5 @@ pandas==1.5.3
|
|
17
18
|
python-dotenv==0.10.3
|
18
19
|
requests==2.32.3
|
19
20
|
jinja2==3.1.4
|
21
|
+
certifi==2024.7.4
|
20
22
|
nci-cidc-schemas==0.26.35
|
@@ -447,6 +447,7 @@ def test_endpoint_urls(cidc_api):
|
|
447
447
|
"/trial_metadata/new_manifest",
|
448
448
|
"/trial_metadata/summaries",
|
449
449
|
"/trial_metadata/<string:trial>",
|
450
|
+
"/trial_metadata/<string:trial>/refresh_trial",
|
450
451
|
"/upload_jobs/",
|
451
452
|
"/upload_jobs/<int:upload_job>",
|
452
453
|
"/users/",
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/models/files/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{nci_cidc_api_modules-1.0.16 → nci_cidc_api_modules-1.0.19}/cidc_api/shared/gcloud_client.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|