books: Add date-fetching methods to FiscalYear.
This commit is contained in:
		
							parent
							
								
									d3ef19c5f6
								
							
						
					
					
						commit
						944c19da8d
					
				
					 2 changed files with 63 additions and 0 deletions
				
			
		| 
						 | 
					@ -50,6 +50,19 @@ class FiscalYear(NamedTuple):
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return date.year
 | 
					            return date.year
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def first_date(self, year: Year) -> datetime.date:
 | 
				
			||||||
 | 
					        if isinstance(year, datetime.date):
 | 
				
			||||||
 | 
					            year = self.for_date(year)
 | 
				
			||||||
 | 
					        return datetime.date(year, self.month, self.day)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def last_date(self, year: Year) -> datetime.date:
 | 
				
			||||||
 | 
					        return self.next_fy_date(year) - datetime.timedelta(days=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def next_fy_date(self, year: Year) -> datetime.date:
 | 
				
			||||||
 | 
					        if isinstance(year, datetime.date):
 | 
				
			||||||
 | 
					            year = self.for_date(year)
 | 
				
			||||||
 | 
					        return datetime.date(year + 1, self.month, self.day)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def range(self, from_fy: Year, to_fy: Optional[Year]=None) -> Iterable[int]:
 | 
					    def range(self, from_fy: Year, to_fy: Optional[Year]=None) -> Iterable[int]:
 | 
				
			||||||
        """Return a range of fiscal years
 | 
					        """Return a range of fiscal years
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,3 +134,53 @@ def test_range_offset_only(cy_fy, year_offset):
 | 
				
			||||||
        expected = range(year, year + year_offset + 1)
 | 
					        expected = range(year, year + year_offset + 1)
 | 
				
			||||||
    actual = list(cy_fy.range(year_offset))
 | 
					    actual = list(cy_fy.range(year_offset))
 | 
				
			||||||
    assert actual == list(expected)
 | 
					    assert actual == list(expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.mark.parametrize('year', range(2016, 2022))
 | 
				
			||||||
 | 
					def test_first_date_year_arg(conservancy_fy, year):
 | 
				
			||||||
 | 
					    assert conservancy_fy.first_date(year) == datetime.date(year, 3, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.mark.parametrize('date', [
 | 
				
			||||||
 | 
					    datetime.date(2019, 1, 1),
 | 
				
			||||||
 | 
					    datetime.date(2019, 10, 10),
 | 
				
			||||||
 | 
					    datetime.date(2020, 2, 2),
 | 
				
			||||||
 | 
					    datetime.date(2020, 12, 12),
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 | 
					def test_first_date_date_arg(conservancy_fy, date):
 | 
				
			||||||
 | 
					    year = date.year
 | 
				
			||||||
 | 
					    if date.month < 3:
 | 
				
			||||||
 | 
					        year -= 1
 | 
				
			||||||
 | 
					    assert conservancy_fy.first_date(date) == datetime.date(year, 3, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.mark.parametrize('year', range(2016, 2022))
 | 
				
			||||||
 | 
					def test_last_date_year_arg(conservancy_fy, year):
 | 
				
			||||||
 | 
					    day = 28 if year % 4 else 29
 | 
				
			||||||
 | 
					    assert conservancy_fy.last_date(year - 1) == datetime.date(year, 2, day)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.mark.parametrize('date', [
 | 
				
			||||||
 | 
					    datetime.date(2019, 1, 1),
 | 
				
			||||||
 | 
					    datetime.date(2019, 10, 10),
 | 
				
			||||||
 | 
					    datetime.date(2020, 2, 2),
 | 
				
			||||||
 | 
					    datetime.date(2020, 12, 12),
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 | 
					def test_last_date_date_arg(conservancy_fy, date):
 | 
				
			||||||
 | 
					    year = date.year
 | 
				
			||||||
 | 
					    if date.month >= 3:
 | 
				
			||||||
 | 
					        year += 1
 | 
				
			||||||
 | 
					    day = 28 if year % 4 else 29
 | 
				
			||||||
 | 
					    assert conservancy_fy.last_date(date) == datetime.date(year, 2, day)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.mark.parametrize('year', range(2016, 2022))
 | 
				
			||||||
 | 
					def test_next_fy_date_year_arg(conservancy_fy, year):
 | 
				
			||||||
 | 
					    assert conservancy_fy.next_fy_date(year) == datetime.date(year + 1, 3, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.mark.parametrize('date', [
 | 
				
			||||||
 | 
					    datetime.date(2019, 1, 1),
 | 
				
			||||||
 | 
					    datetime.date(2019, 10, 10),
 | 
				
			||||||
 | 
					    datetime.date(2020, 2, 29),
 | 
				
			||||||
 | 
					    datetime.date(2020, 12, 12),
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 | 
					def test_next_fy_date_date_arg(conservancy_fy, date):
 | 
				
			||||||
 | 
					    year = date.year
 | 
				
			||||||
 | 
					    if date.month >= 3:
 | 
				
			||||||
 | 
					        year += 1
 | 
				
			||||||
 | 
					    assert conservancy_fy.next_fy_date(date) == datetime.date(year, 3, 1)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue