def _fill_in_tempora_days(self, year: int) -> None: """ Days depending on variable date, such as Easter or Advent """ # Inserting blocks self._insert_block(self.calc_holy_family(year), self.blocks.POST_EPIPHANY) self._insert_block(self.calc_septuagesima(year), self.blocks.FROM_PRE_LENT_TO_POST_PENTECOST) self._insert_block(self.calc_saturday_before_24_sunday_after_pentecost(year), self.blocks.POST_EPIPHANY, reverse=True, overwrite=False) self._insert_block(self.calc_24_sunday_after_pentecost(year), self.blocks.WEEK_24_AFTER_PENTECOST) self._insert_block(self.calc_first_advent_sunday(year), self.blocks.ADVENT, stop_date=date(year, 12, 23)) self._insert_block(self.calc_ember_wednesday_september(year), self.blocks.EMBER_DAYS_SEPTEMBER) # Inserting single days date_ = self.calc_holy_name(year) self.calendar.get_day(date_).celebration = [Observance(TEMPORA_NAT2_0, date_, self.lang)] date_ = self.calc_christ_king(year) self.calendar.get_day(date_).celebration = [Observance(SANCTI_10_DUr, date_, self.lang)] date_ = self.calc_sunday_christmas_octave(year) if date_: self._insert_block(date_, self.blocks.NATIVITY_OCTAVE_SUNDAY) self._insert_block(date(year, 12, 29), self.blocks.NATIVITY_OCTAVE_FERIA, overwrite=False) self._insert_block(date(year, 12, 30), self.blocks.NATIVITY_OCTAVE_FERIA, overwrite=False) self._insert_block(date(year, 12, 31), self.blocks.NATIVITY_OCTAVE_FERIA, overwrite=False)
def test_get_proper_from_observance(): proper_vernacular, proper_latin = Observance(c.SANCTI_01_06, date(2018, 1, 6), language).get_proper() assert 'Objawienie' in proper_vernacular.title assert 'Ml 3:1' in proper_vernacular.get_section(INTROIT).body[0] assert 'Malach 3:1' in proper_latin.get_section(INTROIT).body[0] assert 'Deus, qui hodiérna die' in proper_latin.get_section(ORATIO).body[0]
def rule_bmv_office_on_saturday( calendar: Calendar, date_: date, tempora: List[Observance], observances: List[Observance], lang: str): # On feria Saturdays (4th class) the celebration is B. M. V. Saturdays on given period def _calc_proper_for_given_period(): if match(tempora, PATTERN_ADVENT): return TEMPORA_C_10A # B. M. V. Saturdays in Advent if date_ >= date(date_.year, 12, 25) or date_ < date(date_.year, 2, 2): return TEMPORA_C_10B # B. M. V. Saturdays between Nativity and Purification wednesday_in_holy_week, _ = calendar.find_day(TEMPORA_QUAD6_3) if date(date_.year, 2, 2) <= date_ < wednesday_in_holy_week: return TEMPORA_C_10C # B. M. V. Saturdays between Feb 2 and Wednesday in Holy Week if match(tempora, PATTERN_EASTER): return TEMPORA_C_10PASC # B. M. V. Saturdays in Easter period return TEMPORA_C_10T # B. M. V. Saturdays between Trinity Sunday and Saturday before 1st Sunday of Advent if date_.weekday() == 5: ranks = set([i.rank for i in observances]) if len(ranks) == 0 or (len(ranks) == 1 and ranks.pop() == 4): bmv_office = Observance(_calc_proper_for_given_period(), date_, lang) return [bmv_office], [i for i in observances if i.flexibility == 'sancti'][:1], []
def _fill_in_sancti_days(self) -> None: """ Days ascribed to a specific date """ for date_, day in self.calendar.items(): date_id = date_.strftime("%m-%d") days = [Observance(ii, date_, self.lang) for ii in self.blocks.SANCTI if ii.startswith("sancti:{}".format(date_id))] day.celebration.extend(days) day.celebration.sort(reverse=True)
def test_observance_compare(): rank_1_1 = Observance(c.TEMPORA_PASC7_0, date(2015, 5, 24), language) rank_1_2 = Observance(c.SANCTI_11_01, date(2015, 11, 1), language) rank_2_1 = Observance(c.TEMPORA_EPI1_0, date(2015, 1, 11), language) rank_2_2 = Observance(c.SANCTI_01_13, date(2015, 1, 13), language) rank_3_1 = Observance(c.TEMPORA_QUAD5_5, date(2015, 3, 27), language) rank_3_2 = Observance(c.SANCTI_03_28, date(2015, 3, 28), language) rank_4_1 = Observance(c.TEMPORA_PENT01_1, date(2015, 6, 1), language) rank_4_2 = Observance(c.SANCTI_08_09, date(2015, 8, 9), language) assert rank_1_1 == rank_1_2 assert rank_1_1 >= rank_1_2 assert rank_1_1 <= rank_1_2 assert rank_1_1 != rank_2_1 assert rank_1_1 > rank_2_1 assert rank_1_1 > rank_3_1 assert rank_1_1 > rank_4_1 assert rank_2_1 < rank_1_1 assert rank_2_1 == rank_2_2 assert rank_2_1 >= rank_2_2 assert rank_2_1 <= rank_2_2 assert rank_2_1 != rank_3_2 assert rank_2_1 > rank_3_1 assert rank_2_1 > rank_4_1 assert rank_3_1 < rank_1_1 assert rank_3_1 < rank_2_1 assert rank_3_1 == rank_3_2 assert rank_3_1 >= rank_3_2 assert rank_3_1 <= rank_3_2 assert rank_3_1 != rank_4_1 assert rank_3_1 > rank_4_1 assert rank_4_1 < rank_1_1 assert rank_4_1 < rank_2_1 assert rank_4_1 < rank_3_1 assert rank_4_1 != rank_3_1 assert rank_4_1 < rank_4_2 assert rank_4_1 >= rank_4_2 assert rank_4_1 <= rank_4_2
def _insert_block(self, start_date: date, block: tuple, stop_date: date = None, reverse: bool = False, overwrite: bool = True) -> None: """ Insert a block of related `Day` objects. :param start_date: date where first or last (if `reverse`=True) element of the block will be inserted :type start_date: date object :param block: list of day identifiers in established order :type block: list of strings :param stop_date: last date to insert block element :type stop_date: date object :param reverse: if False, identifiers will be put in days following `start_date` otherwise they'll be put in leading up days :param overwrite: if True, overwrite existing identifiers, else quit on first non empty day Example: start_date=2008-01-13, reverse=False block = [ 'tempora:epi1-0:2', 'tempora:epi1-1:4', 'tempora:epi1-2:4', ] Result: { ... datetime.date(2008, 1, 13): [<tempora:epi1-0:2>], datetime.date(2008, 1, 14): [<tempora:epi1-1:4>], datetime.date(2008, 1, 15): [<tempora:epi1-2:4'], ... } Example: start_date=2008-11-22, reverse=True block = [ 'tempora:epi6-3:4', 'tempora:epi6-4:4', 'tempora:epi6-5:4' ] Result: { ... datetime.date(2008, 11, 20): [<tempora:epi6-3:4>], datetime.date(2008, 11, 21): [<tempora:epi6-4:4>], datetime.date(2008, 11, 22): [<tempora:epi6-5:4>], ... } """ if reverse: block = reversed(block) for ii, observance_ids in enumerate(block): date_ = start_date + timedelta(days=ii if not reverse else -ii) # skip on empty day in a block if not observance_ids: continue # break on first non-empty day if self.calendar.get_day(date_).celebration and not overwrite: break # break on stop date if stop_date == date_ - timedelta(days=1): break self.calendar.get_day(date_).tempora = [Observance(obs_id, date_, self.lang) for obs_id in observance_ids] self.calendar.get_day(date_).celebration = copy(self.calendar.get_day(date_).tempora)
def test_observance_has_proper_rank(day_id, date_, expected_rank): assert Observance(day_id, date(*date_), language).rank == expected_rank
def test_observance_falls_in_proper_weekday(day_id, date_, expected_weekday): assert Observance(day_id, date(*date_), language).weekday == expected_weekday