U
    h#                     @  s$  d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
 d dlmZmZmZ d dlmZ ddlmZmZ ddlmZ erddlmZ dd	lmZ dd
lmZ e	de
eeef dZe	dZG dd deeef ZG dd dee Z ddddddZ!d!dddddddZ"d"dddddddZ#d S )#    )annotations)TYPE_CHECKINGAnyCallableGenericIteratorMappingTypeVarUnion)
CoreSchemaSchemaSerializerSchemaValidator)Literal   )PydanticErrorCodesPydanticUserError)PluggableSchemaValidator)PydanticDataclass)	BaseModel)TypeAdapterValSer)boundTc                   @  sv   e Zd ZdZdZddddddd	d
dZdddddZddddZddddZddddZ	ddddZ
dS )MockCoreSchemazMocker for `pydantic_core.CoreSchema` which optionally attempts to
    rebuild the thing it's mocking when one of its methods is accessed and raises an error if that fails.
    _error_message_code_attempt_rebuild_built_memoNattempt_rebuildstrr   z&Callable[[], CoreSchema | None] | NoneNone)error_messagecoder    returnc                C  s   || _ || _|| _d | _d S Nr   )selfr#   r$   r     r(   D/tmp/pip-unpacked-wheel-y076a95i/pydantic/_internal/_mock_val_ser.py__init__   s    zMockCoreSchema.__init__r   )keyr%   c                 C  s   |   |S r&   )
_get_built__getitem__)r'   r+   r(   r(   r)   r-   (   s    zMockCoreSchema.__getitem__intr%   c                 C  s   |    S r&   )r,   __len__r'   r(   r(   r)   r0   +   s    zMockCoreSchema.__len__zIterator[str]c                 C  s   |    S r&   )r,   __iter__r1   r(   r(   r)   r2   .   s    zMockCoreSchema.__iter__r   c                 C  sD   | j d k	r| j S | jr0|  }|d k	r0|| _ |S t| j| jdd S Nr$   r   r   r   r   r   r'   Zschemar(   r(   r)   r,   1   s    
zMockCoreSchema._get_builtzCoreSchema | Nonec                 C  s4   d | _ | jr0|  }|d k	r |S t| j| jdd S r3   r5   r6   r(   r(   r)   rebuild<   s    zMockCoreSchema.rebuild)__name__
__module____qualname____doc__	__slots__r*   r-   r0   r2   r,   r7   r(   r(   r(   r)   r      s   r   c                   @  sN   e Zd ZdZdZddddddd	d
ddZdd	dddZddddZdS )
MockValSerzMocker for `pydantic_core.SchemaValidator` or `pydantic_core.SchemaSerializer` which optionally attempts to
    rebuild the thing it's mocking when one of its methods is accessed and raises an error if that fails.
    )r   r   _val_or_serr   Nr   r!   r   z$Literal[('validator', 'serializer')]z"Callable[[], ValSer | None] | Noner"   )r#   r$   
val_or_serr    r%   c                C  s(   || _ |dkrtnt| _|| _|| _d S )N	validator)r   r   r   r>   r   r   )r'   r#   r$   r?   r    r(   r(   r)   r*   N   s    zMockValSer.__init__)itemr%   c                 C  sD   d}| j r$|   }|d k	r$t||S t| j| t| j| jdd S )NTr4   )r   getattrr>   r   r   r   )r'   rA   Z__tracebackhide__val_serr(   r(   r)   __getattr__[   s    
zMockValSer.__getattr__zValSer | Noner/   c                 C  s.   | j r*|   }|d k	r|S t| j| jdd S r3   )r   r   r   r   )r'   rC   r(   r(   r)   r7   f   s    zMockValSer.rebuild)r8   r9   r:   r;   r<   r*   rD   r7   r(   r(   r(   r)   r=   G   s   r=   r   r!   r"   )adapter	type_reprr%   c                   sv   d| d| d}ddd fdd}t |d	|d
d d _t|d	d|dd d _t|d	d|dd d _dS )zSet `core_schema`, `validator` and `serializer` to mock core types on a type adapter instance.

    Args:
        adapter: The type adapter instance to set the mocks on
        type_repr: Name of the type used in the adapter, used in error messages
    z`TypeAdapter[z,]` is not fully defined; you should define `zC` and all referenced types, then call `.rebuild()` on the instance.zCallable[[TypeAdapter], T]Callable[[], T | None]attr_fnr%   c                   s   dd fdd}|S )NT | Noner/   c                     s"    j ddddk	r S d S d S NF   )raise_errorsZ_parent_namespace_depth)r7   r(   )rE   rI   r(   r)   handler}   s    zCset_type_adapter_mocks.<locals>.attempt_rebuild_fn.<locals>.handlerr(   rI   rN   rE   rI   r)   attempt_rebuild_fn|   s    z2set_type_adapter_mocks.<locals>.attempt_rebuild_fnclass-not-fully-definedc                 S  s   | j S r&   )core_schematar(   r(   r)   <lambda>       z(set_type_adapter_mocks.<locals>.<lambda>r$   r    r@   c                 S  s   | j S r&   )r@   rU   r(   r(   r)   rW      rX   r$   r?   r    
