(base: Dict[str, Any], detail: Dict[str, Any])
| 1414 | |
| 1415 | |
| 1416 | def _merge_paper_details(base: Dict[str, Any], detail: Dict[str, Any]) -> Dict[str, Any]: |
| 1417 | merged = dict(base) |
| 1418 | detail = _normalize_paper(detail) |
| 1419 | prefer_detail_abstract = bool(base.get("_prefer_detail_abstract")) |
| 1420 | |
| 1421 | for key in ("arxiv_id", "doi", "pdf_url", "publish_date", "venue", "institution"): |
| 1422 | if not _clean_text(merged.get(key)): |
| 1423 | merged[key] = detail.get(key, merged.get(key)) |
| 1424 | |
| 1425 | if _looks_like_placeholder_title(str(merged.get("title", ""))) and detail.get("title"): |
| 1426 | merged["title"] = detail["title"] |
| 1427 | |
| 1428 | if not merged.get("authors"): |
| 1429 | merged["authors"] = detail.get("authors", []) |
| 1430 | |
| 1431 | current_abstract_raw = merged.get("abstract") |
| 1432 | current_abstract = _clean_abstract_text(current_abstract_raw) |
| 1433 | detail_abstract = _clean_abstract_text(detail.get("abstract")) |
| 1434 | if detail_abstract and ( |
| 1435 | prefer_detail_abstract |
| 1436 | or _prefer_candidate_abstract(current_abstract_raw, detail_abstract) |
| 1437 | ): |
| 1438 | merged["abstract"] = detail["abstract"] |
| 1439 | elif current_abstract: |
| 1440 | merged["abstract"] = current_abstract |
| 1441 | |
| 1442 | existing_metadata = dict(merged.get("metadata") or {}) |
| 1443 | detail_metadata = dict(detail.get("metadata") or {}) |
| 1444 | if detail_metadata: |
| 1445 | merged["metadata"] = {**existing_metadata, **detail_metadata} |
| 1446 | else: |
| 1447 | merged["metadata"] = existing_metadata |
| 1448 | merged.pop("_prefer_detail_abstract", None) |
| 1449 | |
| 1450 | return merged |
| 1451 | |
| 1452 | |
| 1453 | def _normalize_source_page_document(document: Dict[str, Any]) -> Optional[Dict[str, Any]]: |
no test coverage detected