B
    d!                 @   s@  d dl mZmZmZ d dlZd dlZd dlZd dlmZ dZ	d,ddZ
e
ed< d-ddZeed< G dd deZe ZG dd deZG dd deZG dd deZG dd deZG dd deZd.ddZdd ZG d d! d!eZG d"d# d#eZejd$rd dlZejd%kr<ed& Zd/d)d*Zeed&< eed+< dS )0    )absolute_importdivisionprint_functionN)objectiÏ2c             C   s.   t d}td|jj|jf  t |  d S )N   zSTOP: %s(%d))sys	_getframeprintf_codeco_filenamef_linenoexit)Zexit_statusf r   n/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/libtbx/__init__.py_STOP
   s    
r   ZSTOP%.6g, []c             C   s   g }xz| D ]r}|d kr6dt dt|d d  d }n<|d k	rNt||krNd}|| }| dddkrr|d }|| q
W |d || |d  S )	N r      None0 )-z-.r   )maxlenabsstripreplaceappendjoin)valuesZfmtsepZbracketsZzero_thresholdZfldsvsr   r   r   _numstr   s    
 r(   Znumstrc                   sD   e Zd ZdZdZdd Zdd Zdd Zd	d
 Z fddZ	  Z
S )AutoTypea  
  Class for creating the Auto instance, which mimics the behavior of None
  with respect to the 'is' and '==' operators; this is used throughout
  CCTBX to indicate parameters that should be determined automatically.

  Examples
  --------
  >>> def f(optional=libtbx.Auto)
  ...    if optional is libtbx.Auto:
  ...        optional = 5
  ...    return optional
  ...
  >>> print(f())
  5
  >>> print(f(optional=10))
  10
  Nc             C   s   dS )NAutor   )selfr   r   r   __str__8       zAutoType.__str__c             C   s   t || jS )N)
isinstance	__class__)r+   otherr   r   r   __eq__9   s    zAutoType.__eq__c             C   s   |  | S )N)r1   )r+   r0   r   r   r   __ne__;   s    zAutoType.__ne__c             C   s   t tS )zQAutoType behaves as a singleton, so return the same hash value for all instances.)hashr)   )r+   r   r   r   __hash__=   s    zAutoType.__hash__c                s"   | j d krtt| | | _ | j S )N)	singletonsuperr)   __new__)cls)r/   r   r   r7   @   s    
zAutoType.__new__)__name__
__module____qualname____doc__r5   r,   r1   r2   r4   r7   __classcell__r   r   )r/   r   r)   $   s   r)   c               @   s$   e Zd ZdZg Zdd Zdd ZdS )slots_getstate_setstateaq  
  Implements getstate and setstate for classes with __slots__ defined. Allows an
  object to easily pickle only certain attributes.

  Examples
  --------
  >>> class sym_pair(libtbx.slots_getstate_setstate):
  ...     __slots__ = ["i_seq", "j_seq"]
  ...     def __init__(self, i_seq, j_seq):
  ...         self.i_seq = i_seq
  ...         self.j_seq = j_seq
  ...
  c                sr   ddl }|jdd }|j}z|d ddlm  W d||_||_X  fddjD }tfdd|D S )a  
    The name of some attributes may start with a double underscore such as
    cif_types.comp_comp_id.__rotamer_info. Python name mangling will rename such
    an attribute to _comp_comp_id_rotamer_info. Our __getstate__ function would then
    complain that the __slots__ list contains the non-existent attribute __rotamer_info.
    To fix this we manually mangle attributes with the compiler.misc.mangle function
    which does the right name mangling.
    r   Nignore)manglec                s   g | ]} |j jqS r   )r/   r9   ).0name)r@   r+   r   r   
