
    ᴺh2(                     |    S SK JrJrJrJr  S SKJrJr  S SKrS SK	r	S SK
r
S SKJr  S SKJrJrJrJr   " S S5      rg)    )capture_exceptioncapture_messageset_tagset_context)monitor_azure_apimonitor_critical_systemN)BeautifulSoup)AZURE_DEVOPS_URLAZURE_DEVOPS_ORGAZURE_DEVOPS_PROJECTAZURE_DEVOPS_PATc                   V    \ rS rSrS
S jr\SS j5       rS\4S jrSS\S\	4S jjr
S	rg)AzureClient   Nc                    [        SU 35        U(       a  UR                  S[        5      U l        UR                  S[        5      U l        UR                  S[        5      U l        UR                  S[        5      U l	        [        SU R                   SU R
                   SU R                   S	U R                  (       a  S
[        U R                  5      -  OS 35        OU=(       d    [        U l        U=(       d    [        U l        S U l        U=(       d    [        U l	        [        SU R                   SU R
                   SU R                   S	U R                  (       a  S
[        U R                  5      -  OS 35        S U l        U R                  (       at  [        U R                  [        5      (       aU  U R                  R                  S5      (       d  SU R                  -   U l        U R                  R                  S5      U l        g [        U R                  [        5      (       d*  [        S[!        U R                  5       S35        S U l        g g )Nu7   🔧 AzureClient constructor called with: azure_config=urlorgprojectpatu    🔧 Using azure_config - URL: '	', Org: '', Project: '', PAT: *Noneu!   🔧 Using direct params - URL: ')zhttp://https://r   /u   ❌ Invalid azure_url type: z, expected string)printgetr
   	azure_urlr   	azure_orgr   azure_projectr   	azure_patlen
last_error
isinstancestr
startswithrstriptype)selfr   r    r"   azure_configs        BD:\Projects\AI-TestCaseGenerator\azure_integration\azure_client.py__init__AzureClient.__init__   sS   G~VW)--e5EFDN)--e5EFDN!-!1!1)=Q!RD)--e5EFDN4T^^4DIdnnM]]jkok}k}j~  G  ei  es  es  HK  NQ  RV  R`  R`  Na  Ha  y  G@  A  B ':*:DN&:*:DN!%D&:*:DN5dnn5EYt~~N^^klpl~l~k  @H  fj  ft  ft  IL  OR  SW  Sa  Sa  Ob  Ib  z@  HA  B  C >>j==>>,,-DEE!+dnn!< "^^2237DNDNNC000dnn1E0FFWXY!DN 1    c                 v  ^^ U(       d\  [         R                  " SS5      R                  S5      nU Vs/ s H)  o"R                  5       (       d  M  UR                  5       PM+     nnU(       d  [	        S5        g [	        SU R
                   SU R                   SU R                   SU R                  (       a  S	[        U R                  5      -  OS
 35        U R
                  (       d  SU l
        [	        S5        g U R                  (       d  SU l
        [	        S5        g U R                  (       d  SU l
        [	        S5        g U R                  (       d  SU l
        [	        S5        g / nU GHK  nU R
                   SU R                   SU R                   SU S3mSS[        R                  " SU R                   3R                  5       5      R                  5        3S.m [        SS9UU4S j5       nU" 5       nUR                   S:X  a  UR#                  5       nS nUR%                  S0 5      R%                  S S!5      n	U" U	5      n
UR%                  S0 5      R%                  S"S#5      nUR'                  UUU
S$.5        [	        S%U 35        GM%  S&U S'UR                    3nXl
        [	        S(U 35        GMN     U$ s  snf ! [(         al  nS)U S'[+        U5       3nXl
        [	        S(U 35        [-        UUU R
                  U R                  U R                  [/        WS*S 5      S+.5         S nAGM  S nAff = f),NAZURE_DEVOPS_WORKITEM_IDS ,uW   ⚠️ Work item IDs not found. Please set AZURE_DEVOPS_WORKITEM_IDS in your .env file.u%   🔍 Validating Azure fields - URL: 'r   r   r   r   r   z Azure DevOps URL cannot be emptyu$   ❌ Azure DevOps URL cannot be emptyz)Azure DevOps organization cannot be emptyu-   ❌ Azure DevOps organization cannot be emptyz$Azure DevOps project cannot be emptyu(   ❌ Azure DevOps project cannot be emptyz2Azure DevOps Personal Access Token cannot be emptyu6   ❌ Azure DevOps Personal Access Token cannot be emptyr   /_apis/wit/workitems/?api-version=6.0application/jsonBasic :AcceptAuthorizationT)criticalc                  .   > [         R                  " TT S9$ )N)headers)requestsr   )r>   r   s   r,   make_azure_request>AzureClient.fetch_azure_work_items.<locals>.make_azure_requestW   s    #<<W==r/      c                 :    [        U S5      nUR                  5       $ )Nzhtml.parser)r	   get_text)textsoups     r,   
clean_html6AzureClient.fetch_azure_work_items.<locals>.clean_html`   s    ,T=A#}}.r/   fieldszSystem.DescriptionzNo Description FoundzSystem.TitlezNo Title Found)idtitledescriptionu#   ✅ Successfully fetched work item zFailed to fetch work item : u   ❌ zError processing work item status_code)work_item_idr   r    r!   response_status)osgetenvsplitstripr   r   r    r!   r"   r#   r$   base64	b64encodeencodedecoder   rN   jsonr   append	Exceptionr&   r   getattr)r*   work_item_idsrJ   resultsrO   r@   response	work_itemrG   rL   description_cleanedrK   	error_msger>   r   s                 @@r,   fetch_azure_work_items"AzureClient.fetch_azure_work_items,   s=   II&A2FLLSQM2?N-B88:ZRXXZ-MNkl 	5dnn5EYt~~N^^klpl~l~k  @H  fj  ft  ft  IL  OR  SW  Sa  Sa  Ob  Ib  z@  HA  B  	C~~@DO89~~IDOAB!!DDO<=~~RDOJK)L^^$Adnn%5Qt7I7I6JJ_`l_mm}~C,#)&*:*:Qt~~>N;O;V;V;X*Y*`*`*b)c!dG
("D1> 2> ./''3. (I/ #,--""="A"ABVXn"oK*4[*A'%MM(B7;;NL\]ENN*!&':$ 
 ?~NO"<\N"XMaMaLb cI&/OD,-G *b _ OD  9,r#a&R	"+YK()!!$0!%!%%)%7%7'.x'M&  s+   J=J=!B,K&K
L8A L33L8project_namec                     U R                    SU R                   SU S3nSS[        R                  " SU R                   3R                  5       5      R                  5        3S.n[        R                  " X#SS	9nUR                  5         UR                  5       $ ! [         a  n[        S
U SU 35         SnAgSnAff = f)zGet project informationr   z/_apis/projects/r5   r6   r7   r8   r9      r>   timeoutu   ❌ Failed to get project rM   N)r   r    rU   rV   r"   rW   rX   r?   r   raise_for_statusrY   r[   r   )r*   rf   r   r>   r_   rc   s         r,   get_projectAzureClient.get_project   s    	^^$Adnn%55El^ScdC,#)&*:*:Qt~~>N;O;V;V;X*Y*`*`*b)c!dG
  ||C"EH%%'==?" 	.|nBqcBC	s   BB 
C %B;;C limitc           	      H    [        SU 35        U R                   SU R                   SU S3nSSS[        R                  " SU R
                   3R                  5       5      R                  5        3S.nSU S	3/nU(       ae  [        U[        [        45      (       aJ  [        U5      S
:  a;  SR                  U Vs/ s H	  nS	U S	3PM     sn5      nUR                  SU S35        SR                  U5      n	SU	 S3n
SU
0n[        SU 35        [        R                  " XEUSS9n[        SUR                    35        UR                   S:w  a'  [        SUR                    SUR"                   35        / $ UR%                  5         UR'                  5       nUR)                  S/ 5      n[        S[        U5       S35        / nUc  UOUSU nU H  nUS   nU R                   SU R                   SU SU S3n[        R(                  " UUSS 9nUR                   S:X  a!  UR                  UR'                  5       5        Mq  [        S!U S"UR                    35        M     [        S#[        U5       S$35        U$ s  snf ! [*         a  n[        S%U 35        / s SnA$ SnAff = f)&a  Get recent work items for suggestions
:param project_name: Azure DevOps project name
:param limit: Max number of items to return (None for all, details fetch still respects this cap)
:param states: Optional list of state names to filter by (e.g., ['Ready for QA', 'Re-open'])
u&   🔍 Fetching work items for project: r   z/_apis/wit/wiql?api-version=6.0r6   r7   r8   )r:   zContent-Typer;   z[System.TeamProject] = ''r   z, z[System.State] IN ()z AND z_SELECT [System.Id], [System.Title], [System.WorkItemType], [System.State] FROM WorkItems WHERE z# ORDER BY [System.ChangedDate] DESCqueryu   🔍 Making WIQL request to: rh   )r>   rY   rj   u   🔍 WIQL response status: rB   u   ❌ WIQL request failed: z - 	workItemsu   🔍 Found z work items in WIQL responseNrJ   r4   r5   ri   u(   ❌ Failed to get details for work item rM   u&   🔍 Successfully fetched details for z work itemsu%   ❌ Failed to get recent work items: )r   r   r    rU   rV   r"   rW   rX   r%   listtupler#   joinrZ   r?   postrN   rE   rk   rY   r   r[   )r*   rf   rn   statesr   r>   where_clausessquoted_states	where_sql
wiql_querypayloadr_   result
work_itemsdetailed_itemsitems_to_processitemitem_iditem_urlitem_responserc   s                         r,   get_recent_work_items!AzureClient.get_recent_work_items   s   :	:<.IJ^^$Adnn%5Q|nDcdC, 2#)&*:*:Qt~~>N;O;V;V;X*Y*`*`*b)c!dG  8~QGHM*VdE];;Fa !%		V*DVQqc8V*D E$$':=/%KL]3I" $55  
+G1#78}}SQSTH/0D0D/EFG##s*1(2F2F1Gs8==/Z[	%%']]_FK4JKJ00LMN  N-2]z
6E@R(t*"nn-Qt~~.>a~Mbcjbkk{| (XwPR S ,,3"))-*<*<*>?DWIRP]PiPiOjkl ) :3~;N:O{[\!!S +ET  	9!=>I	s8   B:I= <I8B)I= 6DI= 8I= =
J!JJ!J!)r    r"   r!   r   r$   )NNNN)N)NN)__name__
__module____qualname____firstlineno__r-   r   rd   r&   rl   intr   __static_attributes__ r/   r,   r   r      sG    "@ R Rh  @# @c @ @r/   r   )utils.error_loggerr   r   r   r   utils.error_monitorr   r   rQ   r?   rU   bs4r	   config.settingsr
   r   r   r   r   r   r/   r,   <module>r      s,    W W J 	    f fF Fr/   