
    bi&                        d dl mZ d dlZd dl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	d
lmZ e
rd dlma d dlma d dlma d dlmZ ndadadaddZ G d deeedz  f         Z G d de      ZddgZy)    )annotationsN)IteratorMapping)cached_property)TYPE_CHECKINGAny)	FieldInfo   )SecretVersion   )EnvSettingsSourcedefaultCredentialsSecretManagerServiceClient)BaseSettingsc                     	 ddl ma ddlma t        j                         5  t        j                  dt               ddl	m
a
 d d d        y # 1 sw Y   y xY w# t        $ r} t        d      | d } ~ ww xY w)Nr   r   r   ignore)categoryr   zjGCP Secret Manager dependencies are not installed, run `pip install pydantic-settings[gcp-secret-manager]`)google.authr   google_auth_defaultgoogle.auth.credentialsr   warningscatch_warningsfilterwarningsFutureWarninggoogle.cloud.secretmanagerr   ImportError)es    o/home/jang/Projects/ai-researcher/.venv/lib/python3.12/site-packages/pydantic_settings/sources/providers/gcp.pyimport_gcp_secret_managerr#      si    

>7$$& 	N##H}EM	N 	N 	N  x
	s4    A "AA AA A 	A3"A..A3c                      e Zd ZU ded<   ded<   ddZedd       ZddZedd       Z	edd	       Z
ddd
ZdddZddZddZddZy)GoogleSecretManagerMappingzdict[str, str | None]_loaded_secretsr   _secret_clientc                <    i | _         || _        || _        || _        y N)r&   r'   _project_id_case_sensitive)selfsecret_client
project_idcase_sensitives       r"   __init__z#GoogleSecretManagerMapping.__init__/   s"    !+%-    c                L    | j                   j                  | j                        S r)   )r'   common_project_pathr*   r,   s    r"   _gcp_project_pathz,GoogleSecretManagerMapping._gcp_project_path5   s    ""66t7G7GHHr1   c           	         t        |      dk(  r|d   S |j                          |d   }t        j                  d| d| d| dt        d	       |S )
Nr   r   z)Secret collision: Found multiple secrets z normalizing to 'z
'. Using 'z' for case-insensitive lookup.r
   )
