
    8Cf=                         d dl Zd dlmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZ  ed      Z G d d	      Z G d
 d      Zy)    N)	getLogger   )
RouteGroup)Line)REGEX_PARAM_NAMEREGEX_PARAM_NAME_EXTalphaextslugz
sanic.rootc            	          e Zd Z	 	 	 	 	 	 ddededdfdZdefdZdefdZedefd       Z	ede
fd	       Zd
 ZddZdej                  ej                   e   ej                   e   f   fdZdej                  ej                   e   ej                   e   ej                   e   f   fdZddZd Zedefd       Zed        Zd Zd Zd Zdej                  eee
e
e
eef   fdZdej                  e
df   fdZed        Zy)NodeNpartrootreturnc                    || _         || _        || _        || _        i | _        i | _        d| _        d| _        d| _        g | _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        || _        || _        y )Nr   F)r   r   parentparam	_childrenchildrenlevelbase_indentoffsetgroupsdynamicfirstlastchildren_basketedchildren_param_injectedhas_deferredequality_checkunquoterouter)selfr   r   r   r"   r   r!   s          R/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/sanic_routing/tree.py__init__zNode.__init__   s     		
.0-/
*,
	!&',$!#    c                 D     dj                   fddD              }d| dS )Nz, c              3   `   K   | ]%  }t        |      s|d v r| dt        |        ' yw))r   =N)getattr).0propr#   s     r$   	<genexpr>zNode.__str__.<locals>.<genexpr>,   s=      
tT"di&7 fAgdD)*+
s   +.)r   r   r   r   z<Node: >)join)r#   	internalss   ` r$   __str__zNode.__str__+   s/    II 
>
 
	
 1%%r&   c                     t        |       S N)strr#   s    r$   __repr__zNode.__repr__3   s    4yr&   c                     | j                   r/| j                   j                  s| j                   j                   dnd}| | j                   S )N. )r   r   identidx)r#   prefixs     r$   r:   z
Node.ident6   sK     {{4;;#3#3 {{  !# 	
 $(($$r&   c                     | j                   syt        | j                   j                  j                               j	                  | j
                        dz   S )Nr   )r   listr   keysindexr   r5   s    r$   r;   zNode.idx?   s>    {{DKK((--/066tyyAAEEr&   c                    t        | j                  j                         | j                        D ci c]  \  }}||
 c}}| _        | j                  rt        | j                  j                               }d| j                  |d      _        d| j                  |d      _        | j                  j                         D ]  }|j                           yyc c}}w )z
        Sort the children (if any), and set properties for easy checking
        # they are at the beginning or end of the line.
        keyTr   N)sortedr   items_sortingr   r>   r?   r   r   valuesfinalize_children)r#   kvr?   childs        r$   rI   zNode.finalize_childrenE   s     $DNN$8$8$:N
QAqD
 ==**,-D+/DMM$q'"(+/DMM$r(#(--/ *'')* 
s   Cc                     t         j                  d| j                  z  t        |       z          | j                  j                         D ]  }|j                           y)z5
        Visual display of the tree of nodes
        z    N)loggerinfor   r4   r   rH   displayr#   rL   s     r$   rP   zNode.displayU   sG     	Gdjj(3t945]]))+ 	EMMO	r&   c                     g }g }g }| j                   s| j                         \  }}}| j                  j                         D ]  }|j	                         \  }}||z  }||z  }! ||z   |fS r3   )r   to_srcr   rH   render)r#   srcdelayedfinalrL   ofs          r$   rT   zNode.render]   sz      " yy"&++-C%]]))+ 	E<<>DAq1HCQJE	 W}e##r&   c                 6   | j                   r| j                   j                  ni }d }| j                  s"t        t	        |j                                     }| j                   r=t        | j                  dk\  xs | j                        | j                   j                  z   nd| _        | j                  }g }g }g }|j                  t        d|             |j                  t        d| j                   d| j                   |             | j                  }|dz
  }| j                   }	d}
d}| j                  r1| j                  | j                   j                  k(  rdnd	}
|
dk(  | _        |j                  t        | d
|
 d| d|             |dz  }| j                  r| j#                  |||       |dz  }n| j                   s+| j                  r| j                  s|r|j                   | _        d}| j                  s| j                   sd| j                   nd}| xj                   t        |      z  c_        |j                  t        | d| d| j                   d| d|             | xj                  dz  c_        | j                  r||	z   }d}|}| j                   s;| j                  rdnd}d}