<listcomp>n   s    z8slots_getstate_setstate.__getstate__.<locals>.<listcomp>c                s   g | ]}|t  |fqS r   )getattr)rA   rB   )r+   r   r   rC   p   s    )warningsfiltersshowwarningsimplefilterZlibtbx.utilsr@   	__slots__dict)r+   rE   Zwarning_filtersZshow_warningZmnamesr   )r@   r+   r   __getstate__X   s    	
z$slots_getstate_setstate.__getstate__c             C   s:   x4|  D ](\}}t|tr&|d}t| || q
W d S )Nutf8)itemsr.   bytesdecodesetattr)r+   staterB   valuer   r   r   __setstate__r   s    

z$slots_getstate_setstate.__setstate__N)r9   r:   r;   r<   rI   rK   rS   r   r   r   r   r>   G   s   r>   c               @   s   e Zd ZdgZdd ZdS )mutablerR   c             C   s
   || _ d S )N)rR   )OrR   r   r   r   __init__{   s    zmutable.__init__N)r9   r:   r;   rI   rV   r   r   r   r   rT   x   s   rT   c               @   s   e Zd ZdZdd ZdS )+slots_getstate_setstate_default_initializera2  
  Merges together functionality from slots_getstate_setstate with
  adopt_optional_init_args.

  Examples
  --------
  >>> class sym_pair(libtbx.slots_getstate_setstate_default_initializer):
  ...     __slots__ = ["i_seq", "j_seq"]
  ...
  >>> svm_pair(i_seq=1, j_seq=2)
  >>> print(svm_pair.i_seq)
  1
  c             K   s.   t |}x |D ]}t| |||d  qW d S )N)rJ   rP   get)r+   kwdskeyr   r   r   rV      s    
