fix(rekabet): return parsed decisions instead of empty array (#24)

Token-optimization commit e34d81b tightened RekabetDecisionSummary
fields from Optional[str]/Optional[HttpUrl] to plain str with ""
defaults, but client.py kept passing None for unparsed cells and
HttpUrl(...) for URLs. Pydantic v2 rejected both, the broad
except Exception swallowed every row, and decisions came back []
while total_records_found stayed populated.

Default unparsed string fields to "" and pass URL strings directly
to the model. Verified against the live API for empty args,
PdfText filter, and KararTuru filter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
saidsurucu
2026-05-03 01:33:52 +03:00
co-authored by Claude Opus 4.7
parent 355f505da9
commit ee544dc603
+18 -22
View File
@@ -141,30 +141,30 @@ class RekabetKurumuApiClient:
# Row 1: Publication Date, Decision Number, Related Cases Link # Row 1: Publication Date, Decision Number, Related Cases Link
td_elements_r1 = rows[0].find_all("td") td_elements_r1 = rows[0].find_all("td")
pub_date = td_elements_r1[0].get_text(strip=True) if len(td_elements_r1) > 0 else None pub_date = td_elements_r1[0].get_text(strip=True) if len(td_elements_r1) > 0 else ""
dec_num = td_elements_r1[1].get_text(strip=True) if len(td_elements_r1) > 1 else None dec_num = td_elements_r1[1].get_text(strip=True) if len(td_elements_r1) > 1 else ""
related_cases_link_tag = td_elements_r1[2].find("a", href=True) if len(td_elements_r1) > 2 else None related_cases_link_tag = td_elements_r1[2].find("a", href=True) if len(td_elements_r1) > 2 else None
related_cases_url_str: Optional[str] = None related_cases_url_str: str = ""
karar_id_from_related: Optional[str] = None karar_id_from_related: str = ""
if related_cases_link_tag and related_cases_link_tag.has_attr('href'): if related_cases_link_tag and related_cases_link_tag.has_attr('href'):
related_cases_url_str = urljoin(self.BASE_URL, related_cases_link_tag['href']) related_cases_url_str = urljoin(self.BASE_URL, related_cases_link_tag['href'])
qs_related = parse_qs(urlparse(related_cases_link_tag['href']).query) qs_related = parse_qs(urlparse(related_cases_link_tag['href']).query)
if 'kararId' in qs_related and qs_related['kararId']: if 'kararId' in qs_related and qs_related['kararId']:
karar_id_from_related = qs_related['kararId'][0] karar_id_from_related = qs_related['kararId'][0]
# Row 2: Decision Date, Decision Type # Row 2: Decision Date, Decision Type
td_elements_r2 = rows[1].find_all("td") td_elements_r2 = rows[1].find_all("td")
dec_date = td_elements_r2[0].get_text(strip=True) if len(td_elements_r2) > 0 else None dec_date = td_elements_r2[0].get_text(strip=True) if len(td_elements_r2) > 0 else ""
dec_type_text = td_elements_r2[1].get_text(strip=True) if len(td_elements_r2) > 1 else None dec_type_text = td_elements_r2[1].get_text(strip=True) if len(td_elements_r2) > 1 else ""
# Row 3: Title and Main Decision Link # Row 3: Title and Main Decision Link
title_cell = rows[2].find("td", colspan="5") title_cell = rows[2].find("td", colspan="5")
decision_link_tag = title_cell.find("a", href=True) if title_cell else None decision_link_tag = title_cell.find("a", href=True) if title_cell else None
title_text: Optional[str] = None title_text: str = ""
decision_landing_url_str: Optional[str] = None decision_landing_url_str: str = ""
karar_id_from_main_link: Optional[str] = None karar_id_from_main_link: str = ""
if decision_link_tag and decision_link_tag.has_attr('href'): if decision_link_tag and decision_link_tag.has_attr('href'):
title_text = decision_link_tag.get_text(strip=True) title_text = decision_link_tag.get_text(strip=True)
@@ -178,23 +178,19 @@ class RekabetKurumuApiClient:
logger.warning(f"Table {idx+1} decision link has unexpected format: {href_val}") logger.warning(f"Table {idx+1} decision link has unexpected format: {href_val}")
else: else:
logger.warning(f"Table {idx+1} could not find title/decision link tag.") logger.warning(f"Table {idx+1} could not find title/decision link tag.")
current_karar_id = karar_id_from_main_link or karar_id_from_related current_karar_id = karar_id_from_main_link or karar_id_from_related
if not current_karar_id: if not current_karar_id:
logger.warning(f"Table {idx+1} Karar ID not found. Skipping. Title (if any): {title_text}") logger.warning(f"Table {idx+1} Karar ID not found. Skipping. Title (if any): {title_text}")
continue continue
# Convert string URLs to HttpUrl for the model
final_decision_url = HttpUrl(decision_landing_url_str) if decision_landing_url_str else None
final_related_cases_url = HttpUrl(related_cases_url_str) if related_cases_url_str else None
processed_decisions.append(RekabetDecisionSummary( processed_decisions.append(RekabetDecisionSummary(
publication_date=pub_date, decision_number=dec_num, decision_date=dec_date, publication_date=pub_date, decision_number=dec_num, decision_date=dec_date,
decision_type_text=dec_type_text, title=title_text, decision_type_text=dec_type_text, title=title_text,
decision_url=final_decision_url, decision_url=decision_landing_url_str,
karar_id=current_karar_id, karar_id=current_karar_id,
related_cases_url=final_related_cases_url related_cases_url=related_cases_url_str
)) ))
logger.debug(f"Table {idx+1} parsed successfully: Karar ID '{current_karar_id}', Title '{title_text[:50] if title_text else 'N/A'}...'") logger.debug(f"Table {idx+1} parsed successfully: Karar ID '{current_karar_id}', Title '{title_text[:50] if title_text else 'N/A'}...'")