
    g>!                         d dl mZ d dlmZ 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 d Zd Zd Zd Zd Zd	 Zd
 Z	 	 	 	 ddZddZy)    )Sequence)
exceptions)DEFAULT_PLOTLY_COLORSPLOTLY_SCALEScolor_parsercolorscale_to_colorscolorscale_to_scaleconvert_to_RGB_255find_intermediate_color
hex_to_rgb	label_rgbn_colorsunconvert_from_RGB_255unlabel_rgbvalidate_colorsvalidate_colors_dictvalidate_colorscalevalidate_scale_valuesc                 H    t        | t              xr t        | t               S N)
isinstancer   str)objs    X/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/plotly/figure_factory/utils.pyis_sequencer      s    c8$AZS-A)AA    c                     ddl m t        | d         r*t        fd| D              st	        j
                  d      yt        | d   t              r(t        d | D              st	        j
                  d      yy)z
    Validates if a list contains all numbers or all strings

    :raises: (PlotlyError) If there are any two items in the list whose
        types differ
    r   Numberc              3   6   K   | ]  }t        |        y wr   r   .0itemr   s     r   	<genexpr>z!validate_index.<locals>.<genexpr>&   s     C:dF+C   z^Error in indexing column. Make sure all entries of each column are all numbers or all strings.c              3   <   K   | ]  }t        |t                y wr   r   r   r#   r$   s     r   r%   z!validate_index.<locals>.<genexpr>/   s     @T:dC(@   Nnumbersr   r   allr   PlotlyErrorr   )
index_valsr   s    @r   validate_indexr0      s     *Q-(C
CC((  D 
JqM3	'@Z@@((  A 
(r   c                    ddl m | D ]v  }t        |d         r*t        fd|D              r't	        j
                  d      t        |d   t              sPt        d |D              rct	        j
                  d       y)z
    Validates all strings or numbers in each dataframe column

    :raises: (PlotlyError) If there are any two items in any list whose
        types differ
    r   r   c              3   6   K   | ]  }t        |        y wr   r!   r"   s     r   r%   z%validate_dataframe.<locals>.<genexpr>C   s     CDz$/Cr&   zWError in dataframe. Make sure all entries of each column are either numbers or strings.c              3   <   K   | ]  }t        |t                y wr   r(   r)   s     r   r%   z%validate_dataframe.<locals>.<genexpr>K   s     @z$,@r*   Nr+   )arrayvectorr   s     @r   validate_dataframer6   8   s      fQi(CFCC ,,*  q	3'@@@ ,,* r   c                  t    t        | d         t        fd| D              rt        j                  d      y)z
    Validates that data lists or ndarrays are the same length.

    :raises: (PlotlyError) If any data lists are not the same length.
    r   c              3   :   K   | ]  }t        |      k7    y wr   )len)r#   lstlengths     r   r%   z(validate_equal_length.<locals>.<genexpr>[   s     
.#3s8v
.s   z<Oops! Your data lists or ndarrays should be the same length.N)r9   anyr   r.   )argsr;   s    @r   validate_equal_lengthr>   T   s;     a\F

.
..$$M
 	
 /r   c                      | j                         D ]&  \  }}	 |dk  rt        dj                  ||            ( y# t        $ r& t	        j
                  dj                  ||            w xY w)z
    Validates that all values given in key/val pairs are positive.

    Accepts kwargs to improve Exception messages.

    :raises: (PlotlyError) If any value is < 0 or raises.
    r   z{} must be > 0, got {}z{} must be a number, got {}N)items
ValueErrorformat	TypeErrorr   r.   )kwargskeyvals      r   validate_positive_scalarsrG   a   s}     LLN YS	Yax !9!@!@c!JKK Y  	Y(()F)M)McSV)WXX	Ys	    ;/A*c                     	 | D cg c]  }|D ]  }|  c}}S c c}}w # t         $ r t        j                  d      w xY w)z
    Uses list comprehension to flatten array

    :param (array): An iterable to flatten
    :raises (PlotlyError): If iterable is not nested.
    :rtype (list): The flattened list.
    z\Your data array could not be flattened! Make sure your data is entered as lists or ndarrays!)rC   r   r.   )r4   sublistr$   s      r   flattenrJ   q   sN    
