o
    i                     @   sn  d dl mZ d dlZd dlZd dlmZmZ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mZmZmZmZ ddlmZmZmZ dd	lmZ d
dd e D iZG dd deZG dd deZ dededefddZ!dededefddZ"G dd dej#Z$G dd de Z%G dd dZ&G d d! d!e Z'G d"d# d#e'Z(G d$d% d%e'Z)G d&d' d'e'Z*dS )(    )deepcopyN)DictHashableListOptionalUnioncast   )JsonSchemaObjectjson_schema_data_formats)LMFormatEnforcerException)CharacterLevelParserCharacterLevelParserConfigForceStopParserSequenceParserStringParserUnionParser)	BACKSLASHBACKSLASH_ESCAPING_CHARACTERSWHITESPACE_CHARACTERS)RegexParseranyOfc                 C   s   g | ]
}|d krd|iqS )integertype ).0r   r   r   ^/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/lmformatenforcer/jsonschemaparser.py
<listcomp>       r   c                	       s   e Zd ZU edi eZeed< G dd dZee	 ed< eed< e
ed< eed< eed< 					
ddeeed	f dee deee	  de
f fddZdede	fddZdefddZdefddZdee fddZ  ZS )JsonSchemaParserANY_JSON_OBJECT_SCHEMAc                   @   s:   e Zd ZU eed< ded< eed< i Zeeef ed< dS )zJsonSchemaParser._Contextmodel_classr   active_parseralphabet_without_quotesregex_parser_cacheN)	__name__
__module____qualname__r
   __annotations__strr$   r   r   r   r   r   r   _Context   s
   
 r*   object_stackcontextnum_consecutive_whitespaceslast_parsed_stringlast_non_whitespace_characterNr   json_schemaconfigexisting_stackc                    s   t  | t|tjr|| _n t | _|pt}tdi || j_| | j_	| j
jdd| j_|| _|du rAt| | jjg| _n|| _d| _d| _dS )zCreate a CharacterLevelParser for parsing JSON.
        :param json_schema: The json schema to parse. Can be a dict of a JSON schema, or None if any json output is allowed." Nr   )super__init__
isinstancer   r*   r,   _ANY_JSON_SCHEMA_DICTr
   r!   r"   r1   alphabetreplacer#   r-   
get_parserr+   r.   r/   )selfr0   r1   r2   r-   	__class__r   r   r6       s   

zJsonSchemaParser.__init__new_characterreturnc                 C   s2  | | j _t| jd }| j}|dkr9|| j|  vr9| j| }t|tr(|j}|d8 }|dkr9|| j|  vs| jd |d  }t	| j | j
|| j}||j _||_|dkrb|j| ||j|< |tv rr| jd7  _| j|_nd|_||_|jrt|jd trtdd |jd jD rg }|jd jD ]&}|jd d |g }	t	| j | j
|	|j}||j _||_|j|_|| qt|S |j}
|
r|
d  r|
d  dkr|
d }t|tr|j|_|
d= |
r|
d }t|tr| }| jd7  _||
d< |
r|
d  r|
d  dks|S )Nr	   r   c                 s       | ]
}t |ttfV  qd S N)r7   ObjectParsingStateListParsingStater   parserr   r   r   	<genexpr>S       z1JsonSchemaParser.add_character.<locals>.<genexpr>r4   )r,   r"   lenr+   r.   get_allowed_charactersr7   StringParsingStateparsed_stringr   r1   r-   add_characterr   r/   r   anyparsersappendcan_endrE   _clonenum_items_seen)r<   r?   receiving_idxr.   finished_receiverupdated_stackupdated_parseroption_json_schema_parsersoption_parseroption_stacknew_object_stacknew_top_parserr   r   r   rN   9   s\   


