From fa6c448afa63077aef37969bb2ecabe68000fe06 Mon Sep 17 00:00:00 2001 From: saidsurucu Date: Thu, 17 Jul 2025 21:14:03 +0300 Subject: [PATCH] convert enums to literal --- anayasa_mcp_module/client.py | 20 +++++----- anayasa_mcp_module/models.py | 57 ++++++++-------------------- anayasa_mcp_module/unified_client.py | 14 +++---- mcp_server_main.py | 10 ++--- 4 files changed, 36 insertions(+), 65 deletions(-) diff --git a/anayasa_mcp_module/client.py b/anayasa_mcp_module/client.py index a966c2d..9e15a48 100644 --- a/anayasa_mcp_module/client.py +++ b/anayasa_mcp_module/client.py @@ -50,36 +50,36 @@ class AnayasaMahkemesiApiClient: for kw in params.keywords_any: query_params.append(("HerhangiBirKelimeAra[]", kw)) if params.keywords_exclude: for kw in params.keywords_exclude: query_params.append(("BulunmayanKelimeAra[]", kw)) - if params.period and params.period.value and params.period.value != "ALL": query_params.append(("Donemler_id", params.period.value)) + if params.period and params.period and params.period != "ALL": query_params.append(("Donemler_id", params.period)) if params.case_number_esas: query_params.append(("EsasNo", params.case_number_esas)) if params.decision_number_karar: query_params.append(("KararNo", params.decision_number_karar)) if params.first_review_date_start: query_params.append(("IlkIncelemeTarihiIlk", params.first_review_date_start)) if params.first_review_date_end: query_params.append(("IlkIncelemeTarihiSon", params.first_review_date_end)) if params.decision_date_start: query_params.append(("KararTarihiIlk", params.decision_date_start)) if params.decision_date_end: query_params.append(("KararTarihiSon", params.decision_date_end)) - if params.application_type and params.application_type.value and params.application_type.value != "ALL": query_params.append(("BasvuruTurler_id", params.application_type.value)) + if params.application_type and params.application_type and params.application_type != "ALL": query_params.append(("BasvuruTurler_id", params.application_type)) if params.applicant_general_name: query_params.append(("BasvuranGeneller_id", params.applicant_general_name)) if params.applicant_specific_name: query_params.append(("BasvuranOzeller_id", params.applicant_specific_name)) if params.attending_members_names: for name in params.attending_members_names: query_params.append(("Uyeler_id[]", name)) if params.rapporteur_name: query_params.append(("Raportorler_id", params.rapporteur_name)) - if params.norm_type and params.norm_type.value and params.norm_type.value != "ALL": query_params.append(("NormunTurler_id", params.norm_type.value)) + if params.norm_type and params.norm_type and params.norm_type != "ALL": query_params.append(("NormunTurler_id", params.norm_type)) if params.norm_id_or_name: query_params.append(("NormunNumarasiAdlar_id", params.norm_id_or_name)) if params.norm_article: query_params.append(("NormunMaddeNumarasi", params.norm_article)) if params.review_outcomes: - for outcome_enum_val in params.review_outcomes: - if outcome_enum_val.value and outcome_enum_val.value != "ALL": query_params.append(("IncelemeTuruKararSonuclar_id[]", outcome_enum_val.value)) - if params.reason_for_final_outcome and params.reason_for_final_outcome.value and params.reason_for_final_outcome.value != "ALL": - query_params.append(("KararSonucununGerekcesi", params.reason_for_final_outcome.value)) + for outcome_val in params.review_outcomes: + if outcome_val and outcome_val != "ALL": query_params.append(("IncelemeTuruKararSonuclar_id[]", outcome_val)) + if params.reason_for_final_outcome and params.reason_for_final_outcome and params.reason_for_final_outcome != "ALL": + query_params.append(("KararSonucununGerekcesi", params.reason_for_final_outcome)) if params.basis_constitution_article_numbers: for article_no in params.basis_constitution_article_numbers: query_params.append(("DayanakHukmu[]", article_no)) if params.official_gazette_date_start: query_params.append(("ResmiGazeteTarihiIlk", params.official_gazette_date_start)) if params.official_gazette_date_end: query_params.append(("ResmiGazeteTarihiSon", params.official_gazette_date_end)) if params.official_gazette_number_start: query_params.append(("ResmiGazeteSayisiIlk", params.official_gazette_number_start)) if params.official_gazette_number_end: query_params.append(("ResmiGazeteSayisiSon", params.official_gazette_number_end)) - if params.has_press_release and params.has_press_release.value and params.has_press_release.value != "ALL": query_params.append(("BasinDuyurusu", params.has_press_release.value)) - if params.has_dissenting_opinion and params.has_dissenting_opinion.value and params.has_dissenting_opinion.value != "ALL": query_params.append(("KarsiOy", params.has_dissenting_opinion.value)) - if params.has_different_reasoning and params.has_different_reasoning.value and params.has_different_reasoning.value != "ALL": query_params.append(("FarkliGerekce", params.has_different_reasoning.value)) + if params.has_press_release and params.has_press_release and params.has_press_release != "ALL": query_params.append(("BasinDuyurusu", params.has_press_release)) + if params.has_dissenting_opinion and params.has_dissenting_opinion and params.has_dissenting_opinion != "ALL": query_params.append(("KarsiOy", params.has_dissenting_opinion)) + if params.has_different_reasoning and params.has_different_reasoning and params.has_different_reasoning != "ALL": query_params.append(("FarkliGerekce", params.has_different_reasoning)) # Add pagination and sorting parameters as query params instead of URL path if params.results_per_page and params.results_per_page != 10: diff --git a/anayasa_mcp_module/models.py b/anayasa_mcp_module/models.py index 4a1c58f..f330c35 100644 --- a/anayasa_mcp_module/models.py +++ b/anayasa_mcp_module/models.py @@ -1,48 +1,21 @@ # anayasa_mcp_module/models.py from pydantic import BaseModel, Field, HttpUrl -from typing import List, Optional, Dict, Any +from typing import List, Optional, Dict, Any, Literal from enum import Enum -# --- New Unified Enums --- -class AnayasaDecisionTypeEnum(str, Enum): - NORM_DENETIMI = "norm_denetimi" - BIREYSEL_BASVURU = "bireysel_basvuru" - -# --- Enums (AnayasaDonemEnum, AnayasaBasvuruTuruEnum, etc. - same as before) --- +# --- Enums (AnayasaDonemEnum, etc. - same as before) --- class AnayasaDonemEnum(str, Enum): TUMU = "ALL" DONEM_1961 = "1" DONEM_1982 = "2" -class AnayasaBasvuruTuruEnum(str, Enum): - TUMU = "ALL" - IPTAL = "1" - ITIRAZ = "2" - DIGER = "3" class AnayasaVarYokEnum(str, Enum): TUMU = "ALL" YOK = "0" VAR = "1" -class AnayasaNormTuruEnum(str, Enum): - TUMU = "ALL" - ANAYASA = "1" - ANAYASA_DEGISTIREN_KANUN = "2" - CUMHURBASKANLIGI_KARARNAMESI = "14" - ICTUZUK = "3" - KANUN = "4" - KANUN_HUKMUNDE_KARARNAME = "5" - KARAR = "6" - NIZAMNAME = "7" - TALIMATNAME = "8" - TARIFE = "9" - TBMM_KARARI = "10" - TEZKERE = "11" - TUZUK = "12" - YOK_SECENEGI = "0" - YONETMELIK = "13" class AnayasaIncelemeSonucuEnum(str, Enum): TUMU = "ALL" @@ -94,30 +67,30 @@ class AnayasaNormDenetimiSearchRequest(BaseModel): keywords_all: Optional[List[str]] = Field(default_factory=list, description="Keywords for AND logic (KelimeAra[]).") keywords_any: Optional[List[str]] = Field(default_factory=list, description="Keywords for OR logic (HerhangiBirKelimeAra[]).") keywords_exclude: Optional[List[str]] = Field(default_factory=list, description="Keywords to exclude (BulunmayanKelimeAra[]).") - period: Optional[AnayasaDonemEnum] = Field(default=AnayasaDonemEnum.TUMU, description="Constitutional period (Donemler_id).") + period: Optional[Literal["ALL", "1", "2"]] = Field(default="ALL", description="Constitutional period (Donemler_id).") case_number_esas: str = Field("", description="Case registry number (EsasNo), e.g., '2023/123'.") decision_number_karar: str = Field("", description="Decision number (KararNo), e.g., '2023/456'.") first_review_date_start: str = Field("", description="First review start date (IlkIncelemeTarihiIlk), format DD/MM/YYYY.") first_review_date_end: str = Field("", description="First review end date (IlkIncelemeTarihiSon), format DD/MM/YYYY.") decision_date_start: str = Field("", description="Decision start date (KararTarihiIlk), format DD/MM/YYYY.") decision_date_end: str = Field("", description="Decision end date (KararTarihiSon), format DD/MM/YYYY.") - application_type: Optional[AnayasaBasvuruTuruEnum] = Field(default=AnayasaBasvuruTuruEnum.TUMU, description="Type of application (BasvuruTurler_id).") + application_type: Optional[Literal["ALL", "1", "2", "3"]] = Field(default="ALL", description="Type of application (BasvuruTurler_id).") applicant_general_name: str = Field("", description="General applicant name (BasvuranGeneller_id).") applicant_specific_name: str = Field("", description="Specific applicant name (BasvuranOzeller_id).") official_gazette_date_start: str = Field("", description="Official Gazette start date (ResmiGazeteTarihiIlk), format DD/MM/YYYY.") official_gazette_date_end: str = Field("", description="Official Gazette end date (ResmiGazeteTarihiSon), format DD/MM/YYYY.") official_gazette_number_start: str = Field("", description="Official Gazette starting number (ResmiGazeteSayisiIlk).") official_gazette_number_end: str = Field("", description="Official Gazette ending number (ResmiGazeteSayisiSon).") - has_press_release: Optional[AnayasaVarYokEnum] = Field(default=AnayasaVarYokEnum.TUMU, description="Press release available (BasinDuyurusu).") - has_dissenting_opinion: Optional[AnayasaVarYokEnum] = Field(default=AnayasaVarYokEnum.TUMU, description="Dissenting opinion exists (KarsiOy).") - has_different_reasoning: Optional[AnayasaVarYokEnum] = Field(default=AnayasaVarYokEnum.TUMU, description="Different reasoning exists (FarkliGerekce).") + has_press_release: Optional[Literal["ALL", "0", "1"]] = Field(default="ALL", description="Press release available (BasinDuyurusu).") + has_dissenting_opinion: Optional[Literal["ALL", "0", "1"]] = Field(default="ALL", description="Dissenting opinion exists (KarsiOy).") + has_different_reasoning: Optional[Literal["ALL", "0", "1"]] = Field(default="ALL", description="Different reasoning exists (FarkliGerekce).") attending_members_names: Optional[List[str]] = Field(default_factory=list, description="List of attending members' exact names (Uyeler_id[]).") rapporteur_name: str = Field("", description="Rapporteur's exact name (Raportorler_id).") - norm_type: Optional[AnayasaNormTuruEnum] = Field(default=AnayasaNormTuruEnum.TUMU, description="Type of the reviewed norm (NormunTurler_id).") + norm_type: Optional[Literal["ALL", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "0"]] = Field(default="ALL", description="Type of the reviewed norm (NormunTurler_id).") norm_id_or_name: str = Field("", description="Number or name of the norm (NormunNumarasiAdlar_id).") norm_article: str = Field("", description="Article number of the norm (NormunMaddeNumarasi).") - review_outcomes: Optional[List[AnayasaIncelemeSonucuEnum]] = Field(default_factory=list, description="List of review types and outcomes (IncelemeTuruKararSonuclar_id[]).") - reason_for_final_outcome: Optional[AnayasaSonucGerekcesiEnum] = Field(default=AnayasaSonucGerekcesiEnum.TUMU, description="Main reason for the decision outcome (KararSonucununGerekcesi).") + review_outcomes: Optional[List[Literal["1", "2", "3", "4", "5", "6", "7", "8", "12"]]] = Field(default_factory=list, description="List of review types and outcomes (IncelemeTuruKararSonuclar_id[]).") + reason_for_final_outcome: Optional[Literal["ALL", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "29", "30"]] = Field(default="ALL", description="Main reason for the decision outcome (KararSonucununGerekcesi).") basis_constitution_article_numbers: Optional[List[str]] = Field(default_factory=list, description="List of supporting Constitution article numbers (DayanakHukmu[]).") results_per_page: int = Field(10, ge=1, le=10, description="Results per page.") page_to_fetch: int = Field(1, ge=1, description="Page number to fetch for results list.") @@ -219,7 +192,7 @@ class AnayasaBireyselBasvuruDocumentMarkdown(BaseModel): # --- Unified Models --- class AnayasaUnifiedSearchRequest(BaseModel): """Unified search request for both Norm Denetimi and Bireysel Başvuru.""" - decision_type: AnayasaDecisionTypeEnum = Field(..., description="Decision type: norm_denetimi or bireysel_basvuru") + decision_type: Literal["norm_denetimi", "bireysel_basvuru"] = Field(..., description="Decision type: norm_denetimi or bireysel_basvuru") # Common parameters keywords: List[str] = Field(default_factory=list, description="Keywords to search for") @@ -229,26 +202,26 @@ class AnayasaUnifiedSearchRequest(BaseModel): # Norm Denetimi specific parameters (ignored for bireysel_basvuru) keywords_all: List[str] = Field(default_factory=list, description="All keywords must be present (norm_denetimi only)") keywords_any: List[str] = Field(default_factory=list, description="Any of these keywords (norm_denetimi only)") - decision_type_norm: Optional[AnayasaBasvuruTuruEnum] = Field(None, description="Decision type for norm denetimi") + decision_type_norm: Optional[Literal["ALL", "1", "2", "3"]] = Field(None, description="Decision type for norm denetimi") application_date_start: str = Field("", description="Application start date (norm_denetimi only)") application_date_end: str = Field("", description="Application end date (norm_denetimi only)") # Bireysel Başvuru specific parameters (ignored for norm_denetimi) decision_start_date: str = Field("", description="Decision start date (bireysel_basvuru only)") decision_end_date: str = Field("", description="Decision end date (bireysel_basvuru only)") - norm_type: Optional[AnayasaNormTuruEnum] = Field(None, description="Norm type (bireysel_basvuru only)") + norm_type: Optional[Literal["ALL", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "0"]] = Field(None, description="Norm type (bireysel_basvuru only)") subject_category: str = Field("", description="Subject category (bireysel_basvuru only)") class AnayasaUnifiedSearchResult(BaseModel): """Unified search result containing decisions from either system.""" - decision_type: AnayasaDecisionTypeEnum = Field(..., description="Type of decisions returned") + decision_type: Literal["norm_denetimi", "bireysel_basvuru"] = Field(..., description="Type of decisions returned") decisions: List[Dict[str, Any]] = Field(default_factory=list, description="Decision list (structure varies by type)") total_records_found: int = Field(0, description="Total number of records found") retrieved_page_number: int = Field(1, description="Page number that was retrieved") class AnayasaUnifiedDocumentMarkdown(BaseModel): """Unified document model for both Norm Denetimi and Bireysel Başvuru.""" - decision_type: AnayasaDecisionTypeEnum = Field(..., description="Type of document") + decision_type: Literal["norm_denetimi", "bireysel_basvuru"] = Field(..., description="Type of document") source_url: HttpUrl = Field(..., description="Source URL of the document") document_data: Dict[str, Any] = Field(default_factory=dict, description="Document content and metadata") markdown_chunk: Optional[str] = Field(None, description="Markdown content chunk") diff --git a/anayasa_mcp_module/unified_client.py b/anayasa_mcp_module/unified_client.py index 5050234..1319b85 100644 --- a/anayasa_mcp_module/unified_client.py +++ b/anayasa_mcp_module/unified_client.py @@ -9,7 +9,7 @@ from .models import ( AnayasaUnifiedSearchRequest, AnayasaUnifiedSearchResult, AnayasaUnifiedDocumentMarkdown, - AnayasaDecisionTypeEnum, + # Removed AnayasaDecisionTypeEnum - now using string literals AnayasaNormDenetimiSearchRequest, AnayasaBireyselReportSearchRequest ) @@ -28,7 +28,7 @@ class AnayasaUnifiedClient: async def search_unified(self, params: AnayasaUnifiedSearchRequest) -> AnayasaUnifiedSearchResult: """Unified search that routes to appropriate client based on decision_type.""" - if params.decision_type == AnayasaDecisionTypeEnum.NORM_DENETIMI: + if params.decision_type == "norm_denetimi": # Convert to norm denetimi request norm_params = AnayasaNormDenetimiSearchRequest( keywords_all=params.keywords_all or params.keywords, @@ -44,13 +44,13 @@ class AnayasaUnifiedClient: decisions_list = [decision.model_dump() for decision in result.decisions] return AnayasaUnifiedSearchResult( - decision_type=AnayasaDecisionTypeEnum.NORM_DENETIMI, + decision_type="norm_denetimi", decisions=decisions_list, total_records_found=result.total_records_found, retrieved_page_number=result.retrieved_page_number ) - elif params.decision_type == AnayasaDecisionTypeEnum.BIREYSEL_BASVURU: + elif params.decision_type == "bireysel_basvuru": # Convert to bireysel başvuru request bireysel_params = AnayasaBireyselReportSearchRequest( keywords=params.keywords, @@ -68,7 +68,7 @@ class AnayasaUnifiedClient: decisions_list = [decision.model_dump() for decision in result.decisions] return AnayasaUnifiedSearchResult( - decision_type=AnayasaDecisionTypeEnum.BIREYSEL_BASVURU, + decision_type="bireysel_basvuru", decisions=decisions_list, total_records_found=result.total_records_found, retrieved_page_number=result.retrieved_page_number @@ -88,7 +88,7 @@ class AnayasaUnifiedClient: result = await self.norm_client.get_decision_document_as_markdown(document_url, page_number) return AnayasaUnifiedDocumentMarkdown( - decision_type=AnayasaDecisionTypeEnum.NORM_DENETIMI, + decision_type="norm_denetimi", source_url=result.source_url, document_data=result.model_dump(), markdown_chunk=result.markdown_chunk, @@ -102,7 +102,7 @@ class AnayasaUnifiedClient: result = await self.bireysel_client.get_decision_document_as_markdown(document_url, page_number) return AnayasaUnifiedDocumentMarkdown( - decision_type=AnayasaDecisionTypeEnum.BIREYSEL_BASVURU, + decision_type="bireysel_basvuru", source_url=result.source_url, document_data=result.model_dump(), markdown_chunk=result.markdown_chunk, diff --git a/mcp_server_main.py b/mcp_server_main.py index c98eb52..f060501 100644 --- a/mcp_server_main.py +++ b/mcp_server_main.py @@ -273,9 +273,7 @@ from anayasa_mcp_module.models import ( AnayasaUnifiedSearchRequest, AnayasaUnifiedSearchResult, AnayasaUnifiedDocumentMarkdown, - AnayasaDecisionTypeEnum, - AnayasaDonemEnum, AnayasaBasvuruTuruEnum, AnayasaVarYokEnum, - AnayasaNormTuruEnum, AnayasaIncelemeSonucuEnum, AnayasaSonucGerekcesiEnum + # Removed enum imports - now using Literal strings in models ) # KIK Module Imports from kik_mcp_module.client import KikApiClient @@ -1505,7 +1503,7 @@ async def get_uyusmazlik_document_markdown_from_url( } ) async def search_anayasa_unified( - decision_type: AnayasaDecisionTypeEnum = Field(..., description="Decision type: norm_denetimi (norm control) or bireysel_basvuru (individual applications)"), + decision_type: Literal["norm_denetimi", "bireysel_basvuru"] = Field(..., description="Decision type: norm_denetimi (norm control) or bireysel_basvuru (individual applications)"), keywords: List[str] = Field(default_factory=list, description="Keywords to search for (common parameter)"), page_to_fetch: int = Field(1, ge=1, le=100, description="Page number to fetch (1-100)"), results_per_page: int = Field(10, ge=1, le=100, description="Results per page (1-100)"), @@ -1513,14 +1511,14 @@ async def search_anayasa_unified( # Norm Denetimi specific parameters (ignored for bireysel_basvuru) keywords_all: List[str] = Field(default_factory=list, description="All keywords must be present (norm_denetimi only)"), keywords_any: List[str] = Field(default_factory=list, description="Any of these keywords (norm_denetimi only)"), - decision_type_norm: Optional[AnayasaBasvuruTuruEnum] = Field(None, description="Decision type for norm denetimi"), + decision_type_norm: Optional[Literal["ALL", "1", "2", "3"]] = Field(None, description="Decision type for norm denetimi"), application_date_start: str = Field("", description="Application start date (norm_denetimi only)"), application_date_end: str = Field("", description="Application end date (norm_denetimi only)"), # Bireysel Başvuru specific parameters (ignored for norm_denetimi) decision_start_date: str = Field("", description="Decision start date (bireysel_basvuru only)"), decision_end_date: str = Field("", description="Decision end date (bireysel_basvuru only)"), - norm_type: Optional[AnayasaNormTuruEnum] = Field(None, description="Norm type (bireysel_basvuru only)"), + norm_type: Optional[Literal["ALL", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "0"]] = Field(None, description="Norm type (bireysel_basvuru only)"), subject_category: str = Field("", description="Subject category (bireysel_basvuru only)") ) -> str: logger.info(f"Tool 'search_anayasa_unified' called for decision_type: {decision_type}")