draft: fix collection appending
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
Hellow 2024-04-29 22:37:07 +02:00
parent 3737e0dc81
commit 3e29e1d322
7 changed files with 31 additions and 39 deletions

View File

@ -6,8 +6,8 @@ logging.getLogger().setLevel(logging.DEBUG)
if __name__ == "__main__": if __name__ == "__main__":
commands = [ commands = [
"s: #a Ghost Bath", "s: #a Crystal F",
"d: 14", "d: 20",
] ]

View File

@ -53,9 +53,9 @@ class Artwork:
def get_variant_name(self, variant: ArtworkVariant) -> str: def get_variant_name(self, variant: ArtworkVariant) -> str:
return f"artwork_{variant['width']}x{variant['height']}_{hash_url(variant['url']).replace('/', '_')}" return f"artwork_{variant['width']}x{variant['height']}_{hash_url(variant['url']).replace('/', '_')}"
def __merge__(self, other: Artwork, override: bool = False) -> None: def __merge__(self, other: Artwork, **kwargs) -> None:
for key, value in other._variant_mapping.items(): for key, value in other._variant_mapping.items():
if key not in self._variant_mapping or override: if key not in self._variant_mapping:
self._variant_mapping[key] = value self._variant_mapping[key] = value
def __eq__(self, other: Artwork) -> bool: def __eq__(self, other: Artwork) -> bool:

View File

@ -79,26 +79,25 @@ class Collection(Generic[T]):
self._map_element(e) self._map_element(e)
def _find_object(self, __object: T) -> Optional[T]: def _find_object(self, __object: T) -> Optional[T]:
self._remap()
for name, value in __object.indexing_values: for name, value in __object.indexing_values:
if value in self._indexed_values[name]: if value in self._indexed_values[name]:
return self._indexed_values[name][value] return self._indexed_values[name][value]
def append(self, __object: Optional[T], already_is_parent: bool = False, from_map: bool = False): def append(self, __object: Optional[T], **kwargs):
""" """
If an object, that represents the same entity exists in a relevant collection, If an object, that represents the same entity exists in a relevant collection,
merge into this object. (and remap) merge into this object. (and remap)
Else append to this collection. Else append to this collection.
:param __object: :param __object:
:param already_is_parent:
:param from_map:
:return: :return:
""" """
if __object is None: if __object is None:
return return
self._remap()
existing_object = self._find_object(__object) existing_object = self._find_object(__object)
if existing_object is None: if existing_object is None:
@ -107,40 +106,39 @@ class Collection(Generic[T]):
self._map_element(__object) self._map_element(__object)
for collection_attribute, child_collection in self.extend_object_to_attribute.items(): for collection_attribute, child_collection in self.extend_object_to_attribute.items():
__object.__getattribute__(collection_attribute).extend(child_collection) __object.__getattribute__(collection_attribute).extend(child_collection, **kwargs)
for attribute, new_object in self.append_object_to_attribute.items(): for attribute, new_object in self.append_object_to_attribute.items():
__object.__getattribute__(attribute).append(new_object) __object.__getattribute__(attribute).append(new_object, **kwargs)
# only modify collections if the object actually has been appended # only modify collections if the object actually has been appended
for attribute, a in self.sync_on_append.items(): for attribute, a in self.sync_on_append.items():
b = __object.__getattribute__(attribute) b = __object.__getattribute__(attribute)
object_trace(f"Syncing [{a}{id(a)}] = [{b}{id(b)}]") if a is b:
continue
object_trace(f"Syncing [{a}] = [{b}]")
a._collection_for.update(b._collection_for)
for synced_with, key in b._collection_for.items(): for synced_with, key in b._collection_for.items():
synced_with.__setattr__(key, a) synced_with.__setattr__(key, a)
a._collection_for.update(b._collection_for)
a.extend(b.data, **kwargs)
else: else:
# merge only if the two objects are not the same # merge only if the two objects are not the same
if existing_object.id == __object.id: if existing_object.id == __object.id:
return return
old_id = existing_object.id existing_object.merge(__object, **kwargs)
existing_object.merge(__object)
if existing_object.id != old_id:
self._unmap_element(old_id)
self._map_element(existing_object) self._map_element(existing_object)
def extend(self, __iterable: Optional[Generator[T, None, None]]): def extend(self, __iterable: Optional[Generator[T, None, None]], **kwargs):
if __iterable is None: if __iterable is None:
return return
for __object in __iterable: for __object in __iterable:
self.append(__object) self.append(__object, **kwargs)
@property @property
def data(self) -> List[T]: def data(self) -> List[T]:
@ -156,8 +154,8 @@ class Collection(Generic[T]):
def __iter__(self) -> Iterator[T]: def __iter__(self) -> Iterator[T]:
yield from self._data yield from self._data
def __merge__(self, __other: Collection, override: bool = False): def __merge__(self, __other: Collection, **kwargs):
self.extend(__other) self.extend(__other, **kwargs)
def __getitem__(self, item: int): def __getitem__(self, item: int):
return self._data[item] return self._data[item]

