U
    e<                     @  s   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mZ erlddlmZ ddlmZ ed	e	eZG d
d dee ZddddddddZddddddddZdS )    )annotations)TYPE_CHECKINGCallableGenericTypeVar)SchemaSerializerSchemaValidator)Literal   )PydanticErrorCodesPydanticUserError)PydanticDataclass)	BaseModelValSerc                   @  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.
    )_error_message_code_val_or_ser_attempt_rebuildN)attempt_rebuildstrr   z$Literal[('validator', 'serializer')]z"Callable[[], ValSer | None] | NoneNone)error_messagecode
val_or_serr   returnc                C  s(   || _ |dkrtnt| _|| _|| _d S )N	validator)r   r   r   r   r   r   )selfr   r   r   r    r   D/tmp/pip-unpacked-wheel-6q_yhcy8/pydantic/_internal/_mock_val_ser.py__init__   s    zMockValSer.__init__)itemr   c                 C  sD   d}| j r$|   }|d k	r$t||S t| j| t| j| jdd S )NTr   )r   getattrr   r   r   r   )r   r!   Z__tracebackhide__val_serr   r   r   __getattr__&   s    
zMockValSer.__getattr__zValSer | Noner   c                 C  s.   | j r*|   }|d k	r|S t| j| jdd S )Nr"   )r   r   r   r   )r   r$   r   r   r   rebuild1   s    zMockValSer.rebuild)__name__
__module____qualname____doc__	__slots__r    r%   r'   r   r   r   r   r      s   r   all referenced typesztype[BaseModel]r   r   )clscls_nameundefined_namer   c                   sd   d| d| d| d}dd fdd}t |d	d
|d _dd fdd}t |d	d|d _dS )a&  Set `__pydantic_validator__` and `__pydantic_serializer__` to `MockValSer`s 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()`.SchemaValidator | Noner&   c                     s     j ddddk	r jS d S d S NF   )raise_errorsZ_parent_namespace_depth)model_rebuild__pydantic_validator__r   r.   r   r   attempt_rebuild_validatorH   s    z2set_model_mocks.<locals>.attempt_rebuild_validatorclass-not-fully-definedr   r   r   r   SchemaSerializer | Nonec                     s     j ddddk	r jS d S d S r4   )r7   __pydantic_serializer__r   r9   r   r   attempt_rebuild_serializerU   s    z3set_model_mocks.<locals>.attempt_rebuild_serializer
serializerN)r   r8   r>   r.   r/   r0   Zundefined_type_error_messager:   r?   r   r9   r   set_model_mocks;   s     	rB   ztype[PydanticDataclass]c                   st   ddl m d| d| d| d}dd fd	d
}t|dd|d _dd fdd}t|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_dataclassr1   r2   z4, then call `pydantic.dataclasses.rebuild_dataclass(z)`.r3   r&   c                     s     ddddk	r j S d S d S r4   )r8   r   r.   rC   r   r   r:   t   s    z6set_dataclass_mocks.<locals>.attempt_rebuild_validatorr;   r   r<   r=   c                     s     ddddk	r j S d S d S r4   )r>   r   rD   r   r   r?      s    z7set_dataclass_mocks.<locals>.attempt_rebuild_serializerN)dataclassesrC   r   r8   r>   rA   r   rD   r   set_dataclass_mocksc   s"    
rF   N)r-   )r-   )
__future__r   typingr   r   r   r   Zpydantic_corer   r   Ztyping_extensionsr	   errorsr   r   rE   r   mainr   r   r   rB   rF   r   r   r   r   <module>   s   )) 