o
    mi$                     @  s>  d 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mZmZmZmZ ddlmZmZmZ ddlmZmZmZ dd	lmZ erLdd
lmZ 		d1d2ddZG dd dZG dd deZG dd deZ edZ!G dd deZ"G dd  d e"Z#G d!d" d"eZ$d3d4d*d+Z%	#	d3d5d-d.Z&dd/lm'Z'm(Z( d0S )6a  

NOTE: PyParsing setResultName/__call__ provides a very similar solution to this
I didn't realise at the time of writing and I will remove a
lot of this code at some point

Utility classes for creating an abstract-syntax tree out with pyparsing actions

Lets you label and group parts of parser production rules

For example:

# [5] BaseDecl ::= 'BASE' IRIREF
BaseDecl = Comp('Base', Keyword('BASE') + Param('iri',IRIREF))

After parsing, this gives you back an CompValue object,
which is a dict/object with the parameters specified.
So you can access the parameters are attributes or as keys:

baseDecl.iri

Comp lets you set an evalFn that is bound to the eval method of
the resulting CompValue
    )annotations)OrderedDict)
MethodType)	TYPE_CHECKINGAnyCallableListMappingOptionalTupleTypeVarUnion)ParserElementParseResultsTokenConverter)BNode
IdentifierVariable   )original_text_for)FrozenBindingsFctxr   valr   	variablesboolerrorsreturnc                   s   t |tr
| S t |trtd| t |tr% fdd|D S t |ttfrF |}t |t	r:s:||dur@|S rD|S t
t |trZt|dkrZt |d S |S )a  Utility function for evaluating something...

    Variables will be looked up in the context
    Normally, non-bound vars is an error,
    set variables=True to return unbound vars

    Normally, an error raises the error,
    set errors=True to return error
    z$What do I do with this CompValue? %sc                   s   g | ]	}t  |qS  )value).0xr   r   r   r   [/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/sparql/parserutils.py
<listcomp>O   s    zvalue.<locals>.<listcomp>Nr   r   )
isinstanceExpreval	CompValue	Exceptionlistr   r   getSPARQLErrorNotBoundErrorr   lenr   )r   r   r   r   rr   r!   r"   r   9   s$   




r   c                   @  s$   e Zd ZdZddd	ZdddZdS )
ParamValuezq
    The result of parsing a Param
    This just keeps the name/value
    All cleverness is in the CompValue
    namestr	tokenListUnion[List[Any], ParseResults]isListr   c                 C  s8   || _ || _t|ttfrt|dkr|d }|| _d S )Nr   r   )r4   r0   r$   r)   r   r-   r2   )selfr0   r2   r4   r   r   r"   __init__k   s
   
zParamValue.__init__r   c                 C  s   d| j | jf S )NzParam(%s, %s))r0   r2   r5   r   r   r"   __str__u      zParamValue.__str__N)r0   r1   r2   r3   r4   r   r   r1   )__name__
__module____qualname____doc__r6   r8   r   r   r   r"   r/   d   s    

r/   c                   @  s&   e Zd ZdZddddZdddZdS )Paramz
    A pyparsing token for labelling a part of the parse-tree
    if isList is true repeat occurrences of ParamList have
    their values merged in a list
    Fr0   r1   r4   r   c                 C  s,   || _ t| | | | | | j d S N)r4   r   r6   set_nameZadd_parse_action
postParse2)r5   r0   exprr4   r   r   r"   r6      s   
zParam.__init__r2   r3   r   r/   c                 C  s   t | j|| jS r@   )r/   r0   r4   )r5   r2   r   r   r"   rB      r9   zParam.postParse2N)F)r0   r1   r4   r   )r2   r3   r   r/   )r;   r<   r=   r>   r6   rB   r   r   r   r"   r?   y   s    r?   c                   @  s   e Zd ZdZdddZdS )	ParamListz1
    A shortcut for a Param with isList=True
    r0   r1   c                 C  s   t | ||d d S )NT)r?   r6   r5   r0   rC   r   r   r"   r6         zParamList.__init__Nr0   r1   )r;   r<   r=   r>   r6   r   r   r   r"   rD      s    rD   _ValTc                   @  sv   e Zd ZdZd$ddZd%ddZd&d	d
Zd&ddZ	d'd(ddZdd Z	d'd)ddZ
d*ddZer9d+d!d"Zd#S d#S ),r'   zn
    The result of parsing a Comp
    Any included Params are available as Dict keys
    or as attributes
    r0   r1   c                 K  s   t |  || _| | d S r@   )r   r6   r0   update)r5   r0   valuesr   r   r"   r6      s   
