3
dlz                 @   s  d Z ddlZddlmZ ddlZddlZddlZddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZmZ ddlmZ ddljZdd	lmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 dd
l5m6Z6 dZ7dZ8G dd deZ9G dd dZ:e;ed e<ed e=ed iZ>e	ed j?de	ed j?de	ed j?de	ed j?de	ed j?de	ed j?de	ed  j?d!e	ed" j?d#e	ed$ j?d%e	ed& j?d'e	ed( j?d)e	ed* j?d+e	ed, j?d-e	ed. j?d/e	ed0 j?d1iZ@ejAejd2 e	ed3 j?e*e	ed4 j?e(e	ed5 j?e)e	ed6 j?e+e	ed7 j?e,e	ed8 j?ejBe	ed9 j?ejCe	ed: j?ejDe	ed; j?ejEi
ZFd<d= ZGdHd?d@ZHG dAdB dBe6ZIdIdDdEZJdFdG ZKdS )Jz&PROV-RDF serializers for ProvDocument
    N)OrderedDict)URIRefBNode)Literal)ConjunctiveGraph)RDFRDFSXSD)Error)PROVPROV_ID_ATTRIBUTES_MAP
PROV_N_MAPPROV_BASE_CLS	XSD_QNAMEPROV_END
PROV_START
PROV_USAGEPROV_GENERATIONPROV_DERIVATIONPROV_INVALIDATIONPROV_ALTERNATEPROV_MENTIONPROV_DELEGATIONPROV_ACTIVITYPROV_ATTR_STARTTIMEPROV_ATTR_ENDTIMEPROV_LOCATIONPROV_ATTR_TIME	PROV_ROLEPROV_COMMUNICATIONPROV_ATTR_INFORMANTPROV_ATTR_RESPONSIBLEPROV_ATTR_TRIGGERPROV_ATTR_ENDERPROV_ATTR_STARTERPROV_ATTR_USED_ENTITYPROV_ASSOCIATION)
SerializerzSatrajit S. Ghoshzsatra@mit.educ               @   s   e Zd ZdS )ProvRDFExceptionN)__name__
__module____qualname__ r,   r,   8/tmp/pip-build-7vycvbft/prov/prov/serializers/provrdf.pyr(   6   s   r(   c               @   s   e Zd Zdd ZdddZdS )AnonymousIDGeneratorc             C   s   i | _ d| _d S )Nr   )_cache_count)selfr,   r,   r-   __init__;   s    zAnonymousIDGenerator.__init__idc             C   s>   || j kr4|  jd7  _tjd|| jf j| j |< | j | S )N   z_:%s%d)r/   r0   pm
Identifieruri)r1   objZlocal_prefixr,   r,   r-   get_anon_id?   s    
z AnonymousIDGenerator.get_anon_idN)r3   )r)   r*   r+   r2   r9   r,   r,   r,   r-   r.   :   s   r.   doubleintstringalternateOfZ	alternateactedOnBehalfOfZ
delegationZspecializationOfZspecialization	mentionOfZmentionwasAssociatedWithZassociationZwasDerivedFromZ
derivationZwasAttributedToZattributionZwasInformedByZcommunicationZwasGeneratedBy
generationZwasInfluencedByZ	influenceZwasInvalidatedByZinvalidationZ
wasEndedByendZwasStartedBystartZ	hadMemberZ
membershipusedusagelabel
atLocationstartedAtTimeendedAtTimeatTimehadRolehadPlanhadUsagehadGenerationhadActivityc             C   s   t tt|  jdd  jS )Nzprov:r4   )r   r   r   splitr7   )attrr,   r,   r-   attr2rdfn   s    rR   Fc             C   s&   |d krd S | j |}|s|S t|S )N)valid_qualified_namer   )bundlevalueZ	xsd_qnameZqualified_namer,   r,   r-   rS   r   s    
rS   c               @   s   e Zd ZdZddefddZdeefddZdd	 Z	d
d Z
dd ZefddZeddfddZeefddZeefddZdS )ProvRDFSerializerzA
    PROV-O serializer for :class:`~prov.model.ProvDocument`
    NZtrigc          
   K   s   | j | j|d}|j }||d< tj }zN|j|f| |jdd t|tjrf|j	|j
 jd n|j	|j
  W d|j  X dS )z
        Serializes a :class:`~prov.model.ProvDocument` instance to
        `PROV-O <https://www.w3.org/TR/prov-o/>`_.

        :param stream: Where to save the output.
        :param rdf_format: The RDF format of the output, default to TRiG.
        )r   formatr   zutf-8N)encode_documentdocumentcopyioBytesIO	serializeseek
