
    iKj:                        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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     c/Users/ahmed/devFolder/Ultron/claude-voice/.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                 6    t        |t              st        S | |u S r   )
isinstancer   NotImplementedr    r,   s     r!   __eq__zNodeAccessor.__eq__(   s    %.!! u}r#   c                 ,    t         j                  |       S r   )object__hash__r&   s    r!   r4   zNodeAccessor.__hash__3   s    t$$r#   Nc                     t         r   NotImplementedErrorr*   s     r!   statzNodeAccessor.stat6       !!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.
        r6   r*   s     r!   keyszNodeAccessor.keys9   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)KeyErrorr7   r;   
IndexError	TypeError_is_traversable_noder    r'   r   s      r!   is_traversablezNodeAccessor.is_traversable@   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_subnoder=   r>   r?   r7   r;   )r    r'   rC   parents       r!   containszNodeAccessor.containsb   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)rE   r=   r7   r;   )r    r'   rC   rF   excr;   s         r!   require_childzNodeAccessor.require_child|   sx    
	$ %[F-!!&#. -sm,-" 	$99U#D$sm# 	$s#   8  	5058 )A$#A$c                     t         r   r6   r*   s     r!   lenzNodeAccessor.len   r9   r#   c                 .    | |   }| j                  |      S r   
_read_noderA   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   r6   clsr   s     r!   r@   z!NodeAccessor._is_traversable_node       !!r#   c                 B    |}| j                   }|D ]  } |||      } |S r   )rE   )rW   r   r'   currentget_subnodeparts         r!   r)   zNodeAccessor._get_node   s-    &&D!'40G r#   c                     t         r   r6   rV   s     r!   rO   zNodeAccessor._read_node   rX   r#   r\   c                     t         r   r6   )rW   r   r\   s      r!   rE   zNodeAccessor._get_subnode   rX   r#   )!__name__
__module____qualname____doc__r   r"   propertyr   r   r   r+   r3   r   r1   intr4   dictstrr8   r;   boolrB   rG   rJ   rL   r   rP   rT   classmethodr@   r)   rO   rE   rS   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defdZ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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$   c                     t        |t              st        S t        |       t        |      u xr | j                  |j                  k(  S r   )r.   rj   r/   typer   r0   s     r!   r1   zPathAccessor.__eq__   s9    %.!!
 DzT%[(FTZZ5;;-FFr#   c                 B    t        t        |       | j                  f      S r   )hashrl   r   r&   s    r!   r4   zPathAccessor.__hash__   s    T$Z,--r#   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   joinpathr8   OSErrordir
startswithgetattr)r    r'   subpathr8   rC   s        r!   r8   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NotADirectoryErrorr=   )r    r'   rw   pathrI   s        r!   r;   zPathAccessor.keys   si     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)r8   S_ISDIRlstatst_moders   rV   s     r!   r@   z!PathAccessor._is_traversable_node   s4    	<<

 4 455 		s   ,/ 	;;rC   c                 R    	 | |   }||z  j                         S # t         $ r Y yw xY wr   )r=   exists)r    r'   rC   rw   s       r!   rG   zPathAccessor.contains   s9    	5kG #%%''  		s    	&&c                     | |   }|j                         s|rt        |d         t        ||z  }|j                         st        |      y ry   )is_dirr=   r   )r    r'   rC   rw   childs        r!   rJ   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)   NrS   ).0_s     r!   	<genexpr>z#PathAccessor.len.<locals>.<genexpr>   s     4"3Qq"3s   rz   )sumr{   r}   r~   r=   )r    r'   rw   rI   s       r!   rL   zPathAccessor.len   s\     u+	$4'//"3444!#56 	$uRy)s2#	$s   ' AAAc                 .    | |   }| j                  |      S r   rN   rA   s      r!   rP   zPathAccessor.read   rQ   r#   c                 "    |j                         S r   )
