o
    í6Wj7  ã                   @   sˆ  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	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 d dlmZ d dlmZmZmZmZ d d	lmZm Z m!Z!m"Z" e#e$ƒ ƒZ%ed
ge	e#ef f Z&eee
e eedf f Z'G dd„ de(ƒZ)G dd
„ d
eƒZ*G dd„ dƒZ+G dd„ dƒZ,G dd„ dƒZ-dddœdede#de.de	e#ee# f fdd„Z/dede#de.dee fdd „Z0dS )!é    N)ÚPath)ÚAbstractSetÚAnyÚCallableÚClassVarÚDictÚListÚMappingÚOptionalÚTupleÚTypeÚUnion)Ú
BaseConfigÚExtra)Ú
ModelField)Ú	BaseModel)ÚJsonWrapper)ÚStrPathÚdisplay_as_typeÚ
get_originÚis_union)Údeep_updateÚlenient_issubclassÚ	path_typeÚsequence_likeÚBaseSettings.c                   @   s   e Zd ZdS )ÚSettingsErrorN)Ú__name__Ú
__module__Ú__qualname__© r    r    úg/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/pydantic/v1/env_settings.pyr      s    r   c                       sÂ   e Zd ZU dZedddfdee dee dee dee de	ddf‡ fd	d
„Z
				ddeee	f dee dee dee dee deee	f fdd„ZG dd„ deƒZeee  ed< ‡  ZS )r   zü
    Base class for settings, allowing values to be overridden by environment variables.

    This is useful in production for secrets you do not wish to save in code, it plays nicely with docker(-compose),
    Heroku and any 12 factor app design.
    NÚ	_env_fileÚ_env_file_encodingÚ_env_nested_delimiterÚ_secrets_dirÚvaluesÚreturnc              
      s&   t ƒ jdi | j|||||d�¤Ž d S )N)r"   r#   r$   r%   r    )ÚsuperÚ__init__Ú_build_values)Ú__pydantic_self__r"   r#   r$   r%   r&   ©Ú	__class__r    r!   r)      s   
	û
ÿzBaseSettings.__init__Úinit_kwargsc           
         s˜   t |d�}t|tkr|nˆ jj|d ur|nˆ jj|d ur|nˆ jjtˆ jjƒd�}t	|p/ˆ jj
d�}ˆ jj|||d�}	|	rJtt‡ fdd„|	D ƒƒŽ S i S )N©r.   ©Úenv_fileÚenv_file_encodingÚenv_nested_delimiterÚenv_prefix_len©Úsecrets_dir)Úinit_settingsÚenv_settingsÚfile_secret_settingsc                    s   g | ]}|ˆ ƒ‘qS r    r    )Ú.0Úsource©Úselfr    r!   Ú
<listcomp>L   s    z.BaseSettings._build_values.<locals>.<listcomp>)ÚInitSettingsSourceÚEnvSettingsSourceÚenv_file_sentinelÚ
__config__r1   r2   r3   ÚlenÚ
env_prefixÚSecretsSettingsSourcer6   Úcustomise_sourcesr   Úreversed)
r=   r.   r"   r#   r$   r%   r7   r8   r9   Úsourcesr    r<   r!   r*   2   s   
	
ø
ÿzBaseSettings._build_valuesc                   @   sâ   e Zd ZU dZeed< dZee ed< dZ	ee ed< dZ
ee ed< dZee ed< dZeed	< ejZeed
< dZeed< dZeed< ededdfdd„ƒZededededeedf fdd„ƒZedededefdd„ƒZdS )zBaseSettings.ConfigÚ rD   Nr1   r2   r3   r6   TÚvalidate_allÚextraÚarbitrary_types_allowedFÚcase_sensitiveÚfieldr'   c                 C   sÊ   |   |j¡}| d¡p|jj d¡}|d u r'|jrt dt¡ | j	|j h}n)t
|tƒr0|h}n t
|ttfƒr:|}nt|ƒrCt|ƒ}ntd|›dt|ƒ› d�ƒ‚| js]| dd„ |D ƒ¡}||jjd< d S )	NÚenvzÑaliases are no longer used by BaseSettings to define which environment variables to read. Instead use the "env" field setting. See https://pydantic-docs.helpmanual.io/usage/settings/#environment-variable-nameszinvalid field env: z (z ); should be string, list or setc                 s   ó   � | ]}|  ¡ V  qd S ©N©Úlower)r:   Únr    r    r!   Ú	<genexpr>v   ó   € z4BaseSettings.Config.prepare_field.<locals>.<genexpr>Ú	env_names)Úget_field_infoÚnameÚgetÚ
field_inforK   Ú	has_aliasÚwarningsÚwarnÚFutureWarningrD   Ú
isinstanceÚstrÚsetÚ	frozensetr   ÚlistÚ	TypeErrorr   rM   r-   )ÚclsrN   Úfield_info_from_configrO   rW   r    r    r!   Úprepare_field]   s&   ü

