draft: fix collection appending
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
parent
3737e0dc81
commit
3e29e1d322
@ -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",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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]
|
||||||
|
@ -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:
|
||||||
|
@ -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 ""
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user