U
    -eV                     @  s0  d Z ddlmZ ddlZddlZddlmZ ddlm	Z	 ddl
mZmZmZmZmZ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 d
dlmZmZmZm Z  ej!rej"ej#ej$ej f Z%nejZ%G dd de&Z'G dd de'Z(G dd deZ)G dd de)Z*ej+dddZ,G dd de*Z-dS )z/A base class for objects that are configurable.    )annotationsN)deepcopy)dedent)
Any	ContainerDict	HasTraitsInstance	TraitTypedefaultobserveobserve_compatvalidate)warnings)Bunch)indentwrap_paragraphs   )ConfigDeferredConfigLazyConfigValue_is_section_keyc                   @  s   e Zd ZdS )ConfigurableErrorN__name__
__module____qualname__ r   r   ^/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/traitlets/config/configurable.pyr   (   s   r   c                   @  s   e Zd ZdS )MultipleInstanceErrorNr   r   r   r   r   r   ,   s   r   c                      s$  e Zd Zeedi ZedddZddd fdd	Zed
dddZ	dddddZ
d6dddddddZededddddZdddddZed7dd d!d"d#Zed8d$dd%d d&d'd(Zed9ddd!d)d*Zed$d+d,d-d.d/Zed:d0d d1d2d3Zed dd4d5Z  ZS );Configurabler   z*traitlets.config.configurable.ConfigurableT)
allow_nonet.AnyNone)kwargsreturnc                   s    dd}|dk	r4dddkr.|jd< || _ dd}t jf  t  ddd fdd}| | |dk	r|| _n| | j | 	|  D ]}t
| ||  qdS )	a  Create a configurable given a config config.

        Parameters
        ----------
        config : Config
            If this is empty, default values are used. If config is a
            :class:`Config` instance, it will be used to configure the
            instance.
        parent : Configurable instance, optional
            The parent Configurable instance of this object.

        Notes
        -----
        Subclasses of Configurable must call the :meth:`__init__` method of
        :class:`Configurable` *before* doing anything else and using
        :func:`super`::

            class MyConfigurable(Configurable):
                def __init__(self, config=None):
                    super(MyConfigurable, self).__init__(config=config)
                    # Then any other code you need to finish initialization.

        This ensures that instances will be configured properly.
        parentNconfigr   r#   changer%   c                   s   | j kr | j  dS )zRecord traits set by both config and kwargs.

            They will need to be overridden again after loading config.
            N)nameadd)r)   Zconfig_override_namesr$   r   r   notice_config_overridea   s    
z5Configurable.__init__.<locals>.notice_config_override)popgetr'   r&   super__init__setr   _load_configZ	unobservesetattr)selfr$   r&   r'   r-   r*   	__class__r,   r   r1   9   s     


zConfigurable.__init__z	list[str]r%   c                   s    fddt  jD S )zreturn section names as a listc                   s&   g | ]}t |trt  |r|jqS r   
issubclassr    r   ).0cclsr   r   
<listcomp>   s   
 
z.Configurable.section_names.<locals>.<listcomp>)reversed__mro__r=   r   r=   r   section_names   s    
zConfigurable.section_namesr   )cfgr%   c                 C  sX   |g}| j r|| j | t }|D ]*}|  D ]}||r4|||  q4q(|S )a  extract my config from a global Config object

        will construct a Config object of only the config values that apply to me
        based on my mro(), as well as those of my parent(s) if they exist.

        If I am Bar and my parent is Foo, and their parent is Tim,
        this will return merge following config sections, in this order::

            [Bar, Foo.Bar, Tim.Foo.Bar]

        With the last item being the highest priority.
        )r&   append_find_my_configr   rB   Z_has_sectionmerge)r5   rC   Zcfgs	my_configr<   Zsnamer   r   r   rE      s    
zConfigurable._find_my_configNzlist[str] | None)rC   rB   traitsr%   c              	   C  sr  |dkr| j dd}|dkr$|  }| |}|  0 | D ]\}}||krt|trtt| |}||}nt|t	r||| }t
| |t| qBt|sBt|tsBddlm} t| tr| jdk	st| jj}	ndddd	d
}	|||}
d| d| jj d}t|
dkr2|d|
d  d7 }n(t|
dkrZ|djdt|
d7 }|	| qBW 5 Q R X dS )z load traits from a Config objectNTr'   r   )get_close_matchesr"   r#   )msgr%   c                 S  s   t j| tddS )N	   
stacklevel)r   warnUserWarning)rK   r   r   r   rO      s    z'Configurable._load_config.<locals>.warnzConfig option `z` not recognized by `z`.r   z  Did you mean `z`?z#  Did you mean one of: `{matches}`?, )matches)rH   rB   rE   Zhold_trait_notificationsitems
isinstancer   getattr	get_valuer   r4   r   r   r   difflibrJ   LoggingConfigurablelogAssertionErrorwarningr7   r   lenformatjoinsorted)r5   rC   rB   rH   rG   r*   Zconfig_valueinitialrJ   rO   rR   rK   r   r   r   r3      s:    