stacklevel)lensortr   warnUserWarning)r,   
lower_name
candidateswinners       r"   _select_case_insensitive_secretz:GoogleSecretManagerMapping._select_case_insensitive_secret9   si    z?aa=  	B7
|CTU_T` aX;=		
 r1   c                   i }i }| j                   j                  | j                        }|D ]v  }| j                   j                  |j                        j                  dd      }|||<   | j                  rJ|j                         }||vrg ||<   ||   j                  |       x | j                  s-|j                         D ]  \  }}| j                  ||      ||<    |S )N)parentsecret )r'   list_secretsr5   parse_secret_pathnamegetr+   lowerappenditemsr@   )r,   mappingnormalized_groupssecretsrC   rG   r=   r>   s           r"   _secret_name_mapz+GoogleSecretManagerMapping._secret_name_mapH   s    "$24%%22$:P:P2Q 	;F&&88EII(TVWD GDM''!ZZ\
%6646%j1!*-44T:	; ##*;*A*A*C c&
J&*&J&J:Wa&b
#c r1   c                H    t        | j                  j                               S r)   )listrO   keysr4   s    r"   _secret_namesz(GoogleSecretManagerMapping._secret_names_   s    D))..011r1   c                P    | j                   j                  | j                  ||      S r)   )r'   secret_version_pathr*   )r,   keyversions      r"   _secret_version_pathz/GoogleSecretManagerMapping._secret_version_pathc   s#    ""66t7G7GgVVr1   c                    	 | j                   j                  | j                  ||            j                  j                  j                  d      S # t        $ r Y y w xY w)N)rG   zUTF-8)r'   access_secret_versionrX   payloaddatadecode	Exception)r,   gcp_secret_namerW   s      r"   _get_secret_valuez,GoogleSecretManagerMapping._get_secret_valuef   sZ    	&&<<..H = gdd66'?+  		s   AA 	AAc                V   || j                   v r| j                   |   S | j                  j                  |      }|5| j                  s)| j                  j                  |j	                               }|r| j                  |      | j                   |<   nt        |      | j                   |   S r)   )r&   rO   rH   r+   rI   r`   KeyError)r,   rV   r_   s      r"   __getitem__z&GoogleSecretManagerMapping.__getitem__n   s    $&&&'',,//33C8"4+?+?"3377		DO(,(>(>(OD  %3-##C((r1   c                ,    t        | j                        S r)   )r9   rS   r4   s    r"   __len__z"GoogleSecretManagerMapping.__len__}   s    4%%&&r1   c                ,    t        | j                        S r)   )iterrS   r4   s    r"   __iter__z#GoogleSecretManagerMapping.__iter__   s    D&&''r1   N)r-   r   r.   strr/   boolreturnNonerk   ri   )r=   ri   r>   	list[str]rk   ri   )rk   zdict[str, str])rk   rn   )latest)rV   ri   rW   ri   rk   ri   )r_   ri   rW   ri   rk   
str | None)rV   ri   rk   rp   )rk   int)rk   zIterator[str])__name__
__module____qualname____annotations__r0   propertyr5   r@   r   rO   rS   rX   r`   rc   re   rh    r1   r"   r%   r%   +   sp    **... I I  , 2 2W)'(r1   r%   c                       e Zd ZU ded<   ded<   ded<   	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZd fdZdd	Zdd
Z xZS )!GoogleSecretManagerSettingsSourcer   _credentialsr   r'   ri   r*   c	                8   t         t        t        
t                |r|st               \  }	}
|	}|t	        
t
              r|
}nt        d      || _        || _        |r|| _	        nt        | j                        | _	        t        | -  |||d||       y )Nzproject_id is required to be specified either as an argument or from the google.auth.default. See https://google-auth.readthedocs.io/en/master/reference/google.auth.html#google.auth.default)credentialsF)r/   
env_prefixenv_ignore_emptyenv_parse_none_strenv_parse_enums)r   r   r   r#   
isinstanceri   AttributeErrorrz   r*   r'   superr0   )r,   settings_clsr|   r.   r}   r   r   r-   r/   _credsr*   	__class__s              r"   r0   z*GoogleSecretManagerSettingsSource.__init__   s     &-1DH[Hc%' *"5"7FK  K+s+(
$ T  *5 *"/D"<IZIZ"[D)!"1+ 	 	
r1   c                   t        d |j                  D        d      }|rt        | j                  t              r| j                  ||      D ]  \  }}}| j                  j                  j                  |      }|?| j                  s3| j                  j                  j                  |j                               }|sp| j                  j                  ||      }|| j                  j                  j                  d      r|||fc S |||fc S  d|dfS t        | 9  ||      \  }	}
}| j                  j                  j                  d      r|	|	||fS |	|
|fS )a  Override get_field_value to get the secret value from GCP Secret Manager.
        Look for a SecretVersion metadata field to specify a particular SecretVersion.

        Args:
            field: The field to get the value for
            field_name: The declared name of the field

        Returns:
            A tuple of (value, key, value_is_complex), where `key` is the identifier used
            to populate the model (either the field name or an alias, depending on
            configuration).
        c              3  V   K   | ]!  }t        |t              s|j                   # y wr)   )r   r   rW   ).0ms     r"   	<genexpr>zDGoogleSecretManagerSettingsSource.get_field_value.<locals>.<genexpr>   s     aQJqR_D`qyyas   ))Npopulate_by_nameF)nextmetadatar   env_varsr%   _extract_field_inforO   rH   r/   rI   r`   r   model_configr   get_field_value)r,   field
field_namesecret_version	field_keyenv_namevalue_is_complexr_   env_valvalrV   
is_complexr   s               r"   r   z1GoogleSecretManagerSettingsSource.get_field_value   sZ    a%..acgh
 j8RS9=9Q9QRWYc9d D5	8%5"&--"@"@"D"DX"N"*43F3F&*mm&D&D&H&HIY&ZO""mm==o~^G*  ,,99==>PQ#*J8H#HH&	3CCCD  U**$w6ujIS* ))--.@Aco
J..C##r1   c                Z    t        | j                  | j                  | j                        S )N)r.   r/   )r%   r'   r*   r/   r4   s    r"   _load_env_varsz0GoogleSecretManagerSettingsSource._load_env_vars   s(    )D,<,<TM`M`
 	
r1   c                h    | j                   j                   d| j                  d| j                  dS )Nz(project_id=z, env_nested_delimiter=))r   rr   r*   env_nested_delimiterr4   s    r"   __repr__z*GoogleSecretManagerSettingsSource.__repr__   s=    ..))*,t7G7G6JJabfb{b{a~~  A  	Ar1   )NNNNNNT)r   ztype[BaseSettings]r|   zCredentials | Noner.   rp   r}   rp   r   rp   r   bool | Noner-   z!SecretManagerServiceClient | Noner/   r   rk   rl   )r   r	   r   ri   rk   ztuple[Any, str, bool])rk   zMapping[str, str | None]rm   )	rr   rs   rt   ru   r0   r   r   r   __classcell__)r   s   @r"   ry   ry      s    ..
 +/!%!%)-'+;?&*/
(/
 (/
 	/

 /
 '/
 %/
 9/
 $/
 
/
b,$\

Ar1   ry   )rk   rl   ) 
__future__r   _annotationsr   collections.abcr   r   	functoolsr   typingr   r   pydantic.fieldsr	   typesr   envr   r   r   r   r   r   r   r   pydantic_settings.mainr   r#   ri   r%   ry   __all__rw   r1   r"   <module>r      s}    2  - % % % ! ":3E3K!%$V(cDj!9 V(rjA(9 jAZ /0L
Mr1   