
    w:iQQ                     d   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZmZ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mZmZ g d
ZdZ G d de          Z G d de          Z  G d de          Z! e            Z" G d de          Z# G d de          Z$ G d de          Z% G d de%          Z& G d de%          Z'd(dZ(	 	 d)d Z)d! Z*ej+        ,                                Z-e-.                    ee$d"            e/g d#          Z0 G d$ d%e          Z1 G d& d'e1          Z2dS )*z4Support for "safe" evaluation of Python expressions.    )dedent)CodeType)builtinsexec_string_types	text_type)Markup)ASTTransformerASTCodeGeneratorparse)TemplateRuntimeError)flatten)ast_ast_Constantget_code_paramsbuild_code_chunkisstring
IS_PYTHON2_ast_Str)Code
ExpressionSuiteLenientLookupStrictLookup	UndefinedUndefinedErrorzrestructuredtext enc                   J    e Zd ZdZg dZ	 	 ddZd Zd Zd	 Zd
 Z	d Z
d ZdS )r   z=Abstract base class for the `Expression` and `Suite` classes.)sourcecoder   _globalsNstrictc                     t          |t                    r|| _        t          || j                  }not          |t
          j                  sJ d|z              d| _        | j        dk    rt          j                    }||_        nt          j	                    }|g|_        || _
        t          || j        | j        |||          | _        |t          }n*t          |t                    rt          t          d|         }|j        | _        dS )a  Create the code object, either from a string, or from an AST node.
        
        :param source: either a string containing the source code, or an AST
                       node
        :param filename: the (preferably absolute) name of the file containing
                         the code
        :param lineno: the number of the line on which the code was found
        :param lookup: the lookup class that defines how variables are looked
                       up in the context; can be either "strict" (the default),
                       "lenient", or a custom lookup class
        :param xform: the AST transformer that should be applied to the code;
                      if `None`, the appropriate transformation is chosen
                      depending on the mode
        )modez'Expected string or AST node, but got %r?eval)r$   filenamelinenoxformN)lenientr"   )
