@@ -30,6 +30,7 @@ def __init_subclass__(cls, **kwargs):
3030 return
3131
3232 cls ._name = getattr (cls , '__NAME__' , cls .__name__ )
33+ cls ._cname = getattr (cls , '__COLLECTION_NAME__' , '' )
3334 cls ._id = None
3435 cls ._memberclass = type (f'{ cls ._name } Member' , (EnumMember , cls ), {})
3536
@@ -40,28 +41,33 @@ def __init_subclass__(cls, **kwargs):
4041 setattr (cls , k , cls ._memberclass (cls ._name , k , v ))
4142
4243 # register for lookup by name
43- _enums_lookup [cls ._name ] = cls
44+ _enums_lookup [cls ._cname + cls . _name ] = cls
4445
4546 @staticmethod
46- def _update_enum (enums , data , convert ):
47+ def _update_enum (cname , enums , data , convert ):
4748 name = data ['name' ]
48- enum = _enums_lookup .get (name )
49+ enum = _enums_lookup .get (name , _enums_lookup .get (cname + name ))
50+ if enum and enum ._cname and enum ._cname != cname :
51+ raise TypeError (
52+ f'Enum type { name } is used in more than one collection; '
53+ 'Add __COLLECTION_NAME__ to your Enum definition to fix '
54+ 'this error' )
4955 cls = EnumMember if enum is None else enum ._memberclass
5056
5157 members = [cls (name , k , convert (v )) for k , v in data ['members' ]]
5258
5359 if enum is not None :
60+ enum ._cname = cname
5461 enum ._id = data ['enum_id' ]
5562 for member in members :
5663 setattr (enum , member .name , member )
5764
58- enums [data ['enum_id' ]] = members
65+ enums [data ['enum_id' ]] = members , enum
5966
6067 @staticmethod
6168 def _upd_enum_add (enums , data , convert ):
62- members = enums [data ['enum_id' ]]
69+ members , enum = enums [data ['enum_id' ]]
6370 name = members [0 ]._enum_name
64- enum = _enums_lookup .get (name )
6571 cls = EnumMember if enum is None else enum ._memberclass
6672
6773 member = cls (name , data ['name' ], convert (data ['value' ]))
@@ -72,10 +78,8 @@ def _upd_enum_add(enums, data, convert):
7278
7379 @staticmethod
7480 def _upd_enum_del (enums , data ):
75- members = enums [data ['enum_id' ]]
76- name = members [0 ]._enum_name
81+ members , enum = enums [data ['enum_id' ]]
7782
78- enum = _enums_lookup .get (name )
7983 if enum is not None :
8084 member = members [data ['index' ]]
8185 delattr (enum , member .name )
@@ -88,7 +92,7 @@ def _upd_enum_del(enums, data):
8892
8993 @staticmethod
9094 def _upd_enum_def (enums , data ):
91- members = enums [data ['enum_id' ]]
95+ members , _ = enums [data ['enum_id' ]]
9296 # swap index
9397 idx = data ['index' ]
9498 tmp = members [idx ]
@@ -97,18 +101,16 @@ def _upd_enum_def(enums, data):
97101
98102 @staticmethod
99103 def _upd_enum_mod (enums , data , convert ):
100- members = enums [data ['enum_id' ]]
104+ members , _ = enums [data ['enum_id' ]]
101105 name = members [0 ]._enum_name
102106 member = members [data ['index' ]]
103107 member ._value = convert (data ['value' ])
104108
105109 @staticmethod
106110 def _upd_enum_ren (enums , data ):
107- members = enums [data ['enum_id' ]]
108- name = members [0 ]._enum_name
111+ members , enum = enums [data ['enum_id' ]]
109112 member = members [data ['index' ]]
110113
111- enum = _enums_lookup .get (name )
112114 if enum is not None :
113115 delattr (enum , member .name )
114116 setattr (enum , data ['name' ], member )
0 commit comments