
    lin3                        d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ dd	l
mZ dd
l
mZ ddlmZ ddlmZ ddlmZ ddlmZ  eded      Z edd      Z ed      Z eded      Z edd      Z eded      Z edd      Z G d deeeef         Z G d dee	eef         Z G d deeeef   ez  eef   eeef         Z G d d eeef   eeef         Z  G d! d"e eef         Z!y)#zPathable accessors module    N)OrderedDict)Hashable)Mapping)Sequence)Path)Any)Generic)TypeVar)Subscriptable)	LookupKey)
LookupNode)LookupValueKT)boundcontravariantV)	covariantNSKSVCSKCSVc                      e Zd ZdZdefdZedefd       Zdee	   defdZ
dedefd	Zdee	   deeef   d
z  fdZdee	   dee	   fdZdee	   defdZdee	   de	defdZdee	   de	dd
fdZdee	   defdZdee	   defdZdee	   dd
fdZededefd       Zededee	   defd       Zededefd       Zedede	defd       Zy
)NodeAccessorzNode accessor.nodec                     || _         y N_node)selfr   s     N/mnt/e/genesis-system/.venv/lib/python3.12/site-packages/pathable/accessors.py__init__zNodeAccessor.__init__   s	    
    returnc                     | j                   S r   r   r    s    r!   r   zNodeAccessor.node!   s    zzr#   partsc                 :    | j                  | j                  |      S r   )	_get_noder   r    r'   s     r!   __getitem__zNodeAccessor.__getitem__%   s    ~~dii//r#   otherc                 `    t        |t              st        S | j                  |j                  k(  S r   )
isinstancer   NotImplementedr   )r    r,   s     r!   __eq__zNodeAccessor.__eq__(   s%    %.!!yyEJJ&&r#   Nc                     t         r   NotImplementedErrorr*   s     r!   statzNodeAccessor.stat-       !!r#   c                     t         )zReturn the keys of the node at `parts` if it is traversable, or raise `KeyError` if not.

        This performs a segment-by-segment traversal and raises `KeyError` with the failing segment if any part is missing or non-traversable.
        r2   r*   s     r!   keyszNodeAccessor.keys0   s
    
 "!r#   c                 J   	 | |   }	 | j                  |      S # t         $ r Y yt        $ r5 	 | j                  |       Y y# t         t        t        t        f$ r Y Y yw xY ww xY w# t        $ r5 	 | j                  |       Y y# t         t        t        t        f$ r Y Y yw xY ww xY w)aN  Return True if the node at `parts` can enumerate child keys.

        This is intended for control-flow ("can I call keys()/len()/iterate?")
        and must not raise for missing or non-traversable paths, but may raise
        OSError for permission or I/O errors.

        The default implementation attempts a cheap node inspection via
        `_is_traversable_node` after traversing to the node. If that is not
        implemented, it falls back to calling `keys()`.

        Note: the fallback may be expensive for accessors where `keys()`
        enumerates large containers.
        FT)KeyErrorr3   r7   
