o
    ^i>                     @  sb  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 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! edZ"ee"edkryddl#m$Z$ nddl%m$Z$ d
Z&G dd de'Z(G dd de)Z*G dd de)Z+e	,de( G dd de)Z-G dd deZ.dS )z?
Emit structured, discrete events when various actions happen.
    )annotationsN)datetimetimezone)version)ValidationError)parse)DictInstanceSetdefault)ConfigLoggingConfigurable   )
SchemaTypeSchemaRegistry)Handlers)JUPYTER_EVENTS_CORE_VALIDATORzpython-json-loggerz3.1.0)JsonFormatterc                   @     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__ r   r   P/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/jupyter_events/logger.pyr   %       r   c                   @  r   )ModifierErrorzRAn exception to raise when a modifier does not
    show the proper signature.
    Nr   r   r   r   r   r   +   r   r   c                   @  r   )CoreMetadataErrorz:An exception raised when event core metadata is not valid.Nr   r   r   r   r   r    1   r   r    oncec                   @  r   )ListenerErrorzRAn exception to raise when a listener does not
    show the proper signature.
    Nr   r   r   r   r   r"   :   r   r"   c                      s  e Zd ZU dZeddddjddZeeddZ	e
i d	dZe
i d
dZe
i ddZe Zded< dHddZeddIddZdJ fddZ		dKdL fd!d"ZdMd%d&ZdNd)d*ZdNd+d,Zdd-dOd2d3Zdd-dOd4d5Zddd6dPd;d<Zdd-dQd=d>Zdd?dRdFdGZ  ZS )S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                   s   t j| jddiI dH S )z#Gather all of the active listeners.return_exceptionsTN)asynciogatherr(   selfr   r   r   gather_listenersd   s   zEventLogger.gather_listenersschemasr   c                 C  s   t  S Nr   r.   r   r   r   _default_schemash   s   zEventLogger._default_schemasargst.AnykwargsNonec                   sl   t  j|i | td tt|  }t|| _d| j_| j	tj
 | jr2| jD ]	}| | q*dS dS )zInitialize the logger..FN)super__init__r   stridlogging	getLogger_logger	propagatesetLevelINFOhandlersregister_handler)r/   r4   r6   log_namehandler	__class__r   r   r:   l   s   
zEventLogger.__init__cfgr   section_nameslist[str] | Nonetraitsc                   sN   |  |}|dg  d	 fdd}||d< td|i}t j|ddd dS )
zLoad EventLogger traits from a Config object, patching the
        handlers trait in the Config object to avoid deepcopy errors.
        rC   r)   list[logging.Handler]c                     s    S r2   r   r   rC   r   r   get_handlers   s   z.EventLogger._load_config.<locals>.get_handlersr#   N)rJ   rL   )r)   rM   )_find_my_configpopr   r9   _load_config)r/   rI   rJ   rL   my_cfgrO   eventlogger_cfgrG   rN   r   rR   ~   s   
	zEventLogger._load_configschemar   c                 C  s\   | j |}|j}|| jvrt | j|< || jvrt | j|< || jvr,t | j|< dS dS )zRegister this schema with the schema registry.

        Get this registered schema using the EventLogger.schema.get() method.
        N)r1   registerr<   
_modifiersset_modified_listeners_unmodified_listeners)r/   rU   event_schemakeyr   r   r   register_event_schema   s   


z!EventLogger.register_event_schemarF   logging.Handlerc                   sL   d
 fdd}t |d}||  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.
        recordr5   r6   r)   r;   c                   s2    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)r1   get
propertiesjsondumps)r_   r6   rU   r.   r   r   _handle_message_field   s   
z;EventLogger.register_handler.<locals>._handle_message_field)json_serializerN)r_   r5   r6   r5   r)   r;   )r   setFormatterr?   
addHandlerrC   append)r/   rF   rf   	formatterr   r.   r   rD      s   