isinstancer   r   _parser$   _astASTr   bodyModuler   _compiler   r   r   globalsr    )selfr   r'   r(   lookupr)   nodes          L/var/www/html/trac/venv/lib/python3.11/site-packages/genshi/template/eval.py__init__zCode.__init__&   s     fl++ 	% DK&ty111DDfdh// C C9FBC C CDKyF""(("		{}}#H	T4;TY&.vUL L L	>"FF-- 	P!.,GGOF    c                     t          | j        d          r| j        j        }n| j        j        }| j        | j        |d}t          | j                  |d<   |S )N__self__)r   r   r4   r   )hasattrr    r:   im_selfr   r   r   r   )r3   	lookup_fnstates      r6   __getstate__zCode.__getstate__M   sW    4=*-- 	..II-I;tx9MM'	22fr8   c                     |d         | _         |d         | _        t          dg|d         R  | _        |d         j        | _        d S )Nr   r   r   r   r4   )r   r   r   r   r2   r    )r3   r>   s     r6   __setstate__zCode.__setstate__W   sE    Ho<Q/v///	h/r8   c                 b    t          |          t          |           k    o| j        |j        k    S N)typer   r3   others     r6   __eq__zCode.__eq__]   s'    UtDzz)H	UZ0GHr8   c                 *    t          | j                  S rC   )hashr   r3   s    r6   __hash__zCode.__hash__`   s    DIr8   c                     | |k     S rC    rE   s     r6   __ne__zCode.__ne__c   s    5=  r8   c                 @    t          |           j        d| j        dS )N())rD   __name__r   rJ   s    r6   __repr__zCode.__repr__f   s"    ::...<<r8   )Nr!   r"   N)rR   
__module____qualname____doc__	__slots__r7   r?   rA   rG   rK   rN   rS   rM   r8   r6   r   r   "   s        GG555I@H%' %' %' %'N  0 0 0I I I  ! ! != = = = =r8   r   c                        e Zd ZdZg ZdZd ZdS )r   a  Evaluates Python expressions used in templates.

    >>> data = dict(test='Foo', items=[1, 2, 3], dict={'some': 'thing'})
    >>> Expression('test').evaluate(data)
    'Foo'

    >>> Expression('items[0]').evaluate(data)
    1
    >>> Expression('items[-1]').evaluate(data)
    3
    >>> Expression('dict["some"]').evaluate(data)
    'thing'
    
    Similar to e.g. Javascript, expressions in templates can use the dot
    notation for attribute access to access items in mappings:
    
    >>> Expression('dict.some').evaluate(data)
    'thing'
    
    This also works the other way around: item access can be used to access
    any object attribute:
    
    >>> class MyClass(object):
    ...     myattr = 'Bar'
    >>> data = dict(mine=MyClass(), key='myattr')
    >>> Expression('mine.myattr').evaluate(data)
    'Bar'
    >>> Expression('mine["myattr"]').evaluate(data)
    'Bar'
    >>> Expression('mine[key]').evaluate(data)
    'Bar'
    
    All of the standard Python operators are available to template expressions.
    Built-in functions such as ``len()`` are also available in template
    expressions:
    
    >>> data = dict(items=[1, 2, 3])
    >>> Expression('len(items)').evaluate(data)
    3
    r&   c                 `    d}|                      |          }t          | j        |d|i          S )zEvaluate the expression against the given data dictionary.
        
        :param data: a mapping containing the data to evaluate against
        :return: the result of the evaluation
        before_and_this__data__)r    r&   r   r3   data__traceback_hide__r    s       r6   evaluatezExpression.evaluate   s4     /==&&DIx*d);<<<r8   N)rR   rT   rU   rV   rW   r$   r_   rM   r8   r6   r   r   j   s:        ' 'P ID= = = = =r8   r   c                        e Zd ZdZg ZdZd ZdS )r   zExecutes Python statements used in templates.

    >>> data = dict(test='Foo', items=[1, 2, 3], dict={'some': 'thing'})
    >>> Suite("foo = dict['some']").execute(data)
    >>> data['foo']
    'thing'
    execc                 `    d}|                      |          }t          | j        ||           dS )zExecute the suite in the given data dictionary.
        
        :param data: a mapping containing the data to execute in
        rZ   N)r    r   r   r\   s       r6   executezSuite.execute   s5    
 /==&&di4(((((r8   N)rR   rT   rU   rV   rW   r$   rc   rM   r8   r6   r   r      s9          ID) ) ) ) )r8   r   c                       e Zd ZdZefdZdS )r   zException thrown when a template expression attempts to access a variable
    not defined in the context.
    
    :see: `LenientLookup`, `StrictLookup`
    c                 x    |t           urt          |          d|d}nd|z  }t          j        | |           d S )Nz has no member named ""z"%s" not defined)	UNDEFINEDreprr   r7   )r3   nameownermessages       r6   r7   zUndefinedError.__init__   sJ    	!!7;E{{{{DDDIGG(4/G%dG44444r8   N)rR   rT   rU   rV   rg   r7   rM   r8   r6   r   r      s7         
 $- 5 5 5 5 5 5r8   r   c                   V    e Zd ZdZddgZefdZd Zd ZeZ	d Z
d Zd	 ZexZxZZd
Zd
S )r   a  Represents a reference to an undefined variable.
    
    Unlike the Python runtime, template expressions can refer to an undefined
    variable without causing a `NameError` to be raised. The result will be an
    instance of the `Undefined` class, which is treated the same as ``False`` in
    conditions, but raise an exception on any other operation:
    
    >>> foo = Undefined('foo')
    >>> bool(foo)
    False
    >>> list(foo)
    []
    >>> print(foo)
    undefined
    
    However, calling an undefined variable, or trying to access an attribute
    of that variable, will raise an exception that includes the name used to
    reference that undefined variable.
    
    >>> try:
    ...     foo('bar')
    ... except UndefinedError as e:
    ...     print(e.msg)
    "foo" not defined

    >>> try:
    ...     foo.bar
    ... except UndefinedError as e:
    ...     print(e.msg)
    "foo" not defined
    
    :see: `LenientLookup`
    _name_ownerc                 "    || _         || _        dS )zInitialize the object.
        
        :param name: the name of the reference
        :param owner: the owning object, if the variable is accessed as a member
        N)rm   rn   )r3   ri   rj   s      r6   r7   zUndefined.__init__   s     
r8   c                      t          g           S rC   )iterrJ   s    r6   __iter__zUndefined.__iter__   s    Bxxr8   c                     dS )NFrM   rJ   s    r6   __bool__zUndefined.__bool__   s    ur8   c                 B    dt          |           j        d| j        dS )N< >)rD   rR   rm   rJ   s    r6   rS   zUndefined.__repr__   s$      JJ///<<r8   c                     dS )N	undefinedrM   rJ   s    r6   __str__zUndefined.__str__   s    {r8   c                 :    d}t          | j        | j                  )zRaise an `UndefinedError`.T)r   rm   rn   )r3   argskwargsr^   s       r6   _diezUndefined._die  s    !TZ555r8   N)rR   rT   rU   rV   rW   rg   r7   rr   rt   __nonzero__rS   r{   r   __call____getattr____getitem____length_hint__rM   r8   r6   r   r      s           B (#I#,         K= = =  6 6 6 ,0/H/{[ OOOr8   r   c                       e Zd ZdZed             Zed             Zed             Zed             Zee	fd            Z
dS )
LookupBasez8Abstract base class for variable lookup implementations.c                 :    || j         | j        | j        t          dS )znConstruct the globals dictionary to use as the execution context for
        the expression or suite.
        )r[   _lookup_name_lookup_attr_lookup_itemr   )lookup_namelookup_attrlookup_itemr   )clsr]   s     r6   r2   zLookupBase.globals  s(     OOO,
 
 	
r8   c                     d}|                     |t                    }|t          u r9t                               ||          }|t          u r|                     |          }|S )NT)getrg   BUILTINSrz   )r   r]   ri   r^   vals        r6   r   zLookupBase.lookup_name  sZ    !hhtY''),,tS))CimmD))
r8   c                     d}	 t          ||          }n^# t          $ rQ t          |j        |          r 	 ||         }n.# t          t
          f$ r |                     ||          }Y nw xY wY nw xY w|S )NTrj   )getattrAttributeErrorr;   	__class__KeyError	TypeErrorrz   )r   objkeyr^   r   s        r6   r   zLookupBase.lookup_attr'  s    !		8#s##CC 	8 	8 	8s}c** 88c(CC ), 8 8 8--3-77CCC8	8 
