
    %i                        d Z ddlmZ ddlZddlmc mZ ddl	Z
ddlZddlmZ  ee      j                         j                   d   Zedz  dz  ZddZdd	Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)u1   extract_followup.py 회귀 테스트 (task-2360).    )annotationsN)Path   scriptszextract_followup.pyc                   | j                  dt        |             t        j                  j	                  dd       t
        j                  j                  dt              }g }|}|r|j                  }|}|sdddt        j                         v st        j                  |      rt        j                  |      ndiz  }|j                  |       |rlddt        j                         v st        j                  |      rt        j                  |      ndt        j                        dz  }|j                  |       t        j                   |d	      i z  }d
d|iz  }	t#        t        j$                  |	            dx}x}}t
        j                  j'                  |      }
|
t        j                  d<   |j                  j)                  |
       |
S )u6   isolated WORKSPACE_ROOT으로 모듈을 새로 로드.WORKSPACE_ROOTextract_followupNz%(py2)spy2specz#%(py6)s
{%(py6)s = %(py4)s.loader
})py4py6r   assert %(py9)spy9)setenvstrsysmodulespop	importlibutilspec_from_file_locationSCRIPTloader@py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanationmodule_from_specexec_module)monkeypatch	workspacer   @py_assert1@py_assert0@py_assert5@py_format3@py_format7@py_format8@py_format10mods              :/home/jay/workspace/scripts/tests/test_extract_followup.py_loadr0      s   'Y8KKOO&->>112DfMD44DKKK444DDK
..
)
)$
/C&)CKK"#KKC J    c                    | dz  dz  j                  d       | dz  dz  j                  d       | dz  dz  j                  d       | dz  j                  d       | S )NmemoryeventsT)parentsreportstaskslogs)mkdir)tmps    r/   _setup_workspacer;      sj    8^h%%d%38^i&&t&48^g$$T$26\&Jr1   c                   t        |       }|dz  dz  dz  j                  dd       t        ||      }|j                  d      }|d   }d	}||k(  }|slt	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}|d   }d}||k(  }|slt	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}|d   }dg}||k(  }|slt	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}y)u.   followup.txt가 있으면 우선 사용된다.r3   r4   ztask-1.followup.txtu>   ## 핵심 결과
테스트.

## 회장 결정 필요
- A vs B
utf-8encodingztask-1sourcefollowup_txt==z%(py1)s == %(py4)spy1r   assert %(py6)sr   Ncore_resultu
   테스트.decisions_neededzA vs B	r;   
write_textr0   r	   r   _call_reprcomparer   r!   r"   
tmp_pathr%   wsr.   outr(   @py_assert3@py_assert2@py_format5r+   s
             r/   "test_extract_followup_txt_priorityrT   "   sL   	(	#B(]X 55AA	  B  R
 C


x
(Cx=*N*=N****=N***=***N*******}-------------------!"0xj0"j0000"j000"000j0000000r1   c                j   t        |       }|dz  dz  dz  j                  dd       t        ||      }|j                  d      }d}|d	   }||v }|slt	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}d}g }
|d   }|}|sd}|}||v }|sddt	        j                  |      iz  }	|
j                  |	       |s+ddt	        j                        iz  }|
j                  |       t	        j                  |
d      i z  }t	        j
                  d
|fd||f      t	        j                  |      |dz  }dd|iz  }t        t	        j                  |            dx}x}x}x}
x}}|d   }dg}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}|d   }d g}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}|d!   }d"g}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}y)#u5   followup.txt 없으면 보고서에서 자동 추출.r3   r6   z	task-2.mdu   # task-2 작업

## 요약 (SCQA)
**A**: 핵심 답변입니다.

## 회장 결정 필요
- 결정 한 건

## 머지 필요
- PR #99

## 미해결
- 없음

