a
    xþdì-  ã                   @   sD   d dl Z G dd„ dƒZd dlZG dd„ dejƒZedkr@e ¡  dS )é    Nc                   @   sˆ   e Zd Zedd„ ƒZdd„ Zeƒ Ze 	d¡Z
edd„ ƒZdd	„ Zd
d„ Zdd„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚBooleanExpressionc              
   C   sV   zt | t|ƒƒ}| ¡ W S  tyP } z tt|ƒd|   ƒ‚W Y d }~n
d }~0 0 d S )Nz
in expression: %r)r   ÚsetÚparseAllÚ
ValueErrorÚstr)ÚstringÚ	variablesÚparserÚe© r   ú^/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lit/BooleanExpression.pyÚevaluate   s
    
zBooleanExpression.evaluatec                 C   s.   t  |¡| _|| _| j d¡ d | _d | _d S )NÚtrue)r   ÚtokenizeÚtokensr   ÚaddÚvalueÚtoken)Úselfr   r   r   r   r   Ú__init__%   s
    zBooleanExpression.__init__zA\A\s*([()]|&&|\|\||!|(?:[-+=._a-zA-Z0-9]+|\{\{.+?\}\})+)\s*(.*)\Zc                 c   sV   t  tj| ¡}|d u r6| dkr*tjV  d S td|  ƒ‚| d¡}| d¡} |V  q d S )NÚ zcouldn't parse text: %ré   é   )ÚreÚmatchr   ÚPatternÚENDr   Úgroup)r   Úmr   r   r   r   r   2   s    

zBooleanExpression.tokenizec                 C   s   |t ju rdS t|ƒS d S )Nz<end of expression>)r   r   Úrepr)r   r   r   r   r   ÚquoteA   s    
zBooleanExpression.quotec                 C   s"   | j |krt| jƒ| _ dS dS d S )NTF)r   Únextr   ©r   Útr   r   r   ÚacceptG   s    
zBooleanExpression.acceptc                 C   sF   | j |kr$| j tjkrBt| jƒ| _ ntd|  |¡|  | j ¡f ƒ‚d S )Nzexpected: %s
have: %s)r   r   r   r!   r   r   r    r"   r   r   r   ÚexpectN   s    
ÿzBooleanExpression.expectc                 C   s:   | t ju s2| dks2| dks2| dks2| dks2| dkr6dS dS )Nú&&ú||ú!ú(ú)FT)r   r   )r   r   r   r   ÚisMatchExpressionV   s    ÿÿÿz#BooleanExpression.isMatchExpressionc                    s   d‰ t d t d| j¡ƒD ]B}| d¡rL| d¡s4J ‚ˆ d |dd… ¡7 ‰ qˆ t |¡7 ‰ qt ˆ ¡‰ t	‡ fdd	„| j
D ƒƒ| _t| jƒ| _d S )
Nr   z(\{\{.+?\}\})z{{z}}z(?:{})r   éþÿÿÿc                 3   s   | ]}ˆ   |¡V  qd S ©N)Ú	fullmatch)Ú.0Úvar©Úregexr   r   Ú	<genexpr>f   ó    z/BooleanExpression.parseMATCH.<locals>.<genexpr>)Úfilterr   Úsplitr   Ú
startswithÚendswithÚformatÚescapeÚcompileÚanyr   r   r!   r   )r   Úpartr   r1   r   Ú
parseMATCH]   s    

zBooleanExpression.parseMATCHc                 C   sj   |   d¡r|  ¡  | j | _nH|   d¡r<|  ¡  |  d¡ n*t | j¡s^td|  	| j¡ ƒ‚n|  
¡  d S )Nr(   r)   r*   z0expected: '!', '(', '{{', or identifier
have: %s)r$   ÚparseNOTr   ÚparseORr%   r   r+   r   r   r    r>   ©r   r   r   r   r?   i   s    


ÿzBooleanExpression.parseNOTc                 C   s6   |   ¡  |  d¡r2| j}|   ¡  | j}|o,|| _qd S )Nr&   )r?   r$   r   ©r   ÚleftÚrightr   r   r   ÚparseANDv   s    
zBooleanExpression.parseANDc                 C   s6   |   ¡  |  d¡r2| j}|   ¡  | j}|p,|| _qd S )Nr'   )rE   r$   r   rB   r   r   r   r@   €   s    
zBooleanExpression.parseORc                 C   s&   t | jƒ| _|  ¡  |  tj¡ | jS r-   )r!   r   r   r@   r%   r   r   r   rA   r   r   r   r   Š   s    zBooleanExpression.parseAllN)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r   Úobjectr   r   r;   r   r   r    r$   r%   r+   r>   r?   rE   r@   r   r   r   r   r   r      s"   
	




