
    i2              	       h    d Z ddlZddlmZ ddedededz  fdZdedefdZdd	eded
edz  defdZ	y)un   보고서 요약 추출 공통 모듈.

여러 스크립트에서 공유하는 보고서 파싱 유틸리티.
    N)Pathreport_path	max_charsreturnc                 l   | j                         sy	 | j                  d      }|j                  d      }t	        j
                  d      }d}t        |      D ]  \  }}|j                  |      s|} n ||j                  d||         j                         }g }	|r|	j                  |       ||dz   d D ]n  }|j                  d      s0|j                  d	      r!|j                         j                  d	      r n+t	        j                  d
|      r n|	j                  |       p dj                  |	      j                         }
|
r|
d| S d}t        |      D ]  \  }}|j                  d      s|} n |g }d}||dz   d D ]N  }|j                  d      r|r n9|j                         r"d}|j                  |j                                K|sN n dj                  |      j                         }
|
r|
d| S dj                  |dd       j                         }|r|d| S y# t        $ r Y yw xY w)u(  보고서에서 SCQA의 A(Answer) 또는 첫 섹션 요약 추출.

    추출 우선순위:
    1. ``**A**:``, ``**A.**``, ``**A:**`` 패턴 → 해당 줄부터 다음 ``**`` 또는 ``---``까지
    2. 위 패턴 없으면 첫 번째 ``## `` 섹션 다음의 첫 본문 단락
    3. 둘 다 없으면 파일 첫 10줄

    Args:
        report_path: 보고서 파일 경로
        max_chars: 반환할 최대 문자 수

    Returns:
        추출된 요약 문자열 (max_chars로 truncate).
        파일 없거나 읽기 실패 시 None.
    Nutf-8encoding
z^\s*\*\*A[.:]?\*\*[.:]?\s*    z---**z^\s*\*\*[A-Z]\*\*## F#T 
   )exists	read_textOSErrorsplitrecompile	enumeratematchsubstripappend
startswithendswithjoin)r   r   contentlines_RE_A_PATTERNa_start_idxiline
first_line	collectedresultfirst_section_idxparagraph_linesin_paragraphfallbacks                  E/home/jay/workspace/.worktrees/task-2116-dev1/scripts/report_utils.pyextract_report_summaryr/      sb     '''9 MM$E JJ<=M"KU# 4t$K
 "&&r5+=>DDF
!	Z( +/+, 	#Du%$//$*?DJJLDYDYZ^D_xx,d3T"	# 9%++-*9%% %)U# 4??5! !
 $%'+a/12 	Ds#zz|#&&tzz|4	 /*002*9%% yys$**,H
##E  s   H' '	H32H3c           
      
   dddg dddg g d	}| j                         s|S 	 | j                  d      }|j                  d      }d}d}|D ]  }d|j	                         v r|t        j                  d|      }|rCt        j                  d	|      }|r|j                  d
      n|j                  d
       d}	d|	 }n,t        j                  d|      }
|
r|
j                  d
       d}d|j	                         v s|t        j                  d|      }|rd|j                  d
       d}t        j                  d|      }
|
sd|
j                  d
       d} g }|r|j                  |       |r|j                  |       |rdj                  |      |d<   t        j                  d      }d}d}|D ]b  }|j                  d      r|j                  |      rd}d}*|r n7d}1|s4|j                  d      r nt        j                  d|      s^|d
z  }d |r
|dkD  r||d<   t        j                  d      }d}g }|D ]}  }t        j                  d|      r|j                  |      rd}-|r nOd}4|s7t        j                  d |      }|sP|j                  |j                  d
      j                                 t        |      |d!<   ||d"<   t        j                  d#|      }|r|j                  d
      |d$<   n;t        j                  d%|t
        j                        }|r|j                  d
      |d$<   t        j                  d&|      }|r"|j                  d
      j                         |d'<   |D ]V  }|j                  d(      s|d)d j                         }t        j                   d*d+|      j                         }|r|nd|d,<    n t        j                  d-      }d}g }|D ]  }t        j                  d|      r|j                  |      rd}-|r nod}4|s7t        j                  d.|      }|sP|j                  |j                  d
      j                         |j                  d)      j                         d/        ||d0<   t        j                  d      }d}g }|D ]  }t        j                  d|      r|j                  |      rd}-|r nod}4|s7t        j                  d.|      }|sP|j                  |j                  d
      j                         |j                  d)      j                         d/        ||d1<   |S # t        $ r |cY S w xY w)2uH   보고서에서 테스트 결과, 파일 수, 미해결 이슈를 추출Nr   )	test_summaryfiles_countunresolved_countunresolved_itemsteam_iddurationtitleissues_resolvedissues_unresolvedr   r	   r   pytestu   (\d+)건\s*(?:전건\s*)?통과u   (\d+건\s*(?:전건\s*)?통과)r   u
   건 통과zpytest z(\d+/\d+)\s+passedz passedpyrightu   (\d+)\s*에러zpyright u    에러z(\d+)\s+errors?z errors, r1   u2   ^##\s+.*(?:생성/수정\s*파일|생성/수정:?)Fr   Tr   z^\s*-\s+r2   u"   ^###+\s+.*범위\s*외\s*미해결z^#+\s+z^\s*\d+\.\s+\*\*(.+?)\*\*r3   r4   z\((dev\d+-team)\br5   u   (?:팀|team)\s*:\s*(\S+)u   소요시간\s*[:\-]?\s*(.+)r6   z#    z^task-\d+\.\d+\s*r   r7   u   ^###+\s+.*자체\s*해결u+   ^\s*\d+\.\s+\*\*(.+?)\*\*\s*[—\-]+\s*(.+))summary
resolutionr8   r9   )r   r   r   r   lowerr   searchgroupr   r    r   r   r   r   len
IGNORECASEr   )r   r)   r!   r"   pytest_summarypyright_summaryr&   mm_fullrawm2parts_RE_FILES_SECTIONin_files_sectionbullet_count_RE_UNRESOLVED_SECTIONin_unresolvedr4   m_teamm_team2m_durheader_text
title_text_RE_RESOLVED_SECTIONin_resolvedr8   _RE_UNRESOLVED_STRUCT_SECTIONin_unresolved_structr9   s                                r.   extract_report_metadatarZ   e   sg    F '''9 MM$E "&N"&O Ftzz|#(>		<dCA#EtL)/fll1o
|:5N#*3% YY4d;(*}G%<N

