
    He:                    x   d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
m
Z
mZ ddlmZ ddlmZ ddlmZmZmZmZ ddlmZmZ d	d
lmZ d	dlmZ d	dlmZ d	dlmZ d	Z  G d de!          Z" G d de#          Z$ G d de#          Z% e	j&        de"            G d de#          Z' G d de          Z(dS )z?
Emit structured, discrete events when various actions happen.
    )annotationsN)datetimetimezone)ValidationError)
jsonlogger)DictInstanceSetdefault)ConfigLoggingConfigurable   )
SchemaTypeSchemaRegistry)Handlers)JUPYTER_EVENTS_CORE_VALIDATORc                      e Zd ZdZdS )SchemaNotRegisteredzzA warning to raise when an event is given to the logger
    but its schema has not be registered with the EventLogger
    N__name__
__module____qualname____doc__     5lib/python3.11/site-packages/jupyter_events/logger.pyr   r                 r   r   c                      e Zd ZdZdS )ModifierErrorzRAn exception to raise when a modifier does not
    show the proper signature.
    Nr   r   r   r   r    r    #   r   r   r    c                      e Zd ZdZdS )CoreMetadataErrorz:An exception raised when event core metadata is not valid.Nr   r   r   r   r"   r"   )   s        DDDDr   r"   oncec                      e Zd ZdZdS )ListenerErrorzRAn exception to raise when a listener does not
    show the proper signature.
    Nr   r   r   r   r%   r%   2   r   r   r%   c                      e Zd ZU dZ eddd                              d          Z eed          Z	 e
i d	          Z e
i d
          Z e
i d          Z e            Zded<   d<dZ ed          d=d            Zd> fdZ	 	 d?d@ fdZdAd!ZdBd$ZdBd%Zdd&dCd+Zdd&dCd,Zddd-dDd2Zdd&dEd3Zdd4dFd;Z xZS )GEventLoggera  
    An Event logger for emitting structured events.

    Event schemas must be registered with the
    EventLogger using the `register_schema` or
    `register_schema_file` methods. Every schema
    will be validated against Jupyter Event's metaschema.
    NTzA list of logging.Handler instances to send events to.

        When set to None (the default), all events are discarded.
        )default_value
allow_nonehelp)configzbThe SchemaRegistry for caching validated schemas
        and their jsonschema validators.
        )r*   z0A mapping of schemas to their list of modifiers.z9A mapping of schemas to the listeners of modified events.z?A mapping of schemas to the listeners of unmodified/raw events.zset[asyncio.Task[t.Any]]_active_listenersreturnlist[t.Any]c                >   K   t          j        | j        ddi d{V S )z#Gather all of the active listeners.return_exceptionsTN)asynciogatherr,   selfs    r   gather_listenerszEventLogger.gather_listeners\   sF      ^#
7;
 
 
 
 
 
 
 
 	
r   schemasr   c                    t                      S Nr   r3   s    r   _default_schemaszEventLogger._default_schemasb   s    r   argst.AnykwargsNonec                j    t                      j        |i | t          dz   t          t	          |                     z   }t          j        |          | _        d| j        _        | j        	                    t
          j
                   | j        r| j        D ]}|                     |           dS dS )zInitialize the logger..FN)super__init__r   stridlogging	getLogger_logger	propagatesetLevelINFOhandlersregister_handler)r4   r:   r<   log_namehandler	__class__s        r   rA   zEventLogger.__init__f   s     	$)&))) c>C4MM1(22!&gl+++= 	/= / /%%g....	/ 	// /r   cfgr   section_nameslist[str] | Nonetraitsc                    |                      |          }|                    dg           dfd}||d<   t          d|i          }t                                          |dd           dS )	zLoad EventLogger traits from a Config object, patching the
        handlers trait in the Config object to avoid deepcopy errors.
        rJ   r-   list[logging.Handler]c                      S r8   r   )rJ   s   r   get_handlersz.EventLogger._load_config.<locals>.get_handlers   s    Or   r'   N)rP   rR   )r-   rT   )_find_my_configpopr   r@   _load_config)	r4   rO   rP   rR   my_cfgrV   eventlogger_cfgrJ   rN   s	          @r   rY   zEventLogger._load_configx   s     %%c***0**Z*D*D	 	 	 	 	 	 *z !-!899_DNNNNNr   schemar   c                    | j                             |          }|j        }t                      | j        |<   t                      | j        |<   t                      | j        |<   dS )zRegister this schema with the schema registry.

        Get this registered schema using the EventLogger.schema.get() method.
        N)r6   registerrC   set
