o
    i+>                     @   s0  d 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 ddlm	Z	m
Z
mZ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.
    N)datetime)AnyCallable	CoroutineOptionalUnion)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   P/var/www/edux/Edux_v2/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!   (   r   r!   oncec                   @   r   )ListenerErrorzRAn exception to raise when a listener does not
    show the proper signature.
    Nr   r   r   r   r   r#   1   r   r#   c                       s  e Zd ZdZeg 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d ZeddefddZ fddZd1 fdd	ZdeddfddZdejddfddZdejddfddZdddeedf d eeegef ddfd!d"Zddde e d eeegef ddfd#d$Z!ddd%d&e"deedf d'ed eege#e$e$df f ddfd(d)Z%ddde e d'ed eege#e$e$df f ddfd*d+Z&dd,ded-ed.e e' de e fd/d0Z(  Z)S )2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.
    TzA 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.c                    s   t j| jddiI dH S )z#Gather all of the active listeners.return_exceptionsTN)asynciogather_active_listenersselfr   r   r   gather_listeners[   s   zEventLogger.gather_listenersschemasreturnc                 C   s   t  S Nr   r-   r   r   r   _default_schemas_   s   zEventLogger._default_schemasc                    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.   argskwargslog_namehandler	__class__r   r   r6   c   s   
zEventLogger.__init__Nc                    sL   |  |}|dg   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.
        r?   c                      s    S r2   r   r   r?   r   r   get_handlers}   s   z.EventLogger._load_config.<locals>.get_handlersr$   N)section_namestraits)_find_my_configpopr   r5   _load_config)r.   cfgrI   rJ   my_cfgrH   eventlogger_cfgrE   rG   r   rM   u   s   
zEventLogger._load_configschemac                 C   s:   | 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)r0   registerr8   set
_modifiers_modified_listeners_unmodified_listeners)r.   rQ   event_schemakeyr   r   r   register_event_schema   s
   z!EventLogger.register_event_schemarD   c                 C   sH   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.
        c                 [   s   | d= t j| fi |S )z
            Remove 'message' from log record.
            It is always emitted with 'null', and we do not want it,
            since we are always emitting events only
            message)jsondumps)recordrB   r   r   r   _skip_message   s   z3EventLogger.register_handler.<locals>._skip_message)json_serializerN)r	   JsonFormattersetFormatterr;   
addHandlerr?   append)r.   rD   r^   	formatterr   r   r   r@      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;   removeHandlerr?   remove)r.   rD   r   r   r   remove_handler   s   
zEventLogger.remove_handler)	schema_idrh   modifierc                C   s   t |s
d}t|t|}dtdtdtfdd}t|}||krG|r/| j| | dS | jD ]}|du s<||krD| j| | q2dS d| d	}t|)
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 callablerh   datar1   c                 S   s   dS )zSignature to enforceNr   rh   rj   r   r   r   modifier_signature   s   z4EventLogger.add_modifier.<locals>.modifier_signatureNzvModifiers are required to follow an exact function/method signature. The signature should look like:

	def my_modifierT:

Check that you are using type annotations for each argument and the return value.)	callable	TypeErrorinspect	signaturer7   dictrT   addr    )r.   rh   ri   msgrq   rl   expected_signaturer8   r   r   r   add_modifier   s4   



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)rT   discardr0   
schema_ids)r.   rh   ri   r   r   r   remove_modifier   s   zEventLogger.remove_modifier)modifiedrh   rz   listenerc          	      C   s   t |s
d}t|t|}dtdtdtddfdd}t|}||kr_|r;|r3| j| | dS | j	| | | j
jD ]}|du sI||kr\|rT| j| | q?| j	| | q?dS d	| d
}t|)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 callableloggerrh   rj   r1   Nc                    s   dS )zAn interface for a listener.Nr   r|   rh   rj   r   r   r   listener_signature  s   z4EventLogger.add_listener.<locals>.listener_signaturez|Listeners are required to follow an exact function/method signature. The signature should look like:

	async def my_listenerrm   )rn   ro   rp   rq   r$   r7   rr   rU   rs   rV   r0   rx   r#   )	r.   rz   rh   r{   rt   rq   r~   ru   r8   r   r   r   add_listener   s0   

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)rU   rw   rV   r0   rx   )r.   rh   r{   r   r   r   remove_listener/  s   zEventLogger.remove_listener)timestamp_overriderj   r   c             
      s   j s j| s j| sdS | jvrt| dt dS  j|}t	|} j
|j D ]}|||d}q0 j|j rF j||  j|| |du rVt }n|}| d ||jtd}zt| W n tyz }	 zt|	d}	~	ww ||  j| dtjddf fdd	}
 j| D ]}t| ||d
} j| ||
 q j| D ]#}t| ||d
} j| dtjddf 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.rk   Z)__timestamp__
__schema____schema_version____metadata_version__taskr1   c                    (   |   }|r j|  j|  d S r2   	exceptionlogerrorr,   rw   r   errr-   r   r   _listener_task_done     z-EventLogger.emit.<locals>._listener_task_doner}   c                    r   r2   r   r   r-   r   r   r     r   )r?   rU   rV   r0   warningswarnr   getcopydeepcopyrT   r8   validate_eventr   utcnow	isoformatversionEVENTS_METADATA_VERSIONr   validater   r!   updater;   infor*   Taskcreate_taskr,   rs   add_done_callback)r.   rh   rj   r   rQ   modified_datari   	timestampcapsuler   r   r{   r   r   r-   r   emitJ  sj   




		zEventLogger.emit)NN)*r   r   r   r   r   tagr?   r   r   r0   r
   rT   rU   rV   r   r,   r/   r   r3   r6   rM   r   rY   r9   Handlerr@   rg   r   r7   r   rr   rv   r   ry   boolr   r   r   r   r   r   __classcell__r   r   rE   r   r$   7   s    			

4


;
r$   )+r   r*   r   rp   r[   r9   r   r   typingr   r   r   r   r   
jsonschemar   pythonjsonloggerr	   	traitletsr
   r   r   r   traitlets.configr   r   rQ   r   schema_registryr   rJ   r   
validatorsr   r   Warningr   	Exceptionr    r!   simplefilterr#   r$   r   r   r   r   <module>   s0    