|j                  t        | d
|
 d| d|             |dz  }t%        | j                  | j&                        D ]  }d}|j(                  rd}| j+                  |||z   |       |j,                  r| j/                  |||z   |       |dz  }|dk(  r0t1        |j2                        dkD  rd}| j5                  |||z   |       | j7                  |||z   ||        |||fS )Nr   r   r9   z# node=z	 // part=r.   ifz==z>=z num  z:  # CHECK 1z and num == z parts[z] == ""z:  # CHECK 4elifz:  # CHECK 5rB   	route_idx)r   r   r   nextiterrH   boolr   r   appendr   r:   r   r   r   depthr    _inject_param_checkrE   _group_sortingrequirements_inject_requirementsregex_inject_regexlenroutes_inject_method_check_inject_return)r#   siblingsfirst_siblingindentrV   rW   rU   r   r;   return_bump	operationconditionalif_stmt	len_checkreturn_indentr_   locationgroup
group_bumps                      r$   rS   zNode.to_srco   s   +/;;4;;''B*.zz hoo&7!89M {{ q.DJJ/$++2I2II 	 !! !#  	

4F#$

4'$**YtyykBFKL

ai,,&	 ;; $

dkk.?.? ?TI"+t"3D

-uYKq|D	
 	!<< $$S&#6aKF ''KK

!&3&B&B# G }}T-@-@ tzzl+  4	?2JJiwse6$))Ai[ I" " ! ;;"[0M+,IH && )-f4 	&-uYKq|L% "1D1DE 
 %% +I-- -*"<e ;;&& -*"<e !OJ
 >c%,,&7!&; +I-- -*"<e
 ##mj8)U;B GU""r&   c                 6    || j                   |j                  <   y r3   )r   r   rQ   s     r$   	add_childzNode.add_child   s    %*uzz"r&   c           
         t        d|      t        d| d| j                  j                  j                   d| d|dz         t        d|      t        d|dz         t        d	|      g}| j                  rJ| j                  | j                  j                        r%|j                  t        d| d
| d|dz                | xj                  dz  c_        |j                  |       y)z6
        Try and cast relevant path segments.
        ztry:zbasket['__matches__'][z] = z(parts[z])r   zexcept ValueError:passelse:z"] = unquote(basket['__matches__'][N)	r   r   cast__name__r!   _cast_as_strrc   r   extend)r#   rx   rq   r;   liness        r$   re   zNode._inject_param_check  s    
  (T::??++,GC5<

 %v.!$&!

 <<D--djjoo>LL,SE 2558E=QJ 	Ar&   c                     t        j                  |       j                  d      }| t        t        t
        t        fv xs |t        u S )Nr   )tget_type_hintsgetr4   r
   r   r	   )r   return_type_hints     r$   r   zNode._cast_as_str  s=    ++D155h?S$..I2Bc2IIr&   c           	         t        |j                        D ]K  \  }}|dk(  rdnd}| j                  t        | d|j                   d|      t        d| |dz         g       M | j                  t        d|      t        d	|dz         g       y
)zY
        Sometimes we need to check the routing methods inside the generated src
        r   r[   r^   z method in :route_idx = r   r   zraise NoMethodN)	enumeraterl   r   r   methods)rx   rq   ry   irouteru   s         r$   rm   zNode._inject_method_check#  s    
 "%,,/ 
	HAu1fd&GOO");u}}oQ? <s+VaZ8
	 	Wf%%vz2	
r&   c                     |j                   rdnd}|j                  j                  rdnd| d}|j                  t	        d| j
                   |      t	        d| d|j                   d| d|      g       y	)
z=
        The return statement for the node if needed
        regex_routesdynamic_routesr9   []z	# Return zreturn router.z, basketN)ri   r"   stackingr   r   r:   segments)r#   rx   rq   r_   ry   rl   route_returns          r$   rn   zNode._inject_return:  s     $);;4D"\\22r!I;a8Hy-v6(%..1A'.2 		
r&   c                 $   t        |      D ]X  \  }}|dk(  rdnd}|j                  t        | d|j                   d|j                   d|      t        d| |dz         g       Z |j                  t        d	|      t        d
|dz         g       y)z
        Check any extra checks needed for a route. In path routing, for exampe,
        this is used for matching vhosts.
        r   r[   r^   z
 extra == z and method in r   r   r   r   zraise NotFoundN)r   r   r   rg   r   )r#   rx   rq   ry   rJ   r   rt   s          r$   rh   zNode._inject_requirementsM  s    
 "%( 	HAu"#q&$fKOO*m:e6H6H5I J--2]]O1>  L,vz:		 	g'&!4	
r&   c           	          |j                  t        d|j                   d|      t        d|      t        d|dz         g       y)z
        For any path matching that happens in the course of the tree (anything
        that has a path matching--<path:path>--or similar matching with regex
        delimiter)
        zmatch = router.matchers[z].match(path)z	if match:z(basket['__params__'] = match.groupdict()r   N)r   r   pattern_idx)r#   rx   rq   ry   s       r$   rj   zNode._inject_regexh  sX     	!--.m=  [&)>QJ	
