o
    dis)                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ e eZG dd deZdS )    N)partial)ResourceFactory)ResourceModel)ResourceMeta)	docstring)ResourceLoadException)build_identifiers)AIOCollectionFactory)AIOServiceActionAIOWaiterAction)AIOBoto3ServiceResourcec                   @   s@   e Zd Zdd Zdd Zdd Zdd Zd	d
 Z	dddZdS )AIOBoto3ResourceFactoryc                 C   s   t  | _|| _d S N)r	   _collection_factory_emitter)selfemitter r   N/home/ubuntu/.local/lib/python3.10/site-packages/aioboto3/resources/factory.py__init__   s   
z AIOBoto3ResourceFactory.__init__c           
         s&  t d|j| t|||j}d }|jr|j|j}|| t	|j|d}d|i}| j
||||d | j||||d | j|||||d | j|||d | j||||d | j||||d |}|j|krkd}|jd	 | }tg}	| jd ur| jjd
| ||	|dI d H  tt|t|	|S )NzLoading %s:%s)resource_modelmeta)attrsr   resource_namer   )r   r   r   service_context)r   r   r   r   r   )r   r   r   ServiceResource.zcreating-resource-class.%s)class_attributesbase_classesr   )loggerdebugservice_namer   resource_json_definitionsshapeservice_model	shape_forload_rename_mapr   _load_identifiers_load_actions_load_attributes_load_collections_load_has_relations_load_waitersr   r   emittypestrtuple)
r   r   single_resource_json_definitionr   r   r#   r   r   cls_namer   r   r   r   load_from_definition   s   



z,AIOBoto3ResourceFactory.load_from_definitionc                    s:    fdd}t ||_tj|j||| j|dd|_t|S )z
        Creates a new property on the resource to lazy-load its value
        via the resource's ``load`` method (if it exists).
        c                    sH   | j jd u rt| dr|  I d H  n	td| jj| j j S )Nloadz{0} has no load method)	r   datahasattrr4   r   format	__class____name__get)r   namer   r   property_loader   s   
zJAIOBoto3ResourceFactory._create_autoload_property.<locals>.property_loaderF)r!   r   	attr_nameevent_emitter
attr_modelinclude_signature)r/   r9   r   AttributeDocstringr!   r   __doc__property)factory_selfr   r<   snake_casedmember_modelr   r=   r   r;   r   _create_autoload_propertyu   s   
	z1AIOBoto3ResourceFactory._create_autoload_propertyc                    sH   t ||jd  fdd}t|j|_tj|| j|j||jdd|_	|S )zx
        Creates a new wait method for each resource where both a waiter and
        resource model is defined.
        )waiter_resource_namec                    s"    | g|R i |I d H  d S r   r   )r   argskwargswaiterr   r   	do_waiter   s    z9AIOBoto3ResourceFactory._create_waiter.<locals>.do_waiterF)r   r?   r$   resource_waiter_modelservice_waiter_modelrA   )
r   r<   r/   r9   r   ResourceWaiterDocstringr   r$   rP   rC   )rE   rO   r   r   rN   r   rL   r   _create_waiter   s   z&AIOBoto3ResourceFactory._create_waiterc                    s>   j j fdd}t|_tj|jdd|_|S )z
        Creates a new method which acts as a functools.partial, passing
        along the instance's low-level `client` to the new resource
        class' constructor.
        c           	         s|   g }j i } j|dI d H }jj}|d ur,t|| D ]	\}}|| q"t|g|R d| jj	i|i |S )N)r   r1   r   client)
r"   r:   r3   resourceidentifiersr   appendr   r   rS   )	r   rJ   rK   positional_argsjson_defresource_clsrU   
identifiervaluerE   r<   r   subresource_modelr   r   create_resource   s.   zFAIOBoto3ResourceFactory._create_class_partial.<locals>.create_resourceF)r   sub_resource_modelr$   rA   )rT   r.   r/   r9   r   SubResourceDocstringr$   rC   )rE   r]   r   r   r^   r   r\   r   _create_class_partial   s   
z-AIOBoto3ResourceFactory._create_class_partialFc                    sv   t || |d |r fdd}tj|j|| j||jdd}n fdd}tj|| j||jdd}t|j|_||_	|S )zc
        Creates a new method which makes a request to the underlying
        AWS service.
        )factoryr   c                    s*    | g|R i |I d H }|| j _d S r   )r   r5   r   rJ   rK   responseactionr   r   	do_action   s   z9AIOBoto3ResourceFactory._create_action.<locals>.do_actionF)action_namer   r?   
load_modelr$   rA   c                    s4    | g|R i |I d H }t | drd | j_|S )Nr4   )r6   r   r5   rc   re   r   r   rg     s
   
)r   r?   action_modelr$   rA   )
r
   r   LoadReloadDocstringr<   r   r$   ActionDocstringr/   r9   rC   )rE   rj   r   r   is_loadrg   lazy_docstringr   re   r   _create_action   s0   z&AIOBoto3ResourceFactory._create_actionN)F)	r9   
__module____qualname__r   r3   rH   rR   ra   ro   r   r   r   r   r      s    ]'3r   )logging	functoolsr   boto3.resources.factoryr   boto3.resources.modelr   boto3.resources.baser   
boto3.docsr   boto3.exceptionsr   r   aioboto3.resources.collectionr	   aioboto3.resources.actionr
   r   aioboto3.resources.baser   	getLoggerr9   r   r   r   r   r   r   <module>   s    