z!BaseSettings.Config.prepare_fieldr7   r8   r9   .c                 C   s
   |||fS rQ   r    )rf   r7   r8   r9   r    r    r!   rF   y   s   
z%BaseSettings.Config.customise_sourcesÚ
field_nameÚraw_valc                 C   s
   |   |¡S rQ   )Ú
json_loads)rf   ri   rj   r    r    r!   Úparse_env_var‚   s   
z!BaseSettings.Config.parse_env_var)r   r   r   rD   ra   Ú__annotations__r1   r
   Ú
DotenvTyper2   r3   r6   r   rJ   Úboolr   ÚforbidrK   rL   rM   Úclassmethodr   rh   ÚSettingsSourceCallabler   rF   r   rl   r    r    r    r!   ÚConfigR   s0   
 þýü
ûrs   rB   )NNNN)r   r   r   Ú__doc__rA   r
   rn   ra   r   r   r)   r   r*   r   rs   r   r   rm   Ú__classcell__r    r    r,   r!   r      sL   
 	ûþýüûúùú
þýüûú

ù 5c                   @   sN   e Zd ZdZdeeef fdd„Zdedeeef fdd„Z	defd	d
„Z
dS )r?   r/   r.   c                 C   ó
   || _ d S rQ   r/   )r=   r.   r    r    r!   r)   �   ó   
zInitSettingsSource.__init__Úsettingsr'   c                 C   s   | j S rQ   r/   )r=   rx   r    r    r!   Ú__call__�   s   zInitSettingsSource.__call__c                 C   ó   d| j ›d�S )NzInitSettingsSource(init_kwargs=ú)r/   r<   r    r    r!   Ú__repr__“   ó   zInitSettingsSource.__repr__N)r   r   r   Ú	__slots__r   ra   r   r)   r   ry   r|   r    r    r    r!   r?   Š   s
    r?   c                	   @   sÆ   e Zd ZdZ		ddee dee dee defdd	„Zd
e	de
eef fdd„Zdede
eee f fdd„Zdedeeef fdd„Zdedeeee f de
eef fdd„Zdefdd„ZdS )r@   r0   Nr   r1   r2   r3   r4   c                 C   s   || _ || _|| _|| _d S rQ   r0   )r=   r1   r2   r3   r4   r    r    r!   r)   š   s   
zEnvSettingsSource.__init__rx   r'   c                 C   sN  i }|j jr
tj}n
dd„ tj ¡ D ƒ}|  |j j¡}|r#i |¥|¥}|j ¡ D ]|}d}|jj	d D ]}| 
|¡}|dur? nq2|  |¡\}}	|r›|du r[|  ||¡}
|
rZ|
||j< q(z
|j  |j|¡}W n ty‚ } z|	sxtd|› d�ƒ|‚W Y d}~nd}~ww t|tƒr•t||  ||¡ƒ||j< q(|||j< q(|dur¤|||j< q(|S )zP
        Build environment variables suitable for passing to the Model.
        c                 S   ó   i | ]	\}}|  ¡ |“qS r    rR   ©r:   ÚkÚvr    r    r!   Ú
<dictcomp>¯   ó    z.EnvSettingsSource.__call__.<locals>.<dictcomp>NrW   úerror parsing env var "ú")rB   rM   ÚosÚenvironÚitemsÚ_read_env_filesÚ
__fields__r&   r[   rK   rZ   Úfield_is_complexÚexplode_env_varsÚaliasrl   rY   Ú
ValueErrorr   r`   Údictr   )r=   rx   ÚdÚenv_varsÚdotenv_varsrN   Úenv_valÚenv_nameÚ
is_complexÚallow_parse_failureÚenv_val_builtÚer    r    r!   ry   ¦   sH   
ÿ
€ÿ€ÿ

€zEnvSettingsSource.__call__rM   c                 C   sd   | j }|d u r	i S t|ttjfƒr|g}i }|D ]}t|ƒ ¡ }| ¡ r/| t	|| j
|d�¡ q|S )N©ÚencodingrM   )r1   r`   ra   r‡   ÚPathLiker   Ú
expanduserÚis_fileÚupdateÚread_env_filer2   )r=   rM   Ú	env_filesr“   r1   Úenv_pathr    r    r!   rŠ   Õ   s   ÿ€z!EnvSettingsSource._read_env_filesrN   c                 C   s\   t |jtƒrdS | ¡ rd}d|fS tt|jƒƒr,|jr,tdd„ |jD ƒƒr,d}d|fS dS )za
        Find out if a field is complex, and if so whether JSON errors should be ignored
        )FFFc                 s   rP   rQ   )r–   )r:   Úfr    r    r!   rU   ð   rV   z5EnvSettingsSource.field_is_complex.<locals>.<genexpr>T)	r   Ú
annotationr   r–   r   r   Útype_Ú
sub_fieldsÚany)r=   rN   r—   r    r    r!   rŒ   ç   s   (ûþz"EnvSettingsSource.field_is_complexr’   c                    s�   ‡fdd„|j jd D ƒ}i }| ¡ D ]2\‰ }t‡ fdd„|D ƒƒs#qˆ ˆjd… }| ˆj¡�^}}}	|}
|D ]}|
 |i ¡}
