
    i0-                         S SK r S SKJr  SSKJr  Sr " S S5      r " S S	\5      r " S
 S\5      r	 " S S\5      r
S rg)    N)PreOrderIter   )
ASSERTIONS   c                      ^  \ rS rSrSr0 rSU 4S jjrS rS rS r	S r
S rS	 r\S
 5       rS rS r\S 5       rSrU =r$ )Resolver
   z
Resolve :any:`NodeMixin` paths using attribute `pathattr`.

Keyword Args:
    name (str): Name of the node attribute to be used for resolving
    ignorecase (bool): Enable case insensisitve handling.
    relax (bool): Do not raise an exception.
c                 F   > [         TU ]  5         Xl        X l        X0l        g N)super__init__pathattr
ignorecaserelax)selfr   r   r   	__class__s       =/app/mltbenv/lib/python3.13/site-packages/anytree/resolver.pyr   Resolver.__init__   s     $
    c                    U R                  XU R                  5      u  pUc  U R                  (       a  gU HS  nUS:X  a1  UR                  nUc  U R                  (       a    g[	        U5      eUnM:  US;   a  MB  U R                  X5      nMU     U$ )a'  
Return instance at `path`.

An example module tree:

>>> from anytree import Node
>>> top = Node("top", parent=None)
>>> sub0 = Node("sub0", parent=top)
>>> sub0sub0 = Node("sub0sub0", parent=sub0)
>>> sub0sub1 = Node("sub0sub1", parent=sub0)
>>> sub1 = Node("sub1", parent=top)

A resolver using the `name` attribute:

>>> resolver = Resolver('name')
>>> relaxedresolver = Resolver('name', relax=True)  # never generate exceptions

Relative paths:

>>> resolver.get(top, "sub0/sub0sub0")
Node('/top/sub0/sub0sub0')
>>> resolver.get(sub1, "..")
Node('/top')
>>> resolver.get(sub1, "../sub0/sub0sub1")
Node('/top/sub0/sub0sub1')
>>> resolver.get(sub1, ".")
Node('/top/sub1')
>>> resolver.get(sub1, "")
Node('/top/sub1')
>>> resolver.get(top, "sub2")
Traceback (most recent call last):
  ...
anytree.resolver.ChildResolverError: Node('/top') has no child sub2. Children are: 'sub0', 'sub1'.
>>> print(relaxedresolver.get(top, "sub2"))
None

Absolute paths:

>>> resolver.get(sub0sub0, "/top")
Node('/top')
>>> resolver.get(sub0sub0, "/top/sub0")
Node('/top/sub0')
>>> resolver.get(sub0sub0, "/")
Traceback (most recent call last):
  ...
anytree.resolver.ResolverError: root node missing. root is '/top'.
>>> print(relaxedresolver.get(sub0sub0, "/"))
None
>>> resolver.get(sub0sub0, "/bar")
Traceback (most recent call last):
  ...
anytree.resolver.ResolverError: unknown root node '/bar'. root is '/top'.
>>> print(relaxedresolver.get(sub0sub0, "/bar"))
None

Going above the root node raises a :any:`RootResolverError`:

>>> resolver.get(top, "..")
Traceback (most recent call last):
    ...
anytree.resolver.RootResolverError: Cannot go above root node Node('/top')

.. note:: Please not that :any:`get()` returned `None` in exactly that case above,
          which was a bug until version 1.8.1.

Case insensitive matching:

>>> resolver.get(top, '/TOP')
Traceback (most recent call last):
    ...
anytree.resolver.ResolverError: unknown root node '/TOP'. root is '/top'.

>>> ignorecaseresolver = Resolver('name', ignorecase=True)
>>> ignorecaseresolver.get(top, '/TOp')
Node('/top')
N.. .)_Resolver__start_Resolver__cmpr   parentRootResolverError_Resolver__get)r   nodepathpartspartr   s         r   getResolver.get   s    Z ll4tzz:<DJJDt|>zz#+D11"zz$-  r   c                     [        U5      nUR                   H1  nU R                  [        X@R                  5      U5      (       d  M/  Us  $    U R
                  (       a  g [        XU R                  5      er   )strchildrenr   _getattrr   r   ChildResolverError)r   r    namenamestrchilds        r   __getResolver.__getz   sU    d)]]Ezz(5--8'BB # :: T]];;r   c                     U R                  XU R                  5      u  pUc  U R                  (       a  / $ U R                  X5      $ )a  
Return instances at `path` supporting wildcards.

Behaves identical to :any:`get`, but accepts wildcards and returns
a list of found nodes.

* `*` matches any characters, except '/'.
* `?` matches a single character, except '/'.

An example module tree:

>>> from anytree import Node
>>> top = Node("top", parent=None)
>>> sub0 = Node("sub0", parent=top)
>>> sub0sub0 = Node("sub0", parent=sub0)
>>> sub0sub1 = Node("sub1", parent=sub0)
>>> sub1 = Node("sub1", parent=top)
>>> sub1sub0 = Node("sub0", parent=sub1)

A resolver using the `name` attribute:

>>> resolver = Resolver('name')
>>> relaxedresolver = Resolver('name', relax=True)  # never generate exceptions

Relative paths:

>>> resolver.glob(top, "sub0/sub?")
[Node('/top/sub0/sub0'), Node('/top/sub0/sub1')]
>>> resolver.glob(sub1, ".././*")
[Node('/top/sub0'), Node('/top/sub1')]
>>> resolver.glob(top, "*/*")
[Node('/top/sub0/sub0'), Node('/top/sub0/sub1'), Node('/top/sub1/sub0')]
>>> resolver.glob(top, "*/sub0")
[Node('/top/sub0/sub0'), Node('/top/sub1/sub0')]
>>> resolver.glob(top, "sub1/sub1")
Traceback (most recent call last):
    ...
anytree.resolver.ChildResolverError: Node('/top/sub1') has no child sub1. Children are: 'sub0'.
>>> relaxedresolver.glob(top, "sub1/sub1")
[]

Non-matching wildcards are no error:

>>> resolver.glob(top, "bar*")
[]
>>> resolver.glob(top, "sub2")
Traceback (most recent call last):
  ...
anytree.resolver.ChildResolverError: Node('/top') has no child sub2. Children are: 'sub0', 'sub1'.
>>> relaxedresolver.glob(top, "sub2")
[]

Absolute paths:

>>> resolver.glob(sub0sub0, "/top/*")
[Node('/top/sub0'), Node('/top/sub1')]
>>> resolver.glob(sub0sub0, "/")
Traceback (most recent call last):
  ...
anytree.resolver.ResolverError: root node missing. root is '/top'.
>>> relaxedresolver.glob(sub0sub0, "/")
[]
>>> resolver.glob(sub0sub0, "/bar")
Traceback (most recent call last):
  ...
anytree.resolver.ResolverError: unknown root node '/bar'. root is '/top'.

Going above the root node raises a :any:`RootResolverError`:

>>> resolver.glob(top, "..")
Traceback (most recent call last):
    ...
anytree.resolver.RootResolverError: Cannot go above root node Node('/top')
>>> relaxedresolver.glob(top, "..")
[]
)r   _Resolver__matchr   _Resolver__glob)r   r    r!   r"   s       r   globResolver.glob   s:    Z ll4t||<<DJJI{{4''r   c                    UR                   nUR                  U5      nUR                  U5      (       a  UR                  n[	        XR
                  5      nUR                  S5        US   (       d.  U R                  (       a  gSn[        USXt[        U5      4-  5      eU" XeS   5      (       d3  U R                  (       a  gSn[        USXtUS   U[        U5      4-  5      eUR                  S5        X4$ )Nr   )NNz"root node missing. root is '%s%s'.r   z)unknown root node '%s%s'. root is '%s%s'.)
	separatorsplit
startswithrootr)   r   popr   ResolverErrorr'   )r   r    r!   cmp_sepr"   rootpartmsgs           r   __startResolver.__start   s    nn

3??399Dmm4HIIaL8::%:#D"c#h-4H.HII(++::%A#D"c%(CX4W.WXXIIaL{r   c                 t   [         (       a  Uc   eU(       d  U/$ US   nUSS  nUS:X  a>  UR                  nUc  U R                  (       a  / $ [        U5      eU R	                  XT5      $ US;   a  U R	                  X5      $ US:X  aG  / n[        U5       H4  n U R	                  Xt5       H  nX;  d  M
  UR                  U5        M     M6     U$ U R                  XU5      nU(       dA  [        R                  U5      (       d'  U R                  (       d  [        XU R                  5      eU$ ! [         a     M  f = f)Nr   r   r   r   z**)r   r   r   r   r2   r   appendr*   _Resolver__findr   is_wildcardr   )	r   r    r"   r+   	remainderr   matchessubnodematchs	            r   __globResolver.__glob   s'   :###6MQx!"I	 4<[[F~::I'--;;v119;;t// 4<G'-!%W!@ /#NN51 "A . N++d)4x33D99$**$T?? * s   D)2D))
D76D7c                 N   / nUR                    H^  n[        XPR                  5      n U R                  Xb5      (       a/  U(       a  X@R	                  XS5      -  nMK  UR                  U5        M^  M`     U$ ! [         a'  n[        R                  U5      (       d  Ue S nAM  S nAff = fr   )	r(   r)   r   r1   r2   rC   r;   r   rE   )r   r    patrF   rG   r-   r+   excs           r   __findResolver.__find  s    ]]EE==1D<<** ;;u#@@u-	 + #  ! ++C00I 1s   0A3A33
B$=BB$c                 $    SU ;   =(       d    SU ;   $ )zReturn `True` is a wildcard.?* )r!   s    r   rE   Resolver.is_wildcard   s     d{)cTk)r   c                    X R                   4n [        R                  U   nUR                  U5      S L$ ! [         a    [        R	                  U5      n[        [        R                  5      [        :  a  [        R                  R                  5         SnU R                   (       a  U[        R                  -  n[        R                  " XVS9=[        R                  U'   n Nf = f)Nr   )flags)r   r   _match_cacheKeyError_Resolver__translatelen	_MAXCACHEclearre
IGNORECASEcompilerI   )r   r+   rM   kre_patresrW   s          r   __matchResolver.__match%  s    //"		M**1-F ||D!--  	M&&s+C8(()Y6%%++-E&02

30LLH!!!$v	Ms   5 B+C#"C#c                 n    U R                   (       a!  UR                  5       UR                  5       :H  $ X:H  $ r   )r   upper)r   r+   rM   s      r   __cmpResolver.__cmp3  s(    ??::<399;..{r   c                     SnU  H6  nUS:X  a  US-  nM  US:X  a  US-  nM  U[         R                  " U5      -  nM8     SU-   S-   $ )Nr   rS   z.*rR   r   z(?ms)z\Z)r^   escape)rM   rb   chars      r   __translateResolver.__translate8  sU    Ds{$#"))D/)  & 5((r   )r   r   r   )r+   FF)__name__
__module____qualname____firstlineno____doc__rX   r   r$   r   r3   r   r2   rD   staticmethodrE   r1   r   rZ   __static_attributes____classcell__r   s   @r   r   r   
   si     L\|<P(d*%N * *.
 	) 	)r   r   c                   (   ^  \ rS rSrU 4S jrSrU =r$ )r;   iE  c                 <   > [         TU ]  U5        Xl        X l        g)z)Resolve Error at `node` handling `child`.N)r   r   r    r-   )r   r    r-   r?   r   s       r   r   ResolverError.__init__F  s    	
r   )r-   r    ro   rp   rq   rr   r   ru   rv   rw   s   @r   r;   r;   E  s     r   r;   c                   (   ^  \ rS rSrU 4S jrSrU =r$ )r   iM  c                 4   > SU< 3n[         TU ]  USU5        g)z.Root Resolve Error, cannot go above root node.zCannot go above root node N)r   r   )r   r9   r?   r   s      r   r   RootResolverError.__init__N  s     *4(3tS)r   rT   r{   rw   s   @r   r   r   M  s    * *r   r   c                   (   ^  \ rS rSrU 4S jrSrU =r$ )r*   iT  c           	         > UR                    Vs/ s H  n[        [        XC5      5      PM     nnSR                  XSR	                  U5      5      n[
        TU ]  XU5        gs  snf )z/Child Resolve Error at `node` handling `child`.z'{!r} has no child {}. Children are: {}.z, N)r(   reprr)   formatjoinr   r   )r   r    r-   r   cnamesr?   r   s          r   r   ChildResolverError.__init__U  sV    6:mmDmhq+,mD7>>tDIIV[L\]c* Es   A"rT   r{   rw   s   @r   r*   r*   T  s    + +r   r*   c                 ,    [        [        XS 5      5      $ r   )r'   getattr)r    r+   s     r   r)   r)   \  s    wt4())r   )r^   anytree.iterators.preorderiterr   configr   r\   r   RuntimeErrorr;   r   r*   r)   rT   r   r   <module>r      sI    	 7 	x) x)v	L * *+ +*r   