s/     A0?A0(A*'A0)A**A0/A0c                 >   d}t          |          dk    r|d         }	 ||         S # t          t          t          t          f$ rX}t          |t                    r=t          ||t                    }|t          u r| 	                    ||          }|cY d }~S  d }~ww xY w)NT   r   r   )
lenr   r   
IndexErrorr   r+   r   r   rg   rz   )r   r   r   r^   er   s         r6   r   zLookupBase.lookup_item6  s    !s88q==a&C	s8O*i@ 	 	 	#|,, c3	22)##--3-77C





	s"   ' BABBBBc                     t           )zCan be overridden by subclasses to specify behavior when undefined
        variables are accessed.
        
        :param key: the name of the variable
        :param owner: the owning object, if the variable is accessed as a member
        )NotImplementedError)r   r   rj   s      r6   rz   zLookupBase.undefinedE  s
     "!r8   N)rR   rT   rU   rV   classmethodr2   r   r   r   rg   rz   rM   r8   r6   r   r     s        BB

 

 [

   [   [   [ "+ " " " [" " "r8   r   c                   ,    e Zd ZdZeefd            ZdS )r   a  Default variable lookup mechanism for expressions.
    
    When an undefined variable is referenced using this lookup style, the
    reference evaluates to an instance of the `Undefined` class:
    
    >>> expr = Expression('nothing', lookup='lenient')
    >>> undef = expr.evaluate({})
    >>> undef
    <Undefined 'nothing'>
    
    The same will happen when a non-existing attribute or item is accessed on
    an existing object:
    
    >>> expr = Expression('something.nil', lookup='lenient')
    >>> expr.evaluate({'something': dict()})
    <Undefined 'nil'>
    
    See the documentation of the `Undefined` class for details on the behavior
    of such objects.
    
    :see: `StrictLookup`
    c                 (    d}t          ||          S )zReturn an ``Undefined`` object.Tr   )r   r   r   rj   r^   s       r6   rz   zLenientLookup.undefinedh  s     "E****r8   NrR   rT   rU   rV   r   rg   rz   rM   r8   r6   r   r   P  sA         . "+ + + + [+ + +r8   r   c                   ,    e Zd ZdZeefd            ZdS )r   a  Strict variable lookup mechanism for expressions.
    
    Referencing an undefined variable using this lookup style will immediately
    raise an ``UndefinedError``:
    
    >>> expr = Expression('nothing', lookup='strict')
    >>> try:
    ...     expr.evaluate({})
    ... except UndefinedError as e:
    ...     print(e.msg)
    "nothing" not defined
    
    The same happens when a non-existing attribute or item is accessed on an
    existing object:
    
    >>> expr = Expression('something.nil', lookup='strict')
    >>> try:
    ...     expr.evaluate({'something': dict()})
    ... except UndefinedError as e:
    ...     print(e.msg)
    {} has no member named "nil"
    c                 (    d}t          ||          )z(Raise an ``UndefinedError`` immediately.Tr   )r   r   s       r6   rz   zStrictLookup.undefined  s     "S....r8   Nr   rM   r8   r6   r   r   o  sA         . "+ / / / [/ / /r8   r   r&   c                    |                                  } |dk    rd |                                 D             }|r|d         }t          d                    |dd                                                              }|                                                    d          rK|d                                         s1d                    d |                                D                       }d                    ||g          } t          | t                    rd| z   	                    d	          } t          | |          S )