_modifiers_modified_listeners_unmodified_listeners)r4   r\   event_schemakeys       r   register_event_schemaz!EventLogger.register_event_schema   sX     |,,V44o"uu(+ %*-%%"3'''r   rM   logging.Handlerc                     d	 fd}t          j        |          }|                    |            j                            |           | j        vr j                            |           dS dS )
zRegister a new logging handler to the Event Logger.

        All outgoing messages will be formatted as a JSON string.
        recordr;   r<   r-   rB   c                    j                             | d                   }d|j        vr| d= t          j        | fi |S )aE  Python's logger always emits the "message" field with
            the value as "null" unless it's present in the schema/data.
            Message happens to be a common field for event logs,
            so special case it here and only emit it if "message"
            is found the in the schema's property list.
            
__schema__message)r6   get
propertiesjsondumps)rh   r<   r\   r4   s      r   _handle_message_fieldz;EventLogger.register_handler.<locals>._handle_message_field   sM     \%%f\&:;;F 1119%:f/////r   )json_serializerN)rh   r;   r<   r;   r-   rB   )r   JsonFormattersetFormatterrF   
addHandlerrJ   append)r4   rM   rp   	formatters   `   r   rK   zEventLogger.register_handler   s    
	0 
	0 
	0 
	0 
	0 
	0 ,1
 
 
	 	Y'''((($-''M  ))))) ('r   c                    | j                             |           || j        v r| j                            |           dS dS )z>Remove a logging handler from the logger and list of handlers.N)rF   removeHandlerrJ   remove)r4   rM   s     r   remove_handlerzEventLogger.remove_handler   sI    ""7+++dm##M  ))))) $#r   )	schema_idr{   
str | Nonemodifier5t.Callable[[str, dict[str, t.Any]], dict[str, t.Any]]c                   t          |          sd}t          |          |r"| j        |                             |           dS | j        D ]*}|||k    r | j        |                             |           +dS )aG  Add a modifier (callable) to a registered event.

        Parameters
        ----------
        modifier: Callable
            A callable function/method that executes when the named event occurs.
            This method enforces a string signature for modifiers:

                (schema_id: str, data: dict) -> dict:
        z`modifier` must be a callableN)callable	TypeErrorr`   add)r4   r{   r}   msgid_s        r   add_modifierzEventLogger.add_modifier   s    " !! 	!1CC..   	OI&**8444F? 	3 	3C C9$4$4$((222	3 	3r   c                   |r"| j         |                             |           dS | j        j        D ]B}| j         |                             |           | j         |                             |           CdS )a  Remove a modifier from an event or all events.

        Parameters
        ----------
        schema_id: str
            If given, remove this modifier only for a specific event type.
        modifier: Callable[[str, dict], dict]

            The modifier to remove.
        N)r`   discardr6   
schema_ids)r4   r{   r}   s      r   remove_modifierzEventLogger.remove_modifier   s    "  	=OI&..x88888 "\4 = =		*228<<<	*228<<<<= =r   )modifiedr{   r   boollistenerQt.Callable[[EventLogger, str, dict[str, t.Any]], t.Coroutine[t.Any, t.Any, None]]c                  t          |          sd}t          |          |rD|r"| j        |                             |           dS | j        |                             |           | j        j        D ]M}|||k    rC|r!| j        |                             |           -| j        |                             |           NdS )a  Add a listener (callable) to a registered event.

        Parameters
        ----------
        modified: bool
            If True (default), listens to the data after it has been mutated/modified
            by the list of modifiers.
        schema_id: str
            $id of the schema
        listener: Callable
            A callable function/method that executes when the named event occurs.
        z`listener` must be a callableN)r   r   ra   r   rb   r6   r   )r4   r   r{   r   r   r   s         r   add_listenerzEventLogger.add_listener   s    & !! 	!1CC..   	@ (377AAA&y155h???<* 	H 	HC C9$4$4 H,S155h????.y9==hGGG	H 	Hr   c               ,   |rB| j         |                             |           | j        |                             |           dS | j        j        D ]B}| j         |                             |           | j        |                             |           CdS )a   Remove a listener from an event or all events.

        Parameters
        ----------
        schema_id: str
            If given, remove this modifier only for a specific event type.

        listener: Callable[[EventLogger, str, dict], dict]
            The modifier to remove.
        N)ra   r   rb   r6   r   )r4   r{   r   s      r   remove_listenerzEventLogger.remove_listener  s    "  	H$Y/77AAA&y199(CCCCC "\4 H H	(3;;HEEE*95==hGGGGH Hr   )timestamp_overriderB   datadict[str, t.Any]r   datetime | Nonedict[str, t.Any] | Nonec                    j         s j        |         s j        |         sdS | j        vr!t	          j        | dt          d           dS  j                            |          }t          j	        |          } j
        |j                 D ]} |||          } j        |j                 r j                            ||            j                            ||           |t          j        t          j                  n|}|                                dz   ||j        t&          d}	 t)          j        |           n# t,          $ r}	t.          |	d}	~	ww xY w|                    |            j                            |           d fd}
 j        |         D ]Q}t7          j         | ||                    } j                            |           |                    |
           R j        |         D ]W}t7          j         | ||                    } j                            |           d fd}
