fL ilVddlZddlmZmZmZmZmZmZmZm Z ddl m Z m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZddlmZddlmZmZddlm Z m!Z!e r?ddl"a"ddl#m$Z$ddl%m&Z&dd l'm(Z(dd l)m*Z*ee*ddfZ+Gd d e$d Z,Gdde$d Z-n da"Gdd e.Z,ee/e0e1eee/e0e1fee/e1fffZ2gdZ3da4da5da6da7da8dZ9dZ:dZ;dZdee/fdZ?dee/fdZ@dee/fdZAdee/fdZBdee/fdZCGdd e/ZDGd!d"eDZEGd#d$eEZFGd%d&eDZGGd'd(eDZHGd)d*eHZIGd+d,eDZJGd-d.eDZKGd/d0eDZLGd1d2eDZMGd3d4eDZNd5d6d7d5d5dd8d9eOd:e1d;e1dee e/deeDfd?ZPdOd@ZQGdAdBe/ZRGdCdDeZSGdEdFeZTGdGdHeZUGdIdJe ZVejdKZXdLZY dMee/dee/e/ffdNZZy)PN) IPv4Address IPv4Interface IPv4Network IPv6Address IPv6Interface IPv6Network _BaseAddress _BaseNetwork) TYPE_CHECKINGAny CollectionDict GeneratorListMatchOptionalPatternSetTupleTypeUnioncast no_type_check)errors)Representationupdate_not_none)constr_length_validator str_validator) TypedDict) BaseConfig) ModelField) AnyCallableceZdZUeed<eeed<eeed<eeed<eeed<eeed<eeed<eeed<eeed <eeed <y ) Partsschemeuserpasswordipv4ipv6domainportpathqueryfragmentN)__name__ __module__ __qualname__str__annotations__rZ/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/pydantic/v1/networks.pyr$r$,sa sm3-smsm smsm}3-r5r$F)totalcReZdZUeed<eeed<eeed<eeed<eed<y) HostPartshosttld host_typer+rebuildN)r/r0r1r2r3rboolr4r5r6r9r98s* c]C= sm r5r9c eZdZy)r$N)r/r0r1r4r5r6r$r$Bs r5)AnyUrl AnyHttpUrlFileUrlHttpUrl stricturlEmailStr NameEmail IPvAnyAddressIPvAnyInterface IPvAnyNetwork PostgresDsn CockroachDsnAmqpDsnRedisDsnMongoDsnKafkaDsnvalidate_emailz(?:(?P(?:\d{1,3}\.){3}\d{1,3})(?=$|[/:#?])|(?P\[[A-F0-9]*:[A-F0-9:]+\])(?=$|[/:#?])|(?P[^\s/:?#]+))?(?::(?P\d+))?z&(?:(?P[a-z][a-z0-9+\-.]+)://)?z3(?:(?P[^\s:/]*)(?::(?P[^\s/]*))?@)?z(?P/[^\s?#]*)?z(?:\?(?P[^\s#]*))?z(?:#(?P[^\s#]*))?returnctHtjttt t tttjatSN) _url_regex_cacherecompile _scheme_regex_user_info_regex _host_regex _path_regex _query_regex_fragment_regex IGNORECASEr4r5r6 url_regexr^qsF::/0 k]<.YhXi j MM  r5ctCtjttdt t ttjatS)z Compiled multi host url regex. Additionally to `url_regex` it allows to match multiple hosts. E.g. host1.db.net,host2.db.net z(?P([^/]*))) _multi_host_url_regex_cacherUrVrWrXrZr[r\r]r4r5r6multi_host_url_regexra{sK#*&(jj/0 !}\N?*; = MM ' # '&r5czt0d}d}tjd|d||tjatS)Nz'[_0-9a-z](?:[-_0-9a-z]{0,61}[_0-9a-z])?z(?P\.[a-z]{2,63})?\.?(?:\.)*?)_ascii_domain_regex_cacherUrVr]) ascii_chunkascii_domain_endings r6ascii_domain_regexrhsF (@ ;$&JJ;-u[M2E1F G% ! %$r5czt0d}d}tjd|d||tjatS)NzB[_0-9a-\U00040000](?:[-_0-9a-\U00040000]{0,61}[_0-9a-\U00040000])?z<(?P(\.[^\W\d_]{2,63})|(\.(?:xn--)[_0-9a-z-]{2,63}))?\.?rcrd)_int_domain_regex_cacherUrVr]) int_chunkint_domain_endings r6int_domain_regexrmsD&Y ["$**I;eI;O`Na-bdfdqdq"r ""r5cjt(tjttjatSrS)_host_regex_cacherUrVrYr]r4r5r6 host_regexrps) JJ  MM  r5ceZdZUdZdZdZdZeee e d<dZ e e d<dZ e e d<dZe e d <eZee e d <d Zed ee d efdZdddddddddd d e de dee dee dee dee de dee dee dee dee d dfdZedddddddde dee dee de dee dee dee dee de d e fdZedee efd dfd Zed4d!Zed"ed#d$d%d&d dfd'Zed(ee d e d)d*d dfd+Ze d e d eee fd,Z!e dee d dfd-Z"ed5d)d*d.e d d*fd/Z#ed)d*d e$e ee e e ffd0Z%e d6d1Z&ed6d2Z'd e ffd3 Z(xZ)S)7r@TNallowed_schemesF tld_required user_required host_required hidden_parts r%r&r'r:r;r<r+r,r-r.urlrQc ^tj|||jdi|S|S)Nr4)r2__new__build)clsrzkwargss r6r|zAnyUrl.__new__s-{{3s{  3F 3LLLLr5r*) r&r'r:r;r<r+r,r-r.r%r&r'r:r;r<r+r,r-r.c tj|||_||_||_||_||_||_||_| |_ | |_ | |_ yrS) r2__init__r%r&r'r:r;r<r+r,r-r.) selfrzr%r&r'r:r;r<r+r,r-r.s r6rzAnyUrl.__init__sV S     "     r5)r&r'r+r,r-r._kwargsc "td||||||||d| } |dz} |r| |z } |r| d|zz } |s|r| dz } | |z } |r9d|jvs#|j| jd|k7r| d|zz } |r| |z } |r| d|zz } |r| d|zz } | S) N)r%r&r'r:r+r,r-r.z://:@r+?#r4)r$rxget_default_partsget) r~r%r&r'r:r+r,r-r.rpartsrzs r6r}z AnyUrl.builds      un  4KC  3> !C 8 3JC t  V3#3#33s7L7LU7S7W7WX^7_cg7g 3: C  4KC  3; C  3> !C r5 field_schemacJt||j|jdy)Nuri) minLength maxLengthformat)r min_length max_lengthr~rs r6__modify_schema__zAnyUrl.__modify_schema__s #..afgr5c#(K|jywrSvalidater~s r6__get_validators__zAnyUrl.__get_validators__llvaluefieldr!configr c|j|k(r|St|}|jr|j}t t t |||}|j|}|sJdt d|j}|j|}|j|}|jt|k7r'tj||jd|j|||S)NzURL regex failed unexpectedlyr$)extra) __class__rstrip_whitespacestriprr2r _match_url groupdictapply_default_partsvalidate_partsendlenr UrlExtraError _build_url)r~rrrrzmoriginal_partsrs r6rzAnyUrl.validate s ??c !Le$   KKME4UE6JK NN3 111qgq{{}5''7""5) 557c#h &&S^< <~~ae,,r5rrr$c|j|\}}}}||rdn||d|d|d||||d|d|d|d S) z Validate hosts and build the AnyUrl object. Split from `validate` so this method can be altered in `MultiHostDsn`. Nr%r&r'r+r,r-r.ry) validate_host)r~rrzrr:r;r<r=s r6rzAnyUrl._build_url sm ),(9(9%(@%c9gD?v:&vv.:&  r5c4tj|SrS)r^matchrzs r6rzAnyUrl._match_url6s{  %%r5cN|#t|dkDrtjyy)Ni)intr UrlPortError)r+s r6_validate_portzAnyUrl._validate_port:s*  D F 2%%' '!3 r5 validate_portcV|d}|tj|jrD|j|jvr(tjt |j|r|j |d|d}|jr|tj|S)z A method used to validate parts of a URL. Could be overridden to set default values for parts if missing r%r+r&) rUrlSchemeErrorrtlowerUrlSchemePermittedErrorsetrrvUrlUserInfoError)r~rrr%r&s r6rzAnyUrl.validate_parts?s x >'') )   6<<>9L9L#L00S5H5H1IJ J    uV} -V}   ))+ + r5cd\}}}dD] }||}|s |}n!|jrtj|dk(rd}tj |}|1t j |}|tjd}|j d}|2|s0t j |}|J|j d}d}||dd}n |jrtj|rFd}d}|jd jd }| |jd jd }||||fS) N)NNF)r*r(r)r*FTr;rr int_domainidnaascii) rwr UrlHostErrorrh fullmatchrmgroupruUrlHostTldErrorencodedecode) r~rr;r<r=fr:is_internationalds r6rzAnyUrl.validate_hostUsc"3Y+ A8D    <  ))++ ( "$ "$..t4Ay$&0069 --//#' ''%.C{#3$&006}$}ggen#' !"g!!,,..( {{6*11':?**V,33G #JC:"c  # r5cdjfdjD}jjdtd|dS)Nz, c3ZK|]"}t||dt|$yw)N=)getattr).0nrs r6 z"AnyUrl.__repr__..s3n!QXY]_`QaQmQCqq!1 45ns++())join __slots__rr/super__repr__)rrrs` r6rzAnyUrl.__repr__sH nt~~nn..))*!EG,<,>+?r%JJr5rQCallableGeneratorTrr$rQr$)*r/r0r1rrrrtrr r2r3rur>rvrwrrxrrrobjectr|r classmethodr}rr rrrrr staticmethodrrrrrrrr __classcell__rs@r6r@r@spJJ15OXjo.5L$M4M4 UL#c("oIM(3-MfMM#"&"!!""#"&! ! ! sm ! 3- !sm!c]!!sm!sm!}!3-! !6 #"&""#"&))sm ) 3- )  )sm)sm)})3-)) ))VhT#s(^hhh-S--|-PX--* 5: C  H  *&&s 4&&(Xc](t((747*'-''-eC#T4Q.R'-'-R K#KKr5r@ceZdZddhZdZy)rAhttphttpsr4N)r/r0r1rtrr4r5r6rArAsw'OIr5rAc,eZdZdZdZdhZeddZy)rCTi#r+c d|ddk(rdiSdiS)Nr+r%r80443r4rs r6rzHttpUrl.get_default_partss h6 9EEuEEr5Nr)r/r0r1rurrxrrr4r5r6rCrCs'LJ8LFFr5rCceZdZdhZdZdZy)rBfileFr4N)r/r0r1rtrwrr4r5r6rBrBshOMIr5rBc eZdZejdzZdddedeeddeffdZe de d ee e fd Z e dd d d ed d ffd Ze de e de d d d dfdZxZS) MultiHostDsn)hostsNargsrr9rc2t||i|||_yrS)rrr)rrrrrs r6rzMultiHostDsn.__init__s $)&) r5rzrQc4tj|SrS)rarrs r6rzMultiHostDsn._match_urls#%++C00r5rr$rc&t||dS)NF)r)rr)r~rrrs r6rzMultiHostDsn.validate_partssw%e5%AAr5rc~g}t}|jdjdD]p}|j|j}|j |\}}} } |j d} |j | |j|| || | drt|dkDrA|t|D cgc]} | d c} rdn||d|d|d |d |d |d d| S|d} || drdn||d|d|d | d| d| d| j d|d |d |d  Scc} w)Nr,r+)r:r<r;r=r+rrr=r%r&r'r,r-r.)r%r&r'r,r-r.r<rrr:r;r<ry) rprsplitrrrrappendrany)r~rrzr hosts_partshost_rer:rr;r<r=r+hp host_parts r6rzMultiHostDsn._build_urls)+ ,KKM'*005 D}}T*446A,/,=,=a,@ )D#y'55=D   t $    !*&    { a [ArR ]ABX6]z*6]Gnz*!  $AI!),#X6]z*v&e$#K0]]6*6]Gnz*  Bs; D: r)r/r0r1r@rr rrrrr2rrrr>rrrrs@r6rrs  :-IHLc(4 3D*EX[11s 411B7B4B7BB-5:-C--N--r5rceZdZhdZdZdZy)rJ> postgresql+pg8000postgresql+asyncpgpostgresql+psycopgpostgresql+psycopg2postgresql+pygresqlpostgresql+psycopg2cffipostgresql+py-postgresqlpostgres postgresqlTr4N)r/r0r1rtrvrr4r5r6rJrJs OMIr5rJceZdZhdZdZy)rK>cockroachdb+asyncpgcockroachdb+psycopg2 cockroachdbTN)r/r0r1rtrvr4r5r6rKrKsO Mr5rKceZdZddhZdZy)rLamqpamqpsFN)r/r0r1rtrwr4r5r6rLrLsw'OMr5rLc.eZdZdZddhZdZeddZy)rMr4redisredissFc&|ds|dsdnddddS)Nr(r) localhost6379z/0)r*r+r,r4rs r6rzRedisDsn.get_default_parts s%+0-5=kr  r5Nr)r/r0r1rrtrwrrr4r5r6rMrMs(I)OM  r5rMc$eZdZdhZeddZy)rNmongodbc ddiS)Nr+27017r4rs r6rzMongoDsn.get_default_partss G  r5Nrr/r0r1rtrrr4r5r6rNrNs kO  r5rNc$eZdZdhZeddZy)rOkafkac dddS)Nr9092)r*r+r4rs r6rzKafkaDsn.get_default_parts"s"  r5Nrrr4r5r6rOrOsiO  r5rOTrrrsrrrrurwrtrrrrurwrtcHt||||||}tdtf|S)Nr!UrlValue)dicttyper@)rrrrurwrt namespaces r6rDrD*s3)!#' I  VIy 11r5cH ddlay#t$r}td|d}~wwxYw)NrzCemail-validator is not installed, run `pip install pydantic[email]`)email_validator ImportError)es r6import_email_validatorr+?s,h h_`fgghs ! !cbeZdZedeeefddfdZeddZede edefdZ y) rErrQNc*|jddy)Nstringemailr%rupdaters r6rzEmailStr.__modify_schema__Hs':r5c#LKtt|jywrS)r+rrrs r6rzEmailStr.__get_validators__Ls  lls"$rct|dS)Nrr)rPr~rs r6rzEmailStr.validateTse$Q''r5r) r/r0r1rrr2r rrrrr4r5r6rErEGsd;T#s(^;;;(U3Z(C((r5rEceZdZdZdedefdZdedefdZe de eefdd fd Z e dd Z e d eddfd Z defdZy )rFnamer/r8r/c ||_||_yrSr7)rr8r/s r6rzNameEmail.__init__\s  r5otherrQct|txr1|j|jf|j|jfk(SrS) isinstancerFr8r/)rr:s r6__eq__zNameEmail.__eq__`s6%+dDJJ0GEJJX]XcXcKd0ddr5rNc*|jddy)Nr.z name-emailr0r1rs r6rzNameEmail.__modify_schema__cs,?r5c#<Kt|jywrS)r+rrs r6rzNameEmail.__get_validators__gs llsrcV|j|k(r|St|}|t|SrS)rrrPr5s r6rzNameEmail.validatems- ??c !Le$N5)**r5c:|jd|jdS)Nz <>r7)rs r6__str__zNameEmail.__str__ts))Btzzl!,,r5r)r/r0r1rr2rr r>r=rrrrrrCr4r5r6rFrFYsISeCeDe@T#s(^@@@ +S+[++ --r5rFcveZdZdZedeeefddfdZed dZ ede ee e fde e effdZy) rGr4rrQNc*|jddy)Nr. ipvanyaddressr0r1rs r6rzIPvAnyAddress.__modify_schema__{/Br5c#(K|jywrSrrs r6rz IPvAnyAddress.__get_validators__rrrc t|S#t$rYnwxYw t|S#t$rtjwxYwrS)r ValueErrorrrIPvAnyAddressErrorr5s r6rzIPvAnyAddress.validatesR u% %    .u% % .++- - .  (Ar)r/r0r1rrrr2r rrrbytesrrrrr4r5r6rGrGxs~ICT#s(^CCC .U3s?3 .k;>V8W . .r5rGcjeZdZdZedeeefddfdZed dZ ede de e e ffdZy) rHr4rrQNc*|jddy)Nr.ipvanyinterfacer0r1rs r6rz!IPvAnyInterface.__modify_schema__s2CDr5c#(K|jywrSrrs r6rz"IPvAnyInterface.__get_validators__rrrc t|S#t$rYnwxYw t|S#t$rtjwxYwrS)rrJrrIPvAnyInterfaceErrorr5s r6rzIPvAnyInterface.validatesR  ' '    0 ' ' 0--/ / 0rLr)r/r0r1rrrr2r rr NetworkTyperrrrr4r5r6rHrHssIET#s(^EEE 0[ 0U=-3O-P 0 0r5rHcfeZdZedeeefddfdZeddZede de e e ffdZ y) rIrrQNc*|jddy)Nr. ipvanynetworkr0r1rs r6rzIPvAnyNetwork.__modify_schema__rGr5c#(K|jywrSrrs r6rz IPvAnyNetwork.__get_validators__rrrc t|S#t$rYnwxYw t|S#t$rtjwxYwrS)rrJrrIPvAnyNetworkErrorr5s r6rzIPvAnyNetwork.validatesR u% %    .u% % .++- - .rLr)r/r0r1rrr2r rrrTrrrrr4r5r6rIrIsnCT#s(^CCC .[ .U; 3K-L . .r5rIz([\w ]*?) *<(.*)> *irc6t tt|tkDrt j t j|}d}|r|j\}}|j} tj|d}t|dr$|j}|J|xs |j}||fS|jd}|d|}||dj!}|xs|||zfS#tj$r}tj |d}~wwxYw)aH Email address validation using https://pypi.org/project/email-validator/ Notes: * raw ip address (literal) domain parts are not allowed. * "John Doe " style "pretty" email addresses are processed * spaces are striped from the beginning and end of addresses but no error is raised NF)check_deliverability normalizedr)r(r+rMAX_EMAIL_LENGTHr EmailErrorpretty_email_regexrgroupsrrPEmailNotValidErrorhasattrr] local_partindexr) rrr8r/rr*at_indexrd global_parts r6rPrPs  5z$$!!$$U+A!Dhhj e KKME'..u5Qul#     'u''U{;;s#9H% HI&,,. !z: #;;;  - -'Q&'s4C//DDD)rQN)[rU ipaddressrrrrrrr r typingr r r rrrrrrrrrrrr pydantic.v1rpydantic.v1.utilsrrpydantic.v1.validatorsrrr(typing_extensionsrpydantic.v1.configr pydantic.v1.fieldsr!pydantic.v1.typingr"rr$r9r$r2rMrrT__all__rTr`rerjrorYrWrXrZr[r\r^rarhrmrpr@rArCrBrrJrKrLrMrNrOr>rDr+rErFrGrHrIrVr`r^rPr4r5r6rrs    $=I+--.!+tT"9:    IUO  CU5eS+A5c?+R%SST  ("  : I% + 073<'gcl'$%GCL%#'#,#GCLaKSaKH FjFf=6=@,"6f  v   v  v "15222 2  2  2jo.2 &\2*h(s($-->.L.00l00.L.0 RZZ 67 $<%*$<sCx$