# Buggy code
def holidays(self, start=None, end=None, return_name=False):
    """
    Returns a curve with holidays between start_date and end_date

    Parameters
    ----------
    start : starting date, datetime-like, optional
    end : ending date, datetime-like, optional
    return_name : bool, optional
        If True, return a series that has dates and holiday names.
        False will only return a DatetimeIndex of dates.

    Returns
    -------
        DatetimeIndex of holidays
    """
    if self.rules is None:
        raise Exception(
            f"Holiday Calendar {self.name} does not have any rules specified"
        )

    if start is None:
        start = AbstractHolidayCalendar.start_date

    if end is None:
        end = AbstractHolidayCalendar.end_date

    start = Timestamp(start)
    end = Timestamp(end)

    holidays = None
    # If we don't have a cache or the dates are outside the prior cache, we
    # get them again
    if self._cache is None or start < self._cache[0] or end > self._cache[1]:
        for rule in self.rules:
            rule_holidays = rule.dates(start, end, return_name=True)

            if holidays is None:
                holidays = rule_holidays
            else:
                holidays = holidays.append(rule_holidays)

        self._cache = (start, end, holidays.sort_index())

    holidays = self._cache[2]
    holidays = holidays[start:end]

    if return_name:
        return holidays
    else:
        return holidays.index


# Traceback (AttributeError)
In [58]: cal.holidays(pd.Timestamp('01-Jan-2020'), pd.Timestamp('01-Jan-2021'))
Traceback (most recent call last):

File "<ipython-input-58-022244d4e794>", line 1, in <module>
cal.holidays(pd.Timestamp('01-Jan-2020'), pd.Timestamp('01-Jan-2021'))

File "C:\Users\dhirschf\envs\dev\lib\site-packages\pandas\tseries\holiday.py", line 422, in holidays
self._cache = (start, end, holidays.sort_index())

AttributeError: 'NoneType' object has no attribute 'sort_index'

In [59]: pd.__version__
Out[59]: '0.25.3'

# Fixed code
def holidays(self, start=None, end=None, return_name=False):
    """
    Returns a curve with holidays between start_date and end_date

    Parameters
    ----------
    start : starting date, datetime-like, optional
    end : ending date, datetime-like, optional
    return_name : bool, optional
        If True, return a series that has dates and holiday names.
        False will only return a DatetimeIndex of dates.

    Returns
    -------
        DatetimeIndex of holidays
    """
    if self.rules is None:
        raise Exception(
            f"Holiday Calendar {self.name} does not have any rules specified"
        )

    if start is None:
        start = AbstractHolidayCalendar.start_date

    if end is None:
        end = AbstractHolidayCalendar.end_date

    start = Timestamp(start)
    end = Timestamp(end)

    # If we don't have a cache or the dates are outside the prior cache, we
    # get them again
    if self._cache is None or start < self._cache[0] or end > self._cache[1]:
        holidays = [rule.dates(start, end, return_name=True) for rule in self.rules]
        if holidays:
            holidays = concat(holidays)
        else:
            holidays = Series(index=DatetimeIndex([]), dtype=object)

        self._cache = (start, end, holidays.sort_index())

    holidays = self._cache[2]
    holidays = holidays[start:end]

    if return_name:
        return holidays
    else:
        return holidays.index