From d64ecfc500610a531cf03410817725eac1598545 Mon Sep 17 00:00:00 2001 From: tomer gelber Date: Wed, 8 Oct 2014 22:31:18 +0300 Subject: [PATCH 1/8] testing __equal__ --- tests/test_anime.py | 12 ++++++++++++ tests/test_manga.py | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/tests/test_anime.py b/tests/test_anime.py index a05a5c4..33e0c2a 100644 --- a/tests/test_anime.py +++ b/tests/test_anime.py @@ -194,6 +194,18 @@ def test_id(self): def test_str(self): self.assertEqual(str(self.anime), ''.format(ANIME_ID)) + def test___equal___anime_object(self): + self.assertEqual(self.anime, self.anime) + + def test___equal___anime_id_int(self): + self.assertEqual(self.anime, ANIME_ID) + + def test___equal___anime_id_str(self): + self.assertEqual(self.anime, str(ANIME_ID)) + + def test___equald___not_equal(self): + self.assertNotEqual(self.anime, set()) + @unittest.skip("Delete is not working") def test_add_and_delete(self): account = Account(ACCOUNT_TEST_USERNAME, ACCOUNT_TEST_PASSWORD) diff --git a/tests/test_manga.py b/tests/test_manga.py index 1c67078..0aa8a58 100644 --- a/tests/test_manga.py +++ b/tests/test_manga.py @@ -171,6 +171,18 @@ def test_id(self): def test_str(self): self.assertEqual(str(self.manga), '') + def test___equal___manga_object(self): + self.assertEqual(self.manga, self.manga) + + def test___equal___manga_id_int(self): + self.assertEqual(self.manga, MANGA_ID) + + def test___equal___manga_id_str(self): + self.assertEqual(self.manga, str(MANGA_ID)) + + def test___equald___not_equal(self): + self.assertNotEqual(self.manga, set()) + @unittest.skip("Delete is not working") def test_add_and_delete(self): mng = manga.Manga(ADD_MANGA_ID) From b8e3b55ae7bba119545c43e0cf5fd77b358fc6c4 Mon Sep 17 00:00:00 2001 From: tomer gelber Date: Wed, 8 Oct 2014 23:26:16 +0300 Subject: [PATCH 2/8] fixed docs --- pymal/anime.py | 28 ---------------------------- pymal/inner_objects/media.py | 2 +- pymal/manga.py | 29 ----------------------------- 3 files changed, 1 insertion(+), 58 deletions(-) diff --git a/pymal/anime.py b/pymal/anime.py index 8e41650..7d88c15 100644 --- a/pymal/anime.py +++ b/pymal/anime.py @@ -20,37 +20,9 @@ class Anime(Media): """ Object that keeps all the anime data in MAL. - :ivar title: :class:`str` - :ivar image_url: :class:`str` - :ivar english: :class:`str` - :ivar synonyms: :class:`str` - :ivar japanese: :class:`str` - :ivar type: :class:`str` - :ivar status: :class:`int` - :ivar start_time: :class:`int` - :ivar end_time: :class:`int` - :ivar creators: :class:`dict` - :ivar genres: :class:`dict` :ivar duration: :class:`int` - :ivar score: :class:`float` - :ivar rank: :class:`int` - :ivar popularity: :class:`int` :ivar rating: :class:`str` :ivar episodes: :class:`int` - :ivar synopsis: :class:`str` - - :ivar adaptations: :class:`frozenset` - :ivar characters: :class:`frozenset` - :ivar sequels: :class:`frozenset` - :ivar prequels: :class:`frozenset` - :ivar spin_offs: :class:`frozenset` - :ivar alternative_versions: :class:`frozenset` - :ivar side_stories: :class:`frozenset` - :ivar summaries: :class:`frozenset` - :ivar others: :class:`frozenset` - :ivar parent_stories: :class:`frozenset` - :ivar alternative_settings: :class:`frozenset` - :ivar full_stories: :class:`frozenset` """ _NAME = 'anime' diff --git a/pymal/inner_objects/media.py b/pymal/inner_objects/media.py index 4bc149c..b407f8f 100644 --- a/pymal/inner_objects/media.py +++ b/pymal/inner_objects/media.py @@ -20,7 +20,7 @@ class SingletonFactoryABCMeta(SingletonFactory, ABCMeta): class Media(object, metaclass=SingletonFactoryABCMeta): """ - Object that keeps all the anime data in MAL. + Object that keeps media data in MAL. :ivar title: :class:`str` :ivar image_url: :class:`str` diff --git a/pymal/manga.py b/pymal/manga.py index fc3cd42..24a97ba 100644 --- a/pymal/manga.py +++ b/pymal/manga.py @@ -20,37 +20,8 @@ class Manga(Media): """ Object that keeps all the anime data in MAL. - :ivar title: :class:`str` - :ivar image_url: :class:`str` - :ivar english: :class:`str` - :ivar synonyms: :class:`str` - :ivar japanese: :class:`str` - :ivar type: :class:`str` - :ivar status: :class:`int` - :ivar start_time: :class:`int` - :ivar end_time: :class:`int` - :ivar creators: :class:`dict` - :ivar genres: :class:`dict` - :ivar duration: :class:`int` - :ivar score: :class:`float` - :ivar rank: :class:`int` - :ivar popularity: :class:`int` - :ivar rating: :class:`str` :ivar chapters: :class:`int` :ivar volumes: :class:`int` - :ivar synopsis: :class:`str` - - :ivar adaptations: :class:`frozenset` - :ivar characters: :class:`frozenset` - :ivar sequels: :class:`frozenset` - :ivar prequels: :class:`frozenset` - :ivar spin_offs: :class:`frozenset` - :ivar alternative_versions: :class:`frozenset` - :ivar side_stories: :class:`frozenset` - :ivar summaries: :class:`frozenset` - :ivar others: :class:`frozenset` - :ivar parent_stories: :class:`frozenset` - :ivar alternative_settings: :class:`frozenset` """ _NAME = 'manga' From fe52b6b469c88ca7cf02b3512a61342ecccbf225 Mon Sep 17 00:00:00 2001 From: tomer gelber Date: Wed, 8 Oct 2014 23:27:11 +0300 Subject: [PATCH 3/8] father has it already --- pymal/anime.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pymal/anime.py b/pymal/anime.py index 7d88c15..150aaf7 100644 --- a/pymal/anime.py +++ b/pymal/anime.py @@ -66,11 +66,6 @@ def __init__(self, mal_id: int): def duration(self) -> int: return self.__duration - @property - @load() - def full_stories(self) -> frozenset: - return frozenset(self._full_stories) - @property @load() def rating(self) -> int: From 46428a745c0b3c3263187d39990856f286ca1025 Mon Sep 17 00:00:00 2001 From: tomer gelber Date: Wed, 8 Oct 2014 23:27:54 +0300 Subject: [PATCH 4/8] testing creator, genres and status --- pymal/anime.py | 30 +---- pymal/inner_objects/media.py | 131 +++++++++++-------- pymal/manga.py | 29 +---- tests/test_anime.py | 215 ++++++++++++++++--------------- tests/test_manga.py | 243 +++++++++++++++++++---------------- 5 files changed, 329 insertions(+), 319 deletions(-) diff --git a/pymal/anime.py b/pymal/anime.py index 150aaf7..bbbc140 100644 --- a/pymal/anime.py +++ b/pymal/anime.py @@ -26,6 +26,8 @@ class Anime(Media): """ _NAME = 'anime' + _TIMING_HEADER = 'Aired' + _CREATORS_HEADER = 'Producers' def __init__(self, mal_id: int): """ @@ -51,8 +53,8 @@ def __init__(self, mal_id: int): self._type_parse, self._episodes_parse, self._status_parse, - self._aired_parse, - self._producers_parse, + self._timing_parse, + self._creators_parse, self._genres_parse, self._duration_parse, self._rating_parse, @@ -88,30 +90,6 @@ def _episodes_parse(self, episodes_div: bs4.element.Tag): self.__episodes = global_functions.make_counter(self_episodes.strip()) return 1 - def _aired_parse(self, aired_div: bs4.element.Tag): - """ - :param aired_div: Aired
- :type aired_div: bs4.element.Tag - :return: 1. - """ - if not global_functions.check_side_content_div('Aired', aired_div): - raise exceptions.FailedToReloadError(aired_div) - aired_span, aired = aired_div.contents - self._start_time, self._end_time = global_functions.make_start_and_end_time(aired) - return 1 - - def _producers_parse(self, producers_div: bs4.element.Tag): - """ - :param producers_div: Aired
- :type producers_div: bs4.element.Tag - :return: 1. - """ - if not global_functions.check_side_content_div('Producers', producers_div): - raise exceptions.FailedToReloadError(producers_div) - for producer_link in producers_div.findAll(name='a'): - self._creators[producer_link.text.strip()] = producer_link['href'] - return 1 - def _duration_parse(self, duration_div: bs4.element.Tag): """ :param duration_div: Duration
diff --git a/pymal/inner_objects/media.py b/pymal/inner_objects/media.py index b407f8f..c35d47d 100644 --- a/pymal/inner_objects/media.py +++ b/pymal/inner_objects/media.py @@ -61,6 +61,22 @@ def _NAME(self): """ return '' + @property + @abstractmethod + def _TIMING_HEADER(self): + """ + :rtype: str + """ + return '' + + @property + @abstractmethod + def _CREATORS_HEADER(self): + """ + :rtype: str + """ + return '' + @property def _GLOBAL_MAL_URL(self): """ @@ -86,20 +102,20 @@ def __init__(self, mal_id: int): # Getting staff from html # staff from side content - self._title = '' - self._image_url = '' - self._english = '' - self._synonyms = '' - self._japanese = '' - self._type = '' - self._status = 0 - self._start_time = 0 - self._end_time = 0 - self._creators = dict() - self._genres = dict() - self._score = 0.0 - self._rank = 0 - self._popularity = 0 + self.__title = '' + self.__image_url = '' + self.__english = '' + self.__synonyms = '' + self.__japanese = '' + self.__type = '' + self.__status = 0 + self.__start_time = 0 + self.__end_time = 0 + self.__creators = dict() + self.__genres = dict() + self.__score = 0.0 + self.__rank = 0 + self.__popularity = 0 # staff from main content # staff from row 1 @@ -146,12 +162,12 @@ def id(self) -> int: @property @load() def title(self) -> str: - return self._title + return self.__title @property @load() def image_url(self) -> str: - return self._image_url + return self.__image_url def get_image(self): """ @@ -165,62 +181,62 @@ def get_image(self): @property @load() def english(self) -> str: - return self._english + return self.__english @property @load() def synonyms(self) -> str: - return self._synonyms + return self.__synonyms @property @load() def japanese(self) -> str: - return self._japanese + return self.__japanese @property @load() def type(self) -> str: - return self._type + return self.__type @property @load() def status(self) -> int: - return self._status + return self.__status @property @load() def start_time(self) -> int: - return self._start_time + return self.__start_time @property @load() def end_time(self) -> int: - return self._end_time + return self.__end_time @property @load() def creators(self) -> dict: - return self._creators + return self.__creators @property @load() def genres(self) -> dict: - return self._genres + return self.__genres @property @load() def score(self) -> float: - return self._score + return self.__score @property @load() def rank(self) -> int: - return self._rank + return self.__rank @property @load() def popularity(self) -> int: - return self._popularity + return self.__popularity @property @load() @@ -313,7 +329,7 @@ def _image_parse(self, img_div: bs4.element.Tag): img_link = img_div.find(name="a") if img_link is None: raise exceptions.FailedToReloadError(img_div) - self._image_url = img_link.img['src'] + self.__image_url = img_link.img['src'] return 1 def _english_parse(self, english_div): @@ -325,10 +341,10 @@ def _english_parse(self, english_div): """ if global_functions.check_side_content_div('English', english_div): english_span, self_english = english_div.contents - self._english = self_english.strip() + self.__english = self_english.strip() return 1 else: - self._english = '' + self.__english = '' return 0 def _synonyms_parse(self, synonyms_div: bs4.element.Tag): @@ -340,10 +356,10 @@ def _synonyms_parse(self, synonyms_div: bs4.element.Tag): """ if global_functions.check_side_content_div('Synonyms', synonyms_div): synonyms_span, self_synonyms = synonyms_div.contents - self._synonyms = self_synonyms.strip() + self.__synonyms = self_synonyms.strip() return 1 else: - self._synonyms = '' + self.__synonyms = '' return 0 def _japanese_parse(self, japanese_div: bs4.element.Tag): @@ -355,10 +371,10 @@ def _japanese_parse(self, japanese_div: bs4.element.Tag): """ if global_functions.check_side_content_div('Japanese', japanese_div): japanese_span, self_japanese = japanese_div.contents - self._japanese = self_japanese.strip() + self.__japanese = self_japanese.strip() return 1 else: - self._japanese = '' + self.__japanese = '' return 0 def _type_parse(self, type_div: bs4.element.Tag): @@ -370,7 +386,7 @@ def _type_parse(self, type_div: bs4.element.Tag): if not global_functions.check_side_content_div('Type', type_div): raise exceptions.FailedToReloadError(type_div) type_span, self_type = type_div.contents - self._type = self_type.strip() + self.__type = self_type.strip() return 1 def _status_parse(self, status_div: bs4.element.Tag): @@ -381,8 +397,8 @@ def _status_parse(self, status_div: bs4.element.Tag): """ if not global_functions.check_side_content_div('Status', status_div): raise exceptions.FailedToReloadError(status_div) - status_span, self._status = status_div.contents - self._status = self._status.strip() + status_span, self.__status = status_div.contents + self.__status = self.__status.strip() return 1 def _genres_parse(self, genres_div: bs4.element.Tag): @@ -394,19 +410,32 @@ def _genres_parse(self, genres_div: bs4.element.Tag): if not global_functions.check_side_content_div('Genres', genres_div): raise exceptions.FailedToReloadError(genres_div) for genre_link in genres_div.findAll(name='a'): - self._genres[genre_link.text.strip()] = genre_link['href'] + self.__genres[genre_link.text.strip()] = genre_link['href'] + return 1 + + + def _timing_parse(self, timing_div: bs4.element.Tag): + """ + :param timing_div: timing
+ :type timing_div: bs4.element.Tag + :return: 1. + """ + if not global_functions.check_side_content_div(self._TIMING_HEADER, timing_div): + raise exceptions.FailedToReloadError(timing_div) + timing_span, timing = timing_div.contents + self.__start_time, self.__end_time = global_functions.make_start_and_end_time(timing) return 1 - def _rating_parse(self, rating_div: bs4.element.Tag): + def _creators_parse(self, creators_div: bs4.element.Tag): """ - :type rating_div: bs4.element.Tag - :param rating_div: Rating
+ :param creators_div: creators
+ :type creators_div: bs4.element.Tag :return: 1. """ - if not global_functions.check_side_content_div('Rating', rating_div): - raise exceptions.FailedToReloadError(rating_div) - rating_span, self.__rating = rating_div.contents - self.__rating = self.__rating.strip() + if not global_functions.check_side_content_div(self._CREATORS_HEADER, creators_div): + raise exceptions.FailedToReloadError(creators_div) + for creators_link in creators_div.findAll(name='a'): + self.__creators[creators_link.text.strip()] = creators_link['href'] return 1 def _rank_parse(self, rank_div: bs4.element.Tag): @@ -421,7 +450,7 @@ def _rank_parse(self, rank_div: bs4.element.Tag): self_rank = self_rank.strip() if not self_rank.startswith("#"): raise exceptions.FailedToReloadError(self_rank) - self._rank = int(self_rank[1:]) + self.__rank = int(self_rank[1:]) return 1 def _score_parse(self, score_div: bs4.element.Tag): @@ -433,7 +462,7 @@ def _score_parse(self, score_div: bs4.element.Tag): if not global_functions.check_side_content_div('Score', score_div): raise exceptions.FailedToReloadError(score_div) score_span, self_score = score_div.contents[:2] - self._score = float(self_score) + self.__score = float(self_score) return 1 def _popularity_parse(self, popularity_div: bs4.element.Tag): @@ -448,7 +477,7 @@ def _popularity_parse(self, popularity_div: bs4.element.Tag): self_popularity = self_popularity.strip() if not self_popularity.startswith("#"): raise exceptions.FailedToReloadError(self_popularity) - self._popularity = int(self_popularity[1:]) + self.__popularity = int(self_popularity[1:]) return 1 def _void_parse(self, div: bs4.element.Tag): @@ -520,7 +549,7 @@ def reload(self): content_wrapper_div = global_functions.get_content_wrapper_div(self.__mal_url, global_functions.connect) # Getting title
- self._title = content_wrapper_div.h1.contents[1].strip() + self.__title = content_wrapper_div.h1.contents[1].strip() # Getting content
content_div = content_wrapper_div.find( @@ -617,7 +646,7 @@ def add(self, account): return self._my_media(self, self._add_data_checker(ret), account) def __repr__(self): - title = '' if self._title is None else ' ' + self._title + title = '' if self.__title is None else ' ' + self.__title return "<{0:s}{1:s} id={2:d}>".format(self.__class__.__name__, title, self.__id) def __format__(self, format_spec): diff --git a/pymal/manga.py b/pymal/manga.py index 24a97ba..e764da9 100644 --- a/pymal/manga.py +++ b/pymal/manga.py @@ -25,6 +25,8 @@ class Manga(Media): """ _NAME = 'manga' + _TIMING_HEADER = 'Published' + _CREATORS_HEADER = 'Authors' def __init__(self, mal_id: int): """ @@ -49,9 +51,9 @@ def __init__(self, mal_id: int): self._volumes_parse, self._chapters_parse, self._status_parse, - self._published_parse, + self._timing_parse, self._genres_parse, - self._authors_parse, + self._creators_parse, self._void_parse, self._score_parse, self._rank_parse, @@ -92,29 +94,6 @@ def _chapters_parse(self, chapters_div: bs4.element.Tag): self.__chapters = global_functions.make_counter(self_chapters.strip()) return 1 - def _published_parse(self, published_div: bs4.element.Tag): - """ - :param published_div: Published
- :type published_div: bs4.element.Tag - :return: 1. - """ - if not global_functions.check_side_content_div('Published', published_div): - raise exceptions.FailedToReloadError(published_div) - published_span, published = published_div.contents - self._start_time, self._end_time = global_functions.make_start_and_end_time(published) - return 1 - - def _authors_parse(self, authors_div: bs4.element.Tag): - """ - :param authors_div: Authors
- :type authors_div: bs4.element.Tag - :return: 1. - """ - if not global_functions.check_side_content_div('Authors', authors_div): - raise exceptions.FailedToReloadError(authors_div) - for authors_link in authors_div.findAll(name='a'): - self._creators[authors_link.text.strip()] = authors_link['href'] - return 1 MY_MAL_XML_TEMPLATE = """ diff --git a/tests/test_anime.py b/tests/test_anime.py index 33e0c2a..1506df9 100644 --- a/tests/test_anime.py +++ b/tests/test_anime.py @@ -1,15 +1,14 @@ import unittest +from mock import Mock import os from os import path -from mock import Mock - +import bs4 from pymal.account import Account -from pymal import anime -from pymal import manga +from pymal.anime import Anime +from pymal.manga import Manga from pymal import global_functions -from pymal.account_objects import my_anime -import bs4 +from pymal.account_objects.my_anime import MyAnime from tests.constants_for_testing import ADD_ANIME_ID, ANIME_ID, ACCOUNT_TEST_USERNAME, ACCOUNT_TEST_PASSWORD,\ SOURCES_DIRECTORY @@ -18,10 +17,10 @@ class FetchWebTestCase(unittest.TestCase): @classmethod def setUpClass(cls): - cls.anime = anime.Anime(ANIME_ID) + cls.tested_object = Anime(ANIME_ID) def test_fetch_web(self): - self.anime.reload() + self.tested_object.reload() class ReloadTestCase(unittest.TestCase): @@ -37,188 +36,196 @@ def setUpClass(cls): global_functions.get_content_wrapper_div = Mock(return_value=content_wrapper_div) def setUp(self): - self.anime = anime.Anime(ANIME_ID) - self.__reload = self.anime.reload - self.anime.reload = Mock(wraps=self.__reload) - self.anime.reload() + self.tested_object = Anime(ANIME_ID) + self.__reload = self.tested_object.reload + self.tested_object.reload = Mock(wraps=self.__reload) @classmethod def tearDownClass(cls): global_functions.get_content_wrapper_div = cls.__global_functions_get_content_wrapper_div def tearDown(self): - self.anime.reload.assert_called_once_with() - anime.Anime._unregiter(self.anime) + self.tested_object.reload.assert_called_once_with() + Anime._unregiter(self.tested_object) def test_title(self): - self.assertEqual(self.anime.title, 'Lucky☆Star') + self.assertEqual(self.tested_object.title, 'Lucky☆Star') def test_image_url(self): - self.assertEqual(self.anime.image_url, 'Lucky%E2%98%86Star%20-%20MyAnimeList.net_files/15010.jpg') + self.assertEqual(self.tested_object.image_url, 'Lucky%E2%98%86Star%20-%20MyAnimeList.net_files/15010.jpg') def test_english(self): - self.assertEqual(self.anime.english, 'Lucky☆Star') + self.assertEqual(self.tested_object.english, 'Lucky☆Star') def test_synonyms(self): - self.assertEqual(self.anime.synonyms, 'Lucky Star') + self.assertEqual(self.tested_object.synonyms, 'Lucky Star') def test_japanese(self): - self.assertEqual(self.anime.japanese, 'らき☆すた') + self.assertEqual(self.tested_object.japanese, 'らき☆すた') def test_type(self): - self.assertEqual(self.anime.type, 'TV') + self.assertEqual(self.tested_object.type, 'TV') + + def test_status(self): + self.assertEqual(self.tested_object.status, 'Finished Airing') def test_episodes(self): - self.assertEqual(self.anime.episodes, 24) + self.assertEqual(self.tested_object.episodes, 24) # TODO: need to take something with no number - # self.assertEqual(self.anime.episodes, float('inf')) + # self.assertEqual(self.tested_object.episodes, float('inf')) def test_start_time(self): - self.assertEqual(self.anime.start_time, 1175990400) + self.assertEqual(self.tested_object.start_time, 1175990400) def test_end_time(self): - self.assertEqual(self.anime.end_time, 1189987200) + self.assertEqual(self.tested_object.end_time, 1189987200) def test_rating(self): - self.assertEqual(self.anime.rating, 'PG-13 - Teens 13 or older') + self.assertEqual(self.tested_object.rating, 'PG-13 - Teens 13 or older') def test_duration(self): - self.assertEqual(self.anime.duration, 24) + self.assertEqual(self.tested_object.duration, 24) + + def test_creators(self): + self.assertIsInstance(self.tested_object.creators, dict) + + def test_genres(self): + self.assertIsInstance(self.tested_object.genres, dict) def test_score(self): - self.assertIsInstance(self.anime.score, float) + self.assertIsInstance(self.tested_object.score, float) def test_rank(self): - self.assertIsInstance(self.anime.rank, int) + self.assertIsInstance(self.tested_object.rank, int) def test_popularity(self): - self.assertIsInstance(self.anime.popularity, int) + self.assertIsInstance(self.tested_object.popularity, int) def test_synopsis(self): - self.assertEqual(self.anime.synopsis, "Having fun in school, doing homework \ntogether, cooking and eating, playing videogames, watching anime. All \nthose little things make up the daily life of the anime—and \nchocolate-loving—Izumi Konata and her friends. Sometimes relaxing but \nmore than often simply funny!" + os.linesep) + self.assertEqual(self.tested_object.synopsis, "Having fun in school, doing homework \ntogether, cooking and eating, playing videogames, watching anime. All \nthose little things make up the daily life of the anime—and \nchocolate-loving—Izumi Konata and her friends. Sometimes relaxing but \nmore than often simply funny!" + os.linesep) def test_spinoff(self): - self.assertIsInstance(self.anime.spin_offs, frozenset) - self.assertEqual(len(self.anime.spin_offs), 1) - for spin_off in self.anime.spin_offs: - self.assertIsInstance(spin_off, anime.Anime) - self.assertIn(17637, list(self.anime.spin_offs)) + self.assertIsInstance(self.tested_object.spin_offs, frozenset) + self.assertEqual(len(self.tested_object.spin_offs), 1) + for spin_off in self.tested_object.spin_offs: + self.assertIsInstance(spin_off, Anime) + self.assertIn(17637, list(self.tested_object.spin_offs)) def test_adaptations(self): - self.assertIsInstance(self.anime.adaptations, frozenset) - self.assertEqual(len(self.anime.adaptations), 1) - for adaptation in self.anime.adaptations: - self.assertIsInstance(adaptation, manga.Manga) - self.assertIsInstance(adaptation, manga.Manga) - self.assertIn(587, list(self.anime.adaptations)) + self.assertIsInstance(self.tested_object.adaptations, frozenset) + self.assertEqual(len(self.tested_object.adaptations), 1) + for adaptation in self.tested_object.adaptations: + self.assertIsInstance(adaptation, Manga) + self.assertIn(587, list(self.tested_object.adaptations)) def test_characters(self): - self.assertIsInstance(self.anime.characters, frozenset) - self.assertEqual(len(self.anime.characters), 1) - for character in self.anime.characters: - self.assertIsInstance(character, anime.Anime) - self.assertIn(3080, list(self.anime.characters)) + self.assertIsInstance(self.tested_object.characters, frozenset) + self.assertEqual(len(self.tested_object.characters), 1) + for character in self.tested_object.characters: + self.assertIsInstance(character, Anime) + self.assertIn(3080, list(self.tested_object.characters)) def test_sequals(self): - self.assertIsInstance(self.anime.sequels, frozenset) - self.assertEqual(len(self.anime.sequels), 1) - for sequal in self.anime.sequels: - self.assertIsInstance(sequal, anime.Anime) - self.assertIn(4472, list(self.anime.sequels)) + self.assertIsInstance(self.tested_object.sequels, frozenset) + self.assertEqual(len(self.tested_object.sequels), 1) + for sequal in self.tested_object.sequels: + self.assertIsInstance(sequal, Anime) + self.assertIn(4472, list(self.tested_object.sequels)) def test_prequels(self): - self.assertIsInstance(self.anime.prequels, frozenset) - self.assertEqual(len(self.anime.prequels), 0) - for prequel in self.anime.prequels: - self.assertIsInstance(prequel, anime.Anime) + self.assertIsInstance(self.tested_object.prequels, frozenset) + self.assertEqual(len(self.tested_object.prequels), 0) + for prequel in self.tested_object.prequels: + self.assertIsInstance(prequel, Anime) def test_alternative_versions(self): - self.assertIsInstance(self.anime.alternative_versions, frozenset) - self.assertEqual(len(self.anime.alternative_versions), 0) - for alternative_version in self.anime.alternative_versions: - self.assertIsInstance(alternative_version, anime.Anime) + self.assertIsInstance(self.tested_object.alternative_versions, frozenset) + self.assertEqual(len(self.tested_object.alternative_versions), 0) + for alternative_version in self.tested_object.alternative_versions: + self.assertIsInstance(alternative_version, Anime) def test_side_story(self): - self.assertIsInstance(self.anime.side_stories, frozenset) - self.assertEqual(len(self.anime.side_stories), 0) - for side_story in self.anime.side_stories: - self.assertIsInstance(side_story, anime.Anime) + self.assertIsInstance(self.tested_object.side_stories, frozenset) + self.assertEqual(len(self.tested_object.side_stories), 0) + for side_story in self.tested_object.side_stories: + self.assertIsInstance(side_story, Anime) def test_summaries(self): - self.assertIsInstance(self.anime.summaries, frozenset) - self.assertEqual(len(self.anime.summaries), 0) - for summary in self.anime.summaries: - self.assertIsInstance(summary, anime.Anime) + self.assertIsInstance(self.tested_object.summaries, frozenset) + self.assertEqual(len(self.tested_object.summaries), 0) + for summary in self.tested_object.summaries: + self.assertIsInstance(summary, Anime) def test_other(self): - self.assertIsInstance(self.anime.others, frozenset) - self.assertEqual(len(self.anime.others), 0) - for other in self.anime.others: - self.assertIsInstance(other, anime.Anime) + self.assertIsInstance(self.tested_object.others, frozenset) + self.assertEqual(len(self.tested_object.others), 0) + for other in self.tested_object.others: + self.assertIsInstance(other, Anime) def test_parent_stories(self): - self.assertIsInstance(self.anime.parent_stories, frozenset) - self.assertEqual(len(self.anime.parent_stories), 0) - for parent_story in self.anime.parent_stories: - self.assertIsInstance(parent_story, anime.Anime) + self.assertIsInstance(self.tested_object.parent_stories, frozenset) + self.assertEqual(len(self.tested_object.parent_stories), 0) + for parent_story in self.tested_object.parent_stories: + self.assertIsInstance(parent_story, Anime) def test_alternative_settings(self): - self.assertIsInstance(self.anime.alternative_settings, frozenset) - self.assertEqual(len(self.anime.alternative_settings), 0) - for alternative_setting in self.anime.alternative_settings: - self.assertIsInstance(alternative_setting, anime.Anime) + self.assertIsInstance(self.tested_object.alternative_settings, frozenset) + self.assertEqual(len(self.tested_object.alternative_settings), 0) + for alternative_setting in self.tested_object.alternative_settings: + self.assertIsInstance(alternative_setting, Anime) def test_full_stories(self): - self.assertIsInstance(self.anime.full_stories, frozenset) - self.assertEqual(len(self.anime.full_stories), 0) - for full_story in self.anime.full_stories: - self.assertIsInstance(full_story, anime.Anime) + self.assertIsInstance(self.tested_object.full_stories, frozenset) + self.assertEqual(len(self.tested_object.full_stories), 0) + for full_story in self.tested_object.full_stories: + self.assertIsInstance(full_story, Anime) def test_str(self): - self.assertEqual(str(self.anime), "") + self.tested_object.reload() + self.assertEqual(str(self.tested_object), "") class NoReloadTestCase(unittest.TestCase): def setUp(self): - self.anime = anime.Anime(ANIME_ID) - self.__reload = self.anime.reload - self.anime.reload = Mock(wraps=self.__reload) + self.tested_object = Anime(ANIME_ID) + self.__reload = self.tested_object.reload + self.tested_object.reload = Mock(wraps=self.__reload) def tearDown(self): - self.assertFalse(self.anime.reload.called) - anime.Anime._unregiter(self.anime) + self.assertFalse(self.tested_object.reload.called) + Anime._unregiter(self.tested_object) def test_id(self): - self.assertEqual(self.anime.id, ANIME_ID) + self.assertEqual(self.tested_object.id, ANIME_ID) def test_str(self): - self.assertEqual(str(self.anime), ''.format(ANIME_ID)) + self.assertEqual(str(self.tested_object), ''.format(ANIME_ID)) - def test___equal___anime_object(self): - self.assertEqual(self.anime, self.anime) + def test___equal___object(self): + self.assertEqual(self.tested_object, self.tested_object) - def test___equal___anime_id_int(self): - self.assertEqual(self.anime, ANIME_ID) + def test___equal___id_int(self): + self.assertEqual(self.tested_object, ANIME_ID) - def test___equal___anime_id_str(self): - self.assertEqual(self.anime, str(ANIME_ID)) + def test___equal___id_str(self): + self.assertEqual(self.tested_object, str(ANIME_ID)) def test___equald___not_equal(self): - self.assertNotEqual(self.anime, set()) + self.assertNotEqual(self.tested_object, set()) @unittest.skip("Delete is not working") def test_add_and_delete(self): account = Account(ACCOUNT_TEST_USERNAME, ACCOUNT_TEST_PASSWORD) - anm = anime.Anime(ADD_ANIME_ID) - my_anm = anm.add(account) + tested_object = Anime(ADD_ANIME_ID) + my_tested_object = tested_object.add(account) - self.assertIsInstance(my_anm, my_anime.MyAnime) + self.assertIsInstance(my_tested_object, MyAnime) account.animes.reload() - self.assertIn(my_anm, account.animes) + self.assertIn(my_tested_object, account.animes) - my_anm.delete() + my_tested_object.delete() account.animes.reload() - self.assertNotIn(my_anm, self.account.animes) + self.assertNotIn(my_tested_object, account.animes) def main(): diff --git a/tests/test_manga.py b/tests/test_manga.py index 0aa8a58..cc875a4 100644 --- a/tests/test_manga.py +++ b/tests/test_manga.py @@ -3,21 +3,23 @@ from os import path import bs4 -from pymal import anime -from pymal import manga -from pymal.account_objects import my_manga +from pymal.account import Account +from pymal.anime import Anime +from pymal.manga import Manga from pymal import global_functions +from pymal.account_objects.my_manga import MyManga -from tests.constants_for_testing import ADD_MANGA_ID, MANGA_ID, SOURCES_DIRECTORY +from tests.constants_for_testing import ADD_MANGA_ID, MANGA_ID, ACCOUNT_TEST_USERNAME, ACCOUNT_TEST_PASSWORD,\ + SOURCES_DIRECTORY class FetchWebTestCase(unittest.TestCase): @classmethod def setUpClass(cls): - cls.manga = manga.Manga(MANGA_ID) + cls.tested_object = Manga(MANGA_ID) def test_fetch_web(self): - self.manga.reload() + self.tested_object.reload() class ReloadTestCase(unittest.TestCase): @@ -32,169 +34,184 @@ def setUpClass(cls): content_wrapper_div = myanimelist_div.find(name="div", attrs={"id": "contentWrapper"}, recursive=False) global_functions.get_content_wrapper_div = Mock(return_value=content_wrapper_div) + def setUp(self): + self.tested_object = Manga(MANGA_ID) + self.__reload = self.tested_object.reload + self.tested_object.reload = Mock(wraps=self.__reload) + @classmethod def tearDownClass(cls): global_functions.get_content_wrapper_div = cls.__global_functions_get_content_wrapper_div - def setUp(self): - self.manga = manga.Manga(MANGA_ID) - self.__reload = self.manga.reload - self.manga.reload = Mock(wraps=self.__reload) - def tearDown(self): - self.manga.reload.assert_called_once_with() - manga.Manga._unregiter(self.manga) + self.tested_object.reload.assert_called_once_with() + Manga._unregiter(self.tested_object) + + def test_title(self): + self.assertEqual(self.tested_object.title, 'Lucky☆Star') - def test_manga_title(self): - self.assertEqual(self.manga.english, 'Lucky ☆ Star') + def test_image_url(self): + self.assertIsInstance(self.tested_object.image_url, str) - def test_manga_image_url(self): - self.assertIsInstance(self.manga.image_url, str) + def test_english(self): + self.assertEqual(self.tested_object.english, 'Lucky ☆ Star') - def test_manga_english(self): - self.assertIsInstance(self.manga.english, str) + def test_synonyms(self): + self.assertIsInstance(self.tested_object.synonyms, str) - def test_manga_synonyms(self): - self.assertIsInstance(self.manga.synonyms, str) + def test_japanese(self): + self.assertIsInstance(self.tested_object.japanese, str) - def test_manga_japanese(self): - self.assertIsInstance(self.manga.japanese, str) + def test_type(self): + self.assertIsInstance(self.tested_object.type, str) - def test_manga_type(self): - self.assertIsInstance(self.manga.type, str) + def test_status(self): + self.assertIsInstance(self.tested_object.status, str) - def test_manga_chapters(self): + def test_chapters(self): try: - self.assertIsInstance(self.manga.chapters, int) + self.assertIsInstance(self.tested_object.chapters, int) except AssertionError: - self.assertEqual(self.manga.chapters, float('inf')) - self.assertEqual(self.manga.chapters, self.manga.volumes) + self.assertEqual(self.tested_object.chapters, float('inf')) + self.assertEqual(self.tested_object.chapters, self.tested_object.volumes) - def test_manga_volumes(self): + def test_volumes(self): try: - self.assertIsInstance(self.manga.volumes, int) + self.assertIsInstance(self.tested_object.volumes, int) except AssertionError: - self.assertEqual(self.manga.volumes, float('inf')) + self.assertEqual(self.tested_object.volumes, float('inf')) - def test_manga_start_time(self): - self.assertIsInstance(self.manga.start_time, float) + def test_start_time(self): + self.assertIsInstance(self.tested_object.start_time, float) - def test_manga_end_time(self): - self.assertIsInstance(self.manga.end_time, float) + def test_end_time(self): + self.assertIsInstance(self.tested_object.end_time, float) - def test_manga_score(self): - self.assertIsInstance(self.manga.score, float) + def test_creators(self): + self.assertIsInstance(self.tested_object.creators, dict) - def test_manga_rank(self): - self.assertIsInstance(self.manga.rank, int) + def test_genres(self): + self.assertIsInstance(self.tested_object.genres, dict) - def test_manga_popularity(self): - self.assertIsInstance(self.manga.popularity, int) + def test_score(self): + self.assertIsInstance(self.tested_object.score, float) - def test_manga_synopsis(self): - self.assertIsInstance(self.manga.synopsis, str) + def test_rank(self): + self.assertIsInstance(self.tested_object.rank, int) - def test_manga_spinoff(self): - self.assertIsInstance(self.manga.spin_offs, frozenset) - for spin_off in self.manga.spin_offs: - self.assertIsInstance(spin_off, manga.Manga) + def test_popularity(self): + self.assertIsInstance(self.tested_object.popularity, int) - def test_manga_adaptations(self): - self.assertIsInstance(self.manga.adaptations, frozenset) - for adaptation in self.manga.adaptations: - self.assertIsInstance(adaptation, anime.Anime) + def test_synopsis(self): + self.assertIsInstance(self.tested_object.synopsis, str) - def test_manga_characters(self): - self.assertIsInstance(self.manga.characters, frozenset) - for character in self.manga.characters: - self.assertIsInstance(character, manga.Manga) + def test_spinoff(self): + self.assertIsInstance(self.tested_object.spin_offs, frozenset) + for spin_off in self.tested_object.spin_offs: + self.assertIsInstance(spin_off, Manga) - def test_manga_sequals(self): - self.assertIsInstance(self.manga.sequels, frozenset) - for sequal in self.manga.sequels: - self.assertIsInstance(sequal, manga.Manga) + def test_adaptations(self): + self.assertIsInstance(self.tested_object.adaptations, frozenset) + for adaptation in self.tested_object.adaptations: + self.assertIsInstance(adaptation, Anime) - def test_manga_prequel(self): - self.assertIsInstance(self.manga.prequels, frozenset) - for prequel in self.manga.prequels: - self.assertIsInstance(prequel, manga.Manga) + def test_characters(self): + self.assertIsInstance(self.tested_object.characters, frozenset) + for character in self.tested_object.characters: + self.assertIsInstance(character, Manga) - def test_manga_alternative_versions(self): - self.assertIsInstance(self.manga.alternative_versions, frozenset) - for alternative_version in self.manga.alternative_versions: - self.assertIsInstance(alternative_version, manga.Manga) + def test_sequals(self): + self.assertIsInstance(self.tested_object.sequels, frozenset) + for sequal in self.tested_object.sequels: + self.assertIsInstance(sequal, Manga) - def test_manga_side_story(self): - self.assertIsInstance(self.manga.side_stories, frozenset) - for side_story in self.manga.side_stories: - self.assertIsInstance(side_story, manga.Manga) + def test_prequels(self): + self.assertIsInstance(self.tested_object.prequels, frozenset) + for prequel in self.tested_object.prequels: + self.assertIsInstance(prequel, Manga) - def test_manga_summaries(self): - self.assertIsInstance(self.manga.summaries, frozenset) - for summary in self.manga.summaries: - self.assertIsInstance(summary, manga.Manga) + def test_alternative_versions(self): + self.assertIsInstance(self.tested_object.alternative_versions, frozenset) + for alternative_version in self.tested_object.alternative_versions: + self.assertIsInstance(alternative_version, Manga) - def test_manga_other(self): - self.assertIsInstance(self.manga.others, frozenset) - for other in self.manga.others: - self.assertIsInstance(other, manga.Manga) + def test_side_story(self): + self.assertIsInstance(self.tested_object.side_stories, frozenset) + for side_story in self.tested_object.side_stories: + self.assertIsInstance(side_story, Manga) - def test_manga_parent_stories(self): - self.assertIsInstance(self.manga.parent_stories, frozenset) - for parent_story in self.manga.parent_stories: - self.assertIsInstance(parent_story, manga.Manga) + def test_summaries(self): + self.assertIsInstance(self.tested_object.summaries, frozenset) + for summary in self.tested_object.summaries: + self.assertIsInstance(summary, Manga) - def test_manga_alternative_settings(self): - self.assertIsInstance(self.manga.alternative_settings, frozenset) - for alternative_setting in self.manga.alternative_settings: - self.assertIsInstance(alternative_setting, manga.Manga) + def test_other(self): + self.assertIsInstance(self.tested_object.others, frozenset) + for other in self.tested_object.others: + self.assertIsInstance(other, Manga) + + def test_parent_stories(self): + self.assertIsInstance(self.tested_object.parent_stories, frozenset) + for parent_story in self.tested_object.parent_stories: + self.assertIsInstance(parent_story, Manga) + + def test_alternative_settings(self): + self.assertIsInstance(self.tested_object.alternative_settings, frozenset) + for alternative_setting in self.tested_object.alternative_settings: + self.assertIsInstance(alternative_setting, Manga) + + def test_full_stories(self): + self.assertIsInstance(self.tested_object.full_stories, frozenset) + self.assertEqual(len(self.tested_object.full_stories), 0) + for full_story in self.tested_object.full_stories: + self.assertIsInstance(full_story, Manga) def test_str(self): - self.manga.reload() - self.assertEqual(str(self.manga), '') + self.tested_object.reload() + self.assertEqual(str(self.tested_object), '') class NoReloadTestCase(unittest.TestCase): - def setUp(self): - self.manga = manga.Manga(MANGA_ID) - self.__reload = self.manga.reload - self.manga.reload = Mock(wraps=self.__reload) + self.tested_object = Manga(MANGA_ID) + self.__reload = self.tested_object.reload + self.tested_object.reload = Mock(wraps=self.__reload) def tearDown(self): - self.assertFalse(self.manga.reload.called) - manga.Manga._unregiter(self.manga) + self.assertFalse(self.tested_object.reload.called) + Manga._unregiter(self.tested_object) def test_id(self): - self.assertIsInstance(self.manga.id, int) + self.assertIsInstance(self.tested_object.id, int) def test_str(self): - self.assertEqual(str(self.manga), '') + self.assertEqual(str(self.tested_object), '') - def test___equal___manga_object(self): - self.assertEqual(self.manga, self.manga) + def test___equal___object(self): + self.assertEqual(self.tested_object, self.tested_object) - def test___equal___manga_id_int(self): - self.assertEqual(self.manga, MANGA_ID) + def test___equal___id_int(self): + self.assertEqual(self.tested_object, MANGA_ID) - def test___equal___manga_id_str(self): - self.assertEqual(self.manga, str(MANGA_ID)) + def test___equal___id_str(self): + self.assertEqual(self.tested_object, str(MANGA_ID)) def test___equald___not_equal(self): - self.assertNotEqual(self.manga, set()) + self.assertNotEqual(self.tested_object, set()) @unittest.skip("Delete is not working") def test_add_and_delete(self): - mng = manga.Manga(ADD_MANGA_ID) - my_mng = mng.add(self.account) + account = Account(ACCOUNT_TEST_USERNAME, ACCOUNT_TEST_PASSWORD) + tested_object = Manga(ADD_MANGA_ID) + my_tested_object = tested_object.add(account) - self.assertIsInstance(my_mng, my_manga.MyManga) - self.account.mangas.reload() - self.assertIn(my_mng, self.account.mangas) + self.assertIsInstance(my_tested_object, MyManga) + account.mangas.reload() + self.assertIn(my_tested_object, account.mangas) - my_mng.delete() - self.account.mangas.reload() - self.assertNotIn(my_mng, self.account.mangas) + my_tested_object.delete() + account.mangas.reload() + self.assertNotIn(my_tested_object, account.mangas) def main(): From aedaa41d65439bdb35e7d26a79cbd5c477f56a4e Mon Sep 17 00:00:00 2001 From: tomer gelber Date: Wed, 8 Oct 2014 23:36:46 +0300 Subject: [PATCH 5/8] trying to improve coverall --- pymal/inner_objects/media.py | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/pymal/inner_objects/media.py b/pymal/inner_objects/media.py index c35d47d..a862499 100644 --- a/pymal/inner_objects/media.py +++ b/pymal/inner_objects/media.py @@ -77,17 +77,6 @@ def _CREATORS_HEADER(self): """ return '' - @property - def _GLOBAL_MAL_URL(self): - """ - :rtype: str - """ - return request.urljoin(consts.HOST_NAME, self._NAME.lower() + "/{0:d}") - - @property - def _MY_MAL_ADD_URL(self): - return request.urljoin(consts.HOST_NAME, 'api/' + self._NAME.lower() + 'list/add/{0:d}.xml') - def __init__(self, mal_id: int): """ :param mal_id: the anime id in mal. @@ -96,7 +85,7 @@ def __init__(self, mal_id: int): self.__id = mal_id self._is_loaded = False - self.__mal_url = self._GLOBAL_MAL_URL.format(self.__id) + self.__mal_url = request.urljoin(consts.HOST_NAME, self._NAME.lower() + "/" + str(self.__id)) self._side_bar_parser = [] @@ -636,7 +625,7 @@ def add(self, account): """ data = self.MY_MAL_XML_TEMPLATE.format(*self.DEFAULT_ADDING) xml = ''.join(map(lambda x: x.strip(), data.splitlines())) - delete_url = self.__MY_MAL_ADD_URL.format(self.id) + delete_url = request.urljoin(consts.HOST_NAME, 'api/' + self._NAME.lower() + 'list/add/' + str(self.id) + '.xml') ret = account.auth_connect( delete_url, data='data=' + xml, From f04837b53a8ba7a1674a099a67bc84a275eafee4 Mon Sep 17 00:00:00 2001 From: tomer gelber Date: Wed, 8 Oct 2014 23:53:58 +0300 Subject: [PATCH 6/8] removing __format__. trying to improved coveralls. --- pymal/inner_objects/media.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/pymal/inner_objects/media.py b/pymal/inner_objects/media.py index a862499..9bccb33 100644 --- a/pymal/inner_objects/media.py +++ b/pymal/inner_objects/media.py @@ -637,6 +637,3 @@ def add(self, account): def __repr__(self): title = '' if self.__title is None else ' ' + self.__title return "<{0:s}{1:s} id={2:d}>".format(self.__class__.__name__, title, self.__id) - - def __format__(self, format_spec): - return str(self).__format__(format_spec) From 73dfef4aadc0372199cfcb83d9674ee977dc2a85 Mon Sep 17 00:00:00 2001 From: tomer gelber Date: Thu, 9 Oct 2014 00:07:47 +0300 Subject: [PATCH 7/8] abstract has pass. remove '.coverager*' from ignore. added coveragerc to skip 'pass'. --- .coveragerc | 5 +++++ .gitignore | 1 - pymal/inner_objects/media.py | 15 +++++++-------- 3 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..cd9a054 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,5 @@ +[report] +# Regexes for lines to exclude from consideration +exclude_lines = + # Don't complain if non-runnable code isn't run: + pass diff --git a/.gitignore b/.gitignore index bc7496a..f05df8f 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,6 @@ pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ -.coverage* .cache nosetests.xml coverage.xml diff --git a/pymal/inner_objects/media.py b/pymal/inner_objects/media.py index 9bccb33..46615bb 100644 --- a/pymal/inner_objects/media.py +++ b/pymal/inner_objects/media.py @@ -59,7 +59,7 @@ def _NAME(self): """ :rtype: str """ - return '' + pass @property @abstractmethod @@ -67,7 +67,7 @@ def _TIMING_HEADER(self): """ :rtype: str """ - return '' + pass @property @abstractmethod @@ -75,7 +75,7 @@ def _CREATORS_HEADER(self): """ :rtype: str """ - return '' + pass def __init__(self, mal_id: int): """ @@ -402,7 +402,6 @@ def _genres_parse(self, genres_div: bs4.element.Tag): self.__genres[genre_link.text.strip()] = genre_link['href'] return 1 - def _timing_parse(self, timing_div: bs4.element.Tag): """ :param timing_div: timing
@@ -587,7 +586,7 @@ def MY_MAL_XML_TEMPLATE(self): """ :rtype: str """ - return '' + pass @property @abstractmethod @@ -595,7 +594,7 @@ def DEFAULT_ADDING(self): """ :rtype: tuple """ - return tuple() + pass @abstractmethod def _add_data_checker(self, ret: str): @@ -606,7 +605,7 @@ def _add_data_checker(self, ret: str): :rtype: int :exception MyAnimeListApiAddError: if Failed to add. """ - return 0 + pass @property @abstractmethod @@ -614,7 +613,7 @@ def _my_media(self): """ :rtype: class:`account_objects.MyAnime` or class:`account_objects.MyManga` """ - return object + pass def add(self, account): """ From e519f7a7c682e04f397630b0bd68b2970fbc9dbf Mon Sep 17 00:00:00 2001 From: tomer gelber Date: Thu, 9 Oct 2014 00:21:26 +0300 Subject: [PATCH 8/8] httpcache is part of setup, so no need for the try except --- pymal/global_functions.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pymal/global_functions.py b/pymal/global_functions.py index 66dd1a3..d4124a0 100644 --- a/pymal/global_functions.py +++ b/pymal/global_functions.py @@ -7,10 +7,7 @@ import time import requests -try: - import httpcache -except ImportError: - httpcache = None +import httpcache import bs4 from pymal import consts