zConfigurable._load_configr'   r   r(   c                 C  s*   | j dd}|  }| j|j||d dS )zUpdate all the class traits having ``config=True`` in metadata.

        For any class trait with a ``config`` metadata attribute that is
        ``True``, we update the trait with the value of the corresponding
        config entry.
        TrI   )rH   rB   N)rH   rB   r3   new)r5   r)   rH   rB   r   r   r   _config_changed   s    
zConfigurable._config_changed)r'   r%   c                 C  s&   t | j| _| | | j| dS )z%Update config and load the new valuesN)r   r'   r3   rF   )r5   r'   r   r   r   update_config   s    
zConfigurable.update_configzHasTraits | Nonestr)instr%   c                 C  s   |dkst || stg }ddd | jD }|| j d| d |t|d d  t| jd	d
	 D ]\}}| 
||}|| qrd|S )zGet the help string for this class in ReST format.

        If `inst` is given, its current trait values will be used in place of
        class defaults.
        NrQ   c                 s  s   | ]}|j V  qd S N)r   r;   pr   r   r   	<genexpr>   s     z.Configurable.class_get_help.<locals>.<genexpr>(z	) optionsr   -TrI   
)rT   rZ   r^   	__bases__rD   r   r\   r_   class_traitsrS   class_get_trait_help)r>   re   Z
final_helpZbase_classes_vhelpr   r   r   class_get_help   s    zConfigurable.class_get_helpzTraitType[t.Any, t.Any]z
str | None)traitre   helptextr%   c           	      C  s  |dkst || stg }d| j d|j }t |ttfr|jdd}t |trZd}nd|jj	  }|dkr| d| d	}q| d
| d	}n| d|jj d}|
| |dkr|j}|dkrdt|d}|
t| d|jjkr|
td|   |dk	r:|
tdt||jp,d nbz| }W n tk
r`   d}Y nX |dk	rt|dkr|dd d	 }|
td|  d|S )a  Get the helptext string for a single trait.

        :param inst:
            If given, its current trait values will be used in place of
            the class default.
        :param helptext:
            If not given, uses the `help` attribute of the current trait.
        Nz--.multiplicityrD   z<key-1>=<value-1>z<%s-item-1>=... z=<> rl   L   EnumzChoices: %sz	Current: @   =   zDefault: %s)rT   rZ   r   r*   r   r   metadatar/   r7   lowerrD   rr   r^   r   r   inforU   default_value_repr	Exceptionr\   )	r>   rt   re   ru   linesheaderrw   Zsample_valuedvrr   r   r   ro     s>    


$

z!Configurable.class_get_trait_helpc                 C  s   t | | dS )z4Get the help string for a single trait and print it.N)printrs   )r>   re   r   r   r   class_print_helpA  s    zConfigurable.class_print_helpzt.Sequence[type[HasTraits]]ztype[Configurable])rt   classesr%   c                 C  sF   | }|   D ]4}t|tr||kr|jdd|jd|kr|}q|S )a7  Get the class that defines a trait

        For reducing redundant help output in config files.
        Returns the current class if:
        - the trait is defined on this class, or
        - the class where it is defined would not be in the config file

        Parameters
        ----------
        trait : Trait
            The trait to look for
        classes : list
            The list of other classes to consider for redundancy.
            Will return `cls` even if it is not defined on `cls`
            if the defining class is not in `classes`.
        TrI   N)mror:   r    Zclass_own_traitsr/   r*   )r>   rt   r   Zdefining_clsr&   r   r   r   _defining_classF  s    zConfigurable._defining_classz"t.Sequence[type[HasTraits]] | None)r   r%   c              	   C  s  ddddd}d}d dd | jD }d	| j d
| d}|||g}|  d}|r`|j}|spt| dd}|r||| |d t| jdd	 D ]\}}	|	
 }
|r| |	|}n| }|| kr|	jr|||	j dt|	jkr|d|	   |d|
  n<|	jr<|||	jddd  |d|j d|  |d| j d| d|
  |d qd |S )zGet the config section for this class.

        Parameters
        ----------
        classes : list, optional
            The list of other classes in the config file.
            Used to reduce redundant information.
        rd   )sr%   c                 S  s    d t| d} d| dd S )z"return a commented, wrapped block.z

N   z## rl   z
#  )r^   r   replace)r   r   r   r   r<   o  s    z,Configurable.class_config_section.<locals>.czO#------------------------------------------------------------------------------rQ   c                 s  s   | ]}t |tr|jV  qd S rf   r9   rg   r   r   r   ri   w  s     
 z4Configurable.class_config_section.<locals>.<genexpr>z# rj   z) configurationdescription__doc__r|   TrI   r~   z#  Choices: %sz#  Default: %srl   r   r   z#  See also: rv   z# c.z = )r^   rm   r   rn   r/   default_valuerU   rD   r_   rS   r   r   rr   typer   split)r>   r   r<   breakerZparent_classesr   r   descr*   rt   Zdefault_reprdefining_classr   r   r   class_config_sectiond  s<    


