
    &<i              	           d Z ddlZddlZddlZddgZ ej
                  e      Zdededede	fd	Z
d
edededee   fdZy)u,  event_bus.py — 원자적 이벤트 소비 모듈.

POSIX rename()의 원자성을 이용해 동일 파일시스템 내에서
두 프로세스가 동시에 같은 이벤트를 소비하려 해도 한 쪽만 성공하도록 보장한다.

작성자 : 토르 (dev2-team backend)
날짜   : 2026-03-24
    Nconsume_eventscan_done_eventsincoming_dirprocessed_dir
event_filereturnc                    t         j                  j                  | |      }t         j                  j                  ||      }t         j                  j                  |      rt        j                  d|       y	 t        j                  ||       y# t        $ r t        j                  d|       Y yt        $ r!}t        j                  d||       Y d}~yd}~ww xY w)u>  원자적으로 이벤트를 소비한다. 성공 시 True, 이미 소비됨/거부 시 False.

    Args:
        incoming_dir: 미처리 이벤트 파일이 위치한 디렉터리 경로.
        processed_dir: 처리 완료된 이벤트 파일을 이동할 디렉터리 경로.
        event_file: 이벤트 파일 이름 (디렉터리 구분자 없는 순수 파일명).

    Returns:
        True  — 이 프로세스가 이벤트를 성공적으로 소비함.
        False — 이미 다른 프로세스가 선점했거나, 보안 거부(symlink), 기타 오류.
    uN   보안 거부: '%s' 는 symlink입니다. 이벤트 소비를 건너뜁니다.FTud   이벤트 파일 '%s' 을 찾을 수 없습니다. 다른 프로세스가 이미 소비했습니다.u8   이벤트 소비 중 OS 오류 발생 (파일: '%s'): %sN)ospathjoinislinkloggerwarningrenameFileNotFoundErrorinfoOSErrorerror)r   r   r   src_pathdst_pathexcs         G/home/jay/workspace/.worktrees/task-2057-dev2/orchestrator/event_bus.pyr   r      s     ww||L*5Hww||M:6H 
ww~~hgiqr 			(H% r	
  OQY[^_s   8B C0C8CC
events_dirc                 n   t         j                  j                  |       sg S g }t        j                  |       D ]x  }|j                  }|j                  d      st        j                  d|       8|j                         r!t        j                  d|j                         it         j                  j                  t         j                  j                  ||            rt        j                  d|       t         j                  j                  t         j                  j                  ||            rt        j                  d|       t         j                  j                  ||      }t        j                  |j                  |       t        j                  d|       |j                  |       { |S )uq  memory/events/*.done 파일을 스캔하여 incoming/으로 복사한다.

    Layer 2↔3 통합의 핵심: .done 파일 원본을 보존하면서 incoming/으로 복사하여
    auto_orch.py가 파이프라인 트리거를 평가할 수 있게 한다.

    Args:
        events_dir: .done 파일이 생성되는 원본 디렉토리 (memory/events/)
        incoming_dir: 미처리 이벤트 복사 대상 디렉토리 (orchestrator/incoming/)
        processed_dir: 처리 완료된 이벤트 디렉토리 (orchestrator/processed/)

    Returns:
        이번 호출에서 새로 복사된 이벤트 파일명 목록
    z.doneuF   패턴 불일치: '%s' 는 .done으로 끝나지 않음 — 건너뜀.uN   보안 거부: '%s' 는 symlink입니다. scan_done_events가 건너뜁니다.u?   중복 건너뜀: '%s' 가 이미 incoming/에 존재합니다.u@   중복 건너뜀: '%s' 가 이미 processed/에 존재합니다.u=   이벤트 파일 '%s' 을 incoming/으로 복사했습니다.)r
   r   isdirscandirnameendswithr   debug
is_symlinkr   existsr   shutilcopy2r   append)r   r   r   copiedentryfnamer   s          r   r   r   8   s:    77==$	FJ' 

 ~~g&LLachi NN`

  77>>"'',,|U;<LLZ\ab77>>"'',,}e<=LL[]bc 77<<e4UZZ*SUZ[e;> M    )__doc__loggingr
   r"   __all__	getLogger__name__r   strboolr   listr    r(   r   <module>r2      s|     	 .
/			8	$" "C "S "T "J2 2C 2 2PTUXPY 2r(   