class OperatingRevenueFeedBuilder: def __init__(self): self.account_synonym = AccountSynonym() self.date_utils = DateUtils() def build(self, dao): tuple_feed = self.__build_tuple(dao) return OperatingRevenueFeed(tuple_feed) def __build_tuple(self, dao): feed = [] release_date = self.date_utils.get_last_date_of_month(dao.get_date()) stock_symbol = dao.get_stock_symbol() for account, value in dao.get_row_list(): if self.account_synonym.get(account) == u"當月營收": entry = { "release_date": release_date, "stock_symbol": stock_symbol, "stmt_date": self.date_utils.get_last_date_of_month(release_date), "account": u"當月營收", "account_order": 1, "value": value, } feed.append(entry) return tuple(feed)
class OperatingRevenueSummaryFeedBuilder: def __init__(self): self.date_utils = DateUtils() def build(self, dao): tuple_feed = self.__build_tuple(dao) return OperatingRevenueFeed(tuple_feed) def __build_tuple(self, dao): feed = [] stmt_date = self.date_utils.get_last_date_of_month(dao.get_stmt_date()) release_date = dao.get_release_date() for row in dao.get_row_list(): stock_symbol = row[0] this_month_value = row[2] last_month_value = row[3] entry = { "release_date": release_date, "stock_symbol": stock_symbol, "stmt_date": stmt_date, "account": u"當月營收", "account_order": 1, "value": this_month_value, } feed.append(entry) entry = { "release_date": release_date, "stock_symbol": stock_symbol, "stmt_date": self.date_utils.get_last_date_of_prev_month(stmt_date), "account": u"上月營收", "account_order": 2, "value": last_month_value, } feed.append(entry) return tuple(feed)
class OperatingRevenueSummaryAssembler: def __init__(self): self.content_screener = ContentScreener() self.date_utils = DateUtils() self.string_utils = StringUtils() def assemble(self, param): content, date = param["content"], param["date"] self.content_screener.screen(param) stmt_date = self.date_utils.get_last_date_of_month(date) column_name_list, row_list, release_date = self.__assemble_summary(content) return OperatingRevenueSummaryDao(column_name_list, row_list, stmt_date, release_date) def __assemble_summary(self, html_object): try: return AriesParser().parse(html_object) except AssertionError: return self.__assemble_summary_step_1(html_object) def __assemble_summary_step_1(self, html_object): try: return TaurusParser().parse(html_object) except AssertionError: return self.__assemble_summary_step_2(html_object) def __assemble_summary_step_2(self, html_object): try: return GeminiParser().parse(html_object) except AssertionError: return self.__assemble_summary_step_3(html_object) def __assemble_summary_step_3(self, html_object): try: return CancerParser().parse(html_object) except AssertionError: return LeoParser().parse(html_object)
class DateUtilsTest(unittest.TestCase): def setUp(self): self.date_utils = DateUtils() def tearDown(self): self.date_utils = None def test_get_last_date_of_month(self): actual = self.date_utils.get_last_date_of_month(datetime.date(2010, 1, 1)) expected = datetime.date(2010, 1, 31) self.assertEqual(actual, expected) def test_get_last_date_of_prev_month(self): actual = self.date_utils.get_last_date_of_prev_month(datetime.date(2010, 1, 1)) expected = datetime.date(2009, 12, 31) self.assertEqual(actual, expected) def test_get_last_date_of_quarter(self): actual = self.date_utils.get_last_date_of_quarter(datetime.date(2010, 1, 1)) expected = datetime.date(2010, 3, 31) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_quarter(datetime.date(2010, 3, 31)) expected = datetime.date(2010, 3, 31) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_quarter(datetime.date(2010, 4, 1)) expected = datetime.date(2010, 6, 30) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_quarter(datetime.date(2010, 6, 30)) expected = datetime.date(2010, 6, 30) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_quarter(datetime.date(2010, 7, 1)) expected = datetime.date(2010, 9, 30) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_quarter(datetime.date(2010, 9, 30)) expected = datetime.date(2010, 9, 30) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_quarter(datetime.date(2010, 10, 1)) expected = datetime.date(2010, 12, 31) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_quarter(datetime.date(2010, 12, 31)) expected = datetime.date(2010, 12, 31) self.assertEqual(actual, expected) def test_get_last_date_of_next_quarter(self): actual = self.date_utils.get_last_date_of_next_quarter(datetime.date(2010, 1, 1)) expected = datetime.date(2010, 6, 30) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_next_quarter(datetime.date(2010, 3, 31)) expected = datetime.date(2010, 6, 30) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_next_quarter(datetime.date(2010, 4, 1)) expected = datetime.date(2010, 9, 30) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_next_quarter(datetime.date(2010, 6, 30)) expected = datetime.date(2010, 9, 30) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_next_quarter(datetime.date(2010, 7, 1)) expected = datetime.date(2010, 12, 31) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_next_quarter(datetime.date(2010, 9, 30)) expected = datetime.date(2010, 12, 31) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_next_quarter(datetime.date(2010, 10, 1)) expected = datetime.date(2011, 3, 31) self.assertEqual(actual, expected) actual = self.date_utils.get_last_date_of_next_quarter(datetime.date(2010, 12, 31)) expected = datetime.date(2011, 3, 31) self.assertEqual(actual, expected) def test_range_date_by_month(self): actual = self.date_utils.range_date_by_month(datetime.date(2010, 9, 1), datetime.date(2011, 3, 15)) expected = [ datetime.date(2010, 9, 30), datetime.date(2010, 10, 31), datetime.date(2010, 11, 30), datetime.date(2010, 12, 31), datetime.date(2011, 1, 31), datetime.date(2011, 2, 28), datetime.date(2011, 3, 31), ] self.assertEqual(actual, expected) def test_range_date_by_quarter(self): actual = self.date_utils.range_date_by_quarter(datetime.date(2010, 9, 1), datetime.date(2011, 3, 15)) expected = [ datetime.date(2010, 9, 30), datetime.date(2010, 12, 31), datetime.date(2011, 3, 31), ] self.assertEqual(actual, expected)