n9e%ddlmZmZmZmZddlmZmZmZm Z m Z m Z ddl m Z dZGddeZeZdZGdd ee ZGd d eZy ))InvariantException CheckedType_restore_picklestore_invariants) set_fields check_typeis_field_ignore_extra_complaintPFIELD_NO_INITIAL serializecheck_global_invariants transformc:t|dk(xr |dtk(S)Nr)lenr)basess 4/usr/lib/python3/dist-packages/pyrsistent/_pclass.py _is_pclassrs u:? 6uQx;66ceZdZfdZxZS) PClassMetact||dt||dddtd|dDz|d<t|r |dxxdz cc<tt |||||S) N_pclass_fields)name_pclass_invariants __invariant__)_pclass_frozenc3 K|]}|ywN).0keys r z%PClassMeta.__new__..s6\ss6\s  __slots__) __weakref__)rrtuplersuperr__new__)mcsrrdct __class__s rr(zPClassMeta.__new__ sr3$45e%9?K.6\cJZF[6\1\\K e    0 0 Z-c4DDr)__name__ __module__ __qualname__r( __classcell__r+s@rrr s E Errct|||||j|\}}|s|j|yt|||yr)r invariantappendsetattr)clsfieldrvalueresultinvariant_errorsis_ok error_codes r_check_and_set_attrr<s@sE4'.E:  +e$rceZdZdZfdZdZeddZddZdZ dZ dZ d Z fd Z d Zd Zd ZdZdZdZxZS)PClassa A PClass is a python class with a fixed set of specified fields. PClasses are declared as python classes inheriting from PClass. It is defined the same way that PRecords are and behaves like a PRecord in all aspects except that it is not a PMap and hence not a collection but rather a plain Python object. More documentation and examples of PClass usage is available at https://github.com/tobgu/pyrsistent c tt| |}|jdd}|jdd}g}g}|jj D]\}}||vr\|||vr=t t||r|j|||} n|j||} n||} t|||| ||||=f|jturBt|jr|jn |j} t|||| |||js|jdj|j||s|rt!t#|t#|d|r4t%djdj'||jt)||j*d|_|S) N_factory_fields ignore_extra)rAz{0}.{1}zField invariant failedz0'{0}' are not among the specified fields for {1}, T)r'r>r(popritemsr factoryr<initialr callable mandatoryr3formatr,rr&AttributeErrorjoinr rr) r5kwargsr8factory_fieldsrAmissing_fieldsr9rr6r7rFr+s rr(zPClass.__new__.svs+C0$5t<zz.$7 --335 LKD%v~!)T^-C6vulS % fTl V % fTl ;"4LE#CeVEUV4L&77-5emm-D%--/%--#gv7GI%%i&6&6s||T&JK! L$ ~$U+;%SUmn n  !S!Z!Z &!3<<"12 2 (>(>? $ rc|r |d||d<t|}|jD]&}||vst||t}|tus"|||<(|jdd|i|S)a Set a field in the instance. Returns a new instance with the updated value. The original instance remains unmodified. Accepts key-value pairs or single string representing the field name and a value. >>> from pyrsistent import PClass, field >>> class AClass(PClass): ... x = field() ... >>> a = AClass(x=1) >>> a2 = a.set(x=2) >>> a3 = a.set('x', 3) >>> a AClass(x=1) >>> a2 AClass(x=2) >>> a3 AClass(x=3) rrr@r )setrgetattr_MISSING_VALUEr+)selfargsrLrMr"r7s rrPz PClass.setRsx& "1gF47OV&& (C& c>:."'F3K  ( t~~GnGGGrct||r|S|r"|jDcic] }||vs|||}}|d||d|Scc}w)a: Factory method. Will create a new PClass of the current type and assign the values specified in kwargs. :param ignore_extra: A boolean which when set to True will ignore any keys which appear in kwargs that are not in the set of fields on the PClass. )r@rAr ) isinstancer)r5rLr@rAks rcreatez PClass.creatersY fc "M ,/,>,>Nq!v+alNFNX?XQWXXOs >>ci}|jD]C}t||t}|tust|j|j||||<E|S)z Serialize the current PClass using custom serializer functions for fields where such have been supplied. )rrQrRr serializer)rSrIr8rr7s rr zPClass.serializesa '' ^DD$7EN*()<).sc3c> BCcs )hashr&rrSs`r__hash__zPClass.__hash__sEctObObccddrc~t|ddrtdj||tt|||y)NrFz'Can't set attribute, key={0}, value={1})rQrJrIr'r> __setattr__rSr"r7r+s rrjzPClass.__setattr__s< 4)5 1 !J!Q!QRUW\!]^ ^ fd'U3rc6tdj|)Nz-Can't delete attribute, key={0}, use remove())rJrI)rSr"s r __delattr__zPClass.__delattr__s !P!W!WX[!\] ]rcji}|jD]!}t||t}|tus|||<#|Sr)rrQrR)rSr8r"r7s r_to_dictzPClass._to_dictsB&& $CD#~6EN*#s  $  rcdj|jjdjd|j j DS)Nz{0}({1})rBc3XK|]"\}}dj|t|$yw)z{0}={1}N)rIrepr)r!rWvs rr#z"PClass.__repr__..s%*lDAq9+;+;AtAw+G*ls(*)rIr+r,rKrorDrgs r__repr__zPClass.__repr__sH  !8!8!%*lTXTaTaTcTiTiTk*l!ln nrchtfdjD}tj|ffS)Nc3TK|]}t|s|t|f!ywr)hasattrrQres rr#z$PClass.__reduce__..s)c#PWX\^aPbS'$,-cs(()dictrrr+)rSdatas` r __reduce__zPClass.__reduce__s-c9L9Lcc 777rc6t||jS)z5 Returns an evolver for this object. )_PClassEvolverrorgs revolverzPClass.evolversdDMMO44rcH|j}||=|jS)z Remove attribute given by name from the current instance. Raises AttributeError if the attribute doesn't exist. )r} persistent)rSrr}s rremovez PClass.removes% ,,. DM!!##rNFr)r,r-r.__doc__r(rP classmethodrXr rr`rbrhrjrmrortrzr}rr/r0s@rr>r>%sj"HH@YY 0!e4 ^n8 5 $rr>) metaclasscReZdZdZdZdZdZdZdZdZ dZ fd Z d Z xZ S) r|)_pclass_evolver_original_pclass_evolver_data_pclass_evolver_data_is_dirtyr@cL||_||_d|_t|_yr)rrrrPr@)rSoriginal initial_dicts r__init__z_PClassEvolver.__init__s$(0%$0!-2*"urc |j|Sr)rrSitems r __getitem__z_PClassEvolver.__getitem__s((..rc|jj|t|ur1||j|<|jj |d|_|SNT)rgetrRr@addrrSr"r7s rrPz_PClassEvolver.setsN  $ $ ( (n =U J-2D % %c *  $ $S )15D . rc(|j||yr)rPrs r __setitem__z_PClassEvolver.__setitem__s erc||jvr1|j|=|jj|d|_|St |r)rr@discardrrJrs rrz_PClassEvolver.removesJ 4,, ,))$/  ( ( .15D .KT""rc&|j|yr)rrs r __delitem__z_PClassEvolver.__delitem__s Drc|jr2|jjdd|ji|jS|jS)Nr@r )rrr+r@rrgs rrz_PClassEvolver.persistentsS  - -:400::X4K_K_X=A=V=VX X,,,rcp||jvr|j||ytt|||yr)r$rPr'r|rjrks rrjz_PClassEvolver.__setattr__s. dnn $ HHS% .$ 3C ?rc ||Srr rs r __getattr__z_PClassEvolver.__getattr__s Dzr)r,r-r.r$rrrPrrrrrjrr/r0s@rr|r|s6xI% /#-@ rr|N)pyrsistent._checked_typesrrrrpyrsistent._field_commonrrr r r r pyrsistent._transformationsrrtyperobjectrRr<r>r|r rrrsXjj27 E E%m$[Jm$`1V1r