&
$zJsonSchemaParser.add_characterc                 C   sx   | | j _g }t| jD ]}||  | s nqt|dkr'd|}nt	}| j
| jjkr:ddd |D }|S )Nr   r4   c                 s   s    | ]	}|t vr|V  qd S rC   )r   r   cr   r   r   rH      s    z:JsonSchemaParser.get_allowed_characters.<locals>.<genexpr>)r,   r"   reversedr+   rQ   rK   rR   rJ   joinr   r-   r1   max_consecutive_whitespaces)r<   allowed_character_strsrG   allowed_charactersr   r   r   rK   s   s   z'JsonSchemaParser.get_allowed_charactersc                 C   s   t dd | jD S )Nc                 s   s    | ]}|  V  qd S rC   )rR   rF   r   r   r   rH      s    z+JsonSchemaParser.can_end.<locals>.<genexpr>)allr+   r<   r   r   r   rR      s   zJsonSchemaParser.can_endc                 C   sz   | j r;| j d }t|tr;|js;|jr;|js;|js;t|j}|j	p"d}|j
p(tj}||ks1J d||k r;d|||fS d S )NrA   r   z<Invalid schema for str: min length is larger than max lengthjson_freetext)r+   r7   rL   allowed_stringsseen_opening_quoteseen_closing_quoteregex_parserrJ   rM   
min_length
max_lengthsysmaxsize)r<   current_parsercur_lenmin_lenmax_lenr   r   r   shortcut_key   s   



zJsonSchemaParser.shortcut_keyr   )NNr   )r%   r&   r'   r
   r8   r    r(   r*   r   r   intr)   r   dictr   r   r6   rN   rK   boolrR   r   rt   __classcell__r   r   r=   r   r      s0   
 
:r   c                   @   s   e Zd ZdefddZdS )BaseParsingStaterootc                 C   s
   || _ d S rC   )rz   r<   rz   r   r   r   r6      s   
zBaseParsingState.__init__N)r%   r&   r'   r   r6   r   r   r   r   ry      s    ry   base_schemaoption_schemar@   c                 C   sV   | j pi }| D ]\}}||j vr||j |< q	| jD ]}||jvr(|j| q|S rC   )
propertiesitemsrequiredrQ   )r|   r}   base_schema_propertiesproperty_nameproperty_valuerequired_propertyr   r   r   _merge_object_schemas   s   




r   parsing_statevalue_schemac                    s  d u rt djr fddjD }t|S jr5jd }jdd  D ]}t||}q(t |S jrQdjv rQjd }t|tk}t	 |g||dS jdkrdt	 j
d	jjjd
S jr~fddjD } fdd|D }t|S jdkrt S jd krÈjrÈjdd }	 jjj}
d|
v r|
d }nd|
v r|
d }ntd||	 }td#i |t S j
rtdd j
D }tdd j
D }|rt	 j
d	dS |rt	 dd j
D dddS t dtj
 jdkrt dS jdkrt	 ddgdddS jdkr't	 dgdddS jdkr2t d	S jd krHjp>tj}t |jjS tjtr] fd!djD }t|S t d"tj )$Nz&JsonSchemaParser: Value schema is Nonec                       g | ]}t  |qS r   )r;   r   schemar   r   r   r          zget_parser.<locals>.<listcomp>r   r	   constrequire_opening_quoterequire_closing_quotestringT)r   rl   rm   patternc                    r   r   )r   )r   r}   )r   r   r   r      r   c                    s   g | ]}t | qS r   )rD   )r   merged_schemar   r   r   r      r   object/rA   definitionsz$defszNo definitions found in schemac                 s   rB   rC   )r7   ru   floatr   ir   r   r   rH      rI   zget_parser.<locals>.<genexpr>c                 s   s    | ]}t |tV  qd S rC   )r7   r)   r   r   r   r   rH      s    )r   c                 S      g | ]}t |qS r   )r)   r   r   r   r   r          FzUnsupported enum type r   booleantruefalsenullnumberarrayc                    s   g | ]
}t  t|d qS ))r   )r;   r
   r   r   r   r   r   
  r   zUnsupported type r   ) 	Exceptionr   r   allOfr   r;   extrasr   r)   rL   enum	minLength	maxLengthr   oneOfrD   refsplitr,   r!   
ValueErrorr
   re   NumberParsingStater   r   r    rE   minItemsmaxItemsr7   list)r   r   rP   r   r   allowed_value	is_stringmerged_schemasobject_parsing_optionsvalue_class_namer   r   
class_dict
is_numericitem_schemar   )r   r   r   r;      s   











