U nf7@s|ddlZddlZddlmZddlmZmZmZmZm Z m Z m Z m Z m Z mZmZddlmZmZddlmZddlmZddlmZddlmZmZmZmZdd lmZm Z m!Z!m"Z"e#e$Z%ed ge e#effZ&eee ee ed ffZ'Gd d d e(Z)Gdd d eZ*GdddZ+GdddZ,GdddZ-dddee#e.e e#e e#fdddZ/ee#e.e edddZ0dS)N)Path) AbstractSetAnyCallableClassVarDictListMappingOptionalTupleTypeUnion) BaseConfigExtra) ModelField) BaseModel) JsonWrapper)StrPathdisplay_as_type get_originis_union) deep_updatelenient_issubclass path_type sequence_like BaseSettings.c@s eZdZdS) SettingsErrorN)__name__ __module__ __qualname__r r F/opt/hc_python/lib/python3.8/site-packages/pydantic/v1/env_settings.pyrsrc seZdZUdZedddfeeeeeeeee ddfdd Z d e ee feeeeeeeee ee fdddZ Gd d d e Zeeeed <ZS) rz 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_dirvaluesreturnc s"tjf|j|||||ddS)N)r"r#r$r%)super__init__ _build_values)Z__pydantic_self__r"r#r$r%r& __class__r r!r)s zBaseSettings.__init__) init_kwargsr"r#r$r%r'c st|d}t|tkr|njj|dk r*|njj|dk r<|njjtjjd}t |p^jj d}jj |||d} | rt t fdd| DSiSdS)Nr-env_fileenv_file_encodingenv_nested_delimiterenv_prefix_len secrets_dir) init_settings env_settingsfile_secret_settingscsg|] }|qSr r ).0sourceselfr r! Lsz.BaseSettings._build_values..)InitSettingsSourceEnvSettingsSourceenv_file_sentinel __config__r0r1r2len env_prefixSecretsSettingsSourcer5customise_sourcesrreversed) r<r-r"r#r$r%r6r7r8sourcesr r;r!r*2s   zBaseSettings._build_valuesc@seZdZUdZeed<dZeeed<dZ eeed<dZ eeed<dZ ee ed<dZ eed <ejZeed <dZeed <d Zeed <eeddddZeeeeeedfdddZeeeedddZdS)zBaseSettings.ConfigrCNr0r1r2r5T validate_allextraarbitrary_types_allowedFcase_sensitivefieldr'cCs||j}|dp"|jjd}|dkrN|jr>tdt|j |jh}nRt |t r`|h}n@t |t t frt|}n,t|rt|}ntd|dt|d|js|dd|D}||jjd<dS) Nenvzaliases 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-nameszinvalid field env: z (z ); should be string, list or setcss|]}|VqdSNlower)r9nr r r! vsz4BaseSettings.Config.prepare_field.. env_names)Zget_field_infonameget field_inforJZ has_aliaswarningswarn FutureWarningrC isinstancestrset frozensetrlist TypeErrorrrLr,)clsrNZfield_info_from_configrOrUr r r! prepare_field]s&   z!BaseSettings.Config.prepare_field.)r6r7r8r'cCs |||fSrPr )rbr6r7r8r r r!rEysz%BaseSettings.Config.customise_sources) field_nameraw_valr'cCs ||SrP)Z json_loads)rbrdrer r r! parse_env_varsz!BaseSettings.Config.parse_env_var)rrrrCr]__annotations__r0r DotenvTyper1r2r5rrIboolrZforbidrJrKrL classmethodrrcSettingsSourceCallabler rErrfr r r r!ConfigRs&      rlrA)NNNN)rrr__doc__r@r rhr]rrr)rr*rrlrr rg __classcell__r r r+r!rs6    5c@sLeZdZdZeeefdddZeeeefdddZ eddd Z d S) r>r.cCs ||_dSrPr.)r<r-r r r!r)szInitSettingsSource.__init__settingsr'cCs|jSrPr.)r<rpr r r!__call__szInitSettingsSource.__call__r'cCsd|jdS)NzInitSettingsSource(init_kwargs=)r.r;r r r!__repr__szInitSettingsSource.__repr__N) rrr __slots__rr]rr)rrqrtr r r r!r>sr>c@seZdZdZdeeeeeeedddZe e ee fdddZ e e eeefd d d Zeee e fd d dZeeeeefe ee fdddZedddZdS)r?r/NrcCs||_||_||_||_dSrPr/)r<r0r1r2r3r r r!r)szEnvSettingsSource.__init__roc CsNi}|jjrtj}nddtjD}||jj}|rB||}|jD]}d}|jj dD]}| |}|dk r`q|q`| |\}} |r6|dkr| ||} | r| ||j <nz|j|j|}Wn:tk r} z| std|d| W5d} ~ XYnXt|tr*t|| ||||j <n |||j <qL|dk rL|||j <qL|S)zP Build environment variables suitable for passing to the Model. cSsi|]\}}||qSr rQr9kvr r r! sz.EnvSettingsSource.__call__..NrUerror parsing env var "")rArLosenvironitems_read_env_files __fields__r&rXrJrWfield_is_complexexplode_env_varsaliasrfrV ValueErrorrr\dictr) r<rpdenv_vars dotenv_varsrNenv_valenv_name is_complexallow_parse_failureZ env_val_builter r r!rqs<   $   zEnvSettingsSource.__call__)rLr'cCsd|j}|dkriSt|ttjfr(|g}i}|D].}t|}|r0|t ||j |dq0|S)NencodingrL) r0r\r]r|PathLiker expanduseris_fileupdate read_env_filer1)r<rLZ env_filesrr0Zenv_pathr r r!rs z!EnvSettingsSource._read_env_filesrMcCsXt|jtrdS|rd}n2tt|jrL|jrLtdd|jDrLd}ndSd|fS)za Find out if a field is complex, and if so whether JSON errors should be ignored )FFFcss|]}|VqdSrP)r)r9fr r r!rTsz5EnvSettingsSource.field_is_complex..T) r annotationrrrrtype_Z sub_fieldsany)r<rNrr r r!rs (z"EnvSettingsSource.field_is_complex)rNrr'c sfdd|jjdD}i}|D]d\}tfdd|DsFq&jd}|j^}}} |} |D]} | | i} qp|| | <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. csg|]}|jqSr )r2)r9rr;r r!r=sz6EnvSettingsSource.explode_env_vars..rUc3s|]}|VqdSrP) startswith)r9prefix)rr r!rTsz5EnvSettingsSource.explode_env_vars..N)rXrJr~rr3splitr2 setdefault) r<rNrprefixesresultrZenv_name_without_prefix_keyslast_keyenv_varkeyr )rr<r!rs z"EnvSettingsSource.explode_env_varsrrcCsd|jd|jd|jdS)NzEnvSettingsSource(env_file=z, env_file_encoding=z, env_nested_delimiter=rs)r0r1r2r;r r r!rt szEnvSettingsSource.__repr__)Nr)rrrrur rhr]intr)rrrrqrirrr rr rrtr r r r!r?s /&r?c@sHeZdZdZeedddZeee e fdddZ e ddd Z d S) rDr4cCs ||_dSrPr4)r<r5r r r!r)szSecretsSettingsSource.__init__roc Cs&i}|jdkr|St|j}|s>td|d|S|sXtdt||j D]}|j j dD]}t |||jj}|sqr|r|}|rz|j|j|}Wn4tk r}ztd|d|W5d}~XYnX|||j<qrtjd|d t|d d d qrqb|S) z4 Build fields from "secrets" files. Nz directory "z" does not existz.secrets_dir must reference a directory, not a rUrzr{zattempted to load secret file "z" but found a z instead.) stacklevel)r5rrexistsrYrZis_dirrrrr&rXrJfind_case_pathrArLr read_textstriprrfrVrr) r<rpZsecretsZ secrets_pathrNrpathZ secret_valuerr r r!rqs6  $  zSecretsSettingsSource.__call__rrcCsd|jdS)Nz"SecretsSettingsSource(secrets_dir=rsr4r;r r r!rtBszSecretsSettingsSource.__repr__N) rrrrur rr)rrr]rrqrtr r r r!rDs)rDFr) file_pathrrLr'c Cslzddlm}Wn,tk r<}ztd|W5d}~XYnX|||pHdd}|sddd|DS|SdS)Nr) dotenv_valueszBpython-dotenv is not installed, run `pip install pydantic[dotenv]`utf8)rcSsi|]\}}||qSr rQrvr r r!ryPsz!read_env_file..)Zdotenvr ImportErrorr~)rrrLrrZ file_varsr r r!rFsr)dir_path file_namerLr'cCsB|D]4}|j|kr|S|s|j|kr|SqdS)zZ Find a file within path's directory matching filename, optionally ignoring case. N)iterdirrVrR)rrrLrr r r!rUs    r)1r|rYpathlibrtypingrrrrrrr r r r r Zpydantic.v1.configrrZpydantic.v1.fieldsrZpydantic.v1.mainrZpydantic.v1.typesrZpydantic.v1.typingrrrrZpydantic.v1.utilsrrrrr]objectr@rkrhrrrr>r?rDrirrr r r r!s4 4    s |4