View File

@ -50,10 +50,9 @@ class InnerData:
def __hash__(self): def __hash__(self):
return self.id return self.id
def __merge__(self, __other: InnerData, override: bool = False): def __merge__(self, __other: InnerData, **kwargs):
""" """
:param __other: :param __other:
:param override:
:return: :return:
""" """
@ -68,13 +67,9 @@ class InnerData:
# if the object of value implemented __merge__, it merges # if the object of value implemented __merge__, it merges
existing = self.__getattribute__(key) existing = self.__getattribute__(key)
if hasattr(type(existing), "__merge__"): if hasattr(type(existing), "__merge__"):
existing.__merge__(value, override) existing.__merge__(value, **kwargs)
continue continue
# override the existing value if requested
if override:
self.__setattr__(key, value)
class OuterProxy: class OuterProxy:
""" """
@ -174,13 +169,12 @@ class OuterProxy:
def __eq__(self, other: Any): def __eq__(self, other: Any):
return self.__hash__() == other.__hash__() return self.__hash__() == other.__hash__()
def merge(self, __other: Optional[OuterProxy], override: bool = False): def merge(self, __other: Optional[OuterProxy], **kwargs):
""" """
1. merges the data of __other in self 1. merges the data of __other in self
2. replaces the data of __other with the data of self 2. replaces the data of __other with the data of self
:param __other: :param __other:
:param override:
:return: :return:
""" """
if __other is None: if __other is None:
@ -205,11 +199,11 @@ class OuterProxy:
instance._inner = a._inner instance._inner = a._inner
a._inner._refers_to_instances.add(instance) a._inner._refers_to_instances.add(instance)
a._inner.__merge__(old_inner, override=override) a._inner.__merge__(old_inner, **kwargs)
del old_inner del old_inner
def __merge__(self, __other: Optional[OuterProxy], override: bool = False): def __merge__(self, __other: Optional[OuterProxy], **kwargs):
self.merge(__other, override) self.merge(__other, **kwargs)
def mark_as_fetched(self, *url_hash_list: List[str]): def mark_as_fetched(self, *url_hash_list: List[str]):
for url_hash in url_hash_list: for url_hash in url_hash_list:

View File

@ -44,7 +44,7 @@ def get_collection_string(
ignore_titles: Set[str] = None, ignore_titles: Set[str] = None,
background: BColors = OPTION_BACKGROUND, background: BColors = OPTION_BACKGROUND,
foreground: BColors = OPTION_FOREGROUND, foreground: BColors = OPTION_FOREGROUND,
add_id: bool = False, add_id: bool = True,
) -> str: ) -> str:
if collection.empty: if collection.empty:
return "" return ""

View File

@ -91,7 +91,7 @@ class Source:
def __repr__(self) -> str: def __repr__(self) -> str:
return f"Src({self.page_enum.value}: {shorten_display_url(self.url)})" return f"Src({self.page_enum.value}: {shorten_display_url(self.url)})"
def __merge__(self, other: Source, override: bool = False): def __merge__(self, other: Source, **kwargs):
if self.audio_url is None: if self.audio_url is None:
self.audio_url = other.audio_url self.audio_url = other.audio_url
self.additional_data.update(other.additional_data) self.additional_data.update(other.additional_data)
@ -150,7 +150,7 @@ class SourceCollection:
def __iter__(self): def __iter__(self):
yield from self.get_sources() yield from self.get_sources()
def __merge__(self, other: SourceCollection, override: bool = False): def __merge__(self, other: SourceCollection, **kwargs):
self.extend(other) self.extend(other)
@property @property

View File

@ -15,7 +15,7 @@ __stage__ = os.getenv("STAGE", "prod")
DEBUG = (__stage__ == "dev") and True DEBUG = (__stage__ == "dev") and True
DEBUG_LOGGING = DEBUG and False DEBUG_LOGGING = DEBUG and False
DEBUG_TRACE = DEBUG and True DEBUG_TRACE = DEBUG and True
DEBUG_OBJECT_TRACE = DEBUG and False DEBUG_OBJECT_TRACE = DEBUG and True
DEBUG_OBJECT_TRACE_CALLSTACK = DEBUG_OBJECT_TRACE and False DEBUG_OBJECT_TRACE_CALLSTACK = DEBUG_OBJECT_TRACE and False
DEBUG_YOUTUBE_INITIALIZING = DEBUG and False DEBUG_YOUTUBE_INITIALIZING = DEBUG and False
DEBUG_PAGES = DEBUG and False DEBUG_PAGES = DEBUG and False