r;   c                   @   s$   e Zd ZdZdZdZdZdZdZdS )ObjectParsingStageStartObject
ParsingKeyParsingKeyValueSeparatorParsingValueParsingSeparatorOrEnd	EndObjectN)	r%   r&   r'   START_OBJECTPARSING_KEY_OR_ENDPARSING_KEY_VALUE_SEPARATORPARSING_VALUEPARSING_SEPARATOR_OR_END
END_OBJECTr   r   r   r   r     s    r   c                       s   e Zd ZU eed< eed< ee ed< ee ed< e	ed< dede
f fddZdd
dZded	efddZd	efddZd	e	fddZ  ZS )rD   schema_objectcurrent_stageexisting_keyscurrent_keyis_dictionaryrz   c                    s>   t  | || _tj| _|| _g | _d | _| jj	d u | _
d S rC   )r5   r6   r   r   r   r   rz   r   r   r~   r   )r<   r   rz   r=   r   r   r6      s   zObjectParsingState.__init__r@   c                 C   s:   t | j| j}| j|_| jd d  |_| j|_| j|_|S rC   )rD   r   rz   r   r   r   r   r<   cloner   r   r   r   *  s   zObjectParsingState.cloner?   c                    s  |  dkr S     jtjkr|dkrtj _ S  jtjkr|dkr*tj _|dkr}d } jsb jj	p8g }t
 fdd|D d } jjjrP|rP|g}nt jj }tt| j}t j|ddd}|d} jjjj| tj _ S  jtjkr|d	krtj _ jjjj _ j j  jr jjr jj}ntj }n jj j }t! j| _" jjjj j" d  _" S  jtjkr|dkrtj# _ S |d
krtj _ S |dkrtj _ S  jtj#kr|d
krtj _ S |dkrtj _ S )Nr4   {}r3   c                 3   s    | ]
}| j vr|V  qd S rC   )r   )r   keyrf   r   r   rH   C  rI   z3ObjectParsingState.add_character.<locals>.<genexpr>Tr   :,)$stripr   r   r   r   r   r   r   r   r   nextrz   r1   force_json_field_orderr   r~   keysset
differencer   rL   rN   r,   r"   r+   rQ   r   r   r.   r   additionalPropertiesr   r    r;   current_key_parserr   )r<   r?   possible_keysrequired_keysnext_required_key
key_parserr   r   rf   r   rN   2  sz   7

 


z ObjectParsingState.add_characterc                 C   s  | j st| jj nd }| jjpg }t| j|}| j p%t|	| j}dd t
D }| jtjkr9|d nJ| jtjkrN|rF|d |rM|d n5| jtjkrZ|d n)| jtjkro|rg|d |rn|d n| jtjkr|r||d |r|d d|S )	Nc                 S   s   g | ]}|qS r   r   r^   r   r   r   r     s    z=ObjectParsingState.get_allowed_characters.<locals>.<listcomp>r   r   r3   r   r   r4   )r   r   r   r~   r   r   r   r   
issupersetr   r   r   r   r   rQ   r   r   r   r   ra   )r<   r   r   rR   can_parse_keypossible_charactersr   r   r   rK   t  s@   






z)ObjectParsingState.get_allowed_charactersc                 C   s   | j tjkS rC   )r   r   r   rf   r   r   r   rR     s   zObjectParsingState.can_end)r@   rD   )r%   r&   r'   r
   r(   r   r   r)   r   rw   r   r6   r   r   rN   rK   rR   rx   r   r   r=   r   rD     s   
 

B#rD   c                   @   s   e Zd ZdZdZdZdS )StringParsingStage
StartTokenParsingStringEndTokenN)r%   r&   r'   START_TOKENPARSING_STRING	END_TOKENr   r   r   r   r     s    r   c                       sL   e Zd Zdef fddZdddZdedd fdd	Zdefd
dZ	  Z
S )PrimitiveParsingStaterz   c                    s   t  | tj| _d| _d S )Nr4   )r5   r6   r   r   stagerM   r{   r=   r   r   r6     s   
zPrimitiveParsingState.__init__r@   c                 C   s   t  rC   )NotImplementedErrorrf   r   r   r   rS        zPrimitiveParsingState._cloner?   c                 C   s   |   }| j|7  _|S rC   )rS   rM   )r<   r?   newr   r   r   rN     s   z#PrimitiveParsingState.add_characterc                 C   s   dS )NTr   rf   r   r   r   rR     s   zPrimitiveParsingState.can_end)r@   r   )r%   r&   r'   r   r6   rS   r)   rN   rw   rR   rx   r   r   r=   r   r     s
    
