3
d0                 @   s(  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	T d dl
mZmZmZmZmZmZmZmZ d dlZejeZdZdZG d	d
 d
eZG dd dZedediZG dd deZG dd dejZ G dd dej!Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd  Z(d!d" Z)d#d$ Z*dS )%    )defaultdictN)Error)
Serializer)*)Literal
IdentifierQualifiedName	NamespaceProvDocument
ProvBundlefirstparse_xsd_datetimezTrung Dong Huynhztrungdong@donggiang.comc               @   s   e Zd ZdS )ProvJSONExceptionN)__name__
__module____qualname__ r   r   9/tmp/pip-build-7vycvbft/prov/prov/serializers/provjson.pyr      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r0|  jd7  _td|| jf | j |< | j | S )N   z_:%s%d)r   r   r   )r   objZlocal_prefixr   r   r   get_anon_id%   s    
z AnonymousIDGenerator.get_anon_idN)r   )r   r   r   r   r   r   r   r   r   r       s   r   z
xsd:doublezxsd:intc               @   s    e Zd ZdZdd Zdd ZdS )ProvJSONSerializerzD
    PROV-JSON serializer for :class:`~prov.model.ProvDocument`
    c          
   K   sr   t j }zZtj| j|fdti| |jdd t|t jrL|j	|j
  n|j	|j
 jd W d|j  X dS )z
        Serializes a :class:`~prov.model.ProvDocument` instance to
        `PROV-JSON <https://openprovenance.org/prov-json/>`_.

        :param stream: Where to save the output.
        clsr   zutf-8N)ioStringIOjsondumpdocumentProvJSONEncoderseek
isinstance
TextIOBasewritereadencodeclose)r   streamkwargsbufr   r   r   	serialize:   s    zProvJSONSerializer.serializec             K   s:   t |tjs$tj|j jd}|}tj|fdti|S )z
        Deserialize from the `PROV JSON
        <https://openprovenance.org/prov-json/>`_ representation to a
        :class:`~prov.model.ProvDocument` instance.

        :param stream: Input data.
        zutf-8r   )	r&   r   r'   r    r)   decoder!   loadProvJSONDecoder)r   r,   r-   r.   r   r   r   deserializeO   s    zProvJSONSerializer.deserializeN)r   r   r   __doc__r/   r3   r   r   r   r   r   5   s   r   c                   s   e Zd Z fddZ  ZS )r$   c                s&   t |trt|S tt| j|S d S )N)r&   r
   encode_json_documentsuperr$   r*   )r   o)	__class__r   r   default^   s    
zProvJSONEncoder.default)r   r   r   r9   __classcell__r   r   )r8   r   r$   ]   s   r$   c                   s   e Zd Z fddZ  ZS )r2   c                s,   t t| j|f||}t }t|| |S )N)r6   r2   r0   r
   decode_json_document)r   sargsr-   	containerr#   )r8   r   r   r0   f   s    
zProvJSONDecoder.decode)r   r   r   r0   r:   r   r   )r8   r   r2   e   s   r2   c             C   s   |d krd S | j |}|S )N)valid_qualified_name)bundlevalueZqualified_namer   r   r   r?   n   s    
r?   c             C   s6   t | }x(| jD ]}t |}||d t|j< qW |S )Nr@   )encode_json_containerbundlesstr
identifier)r#   r>   r@   Zbundle_jsonr   r   r   r5   u   s
    r5   c                s  t t}i }x| jj D ]}|j||j< qW | jjrB| jjj|d< |rN||d< t   fdd}x| jD ]}|j	 }t
