
    g;                    :   d dl mZ d dlZd dlZd dlmZ d dlZd dlZd dlZ	d dlm
Z
 d dlmZmZ d dlmZmZmZ  ej$                  e      j(                  Z G d dej,                        Z G d	 d
ej,                        ZddZ G d dej4                        ZddZy)    )annotationsN)Any)TopLevelSpec)!compile_to_vegafusion_chart_stateusing_vegafusion)IndexSelectionIntervalSelectionPointSelectionc                  (     e Zd ZdZ fdZd Z xZS )Paramsz/Traitlet class storing a JupyterChart's params.c                   t         |           |j                         D ]  \  }}t        |t        t
        f      rt        j                         }nt        |t              rt        j                         }n^t        |t              rt        j                         }n9t        |t              rt        j                         }nt        j                         } | j                  di ||i t!        | ||        y )N )super__init__items
isinstanceintfloat	traitletsFloatstrUnicodelistListdictDictr   
add_traitssetattr)selftrait_valueskeyvaluetraitlet_type	__class__s        Q/var/www/openai/venv/lib/python3.12/site-packages/altair/jupyter/jupyter_chart.pyr   zParams.__init__   s    &,,.JC%#u. ) 1E3' ) 1 1 3E4( ) 0E4( ) 0 ) DOO3sM23 D#u%! /    c                *    d| j                          dS )NzParams()r    r   s    r%   __repr__zParams.__repr__-   s    **,-Q//r&   )__name__
__module____qualname____doc__r   r+   __classcell__r$   s   @r%   r   r      s    9&*0r&   r   c                  4     e Zd ZdZ fdZd Zd Zd Z xZS )
Selectionsz3Traitlet class storing a JupyterChart's selections.c                   t         |           |j                         D ]  \  }}t        |t              rt        j                  t              }nmt        |t              rt        j                  t              }nCt        |t              rt        j                  t              }ndt        |       }t        |       | j                  di ||i t        | ||       | j                  | j                  |        y )NzUnexpected selection type: namesr   )r   r   r   r   r   r   Instancer
   r	   type
ValueErrorr   r   observe_make_read_only)r   r    r!   r"   r#   msgr$   s         r%   r   zSelections.__init__4   s    &,,.JC%0 ) 2 2> BE>2 ) 2 2> BE#45 ) 2 23D E3DK=A o% DOO3sM23 D#u% LL--SL9% /r&   c                *    d| j                          dS )NzSelections(r(   r)   r*   s    r%   r+   zSelections.__repr__K   s    T..0133r&   c                    |d   | j                         v r#|d   |d   k7  r| j                  |d   |d          d|d    }t        |      )zSWork around to make traits read-only, but still allow us to change them internally.nameoldnewz@Selections may not be set from Python.
Attempted to set select: )traits
_set_valuer9   )r   changer<   s      r%   r;   zSelections._make_read_onlyN   s^    &>T[[]*ve}u/MOOF6NF5M:((.v'79 	 or&   c                    | j                  | j                  |       t        | ||       | j                  | j                  |       y )Nr5   )	unobserver;   r   r:   )r   r!   r"   s      r%   rC   zSelections._set_valueX   s:    t++37c5!T))5r&   )	r,   r-   r.   r/   r   r+   r;   rC   r0   r1   s   @r%   r3   r3   1   s    =:.46r&   r3   c                 6    t         dz  dz  j                         S )Njszindex.js)_here	read_textr   r&   r%   load_js_srcrK   ^   s    DL:%0022r&   c                  P    e Zd Z e       ZdZ ej                  ed      Z	 ej                  d      j                  d      Z ej                  d      j                  d      Z ej                  d      j                  d      Z ej"                  dd      j                  d      Z ej                  d	      Z ej                  dd      j                  d      Z ej                         Z ej                         j                  d      Z ej                         j                  d      Z ej0                  d      Z ej0                  d      j                  d      Z ej0                  d      j                  d      Z ej0                  d      j                  d      Zd	Zeddd
       Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 d fdZ  ejB                  d      d        Z"ddZ# ejB                  d      d        Z$ ejB                  d      d        Z% xZ&S )JupyterChartzj
    .vega-embed {
        /* Make sure action menu isn't cut off */
        overflow: visible;
    }
    T)
allow_none)sync
   )default_valueN)rQ   rN   Fc                \   ddl m}m} |r| j                  ry |       }t	               j                  d      }|rt        |d   j                               dk(  s(|d   j                  d      s|d   j                  d      r]|j                  d       |rJt        |d   j                               dk(  r3|d   j                  d      rH|d   j                  d      r]dj                  |      }|j                  | |             }|| _        d| _        yt	               | _        d	| _        y)