zCompValue.__init__r   c                 C  s   t | jfi | S r@   )r'   r0   r7   r   r   r"   clone      zCompValue.clonec                 C     | j d t|  S N_)r0   r   r8   r7   r   r   r"   r8      rF   zCompValue.__str__c                 C  rM   rN   )r0   dict__repr__r7   r   r   r"   rQ      rF   zCompValue.__repr__Fr   rH   r   r   r   Union[_ValT, Any]c                 C  s   | j d urt| j ||S |S r@   )r   r   )r5   r   r   r   r   r   r"   _value   s   
zCompValue._valuec                 C  s   |  t| |S r@   )rS   r   __getitem__r5   ar   r   r"   rT      rL   zCompValue.__getitem__c                 C  s   |  t| ||||S r@   )rS   r   r*   )r5   rV   r   r   r   r   r"   r*      s   zCompValue.getrV   r   c                 C  s.   |dv rt  z| | W S  ty   Y d S w )N)Z_OrderedDict__rootZ_OrderedDict__end)AttributeErrorKeyErrorrU   r   r   r"   __getattr__   s   
zCompValue.__getattr___CompValue__name_CompValue__valueNonec                 C  s   d S r@   r   )r5   rZ   r[   r   r   r"   __setattr__   s    zCompValue.__setattr__NrG   )r   r'   r:   FF)r   rH   r   r   r   r   r   rR   )r   r   r   r   )rV   r1   r   r   )rZ   r1   r[   r   r   r\   )r;   r<   r=   r>   r6   rK   r8   rQ   rS   rT   r*   rY   r   r]   r   r   r   r"   r'      s    





r'   c                      s4   e Zd ZdZ	dd fddZi fdddZ  ZS )r%   z)
    A CompValue that is evaluatable
    Nr0   r1   evalfn#Optional[Callable[[Any, Any], Any]]c                   s6   t t| j|fi | d | _|rt|| | _d S d S r@   )superr%   r6   _evalfnr   )r5   r0   r_   rJ   	__class__r   r"   r6      s
   zExpr.__init__r   r   r   Union[SPARQLError, Any]c              
   C  sV   z&z|| _ | |W W d | _ S  ty& } z|W  Y d }~W d | _ S d }~ww d | _ w r@   )r   rb   r+   )r5   r   er   r   r"   r&      s   z	Expr.evalr@   )r0   r1   r_   r`   )r   r   r   re   )r;   r<   r=   r>   r6   r&   __classcell__r   r   rc   r"   r%      s
    r%   c                   @  s.   e Zd ZdZdddZdddZdddZdS )Compz
    A pyparsing token for grouping together things with a label
    Any sub-tokens that are not Params will be ignored.

    Returns CompValue / Expr objects - depending on whether evalFn is set.
    r0   r1   rC   r   c                 C  s&   || _ t| | | | d | _d S r@   )rC   r   r6   rA   r_   rE   r   r   r"   r6      s   

zComp.__init__instringlocintr2   r   r   Union[Expr, CompValue]c                 C  s   | j rt| j}t| j ||_nt| j}| jdkr,t| j}||d d }||d< |D ]$}t	|t
rR|jrL|j|vrBg ||j< ||j |j q.|j||j< q.|S )NZServiceGraphPatternr   service_string)r_   r%   r0   r   rb   r'   r   rC   Zsearch_stringr$   r/   r4   appendr2   )r5   ri   rj   r2   resZsgprm   tr   r   r"   	postParse   s"   






zComp.postParser_   Callable[[Any, Any], Any]c                 C  s
   || _ | S r@   )r_   )r5   r_   r   r   r"   	setEvalFn  s   zComp.setEvalFnN)r0   r1   rC   r   )ri   r1   rj   rk   r2   r   r   rl   )r_   rr   r   rh   )r;   r<   r=   r>   r6   rq   rs   r   r   r   r"   rh      s
    

rh    rp   r   indentr1   depthrk   c                 C  sv   g }|   D ]}|t|||d  qt|  D ]\}}|d|d| |f  |t|||d  qd|S )Nr   
%s%s- %s:
  rt   )Zas_listrn   _prettify_sub_parsetreesorteditemsjoin)rp   ru   rv   outrf   kvr   r   r"   prettify_parsetree  s   
r   @Union[Identifier, CompValue, set, list, dict, Tuple, bool, None]c                 C  s  g }t | tr7|d|d| | jf  |  D ]\}}|d|d|d  |f  |t|||d  qnJt | tr_|  D ]\}}|d|d|d  |f  |t|||d  q@n"t | tru| D ]}|t|||d  qfn|d|d| | f  d|S )Nz
%s%s> %s:
rx   rw   r      z	%s%s- %r
rt   )	r$   r'   rn   r0   r{   ry   rP   r)   r|   )rp   ru   rv   r}   r~   r   rf   r   r   r"   ry   !  s$   



ry   )r,   r+   Nr^   )
r   r   r   r   r   r   r   r   r   r   )rt   r   )rp   r   ru   r1   rv   rk   r   r1   )rp   r   ru   r1   rv   rk   r   r1   ))r>   
__future__r   collectionsr   typesr   typingr   r   r   r   r	   r
   r   r   r   Z	pyparsingr   r   r   Zrdflib.termr   r   r   Zpyparsing_compatr   Zrdflib.plugins.sparql.sparqlr   r   r/   r?   rD   rH   r'   r%   rh   r   ry   r,   r+   r   r   r   r"   <module>   s2    ,+	41