try:
from dissolve import replace_me
except ModuleNotFoundError:
import warnings
def replace_me(since=None, remove_in=None, message=None):
def decorator(func):
def wrapper(*args, **kwargs):
msg = f"{func.__name__} has been deprecated"
if since:
msg += f" since {since}"
if remove_in:
msg += f" and will be removed in {remove_in}"
if message:
msg += f". {message}"
else:
msg += ". Consider running 'dissolve migrate' to automatically update your code."
warnings.warn(msg, DeprecationWarning, stacklevel=2)
return func(*args, **kwargs)
return wrapper
return decorator
class DataContainer:
def __init__(self, data=None):
self._data = data or []
self._metadata = {}
def __len__(self):
return len(self._data)
def __str__(self):
return f"DataContainer({len(self._data)} items)"
def __repr__(self):
return f"DataContainer(data={self._data!r}, metadata={self._metadata!r})"
def __getitem__(self, key):
if isinstance(key, int):
return self._data[key]
elif isinstance(key, str):
return self._metadata.get(key)
else:
raise TypeError("Key must be int or str")
def __setitem__(self, key, value):
if isinstance(key, int):
self._data[key] = value
elif isinstance(key, str):
self._metadata[key] = value
else:
raise TypeError("Key must be int or str")
def __iter__(self):
return iter(self._data)
def __contains__(self, item):
return item in self._data
def add(self, item):
self._data.append(item)
def remove(self, item):
self._data.remove(item)
def get_size(self):
return len(self._data)
def to_string(self):
return str(self)
class LegacyContainer:
def __init__(self, items=None):
self._items = items or []
self._extra = {}
def __len__(self):
return len(self._items)
def __str__(self):
return f"LegacyContainer({len(self._items)} items)"
@replace_me(since="2.0.0", remove_in="3.0.0")
def __unicode__(self):
return str(self)
@replace_me(since="1.0.0")
def size(self):
return len(self)
@replace_me(since="1.0.0")
def to_str(self):
return str(self)
@replace_me(since="2.1.0")
def get_item(self, index):
return self._items[index]
@replace_me(since="2.1.0")
def set_item(self, index, value):
self._items[index] = value
@replace_me(since="1.9.0")
def contains(self, item):
return item in self._items
def __getitem__(self, key):
return self._items[key]
def __setitem__(self, key, value):
self._items[key] = value
def __contains__(self, item):
return item in self._items
def __iter__(self):
return iter(self._items)
class SmartList:
def __init__(self, initial_data=None):
self._data = list(initial_data or [])
def __len__(self):
return len(self._data)
def __str__(self):
return f"SmartList{self._data}"
def __repr__(self):
return f"SmartList({self._data!r})"
def __getitem__(self, index):
return self._data[index]
def __setitem__(self, index, value):
self._data[index] = value
def __iter__(self):
return iter(self._data)
def __contains__(self, item):
return item in self._data
def append(self, item):
self._data.append(item)
def extend(self, items):
self._data.extend(items)
def count(self):
return len(self._data)
@replace_me(since="1.0.0")
def length(self):
return len(self)
@replace_me(since="1.0.0")
def get_count(self):
return len(self)
@replace_me(since="1.0.0")
def is_empty(self):
return len(self) == 0
@replace_me(since="1.0.0")
def has_item(self, item):
return item in self