isinstance
TextIOBasewritereaddecodeclose)r1   stream
rdf_formatr   kwargs	containernewargsbufr,   r,   r-   r]   ~   s    
zProvRDFSerializer.serializec       	      K   sH   |j  }||d< t }|j|f| tj }|| _| j||||d |S )a  
        Deserialize from the `PROV-O <https://www.w3.org/TR/prov-o/>`_
        representation to a :class:`~prov.model.ProvDocument` instance.

        :param stream: Input data.
        :param rdf_format: The RDF format of the input data, default: TRiG.
        rW   )relation_mapperpredicate_mapper)rZ   r   parser5   ZProvDocumentrY   decode_document)	r1   re   rf   rk   rl   rg   ri   rh   rY   r,   r,   r-   deserialize   s    zProvRDFSerializer.deserializec             C   s   | j j|S )N)rY   rS   )r1   rU   r,   r,   r-   valid_identifier   s    z"ProvRDFSerializer.valid_identifierc             C   s   t |tr|S t |tjr"t|S t |tjrBt|j td dS t |tj	rXt|j
S t |tjrvt|j
td dS t|tkrt|tt| dS t|S d S )NdateTime)datatypeZanyURI)r_   r   r5   r   literal_rdf_representationdatetime
RDFLiteral	isoformatr	   QualifiedNamer7   r6   typeLITERAL_XSDTYPE_MAP)r1   rU   r,   r,   r-   encode_rdf_representation   s    

z+ProvRDFSerializer.encode_rdf_representationc             C   s|  t |tr|jd k	r|jn|}t|dr0|jnd }t|drD|jnd }|rXd|krX|}|rnd|krntj|}|td krt	j
|tdS |td krtjj|S |td krt	j
tjj|j| j|dS |td	 krtjj|}t	j
d
j|j|j| j|dS t	j
|| j||S n^t |trt| j|}|d krp|jj|\}}	}
| jj||	}t	j||j|jd}|S |S d S )Nrr   languageZ
XMLLiteralbase64BinaryQName)rr   rq   ZgYearZ
gYearMonthz{0}-{1:02d} )r_   ru   rU   hasattrrr   r{   base64standard_b64encoder	   r5   r   r   dateutilparserrm   yearrp   rW   monthr   namespace_managercompute_qnamerY   add_namespacerw   replacer7   )r1   literalgraphrU   rr   langtagZparsed_inforvalprefixiri_nsr,   r,   r-   decode_rdf_representation   s<    


