B
    d=                 @   s   d Z ddlmZmZmZ ddlZddlmZ ddlm	Z	 ddl
Z
ddlmZ dd Zd	d
 Zdd ZdddZdd Zdd Zdd ZdS )z
Utility functions for automatically opening and serializing a python object into
a file using the latest pickling protocol. Can optionally compress the output if
file_name ends with .gz. Also provides functions to read that object back.
    )absolute_importdivisionprint_functionN)show_string)
smart_open)cPicklec          
   C   sZ   t j| } ytj| |dS  tk
rT } ztdt| t|f W dd}~X Y nX dS )zt
  Wraps libtbx.smart_open.

  Parameters
  ----------
  file_name : str
  mode : str

  Returns
  -------
  file
  )	file_namemodezCannot open pickle file %s (%s)N)ospath
expanduserr   fileIOErrorr   str)r   r	   e r   q/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/libtbx/easy_pickle.py_open   s     r   c          	   C   s*   t | d}t||tj}W dQ R X |S )z
  Wraps pickle.dump.

  Parameters
  ----------
  file_name : str
  obj : object

  Examples
  --------
  >>> from libtbx.easy_pickle import dump, load
  >>> dump("output.pkl.gz", [1, 2, 3])
  >>> print load("output.pkl.gz")
  [1, 2, 3]
  wbN)r   pickledumpHIGHEST_PROTOCOL)r   objfpr   r   r   r   #   s    r   c             C   s   t | t jS )z^
  Wraps pickle.dumps.

  Parameters
  ----------
  obj : object

  Returns
  -------
  str
  )r   dumpsr   )r   r   r   r   r   7   s    r   Tc          
   C   s   |rt jrt| d}| }W dQ R X y
t|S  tk
r } z>ddlm} ddl	}|dd|   d d|j
t|f  W dd}~X Y nX t| d}| }W dQ R X tj|d	d
S t| d}t|}W dQ R X |S )z
  Wraps pickle.load.

  Parameters
  ----------
  file_name : str
  faster_but_using_more_memory : bool, optional
      Optionally read the entirety of a file into memory before converting it
      into a python object.

  Returns
  -------
  object
  rbNr   )Sorryz[Please check that you are not using an old version and reading a file from a new version.  z(The file %s z#was saved with a version of Python z/that is not supported in this version (%s): %s)bytes)encoding)sixPY2r   readr   loads
ValueErrorlibtbx.utilsr   sysversionr   load)r   Zfaster_but_using_more_memoryr   sr   r   r&   r   r   r   r   r(   E   s&    
&r(   c             C   s
   t | S )z
  Wraps pickle.loads.

  Parameters
  ----------
  string : str

  Returns
  -------
  object

  Examples
  --------
  >>> from libtbx.easy_pickle import dumps, loads
  >>> print loads(dumps([1, 2, 3])
  [1, 2, 3]
  )r   r#   )stringr   r   r   r#   k   s    r#   c              O   s   t d| |f dS )z1
  Dumps args and keyword_args to args.pickle.
  zargs.pickleN)r   )argsZkeyword_argsr   r   r   	dump_args   s    r,   c             C   s   ddl m}m} t| |rjxNt|  D ]>}t|trV|d}| | | |< | |= |}t| | | |< q(W t| |rx$t	t
| D ]}t| | | |< qW t| drt| j| _t| drt| jdrt| jj| j_t| tr| d} | S )zq
  Fix pickles from Python 2

  Parameters
  ----------
  p: pickle

  Returns
  -------
  p: the fixed pickle
  r   )MappingMutableSequenceutf8__dict___infolabels)collections.abcr-   r.   
isinstancelistkeysr   decodefix_py2_picklerangelenhasattrr0   r1   r2   )r   r-   r.   keyZstr_keyir   r   r   r8      s&    






r8   )T)__doc__
__future__r   r   r   r
   libtbx.str_utilsr   libtbxr   r    	six.movesr   r   r   r   r   r(   r#   r,   r8   r   r   r   r   <module>   s   
&