
    (<i'                         d Z ddlZddlZddlZddlmZ ddlmZmZ dddee	ef   ded	e
d
eddf
dZddddee	ef   dedededdf
dZdddee	ef   de	de	ddfdZy)u  원자적 파일 쓰기 유틸리티.

temp 파일 생성 → fsync → os.replace() 순서로 POSIX 원자적 쓰기를 구현합니다.
프로세스가 쓰기 도중 충돌하더라도 대상 파일은 항상 완전한 이전 버전 또는
완전한 새 버전을 유지합니다 (부분 쓰기 상태 없음).

BaseException 캐치로 KeyboardInterrupt / SystemExit 발생 시에도 임시 파일을
반드시 정리합니다.

Usage:
    from utils.atomic_write import atomic_json_write, atomic_yaml_write, atomic_text_write

    atomic_json_write("config.json", {"key": "value"})
    atomic_yaml_write("config.yaml", {"key": "value"})
    atomic_text_write("output.txt", "hello world")
    N)Path)AnyUnion   )indentpathdatar   dump_kwargsreturnc                T   t        |       }|j                  j                  dd       t        j                  t        |j                        d|j                   dd      \  }}	 t        j                  |dd	      5 }t        j                  ||f|d
d| |j                          t        j                  |j                                ddd       t        j                  ||       y# 1 sw Y    xY w# t        $ r' 	 t        j                   |        # t"        $ r Y  w xY ww xY w)u  JSON 데이터를 대상 경로에 원자적으로 씁니다.

    Args:
        path: 대상 파일 경로. 없으면 생성, 있으면 원자적으로 교체.
        data: JSON 직렬화 가능한 데이터.
        indent: JSON 들여쓰기 (기본값 2).
        **dump_kwargs: json.dump()에 전달할 추가 키워드 인수 (예: default=str).

    Raises:
        TypeError: data가 JSON 직렬화 불가능한 경우.
        OSError: 파일시스템 오류 발생 시.
    Tparentsexist_ok._.tmpdirprefixsuffixwutf-8encodingF)r   ensure_asciiN)r   parentmkdirtempfilemkstempstrstemosfdopenjsondumpflushfsyncfilenoreplaceBaseExceptionunlinkOSError)r   r	   r   r
   targetfdtmp_pathfs           C/home/jay/workspace/.worktrees/task-2057-dev2/utils/atomic_write.pyatomic_json_writer2      s   & $ZF
MMt4##6;;-q!LB
YYr31 	!QIIdAPf5PKPGGIHHQXXZ 	! 	

8V$		! 	!
  	IIh 	  			sI   &C7 >AC+C7 +C40C7 7	D'DD'	D# D'"D##D'Fdefault_flow_style	sort_keysr4   r5   c                R   ddl }t        |       }|j                  j                  dd       t	        j
                  t        |j                        d|j                   dd      \  }}	 t        j                  |d	d
      5 }|j                  ||||       |j                          t        j                  |j                                ddd       t        j                  ||       y# 1 sw Y    xY w# t        $ r' 	 t        j                   |        # t"        $ r Y  w xY ww xY w)u  YAML 데이터를 대상 경로에 원자적으로 씁니다.

    Args:
        path: 대상 파일 경로. 없으면 생성, 있으면 원자적으로 교체.
        data: YAML 직렬화 가능한 데이터.
        default_flow_style: YAML flow 스타일 사용 여부 (기본값 False).
        sort_keys: 딕셔너리 키 정렬 여부 (기본값 False).

    Raises:
        ImportError: PyYAML(yaml 패키지)이 설치되지 않은 경우.
        OSError: 파일시스템 오류 발생 시.
    r   NTr   r   r   r   r   r   r   r   r3   )yamlr   r   r   r   r   r    r!   r"   r#   r%   r&   r'   r(   r)   r*   r+   r,   )	r   r	   r4   r5   r7   r-   r.   r/   r0   s	            r1   atomic_yaml_writer8   C   s   & $ZF
MMt4##6;;-q!LB
YYr31 	!QIIdA2DPYIZGGIHHQXXZ 	! 	

8V$		! 	!
  	IIh 	  		sI   *C6 A	C*C6 *C3/C6 6	D& DD&	D"D&!D""D&r   r   textr   c                B   t        |       }|j                  j                  dd       t        j                  t        |j                        d|j                   dd      \  }}	 t        j                  |d|      5 }|j                  |       |j                          t        j                  |j                                d	d	d	       t        j                  ||       y	# 1 sw Y    xY w# t        $ r' 	 t        j                  |        # t         $ r Y  w xY ww xY w)
u=  텍스트를 대상 경로에 원자적으로 씁니다.

    Args:
        path: 대상 파일 경로. 없으면 생성, 있으면 원자적으로 교체.
        text: 쓸 문자열 내용.
        encoding: 파일 인코딩 (기본값 'utf-8').

    Raises:
        OSError: 파일시스템 오류 발생 시.
    Tr   r   r   r   r   r   r   N)r   r   r   r   r   r    r!   r"   r#   writer&   r'   r(   r)   r*   r+   r,   )r   r9   r   r-   r.   r/   r0   s          r1   atomic_text_writer<   n   s      $ZF
MMt4##6;;-q!LB
YYr32 	!aGGDMGGIHHQXXZ 	! 	

8V$		! 	!
  	IIh 	  		sI   &C. >AC"C. "C+'C. .	D8DD	DDDD)__doc__r$   r"   r   pathlibr   typingr   r   r    intr2   boolr8   r<        r1   <module>rD      s   "  	    	'
T	
'
' 	'
 ' 
'\  %(
T	
(
( 	(
 ( 
(^ 	#
T	
#
# 	#
 
#rC   