B
    j]\]                 @   s
  d Z ddlmZ ddlmZ ddlZddlmZmZm	Z	m
Z
mZmZmZmZmZmZ G dd deZy|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% dd	l&m'Z' dd
lm(Z) ddlm*Z*m+Z+ W n\   e Z Z Z Z Z' Z) Z Z Z Z Z Z Z Z Z  Z! Z" Z# Z$Z%Y nX dd Z,yddl-m.Z.m/Z/m0Z0 W n   e Z. Z/Z0Y nX yddl1m2Z2 e2j3j3Z3W n   eZ3Y nX yddl4Z4e4j5j6Z6W n   eZ6Y nX dd Z7dd Z8dd Z9dd Z:ddl;Z;yddl<m=Z> W n   dd Z>Y nX dd Z?dd Z@dZAd ZBeCd!eeBeDd"eEd#eFd$e	d%ee'ee.e0e/feAe3d&e;jGd'e;jHd'i
ZId(ZJd)ZKd*d+ ZLd,d- ZMdMd/d0ZNd1d2 ZOdNd4d5ZPd6d7 ZQdOd8d9ZRdPd:d;ZSd<d= ZTd>d? ZUd@dA ZVdQdBdCZWdRdDdEZXdFZYdGdH ZZdSdIdJZ[dTdKdLZ\dS )Uz
Utilities
    )print_function)isliceN)
NUMERIC_TYPES	INT_TYPES
TEXT_TYPESto_text_stringis_text_stringis_type_text_stringis_binary_stringPY2to_binary_string	iteritemsc               @   s   e Zd ZdZdS )
FakeObjectz1Fake class used in replacement of missing modulesN)__name__
__module____qualname____doc__ r   r   :lib/python3.7/site-packages/spyder_kernels/utils/nsview.pyr      s   r   )ndarrayarraymatrixrecarrayint64int32int16int8uint64uint32uint16uint8float64float32float16	complex64
complex128bool_)MaskedArray)savetxt)get_printoptionsset_printoptionsc          	   C   sN   t tk	rJddl}t| |js(t| |j rJy| jjS  ttfk
rH   dS X dS )zReturn NumPy data type associated to obj
    Return None if NumPy is not available
    or if obj is not a NumPy array or scalarr   N)	r   r   numpy
isinstancegenericdtypetypeAttributeErrorRuntimeError)objZnpr   r   r   get_numpy_dtype2   s    r3   )	DataFrameDatetimeIndexSeries)	pil_patchc             C   s$   d| j jtt|  ddf S )z:Return object address as a string: '<classname @ address>'z	<%s @ %s>Xx)	__class__r   hexidupperreplace)r2   r   r   r   addressf   s    r?   c          
   C   s(   yt | S  tttfk
r"   | S X dS )zTry to eval valueN)eval	NameErrorSyntaxErrorImportError)valuer   r   r   try_to_evall   s    rE   c             C   sZ   t | tttfrt| S t | ttfr,| jS t | tr<| j	S t | t
ttfrR| jS dS dS )z(Return size of an item of arbitrary type   N)r,   listtupledictlenr   r'   shapeImagesizer4   r5   r6   )itemr   r   r   get_sizet   s    
rO   c             C   s"   dd t | D }|st | }|S )z[
    Get the attributes of an object using dir.

    This filters protected attributes
    c             S   s   g | ]}| d s|qS )__)
startswith).0kr   r   r   
<listcomp>   s    z$get_object_attrs.<locals>.<listcomp>)dir)r2   Zattrsr   r   r   get_object_attrs   s    rV   )parsec             C   s   t j ttt| d S )z#Just for 'year, month, day' strings,)datetimerG   mapintsplit)Zdatestrr   r   r   	dateparse   s    r]   c             C   s.   |  dd }t| |d }t| d| |S )N(rF   z-->)rfindr]   print)rD   Zrpvr   r   r   datestr_to_datetime   s    rc   c             C   s<   t d| }|stddd |ddD }tj| S )a  Convert a string to a datetime.timedelta value.

    The following strings are accepted:

        - 'datetime.timedelta(1, 5, 12345)'
        - 'timedelta(1, 5, 12345)'
        - '(1, 5, 12345)'
        - '1, 5, 12345'
        - '1'

    if there are less then three parameters, the missing parameters are
    assumed to be 0. Variations in the spacing of the parameters are allowed.

    Raises:
        ValueError for strings not matching the above criterion.

    z,^(?:(?:datetime\.)?timedelta)?\(?([^)]*)\)?$z%Invalid string for datetime.timedeltac             S   s   g | ]}t | qS r   )r[   strip)rR   ar   r   r   rT      s    z$str_to_timedelta.<locals>.<listcomp>rF   rX   )rematch