|                    |
           X|S )a  
        Record given event with schema has occurred.

        Parameters
        ----------
        schema_id: str
            $id of the schema
        data: dict
            The event to record
        timestamp_override: datetime, optional
            Optionally override the event timestamp. By default it is set to the current timestamp.

        Returns
        -------
        dict
            The recorded event data
        Nz has not been registered yet. If this was not intentional, please register the schema using the `register_event_schema` method.   )
stacklevel)r{   r   )tzZ)__timestamp__rj   __schema_version____metadata_version__taskasyncio.Task[t.Any]r-   r=   c                    |                                  }|rj                            |           j                            |            d S r8   	exceptionlogerrorr,   r   r   errr4   s     r   _listener_task_donez-EventLogger.emit.<locals>._listener_task_done}  sM     ..""C $s###"**400000r   )loggerr{   r   c                    |                                  }|rj                            |           j                            |            d S r8   r   r   s     r   r   z-EventLogger.emit.<locals>._listener_task_done  sM     nn&& (HNN3'''&..t44444r   )r   r   r-   r=   ) rJ   ra   rb   r6   warningswarnr   rl   copydeepcopyr`   rC   validate_eventr   nowr   utc	isoformatversionEVENTS_METADATA_VERSIONr   validater   r"   updaterF   infor1   create_taskr,   r   add_done_callback)r4   r{   r   r   r\   modified_datar}   	timestampcapsuler   r   r   r   s   `            r   emitzEventLogger.emit2  s   , 	,Y7	 .y9	
 4 DL((M 2 2 2 $    4!!),, d++	2 	N 	NH$Hy}MMMMM%fi0 	9L''	4888 	##I}=== .@-GHLHL))))M_ 	 '0022S8#"(.$;	
 
	-)27;;;; 	- 	- 	-#,	- 	}%%%'"""	1 	1 	1 	1 	1 	1 0; 	8 	8H &'&   D "&&t,,, ""#6777729= 	8 	8H&xxtyW['\'\'\]]D"&&t,,,5 5 5 5 5 5 ""#67777s   1E 
EEE)r-   r.   )r-   r   )r:   r;   r<   r;   r-   r=   )NN)rO   r   rP   rQ   rR   rQ   r-   r=   )r\   r   r-   r=   )rM   rf   r-   r=   )r{   r|   r}   r~   r-   r=   )r   r   r{   r|   r   r   r-   r=   )r{   r|   r   r   r-   r=   )r{   rB   r   r   r   r   r-   r   )r   r   r   r   r   tagrJ   r	   r   r6   r   r`   ra   rb   r
   r,   __annotations__r5   r   r9   rA   rY   re   rK   rz   r   r   r   r   r   __classcell__)rN   s   @r   r'   r'   8   s}          x   
cc  h  G bQRRRJ$r(cddd D
R   36#%%7777
 
 
 
 WY       / / / / / /* +/#'	O O O O O O O,
0 
0 
0 
0* * * *4* * * * !%3 3 3 3 3 3B !%= = = = = =:  $	#H #H #H #H #H #HP !%H H H H H H8 `ds s s s s s s s s sr   r'   ))r   
__future__r   r1   r   rn   rD   typingtr   r   r   
jsonschemar   pythonjsonloggerr   	traitletsr   r	   r
   r   traitlets.configr   r   r\   r   schema_registryr   rR   r   
validatorsr   r   Warningr   	Exceptionr    r"   simplefilterr%   r'   r   r   r   <module>r      s+    # " " " " "          ' ' ' ' ' ' ' ' & & & & & & ' ' ' ' ' ' 2 2 2 2 2 2 2 2 2 2 2 2 8 8 8 8 8 8 8 8       + + + + + +       5 5 5 5 5 5      '       I   E E E E E	 E E E  f1 2 2 2    I   m m m m m% m m m m mr   