def test_partially_overlapping_ranges(self): range_1 = TimeRange(datetime.date(2019, 2, 5), datetime.date(2019, 5, 2)) range_2 = TimeRange(datetime.date(2019, 3, 1), datetime.date(2019, 6, 5)) time_range_diff = TimeRangeDiff(range_1, range_2) self.assertEqual( TimeRange(datetime.date(2019, 3, 1), datetime.date(2019, 5, 2)), time_range_diff.overlapping_range) self.assertEqual( [TimeRange(datetime.date(2019, 2, 5), datetime.date(2019, 3, 1))], time_range_diff.range_1_non_overlapping_parts) self.assertEqual( [TimeRange(datetime.date(2019, 5, 2), datetime.date(2019, 6, 5))], time_range_diff.range_2_non_overlapping_parts) time_range_diff = TimeRangeDiff(range_2, range_1) self.assertEqual( TimeRange(datetime.date(2019, 3, 1), datetime.date(2019, 5, 2)), time_range_diff.overlapping_range) self.assertEqual( [TimeRange(datetime.date(2019, 5, 2), datetime.date(2019, 6, 5))], time_range_diff.range_1_non_overlapping_parts) self.assertEqual( [TimeRange(datetime.date(2019, 2, 5), datetime.date(2019, 3, 1))], time_range_diff.range_2_non_overlapping_parts)
def _get_portions_of_range_not_covered_by_periods_subset( time_range_to_cover: TimeRange, incarceration_periods_subset: List[StateIncarcerationPeriod] ) -> List[TimeRange]: """Returns a list of time ranges within the provided |time_range_to_cover| which the provided set of incarceration periods does not fully overlap. """ remaining_ranges_to_cover = [time_range_to_cover] for incarceration_period in incarceration_periods_subset: ip_time_range = TimeRange.for_incarceration_period( incarceration_period) new_remaining_ranges_to_cover = [] for time_range in remaining_ranges_to_cover: new_remaining_ranges_to_cover.extend( TimeRangeDiff( range_1=ip_time_range, range_2=time_range).range_2_non_overlapping_parts) remaining_ranges_to_cover = new_remaining_ranges_to_cover if not remaining_ranges_to_cover: break return remaining_ranges_to_cover
def supervision_period_counts_towards_supervision_population_in_date_range_state_specific( date_range: TimeRange, supervision_sentences: List[StateSupervisionSentence], incarceration_sentences: List[StateIncarcerationSentence], supervision_period: StateSupervisionPeriod) -> bool: """ Returns False if there is state-specific information to indicate that the supervision period should not count towards the supervision population in a range. Returns True if either there is a state-specific check that indicates that the supervision period should count or if there is no state-specific check to perform. """ if supervision_period.state_code == 'US_MO': sp_range = TimeRange.for_supervision_period(supervision_period) overlapping_range = TimeRangeDiff(range_1=date_range, range_2=sp_range).overlapping_range if not overlapping_range: return False return us_mo_get_most_recent_supervision_period_supervision_type_before_upper_bound_day( upper_bound_exclusive_date=overlapping_range. upper_bound_exclusive_date, lower_bound_inclusive_date=overlapping_range. lower_bound_inclusive_date, incarceration_sentences=incarceration_sentences, supervision_sentences=supervision_sentences) is not None return True
def test_exactly_overlapping_ranges(self): range_1 = TimeRange.for_month(2019, 2) range_2 = TimeRange.for_month(2019, 2) time_range_diff = TimeRangeDiff(range_1, range_2) self.assertEqual(range_1, time_range_diff.overlapping_range) self.assertEqual([], time_range_diff.range_1_non_overlapping_parts) self.assertEqual([], time_range_diff.range_2_non_overlapping_parts)