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)
示例#2
0
    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)