ValueErrorgroupr\   rY   	timedelta)rD   margsr   r   r   str_to_timedelta   s    rm   z#00ff00z#0000ffz#ff00ffz#ffff00z#00ffffz#c0c0c0z#800000z#008000z#808000z#7755aaz#ffffffc             C   sh   t | stS xVtt D ]\}}t| |r|S qW t| }|dksNt| dsRtS | j	dkr`t
S tS dS )z)Return color name depending on value typeNrM   rF   )is_known_typeCUSTOM_TYPE_COLORrG   COLORSitemsr,   r3   hasattrUNSUPPORTED_COLORrM   SCALAR_COLORARRAY_COLOR)rD   typnamenp_dtyper   r   r   get_color_name   s    

ry   c             C   s   t | ttfkS )zReturn True if data type is editable with a standard GUI-based editor,
    like CollectionsEditor, ArrayEditor, QDateEdit or a simple QLineEdit)ry   rs   ro   )rD   r   r   r   is_editable_type   s    rz   Fc             C   s2   y"dd t t|| dd |dD S    | S dS )z
    Arrange items of list1 in the same order as sorted(list2).

    In other words, apply to list1 the permutation which takes list2 
    to sorted(list2, reverse).
    c             S   s   g | ]\}}|qS r   r   )rR   _rN   r   r   r   rT      s    z sort_against.<locals>.<listcomp>c             S   s   | d S )Nr   r   )r9   r   r   r   <lambda>   s    zsort_against.<locals>.<lambda>)keyreverseN)sortedzip)Zlist1Zlist2r~   r   r   r   sort_against   s
    r   c             C   s   t t| S )z=Removes duplicates from lista neglecting its initial ordering)rG   set)Zlistar   r   r   unsorted_unique   s    r   Tc             C   sP   t | }y(|j}|j}|r*|d | d S |S W n   t|}|dd S dS )z$Default display for unknown objects.z object of z modulerF   r_   N)r/   r   r   r   )rD   with_moduleZobject_typerw   moduleZtype_strr   r   r   default_display  s    r   c                s  t | t}|rt| }n| }d} dkrTt| dkrT|rBt|dn
| dd }d}n2 dkrt| dkr|rvt|dn
| dd }d} dkr|r fdd	t|D }n fd
d	|D }|r|d d|}nd}|rd| d }n&t | trd| d }nd| d }|S )z4Display for collections (i.e. list, tuple and dict).FrF   
   NT      c                s,   g | ]$\}}t | d d t | d  qS ))level:)value_to_display)rR   rS   rb   )r   r   r   rT   -  s   z'collections_display.<locals>.<listcomp>c                s   g | ]}t | d qS ))r   )r   )rR   e)r   r   r   rT   1  s   z...z, {}[]r^   ))r,   rI   r   rJ   r   rG   appendjoin)rD   r   Zis_dictelementstruncateZdisplaysdisplayr   )r   r   collections_display  s6    




r   c       
         s   t }yttttttttt	t
ttttf}tt k	rFt d}tdd t trv|dkrn j}dd| }nd}nDt trd}n2t tr|dkr|ryd	    f }W n6 ttfk
r    jj|krt }nt }Y nX n  jj|krt }nt }nd
}nt  fddt!t"t#gD rNt$ |d }nlt t%r|dkrxdt&  j'f }nd}n:t t(r&|dkr j)}t*rt+|dkryt,|d dd}W n   t,|d }Y nX |gdd |dd D  }ndd |D }ddt!| }nd}nt t-rTt, }|dkrd| d }nft t.r|dkry / }W n t0k
r    1 }Y nX nd}nt2 rt3 ry$t, d}|dkrd| d }W n&    }|dkrd| d }Y nX nt }nt4 rFt3 r< }|dkrDd| d }nt }ntt t5j6sbt t5j7rlt }nNt t8st t9st |rt: }n |dkrt }nt dd}W n   t }Y nX t+|dkrt2|rd}	nd}	|dd ; |	 }|t k	rt|d |S ) z!Convert value for display purpose	thresholdr   )r   r   zField names: z, ZRecarrayzMasked arrayzMin: %r
Max: %rzNumpy arrayc                s   g | ]}t  |kqS r   )r/   )rR   t)rD   r   r   rT   l  s    z$value_to_display.<locals>.<listcomp>rF   z%s  Mode: %srL   z	utf-8-sig)encodingc             S   s   g | ]}t |qS r   )r   )rR   cr   r   r   rT     s    Nc             S   s   g | ]}t |qS r   )r   )rR   r   r   r   r   rT     s    zColumn names: Z	Dataframe'r5   utf8   'F)r   F   s    ...z ...)<r   r   r   r   r   r   r   r   r    r!   r"   r#   r%   r$   r&   r   r)   getr*   r,   r   namesr   r'   minmax	TypeErrorrh   r.   r/   strr   anyrG   rH   rI   r   rL   r?   moder4   columnsr   rJ   r   NavigableStringr5   Z_summaryr0   Zsummaryr
   r	   r   rY   daterj   r   boolreprrstrip)
rD   minmaxr   Znp_thresholdZnumeric_numpy_typesZfieldsr   ZcolsZini_colZellipsesr   )rD   r   r   D  s    




























