Skip to content

Commit e1248df

Browse files
committed
style: apply black/isort formatting to v0.3.1 changes
1 parent 075e794 commit e1248df

11 files changed

Lines changed: 107 additions & 44 deletions

File tree

src/api/server.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ async def add_security_headers(request: Request, call_next):
9999
@app.middleware("http")
100100
async def audit_log_middleware(request: Request, call_next):
101101
from urllib.parse import parse_qs
102+
102103
from src.utils.privacy import scrub_dict, scrub_value
103104

104105
correlation_id = str(uuid.uuid4())

src/qsar/client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,9 @@ async def _execute_request() -> Tuple[Any, Dict[str, Any]]:
142142
"last_attempt_ms": round(elapsed_attempt, 3),
143143
"timeout_profile": profile,
144144
"status_code": response.status_code,
145-
"api_versions": response.headers.get("api-supported-versions"),
145+
"api_versions": response.headers.get(
146+
"api-supported-versions"
147+
),
146148
"server_date": response.headers.get("date"),
147149
}
148150
return data, meta

src/tools/implementations/o_qt_qsar_tools.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,15 +381,26 @@ async def run_qsar_prediction(smiles: str, model_id: str) -> dict:
381381
domain_value = domain.get("DomainResult") or domain.get("Domain") or ""
382382
elif isinstance(domain, str):
383383
domain_value = domain
384-
domain_normalized = str(domain_value).strip().replace(" ", "").replace("-", "").lower()
384+
domain_normalized = (
385+
str(domain_value).strip().replace(" ", "").replace("-", "").lower()
386+
)
385387
ad_warning = domain_normalized in {"outofdomain", "out_of_domain"}
386388

387389
result = {
388390
"chem_id": chem_id,
389391
"model_id": model_id,
390392
"prediction": prediction,
391393
"domain": domain,
392-
"ad_status": "out_of_domain" if ad_warning else ("in_domain" if domain_normalized in {"indomain", "in_domain", "insideapplicabilitydomain"} else "unknown"),
394+
"ad_status": (
395+
"out_of_domain"
396+
if ad_warning
397+
else (
398+
"in_domain"
399+
if domain_normalized
400+
in {"indomain", "in_domain", "insideapplicabilitydomain"}
401+
else "unknown"
402+
)
403+
),
393404
"ad_warning": ad_warning,
394405
}
395406
if ad_warning:

src/tools/implementations/toolbox_execution.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -260,20 +260,25 @@ async def run_qsar_model(qsar_guid: str, chem_id: str) -> dict:
260260
domain_value = domain.get("DomainResult") or domain.get("Domain") or ""
261261
elif isinstance(domain, str):
262262
domain_value = domain
263-
domain_normalized = str(domain_value).strip().replace(" ", "").replace("-", "").lower()
263+
domain_normalized = (
264+
str(domain_value).strip().replace(" ", "").replace("-", "").lower()
265+
)
264266
ad_warning = domain_normalized in {"outofdomain", "out_of_domain"}
265267