r   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestBooleanExpressionc                 C   sb  h d£}|   t d|¡¡ |   t d|¡¡ |   t d|¡¡ |   t d|¡¡ |   t d|¡¡ |   t d|¡¡ |   t d|¡¡ |   t d	|¡¡ |   t d
|¡¡ |   t d|¡¡ |   t d|¡¡ |   t d|¡¡ |   t d|¡¡ |  t d|¡¡ |  t d|¡¡ |  t d|¡¡ |  t d|¡¡ |  t d|¡¡ |  t d|¡¡ d S )N>   úits-trueÚd1g1tsúe=qualsúfalse-lol-trueÚunder_scorer   rL   rO   rP   rN   rM   z	{{its.+}}z{{false-[lo]+-true}}z!{{(true|false)-lol-(true|false)}}zd1g{{[0-9]}}tszd1g{{[0-9]}}t{{[a-z]}}z{{d}}1g{{[0-9]}}t{{[a-z]}}zd1{{(g|1)+}}tsÚfalseÚTrueztrue-ishZnot_trueZtruz{{its-true.+}}©Ú
assertTruer   r   ZassertFalse)r   r   r   r   r   Útest_variables—   s(    z$TestBooleanExpression.test_variablesc                 C   sz   d}|   t |ddh¡¡ |  t |ddh¡¡ d}|   t |ddh¡¡ |  t |h d£¡¡ |  t |dd	h¡¡ d S )
Nz8linux && (target={{aarch64-.+}} || target={{x86_64-.+}})Úlinuxztarget=x86_64-unknown-linux-gnuztarget=i386-unknown-linux-gnuzSuse_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12}} && !no-exceptionsÚuse_system_cxx_libútarget=arm64-apple-macosx10.12>   rX   zno-exceptionsrW   ztarget=arm64-apple-macosx10.15rS   )r   Úexpr1Zexpr2r   r   r   Útest_matching¯   s    z#TestBooleanExpression.test_matchingc                 C   s$  |   t di ¡¡ |   t di ¡¡ |   t di ¡¡ |  t di ¡¡ |   t di ¡¡ |  t di ¡¡ |  t di ¡¡ |  t di ¡¡ |  t d	i ¡¡ |   t d
i ¡¡ |   t di ¡¡ |   t di ¡¡ |   t di ¡¡ |   t di ¡¡ |   t di ¡¡ |  t di ¡¡ d S )Nztrue || trueztrue || falsezfalse || truezfalse || falseztrue && trueztrue && falsezfalse && truezfalse && falsez!truez!falsez   ((!((false) ))   ) ztrue && (true && (true))z!false && !false && !! !falsezfalse && false || truez(false && false) || truezfalse && (false || true)rS   rA   r   r   r   Útest_operators¹   s     z$TestBooleanExpression.test_operatorsc              
   C   s¢   zt  |i ¡ |  d| ¡ W n~ tyh } z2dt|ƒ |¡krT|  d|||f ¡ W Y d }~n>d }~0  tyœ } z|  d||f ¡ W Y d }~n
d }~0 0 d S )Nz'expression %r didn't cause an exceptionéÿÿÿÿzVexpression %r caused the wrong ValueError
actual error was:
%s
expected error was:
%s
zCexpression %r caused the wrong exception; actual exception was: 
%r)r   r   Zfailr   r   ÚfindÚBaseException)r   ÚexprÚerrorr
   r   r   r   ÚcheckExceptionÐ   s    þÿz$TestBooleanExpression.checkExceptionc                 C   s    |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   d	d
¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ d S )Nzba#dz/couldn't parse text: '#d'
in expression: 'ba#d'ztrue and truezHexpected: <end of expression>
have: 'and'
in expression: 'true and true'z|| truezKexpected: '!', '(', '{{', or identifier
have: '||'
in expression: '|| true'ztrue &&zZexpected: '!', '(', '{{', or identifier
have: <end of expression>
in expression: 'true &&'r   zSexpected: '!', '(', '{{', or identifier
have: <end of expression>
in expression: ''Ú*z+couldn't parse text: '*'
in expression: '*'zno wait stopzHexpected: <end of expression>
have: 'wait'
in expression: 'no wait stop'zno-$-pleasez<couldn't parse text: '$-please'
in expression: 'no-$-please'z(((true && true) || true)zRexpected: ')'
have: <end of expression>
in expression: '(((true && true) || true)'ztrue (true)zDexpected: <end of expression>
have: '('
in expression: 'true (true)'z( )zFexpected: '!', '(', '{{', or identifier
have: ')'
in expression: '( )'zabc{{defz6couldn't parse text: '{{def'
in expression: 'abc{{def'z{{}}z1couldn't parse text: '{{}}'
in expression: '{{}}')ra   rA   r   r   r   Útest_errorsÝ   sN    ÿÿÿÿÿÿÿÿÿÿÿÿÿz!TestBooleanExpression.test_errorsN)rF   rG   rH   rU   rZ   r[   ra   rc   r   r   r   r   rK   –   s
   
rK   Ú__main__)r   r   ZunittestZTestCaserK   rF   Úmainr   r   r   r   Ú<module>   s     