read_bytesrV   s     r!   rO   zPathAccessor._read_node  s      r#   r\   c                 F    ||z  }|j                         st        |      |S r   )r   r=   )rW   r   r\   subnodes       r!   rE   zPathAccessor._get_subnode  s$    +~~4. r#   )r_   r`   ra   r3   r   r1   rd   r4   r   rf   re   r8   r;   rh   r   rg   r@   rG   rJ   rL   bytesrP   rO   rE   rS   r#   r!   rj   rj      s:   GF Gs G.# .

(3- 

DcNT,A 

	$(3- 	$HSM 	$    (hsm (# ($ ( 8C=  s  t  	$# 	$3 	$%(3- %E % !d !u ! !  C D  r#   rj   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   r\   r$   c                     t        |t              st        |      	 ||   S # t        t        t        f$ r}t        |      |d }~ww xY wr   )r.   r   r=   r>   r?   )rW   r   r\   rI   s       r!   rE   z"SubscriptableAccessor._get_subnode  sJ     $.4. 	*:*i0 	*4.c)	*s   " AAAN)	r_   r`   ra   rb   rh   r   r   r   rE   rS   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_cache3  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   rO   r   move_to_endr=   rL   popitem)r    r'   rC   r   values        r!   rP   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`   ra   r   r   r   r"   r   r   rd   r   r   rP   __classcell__)r   s   @r!   r   r     s\    G]384s: G
 58 sTz D (3- C r#   r   c                       e Zd ZdedefdZdef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                     t        |t              st        S t        |       t        |      u xr | j                  |j                  u S r   )r.   r   r/   rl   r   r0   s     r!   r1   zLookupAccessor.__eq__[  s9    %0!! DzT%[(FTZZ5;;-FFr#   c                 T    t        t        |       t        | j                        f      S r   )rn   rl   idr   r&   s    r!   r4   zLookupAccessor.__hash__f  s    T$ZDJJ011r#   r   c                 0    t        |t        t        z        S r   )r.   r   listrV   s     r!   r@   z#LookupAccessor._is_traversable_nodei  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)NrS   )rl   length)r=   r   r   rL   r?   rl   r_   )r    r'   r   r   s       r!   r8   zLookupAccessor.statm  s    	;D
 VTV#T" YF
 J''
 	
  		 ! "!F"s"   A A' 	A$#A$'A54A5rC   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)NFrS   r   )r=   r   r   r.   rd   rL   r    r'   rC   r   itemss        r!   rG   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        |      )NrS   r   )r   r=   r   r.   rd   rL   r   s        r!   rJ   zLookupAccessor.require_child  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
        )NrS   rz   )r   r   r;   rangerL   r=   )r    r'   r   r   s       r!   r;   zLookupAccessor.keys  sf    E{DIIK((  E#e*-.. ! 59%%r#   c                 p    | |   }| j                  |      rt        |      S |rt        |d         t        ry   )r@   rL   r=   rA   s      r!   rL   zLookupAccessor.len  s:    E{$$T*t959%%r#   c                     |S r   rS   rV   s     r!   rO   zLookupAccessor._read_node  s    r#   )r_   r`   ra   r3   r   r1   rd   r4   rh   r   rg   r@   r   r   re   rf   r8   rG   rJ   r;   rL   r   rO   rS   r#   r!   r   r   Y  s   	GF 	Gs 	G2# 2 0
 0t 0 0
(9- 
$sCx.42G 
*hy1 	 d $i($/8$	$$
(9- 
(92E 
),   j [  r#   r   )"rb   r8   collectionsr   collections.abcr   r   r   pathlibr   typingr   r	   r
   pathable.protocolsr   pathable.typesr   r   r   r   r   r   r   r   r   r   r   rf   r   rj   r   r   r   rS   r#   r!   <module>r      s'     # $ # $     , $ % &Cxt4C4 CLT6TT"e848et$U"71a7# U"pW<c5 01 Wt*r2v&+R34gb"fo*"8#s(#WS#X%68va0K1GH ar#   