q8||
|	< q|S )zÊ
        Process env_vars and extract the values of keys containing env_nested_delimiter into nested dictionaries.

        This is applied to a single field, hence filtering by env_var prefix.
        c                    s   g | ]	}|› ˆ j › �‘qS r    )r3   )r:   r•   r<   r    r!   r>   ý   r„   z6EnvSettingsSource.explode_env_vars.<locals>.<listcomp>rW   c                 3   s   � | ]}ˆ   |¡V  qd S rQ   )Ú
startswith)r:   Úprefix)r•   r    r!   rU      s   € z5EnvSettingsSource.explode_env_vars.<locals>.<genexpr>N)r[   rK   r‰   r§   r4   Úsplitr3   Ú
setdefault)r=   rN   r’   ÚprefixesÚresultr”   Úenv_name_without_prefixÚ_ÚkeysÚlast_keyÚenv_varÚkeyr    )r•   r=   r!   r�   ÷   s   
z"EnvSettingsSource.explode_env_varsc                 C   s   d| j ›d| j›d| j›d�S )NzEnvSettingsSource(env_file=z, env_file_encoding=z, env_nested_delimiter=r{   )r1   r2   r3   r<   r    r    r!   r|     s   ÿÿzEnvSettingsSource.__repr__)Nr   )r   r   r   r~   r
   rn   ra   Úintr)   r   r   r   ry   ro   rŠ   r   r   rŒ   r	   r�   r|   r    r    r    r!   r@   —   s$    ûþýü
û/*r@   c                   @   sJ   e Zd ZdZdee fdd„Zdedee	e
f fdd„Zde	fd	d
„ZdS )rE   r5   r6   c                 C   rv   rQ   r5   )r=   r6   r    r    r!   r)     rw   zSecretsSettingsSource.__init__rx   r'   c           	      C   s  i }| j du r	|S t| j ƒ ¡ }| ¡ st d|› d�¡ |S | ¡ s,tdt|ƒ› �ƒ‚|j	 
¡ D ]Z}|jjd D ]Q}t|||jjƒ}|sFq9| ¡ rz| ¡  ¡ }| ¡ rtz
|j |j|¡}W n tys } z	td|› d�ƒ|‚d}~ww |||j< q9tjd|› d	t|ƒ› d
�dd� q9q1|S )z4
        Build fields from "secrets" files.
        Nzdirectory "z" does not existz.secrets_dir must reference a directory, not a rW   r…   r†   zattempted to load secret file "z" but found a z	 instead.é   )Ú
stacklevel)r6   r   r�   Úexistsr]   r^   Úis_dirr   r   r‹   r&   r[   rK   Úfind_case_pathrB   rM   rž   Ú	read_textÚstripr–   rl   rY   r�   rŽ   )	r=   rx   ÚsecretsÚsecrets_pathrN   r•   ÚpathÚsecret_valuer™   r    r    r!   ry     s<   
€ÿþðzSecretsSettingsSource.__call__c                 C   rz   )Nz"SecretsSettingsSource(secrets_dir=r{   r5   r<   r    r    r!   r|   B  r}   zSecretsSettingsSource.__repr__N)r   r   r   r~   r
   r   r)   r   r   ra   r   ry   r|   r    r    r    r!   rE     s
    )rE   Frš   Ú	file_pathr›   rM   r'   c             
   C   s^   zddl m} W n ty } ztdƒ|‚d }~ww || |pdd�}|s-dd„ | ¡ D ƒS |S )Nr   )Údotenv_valueszBpython-dotenv is not installed, run `pip install pydantic[dotenv]`Úutf8)r›   c                 S   r   r    rR   r€   r    r    r!   rƒ   P  r„   z!read_env_file.<locals>.<dictcomp>)ÚdotenvrÁ   ÚImportErrorr‰   )rÀ   r›   rM   rÁ   r™   Ú	file_varsr    r    r!   r    F  s   
€ÿr    Údir_pathÚ	file_namec                 C   sB   |   ¡ D ]}|j|kr|  S |s|j ¡ | ¡ kr|  S qdS )zZ
    Find a file within path's directory matching filename, optionally ignoring case.
    N)ÚiterdirrY   rS   )rÆ   rÇ   rM   r£   r    r    r!   r¹   U  s   
€r¹   )1r‡   r]   Úpathlibr   Útypingr   r   r   r   r   r   r	   r
   r   r   r   Úpydantic.v1.configr   r   Úpydantic.v1.fieldsr   Úpydantic.v1.mainr   Úpydantic.v1.typesr   Úpydantic.v1.typingr   r   r   r   Úpydantic.v1.utilsr   r   r   r   ra   ÚobjectrA   rr   rn   r�   r   r   r?   r@   rE   ro   r    r¹   r    r    r    r!   Ú<module>   s:    4
s|4ÿÿÿÿ
þ"