r   c          	   C   s  ddl m} || t} yht|}t|trbytt| } W n  tk
r\   |  dk} Y nX n|dk	rdt	t
|kr|t| } n|| } nt|rt| d} nt|rt| } nt|trt| } nt|trt| } nt|tryt| } W n tk
r   t| } Y nX ndt|tjr2t| } nLt|tjrNt|  } n0t|tjrft| } n|rvt| } nt| } W n. ttfk
r   |rt| } n|S Y nX | S )zConvert back to valuer   )from_qvarianttrueNcomplexr   )Zqtpy.compatr   r   r3   r,   r   floatrh   lowerr   r/   r   r
   r   r   r[   rY   rc   r   rj   rm   rE   r@   rB   )rD   Zdefault_valueignore_errorsr   rx   r   r   r   display_to_value  sP    












r   c             C   sN   t | trdS t | trdS t | tr*dS tdtt| }|rJ|d S dS )z Return type string of an object.r4   r5   r6   z<(?:type|class) '(\S*)'>r   N)r,   r4   r5   r6   rf   findallr   r/   )rN   foundr   r   r   get_type_string  s    


r   c             C   s   t | tpt| dk	S )z&Return True if object has a known typeN)r,   r'   r   )rN   r   r   r   rn     s    rn   c             C   sX   t | ttfr| jjS t | tr$dS t| }|dkr>td}n||dd d S dS )z,Return human-readable type string of an itemrL   Nunknown.rF   )	r,   r   r'   r.   rw   rL   r   r   find)rN   textr   r   r   get_human_readable_type  s    

r   c             C   s   |dk	st | dkrdS t| s$dS t| |s2dS |rt| tttfr|d}x(| D ] }t|||drj|d7 }|sPP qPW |dkS t| trx>t|  D ].\}}t|||drt|||dsdS |sP qW dS )z6Return True if the value is supported, False otherwiseNTFr   )filtersiteraterF   )	AssertionErrorrz   r,   rG   rH   r   is_supportedrI   rq   )rD   	check_allr   r   Zvalid_countvalr}   r   r   r   r   #  s2    


r   c             C   s   i }xt |  D ]x\}	}
|r(|	dp||r8|	d  p||rb|	 rbt|	dkrb|	dd   p||	|kp||o|t|
||d }|s|
||	< qW |S )z%Keep only objects that can be pickledr{   r   rF   N)r   r   )rG   rq   rQ   isupperrJ   isdigitr   )Z
input_dictr   r   exclude_privateexclude_capitalizedexclude_uppercaseexclude_unsupportedexcluded_namesZoutput_dictr}   rD   Zexcludedr   r   r   globalsfilter@  s    
r   )r   r   r   r   r   r   r   c              C   s   ddl m} m} tttttt| |gtt	 tt
 }y&ddlm}m}m} ||||g7 }W n   Y nX y&ddlm}m}m} ||||g7 }W n   Y nX |dd }	yddlm}
 ||
j W n   Y nX t|	|dS )z
    Return a dictionnary containing types lists supported by the
    namespace browser.

    Note:
    If you update this list, don't forget to update variablexplorer.rst
    in spyder-docs
    r   )r   rj   )r   r   r-   )r4   r6   r5   N)rL   )Z	picklableeditable)rY   r   rj   r[   r   r   rG   rI   rH   r   r   r+   r   r   r-   pandasr4   r6   r5   Zspyder.pil_patchrL   r   )r   rj   Zeditable_typesr   r   r-   r4   r6   r5   Zpicklable_typesrL   r   r   r   get_supported_types\  s&    	$r   c          
   C   sf   t  }|t| kst|d }|dk	r2||7 }t| |d t|| |d |d |d |d |dS )	a%  
    Return globals according to filter described in *settings*:
        * data: data to be filtered (dictionary)
        * settings: variable explorer settings (dictionary)
        * mode (string): 'editable' or 'picklable'
        * more_excluded_names: additional excluded names (list)
    r   Nr   r   r   r   r   )r   r   r   r   r   r   r   )r   rG   keysr   r   rH   )datasettingsr   more_excluded_namesZsupported_typesr   r   r   r   get_remote_data{  s    

r   c             C   s`   t | |d|d} i }xFt|  D ]6\}}t||d d}t|t|t||d||< q"W |S )zI
    Make a remote view of dictionary *data*
    -> globals explorer
    r   )r   r   r   )r   )r/   rM   Zcolorview)r   rG   rq   r   r   rO   ry   )r   r   r   Zremoter}   rD   r   r   r   r   make_remote_view  s    r   )F)T)Fr   )T)FNF)FNNNNNN)N)N)]r   Z
__future__r   	itertoolsr   rf   Zspyder_kernels.py3compatr   r   r   r   r   r	   r
   r   r   r   objectr   r+   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   Znumpy.mar'   r(   Z
np_savetxtr)   r*   r3   r   r4   r5   r6   Zspyderr7   rL   Zbs4elementr   r?   rE   rO   rV   rY   Zdateutil.parserrW   r]   rc   rm   ru   rt   r   rG   rI   rH   r   rj   rp   ro   rs   ry   rz   r   r   r   r   r   r   r   rn   r   r   r   ZREMOTE_SETTINGSr   r   r   r   r   r   r   <module>   s   0
PV


	

-
 
4
   