z+ProvRDFSerializer.decode_rdf_representationc             C   s@   | j |}x0|jD ]&}| j ||jj|d}|j|j  qW |S )N)
identifierr   )encode_containerZbundlesr   r7   ZaddNZquads)r1   rY   r   rh   itemrT   r,   r,   r-   rX      s    
z!ProvRDFSerializer.encode_documentc                 sH  |d kr&t |d}|j}|jdtj x|jD ]}|j|j|j q.W t   fdd}x|jD ]}|j	 }	t
|dr|jrtt||}|j|tjt|	jf nd }|jrbd }
g }g }t|jt|j }d}xNtt|jD ]<\}\}}|d k	r|d k	s |d kr|d k	r|dkrd}qW t|jd	kp:|}x t|D ]\}\}}|j rtt||	  j}|
d kr.t }x6t|jD ](\}\}}|j| |r|j| qW |jd	 d	 g}d }|jd	 d rt|jd	 d j}|d kr&|d k	r&y&|jd d }t|jd d	 j}W n tk
rF   d }Y nX |r&|	tttttt t!hks|d	dhkr&t|jd	kr&|j|jd d	  | j"|}|	t#kr|| }}|j|||f |	t$kr&|jd
 d r"|j|jd
 d	  | j"|jd
 d }|j|ttd j|f d}|	t#gkr6qH|r.|sH|r.|	j%}|	j}xz|jD ]p\}}|td kr\td |kstd |kstd |kr\|j%}|j}|d k	r\|j&|tjt|	jf q\W ttd|  j}|d k	r|j|||f n0t'  }
}|j|||f |j|tjt|f |d k	rH||krH||krVt(|}n|td krtttd j}nn|td krttd j}nP|td krtj}n:|td krt)j*}n$t+|t,j-rt|j}n
| j"|}td j|kr ttd j}td j|krttd j}td j|kr<ttd j}|	t.krdtd j|krdttd j}|	ttgkrtd j|ks|	tgkrtd j|krttd j}|	ttttt!gkr8td j|krttd j}td  j|krttd j}td! j|krttd j}td" j|kr8ttd# j}|	t/gkrtt0|kr\ttd$ j}t1|krtttd% j}|	tkrtd j|krttd j}td& j|krttd' j}td( j|krttd) j}td* j|krttd j}|j||| j"|f qH|d krqHt+|t,j2r>tt||}n
| j"|}|td" krttd# j}drt+|tt,j-frt+|t,j-rt|j}|j|||f n|j||| j"|f qH|td krtj}nT|td krt)j*}n>|t0krttd$ j}n$|t1kr ttd% j}n
| j"|}|j|||f qHW qbW |S )+N)r   provc                s   | j r| j jS  j| S )N)Z_identifierr7   r9   )record)id_generatorr,   r-   <lambda>	  s    z4ProvRDFSerializer.encode_container.<locals>.<lambda>r   Fr4   Tr      
asInBundlerx   Revision	QuotationPrimarySource	qualifiedrolerK   ZplanrL   rF   Z	informantactivityZresponsibleagentrO   ZtriggerrD   entitytimerJ   enderZstarterlocationrG   rH   rI   rA   rN   rE   rM   Z
usedEntity)3r   r   bindr   r7   
namespacesr   r.   Z_recordsget_typer   r   r   straddr   rx   
attributeslistformal_attributes	enumeratelenZextra_attributesZis_relationsetappend
IndexErrorr   r   r   r   r   r&   r   rz   r   r   Z
_localpartremover   rR   r   rF   r_   r5   rw   r   r   r   r   Z
ProvRecord) r1   rT   r   rh   r   nm	namespaceZreal_or_anon_idr   Zrec_typeZbnodeZformal_objectsZused_objectsZall_attributesZformal_qualifiersZattridrQ   rU   Zhas_qualifiersidxpredZvalid_formal_indiceskeyvalZsubjZobj_valZobj_attr	qualifierZrec_uri	attr_nameZQRoler8   r,   )r   r-   r      sl   




























z"ProvRDFSerializer.encode_containerc       
      C   s   x$|j  D ]\}}|j|t| q
W t|drxj|j D ]J}t|jtr^| j||||d q:t|j}|j	|}	| j||	||d q:W n| j||||d d S )Ncontexts)rk   rl   )
r   r   r   r   r   r_   r   r   decode_containerrT   )
r1   contentrY   rk   rl   r   urlr   Z	bundle_idrT   r,   r,   r-   rn     s,    