IndexError	TypeError_is_traversable_noder    r'   r   s      r!   is_traversablezNodeAccessor.is_traversable7   s    		;D	,,T22  	" 			%   j)5HI 	 # 			%   j)5HI 	sT    A$ 	A!A!A  AA!AA!$	B".BBB"BB"keyc                     	 | |   }	 | j                  ||       y# t        t        t        f$ r Y yw xY w# t        $ r Y yt        $ r2 	 || j                  |      v cY S # t        t        t        f$ r Y Y yw xY ww xY w)a  Return True if `key` is a valid child of the node at `parts`.

        The default implementation tries to validate membership by traversing
        a single step (fast for accessors that implement `_get_subnode`). If
        traversal isn't available, it falls back to `keys()` for compatibility
        with accessors that only define enumeration.

        This method is intended to be used for membership checks (e.g. `key in
        path`) where errors should not be raised.
        FT)_get_subnoder9   r:   r;   r3   r7   )r    r'   r?   parents       r!   containszNodeAccessor.containsY   s    	%[F!!&#.  j)4   	" 	dii...j)4 	sG   5  25 25 	A: A:	AA:A62A:5A66A:c                     	 | |   }	 | j                  ||       y# t        $ r}t        |      |d}~ww xY w# t        $ r# | j                  |      }||vrt        |      Y yw xY w)zwAssert that `key` is a valid child of the node at `parts`.

        Raises `KeyError` with stable diagnostics.
        N)rA   r9   r3   r7   )r    r'   r?   rB   excr7   s         r!   require_childzNodeAccessor.require_childs   sx    
	$ %[F-!!&#. -sm,-" 	$99U#D$sm# 	$s#   8  	5058 )A$#A$c                     t         r   r2   r*   s     r!   lenzNodeAccessor.len   r5   r#   c                 .    | |   }| j                  |      S r   
_read_noder=   s      r!   readzNodeAccessor.read       E{t$$r#   c                     | |    y)zValidate that the node at `parts` exists.

        This performs a traversal only and raises `KeyError` (with the failing
        part when available) if the path is missing or non-traversable.
        N r*   s     r!   validatezNodeAccessor.validate   s     	Ur#   c                     t         r   r2   clsr   s     r!   r<   z!NodeAccessor._is_traversable_node       !!r#   c                 B    |}| j                   }|D ]  } |||      } |S r   )rA   )rS   r   r'   currentget_subnodeparts         r!   r)   zNodeAccessor._get_node   s2    && 	1D!'40G	1r#   c                     t         r   r2   rR   s     r!   rK   zNodeAccessor._read_node   rT   r#   rX   c                     t         r   r2   )rS   r   rX   s      r!   rA   zNodeAccessor._get_subnode   rT   r#   ) __name__
__module____qualname____doc__r   r"   propertyr   r   r   r+   objectr   r0   dictstrr4   r7   boolr>   rC   rF   intrH   r   rL   rP   classmethodr<   r)   rK   rA   rO   r#   r!   r   r      s   Q  a  0! 0 0'F 's '
"(1+ "$sCx.4*? ""(1+ "(1+ " HQK  D  Dhqk  d 4$8A; $Q $4 $&"! " "%(1+ %! %hqk d  " "d " " Q x{ q   "a "A " " " " "q " "r#   r   c                       e Zd Zdee   deeef   dz  fdZdee   dee   fdZe	de
defd       Zdee   dedefd	Zdee   deddfd
Zdee   defdZdee   defdZe	de
defd       Ze	de
dede
fd       Zy)PathAccessorr'   r$   Nc                      | j                   j                  | }	 |j                  d      }t	        |      D ci c]   }|j                  d      r|t        ||      " c}S # t        $ r Y y w xY wc c}w )NF)follow_symlinksst_)r   joinpathr4   OSErrordir
startswithgetattr)r    r'   subpathr4   r?   s        r!   r4   zPathAccessor.stat   s~    $$))$$e,	<<<6D
 4y
~~e$ s##
 	
  		
s   A" %A1"	A.-A.c                     | |   }	 |j                         D cg c]  }|j                   c}S c c}w # t        t        f$ r}|rt	        |d         |t        |d }~ww xY wN)iterdirnameFileNotFoundErrorNotADirectoryErrorr9   )r    r'   rp   pathrE   s        r!   r7   zPathAccessor.keys   sc     u+	$*1//*;<$DII<<<!#56 	$uRy)s2#	$s!   4 /4 4 A AA r   c                 |    	 t        j                  |j                         j                        S # t        $ r Y yw xY wNF)r4   S_ISDIRlstatst_moderl   rR   s     r!   r<   z!PathAccessor._is_traversable_node   s4    	<<

 4 455 		s   ,/ 	;;r?   c                 R    	 | |   }||z  j                         S # t         $ r Y yw xY wrz   )r9   exists)r    r'   r?   rp   s       r!   rC   zPathAccessor.contains   s9    	5kG #%%''  		s    	&&c                     | |   }|j                         s|rt        |d         t        ||z  }|j                         st        |      y rr   )is_dirr9   r   )r    r'   r?   rp   childs        r!   rF   zPathAccessor.require_child   sM    u+~~uRy))N#||~3- r#   c                     | |   }	 t        d |j                         D              S # t        t        f$ r}|rt	        |d         |t        |d }~ww xY w)Nc              3       K   | ]  }d   yw)   NrO   ).0_s     r!   	<genexpr>z#PathAccessor.len.<locals>.<genexpr>   s     4Qq4s   rs   )sumrt   rv   rw   r9   )r    r'   rp   rE   s       r!   rH   zPathAccessor.len   s\     u+	$4'//"3444!#56 	$uRy)s2#	$s   ' AAAc                 .    | |   }| j                  |      S r   rJ   r=   s      r!   rL   zPathAccessor.read   rM   r#   c                 "    |j                         S r   )