serializerc                 S  s   | j S r&   )r[   rU   r(   r(   r)   rW      rX   N)r   rT   r=   r@   r[   )rE   rF   undefined_type_error_messagerR   r(   rP   r)   set_type_adapter_mocksp   s(    	


r]   all referenced typesztype[BaseModel])clscls_nameundefined_namer%   c                   s|   d| d| d| d}ddd fdd	}t |d
|dd d _t|d
d|dd d _t|d
d|dd d _dS )aD  Set `__pydantic_core_schema__`, `__pydantic_validator__` and `__pydantic_serializer__` to mock core types on a model.

    Args:
        cls: The model class to set the mocks on
        cls_name: Name of the model class, used in error messages
        undefined_name: Name of the undefined thing, used in error messages
    `*` is not fully defined; you should define z, then call `z.model_rebuild()`.zCallable[[type[BaseModel]], T]rG   rH   c                   s   dd fdd}|S )NrJ   r/   c                     s"   j ddddk	r S d S d S rK   )Zmodel_rebuildr(   )rI   r_   r(   r)   rN      s    z<set_model_mocks.<locals>.attempt_rebuild_fn.<locals>.handlerr(   rO   r_   rQ   r)   rR      s    z+set_model_mocks.<locals>.attempt_rebuild_fnrS   c                 S  s   | j S r&   __pydantic_core_schema__cr(   r(   r)   rW      rX   z!set_model_mocks.<locals>.<lambda>rY   r@   c                 S  s   | j S r&   __pydantic_validator__rg   r(   r(   r)   rW      rX   rZ   r[   c                 S  s   | j S r&   __pydantic_serializer__rg   r(   r(   r)   rW      rX   N)r   rf   r=   rj   rl   r_   r`   ra   r\   rR   r(   rd   r)   set_model_mocks   s(    		


rn   ztype[PydanticDataclass]c                   s   ddl m d| d| d| d}ddd	 fd
d}t|d|dd d _t|dd|dd d _t|dd|dd d _dS )a*  Set `__pydantic_validator__` and `__pydantic_serializer__` to `MockValSer`s on a dataclass.

    Args:
        cls: The model class to set the mocks on
        cls_name: Name of the model class, used in error messages
        undefined_name: Name of the undefined thing, used in error messages
    r   )rebuild_dataclassrb   rc   z4, then call `pydantic.dataclasses.rebuild_dataclass(z)`.z&Callable[[type[PydanticDataclass]], T]rG   rH   c                   s   dd fdd}|S )NrJ   r/   c                     s"   ddddk	r S d S d S rK   r(   r(   )rI   r_   ro   r(   r)   rN      s    z@set_dataclass_mocks.<locals>.attempt_rebuild_fn.<locals>.handlerr(   rO   r_   ro   rQ   r)   rR      s    z/set_dataclass_mocks.<locals>.attempt_rebuild_fnrS   c                 S  s   | j S r&   re   rg   r(   r(   r)   rW      rX   z%set_dataclass_mocks.<locals>.<lambda>rY   r@   c                 S  s   | j S r&   ri   rg   r(   r(   r)   rW      rX   rZ   r[   c                 S  s   | j S r&   rk   rg   r(   r(   r)   rW      rX   N)dataclassesro   r   rf   r=   rj   rl   rm   r(   rp   r)   set_dataclass_mocks   s*    
	


rr   N)r^   )r^   )$
__future__r   typingr   r   r   r   r   r   r	   r
   Zpydantic_corer   r   r   Ztyping_extensionsr   errorsr   r   Zplugin._schema_validatorr   rq   r   mainr   Ztype_adapterr   r   r   r!   r   r=   r]   rn   rr   r(   r(   r(   r)   <module>   s"   (2)(* 