
    i                         d Z ddlZddlZddlZddlZddlmZ ddlmZ  ed      Z	 ej                  d      Z ej                  d      Z ej                  d      Z ej                  d	      Z G d
 de      Z G d de      Zdedee   fdZdedee   fdZdedee   fdZdedeee   ee   ef   fdZdee   dee   defdZdee   dee   deddfdZdee   dee   deddfdZddZedk(  r e        yy)uw   테스트-인터페이스 정합성 자동 감지 스크립트.

Usage:
    python3 test_interface_checker.py [--json]
    N)Path)
NamedTuplez/home/jay/workspace/testsz?"/home/jay/workspace/[^"\']+"|\'(/home/jay/workspace/[^"\']+)\'z(["'](/home/jay/workspace/[^"'\s\)]+)["']z@pytest\.mark\.skip\bzpytest\.skip\(c                   ,    e Zd ZU eed<   eed<   eed<   y)	PathIssuefilelinepathN__name__
__module____qualname__str__annotations__int     R/home/jay/workspace/.worktrees/task-2116-dev1/teams/dev5/test_interface_checker.pyr   r      s    
I
I
Ir   r   c                   6    e Zd ZU eed<   eed<   eed<   eed<   y)	SkipIssuer   r   	test_namereasonNr
   r   r   r   r   r      s    
I
INKr   r   rootreturnc                 6    t        | j                  d            S )u=   테스트 루트 하위의 모든 test_*.py 파일을 반환.z	test_*.py)sortedglob)r   s    r   find_test_filesr   #   s    $))K())r   	test_filec           	         g }| j                  d      j                         }t        |d      D ]  \  }}t        j	                  |      D ]p  }|j                  d      }|rt        |      t        d      k  r.t        |      }|j                         rJ|j                  t        | j                  ||             r  |S )uK   파일에서 하드코딩된 절대 경로 추출 후 존재 여부 확인.utf-8encoding   startz/home/jay/workspace/r   r   r	   )	read_text
splitlines	enumeratePATH_EXTRACT_REfinditergrouplenr   existsappendr   name)r   issueslineslinenor   match	candidatetargets           r   extract_path_issuesr7   (   s     F1<<>E!%q1 [$--d3 	[EAII#6L2M M)_F==?iY^^&yYZ	[[ Mr   c           	      r   g }| j                  d      j                         }d}t        |d      D ]  \  }}t        j                  d|      }|r|j                  d      }t        j                  |      rTt        j                  d|      }|r|j                  d      nd}|j                  t        | j                  |||	             t        j                  |      st        j                  d
|      }|r|j                  d      nd}|j                  t        | j                  |||	              |S )uQ   파일에서 영구 스킵된 테스트(데코레이터 또는 호출)를 감지.r    r!   z	(unknown)r#   r$   z\s*def (test_\w+)z reason\s*=\s*["\']([^"\']*)["\']z(no reason)r   r   r   r   z(pytest\.skip\(\s*[f]?["\']([^"\']*)["\'])r'   r(   r)   rer4   r,   SKIP_DECORATOR_REsearchr/   r   r0   SKIP_CALL_RE)	r   r1   r2   current_testr3   r   
func_matchreason_matchr   s	            r   extract_skip_issuesrA   8   s     F1<<>E#L!%q1 XX2D9
%++A.L ##D)99%H$OL.:\''*FMM"*!	   &99%PRVWL.:\''*FMM"*!	/> Mr   
tests_rootc                     t        |       }g }g }|D ]6  }|j                  t        |             |j                  t        |             8 ||t	        |      fS )uE   전체 점검 실행. (path_issues, skip_issues, total_files) 반환.)r   extendr7   rA   r-   )rB   
test_filesall_path_issuesall_skip_issuestfs        r   
run_checksrI   _   sb     !,J')O')O 8226722678 OS_<<r   path_issuesskip_issuesc                     | ry|ryy)NWARNOKr   )rJ   rK   s     r   determine_statusrO   n   s    r   total_filesc                    t        d       t        d| d       t                | rSt        dt        |        d       | D ]5  }t        d|j                   d|j                   d|j                   d	       7 nt        d
       t                |r`t        dt        |       d       |D ]B  }t        d|j                   d|j                   d|j
                   d|j                   d	       D nt        d       t                t        | |      }g }| r|j                  t        |        d       |r|j                  t        |       d       |rdj                  |      nd}t        d| d| d       y )Nu2   === 테스트-인터페이스 정합성 점검 ===u   검사 파일: u   개u   [경로 불일치] u   건:z  - :u    → z (NOT FOUND)u&   [경로 불일치] 0건: 이상 없음u   [영구 스킵] z (skip reason: )u#   [영구 스킵] 0건: 이상 없음z path issuesz permanent skipsz, z	no issuesu   결과: z ()
printr-   r   r   r	   r   r   rO   r/   join)rJ   rK   rP   issuestatuspartsdetails          r   print_human_reportrZ   v   sp   
 

>?	OK=
,-	G#C$4#5T:;  	QEDAejj\uzzl,OP	Q 	67	G [!1 2$78  	hEDAejj\u6GW\WcWcVddefg	h 	34	Gk;7FEK()67K())9:;!&TYYuKF	HVHBvha
()r   c                 R   |t        | |      | D cg c]&  }|j                  |j                  |j                  d( c}|D cg c]1  }|j                  |j                  |j                  |j
                  d3 c}d}t        t        j                  |dd             y c c}w c c}w )Nr&   r9   )rP   rW   rJ   rK   F   )ensure_asciiindent)	rO   r   r   r	   r   r   rT   jsondumps)rJ   rK   rP   ireports        r   print_json_reportrc      s     #";<R]^QH^do
_`QVVQVV!++QRQYQYZ
	F 
$**V%
:; _
s   +B6B$
c                     t        j                  d      } | j                  ddd       | j                         }t        j                         s7t        dt         t        j                         t        j                  d	       t        t              \  }}}|j                  rt        |||       nt        |||       t        ||      }t        j                  |d
k(  rd       y d       y )Nu*   테스트-인터페이스 정합성 점검)descriptionz--json
store_trueu   JSON 형식으로 출력)actionhelpu;   오류: 테스트 디렉터리를 찾을 수 없습니다: )r   r\   rN   r   r#   )argparseArgumentParseradd_argument
parse_args
TESTS_ROOTr.   rT   sysstderrexitrI   r_   rc   rZ   rO   )parserargsrJ   rK   rP   rW   s         r   mainrs      s    $$1]^F
<VWDKJ<X_b_i_ij,6z,B)Kkyy+{K@;[Ak;7FHH&D.Q(a(r   __main__)r   N)__doc__ri   r_   r:   rn   pathlibr   typingr   rm   compileHARDCODED_PATH_REr*   r;   r=   r   r   listr   r7   rA   tupler   rI   r   rO   rZ   rc   rs   r   r   r   r   <module>r|      s     	 
  -.
BJJab "**LMBJJ78 rzz+,
 
 *$ *4: *
4 DO  $4 $DO $N==
4	?DOS01=$y/ Y TW !*i!*i!* !* 
	!*H<i<i< < 
	< )( zF r   