z!ProvRDFSerializer.decode_documentc       &      C   s  i }i }i }i }x"t j D ]\}	}
t |	 ||	j< qW i }x|jd tjd fD ]}t|d }t|d }||krt|d t r| j	|d kr|j
j|\}}}| jj|| y|| }W n tk
r   d }Y nX d}tjd j|d kptjd j|d kptjd j|d k}||kr|r|j|ksP|sPt|d tr|||< tj| }tdd |jD ||< td	d |jD ||< d
pt|d ts|o|j|k}|r4||krg ||< | j|d |}|| jtjd |f qN||krg ||< | j|d |}|| jtjd |f qNW x|D ]\}}}t|}||krfg ||< |tjkrvq@||krd|krt||| || qd|kr d }x2|jt|ttjd jd fD ]}|d }qW t||| |t|| nd|ksd|krd|| j d  || dd   }d }x2|jt|ttj| jd fD ]}|d }q^W |d krt||| |t| n@t|t| j }||t| |d < t||t| |d < nt||| |t| n||kr| j||}|d k	r(|d kr(td|f|}||kr>|| }|| tkr^dt|kr^t}|| tkr~dt|kr~t}|| t t!gkrdt|krt"}|| t gkrdt|krt#}|| t!gkrdt|krt$}|| t%krdt|krt&}t|dd || D krn| j	|}||| |< || | j| t'|| | dkrd || |< n2dt|krdt|kr|| jt||f t|}||kr@d|kr@||| t|| j d < q@W x|D ]}d } ||kr|| } g }!x<|| j D ],\}"}#|#rt'|#dkr|!j|"|#f qW |!rxltt(|!D ]B}$x"|$j D ]\}	}%|%|| |	< qbW |j)|| ||| |  qTW n|j)|| ||| |  d ||< | d k	rg ||< qW x*|j D ]\}	}
|
r||	 j*|
 qW d S )Nr   r   Tr   r   r   c             S   s   g | ]}|d fqS )Nr,   ).0r   r,   r,   r-   
<listcomp>1  s    z6ProvRDFSerializer.decode_container.<locals>.<listcomp>c             S   s   g | ]}|g fqS r,   r,   )r   r   r,   r,   r-   r   4  s    Frx   r=   r?   r   r>   r@   r   r4   zError transformingr   r   r   c             S   s   g | ]
}|j qS r,   )r7   )r   r   r,   r,   r-   r   z  s    )+r   itemsr7   Ztriplesr   rx   r   r_   r   rp   r   r   rY   r   AttributeErrorr5   r   ZPROV_REC_CLSr   ZFORMAL_ATTRIBUTESr   r   getattrr   upperr   keys
ValueErrorr   r    r   r!   r   r   r"   r#   r$   r   r%   r   walkZ
new_recordZadd_attributes)&r1   r   rT   rk   rl   idsZPROV_CLS_MAPr   Zunique_setsr   r   Zother_attributesstmtr3   r8   r   r   r   Zprov_objZadd_attrZisderivationklassZobj_formattedr   ZmentionBundler   Zqualifier_bnodeZfakeysZobj1Zpred_newZ	qname_keyZ	local_keyattrsZitems_to_walkqnamevaluesZsubsetrU   r,   r,   r-   r     s    










 $ 


 



"

 
z"ProvRDFSerializer.decode_container)r)   r*   r+   __doc__r   r]   rk   rl   ro   rp   rz   r   rX   r   rn   r   r,   r,   r,   r-   rV   y   s   ( k"rV   Tc       
      c   s   |dkri }| s|j  V  dS | d | dd  }}|\}}xD|D ]<}|rT|||< n|||< x t||d ||D ]
}	|	V  qpW qBW dS )a9  Generate all the full paths in a tree, as a dict.

    :Example:

    >>> from prov.serializers.provrdf import walk
    >>> iterables = [('a', lambda: [1, 2]), ('b', lambda: [3, 4])]
    >>> [val['a'] for val in walk(iterables)]
    [1, 1, 2, 2]
    >>> [val['b'] for val in walk(iterables)]
    [3, 4, 3, 4]
    r   Nr4   )rZ   r   )
childrenlevelpathZusenameheadtailnamefuncchildZchild_pathsr,   r,   r-   r     s    


r   c             C   sX   | j rt| j n| }| jr,t|t| jdS | j}d|jkrF| j j }t||jdS d S )N)langr|   )rr   )rU   r   r   ru   rr   r7   encode)r   rU   rr   r,   r,   r-   rs     s    

rs   )F)r   NT)Lr   r   collectionsr   rt   r[   Zdateutil.parserr   Zrdflib.termr   r   r   ru   Zrdflib.graphr   Zrdflib.namespacer   r   r	   r   r
   Z
prov.modelmodelr5   Zprov.constantsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   Zprov.serializersr'   
__author__	__email__r(   r.   floatr;   r   ry   r7   rk   rF   ZPROV_ATTR_PLANZPROV_ATTR_USAGEZPROV_ATTR_GENERATIONZPROV_ATTR_ACTIVITYrl   rR   rS   rV   r   rs   r,   r,   r,   r-   <module>   sl   
x
    -
!