z4slots_getstate_setstate_default_initializer.__init__N)r9   r:   r;   r<   rV   r   r   r   r   rW   ~   s   rW   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )unpicklablez[
  An inheritable class that raises a runtime exception that an object is
  unpicklable.
  c             C   s   t d| jj d S )Nz#pickling of %s objects is disabled.)RuntimeErrorr/   r9   )rU   r   r   r   _raise_error   s    zunpicklable._raise_errorc             C   s   |    d S )N)r]   )rU   r   r   r   __getinitargs__   r-   zunpicklable.__getinitargs__c             C   s   |    d S )N)r]   )rU   r   r   r   rK      r-   zunpicklable.__getstate__c             C   s   |    d S )N)r]   )rU   rQ   r   r   r   rS      r-   zunpicklable.__setstate__N)r9   r:   r;   r<   r]   r^   rK   rS   r   r   r   r   r[      s
   r[   c               @   s   e Zd Zdd ZdS )dict_with_default_0c             C   s   dS )Nr   r   )r+   rZ   r   r   r   __missing__   s    zdict_with_default_0.__missing__N)r9   r:   r;   r`   r   r   r   r   r_      s   r_   r   Fc             C   s   d|kr|d= n|d= x|D ]
}||= qW |dkrxx6|  D ]*}|drV|drVq<t| j|r<tq<W | j| n8x6|  D ]*}d| }t| j|rt|| | j|< qW dS )a  
  Adopts the initial arguments passed to an object, allowing developers to skip
  the tedious task of assigning each attribute of an instance in its __init__
  method.

  Parameters
  ----------
  obj : object
  args : list
  exclude : list of str
  hide : bool, optional

  Examples
  --------
  >>> class foo(object):
  ...     def __init__(self, x, y=1, z=None):
  ...         adopt_init_args(self, locals())
  ...
  >>> a = foo('a', z=10)
  >>> assert a.x == 'a'
  >>> assert a.y == 1
  >>> assert a.z == 10
  r+   rU   FZ___N)keys
startswithendswithhasattr__dict__AssertionErrorupdate)objargsZexcludeZhideZparamrZ   Z_keyr   r   r   adopt_init_args   s     

rk   c             C   sD   x>|  D ]2\}}t| j|s0td|| jf t| || q
W dS )a  
  Easy management of long list of arguments with default value
  passed to __init__.

  Parameters
  ----------
  obj : object
  kwds : dict

  Examples
  --------
  >>> class foo(object):
  ...     z = 1
  ...     def __init__(self, **kwds):
  ...       libtbx.adopt_optional_init_args(self, kwds)
  ...
  >>> a = foo()
  >>> assert a.z == 1
  >>> a = foo(z=10)
  >>> assert a.z == 10
  zh%s must be a class attribute of %s to be adopted as optional init argument by an instance of that class.N)rM   re   r/   r\   rP   )ri   rY   kr&   r   r   r   adopt_optional_init_args   s
    rm   c               @   s    e Zd ZdZdd Zdd ZdS )ddaFc             C   s*   | j rt| |stdt| || d S )NzDynamic attributes disabled.)dynamic_attributes_disabledre   	TypeErrorr   __setattr__)r+   rl   r&   r   r   r   rq      s    zdda.__setattr__c             C   s
   d| _ d S )NT)ro   )r+   r   r   r   stop_dynamic_attributes   s    zdda.stop_dynamic_attributesN)r9   r:   r;   ro   rq   rr   r   r   r   r   rn      s   rn   c               @   sT   e Zd ZdZdd Zdd ZdddZd	d
 Zdd Zdd Z	dddZ
dd ZdS )
group_argsaT  
  Class to build an arbitrary object from a list of keyword arguments.

  Examples
  --------
  >>> from libtbx import group_args
  >>> obj = group_args(a=1, b=2, c=3)
  >>> print(obj.a, obj.b, obj.c)
  1 2 3

  Once stop_dynamic_attributes is called, adding new attributes won't be
  possible, that is this:

  obj.tmp=10

  will fail.
  c             K   s   | j | d S )N)rf   rh   )r+   Zkeyword_argumentsr   r   r   rV     s    zgroup_args.__init__c             C   s   | j S )N)rf   )r+   r   r   r   __call__	  s    zgroup_args.__call__Nc             C   s   | j ||S )N)rf   rX   )r+   kwZdefault_valuer   r   r   rX     s    zgroup_args.getc             C   s
   | j  S )N)rf   rb   )r+   r   r   r   rb     s    zgroup_args.keysc             C   sb   d}xXt | j D ]F}t| |}t|ddkrJ|d|| f 7 }q|d||f 7 }qW |S )Nrs   z	ext.atom z
  %-30s : %s)sortedrf   rb   rD   strfindquote)r+   ZoutlattrZtmpr   r   r   __repr__  s    
zgroup_args.__repr__c             C   s   | j |j  dS )zG To merge other group_args into self.
    Overwrites matching fields!!!N)rf   rh   )r+   r0   r   r   r   merge  s    zgroup_args.mergec             C   s   || j |< d S )N)rf   )r+   rZ   rR   r   r   r   add!  s    zgroup_args.addc             C   s   t f |   S )z< produce shallow copy of self by converting to dict and back)rs   copy)r+   r   r   r   r   $  s    zgroup_args.copy)N)NN)r9   r:   r;   r<   rV   rt   rX   rb   r|   r}   r~   r   r   r   r   r   rs      s   


rs   ZLIBTBX_PRINT_TRACEcygwinopenrrv   c             C   sN   yt | ||S  tk
r"    Y n tk
r4   Y nX tj| } t | ||S )N)builtin_openKeyboardInterrupt	Exceptionospathrealpath)rB   mode	bufferingr   r   r   open_realpath.  s       r   file)r   )r   r   r   N)r   F)r   rv   )
__future__r   r   r   Zlibtbx.forward_compatibilitylibtbxr   r   r   Zmanual_date_stampr   __builtins__r(   r)   r*   r>   rT   rW   r[   rJ   r_   rk   rm   rn   rs   environrX   Zlibtbx.start_print_traceplatformr   r   r   r   r   r   <module>   s<   
   
!1
(
5