Nra   c                 6    g | ]}|                                 S rM   )
expandtabs.0lines     r6   
<listcomp>z_parse.<locals>.<listcomp>  s"    CCCt""CCCr8   r   
r   :c                     g | ]}d |z  S )z    %srM   r   s     r6   r   z_parse.<locals>.<listcomp>  s    !P!P!Pd(T/!P!P!Pr8   u   ﻿utf-8)strip
splitlinesr   joinrstripendswithisspacer+   r   encoder   )r   r$   linesfirstrests        r6   r,   r,     s#   \\^^Fv~~CCv/@/@/B/BCCC 	.!HE$))E!""I..//6688D||~~&&s++ RDGOO4E4E Ryy!P!Pdoo>O>O!P!P!PQQYYt}--F&)$$ 6f$,,W55r8   Nr!   c                    |sd}t           r,t          |t                    r|                    dd          }n+t          |t                    s|                    dd          }|dk    rd}|"dt
          i                    |t                    } |                                |           }|dk    rd|pdz  }n>|	                                }|sd	}	n|d         }	t          |          dk    r|	d
z  }	d|	z  }t          |          j        }
t          |
||          }	 t          ||||          S # t          $ r |cY S w xY w)Nz<string>r   replacer   r   r&   z<Expression %r>r%    z ...z
<Suite %r>)r   r+   r   r   decodeExpressionASTTransformerr   TemplateASTTransformervisitr   r   r   r   compiler   RuntimeError)r5   r   r$   r'   r(   r)   treeri   r   extract
new_sourcer   s               r6   r1   r1     su     ;h	** 	;w	::H (I.. 	;w	::H{{},

#d*
+
+ 	 577==Dv~~ FMc2!!## 	GGAhGu::>>vGw'!$'',J:x..D  hf===   s   D0 0D?>D?c                      |             }t          |j        |          D ])\  }}||v rt          d          t          |||           *|D ]\  }}t          |||           |S )Nz!Field set both in args and kwargs)zip_fields
ValueErrorsetattr)class_r}   r~   retattrvalues         r6   _newr     s    
&((C3;-- " "e6>>@AAAT5!!!! " "eT5!!!!Jr8   )r	   r   )FalseTrueNoneNotImplementedEllipsisc                   ^    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZeZd Zd Zd ZdS )r   pConcrete AST transformer that implements the AST transformations needed
    for code embedded in templates.
    c                      t           g| _        d S rC   )	CONSTANTSlocalsrJ   s    r6   r7   zTemplateASTTransformer.__init__  s     kr8   c                 *   t           s6t          |t          j                  r|                    |j                   d S t          |          r|                    |           d S t          |t          j                  r|                    |j                   d S t          |t          j                  r#|                    |j	        p|j
                   d S t          |t          j                  r |j        D ]}|                     ||           d S d S rC   )r   r+   r-   argaddr   Nameidaliasasnameri   Tupleelts_process)r3   namesr5   elts       r6   r   zTemplateASTTransformer._process  s    
	*jtx88 
	*IIdhd^^ 	*IIdOOOOOdi(( 	*IIdgdj)) 	*IIdk.TY/////dj)) 	*y * *eS))))	* 	** *r8   c                    t                      }t          |d          r|j        D ]}|                     ||           t          |d          r |j        D ]}|                     ||           t          |d          r|                     ||j                   t          |d          r|                     ||j                   n0t          |d          r |j        D ]}|                     ||           |S )Nr}   
