o
    mi                     @  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DZPAZPDZTXZTCZTAHN)__name__
__module____qualname____doc__AddTripleOrQuadDeleteTripleOrQuad	AddPrefixDeletePrefixZTransactionStartZTransactionCommitZTransactionAbortHeader r"   r"   V/home/kim/smarthome/.venv/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)r,   Zcontext_awarer   r%   r(   ZgetCharacterStreamZgetByteStreamr   hasattr
ParseErrorfilebufferreadlineline
parsepatch)	selfr$   r%   r&   r(   r*   sourceZ_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   r4   
startswith	operationr   r   r   add_or_remove_triple_or_quadr   
add_prefixr    delete_prefix)r6   r&   r>   r"   r"   r#   r5   \   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 )Nr;   zTrailing garbage)r<   r   r4   r=   labeled_bnodesubject	predicateobjectZurirefnodeidr   r0   r   r   r%   Zget_contextaddZdefault_contextr   remove)r6   r>   r&   rC   rD   objcontextr"   r"   r#   r?   n   s,   






z+RDFPatchParser.add_or_remove_triple_or_quadc                 C  s>   | j ddddd\}}}|d}| j|| d S )N"r.   ' z<>)r4   replacesplitstripr%   bind)r6   prefixns_Zns_strippedr"   r"   r#   r@      s   "
zRDFPatchParser.add_prefixc                 C  s:   | j ddddd\}}}| jjj|d dd d S )NrK   r.   rL   rM   T)rN   )r4   rN   rO   r%   Znamespace_managerrQ   )r6   rR   rT   r"   r"   r#   rA      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   r4   r=   rU   eat_op
ValueErrorjoinr6   rW   r"   r"   r#   r>      s   
zRDFPatchParser.operationrW   strc                 C  s   | j || _ d S N)r4   lstripr\   r"   r"   r#   rY      s   zRDFPatchParser.eat_op'Union[te.Literal[False], BNode, URIRef]c                 C  s"   |  drt| tdS dS )NrT      F)peekr   r<   r   group)r6   r&   r"   r"   r#   rF      s   
zRDFPatchParser.nodeidc                 C  s6   |  dr| td}t|d}t|S dS )Nz<_ra   F)rb   r<   r   rc   r   matchr   )r6   Z	plain_uriZbnode_idr"   r"   r#   rB      s
   
zRDFPatchParser.labeled_bnode)NF)r$   r   r%   r   r&   r'   r(   r)   r*   r   r+   r   r^   )r&   r'   r+   r:   )r+   r   )rW   r]   r+   r:   )r&   r'   r+   r`   )r   r   r   r9   r5   r?   r@   rA   r>   rY   rF   rB   r"   r"   r"   r#   r   0   s    +"


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