fixed disgusting bug
This commit is contained in:
		| @@ -50,11 +50,24 @@ class Collection: | ||||
|              | ||||
|         self._used_ids.add(element.id) | ||||
|          | ||||
|     def append(self, element: DatabaseObject, merge_on_conflict: bool = True) -> DatabaseObject: | ||||
|     def unmap_element(self, element: DatabaseObject): | ||||
|         for name, value in element.indexing_values: | ||||
|             if value is None: | ||||
|                 continue | ||||
|              | ||||
|             if value in self._attribute_to_object_map[name]: | ||||
|                 if element is self._attribute_to_object_map[name][value]: | ||||
|                     try: | ||||
|                         self._attribute_to_object_map[name].pop(value) | ||||
|                     except KeyError: | ||||
|                         pass | ||||
|  | ||||
|     def append(self, element: DatabaseObject, merge_on_conflict: bool = True, merge_into_existing: bool = True) -> bool: | ||||
|         """ | ||||
|         :param element: | ||||
|         :param merge_on_conflict: | ||||
|         :return: | ||||
|         :param merge_into_existing: | ||||
|         :return did_not_exist: | ||||
|         """ | ||||
|  | ||||
|         # if the element type has been defined in the initializer it checks if the type matches | ||||
| @@ -68,15 +81,24 @@ class Collection: | ||||
|                 if merge_on_conflict: | ||||
|                     # if the object does already exist | ||||
|                     # thus merging and don't add it afterwards | ||||
|                     existing_object.merge(element) | ||||
|                     # in case any relevant data has been added (e.g. it remaps the old object) | ||||
|                     self.map_element(existing_object) | ||||
|                 return existing_object | ||||
|                     if merge_into_existing: | ||||
|                         existing_object.merge(element) | ||||
|                         # in case any relevant data has been added (e.g. it remaps the old object) | ||||
|                         self.map_element(existing_object) | ||||
|                     else: | ||||
|                         element.merge(existing_object) | ||||
|                          | ||||
|                         exists_at = self._data.index(existing_object) | ||||
|                         self._data[exists_at] = element | ||||
|                          | ||||
|                         self.unmap_element(existing_object) | ||||
|                         self.map_element(element) | ||||
|                 return True | ||||
|  | ||||
|         self._data.append(element) | ||||
|         self.map_element(element) | ||||
|          | ||||
|         return element | ||||
|         return False | ||||
|  | ||||
|     def extend(self, element_list: Iterable[DatabaseObject], merge_on_conflict: bool = True): | ||||
|         for element in element_list: | ||||
| @@ -104,21 +126,3 @@ class Collection: | ||||
|         returns a shallow copy of the data list | ||||
|         """ | ||||
|         return self._data.copy() | ||||
|      | ||||
|     def insecure_append(self, element: DatabaseObject): | ||||
|         if element.id in self._used_ids: | ||||
|             return False | ||||
|         self._used_ids.add(element.id) | ||||
|              | ||||
|         self._data.append(element) | ||||
|         self.map_element(element) | ||||
|         return True | ||||
|      | ||||
|     def insecure_extend(self, element_list: Iterable[DatabaseObject]): | ||||
|         success = False | ||||
|          | ||||
|         for element in element_list: | ||||
|             if self.insecure_append(element): | ||||
|                 success = True | ||||
|                  | ||||
|         return success | ||||
|   | ||||
| @@ -99,17 +99,18 @@ class Song(MainObject): | ||||
|     def compile(self): | ||||
|         album: Album | ||||
|         for album in self.album_collection: | ||||
|             if album.song_collection.insecure_append(self): | ||||
|             if album.song_collection.append(self, merge_into_existing=False): | ||||
|                 album.compile() | ||||
|  | ||||
|         artist: Artist | ||||
|         for artist in self.feature_artist_collection: | ||||
|             if artist.feature_song_collection.insecure_append(self): | ||||
|             if artist.feature_song_collection.append(self, merge_into_existing=False): | ||||
|                 artist.compile() | ||||
|  | ||||
|         for artist in self.main_artist_collection: | ||||
|             if artist.main_album_collection.insecure_extend(self.album_collection): | ||||
|                 artist.compile() | ||||
|             for album in self.album_collection: | ||||
|                 if artist.main_album_collection.append(album, merge_into_existing=False): | ||||
|                     artist.compile() | ||||
|  | ||||
|     @property | ||||
|     def indexing_values(self) -> List[Tuple[str, object]]: | ||||
| @@ -259,17 +260,17 @@ class Album(MainObject): | ||||
|     def compile(self): | ||||
|         song: Song | ||||
|         for song in self.song_collection: | ||||
|             if song.album_collection.insecure_append(self): | ||||
|             if song.album_collection.append(self, merge_into_existing=False): | ||||
|                 song.compile() | ||||
|  | ||||
|         artist: Artist | ||||
|         for artist in self.artist_collection: | ||||
|             if artist.main_album_collection.insecure_append(self): | ||||
|             if artist.main_album_collection.append(self, merge_into_existing=False): | ||||
|                 artist.compile() | ||||
|  | ||||
|         label: Label | ||||
|         for label in self.label_collection: | ||||
|             if label.album_collection.insecure_append(self): | ||||
|             if label.album_collection.append(self, merge_into_existing=False): | ||||
|                 label.compile() | ||||
|  | ||||
|     @property | ||||
| @@ -435,17 +436,17 @@ class Artist(MainObject): | ||||
|     def compile(self): | ||||
|         song: "Song" | ||||
|         for song in self.feature_song_collection: | ||||
|             if song.feature_artist_collection.insecure_append(self): | ||||
|             if song.feature_artist_collection.append(self, merge_into_existing=False): | ||||
|                 song.compile() | ||||
|  | ||||
|         album: "Album" | ||||
|         for album in self.main_album_collection: | ||||
|             if album.artist_collection.insecure_append(self): | ||||
|             if album.artist_collection.append(self, merge_into_existing=False): | ||||
|                 album.compile() | ||||
|  | ||||
|         label: Label | ||||
|         for label in self.label_collection: | ||||
|             if label.current_artist_collection.insecure_append(self): | ||||
|             if label.current_artist_collection.append(self, merge_into_existing=False): | ||||
|                 label.compile() | ||||
|  | ||||
|     @property | ||||
| @@ -579,12 +580,12 @@ class Label(MainObject): | ||||
|     def compile(self) -> bool: | ||||
|         album: Album | ||||
|         for album in self.album_collection: | ||||
|             if album.label_collection.insecure_append(self): | ||||
|             if album.label_collection.append(self, merge_into_existing=False): | ||||
|                 album.compile() | ||||
|  | ||||
|         artist: Artist | ||||
|         for artist in self.current_artist_collection: | ||||
|             if artist.label_collection.insecure_append(self): | ||||
|             if artist.label_collection.append(self, merge_into_existing=False): | ||||
|                 artist.compile() | ||||
|  | ||||
|     @property | ||||
|   | ||||
| @@ -20,20 +20,11 @@ from ..objects import ( | ||||
| ) | ||||
|  | ||||
|  | ||||
| class PageCache(Collection): | ||||
|     def clear(self): | ||||
|         self.__init__(element_type=self.element_type) | ||||
|  | ||||
|  | ||||
| class Page: | ||||
|     """ | ||||
|     This is an abstract class, laying out the  | ||||
|     functionality for every other class fetching something | ||||
|     """ | ||||
|     SONG_CACHE = PageCache(element_type=Song) | ||||
|     ALBUM_CACHE = PageCache(element_type=Album) | ||||
|     ARTIST_CACHE = PageCache(element_type=Artist) | ||||
|  | ||||
|     API_SESSION: requests.Session = requests.Session() | ||||
|     API_SESSION.proxies = shared.proxies | ||||
|     TIMEOUT = 5 | ||||
| @@ -161,10 +152,6 @@ class Page: | ||||
|         :return detailed_music_object: IT MODIFIES THE INPUT OBJ | ||||
|         """ | ||||
|  | ||||
|         cls.ARTIST_CACHE.clear() | ||||
|         cls.ALBUM_CACHE.clear() | ||||
|         cls.SONG_CACHE.clear() | ||||
|  | ||||
|         if type(music_object) == Song: | ||||
|             song = cls.fetch_song_details(music_object, flat=flat) | ||||
|             song.compile() | ||||
|   | ||||
| @@ -151,11 +151,11 @@ class Musify(Page): | ||||
|  | ||||
|             artist_thumbnail = image_soup.get("src") | ||||
|  | ||||
|         return cls.ARTIST_CACHE.append(Artist( | ||||
|         return Artist( | ||||
|             _id=_id, | ||||
|             name=name, | ||||
|             source_list=source_list | ||||
|         )) | ||||
|         ) | ||||
|  | ||||
|     @classmethod | ||||
|     def parse_album_contact(cls, contact: BeautifulSoup) -> Album: | ||||
| @@ -700,13 +700,13 @@ class Musify(Page): | ||||
|         if note_soup is not None: | ||||
|             notes.html = note_soup.decode_contents() | ||||
|  | ||||
|         return cls.ARTIST_CACHE.append(Artist( | ||||
|         return Artist( | ||||
|             _id=url.musify_id, | ||||
|             name=name, | ||||
|             country=country, | ||||
|             source_list=source_list, | ||||
|             notes=notes | ||||
|         )) | ||||
|         ) | ||||
|  | ||||
|     @classmethod | ||||
|     def fetch_artist_from_source(cls, source: Source, flat: bool = False) -> Artist: | ||||
| @@ -842,7 +842,7 @@ class Musify(Page): | ||||
|                     _artist_name = meta_artist_name_text | ||||
|  | ||||
|                 if _artist_name is not None or _artist_src is not None: | ||||
|                     artist_list.append(cls.ARTIST_CACHE.append(Artist(name=_artist_name, source_list=_artist_src))) | ||||
|                     artist_list.append(Artist(name=_artist_name, source_list=_artist_src)) | ||||
|  | ||||
|         return Song( | ||||
|             title=song_name, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user