a  
        Configure JupyterChart's offline behavior.

        Parameters
        ----------
        offline: bool
            If True, configure JupyterChart to operate in offline mode where JavaScript
            dependencies are loaded from vl-convert.
            If False, configure it to operate in online mode where JavaScript dependencies
            are loaded from CDN dynamically. This is the default behavior.
        r   )import_vl_convertvl_version_for_vl_convertN
importz//)
vl_versionTF)altair.utils._importersrS   rT   _is_offlinerK   splitlenstrip
startswithpopjoinjavascript_bundle_esm)clsofflinerS   rT   vlc	src_linessrcbundled_srcs           r%   enable_offlinezJupyterChart.enable_offline   s    	Y#%C#++D1I IaL&&()Q.Q<**84Q<**40a  IaL&&()Q.Q<**84Q<**40 ))I&C // 9 ; 0 K #CH"CO"}CH#COr&   chartc           	     p    t        i       | _        t        i       | _        t	        |   d|||||d| y)a  
        Jupyter Widget for displaying and updating Altair Charts, and retrieving selection and parameter values.

        Parameters
        ----------
        chart: Chart
            Altair Chart instance
        debounce_wait: int
             Debouncing wait time in milliseconds. Updates will be sent from the client to the kernel
             after debounce_wait milliseconds of no chart interactions.
        max_wait: bool
             If True (default), updates will be sent from the client to the kernel every debounce_wait
             milliseconds even if there are ongoing chart interactions. If False, updates will not be
             sent until chart interactions have completed.
        debug: bool
             If True, debug messages will be printed
        embed_options: dict
             Options to pass to vega-embed.
             See https://github.com/vega/vega-embed?tab=readme-ov-file#options
        )ri   debounce_waitmax_waitdebugembed_optionsNr   )r   paramsr3   
selectionsr   r   )r   ri   rk   rl   rm   rn   kwargsr$   s          r%   r   zJupyterChart.__init__   sF    : Rj$R. 	
''	
 	
r&   c                    |j                   }g }i }i }i }i }|6 j                         5  d _        | _        | _        | _        ddd       yt        |dg       }|t        j                  ur|j                  D ]  }	t        |	j                  t        j                        r*|	j                  j                         j                  d      }
n|	j                  }
t        |	dt        j                        }|t        j                  k7  rt        |t              s|j!                         }|d   }|dk(  rR|j#                  dd      s)|j#                  dd      sd	||
<   t%        |
g g 
      ||
<   nMd||
<   t'        |
g g 
      ||
<   n6|dk(  rd||
<   t)        |
i g 
      ||
<   nd|j*                   }t-        |      |j/                  |
       dg d||
<   Y|	j0                  t        j                  k7  r|	j0                  nd}|||
<    t3        |      D ]  }d||<   	 t5        |       _	         fd} j                  j7                  |       t9        |       _         j                         5  t=               rH j>                   d _         fd} j7                  |dg       n1 jA                   j>                         n|j!                          _        | _        | _        | _        ddd       y# 1 sw Y   yxY w# 1 sw Y   yxY w)zRUpdates the JupyterChart's internal state when the wrapped Chart instance changes.Nro   "selectr8   pointfields	encodingsindex)r?   r"   storeintervalzUnexpected selection type )r"   ry   c                T    t        j                        }| d   || d   <   |_        y )NrA   r?   )r   _params)param_change
new_paramsr   s     r%   on_param_traitlet_changedz@JupyterChart._on_change_chart.<locals>.on_param_traitlet_changed"  s,    dll+J/;E/BJ|F+,%DLr&   c                .    j                  | d          y )NrA   )_init_with_vegafusion)rD   r   s    r%   on_local_tz_changez9JupyterChart._on_change_chart.<locals>.on_local_tz_change2  s    226%=Ar&   local_tz)!rA   	hold_syncspec_selection_types_vl_selectionsr|   getattralt	Undefinedro   r   r?   ParameterNameto_jsonr\   r   to_dictgetr   r
   r	   r8   r9   appendr"   collect_transform_paramsr   r:   r3   rp   r   r   r   )r   rD   	new_chartselection_watchesselection_typesinitial_paramsinitial_vl_selectionsempty_selectionsro   param