$)>g>d>>>> 
$$,
 	

s   ! ! ! A c                 r   t        |       }t        | t              s%t        | t              st	        j
                  d      | D ]'  }t        |t              st	        j
                  d       t        |dz
        D ]%  }| |   | |dz      k\  st	        j
                  d       g }|j                  t        d      | d   g       t        |dz
        D ]@  }g }|j                  | |          |j                  | |dz             |j                  |       B |j                  | |dz
     t        d      g       |S )a  
    Returns a list of intervals for categorical colormaps

    Accepts a list or tuple of sequentially increasing numbers and returns
    a list representation of the mathematical intervals with these numbers
    as endpoints. For example, [1, 6] returns [[-inf, 1], [1, 6], [6, inf]]

    :raises: (PlotlyError) If input is not a list or tuple
    :raises: (PlotlyError) If the input contains a string
    :raises: (PlotlyError) If any number does not increase after the
        previous one in the sequence
    zZThe intervals_endpts argument must be a list or tuple of a sequence of increasing numbers.   z-infr   inf)
r9   r   tuplelistr   r.   r   rangeappendfloat)endptsr;   r$   k	intervalsintervals         r   endpts_to_intervalsrW      sJ    [Fv':ft+E$$%
 	
  dC ((  6A: !9q1u%((  	%-34vz" 	'AHOOF1I&OOF1q5M*X&		' 	&!,eEl;<r   c                 b   d|dz
  |z  z
  |z  }|s:d}	d}
|dk(  r|dz
  ||z   z  d|z  z   }d}d}n_|dk(  rZ|dz
  ||z   z  d|z  z   }d}d	}nD|dk(  rd}	d
}
|dz
  ||z   z  d|z  z   }d}d}n%|dk(  r d}
|dz
  ||z   z  d|z  z   }|rd}d}	nd}d}	d}t        	
ddd| t        d|      
      }|S )a#  
    Returns annotation dict for label of n labels of a 1xn or nx1 subplot.

    :param (str) text: the text for a label.
    :param (int) lane: the label number for text. From 1 to n inclusive.
    :param (int) num_of_lanes: the number 'n' of rows or columns in subplot.
    :param (float) subplot_spacing: the value for the horizontal_spacing and
        vertical_spacing params in your plotly.tools.make_subplots() call.
    :param (str) row_col: choose whether labels are placed along rows or
        columns.
    :param (bool) flipped: flips text by 90 degrees. Text is printed
        horizontally if set to True and row_col='row', or if False and
        row_col='col'.
    :param (bool) right_side: only applicable if row_col is set to 'row'.
    :param (str) text_color: color of the text.
    rL   centermiddlecolg      ?g{Gz?r   rowZ   bottomg      ?i  leftg{GzrightFpaper   )sizecolor)
	textanglexanchoryanchorxy	showarrowxrefyreftextfont)dict)rm   lanenum_of_lanessubplot_spacingrow_colflipped
right_side
text_colorlrf   rg   rh   ri   re   annotation_dicts                  r   annotation_dict_for_labelry      s:   4 
lQ/1	1lCAea/12S1W<AAIa/12S1W<AAIeGGa/12S1W<AAIGa/12S1W<A !I

r,O r   c                     t        |       dk  rt        j                  d      t        |       dz
  dz  dz   |z   dz   |dz  z   } |j                  |  S )z
    Returns an English listing of objects seperated by commas ','

    For example, ['foo', 'bar', 'baz'] becomes 'foo, bar and baz'
    if the conjunction 'and' is selected.
       z1Your list or tuple must contain at least 2 items.z{}, z{} z {}.)r9   r   r.   rB   )iterableconjperiodtemplates       r   list_of_optionsr      sd     8}q$$?
 	
 H!V+e3d:UBVc\QH8??H%%r   N)r[   TTz#0f0f0f)andT)collections.abcr   plotlyr   plotly.colorsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r0   r6   r>   rG   rJ   rW   ry   r    r   r   <module>r      sd    $     (B88

Y 
$2t DN&r   