## 다음 단계 권장
- task-3
r=   r>   ztask-2reportr@   inz%(py1)s in %(py4)srE   rG   r   Nu   핵심 답변rH    z%(py6)sz%(py9)sr      )z%(py1)s in (%(py12)s))rF   py12zassert %(py14)spy14rI   u   결정 한 건rB   rD   merges_neededzPR #99
next_stepstask-3)r;   rK   r0   r	   r   rL   r   r!   r"   r   r    )rN   r%   rO   r.   rP   r(   rQ   rR   rS   r+   @py_assert4r)   @py_assert8r-   @py_format11@py_format13@py_format15s                    r/   %test_extract_followup_report_fallbackrf   5   s6   	(	#B(]Y,88	" % 9 ( R
 C


x
(C$s8}$8}$$$$8}$$$8$$$}$$$$$$$8s=18181R8R8?88888188881888R888888888?888?88888888!"8'7&88"&88888"&8888"888&88888888-H:-:----:------:-------|*
*
****
******
*******r1   c                   t        |       }|dz  dz  dz  j                  dd       |dz  dz  dz  j                  d	d       t        ||      }|j                  d
      }|d   }dg}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}|d   }dg}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}y)uW   followup.txt가 일부 섹션만 채우면, 빈 섹션은 보고서에서 보충된다.r3   r4   ztask-3.followup.txtu(   ## 회장 결정 필요
- 강조 결정
r=   r>   r6   z	task-3.mdui   # task-3

## 머지 필요
- PR #1

## 회장 결정 필요
- (보고서 결정 — 우선순위 낮음)
r`   rI   u   강조 결정rB   rD   rE   rG   r   Nr^   zPR #1rJ   rM   s
             r/   1test_followup_supplements_missing_report_sectionsrh   U   s1   	(	#B(]X 55AA	 	 B  (]Y,88	  9 
 R
 C


x
(C!"7&77"&77777"&7777"777&77777777,G9,9,,,,9,,,,,,9,,,,,,,r1   c                   t        |       }|dz  dz  dz  j                  dd       t        ||      }|j                  d      }|d   }d	}||k(  }|slt	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            d x}x}}|d   }d}||k(  }|slt	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            d x}x}}y )Nr3   r4   ztask-4.completion.txtu   단순 완료 메시지r=   r>   ztask-4r@   
completionrB   rD   rE   rG   r   rH   rJ   rM   s
             r/   -test_completion_fallback_when_no_other_sourcerk   q   s    	(	#B(]X 77CC!G D  R
 C


x
(Cx=(L(=L((((=L(((=(((L(((((((}:!::!:::::!:::::::!::::::::r1   c                   t        |       }t        d      D cg c]  }d| ddz    }}|dz  dz  dz  j                  dd	j                  d
 |D              z   d       t	        ||      }|j                  d      \  }}t        |      }|j                  }	||	k  }
|
s7t        j                  d|
fd||	f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}
}	d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}yc c}w )u;   4000자 초과 시 우선순위 낮은 섹션은 잘린다.2   u   매우 긴 항목  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr3   r4   ztask-5.followup.txtu   ## 회장 결정 필요

c              3  &   K   | ]	  }d |   yw)z- N ).0xs     r/   	<genexpr>z5test_format_anu_message_truncation.<locals>.<genexpr>   s     /MQ"QC/Ms   r=   r>   ztask-5)<=)zT%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py7)s
{%(py7)s = %(py5)s.TELEGRAM_LIMIT
}lenmsgr.   )py0rF   py3py5py7r   r   Nu*   상세 보고서: memory/reports/task-5.mdrW   z%(py1)s in %(py3)srF   rz   assert %(py5)sr{   )r;   rangerK   joinr0   build_message_for_taskrw   TELEGRAM_LIMITr   rL   r   r   r   r   r!   r"   )rN   r%   rO   i
long_itemsr.   rx   _rR   @py_assert6ra   r,   r-   r(   @py_format4@py_format6s                   r/   "test_format_anu_message_truncationr   |   s   	(	#BAFrKA&qc+i7KJK(]X 55AA#dii/M*/M&MMX_ B  R
 C''1FCs8)s)))8)))))8)))))))3)))3))))))s)))s)))8))))))s)))s)))))))))))7>73>>>>73>>>7>>>>>>3>>>3>>>>>>> Ls   Jc                   t        |       }|dz  dz  dz  j                  dd       t        ||      }|j                  ddd	
      \  }}| }|sedddt	        j
                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            d}d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}}y)u0   이미 .anu-notified가 있으면 발송 스킵.r3   r4   ztask-6.anu-notifiedrZ   r=   r>   ztask-6rx   T)dry_runzassert not %(py0)sry   okNzalready-notifiedrB   )z%(py0)s == %(py3)sstatus)ry   rz   r   r{   )r;   rK   r0   send_anu_cronr   r   r   r   r   r!   r"   rL   )rN   r%   rO   r.   r   r   r'   @py_format2rR   r   r   s              r/   test_send_anu_cron_deduper      s    	(	#B(]X 55AA"wAW
R
 C""8UD"AJB6M6MMMMMrMMMrMMMMMM''6'''''6'''''''6'''6'''''''''''r1   c                   t        |       }t        ||      }|j                  d      }d}||v}|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}d
}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}t        |      }d}	||	k(  }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  t              rt        j
                  t              nddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |	      dz  }dd|iz  }t        t        j                  |            d	x}x}
}	y	)uA   cokacdir 호환 — 'YYYY-MM-DD HH:MM:SS' 형식 (T 구분자 X).<   T)not in)z%(py1)s not in %(py3)satr~   r   r{   Nrn   rW   r}      rB   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srw   )ry   rF   rz   r   zassert %(py8)spy8)r;   r0   _at_time_secondsr   rL   r   r   r   r   r!   r"   rw   )rN   r%   rO   r.   r   r(   rR   r   r   r)   ra   r+   @py_format9s                r/   #test_at_format_uses_space_separatorr      sc   	(	#B
R
 C			b	!B3b=3b3bb3"93"3""r7b7b=7b33rr7br1   c                D   t        |       }ddgdgdgdgd}t        ||      }|j                  ddd	|      }d
D ]  }||v }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }	t        t        j                  |	            d } d}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}
}d}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}
}d	}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}
}d}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}
}y )Nu   결과d1m1u1n1)rH   rI   r^   
unresolvedr_   ztask-7z	dev7-teamzbot-h)u   핵심 결과u   회장 결정 필요u   머지 필요u	   미해결u   다음 단계 권장rW   )z%(py0)s in %(py2)ssrx   )ry   r
   zassert %(py4)sr   r}   r~   r   r{   zmemory/reports/task-7.md)r;   r0   format_anu_messager   rL   r   r   r   r   r!   r"   )rN   r%   rO   itemsr.   rx   r   r'   r*   rS   r(   rR   r   r   s                 r/   )test_format_message_includes_all_sectionsr      s   	(	#B!FffE R
 C

 
 ;
GCl CxqCqqCC8s?8s8ss;#;#;##7c>7c7cc%,%,,,,%,,,%,,,,,,,,,,,,,,,,r1   c                   t        |       }|dz  dz  dz  j                  dd       t        ||      }|j                  d      }|d   }d	}||k(  }|slt	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}|d   }d}||u}|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}d}|d   }||v }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}y)u>   헤더 없는 followup.txt는 전체를 core_result로 취급.r3   r4   ztask-8.followup.txtu6   이건 그냥 한 줄 메모.
핵심 결과만 있음.r=   r>   ztask-8r@   rA   rB   rD   rE   rG   r   NrH   )is not)z%(py1)s is not %(py4)su   한 줄 메모rW   rY   rJ   rM   s
             r/   4test_followup_without_headers_treated_as_core_resultr      sG   	(	#B(]X 55AAAG B  R
 C


x
(Cx=*N*=N****=N***=***N*******})T)T))))T))))))T)))))))1s=1111111111111111111111r1   )r&   r   )r:   r   returnr   )__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   importlib.utilr   r   pathlibr   __file__resolver5   REPOr   r0   r;   rT   rf   rh   rk   r   r   r   r   r   rr   r1   r/   <module>r      s~    7 "     
 H~''*			1	1
1&+@-8;
?(-&
2r1   