U a5@s dZddlZddlmZddlmZddlmZddlmZddl m Z d d lm Z d d lm Z d d lm Z d d l mZeZddZddZddZGdddeZGdddeZGdddeZGdddeZe eddGdddeZd d!ZGd"d#d#eZdad$d%ZdS)&zRoutines to handle the string class registry used by declarative. This system allows specification of classes and expressions used in :func:`_orm.relationship` using strings. N) attributes) interfaces)SynonymProperty)ColumnProperty) class_mapper)exc) inspection)util)_get_table_keycCs||kr0||}t|ts8t||g}||<n|||<z |d}Wn&tk rjtdd|d<}YnX|jd}|r|d}||}|D]}||}q|||qxdS)z^Add a class to the _decl_class_registry associated with the given declarative class. _sa_module_registryN.r) isinstance_MultipleClassMarkerKeyError _ModuleMarker __module__splitpop get_module add_class classnameclsdecl_class_registryexistingZ root_moduletokenstokenmoduler [C:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\orm\clsregistry.pyr s.      rcCs||kr,||}t|tr&||n||=z |d}Wntk rNYdSX|jd}|r|d}||}|D]}||}qx|||q\dS)Nr rr) rr remove_itemrrrrr remove_classrr r r!r#Hs        r#cCsH||kr dS||}t|tr:|jD]}||r$dSq$n || SdS)atest if a key is empty of a certain object. used for unit tests against the registry to see if garbage collection is working. "test" is a callable that will be passed an object should return True if the given object is the one we were looking for. We can't pass the actual object itself b.c. this is for testing garbage collection; the caller will have to have removed references to the object itself. TFN)rrcontents)keyrtestthingZ sub_thingr r r! _key_is_empty_s   r(c@sFeZdZdZdZdddZddZdd Zd d Zd d Z ddZ dS)rzRrefers to multiple classes of the same name within _decl_class_registry. ) on_remover$ __weakref__Ncs,|_tfdd|D_tdS)Ncsg|]}t|jqSr )weakrefref _remove_item).0itemselfr r! sz1_MultipleClassMarker.__init__..)r)setr$ _registriesadd)r1classesr)r r0r!__init__s z_MultipleClassMarker.__init__cCs|t|dSN)r-r+r,r1rr r r!r"sz _MultipleClassMarker.remove_itemcCsdd|jDS)Ncss|] }|VqdSr8r r.r,r r r! sz0_MultipleClassMarker.__iter__..r$r0r r r!__iter__sz_MultipleClassMarker.__iter__cCsVt|jdkr*tdd||gn(t|jd}|}|dkrNt||SdS)NrzxMultiple classes found for path "%s" in the registry of this declarative base. Please use a fully module-qualified path.rr)lenr$r InvalidRequestErrorjoinlist NameError)r1pathr%r,rr r r! attempt_getsz _MultipleClassMarker.attempt_getcCs.|j||js*t||jr*|dSr8)r$discardr4r))r1r,r r r!r-s   z!_MultipleClassMarker._remove_itemcCsXtdddd|jDD}|j|kr>td|j|jf|jt||j dS)NcSsg|]}|dk r|jqSr8)r)r.rr r r!r2sz1_MultipleClassMarker.add_item..cSsg|] }|qSr r r:r r r!r2szThis declarative base already contains a class with the same class name and module name as %s.%s, and will be replaced in the string-lookup table.) r3r$rr warn__name__r5r+r,r-)r1r/modulesr r r!add_items  z_MultipleClassMarker.add_item)N) rGr __qualname____doc__ __slots__r7r"r=rDr-rIr r r r!rys rc@sTeZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ dS)rz>Refers to a module name within _decl_class_registry. )parentnamer$mod_nsrCr*cCsJ||_||_i|_t||_|jr6|jj|jg|_ng|_t|dSr8)rMrNr$_ModNSrOrCr4r5)r1rNrMr r r!r7s z_ModuleMarker.__init__cCs ||jkSr8r<r1rNr r r! __contains__sz_ModuleMarker.__contains__cCs |j|Sr8r<rQr r r! __getitem__sz_ModuleMarker.__getitem__cCs:|j|d|js6|jdk r6|j|jt|dSr8)r$rrMr-rNr4rErQr r r!r-sz_ModuleMarker._remove_itemcCs t|j|Sr8)getattrrOr1r%r r r! resolve_attrsz_ModuleMarker.resolve_attrcCs.||jkr t||}||j|<n |j|}|Sr8)r$r)r1rNmarkerr r r!rs     z_ModuleMarker.get_modulecsFjkr j}||n"t|gfddd}j<dS)Ncs Sr8)r-r rNr1r r!z)_ModuleMarker.add_class..)r))r$rIrr1rNrrr rXr!rs    z_ModuleMarker.add_classcCs"||jkr|j|}||dSr8)r$r"r[r r r!r#s  z_ModuleMarker.remove_classN) rGrrJrKrLr7rRrSr-rVrrr#r r r r!rs  rc@s eZdZdZddZddZdS)rP)Z__parentcCs ||_dSr8)_ModNS__parent)r1rMr r r!r7sz_ModNS.__init__cCstz|jj|}Wntk r$Yn8X|dk r\t|tr>|jSt|tsLt||jj |St d|jj |fdS)Nz.resolve_argcstt|jSr8)rprr)rqrr r! resolve_namesz_resolver..resolve_name)F) r sqlalchemyZsqlalchemy.ormrrr Z immutabledict__dict__union)rrhrrrrrr rr! _resolvers r)rKr+rrZdescriptor_propsrZ propertiesrr rr r Z sql.schemar r3r4rr#r(objectrrrPrbZ _inspectsrkrorprrr r r r!s4         (@9 e