$)@		+T2A$,QWWQZL"@ YY148(0!W&EO/F2 E^$_%!%5!1~ 

#XYL "??5! &&t,#'  ##( s#xxT*!" L1, ,}  ZZ(MNM"$ <88It$%++D1 $  %5t<A ''
(8(8(:;< "%%5!6F!1F YY+W5F"LLOy ))7"--P 'a 0F9 II5w?E"[[^113z  ??4 qr(..*K 4b+FLLNJ,6jDF7O ::&BCK"$O 88It$#))$/"#GNA&&#$771:#3#3#5&'ggaj&6&6&8" !0F
 %'JJ/T$U! $& 88It$,2248'+$'',$!GNA!((#$771:#3#3#5&'ggaj&6&6&8" #4FM}  s   U U"!U"task_id	done_datac           	         d}t        |d      }t        |      }|j                  d      }|j                  d      }|j                  d      }|rP|j                  d      rt        |d         }|j                  d       t	        |d         }	|	d	z  }
|	d	z  }|
 d
| d}|rd|  d| dg}nd|  dg}g }|r|j                  d| d       |r)|r|j                  d| d       n|j                  |       |r |j                  dj                  |             |r3|j                  d       |j                  d       |j                  |       |j                  d      }|j                  d      }g }||j                  d| d       |r|j                  d|        |r |j                  dj                  |             |j                  dg       }|j                  dg       }|j                  dg       }t        |      t        t        |      |j                  dd            z   }|dkD  r|j                  d       |j                  d| d        d!}|D ]&  }|j                  | d"|d#    d$|d%           |d!z  }( |D ]&  }|j                  | d"|d#    d&|d%           |d!z  }( |s%|r#|D ]  }|j                  | d"| d'       |d!z  }  d(j                  |      }t        |      |kD  r|d| }|S ))u;   완료 알림 메시지를 마크다운 포맷으로 생성i   i   )r   r5   r6   r7   duration_secondsN<   u   분 u   초r   u    완료 보고** ()u    완료 보고**(r   r   u   **핵심 결과**r2   r1   u   생성/수정: u
   개 파일u   테스트: r<   r8   r9   r4   r3   r   u   **발견/해결 이슈 u   건**r   z. **r>   u   ** — r?   u   ** — 미해결: u   ** — 미해결r   )	r/   rZ   getstrintr   r    rC   max)r[   r   r\   MAX_LENr>   metar5   r6   r7   secsminutesseconds	msg_linestitle_partsr2   r1   
info_partsr8   issues_unresolved_structuredr4   total_issuesnumitem	item_textmessages                            r.   format_notification_messagert     sg   G$[C@G";/D((9-G88J/H)E==#)I./G==+,8y!345DbjGRiG!$wis3H "$WI-?y JK	'"234	  KRwb>*8*A/x(+./ ,-! ((=)K88N+LJOK=
CDK~67:./ #'((+<b"AO/3xx8KR/P "&((+=r"B'#c2N.OQUQYQYZlnoQp*qqLa2<.FG# 	DuDi(9lAS@TUV1HC	 1 	DuDi(99KDQ]L^K_`a1HC	 ,0@- 	  C5YK7G!HIq ii	"G 7|g(7#N    )i  )N)
__doc__r   pathlibr   rd   rc   r/   dictrZ   rt    ru   r.   <module>rz      sx   
 
 W W Wd
 Wtr r$ rjS S4 SDSWK Scf Sru   