;iFdZddlZddlZddlZddlmZddlmZ ddlmZn #e $rYnwxYwddl m Z m Z m Z mZmZmZmZmZmZmZmZddlmZddlmZdd lmZmZmZmZdd lm Z dd l!m"Z"dd l#m$Z$m%Z%m&Z&m'Z'dd l(m)Z)m*Z*ddl+m,Z,e r8ddl(m-Z-ddl.m/Z/m0Z0eddZ1eeddfZ2GddZ3gdZ4edZ5ej6dkreej7e$feddddddddddd de8de8d e8d!e8d"e8d#e8d$eeee9dfd%ee8d&ee8d'e8d(e ee5gd)ffd*Z:eej7e$feddddddddddd d+ee5de8de8d e8d!e8d"e8d#e8d$eeee9dfd%ee8d&ee8d'e8d(d)fd,Z:neej7e$fedddddddddd- de8de8d e8d!e8d"e8d#e8d$eeee9dfd%ee8d&ee8d(e ee5gd)ffd.Z:eej7e$fedddddddddd- d+ee5de8de8d e8d!e8d"e8d#e8d$eeee9dfd%ee8d&ee8d(d)fd/Z:eej7e$f dIddddddddddd d+eee5de8de8d e8d!e8d"e8d#e8d$eeee9dfd%ee8d&ee8d'e8d(ee ee5gd)fd)ffd0Z:ed1edd2e8d(eedddffd3Z;Gd4dZdJd9Z?d1edd:e d(dfd;Z@edfd5edd$ee d6ee=d(ed<fd=ZAej6d>kr d?dd@e=d(e8fdAZBn d?dd@e=d(e8fdBZBdKdDZCdCddEe=d2e d(dfdFZDd+ee d(e8fdGZEd5edd$eed(d8fdHZFdS)LaX The main purpose is to enhance stdlib dataclasses by adding validation A pydantic dataclass can be generated from scratch or from a stdlib one. Behind the scene, a pydantic dataclass is just like a regular one on which we attach a `BaseModel` and magic methods to trigger the validation of the data. `__init__` and `__post_init__` are hence overridden and have extra logic to be able to validate input data. When a pydantic dataclass is generated from scratch, it's just a plain dataclass with validation triggered at initialization The tricky part if for stdlib dataclasses that are converted after into pydantic ones e.g. ```py @dataclasses.dataclass class M: x: int ValidatedM = pydantic.dataclasses.dataclass(M) ``` We indeed still want to support equality, hashing, repr, ... as if it was the stdlib one! ```py assert isinstance(ValidatedM(x=1), M) assert ValidatedM(x=1) == M(x=1) ``` This means we **don't want to create a new dataclass that inherits from it** The trick is to create a wrapper around `M` that will act as a proxy to trigger validation without altering default `M` behaviour. N)contextmanager)wraps)cached_property) TYPE_CHECKINGAnyCallableClassVarDict GeneratorOptionalTypeTypeVarUnionoverload)dataclass_transform)gather_all_validators) BaseConfig ConfigDictExtra get_config)ValidationError)DataclassTypeError)Field FieldInfoRequired Undefined) create_modelvalidate_model)ClassAttribute) BaseModel)CallableGeneratorNoArgAnyCallable DataclassT Dataclass)boundDataclassProxyceZdZUeeeefed<eeed<eeded<ee ed<eeded<ee ed<ee e ed<eedgd fed <ee ed <d e d e dd fdZ ede dddfdZede ddeddfdZd S)r$__dataclass_fields____dataclass_params__).N __post_init____pydantic_run_validation____post_init_post_parse____pydantic_initialised____pydantic_model__N__pydantic_validate_values__#__pydantic_has_field_info_default__argskwargsreturncdSNselfr1r2s KC:\PYTHON\MyICR_Workspace\venv\Lib\site-packages\pydantic/v1/dataclasses.py__init__zDataclass.__init__Ps Dclsr!cdSr5r6r<s r9__get_validators__zDataclass.__get_validators__S Dr;r#vcdSr5r6r<rAs r9 __validate__zDataclass.__validate__Wr@r;)__name__ __module__ __qualname__r r strr__annotations__rboolr r objectr: classmethodr?rDr6r;r9r$r$Bsf&tCH~6666&sm+++ 34444&.d^333"*8I+>"????"*4.000$T)_5555&.x t8K/L&MMMM-5d^;;; & F t      D$5 :M       d<0 S \       r;) dataclassset_validation$create_pydantic_model_from_dataclassis_builtin_dataclassmake_dataclass_validator_T )field_specifiersTF. initrepreqorder unsafe_hashfrozenconfigvalidate_on_init use_proxykw_onlyrXrYrZr[r\r]r^r_r`rar3DataclassClassOrWrapperc dSr5r6rWs r9rMrMh  r;_clsc dSr5r6) rerXrYrZr[r\r]r^r_r`ras r9rMrMys r; rXrYrZr[r\r]r^r_r`c dSr5r6rgs r9rMrMs  r;c dSr5r6) rerXrYrZr[r\r]r^r_r`s r9rMrMrdr;c  t| dttddf   f d } || S| |S)a Like the python standard lib dataclasses but with type validation. The result is either a pydantic dataclass that will validate input data or a wrapper that will trigger validation around a stdlib dataclass to avoid modifying it directly r<r3rbc  ngt|oX|jdtupDtt |tt |jdk}|rd}t |}d}nS|jpd}tjdkrtj |   }ntj |  }d}|n}t| |||j j di|j|i|S) NrFrS)rXrYrZr[r\r]ra)rXrYrZr[r\r]Tr6)rP __bases__rKsetdirr&__doc__sys version_info dataclassesrM#_add_pydantic_validation_attributesr.__try_update_forward_refs__rE)r<should_use_proxy dc_cls_docdc_clsdefault_validate_on_initshould_validate_on_initrZr]rXrar[rY the_configr\r`r_s r9wrapzdataclass..wrapsX$ I%S))`]1%/^3s3xx==CCMZ[L\H]H]D^D^3^   ,J#C((F', $ $*J7**$. +!#   %.d"E{ci(, $>N>V":":\l+C=TV`aaa=!=TTs@STTT r;)rr r) rerXrYrZr[r\r]r^r_r`rar|r{s `````` ``` @r9rMrMs*F##J#$s)# 9###############J | 4::r;r<valuec#VK|j} ||_|V||_dS#||_wxYwr5)r+)r<r}original_run_validations r9rNrNsI!=B*/' *A'''*A'AAAAs  (ceZdZdZdedddfdZdededefd Zd edefd Z d ed eddfdZ dede fdZ ddZ deddfdZdS)r& __dataclass__rxr$r3Nc>t|d|dS)Nr)rK __setattr__)r8rxs r9r:zDataclassProxy.__init__s 4&99999r;r1r2czt|jd5|j|i|cdddS#1swxYwYdS)NT)rNrr7s r9__call__zDataclassProxy.__call__s D. 5 5 7 7%4%t6v66 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s 044namec,t|j|Sr5)getattrr)r8rs r9 __getattr__zDataclassProxy.__getattr__st)4000r;_DataclassProxy__name_DataclassProxy__valuec.t|j||Sr5)setattrr)r8rrs r9rzDataclassProxy.__setattr__st)67;;;r;instancec,t||jSr5) isinstancer)r8rs r9__instancecheck__z DataclassProxy.__instancecheck__ s(D$6777r;cNttj|jSr5)r&copyr)r8s r9__copy__zDataclassProxy.__copy__sdi(:;;<<EEFFFr;)r3r&)rErFrG __slots__r r:rrrHrrrJrrrr6r;r9r&r&sI:tK0:T::::7c7S7S7777111111<#<<<<<<8#8$8888====GG)9GGGGGGr;rxrwc |jtdddtdtddffd t|drv |jjn#t $r |jYnwxYwtdddtdtddffd }t|d t|d|n>tdddtdtddffd }t|d |t|d td |t|d dt|dt||t|dtt|dttt|dtt|jjjr$|jjst|dt&dSdSdS)a We need to replace the right method. If no `__post_init__` has been set in the stdlib dataclass it won't even exist (code is generated on the fly by `dataclasses`) By default, we run validation after `__init__` or `__post_init__` if defined r8r$r1r2r3Ncjtjkr,g|Rifd|DdSjtjkra|D] \}}j||!g|Rifd|DdSg|Ri|dS)Nc.i|]\}}|jv||Sr6r(.0krAr8s r9 zR_add_pydantic_validation_attributes..handle_extra_init..%, c c c$!QAIbDbDbADbDbDbr;c.i|]\}}|jv||Sr6rrs r9rzR_add_pydantic_validation_attributes..handle_extra_init..*rr;)extrarignoreitemsallow__dict__ setdefault)r8r1r2rrAr^rXs` r9handle_extra_initz>_add_pydantic_validation_attributes..handle_extra_init"s <5< ' ' D d d d d c c c c&,,.. c c c d d d d d \U[ ( (  / /1 ((A.... D d d d d c c c c&,,.. c c c d d d d d D ' ' ' ' ' ' ' ' 'r;r*cjdkr |g|Ri||jjr1|t |dr |j|i|jdkr|g|Ri|dSdS)Nbefore_validationr,after_validation)post_init_call __class__r+r/hasattrr,)r8r1r2r^ post_inits r9 new_post_initz:_add_pydantic_validation_attributes..new_post_init5s$(;;; $0000000~9 C113334!;<<C1D14B6BBB$(::: $000000000;:r;r:c|g|Ri||jjr|t|dri}t |jjD]b\}}|jtj urJ ||||j <*#t$r+| |j |j ||j <Y^wxYwc|jdi|dSdS)Nr,r6)rr+r/r enumerater(values _field_typers_FIELD_INITVARr IndexErrorgetdefaultr,)r8r1r2initvars_and_valuesifrs r9new_initz5_add_pydantic_validation_attributes..new_initGs/  d 4T 4 4 4V 4 4 4~9 411333t788 E 79#%dn&I&P&P&R&RSSXXDAq} (BBBX:>q'/77)XXX:@**QVQY:W:W/777X C.-DD0CDDDDD E EsB2C  C r+r-Fr.r/rDr?r)r:rrrr* __wrapped__AttributeErrorrrrO_dataclass_validate_valuesrL_validate_dataclass_get_validatorsr. __config__validate_assignmentr)r]&_dataclass_validate_assignment_setattr) rxr^r_rwrrrrXrs ` @@@r9rtrts ?D 4[[ ( (C (3 (4 ( ( ( ( ( ([ (v''/. -,8II - - -,III - y   1 1C 13 14 1 1 1 1 1 1   1  $56667777 t E; Es Ec Ed E E E E E  E,  H--- F1>B_aq3r3rsss F.666 F(*NvW]_i*j*jkkk F24NOOO FNK0C$D$DEEE F(+o*F*FGGG  +?OHcHjO 'MNNNNNOOOOs AA,+A,r!c#K|jVdSr5)rDr>s r9rrks r;rAcxt|d5t||r"||cdddSt|ttfr||cdddSt|t r|di|cdddSt |j#1swxYwYdS)NT) class_namer6)rNrr/listtupledictrrErCs r9rrosF T " " > > a   > * * , , , > > > > > > > >D%= ) ) >37 > > > > > > > > 4  >38888 > > > > > > > >% === = > > > > > > > > > >s#&B/ B/1B/B//B36B3r ci}tj|D]}t}d}|jtjur|j}n"|jtjur|j}nt }t|tr |}d|_ ntd||d|j }|j |f||j <t|}t|jf||j|ddid|} ||n|jpd| _| S)NT)rdefault_factory__resolve_forward_refs__F)rrF__validators____cls_kwargs__rlr6)rsfieldsrrMISSINGrrrrr0rmetadatatyperrrrErFrp) rxr^rwfield_definitionsfieldrr field_info validatorsmodels r9rOrO|s+ )+#F++AA 8< = 3 3 3mGG  "+*= = =#3OOG gy ) ) c J9=F 6 6bwbbSXSabbJ).Z(@%*%%&v..J+ $!2E:       E#-"8JJfn>RPREM Lr;)rTobjrcdttt||dtSr5)rrrrrrs r9_is_field_cached_propertyrs$'$s))Q55GGGr;cdS)NFr6rs r9rrsur;r8ctdrdStddr&fdjD}n%fdjD}tj|j\}}}|r|j|tdddS)Nr-r0Fcfi|]-\}}t|tt|*||.Sr6)rrrrs r9rz._dataclass_validate_values..sU   1q),, 1J$PQ0R0R q   r;c<i|]\}}t|||Sr6)rrs r9rz._dataclass_validate_values..s1gggtq!D]^bdeDfDfgagggr;r>T) rrrrr.rupdaterKr)r8 input_datad_validation_errors` r9rrst/00t:EBB h     ++--   hgggt}':':'<'<ggg +D,CZUYUcdddAq M t7>>>>>r;rcV|jrt|j}||d|jj|d}|r9|||||j\}}|rt|g|jt |||dS)N)locr<) r-rrpopr. __fields__rvalidaterrrKr)r8rr}r known_fielderror_s r9rrs $@    dD-8<rs   B  %%%%%% )))))))   D uttttttttttttttttttttttttt111111>>>>>>HHHHHHHHHHHH666666111111DDDDDDDDDDDD99999999,,,,,,******FFFFFFFF[999J#D$57G$GH4    WT]]w;+     48*77 8    XFE  ;+   #   XFE  $;+   48*77 8    XFE  ;+   #    XFE  {'8%&@AAA#>48'+ $>>> 48 > >  > >  >> > *d6lD0 1>tn>~>> 8T"XJ 99 :>>BA>BB\*B4BIdT,/ >C >L > > > ># $$$  $ I$ $ + $$$$NvH{HsHtHHHHH {st????, * *C *PS *X\ * * * *tCyT:QT+%6QZ@PQUhQQQQQQs #++