kwonlyargsvarargkwargr   )setr;   r}   r   r   r   r   r   )r3   r5   r   r   r   s        r6   _extract_namesz%TemplateASTTransformer._extract_names  s   4   	*y * *eS))))t\** .? . .CMM%----tX&& 2eT[111tW%% 1eTZ000T7## 	*z * *eS))))r8   c                     t          |j        t                    sY	 |j                            d           n=# t          $ r0 t          t          |j                            d                    cY S w xY w|S )Nasciir   )r+   sr   r   r   r   r   r3   r5   s     r6   	visit_Strz TemplateASTTransformer.visit_Str  sv    $&),, 	>>g&&&& > > >HdfmmG&<&<=====>s   7 7A10A1c                 b   t          | j                  dk    r%| j        d                             |j                   | j                            t                                 	 t          j        | |          | j                                         S # | j                                         w xY wNr   r!   )	r   r   r   ri   appendr   r
   visit_ClassDefpopr   s     r6   r   z%TemplateASTTransformer.visit_ClassDef  s    t{aKO	***355!!!	!0t<<KOODKOOs   %B B.c                     t          | j                  dk    r3| j        d                             |                     |                     t	          j        | |          S r   )r   r   updater   r
   visit_Importr   s     r6   r   z#TemplateASTTransformer.visit_Import  sR    t{aKO""4#6#6t#<#<===*4666r8   c                     d |j         D             dgk    r|S t          | j                  dk    r3| j        d                             |                     |                     t          j        | |          S )Nc                     g | ]	}|j         
S rM   )ri   )r   as     r6   r   z;TemplateASTTransformer.visit_ImportFrom.<locals>.<listcomp>  s    '''qAF'''r8   *r   r!   )r   r   r   r   r   r
   visit_ImportFromr   s     r6   r  z'TemplateASTTransformer.visit_ImportFrom  st    ''DJ'''C500Kt{aKO""4#6#6t#<#<===.tT:::r8   c                 z   t          | j                  dk    r%| j        d                             |j                   | j                            |                     |j                             	 t          j        | |          | j        	                                 S # | j        	                                 w xY wr   )
r   r   r   ri   r   r   r}   r
   visit_FunctionDefr   r   s     r6   r  z(TemplateASTTransformer.visit_FunctionDef  s    t{aKO	***4..ty99:::	!3D$??KOODKOOs   1B B:c                     g }|j         D ]} j                            t                                 t	          t
          j                             |j                                       |j	                   fd|j
        D                       }|                    |           t	          |j                             |j                  |          } j        t          |j                    d = |S )Nc                 :    g | ]}                     |          S rM   )r   )r   if_r3   s     r6   r   z=TemplateASTTransformer.visit_GeneratorExp.<locals>.<listcomp>-  s#    AAAC

