o
    i%                     @  s   d dl mZ d dlmZmZmZ d dl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 d dlmZ d	Zd d
lmZmZ 					d$d%ddZe	G dd dZd&d"d#Z dS )'    )annotations)IterableIteratorMapping)asdict	dataclassfieldfieldsis_dataclass)datetime	timedelta)Enum)AnyLiteral)ElementTree)	BaseModel)format_as_xml)ComputedFieldInfo	FieldInfoNitemnull  Fobjr   root_tag
str | Noneitem_tagstrnone_strindentinclude_field_infoLiteral['once'] | boolreturnc                 C  sl   t | |||d|}|du r$|jdu r$|du rdnd}|t||S |dur/tj||d tj|ddS )a=  Format a Python object as XML.

    This is useful since LLMs often find it easier to read semi-structured data (e.g. examples) as XML,
    rather than JSON etc.

    Supports: `str`, `bytes`, `bytearray`, `bool`, `int`, `float`, `date`, `datetime`, `time`, `timedelta`, `Enum`,
    `Mapping`, `Iterable`, `dataclass`, and `BaseModel`.

    Args:
        obj: Python Object to serialize to XML.
        root_tag: Outer tag to wrap the XML in, use `None` to omit the outer tag.
        item_tag: Tag to use for each item in an iterable (e.g. list), this is overridden by the class name
            for dataclasses and Pydantic models.
        none_str: String to use for `None` values.
        indent: Indentation string to use for pretty printing.
        include_field_info: Whether to include attributes like Pydantic `Field` attributes and dataclasses `field()`
            `metadata` as XML attributes. In both cases the allowed `Field` attributes and `field()` metadata keys are
            `title` and `description`. If a field is repeated in the data (e.g. in a list) by setting `once`
            the attributes are included only in the first occurrence of an XML element relative to the same field.

    Returns:
        XML representation of the object.

    Example:
    ```python {title="format_as_xml_example.py" lint="skip"}
    from pydantic_ai import format_as_xml

    print(format_as_xml({'name': 'John', 'height': 6, 'weight': 200}, root_tag='user'))
    '''
    <user>
      <name>John</name>
      <height>6</height>
      <weight>200</weight>
    </user>
    '''
    ```
    )datar   r   r    N 
spaceunicodeencoding)_ToXmlto_xmltextjoin_rootless_xml_elementsr   r   tostring)r   r   r   r   r   r    elr.    r2   _/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/pydantic_ai/format_prompt.pyr      s   -r   c                   @  s   e Zd ZU ded< ded< ded< ded< eedZd	ed
< eedZded< eedZ	ded< dZ
ded< dZd/d0ddZd/d1ddZd2ddZd d! Z	"d3d4d'd(Z	"d3d5d)d*Zed6d-d.ZdS )7r+   r   r#   r   r   r   r!   r    )default_factoryz4dict[str, tuple[str, FieldInfo | ComputedFieldInfo]]_fields_infozset[str]_included_fieldsdict[str, str]_element_namesFbool_is_info_extracted)titledescriptionNtagr   r"   ElementTree.Elementc                 C  s   | j | jd|dS )Nr$   valuepathr=   )_to_xmlr#   )selfr=   r2   r2   r3   r,   ^   s   z_ToXml.to_xmlr@   rA   c              	   C  s  |  |d u r	| jn||}|d u r| j|_|S t|tr!||_|S t|ttB r1|jdd|_|S t|t	t
B tB tB rCt||_|S t|ttB rQ| |_|S t|tr]t||_|S t|trz|d u rq|| jv rq| j| |_| ||| |S t|rt|ts|   |d u r|jj|_| |t|| |S t|tr|   |d u r|jj|_| || | |S t|trt|D ]\}}|| j ||r| d| dnd| dd q|S t!dt| )Nignore)errors.[][)r@   rA   z%Unsupported type for XML formatting: )"_create_elementr   r   r-   
isinstancer   bytes	bytearraydecoder9   intfloatr   r   r   	isoformatr   r   r8   r=   _mapping_to_xmlr
   type_init_structure_info	__class____name__r   r   