| }t||}i }	|jr(x|jj D ]\}
}|sqt|
}|
tkrtt||	|< q|
tkrt|j |	|< qt|dkrtt||	|< qtdd |D |	|< qW ||| krD|	|| |< qj|| | }t|drj|g|| |< || | j|	 qjW |S )	Nr9   prefixc                s   | j r| j S  j| S )N)Z_identifierr   )r)id_generatorr   r   real_or_anon_id   s    z.encode_json_container.<locals>.real_or_anon_idr   c             s   s   | ]}t |V  qd S )N)encode_json_representation).0rA   r   r   r   	<genexpr>   s    z(encode_json_container.<locals>.<genexpr>items)r   dict_namespacesZget_registered_namespacesurirF   _defaultr   Z_recordsget_typeZ
PROV_N_MAPrD   _attributesrM   PROV_ATTRIBUTE_QNAMESr   ZPROV_ATTRIBUTE_LITERALS	isoformatlenrJ   listhasattrappend)r@   r>   prefixes	namespacerI   recordrec_typeZ	rec_labelrE   Zrecord_jsonattrvalues	attr_nameZcurrent_contentr   )rH   r   rB   ~   sH    rB   c             C   sf   t  }d| kr| d }| d= t| | x:|j D ].\}}t|d}t|| |j||j| q0W d S )Nr@   )r#   )rN   decode_json_containerrM   r   Z
add_bundler?   )contentr#   rC   Z	bundle_idZbundle_contentr@   r   r   r   r;      s    


r;   c          	      s  d| krP| d }x8|j  D ],\}}|dkr<jt|| qj| qW | d= x| D ]}t| }x| | j  D ]\}}t|dr|g}	n|}	xb|	D ]X}
t }g }d }x|
j  D ]\}}|tkrt| nt|  t	krzt
|trPt|dkrF|tkr. tkr.|dd  }|d }nd}tj| t|n|d }n|} tkrht|nt|}|| < qt
|tr|j fdd|D  q|j t|f qW j|||| |r|t }x |D ]}j|t| qW qW qvW qXW d S )	NrF   r9   rM   r   r   zIThe prov package does not support PROV attributes having multiple values.c             3   s   | ]} t |fV  qd S )N)decode_json_representation)rK   rA   )r^   r@   r   r   rL     s   z(decode_json_container.<locals>.<genexpr>)rM   Zadd_namespacer	   Zset_default_namespaceZPROV_RECORD_IDS_MAPrX   rN   ZPROV_ATTRIBUTES_ID_MAPr?   ZPROV_ATTRIBUTESr&   rW   rV   ZPROV_MEMBERSHIPZPROV_ATTR_ENTITYloggererrorr   rT   r   extendrY   rc   Z
new_recordZPROV_ATTR_COLLECTIONZ
membership)Zjcr@   rZ   rF   rP   Zrec_type_strr]   Zrec_idrb   elementselement
attributesZother_attributesZmembership_extra_membersr`   r_   rA   Z	error_msgZ
collectionmemberr   )r^   r@   r   ra      s^    










ra   c             C   s   t | trt| S t | tjr,| j ddS t | trFt| tjdS t | t	r\| j
ddS t| tkrz| tt|  dS | S d S )Nzxsd:dateTime)$typez
xsd:anyURI)r&   r   literal_json_representationdatetimerU   r   rD   PROV_QUALIFIEDNAME_strr   rP   rl   LITERAL_XSDTYPE_MAP)rA   r   r   r   rJ     s    


rJ   c             C   s|   t | trt| d }d| kr"| d nd }t||}d| kr@| d nd }|tkrTt|S |tkrft||S t|||S n| S d S )Nrk   rl   lang)r&   rN   r?   Z
XSD_ANYURIr   ro   r   )literalr@   rA   datatypelangtagr   r   r   rc   0  s    


rc   c             C   s6   | j | j| j  }}}|r$||dS |t|dS d S )N)rk   rr   )rk   rl   )rA   rt   ru   rD   )rs   rA   rt   ru   r   r   r   rm   E  s    
rm   )+collectionsr   rn   r   r!   Zprovr   Zprov.serializersr   Zprov.constantsZ
prov.modelr   r   r   r	   r
   r   r   r   logging	getLoggerr   rd   
__author__	__email__r   r   floatintrq   r   JSONEncoderr$   JSONDecoderr2   r?   r5   rB   r;   ra   rJ   rc   rm   r   r   r   r   <module>   s4   (
(		;X