266268
result = {
267269
"qsar_guid": qsar_guid,
268270
"chem_id": chem_id,
269271
"prediction": prediction,
270272
"domain": domain,
271-
"ad_status": "out_of_domain"
272-
if ad_warning
273-
else (
274-
"in_domain"
275-
if domain_normalized in {"indomain", "in_domain", "insideapplicabilitydomain"}
276-
else "unknown"
273+
"ad_status": (
274+
"out_of_domain"
275+
if ad_warning
276+
else (
277+
"in_domain"
278+
if domain_normalized
279+
in {"indomain", "in_domain", "insideapplicabilitydomain"}
280+
else "unknown"
281+
)
277282
),
278283
"ad_warning": ad_warning,
279284
}

src/tools/implementations/workflow_runner.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2196,13 +2196,15 @@ async def run_oqt_multiagent_workflow(
21962196
"qsar_guid": qsar_guid,
21972197
"prediction": prediction,
21982198
"domain": domain,
2199-
"ad_status": "out_of_domain"
2200-
if ad_warning
2201-
else (
2202-
"in_domain"
2203-
if domain_normalized
2204-
in {"indomain", "in_domain", "insideapplicabilitydomain"}
2205-
else "unknown"
2199+
"ad_status": (
2200+
"out_of_domain"
2201+
if ad_warning
2202+
else (
2203+
"in_domain"
2204+
if domain_normalized
2205+
in {"indomain", "in_domain", "insideapplicabilitydomain"}
2206+
else "unknown"
2207+
)
22062208
),
22072209
"ad_warning": ad_warning,
22082210
}
@@ -2394,7 +2396,9 @@ def _build_review_required_response(
23942396
pending_checkpoints: List[Any],
23952397
) -> Dict[str, Any]:
23962398
summary_markdown = "\n".join(
2397-
["## QSAR Workflow Summary", ""] + summary_lines + ["", "*Workflow paused for human review.*"]
2399+
["## QSAR Workflow Summary", ""]
2400+
+ summary_lines
2401+
+ ["", "*Workflow paused for human review.*"]
23982402
)
23992403
log_bundle["final_report"] = summary_markdown
24002404
response = {
@@ -2442,7 +2446,9 @@ def _build_workflow_response(
24422446

24432447
qsar_results = log_bundle.get("qsar_results") or []
24442448
qsar_guids_executed = [
2445-
r["qsar_guid"] for r in qsar_results if isinstance(r, dict) and r.get("qsar_guid")
2449+
r["qsar_guid"]
2450+
for r in qsar_results
2451+
if isinstance(r, dict) and r.get("qsar_guid")
24462452
]
24472453

24482454
response = {
@@ -3562,7 +3568,9 @@ async def build_grouping_justification(
35623568

35633569

35643570
class ApproveCheckpointParams(BaseModel):
3565-
checkpoint_id: str = Field(..., description="The checkpoint ID to approve or reject.")
3571+
checkpoint_id: str = Field(
3572+
..., description="The checkpoint ID to approve or reject."
3573+
)
35663574
decision: str = Field(
35673575
"approved",
35683576
description="Decision for this checkpoint: `approved` or `rejected`.",

src/utils/logging.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,15 @@
99

1010
# Patterns that indicate sensitive data in free-text log messages
1111
_SENSITIVE_PATTERNS = [
12-
(re.compile(r"SMILES:\s*([A-Za-z0-9=@+\-\[\]\\\(\)/#.]+)", re.IGNORECASE), "SMILES: [HASHED]"),
12+
(
13+
re.compile(r"SMILES:\s*([A-Za-z0-9=@+\-\[\]\\\(\)/#.]+)", re.IGNORECASE),
14+
"SMILES: [HASHED]",
15+
),
1316
(re.compile(r"CAS\s*:?\s*(\d{1,7}-\d{2}-\d)", re.IGNORECASE), "CAS: [HASHED]"),
14-
(re.compile(r"chemical_name[=:]\s*([^,\s]+)", re.IGNORECASE), "chemical_name=[HASHED]"),
17+
(
18+
re.compile(r"chemical_name[=:]\s*([^,\s]+)", re.IGNORECASE),
19+
"chemical_name=[HASHED]",
20+
),
1521
# Scrub SMILES/CAS from URLs in httpx logs
1622
(re.compile(r"([?&]smiles=)[^\s\"']+", re.IGNORECASE), r"\1[HASHED]"),
1723
(re.compile(r"([?&]cas=)[^\s\"']+", re.IGNORECASE), r"\1[HASHED]"),

src/utils/pdf_generator.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,24 @@ def generate_pdf_report(log_data: dict) -> BytesIO:
8989

9090
# Build AD warnings from qsar_results (OQT-03)
9191
warnings: list[str] = []
92-
qsar_results = log_data.get("qsar_results", []) if isinstance(log_data.get("qsar_results"), list) else []
92+
qsar_results = (
93+
log_data.get("qsar_results", [])
94+
if isinstance(log_data.get("qsar_results"), list)
95+
else []
96+
)
9397
for item in qsar_results:
9498
if isinstance(item, dict):
9599
domain = item.get("domain")
96100
if isinstance(domain, dict):
97101
domain_val = domain.get("DomainResult") or domain.get("Domain") or ""
98102
else:
99103
domain_val = str(domain) if domain else ""
100-
if domain_val and str(domain_val).lower() in {"outofdomain", "out of domain"}:
104+
if domain_val and str(domain_val).lower() in {
105+
"outofdomain",
106+
"out of domain",
107+
}:
101108
model = item.get("qsar_guid") or item.get("model_id") or "Unknown model"
102-
warnings.append(
103-
f"Model {model} predicted OUT OF APPLICABILITY DOMAIN."
104-
)
109+
warnings.append(f"Model {model} predicted OUT OF APPLICABILITY DOMAIN.")
105110
if warnings:
106111
warnings.append(
107112
"Treat these predictions with caution and consider experimental validation."

src/utils/privacy.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import re
55
from typing import Any
66

7-
87
# SMILES heuristic: typical SMILES characters
98
_SMILES_CHARS = set("CNO[]()=@+-#$.1234567890BSIPFclbr/\\")
109
# CAS number pattern

src/utils/review.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,14 @@ def create_checkpoint(
7979
) -> ReviewCheckpoint:
8080
checkpoint = ReviewCheckpoint(workflow_id, step, data, expires_minutes)
8181
self._checkpoints[checkpoint.checkpoint_id] = checkpoint
82-
self._workflow_index.setdefault(workflow_id, []).append(checkpoint.checkpoint_id)
83-
log.info("Created review checkpoint %s for workflow %s", checkpoint.checkpoint_id, workflow_id)
82+
self._workflow_index.setdefault(workflow_id, []).append(
83+
checkpoint.checkpoint_id
84+
)
85+
log.info(
86+
"Created review checkpoint %s for workflow %s",
87+
checkpoint.checkpoint_id,
88+
workflow_id,
89+
)
8490
return checkpoint
8591

8692
def _raw_workflow_checkpoints(self, workflow_id: str) -> List[ReviewCheckpoint]:
@@ -95,7 +101,9 @@ def _enforce_expiry(self, workflow_id: str) -> None:
95101
cp.status = ReviewDecision.EXPIRED
96102
cp.comments = "Checkpoint expired before review."
97103
cp.reviewed_at = datetime.now(timezone.utc).isoformat()
98-
log.warning("Checkpoint %s expired and was auto-rejected.", cp.checkpoint_id)
104+
log.warning(
105+
"Checkpoint %s expired and was auto-rejected.", cp.checkpoint_id
106+
)
99107

100108
def get_checkpoint(self, checkpoint_id: str) -> Optional[ReviewCheckpoint]:
101109
cp = self._checkpoints.get(checkpoint_id)
@@ -148,9 +156,15 @@ def any_rejected(self, workflow_id: str) -> bool:
148156

149157
def pending_checkpoints(self, workflow_id: str) -> List[ReviewCheckpoint]:
150158
self._enforce_expiry(workflow_id)
151-
return [c for c in self.get_workflow_checkpoints(workflow_id) if c.status == ReviewDecision.PENDING]
152-
153-
def get_checkpoint_by_step(self, workflow_id: str, step: str) -> Optional[ReviewCheckpoint]:
159+
return [
160+
c
161+
for c in self.get_workflow_checkpoints(workflow_id)
162+
if c.status == ReviewDecision.PENDING
163+
]
164+
165+
def get_checkpoint_by_step(
166+
self, workflow_id: str, step: str
167+
) -> Optional[ReviewCheckpoint]:
154168
for cp in self.get_workflow_checkpoints(workflow_id):
155169
if cp.step == step:
156170
return cp

tests/tools/test_o_qt_qsar_tools.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,7 @@ async def fake_model_metadata(model_id: str):
9393
monkeypatch.setattr(
9494
qsar_tools.qsar_client, "apply_qsar_model", fake_apply_qsar_model
9595
)
96-
monkeypatch.setattr(
97-
qsar_tools.qsar_client, "get_qsar_domain", fake_get_qsar_domain
98-
)
96+
monkeypatch.setattr(qsar_tools.qsar_client, "get_qsar_domain", fake_get_qsar_domain)
9997
monkeypatch.setattr(
10098
qsar_tools.qsar_client, "get_model_metadata", fake_model_metadata
10199
)

0 commit comments

Comments
 (0)