
    ^j0-                         d dl Z d dlmZ ddlmZ dZ G d d      Z G d d	e      Z G d
 de      Z	 G d de      Z
d Zy)    N)PreOrderIter   )
ASSERTIONS   c                   x     e Zd ZdZi Zd fd	Zd Zd Zd Zd Z	d Z
d Zed	        Zd
 Zd Zed        Z xZS )Resolvera  
    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                 L    t         |           || _        || _        || _        y N)super__init__pathattr
ignorecaserelax)selfr   r   r   	__class__s       I/opt/ringagent/.cad-venv/lib/python3.12/site-packages/anytree/resolver.pyr   zResolver.__init__   s#     $
    c                     | j                  ||| j                        \  }}|| j                  ry|D ]H  }|dk(  r*|j                  }|| j                  r yt	        |      |}2|dv r7| j                  ||      }J |S )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   getzResolver.get   s    Z ll4tzz:e<DJJ 	.Dt|>zz#+D11"zz$-	. r   c                     t        |      }|j                  D ],  }| j                  t        || j                        |      s*|c S  | j
                  ry t        ||| j                        r
   )strchildrenr   _getattrr   r   ChildResolverError)r   r   namenamestrchilds        r   __getzResolver.__getz   s[    d)]] 	Ezz(5$--8'B	 :: tT]];;r   c                     | j                  ||| j                        \  }}|| j                  rg S | j                  ||      S )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   globzResolver.glob   s@    Z ll4t||<e<DJJI{{4''r   c                    |j                   }|j                  |      }|j                  |      r|j                  }t	        || j
                        }|j                  d       |d   s*| j                  ryd}t        |d||t        |      fz         |||d         s/| j                  ryd}t        |d|||d   |t        |      fz        |j                  d       ||fS )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   __startzResolver.__start   s    nn

3??399Ddmm4HIIaL8::%:#D"cS#h-4H.HII%(+::%A#D"cS%(CX4W.WXXIIaLU{r   c                 &   t         r|J |s|gS |d   }|dd  }|dk(  r9|j                  }|| j                  rg S t        |      | j	                  ||      S |dv r| j	                  ||      S |dk(  rBg }t        |      D ]0  }	 | j	                  ||      D ]  }||vs|j                  |        2 |S | j                  |||      }|s8t        j                  |      s#| j                  st        ||| j                        |S # t        $ r Y w xY w)Nr   r   r   r   z**)r   r   r   r   r.   r   appendr'   _Resolver__findr   is_wildcardr   )	r   r   r    r(   	remainderr   matchessubnodematchs	            r   __globzResolver.__glob   s7   ###6MQx!"I	 4<[[F~::I'--;;vy119;;tY// 4<G'- !%Wi!@ 2 /#NN512 N++dD)4x33D9$**$T4?? * s   DD	DDc                 *   g }|j                   D ]T  }t        || j                        }	 | j                  ||      r)|r|| j	                  ||      z  }n|j                  |       V |S # t        $ r!}t        j                  |      s|Y d }~~d }~ww xY wr
   )	r%   r&   r   r-   r.   r=   r6   r   r?   )r   r   patr@   rA   r*   r(   excs           r   __findzResolver.__find  s    ]] 
	EE4==1D<<c* 4;;ui#@@u-
	  ! ++C0I 1s   ;A((	B1BBc                     d| v xs d| v S )zReturn `True` is a wildcard.?* )r   s    r   r?   zResolver.is_wildcard   s     d{)cTk)r   c                    || j                   f}	 t        j                  |   }|j                  |      d uS # t        $ r t        j	                  |      }t        t        j                        t        k\  rt        j                  j                          d}| j                   r|t        j                  z  }t        j                  ||      xt        j                  |<   }Y w xY w)Nr   )flags)r   r   _match_cacheKeyError_Resolver__translatelen	_MAXCACHEclearre
IGNORECASEcompilerC   )r   r(   rF   kre_patresrN   s          r   __matchzResolver.__match%  s    $//"		M**1-F ||D!--  	M&&s+C8(()Y6%%++-E&02

3e0LLH!!!$v	Ms   6 B'C C c                 f    | j                   r!|j                         |j                         k(  S ||k(  S r
   )r   upper)r   r(   rF   s      r   __cmpzResolver.__cmp3  s*    ??::<399;..s{r   c                     d}| D ]0  }|dk(  r|dz  }|dk(  r|dz  }|t        j                  |      z  }2 d|z   dz   S )Nr   rK   z.*rJ   r   z(?ms)z\Z)rU   escape)rF   rY   chars      r   __translatezResolver.__translate8  sZ     	*Ds{$#"))D/)	* & 5((r   )r(   FF)__name__
__module____qualname____doc__rO   r   r"   r   r/   r   r.   r>   staticmethodr?   r-   r   rQ   __classcell__r   s   @r   r   r   
   si     L\|<P(d*%N * *.
 	) 	)r   r   c                        e Zd Z fdZ xZS )r6   c                 @    t         |   |       || _        || _        y)z)Resolve Error at `node` handling `child`.N)r   r   r   r*   )r   r   r*   r:   r   s       r   r   zResolverError.__init__F  s    	
r   rc   rd   re   r   rh   ri   s   @r   r6   r6   E  s     r   r6   c                        e Zd Z fdZ xZS )r   c                 2    d|}t         |   |d|       y)z.Root Resolve Error, cannot go above root node.zCannot go above root node N)r   r   )r   r4   r:   r   s      r   r   zRootResolverError.__init__N  s     *4(3tS)r   rl   ri   s   @r   r   r   M  s    * *r   r   c                        e Zd Z fdZ xZS )r'   c           	          |j                   D cg c]  }t        t        ||             }}dj                  ||dj	                  |            }t
        |   |||       yc c}w )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   zChildResolverError.__init__U  s[    6:mmDhq(+,DD7>>tUDIIV[L\]uc* Es   A"rl   ri   s   @r   r'   r'   T  s    + +r   r'   c                 .    t        t        | |d             S r
   )r$   getattr)r   r(   s     r   r&   r&   \  s    wtT4())r   )rU   anytree.iterators.preorderiterr   configr   rS   r   RuntimeErrorr6   r   r'   r&   rL   r   r   <module>r{      sI    	 7 	x) x)v	L * *+ +*r   