read_bytesrR   s     r!   rK   zPathAccessor._read_node   s      r#   rX   c                 F    ||z  }|j                         st        |      |S r   )r   r9   )rS   r   rX   subnodes       r!   rA   zPathAccessor._get_subnode   s$    +~~4. r#   )r[   r\   r]   r   rb   ra   r   r4   r7   re   r   rc   r<   rC   rF   rd   rH   bytesrL   rK   rA   rO   r#   r!   rg   rg      s   

(3- 

DcNT,A 

	$(3- 	$HSM 	$    (hsm (# ($ ( 8C=  s  t  	$# 	$3 	$%(3- %E % !d !u ! !  C D  r#   rg   c            	       N    e Zd ZdZedeeef   ez  dedeeef   ez  fd       Zy)SubscriptableAccessorz#Accessor for subscriptable content.r   rX   r$   c                     t        |t              st        |      	 ||   S # t        t        t        f$ r}t        |      |d }~ww xY wr   )r.   r   r9   r:   r;   )rS   r   rX   rE   s       r!   rA   z"SubscriptableAccessor._get_subnode   sJ     $.4. 	*:*i0 	*4.c)	*s   " AAAN)	r[   r\   r]   r^   re   r   r   r   rA   rO   r#   r!   r   r      sM     .* R(2-*57*	r2v		#* *r#   r   c                   v     e Zd Zdeeef   ez  f fdZddZddZddd	e	dz  ddfd
Z
dee   defdZ xZS )CachedSubscriptableAccessorr   c                 ^    t         |   |       d| _        d| _        t	               | _        y )NT   )superr"   _cache_enabled_cache_maxsizer   _cache)r    r   	__class__s     r!   r"   z$CachedSubscriptableAccessor.__init__  s+     #*-9Dr#   r$   Nc                 8    | j                   j                          y)z2Clear any cached reads for this accessor instance.N)r   clearr&   s    r!   clear_cachez'CachedSubscriptableAccessor.clear_cache  s    r#   c                 F    d| _         | j                  j                          y)z+Disable caching for this accessor instance.FN)r   r   r   r&   s    r!   disable_cachez)CachedSubscriptableAccessor.disable_cache  s    #r#   r   )maxsizer   c                T    d| _         || _        | j                  j                          y)a  Enable caching for this accessor instance.

        Args:
            maxsize: Maximum number of distinct paths to cache.
                - 128 by default (matches functools.lru_cache)
                - None for unbounded
                - 0 to disable caching
        TN)r   r   r   r   )r    r   s     r!   enable_cachez(CachedSubscriptableAccessor.enable_cache  s$     #%r#   r'   c                    t        |      }| j                  r| j                  dk(  r| |   }| j                  |      S 	 | j                  |   }| j                  j                  |       |S # t        $ r( | |   }| j                  |      }|| j                  |<   Y nw xY w| j                  at        | j                        | j                  kD  r?| j                  j                  d       t        | j                        | j                  kD  r?|S )Nr   F)last)	tupler   r   rK   r   move_to_endr9   rH   popitem)r    r'   r?   r   values        r!   rL   z CachedSubscriptableAccessor.read+  s    El##(;(;q(@;D??4((		KK$E KK##C(L  	%;DOOD)E$DKK	% *dkk"T%8%88###/ dkk"T%8%88 s   A* *.BB)r$   N)r[   r\   r]   r   r   r   r"   r   r   rd   r   r   rL   __classcell__)r   s   @r!   r   r   	  s\    G]384s: G
 58 sTz D (3- C r#   r   c                       e Zd Zededefd       Zdee   de	e
ef   dz  fdZdee   dedefdZdee   deddfd	Zdee   dee   fd
Zdee   defdZededefd       Zy)LookupAccessorr   r$   c                 0    t        |t        t        z        S r   )r.   r   listrR   s     r!   r<   z#LookupAccessor._is_traversable_nodeF  s    $$//r#   r'   Nc                     	 | |   }|xt        d x\   n xt        d x\   n  n t        |      }n	 	 t        |      }t        |      j                  |dS # t         $ r Y y w xY w# t        $ r d }Y 4w xY w)NrO   )typelength)r9   r   r   rH   r;   r   r[   )r    r'   r   r   s       r!   r4   zLookupAccessor.statJ  s    	;D
 VTV#T" YF
 J''
 	
  		 ! "!F"s"   A A' 	A$#A$'A54A5r?   c                     	 | |   }|xt        d x\    ||v S  xt        d x.\   }t        |t              xr d|cxk  xr t        |      k  S c S   	 y# t         $ r Y yw xY w)NFrO   r   )r9   r   r   r.   rd   rH   r    r'   r?   r   itemss        r!   rC   zLookupAccessor.contains_  sy    	;D d{"  !#s+ES0E3u:0EE0EE !  		s   A 	A"!A"c                     | |   }|xt         d x\    ||vrt        |      y  xt        d x?\   }t        |t              r d|cxk  rt        |      k  st        |       t        |      y   	 t        |      )NrO   r   )r   r9   r   r.   rd   rH   r   s        r!   rF   zLookupAccessor.require_childm  s     E{d?"3-'  !"3,c1FCJ1F"3-' 2G"3-' ! sm#r#   c                     | |   }|xt         d x\    t        |j                               S  xt        d x \   }t        t        t	        |                  S   |rt        |d         t
        )NrO   rs   )r   r   r7   rangerH   r9   )r    r'   r   r   s       r!   r7   zLookupAccessor.keys  sf    E{DIIK((  E#e*-.. ! 59%%r#   c                 p    | |   }| j                  |      rt        |      S |rt        |d         t        rr   )r<   rH   r9   r=   s      r!   rH   zLookupAccessor.len  s:    E{$$T*t959%%r#   c                     |S r   rO   rR   s     r!   rK   zLookupAccessor._read_node  s    r#   )r[   r\   r]   re   r   rc   r<   r   r   ra   rb   r   r4   rC   rF   r7   rd   rH   r   rK   rO   r#   r!   r   r   D  s    0
 0t 0 0
(9- 
$sCx.42G 
*hy1 	 d $i($/8$	$$
(9- 
(92E 
),   j [  r#   r   )"r^   r4   collectionsr   collections.abcr   r   r   pathlibr   typingr   r	   r
   pathable.protocolsr   pathable.typesr   r   r   r   r   r   r   r   r   r   r   rb   r   rg   r   r   r   rO   r#   r!   <module>r      s'     # $ # $     , $ % &Cxt4C4 CLT6TT"e848et$L"71a7# L"^K<c5 01 K\*r2v&+R34gb"fo*"8#s(#WS#X%68vS0K1GH Sr#   