o
    1jY                     @   sR   d dl mZ ddlmZ ddlmZmZmZ G dd deZ	G dd dee	Z
d	S )
    )ABCMeta   )logging)DuplicateRegistrationErrorraise_class_not_found_error raise_no_entity_registered_errorc                       sf   e Zd ZdZdZdZdZ fddZedd Z	ed	d
 Z
edd Zdd ZdefddZ  ZS )AutoRegisterMetaClasszmeta class that automatically registry subclass to its baseclass

    Args:
        type (class): type

    Returns:
        class: meta class
    entitiesZ	__is_baseZ__registered_mapc                    s$   t  | |||}| ||| |S N)super__new__-_AutoRegisterMetaClass__register_model_entity)mcsnamebasesattrscls	__class__ `/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddlex/utils/subclass_register.pyr   '   s   zAutoRegisterMetaClass.__new__c                 C   s<   |r|D ]}|  |}|rt|| jr| || qd S d S r
   )'_AutoRegisterMetaClass__find_base_classhasattr,_AutoRegisterMetaClass__model_type_attr_name._AutoRegisterMetaClass__register_to_base_class)r   r   r   r   basebase_clsr   r   r   Z__register_model_entity,   s   
z-AutoRegisterMetaClass.__register_model_entityc                 C   sV   | j }|drd|j | }t||dr|S |jD ]}| |}|r(|  S qd S )N___F)'_AutoRegisterMetaClass__base_class_flag
startswith__name__getattr	__bases__r   )r   r   Zis_base_flagr   r   r   r   r   Z__find_base_class4   s   


z'AutoRegisterMetaClass.__find_base_classc              	   C   s   t || j}t|tr|g}t || ji }|D ]/}||v r5|| |ur5td| d|j d|| j d|||< td|j d| d qt	|| j| d S )Nz
The name(`z5`) duplicated registration! The class entities are: `z` and `z`.zThe class entity(z) has been register as name(`z`).)
r"   r   
isinstancestr+_AutoRegisterMetaClass__registered_map_namer   r!   r   debugsetattr)r   r   r   Zcls_entity_namerecordsr   r   r   r   Z__register_to_base_classA   s    
z.AutoRegisterMetaClass.__register_to_base_classc                 C   s(   t | t| jst|  t| t| jS )zget all subclass)r   typer&   r   r"   )r   r   r   r   allT   s   zAutoRegisterMetaClass.allr   c                 C   s$   |   }||vrt|| | || S )z get the registried class by name)r+   r   )r   r   Zall_entitiesr   r   r   getZ   s   zAutoRegisterMetaClass.get)r!   
__module____qualname____doc__r   r   r&   r   classmethodr   r   r   r+   r%   r,   __classcell__r   r   r   r   r      s    	


r   c                   @   s   e Zd Zd ZdS )AutoRegisterABCMetaClassN)r!   r-   r.   r/   r   r   r   r   r2   b   s    r2   N)abcr    r   errorsr   r   r   r*   r   r2   r   r   r   r   <module>   s
   I