nci-cidc-api-modules 1.2.56__py3-none-any.whl → 1.2.57__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.
- cidc_api/__init__.py +1 -1
- cidc_api/code_systems/__init__.py +0 -0
- cidc_api/code_systems/app.py +126 -0
- cidc_api/code_systems/ctcae.py +34 -0
- cidc_api/code_systems/gvhd.py +6 -0
- cidc_api/code_systems/icd10cm.py +12 -0
- cidc_api/code_systems/icdo3.py +12 -0
- cidc_api/code_systems/importer.py +108 -0
- cidc_api/code_systems/uberon.py +5 -0
- cidc_api/models/dataset.py +0 -1
- cidc_api/models/db/stage1/__init__.py +0 -1
- cidc_api/models/db/stage2/__init__.py +0 -1
- cidc_api/models/files/details.py +0 -1
- cidc_api/models/pydantic/stage1/__init__.py +0 -1
- cidc_api/models/pydantic/stage1/response_by_system.py +0 -1
- cidc_api/models/pydantic/stage2/__init__.py +0 -1
- cidc_api/models/pydantic/stage2/response_by_system.py +0 -1
- cidc_api/shared/gcloud_client.py +0 -1
- cidc_api/shared/jose.py +0 -1
- {nci_cidc_api_modules-1.2.56.dist-info → nci_cidc_api_modules-1.2.57.dist-info}/METADATA +34 -35
- {nci_cidc_api_modules-1.2.56.dist-info → nci_cidc_api_modules-1.2.57.dist-info}/RECORD +24 -16
- {nci_cidc_api_modules-1.2.56.dist-info → nci_cidc_api_modules-1.2.57.dist-info}/WHEEL +0 -0
- {nci_cidc_api_modules-1.2.56.dist-info → nci_cidc_api_modules-1.2.57.dist-info}/licenses/LICENSE +0 -0
- {nci_cidc_api_modules-1.2.56.dist-info → nci_cidc_api_modules-1.2.57.dist-info}/top_level.txt +0 -0
cidc_api/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "1.2.
|
|
1
|
+
__version__ = "1.2.57"
|
|
File without changes
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Iterable
|
|
3
|
+
from time import perf_counter
|
|
4
|
+
|
|
5
|
+
from textual import on
|
|
6
|
+
from textual.app import App, ComposeResult
|
|
7
|
+
from textual.containers import Container
|
|
8
|
+
from textual.widgets import Button, DirectoryTree, Footer, Header, Log, Select
|
|
9
|
+
|
|
10
|
+
from cidc_api.code_systems.importer import delete_data, import_data, load_app
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class FilteredDirectoryTree(DirectoryTree):
|
|
14
|
+
def filter_paths(self, paths: Iterable[Path]) -> Iterable[Path]:
|
|
15
|
+
return [path for path in paths if path.name.endswith(".csv")]
|
|
16
|
+
|
|
17
|
+
def on_directory_tree_file_selected(self, event: DirectoryTree.FileSelected) -> None:
|
|
18
|
+
"""Called when a file is selected in the directory tree."""
|
|
19
|
+
# log = self.app.query_one(Log)
|
|
20
|
+
# log.write_line(f"Selected file: {event.path.parent.name}/{event.path.name}")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class CodeSystems(App):
|
|
24
|
+
"""A Textual app to manage code systems."""
|
|
25
|
+
|
|
26
|
+
CSS = """
|
|
27
|
+
Select { width: 40%; margin: 1;}
|
|
28
|
+
FilteredDirectoryTree { margin-left: 2; }
|
|
29
|
+
Button, Log { margin: 1 2; }
|
|
30
|
+
Container { height: 10; }
|
|
31
|
+
#results { margin: 1; text-style: bold; }
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
BINDINGS = [("d", "toggle_dark", "Toggle dark mode"), ("q", "quit", "Quit the app")]
|
|
35
|
+
SELECT_OPTIONS = [(code, code) for code in ["Ctcae60", "Icdo3"]]
|
|
36
|
+
|
|
37
|
+
def compose(self) -> ComposeResult:
|
|
38
|
+
"""Create child widgets for the app."""
|
|
39
|
+
yield Header()
|
|
40
|
+
yield Select(self.SELECT_OPTIONS, prompt="Select code system")
|
|
41
|
+
with Container(id="tree-container"):
|
|
42
|
+
yield FilteredDirectoryTree(Path(__file__).resolve().parent / "data")
|
|
43
|
+
yield Button("Import data", variant="primary", disabled=True)
|
|
44
|
+
yield Log()
|
|
45
|
+
yield Footer()
|
|
46
|
+
|
|
47
|
+
@on(Select.Changed)
|
|
48
|
+
async def check_select(self, event: Select.Changed):
|
|
49
|
+
|
|
50
|
+
old_tree = self.query_one(FilteredDirectoryTree)
|
|
51
|
+
await old_tree.remove()
|
|
52
|
+
|
|
53
|
+
folder_name = event.value
|
|
54
|
+
new_path = Path(__file__).resolve().parent / "data" / folder_name
|
|
55
|
+
new_tree = FilteredDirectoryTree(str(new_path))
|
|
56
|
+
await self.query_one("#tree-container").mount(new_tree)
|
|
57
|
+
new_tree.focus() # optional: set focus to the new tree
|
|
58
|
+
|
|
59
|
+
self.maybe_enable_button()
|
|
60
|
+
|
|
61
|
+
@on(DirectoryTree.FileSelected)
|
|
62
|
+
def check_tree(self, _event: DirectoryTree.FileSelected):
|
|
63
|
+
self.maybe_enable_button()
|
|
64
|
+
|
|
65
|
+
def maybe_enable_button(self):
|
|
66
|
+
button_widget = self.query_one(Button)
|
|
67
|
+
code_system_widget = self.query_one(Select)
|
|
68
|
+
file_path_widget = self.query_one(FilteredDirectoryTree)
|
|
69
|
+
button_widget.disabled = not (
|
|
70
|
+
code_system_widget.value != Select.BLANK and file_path_widget.cursor_node.data.path.is_file()
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# def on_ready(self) -> None:
|
|
74
|
+
# log = self.query_one(Log)
|
|
75
|
+
# log.write_line("Hello!")
|
|
76
|
+
|
|
77
|
+
def action_toggle_dark(self) -> None:
|
|
78
|
+
"""An action to toggle dark mode."""
|
|
79
|
+
self.theme = "textual-dark" if self.theme == "textual-light" else "textual-light"
|
|
80
|
+
|
|
81
|
+
async def on_button_pressed(self, event: Button.Pressed) -> None:
|
|
82
|
+
"""Event handler called when the button is pressed."""
|
|
83
|
+
code_system_widget = self.query_one(Select)
|
|
84
|
+
file_path_widget = self.query_one(FilteredDirectoryTree)
|
|
85
|
+
log_widget = self.query_one(Log)
|
|
86
|
+
|
|
87
|
+
log_widget.clear()
|
|
88
|
+
code_system = code_system_widget.value
|
|
89
|
+
file_path = file_path_widget.cursor_node.data.path
|
|
90
|
+
|
|
91
|
+
button = event.button
|
|
92
|
+
button.disabled = True
|
|
93
|
+
old_label = button.label
|
|
94
|
+
button.label = "Running task, please wait..."
|
|
95
|
+
await self.run_task(log_widget, code_system, file_path)
|
|
96
|
+
button.disabled = False
|
|
97
|
+
button.label = old_label
|
|
98
|
+
|
|
99
|
+
async def run_task(self, log_widget: Log, code_system: str, file_path: Path) -> None:
|
|
100
|
+
log_widget.write_line("Loading app ...")
|
|
101
|
+
start = perf_counter()
|
|
102
|
+
|
|
103
|
+
flask_app, db, model = await load_app(code_system)
|
|
104
|
+
table_name = model.__tablename__
|
|
105
|
+
schema = model.__table__.schema
|
|
106
|
+
log_widget.write_line(f"{perf_counter() - start:.3f} seconds to load app.\n\n")
|
|
107
|
+
|
|
108
|
+
with flask_app.app_context():
|
|
109
|
+
engine = db.engine
|
|
110
|
+
|
|
111
|
+
log_widget.write_line("Deleting data ...")
|
|
112
|
+
start = perf_counter()
|
|
113
|
+
msg = await delete_data(engine, f"{schema}.{table_name}")
|
|
114
|
+
log_widget.write_line(msg)
|
|
115
|
+
log_widget.write_line(f"{perf_counter() - start:.3f} seconds to delete data.\n\n")
|
|
116
|
+
|
|
117
|
+
log_widget.write_line("Importing data ...")
|
|
118
|
+
start = perf_counter()
|
|
119
|
+
msg = await import_data(engine, file_path, f"{schema}.{table_name}")
|
|
120
|
+
log_widget.write_line(msg)
|
|
121
|
+
log_widget.write_line(f"{perf_counter() - start:.3f} seconds to import data.")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
if __name__ == "__main__":
|
|
125
|
+
app = CodeSystems()
|
|
126
|
+
app.run()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Stubbed to accept any string
|
|
2
|
+
def is_ctcae_event_term(v):
|
|
3
|
+
if not isinstance(v, str):
|
|
4
|
+
raise TypeError("Value must be a string")
|
|
5
|
+
return v
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Stubbed to accept any string
|
|
9
|
+
def is_ctcae_event_code(v):
|
|
10
|
+
if not isinstance(v, str):
|
|
11
|
+
raise TypeError("Value must be a string")
|
|
12
|
+
return v
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Stubbed to accept any string
|
|
16
|
+
def is_ctcae_severity_grade(v):
|
|
17
|
+
if not isinstance(v, str):
|
|
18
|
+
raise TypeError("Value must be a string")
|
|
19
|
+
return v
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# Stubbed to accept any string
|
|
23
|
+
def is_ctcae_system_organ_class(v):
|
|
24
|
+
if not isinstance(v, str):
|
|
25
|
+
raise TypeError("Value must be a string")
|
|
26
|
+
return v
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Determines if the CTCAE term is one of the "Other, specify" types of terms for which we include
|
|
30
|
+
# additional data about the AE.
|
|
31
|
+
def is_ctcae_other_term(v):
|
|
32
|
+
if isinstance(v, str):
|
|
33
|
+
return "Other, specify" in v
|
|
34
|
+
return False
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Stubbed to accept any string
|
|
2
|
+
def is_ICD10CM_code(v):
|
|
3
|
+
if not isinstance(v, str):
|
|
4
|
+
raise TypeError("Value must be a string")
|
|
5
|
+
return v
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Stubbed to accept any string
|
|
9
|
+
def is_ICD10CM_term(v):
|
|
10
|
+
if not isinstance(v, str):
|
|
11
|
+
raise TypeError("Value must be a string")
|
|
12
|
+
return v
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Stubbed to accept any string
|
|
2
|
+
def is_ICDO3_code(v):
|
|
3
|
+
if not isinstance(v, str):
|
|
4
|
+
raise TypeError("Value must be a string")
|
|
5
|
+
return v
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Stubbed to accept any string
|
|
9
|
+
def is_ICDO3_term(v):
|
|
10
|
+
if not isinstance(v, str):
|
|
11
|
+
raise TypeError("Value must be a string")
|
|
12
|
+
return v
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# pylint: disable=import-outside-toplevel,broad-except,invalid-name,redefined-outer-name
|
|
2
|
+
|
|
3
|
+
from os import environ
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import asyncio
|
|
6
|
+
import importlib
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
async def load_app(model):
|
|
10
|
+
print("Loading app ...")
|
|
11
|
+
|
|
12
|
+
# async load to allow reporting progress in UI
|
|
13
|
+
flask_app_mod = await asyncio.to_thread(importlib.import_module, "cidc_api.app")
|
|
14
|
+
db_mod = await asyncio.to_thread(importlib.import_module, "cidc_api.config.db")
|
|
15
|
+
code_systems = await asyncio.to_thread(importlib.import_module, "cidc_api.models.code_systems")
|
|
16
|
+
|
|
17
|
+
return flask_app_mod.app, db_mod.db, getattr(code_systems, model)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def import_data(engine, file_path, table_name):
|
|
21
|
+
print("Importing data ...")
|
|
22
|
+
|
|
23
|
+
conn = engine.raw_connection()
|
|
24
|
+
cursor = conn.cursor()
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
with open(file_path, "r", encoding="utf-8") as file:
|
|
28
|
+
# define the COPY command, specifying STDIN for the file-like object
|
|
29
|
+
sql = f"COPY {table_name} FROM STDIN WITH CSV HEADER"
|
|
30
|
+
|
|
31
|
+
# execute the copy operation
|
|
32
|
+
cursor.copy_expert(sql, file)
|
|
33
|
+
|
|
34
|
+
msg = f"Number of rows copied: {cursor.rowcount}"
|
|
35
|
+
conn.commit()
|
|
36
|
+
|
|
37
|
+
except Exception as exc:
|
|
38
|
+
conn.rollback()
|
|
39
|
+
msg = f"Error during COPY command: {exc}"
|
|
40
|
+
|
|
41
|
+
finally:
|
|
42
|
+
cursor.close()
|
|
43
|
+
conn.close()
|
|
44
|
+
|
|
45
|
+
return msg
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def delete_data(engine, table_name):
|
|
49
|
+
print("Deleting data ...")
|
|
50
|
+
|
|
51
|
+
conn = engine.raw_connection()
|
|
52
|
+
cursor = conn.cursor()
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
cursor.execute(f"TRUNCATE TABLE {table_name} RESTART IDENTITY")
|
|
56
|
+
msg = "Table truncated successfully."
|
|
57
|
+
conn.commit()
|
|
58
|
+
|
|
59
|
+
except Exception as exc:
|
|
60
|
+
conn.rollback()
|
|
61
|
+
msg = f"Error during TRUNCATE command: {exc}"
|
|
62
|
+
|
|
63
|
+
finally:
|
|
64
|
+
cursor.close()
|
|
65
|
+
conn.close()
|
|
66
|
+
|
|
67
|
+
return msg
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
async def call_local(table_name, file_path):
|
|
71
|
+
from dotenv import load_dotenv
|
|
72
|
+
from sqlalchemy import create_engine
|
|
73
|
+
|
|
74
|
+
load_dotenv()
|
|
75
|
+
|
|
76
|
+
engine = create_engine(environ.get("POSTGRES_URI"))
|
|
77
|
+
msg = await import_data(engine, file_path, table_name)
|
|
78
|
+
|
|
79
|
+
return msg
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if __name__ == "__main__":
|
|
83
|
+
model = "Ctcae60"
|
|
84
|
+
file_path = Path(__file__).resolve().parent / "data/ctcae_6.0.csv"
|
|
85
|
+
|
|
86
|
+
# model = "Icdo3"
|
|
87
|
+
# file_path = Path(__file__).resolve().parent / "data/icdo3.csv"
|
|
88
|
+
|
|
89
|
+
# direct connection with conn string from env
|
|
90
|
+
# from dotenv import load_dotenv
|
|
91
|
+
# from sqlalchemy import create_engine
|
|
92
|
+
# load_dotenv()
|
|
93
|
+
# engine = create_engine(environ.get("POSTGRES_URI"))
|
|
94
|
+
# msg = asyncio.run(import_data(engine, file_path, table_name))
|
|
95
|
+
|
|
96
|
+
app, db, model = asyncio.run(load_app(model))
|
|
97
|
+
table_name = model.__tablename__
|
|
98
|
+
schema = model.__table__.schema
|
|
99
|
+
table_name = f"{schema}.{table_name}"
|
|
100
|
+
|
|
101
|
+
with app.app_context():
|
|
102
|
+
engine = db.engine
|
|
103
|
+
|
|
104
|
+
msg = asyncio.run(delete_data(engine, table_name))
|
|
105
|
+
print(msg)
|
|
106
|
+
|
|
107
|
+
msg = asyncio.run(import_data(engine, file_path, table_name))
|
|
108
|
+
print(msg)
|
cidc_api/models/dataset.py
CHANGED
|
@@ -11,7 +11,6 @@ from cidc_api.models.db.stage2 import all_models as stage2_all_db_models
|
|
|
11
11
|
from cidc_api.models.db.stage1 import TrialORM as s1TrialORM
|
|
12
12
|
from cidc_api.models.db.stage2 import TrialORM as s2TrialORM
|
|
13
13
|
|
|
14
|
-
|
|
15
14
|
standard_data_categories = [
|
|
16
15
|
model.__data_category__ for model in stage1_all_models if hasattr(model, "__data_category__")
|
|
17
16
|
]
|
cidc_api/models/files/details.py
CHANGED
|
@@ -8,7 +8,6 @@ from cidc_api.models.pydantic.base import Base
|
|
|
8
8
|
from cidc_api.models.pydantic.stage1.response import Response
|
|
9
9
|
from cidc_api.models.types import ResponseSystem, ResponseSystemVersion, BestOverallResponse, YNUNA, YN
|
|
10
10
|
|
|
11
|
-
|
|
12
11
|
negative_response_values = [
|
|
13
12
|
"Progressive Disease",
|
|
14
13
|
"Stable Disease",
|
|
@@ -8,7 +8,6 @@ from cidc_api.models.pydantic.base import Base
|
|
|
8
8
|
from cidc_api.models.pydantic.stage1.response import Response
|
|
9
9
|
from cidc_api.models.types import ResponseSystem, ResponseSystemVersion, BestOverallResponse, YNUNA, YN
|
|
10
10
|
|
|
11
|
-
|
|
12
11
|
negative_response_values = [
|
|
13
12
|
"Progressive Disease",
|
|
14
13
|
"Stable Disease",
|
cidc_api/shared/gcloud_client.py
CHANGED
cidc_api/shared/jose.py
CHANGED
|
@@ -1,49 +1,48 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nci_cidc_api_modules
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.57
|
|
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: cachetools
|
|
11
|
-
Requires-Dist: certifi
|
|
12
|
-
Requires-Dist: cloud-sql-python-connector[pg8000]
|
|
13
|
-
Requires-Dist: flask
|
|
14
|
-
Requires-Dist: flask-migrate
|
|
15
|
-
Requires-Dist: flask-sqlalchemy
|
|
16
|
-
Requires-Dist: flask-talisman
|
|
10
|
+
Requires-Dist: cachetools~=7.0.0
|
|
11
|
+
Requires-Dist: certifi~=2026.1.4
|
|
12
|
+
Requires-Dist: cloud-sql-python-connector[pg8000]~=1.20.0
|
|
13
|
+
Requires-Dist: flask~=3.1.2
|
|
14
|
+
Requires-Dist: flask-migrate~=4.1.0
|
|
15
|
+
Requires-Dist: flask-sqlalchemy~=3.1.1
|
|
16
|
+
Requires-Dist: flask-talisman~=0.7.0
|
|
17
17
|
Requires-Dist: gcloud-aio-storage~=9.6.1
|
|
18
|
-
Requires-Dist: google-api-python-client
|
|
19
|
-
Requires-Dist: google-auth==2.
|
|
20
|
-
Requires-Dist: google-cloud-bigquery
|
|
21
|
-
Requires-Dist: google-cloud-pubsub
|
|
22
|
-
Requires-Dist: google-cloud-secret-manager
|
|
23
|
-
Requires-Dist: google-cloud-storage
|
|
24
|
-
Requires-Dist: jinja2
|
|
25
|
-
Requires-Dist: joserfc
|
|
26
|
-
Requires-Dist: marshmallow
|
|
27
|
-
Requires-Dist: marshmallow-sqlalchemy
|
|
28
|
-
Requires-Dist: numpy
|
|
29
|
-
Requires-Dist:
|
|
30
|
-
Requires-Dist:
|
|
31
|
-
Requires-Dist: pyarrow>=22.0.0
|
|
18
|
+
Requires-Dist: google-api-python-client~=2.188.0
|
|
19
|
+
Requires-Dist: google-auth==2.48.0
|
|
20
|
+
Requires-Dist: google-cloud-bigquery~=3.40.0
|
|
21
|
+
Requires-Dist: google-cloud-pubsub~=2.34.0
|
|
22
|
+
Requires-Dist: google-cloud-secret-manager~=2.26.0
|
|
23
|
+
Requires-Dist: google-cloud-storage~=3.9.0
|
|
24
|
+
Requires-Dist: jinja2~=3.1.6
|
|
25
|
+
Requires-Dist: joserfc~=1.6.1
|
|
26
|
+
Requires-Dist: marshmallow~=4.2.1
|
|
27
|
+
Requires-Dist: marshmallow-sqlalchemy~=1.4.2
|
|
28
|
+
Requires-Dist: numpy~=2.4.2
|
|
29
|
+
Requires-Dist: pandas~=3.0.0
|
|
30
|
+
Requires-Dist: pyarrow~=23.0.0
|
|
32
31
|
Requires-Dist: pydantic~=2.12.5
|
|
33
|
-
Requires-Dist: python-dotenv
|
|
34
|
-
Requires-Dist: requests
|
|
35
|
-
Requires-Dist: sqlalchemy
|
|
32
|
+
Requires-Dist: python-dotenv~=1.2.1
|
|
33
|
+
Requires-Dist: requests~=2.32.5
|
|
34
|
+
Requires-Dist: sqlalchemy~=2.0.45
|
|
36
35
|
Requires-Dist: sqlalchemy-mixins~=2.0.5
|
|
37
|
-
Requires-Dist: werkzeug
|
|
38
|
-
Requires-Dist: opentelemetry-api
|
|
39
|
-
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc
|
|
40
|
-
Requires-Dist: opentelemetry-sdk
|
|
41
|
-
Requires-Dist: opentelemetry-instrumentation-flask
|
|
42
|
-
Requires-Dist: opentelemetry-instrumentation-requests
|
|
43
|
-
Requires-Dist: opentelemetry-instrumentation-sqlalchemy
|
|
44
|
-
Requires-Dist: opentelemetry-exporter-gcp-trace
|
|
45
|
-
Requires-Dist: opentelemetry-propagator-gcp
|
|
46
|
-
Requires-Dist: nci-cidc-schemas==0.28.
|
|
36
|
+
Requires-Dist: werkzeug~=3.1.5
|
|
37
|
+
Requires-Dist: opentelemetry-api~=1.39.1
|
|
38
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc~=1.39.1
|
|
39
|
+
Requires-Dist: opentelemetry-sdk~=1.39.1
|
|
40
|
+
Requires-Dist: opentelemetry-instrumentation-flask~=0.59b0
|
|
41
|
+
Requires-Dist: opentelemetry-instrumentation-requests~=0.59b0
|
|
42
|
+
Requires-Dist: opentelemetry-instrumentation-sqlalchemy~=0.59b0
|
|
43
|
+
Requires-Dist: opentelemetry-exporter-gcp-trace~=1.11.0
|
|
44
|
+
Requires-Dist: opentelemetry-propagator-gcp~=1.11.0
|
|
45
|
+
Requires-Dist: nci-cidc-schemas==0.28.13
|
|
47
46
|
Dynamic: description
|
|
48
47
|
Dynamic: description-content-type
|
|
49
48
|
Dynamic: home-page
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
boot.py,sha256=a5zD_ORheoOy3CuEIwjM9jcR4_Phngz6nc-E6RYIEj8,585
|
|
2
|
-
cidc_api/__init__.py,sha256=
|
|
2
|
+
cidc_api/__init__.py,sha256=4bvatwbfE15IIgVfHJZH8d-WXGATbSGcT6GSdTUc1l0,23
|
|
3
3
|
cidc_api/telemetry.py,sha256=SRPXhN1O4P2jYaRN_K4hAhFURygrzzRrkQsGZmghUUQ,3355
|
|
4
|
+
cidc_api/code_systems/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
cidc_api/code_systems/app.py,sha256=nyv7MBkOaZlB8trRCerWlOPOU9Hy-qCu71t8aLX1iQY,4804
|
|
6
|
+
cidc_api/code_systems/ctcae.py,sha256=H5JvDQ5R5kYbK37UxjhmXMnKD3d40HmG0DONxfhNxnE,871
|
|
7
|
+
cidc_api/code_systems/gvhd.py,sha256=r5jbHEa5yos0tmghjiruAeXI-r-4lU81JKCUpMHtO14,194
|
|
8
|
+
cidc_api/code_systems/icd10cm.py,sha256=K1vbTQB75uAQeKgj0U9izhtMKVb2vqp69_hyx3z_jro,300
|
|
9
|
+
cidc_api/code_systems/icdo3.py,sha256=A19yNX5-9Gs3X83kXcTlGgsXDTTJ9yR2dxEIoBVmpmU,296
|
|
10
|
+
cidc_api/code_systems/importer.py,sha256=61lu0FF0r_2Q6UX_UWMO_qP9J56Xphj4RVX5EdYb8Vw,2959
|
|
11
|
+
cidc_api/code_systems/uberon.py,sha256=BO2mYNDvPzZyLdhL_ZjCyEgHSLHuVifnTJvfktUfVWA,148
|
|
4
12
|
cidc_api/config/__init__.py,sha256=5mX8GAPxUKV84iS-aGOoE-4m68LsOCGCDptXNdlgvj0,148
|
|
5
13
|
cidc_api/config/db.py,sha256=mEz8ugjvRNGylCqDYHaaMqaZfDh7sbd76BowmfBvq5c,2428
|
|
6
14
|
cidc_api/config/logging.py,sha256=abhVYtn8lfhIt0tyV2WHFgSmp_s2eeJh7kodB6LH4J0,1149
|
|
@@ -8,13 +16,13 @@ cidc_api/config/secrets.py,sha256=jRFj7W43pWuPf9DZQLCKF7WPXf5cUv-BAaS3ASqhV_Q,14
|
|
|
8
16
|
cidc_api/config/settings.py,sha256=IlOSJhSyYYK4XQQ4uBdD58kXO-a2AHPWTSN1AT95b9Y,4545
|
|
9
17
|
cidc_api/models/__init__.py,sha256=bl445G8Zic9YbhZ8ZBni07wtBMhLJRMBA-JqjLxx2bw,66
|
|
10
18
|
cidc_api/models/code_systems.py,sha256=YR-SGg1UnCElHjibUauAFAs9ENLd7tT28V3sc-NQ4xk,918
|
|
11
|
-
cidc_api/models/dataset.py,sha256=
|
|
19
|
+
cidc_api/models/dataset.py,sha256=1rz2Gww5wsqWqXOOZ7hWY0lL2H3lA5YZ1k7u5zc5el8,3020
|
|
12
20
|
cidc_api/models/errors.py,sha256=UncRrh-4v0CR5mpLO0erWD1y9ctus3Nk6XOSvrTjfco,338
|
|
13
21
|
cidc_api/models/migrations.py,sha256=UlS5How3J4ryaRuZT6F5VQtAKikkl0LTv9MgMO_ltiQ,11161
|
|
14
22
|
cidc_api/models/models.py,sha256=RycbGNQHIud9mqCyIH_yrnN7PVSFwbUCjP6pe6sX5VA,154106
|
|
15
23
|
cidc_api/models/schemas.py,sha256=6IE2dJoEMcMbi0Vr1V3cYKnPKU0hv9vRKBixOZHe88s,2766
|
|
16
24
|
cidc_api/models/types.py,sha256=V0N3RrrnP5bgj44bv3Aet1Mw424KgkcAOfv3QJRyRQI,30112
|
|
17
|
-
cidc_api/models/db/stage1/__init__.py,sha256=
|
|
25
|
+
cidc_api/models/db/stage1/__init__.py,sha256=4RIPYj7FZfFIk7N15mUPfuB_2DOQX_NmJSxvKASFUFA,1916
|
|
18
26
|
cidc_api/models/db/stage1/additional_treatment_orm.py,sha256=Oe1wfYEOlMKAvNrOTCCnyXeEqAZtHSLk6d4ChIL2J58,1200
|
|
19
27
|
cidc_api/models/db/stage1/adverse_event_orm.py,sha256=vhDDVMaksvXflH8unJJDlHL_8_SCFqWy0GWwxKSpge8,2194
|
|
20
28
|
cidc_api/models/db/stage1/base_orm.py,sha256=izKizTf2W1fCK2CRUeyuErJbOaxNp6d299n4gqKWHDQ,246
|
|
@@ -41,7 +49,7 @@ cidc_api/models/db/stage1/surgery_orm.py,sha256=LaodgOnH4BJwt0Svvd37Q2RmdxNqa1sp
|
|
|
41
49
|
cidc_api/models/db/stage1/therapy_agent_dose_orm.py,sha256=lwL1asNtJ70JRLTm5SXH7S8DZiQ0-oHGmc1sA5MbXR8,1580
|
|
42
50
|
cidc_api/models/db/stage1/treatment_orm.py,sha256=qEuGOJATfOBJyKVmBaDEg0nRK2j65_HlmOoelkAvzec,1899
|
|
43
51
|
cidc_api/models/db/stage1/trial_orm.py,sha256=orXC7srYEU_CY9m9VNE_1-iYP559Oqe6g8-NqdHXbto,1282
|
|
44
|
-
cidc_api/models/db/stage2/__init__.py,sha256=
|
|
52
|
+
cidc_api/models/db/stage2/__init__.py,sha256=9KE50cL-l6T1GY4Hm4MRLPzoZQ-V_2syOIX0LEMISLc,2690
|
|
45
53
|
cidc_api/models/db/stage2/additional_treatment_orm.py,sha256=bq_E9h-AeYjhaYHaKUHmQ1k_OSP1OtNeu6bupA-ZKP4,1198
|
|
46
54
|
cidc_api/models/db/stage2/administrative_person_orm.py,sha256=49Mon6yLXjTRM-pypTL2R0qlIT1eJRqSaMGKNubjVak,1290
|
|
47
55
|
cidc_api/models/db/stage2/administrative_role_assignment_orm.py,sha256=vi8Xwe3Xz7QlRSTO4zVSd-42YMAfBnY3RNWFrh90f-Y,1292
|
|
@@ -80,10 +88,10 @@ cidc_api/models/db/stage2/therapy_agent_dose_orm.py,sha256=obAA7uvTWvSc_1E80_9cP
|
|
|
80
88
|
cidc_api/models/db/stage2/treatment_orm.py,sha256=WGLvAVR1SlGpT-j11eAtq2waNHhCN-ywE43mDZWdK_Y,2193
|
|
81
89
|
cidc_api/models/db/stage2/trial_orm.py,sha256=ijQLs1JjalXcS-s0HDv2_O2HoPL7Xvv_9AXtGeFc6BU,2821
|
|
82
90
|
cidc_api/models/files/__init__.py,sha256=8BMTnUSHzUbz0lBeEQY6NvApxDD3GMWMduoVMos2g4Y,213
|
|
83
|
-
cidc_api/models/files/details.py,sha256=
|
|
91
|
+
cidc_api/models/files/details.py,sha256=EIk5yaUHtATOumxiHSZs2UtBWrAQRqIdZZn6d4oVuRQ,65152
|
|
84
92
|
cidc_api/models/files/facets.py,sha256=vieZ3z_tYB29NqtvNzvKqajVwxM5ZLLZKeyQTq5lheU,33776
|
|
85
93
|
cidc_api/models/pydantic/base.py,sha256=sL_0PwEH2vS8BMT_w-zL7CPeaU-R7ih5afRigX6k2DM,4069
|
|
86
|
-
cidc_api/models/pydantic/stage1/__init__.py,sha256=
|
|
94
|
+
cidc_api/models/pydantic/stage1/__init__.py,sha256=4H1YlqHFbcaX62sA3NkHg025eSXtFxEwj1UPWhyXfHw,1666
|
|
87
95
|
cidc_api/models/pydantic/stage1/additional_treatment.py,sha256=TFVzjd1NPLSfH9UnL2W3aZhpZSzDsg97j9IK8t882YA,1050
|
|
88
96
|
cidc_api/models/pydantic/stage1/adverse_event.py,sha256=PanE03MgP70M_i3glCeBCtScuG4zIpyKiJZfeNAOOBc,5176
|
|
89
97
|
cidc_api/models/pydantic/stage1/baseline_clinical_assessment.py,sha256=5FYvtOVf_nIK1h3xTs3vQgJe2ivQSVHt_wfrTSDgVxU,1119
|
|
@@ -102,14 +110,14 @@ cidc_api/models/pydantic/stage1/participant.py,sha256=QfRkK2okY7nM84y9QMK12kZLUR
|
|
|
102
110
|
cidc_api/models/pydantic/stage1/prior_treatment.py,sha256=axhyPHwYCoIvcIonjyPJ95HUyaAXqIuOd6hhoDM3LJU,2101
|
|
103
111
|
cidc_api/models/pydantic/stage1/radiotherapy_dose.py,sha256=8TbBqx_BYzwygQE-LxlSEK2ntIAFlTpAq_GS479TabI,3839
|
|
104
112
|
cidc_api/models/pydantic/stage1/response.py,sha256=hq5_eJ2BEaVH8pdU444p3AKHuZMdLsoDZcMA3XQa8Rw,3491
|
|
105
|
-
cidc_api/models/pydantic/stage1/response_by_system.py,sha256=
|
|
113
|
+
cidc_api/models/pydantic/stage1/response_by_system.py,sha256=JcsKCWTHaxubbaUTOpFs2U6EDjOTuqYog-GZXXAoBMg,12621
|
|
106
114
|
cidc_api/models/pydantic/stage1/specimen.py,sha256=scDekZ-RtXOQTTLburhqT3RF4KM34iY9NAV1wYi_HSg,1281
|
|
107
115
|
cidc_api/models/pydantic/stage1/stem_cell_transplant.py,sha256=XsDVUksqbIprPxHwLlwHGyji4jsIFNMcIk-S0H4rDnQ,1228
|
|
108
116
|
cidc_api/models/pydantic/stage1/surgery.py,sha256=sHPzYMNusYIQrC6gjWopwxo0j9BNOq_Tcl6HKAMvuAQ,2421
|
|
109
117
|
cidc_api/models/pydantic/stage1/therapy_agent_dose.py,sha256=XX7JM4CdvTuAsbI5rI4wYDcbevP46BetTk_z7N_EL-M,3527
|
|
110
118
|
cidc_api/models/pydantic/stage1/treatment.py,sha256=eEjCcmkLdPmS2kg9dtUm3pt9apo1sRypBbte_xUVAYU,2607
|
|
111
119
|
cidc_api/models/pydantic/stage1/trial.py,sha256=EfY7HZEn7HT_N5-g4hkYtAM5BQ3yiMRCtj4rm12UQ7U,1909
|
|
112
|
-
cidc_api/models/pydantic/stage2/__init__.py,sha256=
|
|
120
|
+
cidc_api/models/pydantic/stage2/__init__.py,sha256=jBLPaYfgZWqBL6fohtyKQxsjRbl0N4dtfnNdyEYLc1Y,2330
|
|
113
121
|
cidc_api/models/pydantic/stage2/additional_treatment.py,sha256=TFVzjd1NPLSfH9UnL2W3aZhpZSzDsg97j9IK8t882YA,1050
|
|
114
122
|
cidc_api/models/pydantic/stage2/administrative_person.py,sha256=3UYRgGLP7RukwZYTvQEnviDxBvWXj1uqditsoLJOw0s,1552
|
|
115
123
|
cidc_api/models/pydantic/stage2/administrative_role_assignment.py,sha256=kWUciVSnczjejdBSlynsVxSQ4dytDdgw9OxSvgzParg,536
|
|
@@ -137,7 +145,7 @@ cidc_api/models/pydantic/stage2/prior_treatment.py,sha256=axhyPHwYCoIvcIonjyPJ95
|
|
|
137
145
|
cidc_api/models/pydantic/stage2/publication.py,sha256=GBuvqBf0lyOoopN1S-3qX310xFxhixk7oDJLuGzLuiw,1817
|
|
138
146
|
cidc_api/models/pydantic/stage2/radiotherapy_dose.py,sha256=8TbBqx_BYzwygQE-LxlSEK2ntIAFlTpAq_GS479TabI,3839
|
|
139
147
|
cidc_api/models/pydantic/stage2/response.py,sha256=hq5_eJ2BEaVH8pdU444p3AKHuZMdLsoDZcMA3XQa8Rw,3491
|
|
140
|
-
cidc_api/models/pydantic/stage2/response_by_system.py,sha256=
|
|
148
|
+
cidc_api/models/pydantic/stage2/response_by_system.py,sha256=G5fZltd1szrtz0eyQ5IIbOwQUTMEqPy-f3JKe8OucZM,9852
|
|
141
149
|
cidc_api/models/pydantic/stage2/shipment.py,sha256=dsZcDPikCRS3cjr58EGHHJ2gjir78J4cdHh_1SwFyrQ,1595
|
|
142
150
|
cidc_api/models/pydantic/stage2/shipment_specimen.py,sha256=exR7joXsH3Xd-o5vJV_Z-az33Edr8BBm5LCDv01iMI4,488
|
|
143
151
|
cidc_api/models/pydantic/stage2/specimen.py,sha256=scDekZ-RtXOQTTLburhqT3RF4KM34iY9NAV1wYi_HSg,1281
|
|
@@ -152,12 +160,12 @@ cidc_api/shared/auth.py,sha256=EIP9AKokLNrI79Fkpv3P7WdzaddJIsuGGICc1W494X0,9110
|
|
|
152
160
|
cidc_api/shared/email_layout.html,sha256=pBoTNw3ACHH-ncZFaNvcy5bXMqPwizR78usb0uCYtIc,7670
|
|
153
161
|
cidc_api/shared/emails.py,sha256=8kNFEaSnKpY-GX_iE59QUhSp3c4_uzy3SpHYt2QjuqI,6121
|
|
154
162
|
cidc_api/shared/file_handling.py,sha256=9MZXx5RfXO3A_pXf8Ulb7DQEuyp9j12eO9ad-PcTBXo,5908
|
|
155
|
-
cidc_api/shared/gcloud_client.py,sha256=
|
|
156
|
-
cidc_api/shared/jose.py,sha256
|
|
163
|
+
cidc_api/shared/gcloud_client.py,sha256=nhyU11hZ049bez3-QaPC-Y3NZ-1t7o9XwT_QkE9ds6k,40750
|
|
164
|
+
cidc_api/shared/jose.py,sha256=gNXVjZMHMPRfG6hoTeDxRi4HjbIo_JTBnZ6C9LaHh1I,1829
|
|
157
165
|
cidc_api/shared/rest_utils.py,sha256=RwR30WOUAYCxL7V-i2totEyeriG30GbBDvBcpLXhM9w,6594
|
|
158
166
|
cidc_api/shared/utils.py,sha256=-gLnzxCR9E6h0plt2xrNisUG5_Y6GhhVwz3DgDIzpvs,367
|
|
159
|
-
nci_cidc_api_modules-1.2.
|
|
160
|
-
nci_cidc_api_modules-1.2.
|
|
161
|
-
nci_cidc_api_modules-1.2.
|
|
162
|
-
nci_cidc_api_modules-1.2.
|
|
163
|
-
nci_cidc_api_modules-1.2.
|
|
167
|
+
nci_cidc_api_modules-1.2.57.dist-info/licenses/LICENSE,sha256=pNYWVTHaYonnmJyplmeAp7tQAjosmDpAWjb34jjv7Xs,1102
|
|
168
|
+
nci_cidc_api_modules-1.2.57.dist-info/METADATA,sha256=dJEJsXit5jKfR1MP7cwOpF1F4s4lP2Mg_W_Q-z1L51w,40270
|
|
169
|
+
nci_cidc_api_modules-1.2.57.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
170
|
+
nci_cidc_api_modules-1.2.57.dist-info/top_level.txt,sha256=BSJqF6ura8-bWCKZvarvQEKvidMM05lH0bLQsNOrI0o,14
|
|
171
|
+
nci_cidc_api_modules-1.2.57.dist-info/RECORD,,
|
|
File without changes
|
{nci_cidc_api_modules-1.2.56.dist-info → nci_cidc_api_modules-1.2.57.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{nci_cidc_api_modules-1.2.56.dist-info → nci_cidc_api_modules-1.2.57.dist-info}/top_level.txt
RENAMED
|
File without changes
|