enum.py (2681B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\codereload\enum.py 2 3 4 def reloadable_enum(_cls = None, allow_override = False): 5 6 def deco(cls): 7 if not allow_override and hasattr(cls, '__reload_update__'): 8 import warnings 9 warnings.warn("Overriding a __reload_update__ hook\n\n{cls} already has a __reload_update__ hook defined. @reloadable_enum will completely replace that hook with its own. If this is what you want then you can pass 'allow_override=True' to the decorator in order to suppress this warning, like this:\n\n @reloadable_enum(allow_override=True)\n class {cls}(...):\n ...\n".format(cls=cls.__name__)) 10 11 def reload_update(old_cls, _old_instance = None): 12 if _old_instance is not None: 13 return _old_instance 14 from codereload.xreload import _update, deferred_update_global_references 15 ignore = {'_member_map_', '_member_names_', '_value2member_map_'} 16 for name, item in cls.__dict__.items(): 17 if name in ignore or isinstance(item, cls): 18 continue 19 setattr(old_cls, name, _update(old_cls.__dict__.get(name, None), item)) 20 21 old_names = set(old_cls._member_names_) 22 new_names = set(cls._member_names_) 23 all_names = old_names.union(new_names) 24 added_names = new_names - old_names 25 removed_names = old_names - new_names 26 for name in all_names: 27 if name in removed_names: 28 old_cls._member_names_.remove(name) 29 del old_cls._value2member_map_[old_cls._member_map_[name].value] 30 del old_cls._member_map_[name] 31 elif name in added_names: 32 old_cls._member_names_.append(name) 33 new_item = cls._member_map_[name] 34 new_item.__class__ = old_cls 35 old_cls._member_map_[name] = new_item 36 old_cls._value2member_map_[new_item.value] = new_item 37 else: 38 del old_cls._value2member_map_[old_cls._member_map_[name].value] 39 new_item = cls._member_map_[name] 40 old_item = old_cls._member_map_[name] 41 old_item._value_ = new_item._value_ 42 old_cls._value2member_map_[new_item.value] = old_item 43 44 deferred_update_global_references(cls, old_cls) 45 return old_cls 46 47 setattr(cls, '__reload_update__', reload_update) 48 return cls 49 50 if _cls is not None: 51 return deco(_cls) 52 else: 53 return deco