o
    
i                     @  s   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 d dlm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 d d
lmZmZ erRd dlZddgZe	e ef Z!G dd deZ"G dd deZ#dS )    )annotations)	getreader)Enum)TYPE_CHECKINGAnyMutableMappingOptionalUnion)ParserError)Dataset)InputSource)NQuadsParser)r_nodeidr_tailr_urirefr_wspace)BNodeURIRefNRDFPatchParser	Operationc                   @  s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )r   a  Enum of RDF Patch operations.

    Operations:
    - `AddTripleOrQuad` (A): Adds a triple or quad.
    - `DeleteTripleOrQuad` (D): Deletes a triple or quad.
    - `AddPrefix` (PA): Adds a prefix.
    - `DeletePrefix` (PD): Deletes a prefix.
    - `TransactionStart` (TX): Starts a transaction.
    - `TransactionCommit` (TC): Commits a transaction.
    - `TransactionAbort` (TA): Aborts a transaction.
    - `Header` (H): Specifies a header.
    ADPAPDTXTCTAHN)__name__
__module____qualname____doc__AddTripleOrQuadDeleteTripleOrQuad	AddPrefixDeletePrefixTransactionStartTransactionCommitTransactionAbortHeader r*   r*   P/home/ubuntu/.local/lib/python3.10/site-packages/rdflib/plugins/parsers/patch.pyr      s    c                   @  sp   e Zd Z		d%d&ddZd'd(ddZ	d'd(ddZdd Zdd Zd)ddZd*ddZ		d'd+d!d"Z
d#d$ ZdS ),r   NFinputsourcer   sinkr   bnode_contextOptional[_BNodeContextType]	skolemizeboolkwargsr   returnc           	   
   K  s   |j jsJ dt|j d| _|| _| }|s"| }td|}t|ds+t	d|| _
d| _	 |   | _}| jdu rB	 | jS z| | W n t	y] } zt	d	||f d}~ww q2)
aF  Parse inputsource as an RDF Patch file.

        Args:
            inputsource: the source of RDF Patch formatted data
            sink: where to send parsed data
            bnode_context: a dict mapping blank node identifiers to [`BNode`][rdflib.term.BNode]
                instances. See `.W3CNTriplesParser.parse`
        z3RDFPatchParser must be given a context aware store.)storezutf-8readz)Item to parse must be a file-like object. TNzInvalid line (%s):
%r)r4   context_awarer   r-   r0   getCharacterStreamgetByteStreamr   hasattr
ParseErrorfilebufferreadlineline
parsepatch)	selfr,   r-   r.   r0   r2   source_RDFPatchParser__linemsgr*   r*   r+   parse1   s2   


zRDFPatchParser.parseNonec                 C  s   |  t | jr| jdrd S |  }|  t |tjtjfv r)| || d S |tj	kr4| 
  d S |tjkr?|   d S d S )N#)eatr   r?   
startswith	operationr   r"   r#   add_or_remove_triple_or_quadr$   
add_prefixr%   delete_prefix)rA   r.   rJ   r*   r*   r+   r@   \   s   



zRDFPatchParser.parsepatchc                 C  s$  |  t | jr| jdrd S |  p| |}|  t |  }|  t |  p/| |}|  t |  pA|  pA| 	|}|  t
 | jrNtd|tjkro|rc| j||||f d S | jj|||f d S |tjkr|r| j||||f d S | jj|||f d S d S )NrG   zTrailing garbage)rH   r   r?   rI   labeled_bnodesubject	predicateobjecturirefnodeidr   r;   r   r"   r-   get_contextadddefault_contextr#   remove)rA   rJ   r.   rO   rP   objcontextr*   r*   r+   rK   n   s,   






z+RDFPatchParser.add_or_remove_triple_or_quadc                 C  s>   | j ddddd\}}}|d}| j|| d S )N"r6   ' z<>)r?   replacesplitstripr-   bind)rA   prefixns_ns_strippedr*   r*   r+   rL      s   "
zRDFPatchParser.add_prefixc                 C  s:   | j ddddd\}}}| jjj|d dd d S )NrZ   r6   r[   r\   T)r]   )r?   r]   r^   r-   namespace_managerr`   )rA   ra   rc   r*   r*   r+   rM      s   "zRDFPatchParser.delete_prefixr   c                 C  sR   t D ]}| j|jr| |j |  S qtd| j dddd t D  )Nz(Invalid or no Operation found in line: "z". Valid Operations codes are z, c                 S  s   g | ]}|j qS r*   )value).0opr*   r*   r+   
<listcomp>   s    z,RDFPatchParser.operation.<locals>.<listcomp>)r   r?   rI   rf   eat_op
ValueErrorjoinrA   rh   r*   r*   r+   rJ      s   
zRDFPatchParser.operationrh   strc                 C  s   | j || _ d S N)r?   lstriprm   r*   r*   r+   rj      s   zRDFPatchParser.eat_op'Union[te.Literal[False], BNode, URIRef]c                 C  s"   |  drt| tdS dS )Nrc      F)peekr   rH   r   group)rA   r.   r*   r*   r+   rS      s   
zRDFPatchParser.nodeidc                 C  s6   |  dr| td}t|d}t|S dS )Nz<_rr   F)rs   rH   r   rt   r   matchr   )rA   	plain_uribnode_idr*   r*   r+   rN      s
   
zRDFPatchParser.labeled_bnode)NF)r,   r   r-   r   r.   r/   r0   r1   r2   r   r3   r   ro   )r.   r/   r3   rF   )r3   r   )rh   rn   r3   rF   )r.   r/   r3   rq   )r   r   r    rE   r@   rK   rL   rM   rJ   rj   rS   rN   r*   r*   r*   r+   r   0   s    +"


)$
__future__r   codecsr   enumr   typingr   r   r   r   r	   rdflib.exceptionsr
   r;   rdflib.graphr   rdflib.parserr   rdflib.plugins.parsers.nquadsr   rdflib.plugins.parsers.ntriplesr   r   r   r   rdflib.termr   r   typing_extensionste__all__rn   _BNodeContextTyper   r   r*   r*   r*   r+   <module>   s     