clean_namert   select_typer<   clean_value
param_namer   r   s   `                 r%   _on_change_chartzJupyterChart._on_change_chart   s    JJ	 "! 	(7%&;#-	 "
 Hb1&"))ejj#*;*;<!&!3!3!5!;!;C!@J!&J #--@S]]*%fd3!'!1"(.K"g-"JJx6&**[RV:W ;BOJ7;I%/r<,Z8 ;BOJ7;I%/r<,Z8 %
26@
37H!+2R8(4 !;6;;-H(o-%,,Z8BFQS8T)*5161M%++SWK1<N:.Q *V 39=J)-N:& > ^,	&
 	56 %%56 ^^!==( $DIB LL!3j\B..t}}=%--/	$3D!"7D)DL M "
 B s   K3-A=K?3K<?Lc                z     j                    j                   j                  ddi      } j                         5  t        ||       _         j                  j                         d    _         j                  j                          _         fd} j                  |dg       d d d        y y # 1 sw Y   y xY w)Npre_transformF)contextclient_to_serverc                   j                   r(t        j                  | d   d      }t        d|        j                  j                  | d         }j                   r%t        j                  |d      }t        d|        |_        y )NrA      )indentz*JavaScript to Python VegaFusion updates:
 z*Python to JavaScript VegaFusion updates:
 )rm   jsondumpsprint_chart_stateupdate_py_to_js_updates)rD   updates_strupdatesr   s      r%   on_js_to_py_updatesz?JupyterChart._init_with_vegafusion.<locals>.on_js_to_py_updatesK  s    zz&*jjq&II+W #//66ve}EGzz&*jj&CI+W .5D*r&   _js_to_py_updates)
ri   r   r   r   r   get_watch_plan_js_watch_planget_transformed_specr   r:   )r   r   vegalite_specr   s   `   r%   r   z"JupyterChart._init_with_vegafusion>  s    ::! JJ..7O.PM!$E!8%! '+&7&7&F&F&H&'# !--BBD	5 03F2GH1 "! "!!s   A+B11B:r|   c                v    |j                   j                         D ]  \  }}t        | j                  ||        y )N)rA   r   r   ro   )r   rD   r   r"   s       r%   _on_change_paramszJupyterChart._on_change_params[  s.    !'!1!1!3JDKKU3 "4r&   r   c           	        |j                   j                         D ]  \  }}|d   }|d   }| j                  |   }|dk(  r3| j                  j	                  |t        j                  |||             W|dk(  r3| j                  j	                  |t        j                  |||             |dk(  s| j                  j	                  |t        j                  |||              y)zUpdates the JupyterChart's public selections traitlet in response to changes that the JavaScript logic makes to the internal _selections traitlet.r"   ry   rx   )signalry   ru   rz   N)	rA   r   r   rp   rC   r   	from_vegar
   r	   )r   rD   selection_nameselection_dictr"   ry   selection_types          r%   _on_change_selectionsz"JupyterChart._on_change_selections`  s     /5jj.>.>.@*NN"7+E"7+E!22>BN(**"",,^EQVW  7***"",,^EQVW  :-**"%//&uE /Ar&   )T)rc   bool)rP   TFN)ri   r   rk   r   rl   r   rm   r   rn   zdict | Nonerq   r   )r   r   )'r,   r-   r.   rK   ra   _cssr   r7   r   ri   r   tagr   r   rk   Boolrl   r   r   rm   rn   r   r   r|   r   r   r   r   r   rY   classmethodrh   r   r:   r   r   r   r   r0   r1   s   @r%   rM   rM   b   sb   =DD I|=E9>>T*..D.9D#IOO"599t9DMy~~D15545@H y  tEIItITHINN/E"INN$GKKQUKVM &y~~'#Y^^%))t)4N inn"""-G !9==D1L"Y]]d377T7BN%	6:::E%	6:::E K-$ -$d  %)&
&
 &
 	&

 &
 #&
 &
P Yw_*  _*BI: Yy!4 "4 Y'( )r&   rM   c                &   t               }dD ].  }t        | |g       D ]  }|j                  t        |              0 t        | dg       }|t        j
                  k7  r|ng }|D ]*  }t        |d      s|j                  |j                         , |S )z
    Collect the names of params that are defined by transforms.

    Parameters
    ----------
    chart: Chart from which to extract transform params

    Returns
    -------
    set of param names
    )layerconcathconcatvconcat	transformr   )	setr   r   r   r   r   hasattraddr   )ri   transform_paramspropchild
transformstxs         r%   r   r   z  s     u :UD"-E##$<U$CD . :
 R0J)S]]:J2w  *  r&   )returnr   )ri   r   r   zset[str])
__future__r   r   pathlibtypingr   	anywidgetr   altairr   r   altair.utils._vegafusion_datar   r   altair.utils.selectionr   r	   r
   Path__file__parentrI   	HasTraitsr   r3   rK   	AnyWidgetrM   r   r   r&   r%   <module>r      s    "        U TX%%0Y   08*6$$ *6Z3U9&& Upr&   