model_dumpr   	enumerateappendrB   	TypeError)rC   r@   rA   r=   elementnr   r2   r2   r3   rB   a   sR    









2z_ToXml._to_xmlc           	      C  st   t |}|| jv r8| j| \}}| jr| jdks|| jvr8| |}| D ]
\}}||| q'| j| |S )Nonce)	r   Elementr5   r    r6   _extract_attributesitemssetadd)	rC   r=   rA   rZ   
field_repr
field_infofield_attributeskvr2   r2   r3   rI      s   


z_ToXml._create_elementc                 C  s    | j s| | j d| _ dS dS )z\Create maps with all data information (fields info and class names), if not already created.TN)r:   _parse_data_structuresr#   rC   r2   r2   r3   rS      s   
z_ToXml._init_structure_infor$   rZ   mappingMapping[Any, Any]Nonec                 C  sp   |  D ]1\}}t|trt|}nt|ts!tdt| d|| j||r/| d| n||d qd S )Nz)Unsupported key type for XML formatting: z, only str and int are allowed.r?   )r_   rJ   rN   r   rY   rR   rX   rB   )rC   rZ   ri   rA   keyr@   r2   r2   r3   rQ      s   


*z_ToXml._mapping_to_xmlc                   s  |du st |ttB tB tB tB tB tB tB t	B rdS t |t
r;| D ]\}} ||r4| d| n|  q$dS t|rt |ts|jj j|< t|D ]C}|r[| d|j n|j} jr|jr fdd|j D }|r|jj d|j }|tdi |f j|<  t||j| qOdS t |tr|jj j|< |jj|jjfD ]:}	|	 D ]3\}}
|r| d| n|} jrt |
ts|
js|jj d| }||
f j|<  t||| qqdS t |trt|D ]\}}|r| d| dnd| d} || qdS dS )	z`Parse data structures as dataclasses or Pydantic models to extract element names and attributes.Nrl   c                   s    i | ]\}}| j v r||qS r2   _FIELD_ATTRIBUTES).0re   rf   rh   r2   r3   
<dictcomp>   s     z1_ToXml._parse_data_structures.<locals>.<dictcomp>rF   rG   rH   r2   ) rJ   r   rN   rO   r   r   r   rL   rK   r9   r   r_   rg   r
   rR   rT   rU   r8   r	   namer    metadatar   r5   getattrr   model_fieldsmodel_computed_fieldsr   excluder   rW   )rC   r@   rA   re   rf   r   new_path
attributesrb   ru   infor[   r   r2   rh   r3   rg      sD   2
"
 z_ToXml._parse_data_structuresrz   FieldInfo | ComputedFieldInfoc                   s    fdd| j D S )Nc                   s*   i | ]}t  |d  d ur|tqS N)rt   r   )rp   attrrz   r@   r2   r3   rq      s   * z._ToXml._extract_attributes.<locals>.<dictcomp>rn   )clsrz   r2   r~   r3   r^      s   z_ToXml._extract_attributesr|   )r=   r   r"   r>   )r@   r   rA   r   r=   r   r"   r>   )r=   r   rA   r   r"   r>   )r$   )rZ   r>   ri   rj   rA   r   r"   rk   )r@   r   rA   r   )rz   r{   r"   r7   )rU   
__module____qualname____annotations__r   dictr5   r`   r6   r8   r:   ro   r,   rB   rI   rS   rQ   rg   classmethodr^   r2   r2   r2   r3   r+   M   s(   
 
%
#r+   rootr>   Iterator[str]c                 c  s6    | D ]}|d urt j||d t j|ddV  qd S )Nr&   r(   r)   )r   r   r0   )r   r   sub_elementr2   r2   r3   r/      s   r/   )Nr   r   r   F)r   r   r   r   r   r   r   r   r   r   r    r!   r"   r   )r   r>   r   r   r"   r   )!
__future__r   _annotationscollections.abcr   r   r   dataclassesr   r   r   r	   r
   datetimer   r   r   enumr   typingr   r   	xml.etreer   pydanticr   __all__pydantic.fieldsr   r   r   r+   r/   r2   r2   r2   r3   <module>   s&    <~