Scrapegraph-ai/scrapegraphai/utils/copy.py
2025-01-06 15:10:35 +01:00

72 lines
1.5 KiB
Python

"""
copy module
"""
import copy
from typing import Any
class DeepCopyError(Exception):
"""
Custom exception raised when an object cannot be deep-copied.
"""
pass
def is_boto3_client(obj):
"""
Function for understanding if the script is using boto3 or not
"""
import sys
boto3_module = sys.modules.get("boto3")
if boto3_module:
try:
from botocore.client import BaseClient
return isinstance(obj, BaseClient)
except (AttributeError, ImportError):
return False
return False
def safe_deepcopy(obj: Any) -> Any:
"""
Safely create a deep copy of an object, handling special cases.
Args:
obj: Object to copy
Returns:
Deep copy of the object
Raises:
DeepCopyError: If object cannot be deep copied
"""
try:
# Handle special cases first
if obj is None or isinstance(obj, (str, int, float, bool)):
return obj
if isinstance(obj, (list, set)):
return type(obj)(safe_deepcopy(v) for v in obj)
if isinstance(obj, dict):
return {k: safe_deepcopy(v) for k, v in obj.items()}
if isinstance(obj, tuple):
return tuple(safe_deepcopy(v) for v in obj)
if isinstance(obj, frozenset):
return frozenset(safe_deepcopy(v) for v in obj)
if is_boto3_client(obj):
return obj
return copy.copy(obj)
except Exception as e:
raise DeepCopyError(f"Cannot deep copy object of type {type(obj)}") from e