r   c                       sb   e Zd Zdedef fddZdddZdedef fd	d
Z	defddZ
defddZ  ZS )r   rz   allow_floating_pointc                    s.   t  | || _d| _d| _d| _d| _d S )NF)r5   r6   r   seen_decimal_pointseen_whitespace_after_digitsseen_exponent
seen_digit)r<   rz   r   r=   r   r   r6     s   
zNumberParsingState.__init__r@   c                 C   s:   t | j| j}| j|_| j|_| j|_| j|_| j|_|S rC   )r   rz   r   rM   r   r   r   r   r   r   r   r   rS     s   zNumberParsingState._cloner?   c                    s   | j s	|tv r	| S ttt |} |tv r| j rd| _| S |dkr<| j r,t| j dkr0td| j	r7tdd| _	| S |dv rO| j
sF| jsJtdd| _
| S | rVd| _| S )NT.r	   z*Numbers cannot start with a decimal point.z4Numbers cannot contain more than two decimal points.eEzInvalid number format)rM   r   r   r   r5   rN   r   rJ   r   r   r   r   isdigit)r<   r?   r=   r   r   rN     s,   z NumberParsingState.add_characterc                 C   s   | j rtS d}| js|dt 7 }| jr#t| jdkr#| jd dkr#t}| jr6t| jdkr6| jdkr6dt }| jrD| jd	 d
v rD|d7 }| jrN| jsN|d
7 }| jr^| js^| jr^| js^|d7 }| jrl| jd	  rl|t7 }|S )N
0123456789-r	   r   0   z-0r   rA   r   z-+)	r   r   rM   rJ   r   r   r   r   r   )r<   rd   r   r   r   rK     s$   "z)NumberParsingState.get_allowed_charactersc                 C   s6   | j r| jd dv rdS t| jo| jd  p| jS )NrA   zeE+-F)r   rM   rw   r   r   rf   r   r   r   rR     s   zNumberParsingState.can_end)r@   r   )r%   r&   r'   r   rw   r6   rS   r)   r   rN   rK   rR   rx   r   r   r=   r   r     s    
	r   c                       s   e Zd ZU ee ed< eed< eed< eed< ee ed< ee ed< ee ed< ee	 ed< 			
	
	
	
dde
dee dededee dee dee dee	 f fddZdddZdef fddZdefddZdefddZ  ZS )rL   rh   rM   rj   ri   rl   rm   r   rk   TNrz   r   r   c	           	         s   t  | || _d| _| | _|| _|| _|| _|| _|| _	| j	r,| js(| jr,t
d| j	r=| j	dr=| j	dd  | _	| j	rN| j	drN| j	d d | _	|| _| j	rw|sy| j	| jjjvrlt| j	| jj| jjj| j	< | jjj| j	 | _d S d S d S )NFz\String schema contains both a pattern and a min/max length, which is not currently supported^r	   $rA   )r5   r6   rh   rj   ri   r   r   rl   rm   r   r   
startswithendswithrk   rz   r,   r$   r   r1   )	r<   rz   rh   r   r   rl   rm   r   rk   r=   r   r   r6     s*   
zStringParsingState.__init__r@   c              	   C   sB   t | j| j| j| j| j| j| j| j}| j	|_	| j
|_
| j|_|S rC   )rL   rz   rh   r   r   rl   rm   r   rk   rM   rj   ri   r   r   r   r   rS   %  s   
zStringParsingState._cloner?   c                    s   | j r| jr|tv r| S ttt |} |dkr.| js#d| _d| _ nd| _| j d d | _ | jrB|dkrB| jrB| jsB| j|| _|t	krvdd t
D }tdd dD }ttd	g|gd
  }t|}t||g }| jjjj| | S )Nr3   Tr4   rA   c                 S   r   r   r   r^   r   r   r   r   D  r   z4StringParsingState.add_character.<locals>.<listcomp>c                 S   r   r   r   r^   r   r   r   r   E  r   0123456789abcdefABCDEFu   )rM   rj   r   r   rL   r5   rN   ri   rk   r   r   r   r   r   r   rz   r,   r"   r+   rQ   )r<   r?   escaping_character_parsershex_digit_parserunicode_componentsunicode_escape_parserjson_escaping_parserr=   r   r   rN   5  s&   z StringParsingState.add_characterc                    s   j sdt S  jrtS  jr) j }|ddtd} j r'|d7 }|S  jrd fdd jD }dd |D }t	t
