U
    c.                     @   s|   d dl mZmZ d dlZd dlmZ d dlT d dlT ddd	ZG d
d de	Z
G dd deZdddZdd Zdd ZdS )    )absolute_importdivisionN)PrettyPrinter)*      P   c           
   	   C   s   t | trd\}}n$t | tr(d\}}ntdt|  t| |krJ| }n(t| d| dg t| | d  }|ddd |D  | }d	tj||d
|d  d
|d  d	 }	|	S )a  
    Return a string representation for of a list where list is elided if
    it has more than n elements

    Parameters
    ----------
    v : list
        Input list
    threshold :
        Maximum number of elements to display

    Returns
    -------
    str
    )[])()zInvalid value of type: %sNz...z, c                 S   s   g | ]}t |qS  )str).0er   r   0/tmp/pip-unpacked-wheel-fki0jwev/plotly/utils.py
<listcomp>&   s     z%_list_repr_elided.<locals>.<listcomp>
    )widthinitial_indentsubsequent_indent)

isinstancelisttuple
ValueErrortypelenjointextwrapwrapstrip)
v	threshold	edgeitemsindentr   Z	open_charZ
close_charZdisp_vZv_strZ	v_wrappedr   r   r   _list_repr_elided
   s$    



(

r'   c                   @   s,   e Zd ZdZdd Zedd Zdd ZdS )	ElidedWrapperz
    Helper class that wraps values of certain types and produces a custom
    __repr__() that may be elided and is suitable for use during pretty
    printing
    c                 C   s   || _ || _|| _d S N)r#   r&   r$   )selfr#   r$   r&   r   r   r   __init__:   s    zElidedWrapper.__init__c                 C   s^   t d}t| ttfr4t| dkr4t| d ts4dS |rHt| |jrHdS t| trVdS dS d S )Nnumpyr   TF)
get_moduler   r   r   r   dictndarrayr   )r#   r,   r   r   r   is_wrappable?   s    (
zElidedWrapper.is_wrappablec                 C   s   t d}t| jttfr0t| j| j| jd}|S |rt| j|jr|	 }|j
f t|| jddd | j }|d}dd| j  |}|j
f | |S t| jtrt| jdkrdt| jd d	  d
 t| jdd   d S | j S n
| j S d S )Nr,   )r$   r&   r   r   )r$   r%   Z	linewidthr   r   r      z ... ir   )r-   r   r#   r   r   r'   r$   r&   r/   Zget_printoptionsZset_printoptionsr.   __repr__splitr   r   r   repr)r*   r,   resZ	orig_optsZ	res_linesr   r   r   r2   K   s.      

0zElidedWrapper.__repr__N)__name__
__module____qualname____doc__r+   staticmethodr0   r2   r   r   r   r   r(   3   s
   
r(   c                   @   s    e Zd ZdZdd Zdd ZdS )ElidedPrettyPrinterzF
    PrettyPrinter subclass that elides long lists/arrays/strings
    c                 O   s$   | dd| _tj| f|| d S )Nr$   r   )popr$   r   r+   )r*   argskwargsr   r   r   r+   v   s    zElidedPrettyPrinter.__init__c              	   C   sF   t |r,t || j|}| ||||||S t| ||||||S d S r)   )r(   r0   r$   _formatr   )r*   valstreamr&   	allowancecontextlevelZ
elided_valr   r   r   r?   z   s    
      zElidedPrettyPrinter._formatN)r6   r7   r8   r9   r+   r?   r   r   r   r   r;   q   s   r;   r   c                 c   sT   t | tsdS | |fV  |  D ].\}}t |tr t|||f D ]
}|V  qBq dS )a  
    General, node-yielding generator.

    Yields (node, path) tuples when it finds values that are dict
    instances.

    A path is a sequence of hashable values that can be used as either keys to
    a mapping (dict) or indices to a sequence (list). A path is always wrt to
    some object. Given an object, a path explains how to get from the top level
    of that object to a nested value in the object.

    :param (dict) node: Part of a dict to be traversed.
    :param (tuple[str]) path: Defines the path of the current node.
    :return: (Generator)

    Example:

        >>> for node, path in node_generator({'a': {'b': 5}}):
        ...     print(node, path)
        {'a': {'b': 5}} ()
        {'b': 5} ('a',)

    N)r   r.   itemsnode_generator)nodepathkeyr@   itemr   r   r   rF      s    


rF   c                 C   s   |D ]}| | } q| S )aR  
    Iteratively get on obj for each key in path.

    :param (list|dict) obj: The top-level object.
    :param (tuple[str]|tuple[int]) path: Keys to access parts of obj.

    :return: (*)

    Example:

        >>> figure = {'data': [{'x': [5]}]}
        >>> path = ('data', 0, 'x')
        >>> get_by_path(figure, path)
        [5]
    r   )objrH   rI   r   r   r   get_by_path   s    
rL   c              	   C   s  t | trjt| D ]T\}}t |ttfr6t|| |< qt |trzt|| |< W q tk
rd   Y qX qnt | trt|  t|   }}t	||D ]f\}}t |ttfrt|| |< n0t |trzt|| |< W n tk
r   Y nX | 
|| t|< q| S r)   )r   r   	enumerater.   decode_unicoder   UnicodeEncodeErrorkeysvalueszipr<   )ZcollnoentryrP   valsrI   r@   r   r   r   rN      s*    



rN   )r   r   r   r   )r   )
__future__r   r   r    pprintr   Z_plotly_utils.utilsZ_plotly_utils.data_utilsr'   objectr(   r;   rF   rL   rN   r   r   r   r   <module>   s   
)>
!