o
    tf=                     @  s$  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 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)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__ r   r   ^/var/www/html/software/conda/envs/catlas/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   )   r   r   oncec                   @  r   )ListenerErrorzRAn exception to raise when a listener does not
    show the proper signature.
    Nr   r   r   r   r   r    2   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_listeners\   s   zEventLogger.gather_listenersschemasr   c                 C  s   t  S Nr   r,   r   r   r   _default_schemas`   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-   r2   r4   Zlog_namehandler	__class__r   r   r8   d   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.
        rA   r'   list[logging.Handler]c                     s    S r0   r   r   rA   r   r   get_handlers   s   z.EventLogger._load_config.<locals>.get_handlersr!   N)rG   rI   )r'   rJ   )Z_find_my_configpopr   r7   _load_config)r-   rF   rG   rI   Zmy_cfgrL   Zeventlogger_cfgrD   rK   r   rN   v   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)r/   registerr:   
_modifiersset_modified_listeners_unmodified_listeners)r-   rO   Zevent_schemakeyr   r   r   register_event_schema   s   


z!EventLogger.register_event_schemarC   logging.Handlerc                   sN   d
 fdd}t j|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.
        recordr3   r4   r'   r9   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)r/   get
propertiesjsondumps)rX   r4   rO   r,   r   r   _handle_message_field   s   
z;EventLogger.register_handler.<locals>._handle_message_field)Zjson_serializerN)rX   r3   r4   r3   r'   r9   )r   ZJsonFormattersetFormatterr=   
addHandlerrA   append)r-   rC   r_   	formatterr   r,   r   rB      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=   removeHandlerrA   remove)r-   rC   r   r   r   remove_handler   s   
zEventLogger.remove_handler)	schema_idrg   
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	TypeErrorrQ   r[   rR   add)r-   rg   ri   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)rQ   discardr/   
schema_ids)r-   rg   ri   r   r   r   remove_modifier   s   zEventLogger.remove_modifier)modifiedrg   ru   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)	rk   rl   rS   r[   rR   rm   rT   r/   rs   )r-   ru   rg   rw   rn   Z	listenersrp   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)rS   rr   rT   r/   rs   )r-   rg   rw   r   r   r   remove_listener$  s   zEventLogger.remove_listener)timestamp_overrider9   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}q2 j|j rH j||  j|| |du rZt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)rg   r|   )tzZ)Z__timestamp__rY   Z__schema_version__Z__metadata_version__taskasyncio.Task[t.Any]r'   r5   c                   (   |   }|r j|  j|  d S r0   	exceptionlogerrorr&   rr   r   errr,   r   r   _listener_task_done     z-EventLogger.emit.<locals>._listener_task_done)loggerrg   r|   c                   r   r0   r   r   r,   r   r   r     r   )r   r   r'   r5   ) rA   rS   rT   r/   warningswarnr   r[   copydeepcopyrQ   r:   Zvalidate_eventr   nowr   utc	isoformatversionEVENTS_METADATA_VERSIONr   validater   r   updater=   infor*   create_taskr&   rm   add_done_callback)r-   rg   r|   r{   rO   Zmodified_datari   	timestampZcapsuler   r   rw   r   r   r,   r   emit?  sj   



		zEventLogger.emit)r'   r(   )r'   r   )r2   r3   r4   r3   r'   r5   )NN)rF   r   rG   rH   rI   rH   r'   r5   )rO   r   r'   r5   )rC   rW   r'   r5   )rg   rh   ri   rj   r'   r5   )ru   rv   rg   rh   rw   rx   r'   r5   )rg   rh   rw   rx   r'   r5   )rg   r9   r|   r}   r{   r~   r'   r   )r   r   r   r   r   tagrA   r   r   r/   r   rQ   rS   rT   r	   r&   __annotations__r.   r
   r1   r8   rN   rV   rB   rf   rq   rt   ry   rz   r   __classcell__r   r   rD   r   r!   8   sP   
 		



	%/r!   ))r   
__future__r   r*   r   r]   r;   typingtr   r   r   Z
jsonschemar   Zpythonjsonloggerr   Z	traitletsr   r   r	   r
   Ztraitlets.configr   r   rO   r   Zschema_registryr   rI   r   
validatorsr   r   Warningr   	Exceptionr   r   simplefilterr    r!   r   r   r   r   <module>   s0    