o Sb1@sUdZddlZddlZddlmZddlmZmZm Z m Z m Z mZm Z m Z mZmZmZmZeedZee eed<edZedZed ZGd d d eeefZdS) zTools for creating and manipulating SON, the Serialized Ocument Notation. Regular dictionaries can be used instead of SON objects, but not when the order of keys is important. A SON object can be used just like a normal Python dictionary.N)Mapping) AnyDictIterableIteratorListrOptionalPatternTupleTypeTypeVarUnionRE_TYPE_Key_Value_Tc seZdZUdZeeed< d;deee e e fe e e e ffdeddfddZd ed d ededd ffd d ZddZde de ddfddZde ddfddZdSONzSON data. A subclass of dict that maintains ordering of keys and provides a few extra niceties for dealing with SON. SON provides an API similar to collections.OrderedDict. _SON__keysNdatakwargsreturncKs(g|_t|||||dSN)rdict__init__update)selfrrr//tmp/pip-target-onvjaxws/lib/python/bson/son.pyr:s  z SON.__init__clsSON[_Key, _Value]argscs(tt|j|g|Ri|}g|_|Sr)superr__new__r)rr!rinstance __class__rrr#Dsz SON.__new__cCs4g}|jD] }|d|||fqdd|S)Nz(%r, %r)z SON([%s])z, )rappendjoin)rresultkeyrrr__repr__Is z SON.__repr__r*valuecCs(||jvr |j|t|||dSr)rr'r __setitem__)rr*r,rrrr-Os  zSON.__setitem__cCs|j|t||dSr)rremover __delitem__rr*rrrr/Ts zSON.__delitem__cCst}|||Sr)rrrotherrrrcopyXs zSON.copyccs|jD]}|VqdSrr)rkrrr__iter__`s z SON.__iter__cCs ||jvSrr4r0rrrhas_keyd z SON.has_keycCs|Sr)r6rrrriterkeysgsz SON.iterkeysccs|D]\}}|VqdSritems)r_vrrr itervalueskszSON.itervaluescCsdd|DS)NcSsg|]\}}|qSrr).0r=r>rrr pzSON.values..r;r9rrrvaluesosz SON.valuescsg|_tt|dSr)rr"rclearr9r%rrrDrsz SON.cleardefaultcCs(z||WSty|||<Y|SwrKeyErrorrr*rErrr setdefaultvs    zSON.setdefaultcGs\t|dkrtdtdt|z||}Wnty(|r'|dYSw||=|S)Nz&pop expected at most 2 arguments, got r)len TypeErrorreprrG)rr*r!r,rrrpop}s    zSON.popcCs>z tt|\}}Wn tytdw||=||fS)Nzcontainer is empty)nextiterr< StopIterationrG)rr5r>rrrpopitems z SON.popitemr2cKs|durn1t|dr|D]\}}|||<qnt|dr+|D]}||||<q!n |D]\}}|||<q-|r?||dSdS)Nr<keys)hasattrr<rSr)rr2rr5r>rrrrs      z SON.updatecCs"z||WSty|YSwrrFrHrrrgets   zSON.getcCs>t|trt|t|kot|t|kS||kS)z|Comparison to another SON is order-sensitive while comparison to a regular dictionary is order-insensitive. ) isinstancerrKlistr<to_dictr1rrr__eq__s ( z SON.__eq__cCs ||k Srrr1rrr__ne__r8z SON.__ne__cCs t|jSr)rKrr9rrr__len__r8z SON.__len__cs"dtdtffdd t|S)zConvert a SON document to a normal Python dictionary instance. This is trickier than just *dict(...)* because it needs to be recursive. r,rcsDt|trfdd|DSt|tr tfdd|DS|S)Ncsg|]}|qSrr)r@r>transform_valuerrrArBz8SON.to_dict..transform_value..csg|] \}}||fqSrr)r@r5r>r\rrrAs)rVrW_Mappingrr<)r,r\rrr]s  z$SON.to_dict..transform_value)rrr9rr\rrXs z SON.to_dictmemocCsZt}t|}||vr||S|||<|D]\}}t|ts&t||}|||<q|Sr)ridr<rVrr3deepcopy)rr_outZval_idr5r>rrr __deepcopy__s   zSON.__deepcopy__r)rr )rN)+__name__ __module__ __qualname____doc__rr__annotations__rr rrrrr rr r#r+r-r/r3rr6boolr7r:r?rCrDrIrrNrRrrUrYrZintr[rrXrc __classcell__rrr%rr0s@  " "  & ."r)rgr3recollections.abcrr^typingrrrrrrr r r r r typecompilerrhrrrrrrrrs 8