z!Configurable.class_config_sectionc           	   	   C  s  g }| j }t| jdd D ]\}}|jj }|d |j }d|krV|d|  7 }n|d| 7 }|| z| }W n t	k
r   d}Y nX |dk	rt
|dkr|dd d	 }|d
d}|td|  |d |jpd}|tt| |d qd|S )zwGenerate rST documentation for this class' config options.

        Excludes traits defined on parent classes.
        TrI   rv   r~   z : Nr   r   ry   z\nz\\nzDefault: ``%s``r|   zNo descriptionrl   )r   r_   rn   rS   r7   r*   Zinfo_rstrD   r   r   r\   r   r   rr   r   r^   )	r>   r   	classnamerp   rt   ttypeZtermliner   rr   r   r   r   class_config_rst_doc  s.    



z!Configurable.class_config_rst_doc)NN)N)NN)N)N)r   r   r   r	   r   r'   r&   r1   classmethodrB   rE   r3   r   r   rb   rc   rs   ro   r   r   r   r   __classcell__r   r   r6   r   r    5   s6   H   2  8;r    c                   @  sX   e Zd ZdZedddZeddddd	d
ZedddddZ	ddddZ
dS )rX   zA parent class for Configurables that log.

    Subclasses have a log trait, and the default behavior
    is to get the logger from the currently running Application.
    z Logger or LoggerAdapter instanceF)rr   r!   rY   r   
LoggerType)proposalr%   c                 C  s<   t |jtjtjfs6tj| jj d|j dt	dd |jS )Nz..log should be a Logger or LoggerAdapter, got rv      rM   )
rT   valueloggingLoggerLoggerAdapterr   rO   r7   r   rP   )r5   r   r   r   r   _validate_log  s    z!LoggingConfigurable._validate_logr8   c                 C  s@   t | jtr,| jd k	stttj| jjS ddl	m} |
 S )Nr   )rY   )rT   r&   rX   rZ   tcastr   r   rY   Z	traitletsZ
get_logger)r5   rY   r   r   r   _log_default  s
    z LoggingConfigurable._log_defaultzlogging.Handler | Nonec                 C  s@   | j s
dS t| j tjr| j n| j j}t|dds6dS |jd S )zReturn the default Handler

        Returns None if none can be found

        Deprecated, this now returns the first log handler which may or may
        not be the default one.
        Nhandlersr   )rY   rT   r   r   loggerrU   r   )r5   r   r   r   r   _get_log_handler  s    z$LoggingConfigurable._get_log_handlerN)r   r   r   r   r   rY   r   r   r   r   r   r   r   r   r   rX     s   rX   CTSingletonConfigurable)boundc                   @  sb   e Zd ZdZdZeddddZedddd	Zed
ddddddZeddddZ	dS )r   zA configurable that only allows one instance.

    This class is for classes that should only have one instance of itself
    or *any* subclass. To create and retrieve such a class use the
    :meth:`SingletonConfigurable.instance` method.
    Nz4t.Generator[type[SingletonConfigurable], None, None]r8   c                 c  s4   |   D ]&}t| |rt|tr|tkr|V  qdS )zfWalk the cls.mro() for parent classes that are also singletons

        For use in instance()
        N)r   r:   r   r>   subclassr   r   r   	_walk_mro  s    zSingletonConfigurable._walk_mror#   c                 C  s0   |   sdS |  D ]}t|j| rd|_qdS )z5unset _instance for this class and singleton parents.N)initializedr   rT   	_instancer   r   r   r   clear_instance  s
    z$SingletonConfigurable.clear_instanceztype[CT]r"   r   )r>   argsr$   r%   c                 O  s\   | j dkr(| ||}|  D ]
}||_ qt| j | r:| j S td| j dt| j j dS )a  Returns a global instance of this class.

        This method create a new instance if none have previously been created
        and returns a previously created instance is one already exists.

        The arguments and keyword arguments passed to this method are passed
        on to the :meth:`__init__` method of the class upon instantiation.

        Examples
        --------
        Create a singleton class using instance, and retrieve it::

            >>> from traitlets.config.configurable import SingletonConfigurable
            >>> class Foo(SingletonConfigurable): pass
            >>> foo = Foo.instance()
            >>> foo == Foo.instance()
            True

        Create a subclass that is retrived using the base class instance::

            >>> class Bar(SingletonConfigurable): pass
            >>> class Bam(Bar): pass
            >>> bam = Bam.instance()
            >>> bam == Bar.instance()
            True
        NzAn incompatible sibling of 'z(' is already instantiated as singleton: )r   r   rT   r   r   r   )r>   r   r$   re   r   r   r   r   instance!  s    

zSingletonConfigurable.instanceboolc                 C  s   t | do| jdk	S )zHas an instance been created?r   N)hasattrr   r=   r   r   r   r   M  s    z!SingletonConfigurable.initialized)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   
+).r   
__future__r   r   typingr   copyr   textwrapr   Ztraitlets.traitletsr   r   r   r   r	   r
   r   r   r   r   Ztraitlets.utilsr   Ztraitlets.utils.bunchr   Ztraitlets.utils.textr   r   loaderr   r   r   r   TYPE_CHECKINGUnionr   r   r   r   r   r   r    rX   TypeVarr   r   r   r   r   r   <module>   s,   0	   /