3AAAr8   )
generatorsr   r   r   r   r-   comprehensionr   targetrq   ifsr   r   r   )r3   r5   gens	generatorgenr   s   `     r6   visit_GeneratorExpz)TemplateASTTransformer.visit_GeneratorExp&  s     	 	IKsuu%%%t)4::i6F+G+Gzz).11AAAA9=AAAC CC KK 4>4::dh#7#7>>KT_---../
r8   c                     | j                             |                     |j                             	 t	          j        | |          | j                                          S # | j                                          w xY wrC   )r   r   r   r}   r
   visit_Lambdar   r   s     r6   r  z#TemplateASTTransformer.visit_Lambda9  sj    4..ty99:::	!.tT::KOODKOOs   A" "A=c                 D    |                      |j                  |_        |S rC   )r   r   r   s     r6   visit_Starredz$TemplateASTTransformer.visit_StarredA  s    ZZ
++
r8   c                 T   t          |j        t          j                  r|j        t          | j                  vrt          t          j        dt          j                              }t          t          j        dt          j                              }t          t          |j                  }t          t          j
        |||gg           }n\t          |j        t          j                  r=t          | j                  dk    r%| j        d                             |j                   |S )Nr   r[   r   r!   )r+   ctxr-   Loadr   r   r   r   r   r   CallStorer   r   )r3   r5   ri   nameargstrargs        r6   
visit_Namez!TemplateASTTransformer.visit_NameE  s     dh	** 		-wt{3333	>49;;??D49j$)++>>G(DG,,F	4'6):B??DD$*-- 	-4;!##B##DG,,,r8   N)rR   rT   rU   rV   r7   r   r   r   r   r   r  r  r  visit_ListCompr  r  r  rM   r8   r6   r   r     s         " " "* * *  "    7 7 7
; ; ;    " (N        r8   r   c                       e Zd ZdZd Zd ZdS )r   r   c                 b   t          |j        t          j                  st	          j        | |          S t          t          j        dt          j                              }|                     |j	                  t          t          |j                  g}t          t          j        ||g           S )Nr   )r+   r  r-   r  r
   visit_Attributer   r   r   r   r   r   r  )r3   r5   funcr}   s       r6   r  z(ExpressionASTTransformer.visit_Attribute[  s~    $(DI.. 	>!1$===DI~ty{{;;

4:&&Xty(A(ABDItT2...r8   c                    t          |j        t          j                  r<t          |j        t          j        t          t          j        t          j        f          st          j
        | |          S t          |j        t          j        t          j        f          r|j        }n|j        j        }t          t          j        dt          j                              }|                     |j                  t          t          j        |                     |          ft          j                              g}t          t          j        ||g           S )Nr   )r+   r  r-   r  sliceIndexr   r   r  r
   visit_Subscriptr   r   r   r   )r3   r5   slice_valuer   r}   s        r6   r$  z(ExpressionASTTransformer.visit_Subscriptc  s    $(DI.. 	>tzDJtyRVR[+\]]	>!1$=== dj49di"899 	+*KK**K DI~ty{{;;JJtz""djj557EE
 DItT2...r8   N)rR   rT   rU   rV   r  r$  rM   r8   r6   r   r   V  s<         / / // / / / /r8   r   )r&   )Nr&   Nr!   N)3rV   textwrapr   typesr   genshi.compatr   r   r   r   genshi.corer	   genshi.template.astutilr
   r   r   genshi.template.baser   genshi.utilr   r   r-   r   r   r   r   r   r   __all____docformat__objectr   r   r   rg   r   r   r   r   r   r,   r1   r   __dict__copyr   r   	frozensetr   r   r   rM   r8   r6   <module>r3     s   ; :             B B B B B B B B B B B B       K K K K K K K K K K 5 5 5 5 5 5      K K K K K K K K K K K K K K K K K K* * *%E= E= E= E= E=6 E= E= E=P4= 4= 4= 4= 4= 4= 4= 4=n) ) ) ) )D ) ) )* FHH	5 5 5 5 5) 5 5 5C C C C C C C CL@" @" @" @" @" @" @" @"F+ + + + +J + + +>/ / / / /: / / />    DF( ( ( (V   !!## 6	:: ; ; ;IMMMNN	{ { { { {^ { { {|/ / / / /5 / / / / /r8   