|} j jv rQ jrQ|d  js_ j rZ js_|t d|S  jd urxt j jk rx jjjt S  jd urt j jkrdS  jjjt S )Nr3   r4   c                    s*   g | ]}|  jr|t jd  qS rC   )r   rM   rJ   )r   srf   r   r   r   Y  s    
z=StringParsingState.get_allowed_characters.<locals>.<listcomp>c                 S   s    g | ]}t |d kr|d  qS )r   )rJ   )r   allowed_continuationr   r   r   r   ^  s     )ri   r   rj   rk   rK   r:   r   rR   rh   r   r   rM   r   rQ   r   extendra   rl   rJ   rz   r,   r#   rm   r1   r9   )r<   regex_charsallowed_continuationsallowed_next_charactersr   rf   r   rK   L  s4   





z)StringParsingState.get_allowed_charactersc                 C   s(   | j r| jS | jr| j| jv S t| jS rC   )r   rj   rh   rM   rw   rf   r   r   r   rR   l  s
   
zStringParsingState.can_end)TNNNN)r@   rL   )r%   r&   r'   r   r)   r(   rw   r   ru   r   r   r6   rS   rN   rK   rR   rx   r   r   r=   r   rL     sF   
 	
" rL   c                	       s   e Zd ZU eed< dZeed< dZeed< dZe	ed< de
dedee	 d	ee	 f fd
dZdefddZdedd f fddZdefddZdefddZdd Z  ZS )rE   list_member_typeFseen_list_openerseen_list_closerr   rT   rz   	min_items	max_itemsc                    s^   t  | || _|| _|| _|jj}| jd u r)|dkr+|d u s$||k r-|| _d S d S d S d S )Nr   )r5   r6   r  r  r  r1   max_json_array_length)r<   rz   r  r  r  default_maxr=   r   r   r6   |  s   "
zListParsingState.__init__r@   c                 C   s:   t | j| j| j| j}| j|_| j|_| j|_| j|_|S rC   )	rE   rz   r  r  r  rM   rT   r  r  )r<   r   r   r   r   rS     s   zListParsingState._cloner?   c                    s   t tt |} |dkrJd| _t| j| j}| jd uo | jdk}|r&|}nt	dd}t
|tr9|j| |}nt||g}| jjjj| | S |dkrSd| _| S |dkro| jso|  jd7  _| jjjjt| j| j | S )N[Tr   )allow_whitespace]r   r	   )r   rE   r5   rN   r  r;   rz   r  r  r   r7   r   rP   rQ   r,   r"   r+   r  rT   )r<   r?   item_parserrequires_itemsparser_to_pushempty_list_parserr=   r   r   rN     s6   

zListParsingState.add_characterc                 C   s$   | j sdt S | js|  t S dS )Nr  r4   )r  r   r  get_allowed_control_charactersrf   r   r   r   rK     s
   z'ListParsingState.get_allowed_charactersc                 C   s   | j S rC   )r  rf   r   r   r   rR     r   zListParsingState.can_endc                 C   s   | j }| jjjjd }|| kpt|to| |jv }|s'| jjjjdkr'|d7 }d}| j	d u p2|| j	k}| j
d u p<|| j
k }|dkrG|rG|d7 }|rM|d7 }|S )NrA   r  r	   r4   r   r   r  )rT   rz   r,   r"   r+   r7   r   rP   r/   r  r  )r<   	num_items
top_parser	is_on_topcontrol_charactershas_enough_itemscan_add_another_itemr   r   r   r    s   z/ListParsingState.get_allowed_control_characters)r%   r&   r'   r
   r(   r  rw   r  rT   ru   r   r   r6   r   rS   r)   rN   rK   rR   r  rx   r   r   r=   r   rE   v  s&   
 rE   )+copyr   r   rn   typingr   r   r   r   r   r   external.jsonschemaobjectr
   r   
exceptionsr   characterlevelparserr   r   r   r   r   r   constsr   r   r   regexparserr   r   r8   r   ry   r   r;   Enumr   rD   r   r   r   rL   rE   r   r   r   r   <module>   s:       
a	 F}