r&   c                 J   |\  }}d}|j                   r|j                  j                  }t        |j                        |j                   |dz  |j
                  dz  t        |j                        t        |j                  xr t        d |j                  D                     |fS )zW
        Primarily use to sort nodes to determine the order of the nested tree
        r   rD   c              3   4   K   | ]  }|j                     y wr3   )ri   )r+   ry   s     r$   r-   z Node._sorting.<locals>.<genexpr>  s     $KUU[[$K   )	r   r   priorityrb   r   rd   rk   r   any)r#   itemrC   rL   type_s        r$   rG   zNode._sorting  s     
U==KK((E MMBJKK" K$Kell$K!K  

 
	
r&   .c                 P      fd}t        t        ||j                              }|S )z
        When multiple RouteGroups terminate on the same node, we want to
        evaluate them based upon the priority of the param matching types
        c                    d}| j                  d      r`| dd }d|v rW|j                  dd      \  }}	 t        j                  j                  j                               j                  |      }|dz  S |dz  S # t        $ r= t        t        j                  j                  j                                     }Y |dz  S w xY w)Nr   <r   rD   r   )	
startswithsplitr>   r"   regex_typesr?   r@   
ValueErrorrk   )segmentr   rC   
param_typer#   s       r$   get_typez%Node._group_sorting.<locals>.get_type  s    E!!#&am#:&)iiQ&7OCJ $T[[%<%<%A%A%C D J J&!
 2:52: & J #D)@)@)E)E)G$H I2:Js   <A: :?C ?C )tuplemapparts)r#   r   r   r   s   `   r$   rf   zNode._group_sorting  s$    	 Xtzz23r&   c                     | j                   s| j                  S t        d | j                   j                         D              S )Nc              3   4   K   | ]  }|j                     y wr3   )rd   )r+   rL   s     r$   r-   zNode.depth.<locals>.<genexpr>  s     D55;;Dr   )r   r   maxrH   r5   s    r$   rd   z
Node.depth  s1    ~~::DDNN,A,A,CDDDr&   )r9   FNNNFr   N)rL   r   r   N)r   
__module____qualname__r4   rb   r%   r1   r6   propertyr:   intr;   rI   rP   r   TupleListr   rT   rS   r|   re   staticmethodr   rm   rn   rh   rj   rG   rf   rd    r&   r$   r   r      s      
:& &#  %s % % FS F F
* $taffTl :; $$O#taffTlAFF4L HI O#b+6 Jd J J 
 
,
&
6
.
dCc4(L M 
*aggc3h&7 . E Er&   r   c                   r    e Zd Zd	dZdej
                  e   ddfdZd	dZdej                  e
   fdZd Zy)
Treer   Nc                 X    t        d|      | _        d| j                  _        || _        y )NT)r   r"   r   )r   r   r   r"   )r#   r"   s     r$   r%   zTree.__init__  s"    d62			r&   r   c           	         |D ]A  }| j                   }|j                  xs |j                  |_        t        |j                        D ]  \  }}d}|j	                  d      }|rct        j                  |      s#t        j                  |      st        d|       d|j                  |   j                   }|j                  |   }||j                  vr<t        ||| j                  ||j                        }||_        |j                  |       |j                  |   }|dz   |_         |j"                  j%                  |       D y)zb
        Arrange RouteGroups into hierarchical nodes and arrange them into
        a tree
        Nr   zInvalid declaration: z__dynamic__:)r   r   r"   r   r!   r   )r   r!   r   r   r   r   matchr   r   paramslabelr   r   r"   r   r|   r   r   rc   )	r#   r   ry   currentr   r   r   r   rL   s	            r$   generatezTree.generate  s3   
  	)EiiG%oo>GO(5 *t//#.+11288>(+@)GHH)%,,u*=*C*C)DED!LL/Ew000 !&#{{# 'E %,EM%%e,!++D1 %	+*. NN!!%(5	)r&   c                 8    | j                   j                          y)z9
        Debug tool to output visual of the tree
        N)r   rP   r5   s    r$   rP   zTree.display  s     			r&   c                 F    | j                   j                         \  }}||z   S r3   )r   rT   )r#   rX   rY   s      r$   rT   zTree.render  s!    yy!11ur&   c                 8    | j                   j                          y r3   )r   rI   r5   s    r$   finalizezTree.finalize  s    		##%r&   r   )r   r   r   r%   r   Iterabler   r   rP   r   r   rT   r   r   r&   r$   r   r     sB    
)qzz*5 )$ )Bt &r&   r   )typingr   loggingr   ry   r   liner   patternsr   r   r	   r
   r   rN   r   r   r   r&   r$   <module>r      s<        N N 
<	 bE bEJ2& 2&r&   