zEventLogger.register_handlerc                 C  s*   | j | || jv r| j| dS dS )z>Remove a logging handler from the logger and list of handlers.N)r?   removeHandlerrC   remove)r/   rF   r   r   r   remove_handler   s   
zEventLogger.remove_handler)	schema_idro   
str | Nonemodifier5t.Callable[[str, dict[str, t.Any]], dict[str, t.Any]]c                C  sp   t |s
d}t||r | j|t }|| || j|< dS | jD ]}|du s-||kr5| j| | q#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	TypeErrorrW   rb   rX   add)r/   ro   rq   msg	modifiersid_r   r   r   add_modifier   s   


zEventLogger.add_modifierc                C  sJ   |r| j | | dS | jjD ]}| j | | | j | | qd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)rW   discardr1   
schema_ids)r/   ro   rq   r   r   r   remove_modifier   s   zEventLogger.remove_modifier)modifiedro   r}   boollistenerQt.Callable[[EventLogger, str, dict[str, t.Any]], t.Coroutine[t.Any, t.Any, None]]c                C  s   t |s
d}t||r6|r"| j|t }|| || j|< dS | j|t }|| || j|< dS | jjD ]}|du sD||krW|rO| j| | q:| j| | q:d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)	rs   rt   rY   rb   rX   ru   rZ   r1   r{   )r/   r}   ro   r   rv   	listenersrx   r   r   r   add_listener   s(   



zEventLogger.add_listenerc                C  sZ   |r| j | | | j| | dS | jjD ]}| j | | | j| | qd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)rY   rz   rZ   r1   r{   )r/   ro   r   r   r   r   remove_listener,  s   zEventLogger.remove_listener)timestamp_overrider;   datadict[str, t.Any]r   datetime | Nonedict[str, t.Any] | Nonec             
     s   j s j|s j|sdS | jvr#tj| dtdd dS  j|}t	|} j
|j D ]}|||d}q4 j|j rJ j||  j|| |du r\tjtjdn|}| d ||jtd}zt| W n ty }	 zt|	d}	~	ww ||  j| d fdd}
 j| D ]}t| ||d} j| ||
 q j| D ]}t| ||d} j| d fdd}
||
 q|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)ro   r   )tzZ)__timestamp__r`   __schema_version____metadata_version__taskasyncio.Task[t.Any]r)   r7   c                   (   |   }|r j|  j|  d S r2   	exceptionlogerrorr(   rz   r   errr.   r   r   _listener_task_done     z-EventLogger.emit.<locals>._listener_task_done)loggerro   r   c                   r   r2   r   r   r.   r   r   r     r   )r   r   r)   r7   ) rC   rY   rb   rZ   r1   warningswarnr   copydeepcopyrW   r<   validate_eventr   nowr   utc	isoformatr   EVENTS_METADATA_VERSIONr   validater   r    updater?   infor,   create_taskr(   ru   add_done_callback)r/   ro   r   r   rU   modified_datarq   	timestampcapsuler   r   r   r   r   r.   r   emitG  sj   





		zEventLogger.emit)r)   r*   )r)   r   )r4   r5   r6   r5   r)   r7   )NN)rI   r   rJ   rK   rL   rK   r)   r7   )rU   r   r)   r7   )rF   r^   r)   r7   )ro   rp   rq   rr   r)   r7   )r}   r~   ro   rp   r   r   r)   r7   )ro   rp   r   r   r)   r7   )ro   r;   r   r   r   r   r)   r   )r   r   r   r   r   tagrC   r	   r   r1   r   rW   rY   rZ   r
   r(   __annotations__r0   r   r3   r:   rR   r]   rD   rn   ry   r|   r   r   r   __classcell__r   r   rG   r   r#   @   sP   
 		



	%/r#   )/r   
__future__r   r,   r   rd   r=   typingtr   r   r   importlib.metadatar   
jsonschemar   packaging.versionr   	traitletsr   r	   r
   r   traitlets.configr   r   rU   r   schema_registryr   rL   r   
validatorsr   version_infopythonjsonlogger.jsonr   pythonjsonlogger.jsonloggerr   Warningr   	Exceptionr   r    simplefilterr"   r#   r   r   r   r   <module>   s:    