diff --git a/dumper.py b/dumper.py index c495bd9..7df6a36 100644 --- a/dumper.py +++ b/dumper.py @@ -54,50 +54,12 @@ class Serializer(ABC): serializer_map = {} - # --- Getters for sub-serializers --- - @classmethod - def get_serializer_map(cls) -> dict[type[bpy.types.bpy_struct], type[Serializer]]: - """Get the serializer map, stored in a class variable for simple caching""" - if not cls.serializer_map: - for subclass in utils.all_subclasses(Serializer): - assert hasattr(subclass, "bl_type") - cls.serializer_map[subclass.bl_type] = subclass - - return cls.serializer_map - - @classmethod - def get_serializer(cls, bl_object: bpy.types.bpy_struct) -> type[Serializer]: - """Get the closest corresponding serializer for a given Blender object using its MRO""" - serializer_map = cls.get_serializer_map() - - bl_type = type(bl_object.bl_rna.type_recast()) - - for bl_parents in bl_type.mro(): - if bl_parents in serializer_map: - return serializer_map[bl_parents] - - # Fallback to base Serializer if no matches are found - return Serializer - - # --- Properties to (de)serialize --- - - @classmethod - def get_serialized_properties(cls, obj: bpy.types.bpy_struct | Any): - serialized_properties: list[BlenderProperty] = [ - BlenderProperty(rep=prop, attr=getattr(obj, prop.identifier)) - for prop in obj.bl_rna.properties - if not prop.identifier.startswith("bl_") # Exclude internal Blender properties - and prop.identifier not in cls.prop_blacklist # Additional blacklist filtering - ] - - if cls.prop_whitelist: # Additional whitelist, applied after the blacklist - serialized_properties: list[BlenderProperty] = [ - prop for prop in serialized_properties - if prop.rep.identifier in cls.prop_whitelist - ] - - return serialized_properties + @abstractmethod + def construct_bl_object(cls, data: dict): + """Abstract method to construct a Serializer's specific Blender Object""" + print("DEBUG: construct_bl_object called on Base Serializer, shouldn't happen") + return None # --- Serialization --- @@ -226,13 +188,6 @@ class Serializer(ABC): if hasattr(target_bl_prop.attr, "update"): target_bl_prop.attr.update() - @classmethod - @abstractmethod - def construct_bl_object(cls, data: dict): - """Abstract method to construct a Serializer's specific Blender Object""" - print("DEBUG: construct_bl_object called on Base Serializer, shouldn't happen") - return None - @classmethod def deserialize_collection(cls, stored_value: Any, bl_coll: bpy.types.bpy_prop_collection, bl_pointers_ref: dict): # Static collection case @@ -318,6 +273,51 @@ class Serializer(ABC): return sorted_data + # --- Getters for sub-serializers --- + + @classmethod + def get_serializer_map(cls) -> dict[type[bpy.types.bpy_struct], type[Serializer]]: + """Get the serializer map, stored in a class variable for simple caching""" + if not cls.serializer_map: + for subclass in utils.all_subclasses(Serializer): + assert hasattr(subclass, "bl_type") + cls.serializer_map[subclass.bl_type] = subclass + + return cls.serializer_map + + @classmethod + def get_serializer(cls, bl_object: bpy.types.bpy_struct) -> type[Serializer]: + """Get the closest corresponding serializer for a given Blender object using its MRO""" + serializer_map = cls.get_serializer_map() + + bl_type = type(bl_object.bl_rna.type_recast()) + + for bl_parents in bl_type.mro(): + if bl_parents in serializer_map: + return serializer_map[bl_parents] + + # Fallback to base Serializer if no matches are found + return Serializer + + # --- Properties to (de)serialize --- + + @classmethod + def get_serialized_properties(cls, obj: bpy.types.bpy_struct | Any): + serialized_properties: list[BlenderProperty] = [ + BlenderProperty(rep=prop, attr=getattr(obj, prop.identifier)) + for prop in obj.bl_rna.properties + if not prop.identifier.startswith("bl_") # Exclude internal Blender properties + and prop.identifier not in cls.prop_blacklist # Additional blacklist filtering + ] + + if cls.prop_whitelist: # Additional whitelist, applied after the blacklist + serialized_properties: list[BlenderProperty] = [ + prop for prop in serialized_properties + if prop.rep.identifier in cls.prop_whitelist + ] + + return serialized_properties + # class NodeSocket(Serializer): # bl_type = bpy.types.NodeSocket # prop_blacklist = Serializer.prop_blacklist + (