holidays-0.9.3/0000755000175000017500000000000013230430403013603 5ustar maurimauri00000000000000holidays-0.9.3/setup.py0000644000175000017500000000434613230413420015324 0ustar maurimauri00000000000000# python-holidays # --------------- # A fast, efficient Python library for generating country, province and state # specific sets of holidays on the fly. It aims to make determining whether a # specific date is a holiday as fast and flexible as possible. # # Author: ryanss (c) 2014-2017 # dr-prodigy (c) 2018 # Website: https://github.com/dr-prodigy/python-holidays # License: MIT (see LICENSE file) import codecs import re try: from setuptools import setup except ImportError: from distutils.core import setup with codecs.open('holidays.py', 'r', 'utf-8') as fd: version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', fd.read(), re.MULTILINE).group(1) if not version: raise RuntimeError('Cannot find version information') setup( name='holidays', version=version, author='ryanss', author_email='ryanssdev@icloud.com', maintainer='dr-prodigy', maintainer_email='maurizio.montel@gmail.com', url='https://github.com/dr-prodigy/python-holidays', bugtrack_url='https://github.com/dr-prodigy/python-holidays/issues', license='MIT', py_modules=['holidays'], description='Generate and work with holidays in Python', long_description=codecs.open('README.rst', encoding='utf-8').read(), install_requires=['python-dateutil', 'six'], platforms='any', classifiers=[ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Office/Business :: Scheduling', 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Software Development :: Localization', ], ) holidays-0.9.3/README.rst0000644000175000017500000003412613230426737015317 0ustar maurimauri00000000000000=============== python-holidays =============== A fast, efficient Python library for generating country, province and state specific sets of holidays on the fly. It aims to make determining whether a specific date is a holiday as fast and flexible as possible. .. image:: http://img.shields.io/travis/dr-prodigy/python-holidays.svg :target: https://travis-ci.org/dr-prodigy/python-holidays .. image:: http://img.shields.io/coveralls/dr-prodigy/python-holidays.svg :target: https://coveralls.io/r/dr-prodigy/python-holidays .. image:: http://img.shields.io/pypi/v/holidays.svg :target: https://pypi.python.org/pypi/holidays .. image:: http://img.shields.io/pypi/l/holidays.svg :target: https://github.com/dr-prodigy/python-holidays/blob/master/LICENSE Example Usage ------------- .. code-block:: python from datetime import date import holidays us_holidays = holidays.UnitedStates() # or holidays.US() date(2015, 1, 1) in us_holidays # True date(2015, 1, 2) in us_holidays # False # The Holiday class will also recognize strings of any format # and int/float representing a Unix timestamp '2014-01-01' in us_holidays # True '1/1/2014' in us_holidays # True 1388597445 in us_holidays # True us_holidays.get('2014-01-01') # "New Year's Day" # Easily create custom Holiday objects with your own dates instead # of using the pre-defined countries/states/provinces available custom_holidays = holidays.HolidayBase() # Append custom holiday dates by passing: # 1) a dict with date/name key/value pairs, custom_holidays.append({"2015-01-01": "New Year's Day"}) # 2) a list of dates (in any format: date, datetime, string, integer), custom_holidays.append(['2015-07-01', '07/04/2015']) # 3) a single date item custom_holidays.append(date(2015, 12, 25)) date(2015, 1, 1) in custom_holidays # True date(2015, 1, 2) in custom_holidays # False '12/25/2015' in custom_holidays # True # For more complex logic like 4th Monday of January, you can inherit the # HolidayBase class and define your own _populate(year) method. See below # documentation for examples. Install ------- The latest stable version can always be installed or updated via pip: .. code-block:: bash $ pip install holidays If the above fails, please use easy_install instead: .. code-block:: bash $ easy_install holidays Available Countries ------------------- =================== ======== ============================================================= Country Abbr Provinces/States Available =================== ======== ============================================================= Australia AU prov = **ACT** (default), NSW, NT, QLD, SA, TAS, VIC, WA Austria AT prov = B, K, N, O, S, ST, T, V, **W** (default) Belgium BE None Canada CA prov = AB, BC, MB, NB, NL, NS, NT, NU, **ON** (default), PE, QC, SK, YU Colombia CO None Czech CZ None Denmark DK None England None EuropeanCentralBank ECB,TAR Trans-European Automated Real-time Gross Settlement (TARGET2) Finland FI None France FRA **Métropole** (default), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion, Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna Germany DE BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH Ireland IE Isle of Man None Italy IT prov = MI, RM Japan JP None Mexico MX None Netherlands NL None NewZealand NZ prov = NTL, AUK, TKI, HKB, WGN, MBH, NSN, CAN, STC, WTL, OTA, STL, CIT Northern Ireland None Norway NO None Polish PL None Portugal PT None PortugalExt PTE *Portugal plus extended days most people have off* Scotland None Slovenia SI None Slovakia SK None South Africa ZA None Spain ES prov = AND, ARG, AST, CAN, CAM, CAL, CAT, CVA, EXT, GAL, IBA, ICA, MAD, MUR, NAV, PVA, RIO Sweden SE None UnitedKingdom UK None UnitedStates US state = AL, AK, AS, AZ, AR, CA, CO, CT, DE, DC, FL, GA, GU, HI, ID, IL, IN, IA, KS, KY, LA, ME, MD, MH, MA, MI, FM, MN, MS, MO, MT, NE, NV, NH, NJ, NM, NY, NC, ND, MP, OH, OK, OR, PW, PA, PR, RI, SC, SD, TN, TX, UT, VT, VA, VI, WA, WV, WI, WY Wales None =================== ======== ============================================================= API --- class holidays.HolidayBase(years=[], expand=True, observed=True, prov=None, state=None) The base class used to create holiday country classes. Parameters: years An iterable list of integers specifying the years that the Holiday object should pre-generate. This would generally only be used if setting *expand* to False. (Default: []) expand A boolean value which specifies whether or not to append holidays in new years to the holidays object. (Default: True) observed A boolean value which when set to True will include the observed day of a holiday that falls on a weekend, when appropriate. (Default: True) prov A string specifying a province that has unique statutory holidays. (Default: Australia='ACT', Canada='ON', NewZealand=None) state A string specifying a state that has unique statutory holidays. (Default: UnitedStates=None) Methods: get(key, default=None) Returns a string containing the name of the holiday(s) in date `key`, which can be of date, datetime, string, unicode, bytes, integer or float type. If multiple holidays fall on the same date the names will be seperated by commas get_list(key) Same as `get` except returns a `list` of holiday names instead of a comma seperated string pop(key, default=None) Same as `get` except the key is removed from the holiday object update/append Accepts dictionary of {date: name} pairs, a list of dates, or even singular date/string/timestamp objects and adds them to the list of holidays More Examples ------------- .. code-block:: python # Simplest example possible >>> from datetime import date >>> import holidays >>> date(2014, 1, 1) in holidays.US() True >> date(2014, 1, 2) in holidays.US() False # But this is not efficient because it is initializing a new Holiday object # and generating a list of all the holidays in 2014 during each comparison # It is more efficient to create the object only once >>> us_holidays = holidays.US() >>> date(2014, 1, 1) in us_holidays True >> date(2014, 1, 2) in us_holidays False # Each country has two class names that can be called--a full name # and an abbreviation. Use whichever you prefer. >>> holidays.UnitedStates() == holidays.US() True >>> holidays.Canada() == holidays.CA() True >>> holidays.US() == holidays.CA() False # Let's print out the holidays in 2014 specific to California, USA >>> for date, name in sorted(holidays.US(state='CA', years=2014).items()): >>> print(date, name) 2014-01-01 New Year's Day 2014-01-20 Martin Luther King, Jr. Day 2014-02-15 Susan B. Anthony Day 2014-02-17 Washington's Birthday 2014-03-31 César Chávez Day 2014-05-26 Memorial Day 2014-07-04 Independence Day 2014-09-01 Labor Day 2014-10-13 Columbus Day 2014-11-11 Veterans Day 2014-11-27 Thanksgiving 2014-12-25 Christmas Day # So far we've only checked holidays in 2014 so that's the only year the # Holidays object has generated >>> us_holidays.years set([2014]) >>> len(us_holidays) 10 # Because by default the `expand` param is True the Holiday object will add # holidays from other years as they are required. >>> date(2013, 1, 1) in us_holidays True >>> us_holidays.years set([2013, 2014]) >>> len(us_holidays) 20 # If we change the `expand` param to False the Holiday object will no longer # add holidays from new years >>> us_holidays.expand = False >>> date(2012, 1, 1) in us_holidays False >>> us.holidays.expand = True >>> date(2012, 1, 1) in us_holidays True # January 1st, 2012 fell on a Sunday so the statutory holiday was observed # on the 2nd. By default the `observed` param is True so the holiday list # will include January 2nd, 2012 as a holiday. >>> date(2012, 1, 1) in us_holidays True >>> us_holidays[date(2012, 1, 1)] "New Year's Eve" >>> date(2012, 1, 2) in us_holidays True >>> us_holidays.get(date(2012 ,1, 2)) "New Year's Eve (Observed)" # The `observed` and `expand` values can both be changed on the fly and the # holiday list will be adjusted accordingly >>> us_holidays.observed = False >>> date(2012, 1, 2) in us_holidays False us_holidays.observed = True >> date(2012, 1, 2) in us_holidays True # Holiday objects can be added together and the resulting object will # generate the holidays from all of the initial objects >>> north_america = holidays.CA() + holidays.US() + holidays.MX() >>> north_america.get('2014-07-01') "Canada Day" >>> north_america.get('2014-07-04') "Independence Day" # The other form of addition is also available >>> north_america = holidays.Canada() >>> north_america += holidays.UnitedStates() >>> north_america += holidays.Mexico() >>> north_america.country ['CA', 'US', 'MX'] # We can even get a set of holidays that include all the province- or # state-specific holidays using the built-in sum() function >>> a = sum([holidays.CA(prov=x) for x in holidays.CA.PROVINCES]) >>> a.prov PROVINCES = ['AB', 'BC', 'MB', 'NB', 'NL', 'NS', 'NT', 'NU', 'ON', 'PE', 'QC', 'SK', 'YU'] # Sometimes we may not be able to use the official federal statutory # holiday list in our code. Let's pretend we work for a company that # does not include Columbus Day as a statutory holiday but does include # "Ninja Turtle Day" on July 13th. We can create a new class that inherits # the UnitedStates class and the only method we need to override is _populate() >>> from dateutil.relativedelta import relativedelta >>> class CorporateHolidays(holidays.UnitedStates): >>> def _populate(self, year): >>> # Populate the holiday list with the default US holidays >>> holidays.UnitedStates._populate(self, year) >>> # Remove Columbus Day >>> self.pop(date(year, 10, 1) + relativedelta(weekday=MO(+2)), None) >>> # Add Ninja Turtle Day >>> self[date(year, 7, 13)] = "Ninja Turtle Day" >>> date(2014, 10, 14) in Holidays(country="US") True >>> date(2014, 10, 14) in CorporateHolidays(country="US") False >>> date(2014, 7, 13) in Holidays(country="US") False >>> date(2014 ,7, 13) in CorporateHolidays(country="US") True # We can also inherit from the HolidayBase class which has an empty # _populate method so we start with no holidays and must define them # all ourself. This is how we would create a holidays class for a country # that is not supported yet. >>> class NewCountryHolidays(holidays.HolidayBase): >>> def _populate(self, year): >>> self[date(year, 1, 2)] = "Some Federal Holiday" >>> self[date(year, 2, 3)] = "Another Federal Holiday" >>> hdays = NewCountryHolidays() # We can also include prov/state specific holidays in our new class. >>> class NewCountryHolidays(holidays.HolidayBase): >>> def _populate(self, year): >>> # Set default prov if not provided >>> if self.prov == None: >>> self.prov = 'XX' >>> self[date(year, 1, 2)] = "Some Federal Holiday" >>> if self.prov == 'XX': >>> self[date(year, 2, 3)] = "Special XX province-only holiday" >>> if self.prov == 'YY': >>> self[date(year, 3, 4)] = "Special YY province-only holiday" >>> hdays = NewCountryHolidays() >>> hdays = NewCountryHolidays(prov='XX') # If you write the code necessary to create a holiday class for a country # not currently supported please contribute your code to the project! # Perhaps you just have a list of dates that are holidays and want to turn # them into a Holiday class to access all the useful functionality. You can # use the append() method which accepts a dictionary of {date: name} pairs, # a list of dates, or even singular date/string/timestamp objects. >>> custom_holidays = holidays.HolidaysBase() >>> custom_holidays.append(['2015-01-01', '07/04/2015']) >>> custom_holidays.append(date(2015, 12, 25)) Development Version ------------------- The latest development version can be installed directly from GitHub: .. code-block:: bash $ pip install --upgrade https://github.com/dr-prodigy/python-holidays/tarball/master Running Tests ------------- .. code-block:: bash $ pip install flake8 $ flake8 holidays.py tests.py $ python tests.py Coverage -------- .. code-block:: bash $ pip install coverage $ coverage run --omit=*site-packages* tests.py $ coverage report -m Contributions ------------- .. _issues: https://github.com/dr-prodigy/python-holidays/issues .. __: https://github.com/dr-prodigy/python-holidays/pulls Issues_ and `Pull Requests`__ are always welcome. License ------- .. __: https://github.com/dr-prodigy/python-holidays/raw/master/LICENSE Code and documentation are available according to the MIT License (see LICENSE__). holidays-0.9.3/holidays.py0000644000175000017500000032712413230430006016001 0ustar maurimauri00000000000000# -*- coding: utf-8 -*- # python-holidays # --------------- # A fast, efficient Python library for generating country, province and state # specific sets of holidays on the fly. It aims to make determining whether a # specific date is a holiday as fast and flexible as possible. # # Author: ryanss (c) 2014-2017 # dr-prodigy (c) 2018 # Website: https://github.com/dr-prodigy/python-holidays # License: MIT (see LICENSE file) from datetime import date, datetime from dateutil.easter import easter from dateutil.parser import parse from dateutil.relativedelta import relativedelta as rd from dateutil.relativedelta import MO, TU, WE, TH, FR, SA, SU import six __version__ = '0.9.3' MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY = range(7) WEEKEND = (SATURDAY, SUNDAY) class HolidayBase(dict): PROVINCES = [] def __init__(self, years=[], expand=True, observed=True, prov=None, state=None): self.observed = observed self.expand = expand if isinstance(years, int): years = [years, ] self.years = set(years) if not getattr(self, 'prov', False): self.prov = prov self.state = state for year in list(self.years): self._populate(year) def __setattr__(self, key, value): if key == 'observed' and len(self) > 0: dict.__setattr__(self, key, value) if value is True: # Add (Observed) dates years = list(self.years) self.years = set() self.clear() for year in years: self._populate(year) else: # Remove (Observed) dates for k, v in list(self.items()): if v.find("Observed") >= 0: del self[k] else: return dict.__setattr__(self, key, value) def __keytransform__(self, key): if isinstance(key, datetime): key = key.date() elif isinstance(key, date): key = key elif isinstance(key, int) or isinstance(key, float): key = datetime.utcfromtimestamp(key).date() elif isinstance(key, six.string_types): try: key = parse(key).date() except (ValueError, OverflowError): raise ValueError("Cannot parse date from string '%s'" % key) else: raise TypeError("Cannot convert type '%s' to date." % type(key)) if self.expand and key.year not in self.years: self.years.add(key.year) self._populate(key.year) return key def __contains__(self, key): return dict.__contains__(self, self.__keytransform__(key)) def __getitem__(self, key): return dict.__getitem__(self, self.__keytransform__(key)) def __setitem__(self, key, value): if key in self: if self.get(key).find(value) < 0 \ and value.find(self.get(key)) < 0: value = "%s, %s" % (value, self.get(key)) else: value = self.get(key) return dict.__setitem__(self, self.__keytransform__(key), value) def update(self, *args): args = list(args) for arg in args: if isinstance(arg, dict): for key, value in list(arg.items()): self[key] = value elif isinstance(arg, list): for item in arg: self[item] = "Holiday" else: self[arg] = "Holiday" def append(self, *args): return self.update(*args) def get(self, key, default=None): return dict.get(self, self.__keytransform__(key), default) def get_list(self, key): return [h for h in self.get(key, "").split(", ") if h] def pop(self, key, default=None): if default is None: return dict.pop(self, self.__keytransform__(key)) return dict.pop(self, self.__keytransform__(key), default) def __eq__(self, other): return dict.__eq__(self, other) and self.__dict__ == other.__dict__ def __ne__(self, other): return dict.__ne__(self, other) or self.__dict__ != other.__dict__ def __add__(self, other): if isinstance(other, int) and other == 0: # Required to sum() list of holidays # sum([h1, h2]) is equivalent to (0 + h1 + h2) return self elif not isinstance(other, HolidayBase): raise TypeError() HolidaySum = createHolidaySum(self, other) country = (getattr(self, 'country', None) or getattr(other, 'country', None)) if self.country and other.country and self.country != other.country: c1 = self.country if not isinstance(c1, list): c1 = [c1] c2 = other.country if not isinstance(c2, list): c2 = [c2] country = c1 + c2 prov = getattr(self, 'prov', None) or getattr(other, 'prov', None) if self.prov and other.prov and self.prov != other.prov: p1 = self.prov if isinstance(self.prov, list) else [self.prov] p2 = other.prov if isinstance(other.prov, list) else [other.prov] prov = p1 + p2 return HolidaySum(years=(self.years | other.years), expand=(self.expand or other.expand), observed=(self.observed or other.observed), country=country, prov=prov) def __radd__(self, other): return self.__add__(other) def _populate(self, year): pass def createHolidaySum(h1, h2): class HolidaySum(HolidayBase): def __init__(self, country, **kwargs): self.country = country self.holidays = [] if getattr(h1, 'holidays', False): for h in h1.holidays: self.holidays.append(h) else: self.holidays.append(h1) if getattr(h2, 'holidays', False): for h in h2.holidays: self.holidays.append(h) else: self.holidays.append(h2) HolidayBase.__init__(self, **kwargs) def _populate(self, year): for h in self.holidays[::-1]: h._populate(year) self.update(h) return HolidaySum class Canada(HolidayBase): PROVINCES = ['AB', 'BC', 'MB', 'NB', 'NL', 'NS', 'NT', 'NU', 'ON', 'PE', 'QC', 'SK', 'YU'] def __init__(self, **kwargs): self.country = 'CA' self.prov = kwargs.pop('prov', 'ON') HolidayBase.__init__(self, **kwargs) def _populate(self, year): # New Year's Day if year >= 1867: name = "New Year's Day" self[date(year, 1, 1)] = name if self.observed and date(year, 1, 1).weekday() == 6: self[date(year, 1, 1) + rd(days=+1)] = name + " (Observed)" elif self.observed and date(year, 1, 1).weekday() == 5: # Add Dec 31st from the previous year without triggering # the entire year to be added expand = self.expand self.expand = False self[date(year, 1, 1) + rd(days=-1)] = name + " (Observed)" self.expand = expand # The next year's observed New Year's Day can be in this year # when it falls on a Friday (Jan 1st is a Saturday) if self.observed and date(year, 12, 31).weekday() == 4: self[date(year, 12, 31)] = name + " (Observed)" # Family Day / Louis Riel Day (MB) / Islander Day (PE) # / Heritage Day (NS, YU) if self.prov in ('AB', 'SK', 'ON') and year >= 2008: self[date(year, 2, 1) + rd(weekday=MO(+3))] = "Family Day" elif self.prov in ('AB', 'SK') and year >= 2007: self[date(year, 2, 1) + rd(weekday=MO(+3))] = "Family Day" elif self.prov == 'AB' and year >= 1990: self[date(year, 2, 1) + rd(weekday=MO(+3))] = "Family Day" elif self.prov == 'BC' and year >= 2013: self[date(year, 2, 1) + rd(weekday=MO(+2))] = "Family Day" elif self.prov == 'MB' and year >= 2008: self[date(year, 2, 1) + rd(weekday=MO(+3))] = "Louis Riel Day" elif self.prov == 'PE' and year >= 2010: self[date(year, 2, 1) + rd(weekday=MO(+3))] = "Islander Day" elif self.prov == 'PE' and year == 2009: self[date(year, 2, 1) + rd(weekday=MO(+2))] = "Islander Day" elif self.prov in ('NS') and year >= 2015: # http://novascotia.ca/lae/employmentrights/NovaScotiaHeritageDay.asp self[date(year, 2, 1) + rd(weekday=MO(+3))] = "Heritage Day" elif self.prov in ('YU'): # start date? # http://heritageyukon.ca/programs/heritage-day # https://en.wikipedia.org/wiki/Family_Day_(Canada)#Yukon_Heritage_Day # Friday before the last Sunday in February dt = date(year, 3, 1) + rd(weekday=SU(-1)) + rd(weekday=FR(-1)) self[dt] = "Heritage Day" # St. Patrick's Day if self.prov == 'NL' and year >= 1900: dt = date(year, 3, 17) # Nearest Monday to March 17 dt1 = date(year, 3, 17) + rd(weekday=MO(-1)) dt2 = date(year, 3, 17) + rd(weekday=MO(+1)) if dt2 - dt <= dt - dt1: self[dt2] = "St. Patrick's Day" else: self[dt1] = "St. Patrick's Day" # Good Friday if self.prov != 'QC' and year >= 1867: self[easter(year) + rd(weekday=FR(-1))] = "Good Friday" # Easter Monday if self.prov == 'QC' and year >= 1867: self[easter(year) + rd(weekday=MO)] = "Easter Monday" # St. George's Day if self.prov == 'NL' and year == 2010: # 4/26 is the Monday closer to 4/23 in 2010 # but the holiday was observed on 4/19? Crazy Newfies! self[date(2010, 4, 19)] = "St. George's Day" elif self.prov == 'NL' and year >= 1990: dt = date(year, 4, 23) # Nearest Monday to April 23 dt1 = dt + rd(weekday=MO(-1)) dt2 = dt + rd(weekday=MO(+1)) if dt2 - dt < dt - dt1: self[dt2] = "St. George's Day" else: self[dt1] = "St. George's Day" # Victoria Day / National Patriots' Day (QC) if self.prov not in ('NB', 'NS', 'PE', 'NL', 'QC') and year >= 1953: self[date(year, 5, 24) + rd(weekday=MO(-1))] = "Victoria Day" elif self.prov == 'QC' and year >= 1953: name = "National Patriots' Day" self[date(year, 5, 24) + rd(weekday=MO(-1))] = name # National Aboriginal Day if self.prov == 'NT' and year >= 1996: self[date(year, 6, 21)] = "National Aboriginal Day" # St. Jean Baptiste Day if self.prov == 'QC' and year >= 1925: self[date(year, 6, 24)] = "St. Jean Baptiste Day" if self.observed and date(year, 6, 24).weekday() == 6: self[date(year, 6, 25)] = "St. Jean Baptiste Day (Observed)" # Discovery Day if self.prov == 'NL' and year >= 1997: dt = date(year, 6, 24) # Nearest Monday to June 24 dt1 = dt + rd(weekday=MO(-1)) dt2 = dt + rd(weekday=MO(+1)) if dt2 - dt <= dt - dt1: self[dt2] = "Discovery Day" else: self[dt1] = "Discovery Day" elif self.prov == 'YU' and year >= 1912: self[date(year, 8, 1) + rd(weekday=MO(+3))] = "Discovery Day" # Canada Day / Memorial Day (NL) if self.prov != 'NL' and year >= 1867: name = "Canada Day" self[date(year, 7, 1)] = name if self.observed and date(year, 7, 1).weekday() in (5, 6): self[date(year, 7, 1) + rd(weekday=MO)] = name + " (Observed)" elif year >= 1867: name = "Memorial Day" self[date(year, 7, 1)] = name if self.observed and date(year, 7, 1).weekday() in (5, 6): self[date(year, 7, 1) + rd(weekday=MO)] = name + " (Observed)" # Nunavut Day if self.prov == 'NU' and year >= 2001: self[date(year, 7, 9)] = "Nunavut Day" if self.observed and date(year, 7, 9).weekday() == 6: self[date(year, 7, 10)] = "Nunavut Day (Observed)" elif self.prov == 'NU' and year == 2000: self[date(2000, 4, 1)] = "Nunavut Day" # Civic Holiday if self.prov in ('ON', 'MB', 'NT') and year >= 1900: self[date(year, 8, 1) + rd(weekday=MO)] = "Civic Holiday" elif self.prov in ('AB') and year >= 1974: # https://en.wikipedia.org/wiki/Civic_Holiday#Alberta self[date(year, 8, 1) + rd(weekday=MO)] = "Heritage Day" elif self.prov in ('BC') and year >= 1974: # https://en.wikipedia.org/wiki/Civic_Holiday self[date(year, 8, 1) + rd(weekday=MO)] = "British Columbia Day" elif self.prov in ('NB') and year >= 1900: # https://en.wikipedia.org/wiki/Civic_Holiday self[date(year, 8, 1) + rd(weekday=MO)] = "New Brunswick Day" elif self.prov in ('SK') and year >= 1900: # https://en.wikipedia.org/wiki/Civic_Holiday self[date(year, 8, 1) + rd(weekday=MO)] = "Saskatchewan Day" # Labour Day if year >= 1894: self[date(year, 9, 1) + rd(weekday=MO)] = "Labour Day" # Thanksgiving if self.prov not in ('NB', 'NS', 'PE', 'NL') and year >= 1931: if year == 1935: # in 1935, Canadian Thanksgiving was moved due to the General # Election falling on the second Monday of October # https://books.google.ca/books?id=KcwlQsmheG4C&pg=RA1-PA1940&lpg=RA1-PA1940&dq=canada+thanksgiving+1935&source=bl&ots=j4qYrcfGuY&sig=gxXeAQfXVsOF9fOwjSMswPHJPpM&hl=en&sa=X&ved=0ahUKEwjO0f3J2PjOAhVS4mMKHRzKBLAQ6AEIRDAG#v=onepage&q=canada%20thanksgiving%201935&f=false self[date(1935, 10, 25)] = "Thanksgiving" else: self[date(year, 10, 1) + rd(weekday=MO(+2))] = "Thanksgiving" # Remembrance Day name = "Remembrance Day" provinces = ('ON', 'QC', 'NS', 'NL', 'NT', 'PE', 'SK') if self.prov not in provinces and year >= 1931: self[date(year, 11, 11)] = name elif self.prov in ('NS', 'NL', 'NT', 'PE', 'SK') and year >= 1931: self[date(year, 11, 11)] = name if self.observed and date(year, 11, 11).weekday() == 6: name = name + " (Observed)" self[date(year, 11, 11) + rd(weekday=MO)] = name # Christmas Day if year >= 1867: self[date(year, 12, 25)] = "Christmas Day" if self.observed and date(year, 12, 25).weekday() == 5: self[date(year, 12, 24)] = "Christmas Day (Observed)" elif self.observed and date(year, 12, 25).weekday() == 6: self[date(year, 12, 26)] = "Christmas Day (Observed)" # Boxing Day if year >= 1867: name = "Boxing Day" name_observed = name + " (Observed)" if self.observed and date(year, 12, 26).weekday() in (5, 6): self[date(year, 12, 26) + rd(weekday=MO)] = name_observed elif self.observed and date(year, 12, 26).weekday() == 0: self[date(year, 12, 27)] = name_observed else: self[date(year, 12, 26)] = name class CA(Canada): pass class Colombia(HolidayBase): # https://es.wikipedia.org/wiki/Anexo:D%C3%ADas_festivos_en_Colombia def __init__(self, **kwargs): self.country = 'CO' HolidayBase.__init__(self, **kwargs) def _populate(self, year): # Fixed date holidays! # If observed=True and they fall on a weekend they are not observed. # If observed=False there are 18 holidays # New Year's Day if self.observed and date(year, 1, 1).weekday() in WEEKEND: pass else: self[date(year, 1, 1)] = "Año Nuevo [New Year's Day]" # Labor Day self[date(year, 5, 1)] = "Día del Trabajo [Labour Day]" # Independence Day name = "Día de la Independencia [Independence Day]" if self.observed and date(year, 7, 20).weekday() in WEEKEND: pass else: self[date(year, 7, 20)] = name # Battle of Boyaca self[date(year, 8, 7)] = "Batalla de Boyacá [Battle of Boyacá]" # Immaculate Conception if self.observed and date(year, 12, 8).weekday() in WEEKEND: pass else: self[date(year, 12, 8) ] = "La Inmaculada Concepción [Immaculate Conception]" # Christmas self[date(year, 12, 25)] = "Navidad [Christmas]" # Emiliani Law holidays! # Unless they fall on a Monday they are observed the following monday # Epiphany name = "Día de los Reyes Magos [Epiphany]" if date(year, 1, 6).weekday() == 0 or not self.observed: self[date(year, 1, 6)] = name else: self[date(year, 1, 6) + rd(weekday=MO)] = name + "(Observed)" # Saint Joseph's Day name = "Día de San José [Saint Joseph's Day]" if date(year, 3, 19).weekday() == 0 or not self.observed: self[date(year, 3, 19)] = name else: self[date(year, 3, 19) + rd(weekday=MO)] = name + "(Observed)" # Saint Peter and Saint Paul's Day name = "San Pedro y San Pablo [Saint Peter and Saint Paul]" if date(year, 6, 29).weekday() == 0 or not self.observed: self[date(year, 6, 29)] = name else: self[date(year, 6, 29) + rd(weekday=MO)] = name + "(Observed)" # Assumption of Mary name = "La Asunción [Assumption of Mary]" if date(year, 8, 15).weekday() == 0 or not self.observed: self[date(year, 8, 15)] = name else: self[date(year, 8, 15) + rd(weekday=MO)] = name + "(Observed)" # Discovery of America name = "Descubrimiento de América [Discovery of America]" if date(year, 10, 12).weekday() == 0 or not self.observed: self[date(year, 10, 12)] = name else: self[date(year, 10, 12) + rd(weekday=MO)] = name + "(Observed)" # All Saints’ Day name = "Dia de Todos los Santos [All Saint's Day]" if date(year, 11, 1).weekday() == 0 or not self.observed: self[date(year, 11, 1)] = name else: self[date(year, 11, 1) + rd(weekday=MO)] = name + "(Observed)" # Independence of Cartagena name = "Independencia de Cartagena [Independence of Cartagena]" if date(year, 11, 11).weekday() == 0 or not self.observed: self[date(year, 11, 11)] = name else: self[date(year, 11, 11) + rd(weekday=MO)] = name + "(Observed)" # Holidays based on Easter # Maundy Thursday self[easter(year) + rd(weekday=TH(-1)) ] = "Jueves Santo [Maundy Thursday]" # Good Friday self[easter(year) + rd(weekday=FR(-1)) ] = "Viernes Santo [Good Friday]" # Holidays based on Easter but are observed the following monday # (unless they occur on a monday) # Ascension of Jesus name = "Ascensión del señor [Ascension of Jesus]" hdate = easter(year) + rd(days=+39) if hdate.weekday() == 0 or not self.observed: self[hdate] = name else: self[hdate + rd(weekday=MO)] = name + "(Observed)" # Corpus Christi name = "Corpus Christi [Corpus Christi]" hdate = easter(year) + rd(days=+60) if hdate.weekday() == 0 or not self.observed: self[hdate] = name else: self[hdate + rd(weekday=MO)] = name + "(Observed)" # Sacred Heart name = "Sagrado Corazón [Sacred Heart]" hdate = easter(year) + rd(days=+68) if hdate.weekday() == 0 or not self.observed: self[hdate] = name else: self[hdate + rd(weekday=MO)] = name + "(Observed)" class CO(Colombia): pass class Mexico(HolidayBase): def __init__(self, **kwargs): self.country = 'MX' HolidayBase.__init__(self, **kwargs) def _populate(self, year): # New Year's Day name = "Año Nuevo [New Year's Day]" self[date(year, 1, 1)] = name if self.observed and date(year, 1, 1).weekday() == 6: self[date(year, 1, 1) + rd(days=+1)] = name + " (Observed)" elif self.observed and date(year, 1, 1).weekday() == 5: # Add Dec 31st from the previous year without triggering # the entire year to be added expand = self.expand self.expand = False self[date(year, 1, 1) + rd(days=-1)] = name + " (Observed)" self.expand = expand # The next year's observed New Year's Day can be in this year # when it falls on a Friday (Jan 1st is a Saturday) if self.observed and date(year, 12, 31).weekday() == 4: self[date(year, 12, 31)] = name + " (Observed)" # Constitution Day name = "Día de la Constitución [Constitution Day]" if 2006 >= year >= 1917: self[date(year, 2, 5)] = name elif year >= 2007: self[date(year, 2, 1) + rd(weekday=MO(+1))] = name # Benito Juárez's birthday name = "Natalicio de Benito Juárez [Benito Juárez's birthday]" if 2006 >= year >= 1917: self[date(year, 3, 21)] = name elif year >= 2007: self[date(year, 3, 1) + rd(weekday=MO(+3))] = name # Labor Day if year >= 1923: self[date(year, 5, 1)] = "Día del Trabajo [Labour Day]" if self.observed and date(year, 5, 1).weekday() == 5: self[date(year, 5, 1) + rd(days=-1)] = name + " (Observed)" elif self.observed and date(year, 5, 1).weekday() == 6: self[date(year, 5, 1) + rd(days=+1)] = name + " (Observed)" # Independence Day name = "Día de la Independencia [Independence Day]" self[date(year, 9, 16)] = name if self.observed and date(year, 9, 16).weekday() == 5: self[date(year, 9, 16) + rd(days=-1)] = name + " (Observed)" elif self.observed and date(year, 9, 16).weekday() == 6: self[date(year, 9, 16) + rd(days=+1)] = name + " (Observed)" # Revolution Day name = "Día de la Revolución [Revolution Day]" if 2006 >= year >= 1917: self[date(year, 11, 20)] = name elif year >= 2007: self[date(year, 11, 1) + rd(weekday=MO(+3))] = name # Change of Federal Government # Every six years--next observance 2018 name = "Transmisión del Poder Ejecutivo Federal" name += " [Change of Federal Government]" if (2018 - year) % 6 == 0: self[date(year, 12, 1)] = name if self.observed and date(year, 12, 1).weekday() == 5: self[date(year, 12, 1) + rd(days=-1)] = name + " (Observed)" elif self.observed and date(year, 12, 1).weekday() == 6: self[date(year, 12, 1) + rd(days=+1)] = name + " (Observed)" # Christmas self[date(year, 12, 25)] = "Navidad [Christmas]" if self.observed and date(year, 12, 25).weekday() == 5: self[date(year, 12, 25) + rd(days=-1)] = name + " (Observed)" elif self.observed and date(year, 12, 25).weekday() == 6: self[date(year, 12, 25) + rd(days=+1)] = name + " (Observed)" class MX(Mexico): pass class UnitedStates(HolidayBase): # https://en.wikipedia.org/wiki/Public_holidays_in_the_United_States STATES = ['AL', 'AK', 'AS', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FL', 'GA', 'GU', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MH', 'MA', 'MI', 'FM', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'MP', 'OH', 'OK', 'OR', 'PW', 'PA', 'PR', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'VI', 'WA', 'WV', 'WI', 'WY'] def __init__(self, **kwargs): self.country = 'US' HolidayBase.__init__(self, **kwargs) def _populate(self, year): # New Year's Day if year > 1870: name = "New Year's Day" self[date(year, 1, 1)] = name if self.observed and date(year, 1, 1).weekday() == 6: self[date(year, 1, 1) + rd(days=+1)] = name + " (Observed)" elif self.observed and date(year, 1, 1).weekday() == 5: # Add Dec 31st from the previous year without triggering # the entire year to be added expand = self.expand self.expand = False self[date(year, 1, 1) + rd(days=-1)] = name + " (Observed)" self.expand = expand # The next year's observed New Year's Day can be in this year # when it falls on a Friday (Jan 1st is a Saturday) if self.observed and date(year, 12, 31).weekday() == 4: self[date(year, 12, 31)] = name + " (Observed)" # Epiphany if self.state == 'PR': self[date(year, 1, 6)] = "Epiphany" # Three King's Day if self.state == 'VI': self[date(year, 1, 6)] = "Three King's Day" # Lee Jackson Day name = "Lee Jackson Day" if self.state == 'VA' and year >= 2000: dt = date(year, 1, 1) + rd(weekday=MO(+3)) + rd(weekday=FR(-1)) self[dt] = name elif self.state == 'VA' and year >= 1983: self[date(year, 1, 1) + rd(weekday=MO(+3))] = name elif self.state == 'VA' and year >= 1889: self[date(year, 1, 19)] = name # Inauguration Day if self.state in ('DC', 'LA', 'MD', 'VA') and year >= 1789: name = "Inauguration Day" if (year - 1789) % 4 == 0 and year >= 1937: self[date(year, 1, 20)] = name if date(year, 1, 20).weekday() == 6: self[date(year, 1, 21)] = name + " (Observed)" elif (year - 1789) % 4 == 0: self[date(year, 3, 4)] = name if date(year, 3, 4).weekday() == 6: self[date(year, 3, 5)] = name + " (Observed)" # Martin Luther King, Jr. Day if year >= 1986: name = "Martin Luther King, Jr. Day" if self.state == 'AL': name = "Robert E. Lee/Martin Luther King Birthday" elif self.state in ('AS', 'MS'): name = ("Dr. Martin Luther King Jr. " "and Robert E. Lee's Birthdays") elif self.state in ('AZ', 'NH'): name = "Dr. Martin Luther King Jr./Civil Rights Day" elif self.state == 'GA' and year < 2012: name = "Robert E. Lee's Birthday" elif self.state == 'ID' and year >= 2006: name = "Martin Luther King, Jr. - Idaho Human Rights Day" self[date(year, 1, 1) + rd(weekday=MO(+3))] = name # Lincoln's Birthday name = "Lincoln's Birthday" if (self.state in ('CT', 'IL', 'IA', 'NJ', 'NY') and year >= 1971) \ or (self.state == 'CA' and 1971 <= year <= 2009): self[date(year, 2, 12)] = name if self.observed and date(year, 2, 12).weekday() == 5: self[date(year, 2, 11)] = name + " (Observed)" elif self.observed and date(year, 2, 12).weekday() == 6: self[date(year, 2, 13)] = name + " (Observed)" # Susan B. Anthony Day if (self.state == 'CA' and year >= 2014) \ or (self.state == 'FL' and year >= 2011) \ or (self.state == 'NY' and year >= 2004) \ or (self.state == 'WI' and year >= 1976): self[date(year, 2, 15)] = "Susan B. Anthony Day" # Washington's Birthday name = "Washington's Birthday" if self.state == 'AL': name = "George Washington/Thomas Jefferson Birthday" elif self.state == 'AS': name = "George Washington's Birthday and Daisy Gatson Bates Day" elif self.state in ('PR', 'VI'): name = "Presidents' Day" if self.state not in ('DE', 'FL', 'GA', 'NM', 'PR'): if year > 1970: self[date(year, 2, 1) + rd(weekday=MO(+3))] = name elif year >= 1879: self[date(year, 2, 22)] = name elif self.state == 'GA': if date(year, 12, 24).weekday() != 2: self[date(year, 12, 24)] = name else: self[date(year, 12, 26)] = name elif self.state in ('PR', 'VI'): self[date(year, 2, 1) + rd(weekday=MO(+3))] = name # Mardi Gras if self.state == 'LA' and year >= 1857: self[easter(year) + rd(days=-47)] = "Mardi Gras" # Guam Discovery Day if self.state == 'GU' and year >= 1970: self[date(year, 3, 1) + rd(weekday=MO)] = "Guam Discovery Day" # Casimir Pulaski Day if self.state == 'IL' and year >= 1978: self[date(year, 3, 1) + rd(weekday=MO)] = "Casimir Pulaski Day" # Texas Independence Day if self.state == 'TX' and year >= 1874: self[date(year, 3, 2)] = "Texas Independence Day" # Town Meeting Day if self.state == 'VT' and year >= 1800: self[date(year, 3, 1) + rd(weekday=TU)] = "Town Meeting Day" # Evacuation Day if self.state == 'MA' and year >= 1901: name = "Evacuation Day" self[date(year, 3, 17)] = name if date(year, 3, 17).weekday() in (5, 6): self[date(year, 3, 17) + rd(weekday=MO)] = name + " (Observed)" # Emancipation Day if self.state == 'PR': self[date(year, 3, 22)] = "Emancipation Day" if self.observed and date(year, 3, 22).weekday() == 6: self[date(year, 3, 23)] = "Emancipation Day (Observed)" # Prince Jonah Kuhio Kalanianaole Day if self.state == 'HI' and year >= 1949: name = "Prince Jonah Kuhio Kalanianaole Day" self[date(year, 3, 26)] = name if self.observed and date(year, 3, 26).weekday() == 5: self[date(year, 3, 25)] = name + " (Observed)" elif self.observed and date(year, 3, 26).weekday() == 6: self[date(year, 3, 27)] = name + " (Observed)" # Steward's Day name = "Steward's Day" if self.state == 'AK' and year >= 1955: self[date(year, 4, 1) + rd(days=-1, weekday=MO(-1))] = name elif self.state == 'AK' and year >= 1918: self[date(year, 3, 30)] = name # César Chávez Day name = "César Chávez Day" if self.state == 'CA' and year >= 1995: self[date(year, 3, 31)] = name if self.observed and date(year, 3, 31).weekday() == 6: self[date(year, 4, 1)] = name + " (Observed)" elif self.state == 'TX' and year >= 2000: self[date(year, 3, 31)] = name # Transfer Day if self.state == 'VI': self[date(year, 3, 31)] = "Transfer Day" # Emancipation Day if self.state == 'DC' and year >= 2005: name = "Emancipation Day" self[date(year, 4, 16)] = name if self.observed and date(year, 4, 16).weekday() == 5: self[date(year, 4, 15)] = name + " (Observed)" elif self.observed and date(year, 4, 16).weekday() == 6: self[date(year, 4, 17)] = name + " (Observed)" # Patriots' Day if self.state in ('ME', 'MA') and year >= 1969: self[date(year, 4, 1) + rd(weekday=MO(+3))] = "Patriots' Day" elif self.state in ('ME', 'MA') and year >= 1894: self[date(year, 4, 19)] = "Patriots' Day" # Holy Thursday if self.state == 'VI': self[easter(year) + rd(weekday=TH(-1))] = "Holy Thursday" # Good Friday if self.state in ('CT', 'DE', 'GU', 'IN', 'KY', 'LA', 'NJ', 'NC', 'PR', 'TN', 'TX', 'VI'): self[easter(year) + rd(weekday=FR(-1))] = "Good Friday" # Easter Monday if self.state == 'VI': self[easter(year) + rd(weekday=MO)] = "Easter Monday" # Confederate Memorial Day name = "Confederate Memorial Day" if self.state in ('AL', 'GA', 'MS', 'SC') and year >= 1866: if self.state == 'GA' and year >= 2016: name = "State Holiday" self[date(year, 4, 1) + rd(weekday=MO(+4))] = name elif self.state == 'TX' and year >= 1931: self[date(year, 1, 19)] = name # San Jacinto Day if self.state == 'TX' and year >= 1875: self[date(year, 4, 21)] = "San Jacinto Day" # Arbor Day if self.state == 'NE' and year >= 1989: self[date(year, 4, 30) + rd(weekday=FR(-1))] = "Arbor Day" elif self.state == 'NE' and year >= 1875: self[date(year, 4, 22)] = "Arbor Day" # Primary Election Day if self.state == 'IN' and \ ((year >= 2006 and year % 2 == 0) or year >= 2015): dt = date(year, 5, 1) + rd(weekday=MO) self[dt + rd(days=+1)] = "Primary Election Day" # Truman Day if self.state == 'MO' and year >= 1949: name = "Truman Day" self[date(year, 5, 8)] = name if self.observed and date(year, 5, 8).weekday() == 5: self[date(year, 5, 7)] = name + " (Observed)" elif self.observed and date(year, 5, 8).weekday() == 6: self[date(year, 5, 10)] = name + " (Observed)" # Memorial Day if year > 1970: self[date(year, 5, 31) + rd(weekday=MO(-1))] = "Memorial Day" elif year >= 1888: self[date(year, 5, 30)] = "Memorial Day" # Jefferson Davis Birthday name = "Jefferson Davis Birthday" if self.state == 'AL' and year >= 1890: self[date(year, 6, 1) + rd(weekday=MO)] = name # Kamehameha Day if self.state == 'HI' and year >= 1872: self[date(year, 6, 11)] = "Kamehameha Day" if self.observed and year >= 2011: if date(year, 6, 11).weekday() == 5: self[date(year, 6, 10)] = "Kamehameha Day (Observed)" elif date(year, 6, 11).weekday() == 6: self[date(year, 6, 12)] = "Kamehameha Day (Observed)" # Emancipation Day In Texas if self.state == 'TX' and year >= 1980: self[date(year, 6, 19)] = "Emancipation Day In Texas" # West Virginia Day name = "West Virginia Day" if self.state == 'WV' and year >= 1927: self[date(year, 6, 20)] = name if self.observed and date(year, 6, 20).weekday() == 5: self[date(year, 6, 19)] = name + " (Observed)" elif self.observed and date(year, 6, 20).weekday() == 6: self[date(year, 6, 21)] = name + " (Observed)" # Emancipation Day in US Virgin Islands if self.state == 'VI': self[date(year, 7, 3)] = "Emancipation Day" # Independence Day if year > 1870: name = "Independence Day" self[date(year, 7, 4)] = name if self.observed and date(year, 7, 4).weekday() == 5: self[date(year, 7, 4) + rd(days=-1)] = name + " (Observed)" elif self.observed and date(year, 7, 4).weekday() == 6: self[date(year, 7, 4) + rd(days=+1)] = name + " (Observed)" # Liberation Day (Guam) if self.state == 'GU' and year >= 1945: self[date(year, 7, 21)] = "Liberation Day (Guam)" # Pioneer Day if self.state == 'UT' and year >= 1849: name = "Pioneer Day" self[date(year, 7, 24)] = name if self.observed and date(year, 7, 24).weekday() == 5: self[date(year, 7, 24) + rd(days=-1)] = name + " (Observed)" elif self.observed and date(year, 7, 24).weekday() == 6: self[date(year, 7, 24) + rd(days=+1)] = name + " (Observed)" # Constitution Day if self.state == 'PR': self[date(year, 7, 25)] = "Constitution Day" if self.observed and date(year, 7, 25).weekday() == 6: self[date(year, 7, 26)] = "Constitution Day (Observed)" # Victory Day if self.state == 'RI' and year >= 1948: self[date(year, 8, 1) + rd(weekday=MO(+2))] = "Victory Day" # Statehood Day (Hawaii) if self.state == 'HI' and year >= 1959: self[date(year, 8, 1) + rd(weekday=FR(+3))] = "Statehood Day" # Bennington Battle Day if self.state == 'VT' and year >= 1778: name = "Bennington Battle Day" self[date(year, 8, 16)] = name if self.observed and date(year, 8, 16).weekday() == 5: self[date(year, 8, 15)] = name + " (Observed)" elif self.observed and date(year, 8, 16).weekday() == 6: self[date(year, 8, 17)] = name + " (Observed)" # Lyndon Baines Johnson Day if self.state == 'TX' and year >= 1973: self[date(year, 8, 27)] = "Lyndon Baines Johnson Day" # Labor Day if year >= 1894: self[date(year, 9, 1) + rd(weekday=MO)] = "Labor Day" # Columbus Day if self.state not in ('AK', 'DE', 'FL', 'HI', 'NV'): if self.state == 'SD': name = "Native American Day" elif self.state == 'VI': name = "Columbus Day and Puerto Rico Friendship Day" else: name = "Columbus Day" if year >= 1970: self[date(year, 10, 1) + rd(weekday=MO(+2))] = name elif year >= 1937: self[date(year, 10, 12)] = name # Alaska Day if self.state == 'AK' and year >= 1867: self[date(year, 10, 18)] = "Alaska Day" if self.observed and date(year, 10, 18).weekday() == 5: self[date(year, 10, 18) + rd(days=-1)] = name + " (Observed)" elif self.observed and date(year, 10, 18).weekday() == 6: self[date(year, 10, 18) + rd(days=+1)] = name + " (Observed)" # Nevada Day if self.state == 'NV' and year >= 1933: dt = date(year, 10, 31) if year >= 2000: dt += rd(weekday=FR(-1)) self[dt] = "Nevada Day" if self.observed and dt.weekday() == 5: self[dt + rd(days=-1)] = "Nevada Day (Observed)" elif self.observed and dt.weekday() == 6: self[dt + rd(days=+1)] = "Nevada Day (Observed)" # Liberty Day if self.state == 'VI': self[date(year, 11, 1)] = "Liberty Day" # Election Day if (self.state in ('DE', 'HI', 'IL', 'IN', 'LA', 'MT', 'NH', 'NJ', 'NY', 'WV') and year >= 2008 and year % 2 == 0) \ or (self.state in ('IN', 'NY') and year >= 2015): dt = date(year, 11, 1) + rd(weekday=MO) self[dt + rd(days=+1)] = "Election Day" # All Souls' Day if self.state == 'GU': self[date(year, 11, 2)] = "All Souls' Day" # Veterans Day if year > 1953: name = "Veterans Day" else: name = "Armistice Day" if 1978 > year > 1970: self[date(year, 10, 1) + rd(weekday=MO(+4))] = name elif year >= 1938: self[date(year, 11, 11)] = name if self.observed and date(year, 11, 11).weekday() == 5: self[date(year, 11, 11) + rd(days=-1)] = name + " (Observed)" elif self.observed and date(year, 11, 11).weekday() == 6: self[date(year, 11, 11) + rd(days=+1)] = name + " (Observed)" # Discovery Day if self.state == 'PR': self[date(year, 11, 19)] = "Discovery Day" if self.observed and date(year, 11, 19).weekday() == 6: self[date(year, 11, 20)] = "Discovery Day (Observed)" # Thanksgiving if year > 1870: self[date(year, 11, 1) + rd(weekday=TH(+4))] = "Thanksgiving" # Day After Thanksgiving # Friday After Thanksgiving # Lincoln's Birthday # American Indian Heritage Day # Family Day # New Mexico Presidents' Day if (self.state in ('DE', 'FL', 'NH', 'NC', 'OK', 'TX', 'WV') and year >= 1975) \ or (self.state == 'IN' and year >= 2010) \ or (self.state == 'MD' and year >= 2008) \ or self.state in ('NV', 'NM'): if self.state in ('DE', 'NH', 'NC', 'OK', 'WV'): name = "Day After Thanksgiving" elif self.state in ('FL', 'TX'): name = "Friday After Thanksgiving" elif self.state == 'IN': name = "Lincoln's Birthday" elif self.state == 'MD' and year >= 2008: name = "American Indian Heritage Day" elif self.state == 'NV': name = "Family Day" elif self.state == 'NM': name = "Presidents' Day" dt = date(year, 11, 1) + rd(weekday=TH(+4)) self[dt + rd(days=+1)] = name # Robert E. Lee's Birthday if self.state == 'GA' and year >= 1986: if year >= 2016: name = "State Holiday" else: name = "Robert E. Lee's Birthday" self[date(year, 11, 29) + rd(weekday=FR(-1))] = name # Lady of Camarin Day if self.state == 'GU': self[date(year, 12, 8)] = "Lady of Camarin Day" # Christmas Eve if self.state == 'AS' or \ (self.state in ('KS', 'MI', 'NC') and year >= 2013) or \ (self.state == 'TX' and year >= 1981) or \ (self.state == 'WI' and year >= 2012): name = "Christmas Eve" self[date(year, 12, 24)] = name name = name + " (Observed)" # If on Friday, observed on Thursday if self.observed and date(year, 12, 24).weekday() == 4: self[date(year, 12, 24) + rd(days=-1)] = name # If on Saturday or Sunday, observed on Friday elif self.observed and date(year, 12, 24).weekday() in (5, 6): self[date(year, 12, 24) + rd(weekday=FR(-1))] = name # Christmas Day if year > 1870: name = "Christmas Day" self[date(year, 12, 25)] = "Christmas Day" if self.observed and date(year, 12, 25).weekday() == 5: self[date(year, 12, 25) + rd(days=-1)] = name + " (Observed)" elif self.observed and date(year, 12, 25).weekday() == 6: self[date(year, 12, 25) + rd(days=+1)] = name + " (Observed)" # Day After Christmas if self.state == 'NC' and year >= 2013: name = "Day After Christmas" self[date(year, 12, 26)] = name name = name + " (Observed)" # If on Saturday or Sunday, observed on Monday if self.observed and date(year, 12, 26).weekday() in (5, 6): self[date(year, 12, 26) + rd(weekday=MO)] = name # If on Monday, observed on Tuesday elif self.observed and date(year, 12, 26).weekday() == 0: self[date(year, 12, 26) + rd(days=+1)] = name elif self.state == 'TX' and year >= 1981: self[date(year, 12, 26)] = "Day After Christmas" elif self.state == 'VI': self[date(year, 12, 26)] = "Christmas Second Day" # New Year's Eve if (self.state in ('KY', 'MI') and year >= 2013) or \ (self.state == 'WI' and year >= 2012): name = "New Year's Eve" self[date(year, 12, 31)] = name if self.observed and date(year, 12, 31).weekday() == 5: self[date(year, 12, 30)] = name + " (Observed)" class US(UnitedStates): pass class NewZealand(HolidayBase): PROVINCES = ['NTL', 'AUK', 'TKI', 'HKB', 'WGN', 'MBH', 'NSN', 'CAN', 'STC', 'WTL', 'OTA', 'STL', 'CIT'] def __init__(self, **kwargs): self.country = 'NZ' HolidayBase.__init__(self, **kwargs) def _populate(self, year): # Bank Holidays Act 1873 # The Employment of Females Act 1873 # Factories Act 1894 # Industrial Conciliation and Arbitration Act 1894 # Labour Day Act 1899 # Anzac Day Act 1920, 1949, 1956 # New Zealand Day Act 1973 # Waitangi Day Act 1960, 1976 # Sovereign's Birthday Observance Act 1937, 1952 # Holidays Act 1981, 2003 if year < 1894: return # New Year's Day name = "New Year's Day" jan1 = date(year, 1, 1) self[jan1] = name if self.observed and jan1.weekday() in WEEKEND: self[date(year, 1, 3)] = name + " (Observed)" name = "Day after New Year's Day" jan2 = date(year, 1, 2) self[jan2] = name if self.observed and jan2.weekday() in WEEKEND: self[date(year, 1, 4)] = name + " (Observed)" # Waitangi Day if year > 1973: name = "New Zealand Day" if year > 1976: name = "Waitangi Day" feb6 = date(year, 2, 6) self[feb6] = name if self.observed and year >= 2014 and feb6.weekday() in WEEKEND: self[feb6 + rd(weekday=MO)] = name + " (Observed)" # Easter self[easter(year) + rd(weekday=FR(-1))] = "Good Friday" self[easter(year) + rd(weekday=MO)] = "Easter Monday" # Anzac Day if year > 1920: name = "Anzac Day" apr25 = date(year, 4, 25) self[apr25] = name if self.observed and year >= 2014 and apr25.weekday() in WEEKEND: self[apr25 + rd(weekday=MO)] = name + " (Observed)" # Sovereign's Birthday if year >= 1952: name = "Queen's Birthday" elif year > 1901: name = "King's Birthday" if year == 1952: self[date(year, 6, 2)] = name # Elizabeth II elif year > 1937: self[date(year, 6, 1) + rd(weekday=MO(+1))] = name # EII & GVI elif year == 1937: self[date(year, 6, 9)] = name # George VI elif year == 1936: self[date(year, 6, 23)] = name # Edward VIII elif year > 1911: self[date(year, 6, 3)] = name # George V elif year > 1901: # http://paperspast.natlib.govt.nz/cgi-bin/paperspast?a=d&d=NZH19091110.2.67 self[date(year, 11, 9)] = name # Edward VII # Labour Day name = "Labour Day" if year >= 1910: self[date(year, 10, 1) + rd(weekday=MO(+4))] = name elif year > 1899: self[date(year, 10, 1) + rd(weekday=WE(+2))] = name # Christmas Day name = "Christmas Day" dec25 = date(year, 12, 25) self[dec25] = name if self.observed and dec25.weekday() in WEEKEND: self[date(year, 12, 27)] = name + " (Observed)" # Boxing Day name = "Boxing Day" dec26 = date(year, 12, 26) self[dec26] = name if self.observed and dec26.weekday() in WEEKEND: self[date(year, 12, 28)] = name + " (Observed)" # Province Anniversary Day if self.prov in ('NTL', 'Northland', 'AUK', 'Auckland'): if 1963 < year <= 1973 and self.prov in ('NTL', 'Northland'): name = "Waitangi Day" dt = date(year, 2, 6) else: name = "Auckland Anniversary Day" dt = date(year, 1, 29) if dt.weekday() in (TUESDAY, WEDNESDAY, THURSDAY): self[dt + rd(weekday=MO(-1))] = name else: self[dt + rd(weekday=MO)] = name elif self.prov in ('TKI', 'Taranaki', 'New Plymouth'): name = "Taranaki Anniversary Day" self[date(year, 3, 1) + rd(weekday=MO(+2))] = name elif self.prov in ('HKB', "Hawke's Bay"): name = "Hawke's Bay Anniversary Day" labour_day = date(year, 10, 1) + rd(weekday=MO(+4)) self[labour_day + rd(weekday=FR(-1))] = name elif self.prov in ('WGN', 'Wellington'): name = "Wellington Anniversary Day" jan22 = date(year, 1, 22) if jan22.weekday() in (TUESDAY, WEDNESDAY, THURSDAY): self[jan22 + rd(weekday=MO(-1))] = name else: self[jan22 + rd(weekday=MO)] = name elif self.prov in ('MBH', 'Marlborough'): name = "Marlborough Anniversary Day" labour_day = date(year, 10, 1) + rd(weekday=MO(+4)) self[labour_day + rd(weeks=1)] = name elif self.prov in ('NSN', 'Nelson'): name = "Nelson Anniversary Day" feb1 = date(year, 2, 1) if feb1.weekday() in (TUESDAY, WEDNESDAY, THURSDAY): self[feb1 + rd(weekday=MO(-1))] = name else: self[feb1 + rd(weekday=MO)] = name elif self.prov in ('CAN', 'Canterbury'): name = "Canterbury Anniversary Day" showday = date(year, 11, 1) + rd(weekday=TU) + rd(weekday=FR(+2)) self[showday] = name elif self.prov in ('STC', 'South Canterbury'): name = "South Canterbury Anniversary Day" dominion_day = date(year, 9, 1) + rd(weekday=MO(4)) self[dominion_day] = name elif self.prov in ('WTL', 'Westland'): name = "Westland Anniversary Day" dec1 = date(year, 12, 1) # Observance varies?!?! if year == 2005: # special case?!?! self[date(year, 12, 5)] = name elif dec1.weekday() in (TUESDAY, WEDNESDAY, THURSDAY): self[dec1 + rd(weekday=MO(-1))] = name else: self[dec1 + rd(weekday=MO)] = name elif self.prov in ('OTA', 'Otago'): name = "Otago Anniversary Day" mar23 = date(year, 3, 23) # there is no easily determined single day of local observance?!?! if mar23.weekday() in (TUESDAY, WEDNESDAY, THURSDAY): dt = mar23 + rd(weekday=MO(-1)) else: dt = mar23 + rd(weekday=MO) if dt == easter(year) + rd(weekday=MO): # Avoid Easter Monday dt += rd(days=1) self[dt] = name elif self.prov in ('STL', 'Southland'): name = "Southland Anniversary Day" jan17 = date(year, 1, 17) if year > 2011: self[easter(year) + rd(weekday=TU)] = name else: if jan17.weekday() in (TUESDAY, WEDNESDAY, THURSDAY): self[jan17 + rd(weekday=MO(-1))] = name else: self[jan17 + rd(weekday=MO)] = name elif self.prov in ('CIT', 'Chatham Islands'): name = "Chatham Islands Anniversary Day" nov30 = date(year, 11, 30) if nov30.weekday() in (TUESDAY, WEDNESDAY, THURSDAY): self[nov30 + rd(weekday=MO(-1))] = name else: self[nov30 + rd(weekday=MO)] = name class NZ(NewZealand): pass class Australia(HolidayBase): PROVINCES = ['ACT', 'NSW', 'NT', 'QLD', 'SA', 'TAS', 'VIC', 'WA'] def __init__(self, **kwargs): self.country = 'AU' self.prov = kwargs.pop('prov', kwargs.pop('state', 'ACT')) HolidayBase.__init__(self, **kwargs) def _populate(self, year): # ACT: Holidays Act 1958 # NSW: Public Holidays Act 2010 # NT: Public Holidays Act 2013 # QLD: Holidays Act 1983 # SA: Holidays Act 1910 # TAS: Statutory Holidays Act 2000 # VIC: Public Holidays Act 1993 # WA: Public and Bank Holidays Act 1972 # TODO do more research on history of Aus holidays # New Year's Day name = "New Year's Day" jan1 = date(year, 1, 1) self[jan1] = name if self.observed and jan1.weekday() in WEEKEND: self[jan1 + rd(weekday=MO)] = name + " (Observed)" # Australia Day jan26 = date(year, 1, 26) if year >= 1935: if self.prov == 'NSW' and year < 1946: name = "Anniversary Day" else: name = "Australia Day" self[jan26] = name if self.observed and year >= 1946 and jan26.weekday() in WEEKEND: self[jan26 + rd(weekday=MO)] = name + " (Observed)" elif year >= 1888 and self.prov != 'SA': name = "Anniversary Day" self[jan26] = name # Adelaide Cup if self.prov == 'SA': name = "Adelaide Cup" if year >= 2006: # subject to proclamation ?!?! self[date(year, 3, 1) + rd(weekday=MO(+2))] = name else: self[date(year, 3, 1) + rd(weekday=MO(+3))] = name # Canberra Day if self.prov == 'ACT': name = "Canberra Day" self[date(year, 3, 1) + rd(weekday=MO(+1))] = name # Easter self[easter(year) + rd(weekday=FR(-1))] = "Good Friday" if self.prov in ('ACT', 'NSW', 'NT', 'QLD', 'SA', 'VIC'): self[easter(year) + rd(weekday=SA(-1))] = "Easter Saturday" if self.prov == 'NSW': self[easter(year)] = "Easter Sunday" self[easter(year) + rd(weekday=MO)] = "Easter Monday" # Anzac Day if year > 1920: name = "Anzac Day" apr25 = date(year, 4, 25) self[apr25] = name if self.observed: if apr25.weekday() == SATURDAY and self.prov in ('WA', 'NT'): self[apr25 + rd(weekday=MO)] = name + " (Observed)" elif (apr25.weekday() == SUNDAY and self.prov in ('ACT', 'QLD', 'SA', 'WA', 'NT')): self[apr25 + rd(weekday=MO)] = name + " (Observed)" # Western Australia Day if self.prov == 'WA' and year > 1832: if year >= 2015: name = "Western Australia Day" else: name = "Foundation Day" self[date(year, 6, 1) + rd(weekday=MO(+1))] = name # Sovereign's Birthday if year >= 1952: name = "Queen's Birthday" elif year > 1901: name = "King's Birthday" if year >= 1936: name = "Queen's Birthday" if self.prov == 'QLD': if year == 2012: self[date(year, 6, 11)] = "Queen's Diamond Jubilee" if year < 2016 and year != 2012: dt = date(year, 6, 1) + rd(weekday=MO(+2)) self[dt] = name else: dt = date(year, 10, 1) + rd(weekday=MO) self[dt] = name elif self.prov == 'WA': # by proclamation ?!?! self[date(year, 10, 1) + rd(weekday=MO(-1))] = name else: dt = date(year, 6, 1) + rd(weekday=MO(+2)) self[dt] = name elif year > 1911: self[date(year, 6, 3)] = name # George V elif year > 1901: self[date(year, 11, 9)] = name # Edward VII # Picnic Day if self.prov == 'NT': name = "Picnic Day" self[date(year, 8, 1) + rd(weekday=MO)] = name # Labour Day name = "Labour Day" if self.prov in ('NSW', 'ACT', 'SA'): self[date(year, 10, 1) + rd(weekday=MO)] = name elif self.prov == 'WA': self[date(year, 3, 1) + rd(weekday=MO)] = name elif self.prov == 'VIC': self[date(year, 3, 1) + rd(weekday=MO(+2))] = name elif self.prov == 'QLD': if 2013 <= year <= 2015: self[date(year, 10, 1) + rd(weekday=MO)] = name else: self[date(year, 5, 1) + rd(weekday=MO)] = name elif self.prov == 'NT': name = "May Day" self[date(year, 5, 1) + rd(weekday=MO)] = name elif self.prov == 'TAS': name = "Eight Hours Day" self[date(year, 3, 1) + rd(weekday=MO(+2))] = name # Family & Community Day if self.prov == 'ACT': name = "Family & Community Day" if 2007 <= year <= 2009: self[date(year, 11, 1) + rd(weekday=TU)] = name elif year == 2010: # first Monday of the September/October school holidays # moved to the second Monday if this falls on Labour day # TODO need a formula for the ACT school holidays then # http://www.cmd.act.gov.au/communication/holidays self[date(year, 9, 26)] = name elif year == 2011: self[date(year, 10, 10)] = name elif year == 2012: self[date(year, 10, 8)] = name elif year == 2013: self[date(year, 9, 30)] = name elif year == 2014: self[date(year, 9, 29)] = name elif year == 2015: self[date(year, 9, 28)] = name elif year == 2016: self[date(year, 9, 26)] = name elif 2017 <= year <= 2020: labour_day = date(year, 10, 1) + rd(weekday=MO) if year == 2017: dt = date(year, 9, 23) + rd(weekday=MO) elif year == 2018: dt = date(year, 9, 29) + rd(weekday=MO) elif year == 2019: dt = date(year, 9, 28) + rd(weekday=MO) elif year == 2020: dt = date(year, 9, 26) + rd(weekday=MO) if dt == labour_day: dt += rd(weekday=MO(+1)) self[date(year, 9, 26)] = name # Melbourne Cup if self.prov == 'VIC': name = "Melbourne Cup" self[date(year, 11, 1) + rd(weekday=TU)] = name # The Royal Queensland Show (Ekka) # The Show starts on the first Friday of August - providing this is # not prior to the 5th - in which case it will begin on the second # Friday. The Wednesday during the show is a public holiday. if self.prov == 'QLD': name = "The Royal Queensland Show" self[date(year, 8, 5) + rd(weekday=FR) + rd(weekday=WE)] = name # Christmas Day name = "Christmas Day" dec25 = date(year, 12, 25) self[dec25] = name if self.observed and dec25.weekday() in WEEKEND: self[date(year, 12, 27)] = name + " (Observed)" # Boxing Day if self.prov == 'SA': name = "Proclamation Day" else: name = "Boxing Day" dec26 = date(year, 12, 26) self[dec26] = name if self.observed and dec26.weekday() in WEEKEND: self[date(year, 12, 28)] = name + " (Observed)" class AU(Australia): pass class Germany(HolidayBase): """Official holidays for Germany in its current form. This class doesn't return any holidays before 1990-10-03. Before that date the current Germany was separated into the "German Democratic Republic" and the "Federal Republic of Germany" which both had somewhat different holidays. Since this class is called "Germany" it doesn't really make sense to include the days from the two former countries. Note that Germany doesn't have rules for holidays that happen on a Sunday. Those holidays are still holiday days but there is no additional day to make up for the "lost" day. Also note that German holidays are partly declared by each province there are some weired edge cases: - "Mariä Himmelfahrt" is only a holiday in Bavaria (BY) if your municipality is mostly catholic which in term depends on census data. Since we don't have this data but most municipalities in Bavaria *are* mostly catholic, we count that as holiday for whole Bavaria. - There is an "Augsburger Friedensfest" which only exists in the town Augsburg. This is excluded for Bavaria. - "Gründonnerstag" (Thursday before easter) is not a holiday but pupil don't have to go to school (but only in Baden Württemberg) which is solved by adjusting school holidays to include this day. It is excluded from our list. - "Fronleichnam" is a holiday in certain, explicitly defined municipalities in Saxony (SN) and Thuringia (TH). We exclude it from both provinces. """ PROVINCES = ['BW', 'BY', 'BE', 'BB', 'HB', 'HH', 'HE', 'MV', 'NI', 'NW', 'RP', 'SL', 'SN', 'ST', 'SH', 'TH'] def __init__(self, **kwargs): self.country = 'DE' self.prov = kwargs.pop('prov', 'SH') HolidayBase.__init__(self, **kwargs) def _populate(self, year): if year <= 1989: return if year > 1990: self[date(year, 1, 1)] = 'Neujahr' if self.prov in ('BW', 'BY', 'ST'): self[date(year, 1, 6)] = 'Heilige Drei Könige' self[easter(year) - rd(days=2)] = 'Karfreitag' if self.prov == 'BB': # will always be a Sunday and we have no "observed" rule so # this is pretty pointless but it's nonetheless an official # holiday by law self[easter(year)] = 'Ostern' self[easter(year) + rd(days=1)] = 'Ostermontag' self[date(year, 5, 1)] = 'Maifeiertag' self[easter(year) + rd(days=39)] = 'Christi Himmelfahrt' if self.prov == 'BB': # will always be a Sunday and we have no "observed" rule so # this is pretty pointless but it's nonetheless an official # holiday by law self[easter(year) + rd(days=49)] = 'Pfingsten' self[easter(year) + rd(days=50)] = 'Pfingstmontag' if self.prov in ('BW', 'BY', 'HE', 'NW', 'RP', 'SL'): self[easter(year) + rd(days=60)] = 'Fronleichnam' if self.prov in ('BY', 'SL'): self[date(year, 8, 15)] = 'Mariä Himmelfahrt' self[date(year, 10, 3)] = 'Tag der Deutschen Einheit' if self.prov in ('BB', 'MV', 'SN', 'ST', 'TH'): self[date(year, 10, 31)] = 'Reformationstag' # in 2017 all states got the Reformationstag (500th anniversary of # Luther's thesis) if year == 2017: self[date(year, 10, 31)] = 'Reformationstag' if self.prov in ('BW', 'BY', 'NW', 'RP', 'SL'): self[date(year, 11, 1)] = 'Allerheiligen' if self.prov == 'SN': # can be calculated as "last wednesday before year-11-23" which is # why we need to go back two wednesdays if year-11-23 happens to be # a wednesday base_data = date(year, 11, 23) weekday_delta = WE(-2) if base_data.weekday() == 2 else WE(-1) self[base_data + rd(weekday=weekday_delta)] = 'Buß- und Bettag' self[date(year, 12, 25)] = 'Erster Weihnachtstag' self[date(year, 12, 26)] = 'Zweiter Weihnachtstag' class DE(Germany): pass class Austria(HolidayBase): PROVINCES = ['B', 'K', 'N', 'O', 'S', 'ST', 'T', 'V', 'W'] def __init__(self, **kwargs): self.country = 'AT' self.prov = kwargs.pop('prov', kwargs.pop('state', 'W')) HolidayBase.__init__(self, **kwargs) def _populate(self, year): # public holidays self[date(year, 1, 1)] = "Neujahr" self[date(year, 1, 6)] = "Heilige Drei Könige" self[easter(year) + rd(weekday=MO)] = "Ostermontag" self[date(year, 5, 1)] = "Staatsfeiertag" self[easter(year) + rd(days=39)] = "Christi Himmelfahrt" self[easter(year) + rd(days=50)] = "Pfingstmontag" self[easter(year) + rd(days=60)] = "Fronleichnam" self[date(year, 8, 15)] = "Maria Himmelfahrt" if 1919 <= year <= 1934: self[date(year, 11, 12)] = "Nationalfeiertag" if year >= 1967: self[date(year, 10, 26)] = "Nationalfeiertag" self[date(year, 11, 1)] = "Allerheiligen" self[date(year, 12, 8)] = "Maria Empfängnis" self[date(year, 12, 25)] = "Christtag" self[date(year, 12, 26)] = "Stefanitag" class AT(Austria): pass class Denmark(HolidayBase): # https://en.wikipedia.org/wiki/Public_holidays_in_Denmark def __init__(self, **kwargs): self.country = 'DK' HolidayBase.__init__(self, **kwargs) def _populate(self, year): # Public holidays self[date(year, 1, 1)] = "Nytårsdag" self[easter(year) + rd(weekday=TH(-1))] = "Skærtorsdag" self[easter(year) + rd(weekday=FR(-1))] = "Langfredag" self[easter(year)] = "Påskedag" self[easter(year) + rd(weekday=MO)] = "Anden påskedag" self[easter(year) + rd(weekday=FR(+4))] = "Store bededag" self[easter(year) + rd(days=39)] = "Kristi himmelfartsdag" self[easter(year) + rd(days=49)] = "Pinsedag" self[easter(year) + rd(days=50)] = "Anden pinsedag" self[date(year, 12, 25)] = "Juledag" self[date(year, 12, 26)] = "Anden juledag" class DK(Denmark): pass class UnitedKingdom(HolidayBase): # https://en.wikipedia.org/wiki/Public_holidays_in_the_United_Kingdom def __init__(self, **kwargs): self.country = 'UK' HolidayBase.__init__(self, **kwargs) def _populate(self, year): # New Year's Day if year >= 1974: name = "New Year's Day" self[date(year, 1, 1)] = name if self.observed and date(year, 1, 1).weekday() == 6: self[date(year, 1, 1) + rd(days=+1)] = name + " (Observed)" elif self.observed and date(year, 1, 1).weekday() == 5: self[date(year, 1, 1) + rd(days=+2)] = name + " (Observed)" # New Year Holiday if self.country in ('UK', 'Scotland'): name = "New Year Holiday" if self.country == 'UK': name += " [Scotland]" self[date(year, 1, 2)] = name if self.observed and date(year, 1, 2).weekday() in (5, 6): self[date(year, 1, 2) + rd(days=+2)] = name + " (Observed)" elif self.observed and date(year, 1, 2).weekday() == 0: self[date(year, 1, 2) + rd(days=+1)] = name + " (Observed)" # St. Patrick's Day if self.country in ('UK', 'Northern Ireland', 'Ireland'): name = "St. Patrick's Day" if self.country == 'UK': name += " [Northern Ireland]" self[date(year, 3, 17)] = name if self.observed and date(year, 3, 17).weekday() in (5, 6): self[date(year, 3, 17) + rd(weekday=MO)] = name + " (Observed)" # Good Friday if self.country != 'Ireland': self[easter(year) + rd(weekday=FR(-1))] = "Good Friday" # Easter Monday if self.country != 'Scotland': name = "Easter Monday" if self.country == 'UK': name += " [England, Wales, Northern Ireland]" self[easter(year) + rd(weekday=MO)] = name # May Day bank holiday (first Monday in May) if year >= 1978: name = "May Day" if year == 1995: dt = date(year, 5, 8) else: dt = date(year, 5, 1) if dt.weekday() == 0: self[dt] = name elif dt.weekday() == 1: self[dt + rd(days=+6)] = name elif dt.weekday() == 2: self[dt + rd(days=+5)] = name elif dt.weekday() == 3: self[dt + rd(days=+4)] = name elif dt.weekday() == 4: self[dt + rd(days=+3)] = name elif dt.weekday() == 5: self[dt + rd(days=+2)] = name elif dt.weekday() == 6: self[dt + rd(days=+1)] = name # Spring bank holiday (last Monday in May) if self.country != 'Ireland': name = "Spring Bank Holiday" if year == 2012: self[date(year, 6, 4)] = name elif year >= 1971: self[date(year, 5, 31) + rd(weekday=MO(-1))] = name # June bank holiday (first Monday in June) if self.country == 'Ireland': self[date(year, 6, 1) + rd(weekday=MO)] = "June Bank Holiday" # TT bank holiday (first Friday in June) if self.country == 'Isle of Man': self[date(year, 6, 1) + rd(weekday=FR)] = "TT Bank Holiday" # Tynwald Day if self.country == 'Isle of Man': self[date(year, 7, 5)] = "Tynwald Day" # Battle of the Boyne if self.country in ('UK', 'Northern Ireland'): name = "Battle of the Boyne" if self.country == 'UK': name += " [Northern Ireland]" self[date(year, 7, 12)] = name # Summer bank holiday (first Monday in August) if self.country in ('UK', 'Scotland', 'Ireland'): name = "Summer Bank Holiday" if self.country == 'UK': name += " [Scotland]" self[date(year, 8, 1) + rd(weekday=MO)] = name # Late Summer bank holiday (last Monday in August) if self.country not in ('Scotland', 'Ireland') and year >= 1971: name = "Late Summer Bank Holiday" if self.country == 'UK': name += " [England, Wales, Northern Ireland]" self[date(year, 8, 31) + rd(weekday=MO(-1))] = name # October Bank Holiday (last Monday in October) if self.country == 'Ireland': name = "October Bank Holiday" self[date(year, 10, 31) + rd(weekday=MO(-1))] = name # St. Andrew's Day if self.country in ('UK', 'Scotland'): name = "St. Andrew's Day" if self.country == 'UK': name += " [Scotland]" self[date(year, 11, 30)] = name # Christmas Day name = "Christmas Day" self[date(year, 12, 25)] = name if self.observed and date(year, 12, 25).weekday() == 5: self[date(year, 12, 27)] = name + " (Observed)" elif self.observed and date(year, 12, 25).weekday() == 6: self[date(year, 12, 27)] = name + " (Observed)" # Boxing Day name = "Boxing Day" self[date(year, 12, 26)] = name if self.observed and date(year, 12, 26).weekday() == 5: self[date(year, 12, 28)] = name + " (Observed)" elif self.observed and date(year, 12, 26).weekday() == 6: self[date(year, 12, 28)] = name + " (Observed)" # Special holidays if self.country != 'Ireland': if year == 1977: self[date(year, 6, 7)] = "Silver Jubilee of Elizabeth II" elif year == 1981: self[date(year, 7, 29)] = "Wedding of Charles and Diana" elif year == 1999: self[date(year, 12, 31)] = "Millennium Celebrations" elif year == 2002: self[date(year, 6, 3)] = "Golden Jubilee of Elizabeth II" elif year == 2011: self[date(year, 4, 29)] = "Wedding of William and Catherine" elif year == 2012: self[date(year, 6, 5)] = "Diamond Jubilee of Elizabeth II" class UK(UnitedKingdom): pass class England(UnitedKingdom): def __init__(self, **kwargs): self.country = 'England' HolidayBase.__init__(self, **kwargs) class Wales(UnitedKingdom): def __init__(self, **kwargs): self.country = 'Wales' HolidayBase.__init__(self, **kwargs) class Scotland(UnitedKingdom): def __init__(self, **kwargs): self.country = 'Scotland' HolidayBase.__init__(self, **kwargs) class IsleOfMan(UnitedKingdom): def __init__(self, **kwargs): self.country = 'Isle of Man' HolidayBase.__init__(self, **kwargs) class NorthernIreland(UnitedKingdom): def __init__(self, **kwargs): self.country = 'Northern Ireland' HolidayBase.__init__(self, **kwargs) class Ireland(UnitedKingdom): def __init__(self, **kwargs): self.country = 'Ireland' HolidayBase.__init__(self, **kwargs) class IE(Ireland): pass class Spain(HolidayBase): PROVINCES = ['AND', 'ARG', 'AST', 'CAN', 'CAM', 'CAL', 'CAT', 'CVA', 'EXT', 'GAL', 'IBA', 'ICA', 'MAD', 'MUR', 'NAV', 'PVA', 'RIO'] def __init__(self, **kwargs): self.country = 'ES' self.prov = kwargs.pop('prov', kwargs.pop('state', '')) HolidayBase.__init__(self, **kwargs) def _populate(self, year): self[date(year, 1, 1)] = "Año nuevo" self[date(year, 1, 6)] = "Epifanía del Señor" if self.prov and self.prov in ['CVA', 'MUR', 'MAD', 'NAV', 'PVA']: self[date(year, 3, 19)] = "San José" if self.prov and self.prov != 'CAT': self[easter(year) + rd(weeks=-1, weekday=TH)] = "Jueves Santo" self[easter(year) + rd(weeks=-1, weekday=FR)] = "Viernes Santo" if self.prov and self.prov in ['CAT', 'PVA', 'NAV', 'CVA', 'IBA']: self[easter(year) + rd(weekday=MO)] = "Lunes de Pascua" self[date(year, 5, 1)] = "Día del Trabajador" if self.prov and self.prov in ['CAT', 'GAL']: self[date(year, 6, 24)] = "San Juan" self[date(year, 8, 15)] = "Asunción de la Virgen" self[date(year, 10, 12)] = "Día de la Hispanidad" self[date(year, 11, 1)] = "Todos los Santos" self[date(year, 12, 6)] = "Día de la constitución Española" self[date(year, 12, 8)] = "La Inmaculada Concepción" self[date(year, 12, 25)] = "Navidad" if self.prov and self.prov in ['CAT', 'IBA']: self[date(year, 12, 26)] = "San Esteban" # Provinces festive day if self.prov: if self.prov == 'AND': self[date(year, 2, 28)] = "Día de Andalucia" elif self.prov == 'ARG': self[date(year, 4, 23)] = "Día de San Jorge" elif self.prov == 'AST': self[date(year, 3, 8)] = "Día de Asturias" elif self.prov == 'CAN': self[date(year, 2, 28)] = "Día de la Montaña" elif self.prov == 'CAM': self[date(year, 2, 28)] = "Día de Castilla - La Mancha" elif self.prov == 'CAL': self[date(year, 4, 23)] = "Día de Castilla y Leon" elif self.prov == 'CAT': self[date(year, 9, 11)] = "Día Nacional de Catalunya" elif self.prov == 'CVA': self[date(year, 10, 9)] = "Día de la Comunidad Valenciana" elif self.prov == 'EXT': self[date(year, 9, 8)] = "Día de Extremadura" elif self.prov == 'GAL': self[date(year, 7, 25)] = "Día Nacional de Galicia" elif self.prov == 'IBA': self[date(year, 3, 1)] = "Día de las Islas Baleares" elif self.prov == 'ICA': self[date(year, 5, 30)] = "Día de Canarias" elif self.prov == 'MAD': self[date(year, 5, 2)] = "Día de Comunidad De Madrid" elif self.prov == 'MUR': self[date(year, 6, 9)] = "Día de la Región de Murcia" elif self.prov == 'NAV': self[date(year, 9, 27)] = "Día de Navarra" elif self.prov == 'PVA': self[date(year, 10, 25)] = "Día del Páis Vasco" elif self.prov == 'RIO': self[date(year, 6, 9)] = "Día de La Rioja" class ES(Spain): pass class EuropeanCentralBank(HolidayBase): # https://en.wikipedia.org/wiki/TARGET2 # http://www.ecb.europa.eu/press/pr/date/2000/html/pr001214_4.en.html def __init__(self, **kwargs): self.country = 'EU' HolidayBase.__init__(self, **kwargs) def _populate(self, year): self[date(year, 1, 1)] = "New Year's Day" e = easter(year) self[e - rd(days=2)] = "Good Friday" self[e + rd(days=1)] = "Easter Monday" self[date(year, 5, 1)] = "1 May (Labour Day)" self[date(year, 12, 25)] = "Christmas Day" self[date(year, 12, 26)] = "26 December" class ECB(EuropeanCentralBank): pass class TAR(EuropeanCentralBank): pass class Czech(HolidayBase): # https://en.wikipedia.org/wiki/Public_holidays_in_the_Czech_Republic def __init__(self, **kwargs): self.country = 'CZ' HolidayBase.__init__(self, **kwargs) def _populate(self, year): self[date(year, 1, 1)] = "Den obnovy samostatného českého státu" \ if year >= 2000 else \ "Nový rok" e = easter(year) if year <= 1951 or year >= 2016: self[e - rd(days=2)] = "Velký pátek" self[e + rd(days=1)] = "Velikonoční pondělí" if year >= 1951: self[date(year, 5, 1)] = "Svátek práce" if year >= 1992: self[date(year, 5, 8)] = "Den vítězství" elif year >= 1947: self[date(year, 5, 9)] = "Den vítězství nad hitlerovským fašismem" if year >= 1951: self[date(year, 7, 5)] = "Den slovanských věrozvěstů " \ "Cyrila a Metoděje" self[date(year, 7, 6)] = "Den upálení mistra Jana Husa" if year >= 2000: self[date(year, 9, 28)] = "Den české státnosti" if year >= 1951: self[date(year, 10, 28)] = "Den vzniku samostatného " \ "československého státu" if year >= 1990: self[date(year, 11, 17)] = "Den boje za svobodu a demokracii" if year >= 1990: self[date(year, 12, 24)] = "Štědrý den" if year >= 1951: self[date(year, 12, 25)] = "1. svátek vánoční" self[date(year, 12, 26)] = "2. svátek vánoční" class CZ(Czech): pass class Slovak(HolidayBase): # https://sk.wikipedia.org/wiki/Sviatok # https://www.slov-lex.sk/pravne-predpisy/SK/ZZ/1993/241/20160101 def __init__(self, **kwargs): self.country = 'SK' HolidayBase.__init__(self, **kwargs) def _populate(self, year): self[date(year, 1, 1)] = "Deň vzniku Slovenskej republiky" \ self[date(year, 1, 6)] = "Zjavenie Pána (Traja králi a vianočný" \ "sviatok pravoslávnych kresťanov)" e = easter(year) self[e - rd(days=2)] = "Veľký piatok" self[e + rd(days=1)] = "Veľkonočný pondelok" self[date(year, 5, 1)] = "Sviatok práce" if year >= 1997: self[date(year, 5, 8)] = "Deň víťazstva nad fašizmom" self[date(year, 7, 5)] = "Sviatok svätého Cyrila a svätého Metoda" self[date(year, 8, 29)] = "Výročie Slovenského národného povstania" self[date(year, 9, 1)] = "Deň Ústavy Slovenskej republiky" self[date(year, 9, 15)] = "Sedembolestná Panna Mária" self[date(year, 11, 1)] = "Sviatok Všetkých svätých" if year >= 2001: self[date(year, 11, 17)] = "Deň boja za slobodu a demokraciu" self[date(year, 12, 24)] = "Štedrý deň" self[date(year, 12, 25)] = "Prvý sviatok vianočný" self[date(year, 12, 26)] = "Druhý sviatok vianočný" class SK(Slovak): pass class Polish(HolidayBase): # https://pl.wikipedia.org/wiki/Dni_wolne_od_pracy_w_Polsce def __init__(self, **kwargs): self.country = 'PL' HolidayBase.__init__(self, **kwargs) def _populate(self, year): self[date(year, 1, 1)] = 'Nowy Rok' if year >= 2011: self[date(year, 1, 6)] = 'Święto Trzech Króli' e = easter(year) self[e] = 'Niedziela Wielkanocna' self[e + rd(days=1)] = 'Poniedziałek Wielkanocny' if year >= 1950: self[date(year, 5, 1)] = 'Święto Państwowe' if year >= 1919: self[date(year, 5, 3)] = 'Święto Narodowe Trzeciego Maja' self[e + rd(days=49)] = 'Zielone Świątki' self[e + rd(days=60)] = 'Dzień Bożego Ciała' self[date(year, 8, 15)] = 'Wniebowzięcie Najświętszej Marii Panny' self[date(year, 11, 1)] = 'Uroczystość Wszystkich świętych' if (1937 <= year <= 1945) or year >= 1989: self[date(year, 11, 11)] = 'Narodowe Święto Niepodległości' self[date(year, 12, 25)] = 'Boże Narodzenie (pierwszy dzień)' self[date(year, 12, 26)] = 'Boże Narodzenie (drugi dzień)' class PL(Polish): pass class Portugal(HolidayBase): # https://en.wikipedia.org/wiki/Public_holidays_in_Portugal def __init__(self, **kwargs): self.country = 'PT' HolidayBase.__init__(self, **kwargs) def _populate(self, year): self[date(year, 1, 1)] = "Ano Novo" e = easter(year) # carnival is no longer a holiday, but some companies let workers off. # @todo recollect the years in which it was a public holiday # self[e - rd(days=47)] = "Carnaval" self[e - rd(days=2)] = "Sexta-feira Santa" self[e] = "Páscoa" # Revoked holidays in 2013–2015 if year < 2013 or year > 2015: self[e + rd(days=60)] = "Corpo de Deus" self[date(year, 10, 5)] = "Implantação da República" self[date(year, 11, 1)] = "Dia de Todos os Santos" self[date(year, 12, 1)] = "Restauração da Independência" self[date(year, 4, 25)] = "Dia da Liberdade" self[date(year, 5, 1)] = "Dia do Trabalhador" self[date(year, 6, 10)] = "Dia de Portugal" self[date(year, 8, 15)] = "Assunção de Nossa Senhora" self[date(year, 12, 8)] = "Imaculada Conceição" self[date(year, 12, 25)] = "Christmas Day" class PT(Portugal): pass class PortugalExt(Portugal): """ Adds extended days that most people have as a bonus from their companies: - Carnival - the day before and after xmas - the day before the new year - Lisbon's city holiday """ def _populate(self, year): super(PortugalExt, self)._populate(year) e = easter(year) self[e - rd(days=47)] = "Carnaval" self[date(year, 12, 24)] = "Vespera de Natal" self[date(year, 12, 26)] = "26 de Dezembro" self[date(year, 12, 31)] = "Vespera de Ano novo" self[date(year, 6, 13)] = "Dia de Santo António" # TODO add bridging days # - get holydays that occur on twesday and add monday (-1 day) # - get holydays that occur on thursday and add friday (+1 day) class PTE(PortugalExt): pass class Netherlands(HolidayBase): SUNDAY = 6 def __init__(self, **kwargs): # http://www.iamsterdam.com/en/plan-your-trip/practical-info/public-holidays self.country = "NL" HolidayBase.__init__(self, **kwargs) def _populate(self, year): # New years self[date(year, 1, 1)] = "Nieuwjaarsdag" easter_date = easter(year) # Easter self[easter_date] = "Eerste paasdag" # Second easter day self[easter_date + rd(days=1)] = "Tweede paasdag" # Ascension day self[easter_date + rd(days=39)] = "Hemelvaart" # Pentecost self[easter_date + rd(days=49)] = "Eerste Pinksterdag" # Pentecost monday self[easter_date + rd(days=50)] = "Tweede Pinksterdag" # First christmas self[date(year, 12, 25)] = "Eerste Kerstdag" # Second christmas self[date(year, 12, 26)] = "Tweede Kerstdag" # Liberation day if year >= 1945 and year % 5 == 0: self[date(year, 5, 5)] = "Bevrijdingsdag" # Kingsday if year >= 2014: kings_day = date(year, 4, 27) if kings_day.weekday() == self.SUNDAY: kings_day = kings_day - rd(days=1) self[kings_day] = "Koningsdag" # Queen's day if 1891 <= year <= 2013: queens_day = date(year, 4, 30) if year <= 1948: queens_day = date(year, 8, 31) if queens_day.weekday() == self.SUNDAY: if year < 1980: queens_day = queens_day + rd(days=1) else: queens_day = queens_day - rd(days=1) self[queens_day] = "Koninginnedag" class NL(Netherlands): pass class Norway(HolidayBase): """ Norwegian holidays. Note that holidays falling on a sunday is "lost", it will not be moved to another day to make up for the collision. In Norway, ALL sundays are considered a holiday (https://snl.no/helligdag). Initialize this class with include_sundays=False to not include sundays as a holiday. Primary sources: https://lovdata.no/dokument/NL/lov/1947-04-26-1 https://no.wikipedia.org/wiki/Helligdager_i_Norge https://www.timeanddate.no/merkedag/norge/ """ def __init__(self, include_sundays=True, **kwargs): """ :param include_sundays: Whether to consider sundays as a holiday (which they are in Norway) :param kwargs: """ self.country = "NO" self.include_sundays = include_sundays HolidayBase.__init__(self, **kwargs) def _populate(self, year): # Add all the sundays of the year before adding the "real" holidays if self.include_sundays: first_day_of_year = date(year, 1, 1) first_sunday_of_year = first_day_of_year\ + rd(days=SUNDAY - first_day_of_year.weekday()) cur_date = first_sunday_of_year while cur_date < date(year+1, 1, 1): assert cur_date.weekday() == SUNDAY self[cur_date] = "Søndag" cur_date += rd(days=7) # ========= Static holidays ========= self[date(year, 1, 1)] = "Første nyttårsdag" # Source: https://lovdata.no/dokument/NL/lov/1947-04-26-1 if year >= 1947: self[date(year, 5, 1)] = "Arbeidernes dag" self[date(year, 5, 17)] = "Grunnlovsdag" # According to https://no.wikipedia.org/wiki/F%C3%B8rste_juledag, # these dates are only valid from year > 1700 # Wikipedia has no source for the statement, so leaving this be for now self[date(year, 12, 25)] = "Første juledag" self[date(year, 12, 26)] = "Andre juledag" # ========= Moving holidays ========= # NOTE: These are probably subject to the same > 1700 # restriction as the above dates. The only source I could find for how # long Easter has been celebrated in Norway was # https://www.hf.uio.no/ikos/tjenester/kunnskap/samlinger/norsk-folkeminnesamling/livs-og-arshoytider/paske.html # which says # "(...) has been celebrated for over 1000 years (...)" (in Norway) e = easter(year) maundy_thursday = e - rd(days=3) good_friday = e - rd(days=2) resurrection_sunday = e easter_monday = e + rd(days=1) ascension_thursday = e + rd(days=39) pentecost = e + rd(days=49) pentecost_day_two = e + rd(days=50) assert maundy_thursday.weekday() == THURSDAY assert good_friday.weekday() == FRIDAY assert resurrection_sunday.weekday() == SUNDAY assert easter_monday.weekday() == MONDAY assert ascension_thursday.weekday() == THURSDAY assert pentecost.weekday() == SUNDAY assert pentecost_day_two.weekday() == MONDAY self[maundy_thursday] = "Skjærtorsdag" self[good_friday] = "Langfredag" self[resurrection_sunday] = "Første påskedag" self[easter_monday] = "Andre påskedag" self[ascension_thursday] = "Kristi himmelfartsdag" self[pentecost] = "Første pinsedag" self[pentecost_day_two] = "Andre pinsedag" class NO(Norway): pass class Italy(HolidayBase): PROVINCES = ['MI', 'RM'] def __init__(self, **kwargs): self.country = 'IT' self.prov = kwargs.pop('prov', kwargs.pop('state', '')) HolidayBase.__init__(self, **kwargs) def _populate(self, year): self[date(year, 1, 1)] = "Capodanno" self[date(year, 1, 6)] = "Epifania del Signore" self[easter(year)] = "Pasqua di Resurrezione" self[easter(year) + rd(weekday=MO)] = "Lunedì dell'Angelo" if year >= 1946: self[date(year, 4, 25)] = "Festa della Liberazione" self[date(year, 5, 1)] = "Festa dei Lavoratori" if year >= 1948: self[date(year, 6, 2)] = "Festa della Repubblica" self[date(year, 8, 15)] = "Assunzione della Vergine" self[date(year, 11, 1)] = "Tutti i Santi" self[date(year, 12, 8)] = "Immacolata Concezione" self[date(year, 12, 25)] = "Natale" self[date(year, 12, 26)] = "Santo Stefano" # Provinces festive day # TODO: add all provinces' saints if self.prov: if self.prov == 'MI': self[date(year, 12, 7)] = "Sant'Ambrogio" if self.prov == 'RM': self[date(year, 6, 29)] = "Santi Pietro e Paolo" class IT(Italy): pass class Sweden(HolidayBase): """ Swedish holidays. Note that holidays falling on a sunday are "lost", it will not be moved to another day to make up for the collision. In Sweden, ALL sundays are considered a holiday (https://sv.wikipedia.org/wiki/Helgdagar_i_Sverige). Initialize this class with include_sundays=False to not include sundays as a holiday. Primary sources: https://sv.wikipedia.org/wiki/Helgdagar_i_Sverige and http://www.riksdagen.se/sv/dokument-lagar/dokument/svensk-forfattningssamling/lag-1989253-om-allmanna-helgdagar_sfs-1989-253 """ def __init__(self, include_sundays=True, **kwargs): """ :param include_sundays: Whether to consider sundays as a holiday (which they are in Sweden) :param kwargs: """ self.country = "SE" self.include_sundays = include_sundays HolidayBase.__init__(self, **kwargs) def _populate(self, year): # Add all the sundays of the year before adding the "real" holidays if self.include_sundays: first_day_of_year = date(year, 1, 1) first_sunday_of_year = first_day_of_year\ + rd(days=SUNDAY - first_day_of_year.weekday()) cur_date = first_sunday_of_year while cur_date < date(year + 1, 1, 1): assert cur_date.weekday() == SUNDAY self[cur_date] = "Söndag" cur_date += rd(days=7) # ========= Static holidays ========= self[date(year, 1, 1)] = "Nyårsdagen" self[date(year, 1, 6)] = "Trettondedag jul" # Source: https://sv.wikipedia.org/wiki/F%C3%B6rsta_maj if year >= 1939: self[date(year, 5, 1)] = "Första maj" # Source: https://sv.wikipedia.org/wiki/Sveriges_nationaldag if year >= 2005: self[date(year, 6, 6)] = "Sveriges nationaldag" self[date(year, 12, 24)] = "Julafton" self[date(year, 12, 25)] = "Juldagen" self[date(year, 12, 26)] = "Annandag jul" self[date(year, 12, 31)] = "Nyårsafton" # ========= Moving holidays ========= e = easter(year) maundy_thursday = e - rd(days=3) good_friday = e - rd(days=2) easter_saturday = e - rd(days=1) resurrection_sunday = e easter_monday = e + rd(days=1) ascension_thursday = e + rd(days=39) pentecost = e + rd(days=49) pentecost_day_two = e + rd(days=50) assert maundy_thursday.weekday() == THURSDAY assert good_friday.weekday() == FRIDAY assert easter_saturday.weekday() == SATURDAY assert resurrection_sunday.weekday() == SUNDAY assert easter_monday.weekday() == MONDAY assert ascension_thursday.weekday() == THURSDAY assert pentecost.weekday() == SUNDAY assert pentecost_day_two.weekday() == MONDAY self[good_friday] = "Långfredagen" self[resurrection_sunday] = "Påskdagen" self[easter_monday] = "Annandag påsk" self[ascension_thursday] = "Kristi himmelsfärdsdag" self[pentecost] = "Pingstdagen" if year <= 2004: self[pentecost_day_two] = "Annandag pingst" # Midsummer evening. Friday between June 19th and June 25th self[date(year, 6, 19) + rd(weekday=FR)] = "Midsommarafton" # Midsummer day. Saturday between June 20th and June 26th if year >= 1953: self[date(year, 6, 20) + rd(weekday=SA)] = "Midsommardagen" else: self[date(year, 6, 24)] = "Midsommardagen" # All saints day. Friday between October 31th and November 6th self[date(year, 10, 31) + rd(weekday=SA)] = "Alla helgons dag" if year <= 1953: self[date(year, 3, 25)] = "Jungfru Marie bebådelsedag" class SE(Sweden): pass class Japan(HolidayBase): # https://en.wikipedia.org/wiki/Public_holidays_in_Japan def __init__(self, **kwargs): self.country = 'JP' HolidayBase.__init__(self, **kwargs) def _populate(self, year): if year < 1949 or year > 2050: raise NotImplementedError # New Year's Day self[date(year, 1, 1)] = "元日" # Coming of Age Day if year <= 1999: self[date(year, 1, 15)] = "成人の日" else: self[date(year, 1, 1) + rd(weekday=MO(+2))] = "成人の日" # Foundation Day self[date(year, 2, 11)] = "建国記念の日" # Vernal Equinox Day self[self._vernal_equinox_day(year)] = "春分の日" # The former Emperor's Birthday, Greenery Day or Showa Day if year <= 1988: self[date(year, 4, 29)] = "天皇誕生日" elif year <= 2006: self[date(year, 4, 29)] = "みどりの日" else: self[date(year, 4, 29)] = "昭和の日" # Constitution Memorial Day self[date(year, 5, 3)] = "憲法記念日" # Greenery Day if year >= 2007: self[date(year, 5, 4)] = "みどりの日" # Children's Day self[date(year, 5, 5)] = "こどもの日" # Marine Day if year >= 1996 and year <= 2002: self[date(year, 7, 20)] = "海の日" elif year >= 2003: self[date(year, 7, 1) + rd(weekday=MO(+3))] = "海の日" # Mountain Day if year >= 2016: self[date(year, 8, 11)] = "山の日" # Respect for the Aged Day if year >= 1966 and year <= 2002: self[date(year, 9, 15)] = "敬老の日" elif year >= 2003: self[date(year, 9, 1) + rd(weekday=MO(+3))] = "敬老の日" # Autumnal Equinox Day self[self._autumnal_equinox_day(year)] = "秋分の日" # Health and Sports Day if year >= 1966 and year <= 1999: self[date(year, 10, 10)] = "体育の日" elif year >= 2000: self[date(year, 10, 1) + rd(weekday=MO(+2))] = "体育の日" # Culture Day self[date(year, 11, 3)] = "文化の日" # Labour Thanksgiving Day self[date(year, 11, 23)] = "勤労感謝の日" # The Emperor's Birthday if year >= 1989: self[date(year, 12, 23)] = "天皇誕生日" # A weekday between national holidays becomes a holiday too (国民の休日) self._add_national_holidays(year) # Substitute holidays self._add_substitute_holidays(year) def _vernal_equinox_day(self, year): day = 20 if year % 4 == 0: if year <= 1956: day = 21 elif year >= 2092: day = 19 elif year % 4 == 1: if year <= 1989: day = 21 elif year % 4 == 2: if year <= 2022: day = 21 elif year % 4 == 3: if year <= 2055: day = 21 return date(year, 3, day) def _autumnal_equinox_day(self, year): day = 22 if year % 4 == 0: if year <= 2008: day = 23 elif year % 4 == 1: if year <= 2041: day = 23 elif year % 4 == 2: if year <= 2074: day = 23 elif year % 4 == 3: if year <= 1979: day = 24 else: day = 23 return date(year, 9, day) def _add_national_holidays(self, year): if year in (1993, 1999, 2004, 1988, 1994, 2005, 1989, 1995, 2000, 2006, 1990, 2001, 1991, 1996, 2002): self[date(year, 5, 4)] = "国民の休日" if year in (2032, 2049, 2060, 2077, 2088, 2094): self[date(year, 9, 21)] = "国民の休日" if year in (2009, 2015, 2026, 2037, 2043, 2054, 2065, 2071, 2099): self[date(year, 9, 22)] = "国民の休日" def _add_substitute_holidays(self, year): table = ( (1, 2, (1978, 1984, 1989, 1995, 2006, 2012, 2017, 2023, 2034, 2040, 2045)), (1, 16, (1978, 1984, 1989, 1995)), (2, 12, (1979, 1990, 1996, 2001, 2007, 2018, 2024, 2029, 2035, 2046)), (3, 21, (1988, 2005, 2016, 2033, 2044, 2050)), (3, 22, (1982, 1999, 2010, 2027)), (4, 30, (1973, 1979, 1984, 1990, 2001, 2007, 2012, 2018, 2029, 2035, 2040, 2046)), (5, 4, (1981, 1987, 1992, 1998)), (5, 6, (1985, 1991, 1996, 2002, 2013, 2019, 2024, 2030, 2041, 2047, 2008, 2014, 2025, 2031, 2036, 2042, 2009, 2015, 2020, 2026, 2037, 2043, 2048)), (7, 21, (1997,)), (8, 12, (2019, 2024, 2030, 2041, 2047)), (9, 16, (1974, 1985, 1991, 1996, 2002)), (9, 23, (2024,)), (9, 24, (1973, 1984, 1990, 2001, 2007, 2018, 2029, 2035, 2046)), (10, 11, (1976, 1982, 1993, 1999)), (11, 4, (1974, 1985, 1991, 1996, 2002, 2013, 2019, 2024, 2030, 2041, 2047)), (11, 24, (1975, 1980, 1986, 1997, 2003, 2008, 2014, 2025, 2031, 2036, 2042)), (12, 24, (1990, 2001, 2007, 2012, 2018)), ) for holiday in table: month = holiday[0] day = holiday[1] years = holiday[2] if year in years: self[date(year, month, day)] = "振替休日" class JP(Japan): pass class France(HolidayBase): """Official French holidays. Some provinces have specific holidays, only those are included in the PROVINCES, because these provinces have different administrative status, which makes it difficult to enumerate. For religious holidays usually happening on Sundays (Easter, Pentecost), only the following Monday is considered a holiday. Primary sources: https://fr.wikipedia.org/wiki/Fêtes_et_jours_fériés_en_France https://www.service-public.fr/particuliers/vosdroits/F2405 """ PROVINCES = ['Métropole', 'Alsace-Moselle', 'Guadeloupe', 'Guyane', 'Martinique', 'Mayotte', 'Nouvelle-Calédonie', 'La Réunion', 'Polynésie Française', 'Saint-Barthélémy', 'Saint-Martin', 'Wallis-et-Futuna'] def __init__(self, **kwargs): self.country = 'FR' self.prov = kwargs.pop('prov', 'Métropole') HolidayBase.__init__(self, **kwargs) def _populate(self, year): # Civil holidays if year > 1810: self[date(year, 1, 1)] = "Jour de l'an" if year > 1919: name = 'Fête du Travail' if year <= 1948: name += ' et de la Concorde sociale' self[date(year, 5, 1)] = name if (year >= 1953 and year <= 1959) or year > 1981: self[date(year, 5, 8)] = 'Armistice 1945' if year >= 1880: self[date(year, 7, 14)] = 'Fête nationale' if year >= 1918: self[date(year, 11, 11)] = 'Armistice 1918' # Religious holidays if self.prov in ['Alsace-Moselle', 'Guadeloupe', 'Guyane', 'Martinique', 'Polynésie Française']: self[easter(year) - rd(days=2)] = 'Vendredi saint' if self.prov == 'Alsace-Moselle': self[date(year, 12, 26)] = 'Deuxième jour de Noël' if year >= 1886: self[easter(year) + rd(days=1)] = 'Lundi de Pâques' self[easter(year) + rd(days=50)] = 'Lundi de Pentecôte' if year >= 1802: self[easter(year) + rd(days=39)] = 'Ascension' self[date(year, 8, 15)] = 'Assomption' self[date(year, 11, 1)] = 'Toussaint' name = 'Noël' if self.prov == 'Alsace-Moselle': name = 'Premier jour de ' + name self[date(year, 12, 25)] = name # Non-metropolitan holidays (starting dates missing) if self.prov == 'Mayotte': self[date(year, 4, 27)] = "Abolition de l'esclavage" if self.prov == 'Wallis-et-Futuna': self[date(year, 4, 28)] = 'Saint Pierre Chanel' if self.prov == 'Martinique': self[date(year, 5, 22)] = "Abolition de l'esclavage" if self.prov in ['Guadeloupe', 'Saint-Martin']: self[date(year, 5, 27)] = "Abolition de l'esclavage" if self.prov == 'Guyane': self[date(year, 6, 10)] = "Abolition de l'esclavage" if self.prov == 'Polynésie Française': self[date(year, 6, 29)] = "Fête de l'autonomie" if self.prov in ['Guadeloupe', 'Martinique']: self[date(year, 7, 21)] = 'Fête Victor Schoelcher' if self.prov == 'Wallis-et-Futuna': self[date(year, 7, 29)] = 'Fête du Territoire' if self.prov == 'Nouvelle-Calédonie': self[date(year, 9, 24)] = 'Fête de la Citoyenneté' if self.prov == 'Saint-Barthélémy': self[date(year, 10, 9)] = "Abolition de l'esclavage" if self.prov == 'La Réunion' and year >= 1981: self[date(year, 12, 20)] = "Abolition de l'esclavage" # FR already exists (Friday), we don't want to mess it up class FRA(France): pass class Belgium(HolidayBase): """ https://www.belgium.be/nl/over_belgie/land/belgie_in_een_notendop/feestdagen https://nl.wikipedia.org/wiki/Feestdagen_in_Belgi%C3%AB """ def __init__(self, **kwargs): self.country = "BE" HolidayBase.__init__(self, **kwargs) def _populate(self, year): # New years self[date(year, 1, 1)] = "Nieuwjaarsdag" easter_date = easter(year) # Easter self[easter_date] = "Pasen" # Second easter day self[easter_date + rd(days=1)] = "Paasmaandag" # Ascension day self[easter_date + rd(days=39)] = "O.L.H. Hemelvaart" # Pentecost self[easter_date + rd(days=49)] = "Pinksteren" # Pentecost monday self[easter_date + rd(days=50)] = "Pinkstermaandag" # International Workers' Day self[date(year, 5, 1)] = "Dag van de Arbeid" # Belgian National Day self[date(year, 7, 21)] = "Nationale feestdag" # Assumption of Mary self[date(year, 8, 15)] = "O.L.V. Hemelvaart" # All Saints' Day self[date(year, 11, 1)] = "Allerheiligen" # Armistice Day self[date(year, 11, 11)] = "Wapenstilstand" # First christmas self[date(year, 12, 25)] = "Kerstmis" class BE(Belgium): pass class SouthAfrica(HolidayBase): def __init__(self, **kwargs): # http://www.gov.za/about-sa/public-holidays self.country = "ZA" HolidayBase.__init__(self, **kwargs) def _populate(self, year): self[date(year, 1, 1)] = "New Year's Day" self[date(year, 3, 21)] = "Human Rights Day" e = easter(year) good_friday = e - rd(days=2) easter_monday = e + rd(days=1) self[good_friday] = "Good Friday" self[easter_monday] = "Family Day" self[date(year, 4, 27)] = "Freedom Day" self[date(year, 5, 1)] = "Worker's Day" self[date(year, 6, 16)] = "Youth Day" self[date(year, 8, 9)] = "National Women's Day" self[date(year, 9, 24)] = "Heritage Day" self[date(year, 12, 16)] = "Day of Reconciliation" self[date(year, 12, 25)] = "Christmas Day" self[date(year, 12, 26)] = "Day of Goodwill" for k, v in list(self.items()): if self.observed and k.weekday() == 6: self[k + rd(days=1)] = v + " (Observed)" class ZA(SouthAfrica): pass class Slovenia(HolidayBase): """ Contains all work-free public holidays in Slovenia. No holidays are returned before year 1991 when Slovenia became independent country. Before that Slovenia was part of Socialist federal republic of Yugoslavia. List of holidays (including those that are not work-free: https://en.wikipedia.org/wiki/Public_holidays_in_Slovenia """ def __init__(self, **kwargs): self.country = 'SI' HolidayBase.__init__(self, **kwargs) def _populate(self, year): if year <= 1990: return if year > 1991: self[date(year, 1, 1)] = "novo leto" # Between 2012 and 2017 2nd January was not public holiday, # or at least not work-free day if year < 2013 or year > 2016: self[date(year, 1, 2)] = "novo leto" # Prešeren's day, slovenian cultural holiday self[date(year, 2, 8)] = "Prešernov dan" # Easter monday is the only easter related work-free day easter_day = easter(year) self[easter_day + rd(days=1)] = "Velikonočni ponedeljek" # Day of uprising against occupation self[date(year, 4, 27)] = "dan upora proti okupatorju" # Labour day, two days of it! self[date(year, 5, 1)] = "praznik dela" self[date(year, 5, 2)] = "praznik dela" # Statehood day self[date(year, 6, 25)] = "dan državnosti" # Assumption day self[date(year, 8, 15)] = "Marijino vnebovzetje" # Reformation day self[date(year, 10, 31)] = "dan reformacije" # Remembrance day self[date(year, 11, 1)] = "dan spomina na mrtve" # Christmas self[date(year, 12, 25)] = "Božič" # Day of independence and unity self[date(year, 12, 26)] = "dan samostojnosti in enotnosti" class SI(Slovenia): pass class Finland(HolidayBase): # https://en.wikipedia.org/wiki/Public_holidays_in_Finland def __init__(self, **kwargs): self.country = "FI" HolidayBase.__init__(self, **kwargs) def _populate(self, year): e = easter(year) self[date(year, 1, 1)] = "Uudenvuodenpäivä" self[date(year, 1, 6)] = "Loppiainen" self[e - rd(days=2)] = "Pitkäperjantai" self[e] = "Pääsiäispäivä" self[e + rd(days=1)] = "2. pääsiäispäivä" self[date(year, 5, 1)] = "Vappu" self[e + rd(days=39)] = "Helatorstai" self[e + rd(days=49)] = "Helluntaipäivä" self[date(year, 6, 20) + rd(weekday=SA)] = "Juhannuspäivä" self[date(year, 10, 31) + rd(weekday=SA)] = "Pyhäinpäivä" self[date(year, 12, 6)] = "Itsenäisyyspäivä" self[date(year, 12, 25)] = "Joulupäivä" self[date(year, 12, 26)] = "Tapaninpäivä" # Juhannusaatto (Midsummer Eve) and Jouluaatto (Christmas Eve) are not # official holidays, but are de facto. self[date(year, 6, 19) + rd(weekday=FR)] = "Juhannusaatto" self[date(year, 12, 24)] = "Jouluaatto" class FI(Finland): pass holidays-0.9.3/__init__.py0000644000175000017500000000000013203533516015713 0ustar maurimauri00000000000000holidays-0.9.3/setup.cfg0000644000175000017500000000004613230430403015424 0ustar maurimauri00000000000000[egg_info] tag_build = tag_date = 0 holidays-0.9.3/PKG-INFO0000644000175000017500000004472313230430403014712 0ustar maurimauri00000000000000Metadata-Version: 1.1 Name: holidays Version: 0.9.3 Summary: Generate and work with holidays in Python Home-page: https://github.com/dr-prodigy/python-holidays Author: dr-prodigy Author-email: maurizio.montel@gmail.com License: MIT Description-Content-Type: UNKNOWN Description: =============== python-holidays =============== A fast, efficient Python library for generating country, province and state specific sets of holidays on the fly. It aims to make determining whether a specific date is a holiday as fast and flexible as possible. .. image:: http://img.shields.io/travis/dr-prodigy/python-holidays.svg :target: https://travis-ci.org/dr-prodigy/python-holidays .. image:: http://img.shields.io/coveralls/dr-prodigy/python-holidays.svg :target: https://coveralls.io/r/dr-prodigy/python-holidays .. image:: http://img.shields.io/pypi/v/holidays.svg :target: https://pypi.python.org/pypi/holidays .. image:: http://img.shields.io/pypi/l/holidays.svg :target: https://github.com/dr-prodigy/python-holidays/blob/master/LICENSE Example Usage ------------- .. code-block:: python from datetime import date import holidays us_holidays = holidays.UnitedStates() # or holidays.US() date(2015, 1, 1) in us_holidays # True date(2015, 1, 2) in us_holidays # False # The Holiday class will also recognize strings of any format # and int/float representing a Unix timestamp '2014-01-01' in us_holidays # True '1/1/2014' in us_holidays # True 1388597445 in us_holidays # True us_holidays.get('2014-01-01') # "New Year's Day" # Easily create custom Holiday objects with your own dates instead # of using the pre-defined countries/states/provinces available custom_holidays = holidays.HolidayBase() # Append custom holiday dates by passing: # 1) a dict with date/name key/value pairs, custom_holidays.append({"2015-01-01": "New Year's Day"}) # 2) a list of dates (in any format: date, datetime, string, integer), custom_holidays.append(['2015-07-01', '07/04/2015']) # 3) a single date item custom_holidays.append(date(2015, 12, 25)) date(2015, 1, 1) in custom_holidays # True date(2015, 1, 2) in custom_holidays # False '12/25/2015' in custom_holidays # True # For more complex logic like 4th Monday of January, you can inherit the # HolidayBase class and define your own _populate(year) method. See below # documentation for examples. Install ------- The latest stable version can always be installed or updated via pip: .. code-block:: bash $ pip install holidays If the above fails, please use easy_install instead: .. code-block:: bash $ easy_install holidays Available Countries ------------------- =================== ======== ============================================================= Country Abbr Provinces/States Available =================== ======== ============================================================= Australia AU prov = **ACT** (default), NSW, NT, QLD, SA, TAS, VIC, WA Austria AT prov = B, K, N, O, S, ST, T, V, **W** (default) Belgium BE None Canada CA prov = AB, BC, MB, NB, NL, NS, NT, NU, **ON** (default), PE, QC, SK, YU Colombia CO None Czech CZ None Denmark DK None England None EuropeanCentralBank ECB,TAR Trans-European Automated Real-time Gross Settlement (TARGET2) Finland FI None France FRA **Métropole** (default), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion, Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna Germany DE BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH Ireland IE Isle of Man None Italy IT prov = MI, RM Japan JP None Mexico MX None Netherlands NL None NewZealand NZ prov = NTL, AUK, TKI, HKB, WGN, MBH, NSN, CAN, STC, WTL, OTA, STL, CIT Northern Ireland None Norway NO None Polish PL None Portugal PT None PortugalExt PTE *Portugal plus extended days most people have off* Scotland None Slovenia SI None Slovakia SK None South Africa ZA None Spain ES prov = AND, ARG, AST, CAN, CAM, CAL, CAT, CVA, EXT, GAL, IBA, ICA, MAD, MUR, NAV, PVA, RIO Sweden SE None UnitedKingdom UK None UnitedStates US state = AL, AK, AS, AZ, AR, CA, CO, CT, DE, DC, FL, GA, GU, HI, ID, IL, IN, IA, KS, KY, LA, ME, MD, MH, MA, MI, FM, MN, MS, MO, MT, NE, NV, NH, NJ, NM, NY, NC, ND, MP, OH, OK, OR, PW, PA, PR, RI, SC, SD, TN, TX, UT, VT, VA, VI, WA, WV, WI, WY Wales None =================== ======== ============================================================= API --- class holidays.HolidayBase(years=[], expand=True, observed=True, prov=None, state=None) The base class used to create holiday country classes. Parameters: years An iterable list of integers specifying the years that the Holiday object should pre-generate. This would generally only be used if setting *expand* to False. (Default: []) expand A boolean value which specifies whether or not to append holidays in new years to the holidays object. (Default: True) observed A boolean value which when set to True will include the observed day of a holiday that falls on a weekend, when appropriate. (Default: True) prov A string specifying a province that has unique statutory holidays. (Default: Australia='ACT', Canada='ON', NewZealand=None) state A string specifying a state that has unique statutory holidays. (Default: UnitedStates=None) Methods: get(key, default=None) Returns a string containing the name of the holiday(s) in date `key`, which can be of date, datetime, string, unicode, bytes, integer or float type. If multiple holidays fall on the same date the names will be seperated by commas get_list(key) Same as `get` except returns a `list` of holiday names instead of a comma seperated string pop(key, default=None) Same as `get` except the key is removed from the holiday object update/append Accepts dictionary of {date: name} pairs, a list of dates, or even singular date/string/timestamp objects and adds them to the list of holidays More Examples ------------- .. code-block:: python # Simplest example possible >>> from datetime import date >>> import holidays >>> date(2014, 1, 1) in holidays.US() True >> date(2014, 1, 2) in holidays.US() False # But this is not efficient because it is initializing a new Holiday object # and generating a list of all the holidays in 2014 during each comparison # It is more efficient to create the object only once >>> us_holidays = holidays.US() >>> date(2014, 1, 1) in us_holidays True >> date(2014, 1, 2) in us_holidays False # Each country has two class names that can be called--a full name # and an abbreviation. Use whichever you prefer. >>> holidays.UnitedStates() == holidays.US() True >>> holidays.Canada() == holidays.CA() True >>> holidays.US() == holidays.CA() False # Let's print out the holidays in 2014 specific to California, USA >>> for date, name in sorted(holidays.US(state='CA', years=2014).items()): >>> print(date, name) 2014-01-01 New Year's Day 2014-01-20 Martin Luther King, Jr. Day 2014-02-15 Susan B. Anthony Day 2014-02-17 Washington's Birthday 2014-03-31 César Chávez Day 2014-05-26 Memorial Day 2014-07-04 Independence Day 2014-09-01 Labor Day 2014-10-13 Columbus Day 2014-11-11 Veterans Day 2014-11-27 Thanksgiving 2014-12-25 Christmas Day # So far we've only checked holidays in 2014 so that's the only year the # Holidays object has generated >>> us_holidays.years set([2014]) >>> len(us_holidays) 10 # Because by default the `expand` param is True the Holiday object will add # holidays from other years as they are required. >>> date(2013, 1, 1) in us_holidays True >>> us_holidays.years set([2013, 2014]) >>> len(us_holidays) 20 # If we change the `expand` param to False the Holiday object will no longer # add holidays from new years >>> us_holidays.expand = False >>> date(2012, 1, 1) in us_holidays False >>> us.holidays.expand = True >>> date(2012, 1, 1) in us_holidays True # January 1st, 2012 fell on a Sunday so the statutory holiday was observed # on the 2nd. By default the `observed` param is True so the holiday list # will include January 2nd, 2012 as a holiday. >>> date(2012, 1, 1) in us_holidays True >>> us_holidays[date(2012, 1, 1)] "New Year's Eve" >>> date(2012, 1, 2) in us_holidays True >>> us_holidays.get(date(2012 ,1, 2)) "New Year's Eve (Observed)" # The `observed` and `expand` values can both be changed on the fly and the # holiday list will be adjusted accordingly >>> us_holidays.observed = False >>> date(2012, 1, 2) in us_holidays False us_holidays.observed = True >> date(2012, 1, 2) in us_holidays True # Holiday objects can be added together and the resulting object will # generate the holidays from all of the initial objects >>> north_america = holidays.CA() + holidays.US() + holidays.MX() >>> north_america.get('2014-07-01') "Canada Day" >>> north_america.get('2014-07-04') "Independence Day" # The other form of addition is also available >>> north_america = holidays.Canada() >>> north_america += holidays.UnitedStates() >>> north_america += holidays.Mexico() >>> north_america.country ['CA', 'US', 'MX'] # We can even get a set of holidays that include all the province- or # state-specific holidays using the built-in sum() function >>> a = sum([holidays.CA(prov=x) for x in holidays.CA.PROVINCES]) >>> a.prov PROVINCES = ['AB', 'BC', 'MB', 'NB', 'NL', 'NS', 'NT', 'NU', 'ON', 'PE', 'QC', 'SK', 'YU'] # Sometimes we may not be able to use the official federal statutory # holiday list in our code. Let's pretend we work for a company that # does not include Columbus Day as a statutory holiday but does include # "Ninja Turtle Day" on July 13th. We can create a new class that inherits # the UnitedStates class and the only method we need to override is _populate() >>> from dateutil.relativedelta import relativedelta >>> class CorporateHolidays(holidays.UnitedStates): >>> def _populate(self, year): >>> # Populate the holiday list with the default US holidays >>> holidays.UnitedStates._populate(self, year) >>> # Remove Columbus Day >>> self.pop(date(year, 10, 1) + relativedelta(weekday=MO(+2)), None) >>> # Add Ninja Turtle Day >>> self[date(year, 7, 13)] = "Ninja Turtle Day" >>> date(2014, 10, 14) in Holidays(country="US") True >>> date(2014, 10, 14) in CorporateHolidays(country="US") False >>> date(2014, 7, 13) in Holidays(country="US") False >>> date(2014 ,7, 13) in CorporateHolidays(country="US") True # We can also inherit from the HolidayBase class which has an empty # _populate method so we start with no holidays and must define them # all ourself. This is how we would create a holidays class for a country # that is not supported yet. >>> class NewCountryHolidays(holidays.HolidayBase): >>> def _populate(self, year): >>> self[date(year, 1, 2)] = "Some Federal Holiday" >>> self[date(year, 2, 3)] = "Another Federal Holiday" >>> hdays = NewCountryHolidays() # We can also include prov/state specific holidays in our new class. >>> class NewCountryHolidays(holidays.HolidayBase): >>> def _populate(self, year): >>> # Set default prov if not provided >>> if self.prov == None: >>> self.prov = 'XX' >>> self[date(year, 1, 2)] = "Some Federal Holiday" >>> if self.prov == 'XX': >>> self[date(year, 2, 3)] = "Special XX province-only holiday" >>> if self.prov == 'YY': >>> self[date(year, 3, 4)] = "Special YY province-only holiday" >>> hdays = NewCountryHolidays() >>> hdays = NewCountryHolidays(prov='XX') # If you write the code necessary to create a holiday class for a country # not currently supported please contribute your code to the project! # Perhaps you just have a list of dates that are holidays and want to turn # them into a Holiday class to access all the useful functionality. You can # use the append() method which accepts a dictionary of {date: name} pairs, # a list of dates, or even singular date/string/timestamp objects. >>> custom_holidays = holidays.HolidaysBase() >>> custom_holidays.append(['2015-01-01', '07/04/2015']) >>> custom_holidays.append(date(2015, 12, 25)) Development Version ------------------- The latest development version can be installed directly from GitHub: .. code-block:: bash $ pip install --upgrade https://github.com/dr-prodigy/python-holidays/tarball/master Running Tests ------------- .. code-block:: bash $ pip install flake8 $ flake8 holidays.py tests.py $ python tests.py Coverage -------- .. code-block:: bash $ pip install coverage $ coverage run --omit=*site-packages* tests.py $ coverage report -m Contributions ------------- .. _issues: https://github.com/dr-prodigy/python-holidays/issues .. __: https://github.com/dr-prodigy/python-holidays/pulls Issues_ and `Pull Requests`__ are always welcome. License ------- .. __: https://github.com/dr-prodigy/python-holidays/raw/master/LICENSE Code and documentation are available according to the MIT License (see LICENSE__). Platform: any Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Office/Business :: Scheduling Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Software Development :: Localization holidays-0.9.3/tests.py0000644000175000017500000052064013230415556015342 0ustar maurimauri00000000000000# -*- coding: utf-8 -*- # python-holidays # --------------- # A fast, efficient Python library for generating country, province and state # specific sets of holidays on the fly. It aims to make determining whether a # specific date is a holiday as fast and flexible as possible. # # Author: ryanss (c) 2014-1017 # dr-prodigy (c) 2018 # Website: https://github.com/dr-prodigy/python-holidays # License: MIT (see LICENSE file) from itertools import product from datetime import date, datetime from dateutil.relativedelta import relativedelta, MO import unittest import holidays class TestBasics(unittest.TestCase): def setUp(self): self.holidays = holidays.US() def test_contains(self): self.assertTrue(date(2014, 1, 1) in self.holidays) self.assertFalse(date(2014, 1, 2) in self.holidays) def test_getitem(self): self.assertEqual(self.holidays[date(2014, 1, 1)], "New Year's Day") self.assertEqual(self.holidays.get(date(2014, 1, 1)), "New Year's Day") self.assertRaises(KeyError, lambda: self.holidays[date(2014, 1, 2)]) self.assertEqual(self.holidays.get(date(2014, 1, 2)), None) def test_get(self): self.assertEqual(self.holidays.get('2014-01-01'), "New Year's Day") self.assertEqual(self.holidays.get('2014-01-02'), None) self.assertFalse(self.holidays.get('2014-01-02', False)) self.assertTrue(self.holidays.get('2014-01-02', True)) def test_pop(self): self.assertRaises(KeyError, lambda: self.holidays.pop('2014-01-02')) self.assertFalse(self.holidays.pop('2014-01-02', False)) self.assertTrue(self.holidays.pop('2014-01-02', True)) self.assertTrue(date(2014, 1, 1) in self.holidays) self.assertEqual(self.holidays.pop('2014-01-01'), "New Year's Day") self.assertFalse(date(2014, 1, 1) in self.holidays) self.assertTrue(date(2014, 7, 4) in self.holidays) def test_setitem(self): self.holidays = holidays.US(years=[2014]) self.assertEqual(len(self.holidays), 10) self.holidays[date(2014, 1, 3)] = "Fake Holiday" self.assertEqual(len(self.holidays), 11) self.assertTrue(date(2014, 1, 3) in self.holidays) self.assertEqual(self.holidays.get(date(2014, 1, 3)), "Fake Holiday") def test_update(self): h = holidays.HolidayBase() h.update({ date(2015, 1, 1): "New Year's Day", '2015-12-25': "Christmas Day", }) self.assertTrue('2015-01-01' in h) self.assertTrue(date(2015, 12, 25) in h) def test_append(self): h = holidays.HolidayBase() h.update({ date(2015, 1, 1): "New Year's Day", '2015-12-25': "Christmas Day", }) h.append([date(2015, 4, 1), '2015-04-03']) h.append(date(2015, 4, 6)) h.append('2015-04-07') self.assertTrue('2015-01-01' in h) self.assertTrue(date(2015, 12, 25) in h) self.assertTrue('2015-04-01' in h) self.assertFalse('2015-04-02' in h) self.assertTrue('2015-04-03' in h) self.assertFalse('2015-04-04' in h) self.assertFalse('2015-04-05' in h) self.assertTrue('2015-04-06' in h) self.assertTrue('2015-04-07' in h) def test_eq_ne(self): us1 = holidays.UnitedStates() us2 = holidays.US() us3 = holidays.UnitedStates(years=[2014]) us4 = holidays.US(years=[2014]) ca1 = holidays.Canada() ca2 = holidays.CA() ca3 = holidays.Canada(years=[2014]) ca4 = holidays.CA(years=[2014]) self.assertEqual(us1, us2) self.assertEqual(us3, us4) self.assertEqual(ca1, ca2) self.assertEqual(ca3, ca4) self.assertNotEqual(us1, us3) self.assertNotEqual(us1, ca1) self.assertNotEqual(us3, ca3) self.assertTrue(us1 != us3) def test_add(self): ca = holidays.CA() us = holidays.US() mx = holidays.MX() na = ca + (us + mx) self.assertFalse('2014-07-01' in us) self.assertTrue('2014-07-01' in ca) self.assertFalse('2014-07-04' in ca) self.assertTrue('2014-07-04' in us) self.assertTrue('2014-07-04' in ca+us) self.assertTrue('2014-07-04' in us+ca) self.assertTrue('2015-07-04' in ca+us) self.assertTrue('2015-07-04' in us+ca) self.assertTrue('2015-07-01' in ca+us) self.assertTrue('2015-07-01' in us+ca) self.assertTrue('2014-07-04' in na) self.assertTrue('2015-07-04' in na) self.assertTrue('2015-07-01' in na) self.assertTrue('2000-02-05' in na) self.assertEqual((ca+us).prov, 'ON') self.assertEqual((us+ca).prov, 'ON') ca = holidays.CA(years=[2014], expand=False) us = holidays.US(years=[2014, 2015], expand=True) self.assertTrue((ca+us).expand) self.assertEqual((ca+us).years, {2014, 2015}) self.assertEqual((us+ca).years, {2014, 2015}) na = holidays.CA() na += holidays.US() na += holidays.MX() self.assertEqual(na.country, ['CA', 'US', 'MX']) self.assertTrue('2014-07-04' in na) self.assertTrue('2014-07-04' in na) self.assertTrue('2015-07-04' in na) self.assertTrue('2015-07-04' in na) self.assertTrue('2015-07-01' in na) self.assertTrue('2015-07-01' in na) self.assertTrue('2000-02-05' in na) self.assertEqual(na.prov, 'ON') na = holidays.CA() + holidays.US() na += holidays.MX() self.assertTrue('2014-07-04' in na) self.assertTrue('2014-07-04' in na) self.assertTrue('2015-07-04' in na) self.assertTrue('2015-07-04' in na) self.assertTrue('2015-07-01' in na) self.assertTrue('2015-07-01' in na) self.assertTrue('2000-02-05' in na) self.assertEqual(na.prov, 'ON') self.assertRaises(TypeError, lambda: holidays.US() + {}) na = ca + (us + mx) + ca + (mx + us + holidays.CA(prov='BC')) self.assertTrue('2000-02-05' in na) self.assertTrue('2014-02-10' in na) self.assertTrue('2014-02-17' in na) self.assertTrue('2014-07-04' in na) provs = (holidays.CA(prov='ON', years=[2014]) + holidays.CA(prov='BC', years=[2015])) self.assertTrue("2015-02-09" in provs) self.assertTrue("2015-02-16" in provs) self.assertEqual(provs.prov, ['ON', 'BC']) a = sum([holidays.CA(prov=x) for x in holidays.CA.PROVINCES]) self.assertEqual(a.country, 'CA') self.assertEqual(a.prov, holidays.CA.PROVINCES) self.assertTrue("2015-02-09" in a) self.assertTrue("2015-02-16" in a) na = holidays.CA() + holidays.US() + holidays.MX() self.assertTrue(date(1969, 12, 25) in na) self.assertEqual(na.get(date(1969, 7, 1)), "Canada Day") self.assertEqual(na.get(date(1969, 12, 25)), "Christmas Day, Navidad [Christmas]") na = holidays.MX() + holidays.CA() + holidays.US() self.assertEqual(na.get(date(1969, 12, 25)), "Navidad [Christmas], Christmas Day") def test_get_list(self): westland = holidays.NZ(prov='WTL') chathams = holidays.NZ(prov='CIT') wild = westland + chathams self.assertEqual(wild[date(1969, 12, 1)], ("Westland Anniversary Day, " + "Chatham Islands Anniversary Day")) self.assertEqual(wild.get_list(date(1969, 12, 1)), ["Westland Anniversary Day", "Chatham Islands Anniversary Day"]) self.assertEqual(wild.get_list(date(1969, 1, 1)), ["New Year's Day"]) self.assertEqual(westland.get_list(date(1969, 12, 1)), ["Westland Anniversary Day"]) self.assertEqual(westland.get_list(date(1969, 1, 1)), ["New Year's Day"]) self.assertEqual(chathams.get_list(date(1969, 12, 1)), ["Chatham Islands Anniversary Day"]) self.assertEqual(chathams.get_list(date(1969, 1, 1)), ["New Year's Day"]) ca = holidays.CA() us = holidays.US() mx = holidays.MX() na = ca + us + mx self.assertTrue(date(1969, 12, 25) in na) self.assertEqual(na.get_list(date(1969, 12, 25)), ["Christmas Day", "Navidad [Christmas]"]) self.assertEqual(na.get_list(date(1969, 7, 1)), ["Canada Day"]) self.assertEqual(na.get_list(date(1969, 1, 3)), []) def test_radd(self): self.assertRaises(TypeError, lambda: 1 + holidays.US()) def test_inheritance(self): class NoColumbusHolidays(holidays.US): def _populate(self, year): holidays.US._populate(self, year) self.pop(date(year, 10, 1) + relativedelta(weekday=MO(+2))) hdays = NoColumbusHolidays() self.assertTrue(date(2014, 10, 13) in self.holidays) self.assertFalse(date(2014, 10, 13) in hdays) self.assertTrue(date(2014, 1, 1) in hdays) self.assertTrue(date(2020, 10, 12) in self.holidays) self.assertFalse(date(2020, 10, 12) in hdays) self.assertTrue(date(2020, 1, 1) in hdays) class NinjaTurtlesHolidays(holidays.US): def _populate(self, year): holidays.US._populate(self, year) self[date(year, 7, 13)] = "Ninja Turtle's Day" hdays = NinjaTurtlesHolidays() self.assertFalse(date(2014, 7, 13) in self.holidays) self.assertTrue(date(2014, 7, 13) in hdays) self.assertTrue(date(2014, 1, 1) in hdays) self.assertFalse(date(2020, 7, 13) in self.holidays) self.assertTrue(date(2020, 7, 13) in hdays) self.assertTrue(date(2020, 1, 1) in hdays) class NewCountry(holidays.HolidayBase): def _populate(self, year): self[date(year, 1, 2)] = "New New Year's" hdays = NewCountry() self.assertFalse(date(2014, 1, 1) in hdays) self.assertTrue(date(2014, 1, 2) in hdays) class Dec31Holiday(holidays.HolidayBase): def _populate(self, year): self[date(year, 12, 31)] = "New Year's Eve" self.assertTrue(date(2014, 12, 31) in Dec31Holiday()) class TestArgs(unittest.TestCase): def setUp(self): self.holidays = holidays.US() def test_country(self): self.assertEqual(self.holidays.country, 'US') self.assertTrue(date(2014, 7, 4) in self.holidays) self.assertFalse(date(2014, 7, 1) in self.holidays) self.holidays = holidays.UnitedStates() self.assertEqual(self.holidays.country, 'US') self.assertTrue(date(2014, 7, 4) in self.holidays) self.assertFalse(date(2014, 7, 1) in self.holidays) self.assertEqual(self.holidays.country, 'US') self.holidays = holidays.CA() self.assertEqual(self.holidays.country, 'CA') self.assertEqual(self.holidays.prov, 'ON') self.assertTrue(date(2014, 7, 1) in self.holidays) self.assertFalse(date(2014, 7, 4) in self.holidays) self.holidays = holidays.CA(prov='BC') self.assertEqual(self.holidays.country, 'CA') self.assertEqual(self.holidays.prov, 'BC') self.assertTrue(date(2014, 7, 1) in self.holidays) self.assertFalse(date(2014, 7, 4) in self.holidays) def test_years(self): self.assertEqual(len(self.holidays.years), 0) self.assertFalse(date(2014, 1, 2) in self.holidays) self.assertEqual(len(self.holidays.years), 1) self.assertTrue(2014 in self.holidays.years) self.assertFalse(date(2013, 1, 2) in self.holidays) self.assertFalse(date(2014, 1, 2) in self.holidays) self.assertFalse(date(2015, 1, 2) in self.holidays) self.assertEqual(len(self.holidays.years), 3) self.assertTrue(2013 in self.holidays.years) self.assertTrue(2015 in self.holidays.years) self.holidays = holidays.US(years=range(2010, 2015+1)) self.assertEqual(len(self.holidays.years), 6) self.assertFalse(2009 in self.holidays.years) self.assertTrue(2010 in self.holidays.years) self.assertTrue(2015 in self.holidays.years) self.assertFalse(2016 in self.holidays.years) self.holidays = holidays.US(years=(2013, 2015, 2015)) self.assertEqual(len(self.holidays.years), 2) self.assertTrue(2013 in self.holidays.years) self.assertFalse(2014 in self.holidays.years) self.assertTrue(2015 in self.holidays.years) self.assertTrue(date(2021, 12, 31) in holidays.US(years=[2022]).keys()) self.holidays = holidays.US(years=2015) self.assertFalse(2014 in self.holidays.years) self.assertTrue(2015 in self.holidays.years) def test_expand(self): self.holidays = holidays.US(years=(2013, 2015), expand=False) self.assertEqual(len(self.holidays.years), 2) self.assertTrue(2013 in self.holidays.years) self.assertFalse(2014 in self.holidays.years) self.assertTrue(2015 in self.holidays.years) self.assertFalse(date(2014, 1, 1) in self.holidays) self.assertEqual(len(self.holidays.years), 2) self.assertFalse(2014 in self.holidays.years) def test_observed(self): self.holidays = holidays.US(observed=False) self.assertTrue(date(2000, 1, 1) in self.holidays) self.assertFalse(date(1999, 12, 31) in self.holidays) self.assertTrue(date(2012, 1, 1) in self.holidays) self.assertFalse(date(2012, 1, 2) in self.holidays) self.holidays.observed = True self.assertTrue(date(2000, 1, 1) in self.holidays) self.assertTrue(date(1999, 12, 31) in self.holidays) self.assertTrue(date(2012, 1, 1) in self.holidays) self.assertTrue(date(2012, 1, 2) in self.holidays) self.holidays.observed = False self.assertTrue(date(2000, 1, 1) in self.holidays) self.assertFalse(date(1999, 12, 31) in self.holidays) self.assertTrue(date(2012, 1, 1) in self.holidays) self.assertFalse(date(2012, 1, 2) in self.holidays) self.holidays = holidays.US(years=[2022], observed=False) self.assertFalse(date(2021, 12, 31) in self.holidays.keys()) class TestKeyTransforms(unittest.TestCase): def setUp(self): self.holidays = holidays.US() def test_dates(self): self.assertTrue(date(2014, 1, 1) in self.holidays) self.assertEqual(self.holidays[date(2014, 1, 1)], "New Year's Day") self.holidays[date(2014, 1, 3)] = "Fake Holiday" self.assertTrue(date(2014, 1, 3) in self.holidays) self.assertTrue(self.holidays.pop(date(2014, 1, 3)), "Fake Holiday") self.assertFalse(date(2014, 1, 3) in self.holidays) def test_datetimes(self): self.assertTrue(datetime(2014, 1, 1, 13, 45) in self.holidays) self.assertEqual(self.holidays[datetime(2014, 1, 1, 13, 45)], "New Year's Day") self.holidays[datetime(2014, 1, 3, 1, 1)] = "Fake Holiday" self.assertTrue(datetime(2014, 1, 3, 2, 2) in self.holidays) self.assertTrue(self.holidays.pop(datetime(2014, 1, 3, 4, 4)), "Fake Holiday") self.assertFalse(datetime(2014, 1, 3, 2, 2) in self.holidays) def test_timestamp(self): self.assertTrue(1388552400 in self.holidays) self.assertEqual(self.holidays[1388552400], "New Year's Day") self.assertTrue(1388552400.01 in self.holidays) self.assertEqual(self.holidays[1388552400.01], "New Year's Day") self.holidays[1388725200] = "Fake Holiday" self.assertTrue(1388725201 in self.holidays) self.assertTrue(self.holidays.pop(1388725202), "Fake Holiday") self.assertFalse(1388725201 in self.holidays) def test_strings(self): self.assertTrue("2014-01-01" in self.holidays) self.assertEqual(self.holidays["2014-01-01"], "New Year's Day") self.assertTrue("01/01/2014" in self.holidays) self.assertEqual(self.holidays["01/01/2014"], "New Year's Day") self.holidays["01/03/2014"] = "Fake Holiday" self.assertTrue("01/03/2014" in self.holidays) self.assertTrue(self.holidays.pop("01/03/2014"), "Fake Holiday") self.assertFalse("01/03/2014" in self.holidays) def test_exceptions(self): self.assertRaises( (TypeError, ValueError), lambda: "abc" in self.holidays) self.assertRaises( (TypeError, ValueError), lambda: self.holidays.get("abc123")) self.assertRaises( (TypeError, ValueError), self.holidays.__setitem__, "abc", "Test") self.assertRaises( (TypeError, ValueError), lambda: list() in self.holidays) class TestCA(unittest.TestCase): def setUp(self): self.holidays = holidays.CA(observed=False) def test_new_years(self): self.assertFalse(date(2010, 12, 31) in self.holidays) self.assertFalse(date(2017, 1, 2) in self.holidays) self.holidays.observed = True self.assertTrue(date(2010, 12, 31) in self.holidays) self.assertTrue(date(2017, 1, 2) in self.holidays) self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 1, 1) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_islander_day(self): pei_holidays = holidays.CA(prov="PE") for dt in [date(2009, 2, 9), date(2010, 2, 15), date(2011, 2, 21), date(2012, 2, 20), date(2013, 2, 18), date(2014, 2, 17), date(2015, 2, 16), date(2016, 2, 15), date(2020, 2, 17)]: if dt.year >= 2010: self.assertNotEqual(self.holidays[dt], "Islander Day") elif dt.year == 2009: self.assertFalse(dt in self.holidays) self.assertTrue(dt in pei_holidays) self.assertFalse(dt + relativedelta(days=-1) in pei_holidays) self.assertFalse(dt + relativedelta(days=+1) in pei_holidays) def test_family_day(self): ab_holidays = holidays.CA(prov="AB") bc_holidays = holidays.CA(prov="BC") mb_holidays = holidays.CA(prov="MB") sk_holidays = holidays.CA(prov="SK") for dt in [date(1990, 2, 19), date(1999, 2, 15), date(2000, 2, 21), date(2006, 2, 20)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in ab_holidays) self.assertFalse(dt in bc_holidays) self.assertFalse(dt in mb_holidays) self.assertFalse(dt in sk_holidays) dt = date(2007, 2, 19) self.assertFalse(dt in self.holidays) self.assertTrue(dt in ab_holidays) self.assertFalse(dt in bc_holidays) self.assertFalse(dt in mb_holidays) self.assertTrue(dt in sk_holidays) for dt in [date(2008, 2, 18), date(2012, 2, 20), date(2014, 2, 17), date(2018, 2, 19), date(2019, 2, 18), date(2020, 2, 17)]: self.assertTrue(dt in self.holidays) self.assertTrue(dt in ab_holidays) self.assertFalse(dt in bc_holidays) self.assertTrue(dt in mb_holidays) self.assertTrue(dt in sk_holidays) for dt in [date(2013, 2, 11), date(2016, 2, 8), date(2020, 2, 10)]: self.assertFalse(dt in self.holidays) self.assertFalse(dt in ab_holidays) self.assertTrue(dt in bc_holidays) self.assertFalse(dt in mb_holidays) self.assertFalse(dt in sk_holidays) self.assertEqual(mb_holidays[date(2014, 2, 17)], "Louis Riel Day") def test_st_patricks_day(self): nl_holidays = holidays.CA(prov="NL", observed=False) for dt in [date(1900, 3, 19), date(1999, 3, 15), date(2000, 3, 20), date(2012, 3, 19), date(2013, 3, 18), date(2014, 3, 17), date(2015, 3, 16), date(2016, 3, 14), date(2020, 3, 16)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in nl_holidays) self.assertFalse(dt + relativedelta(days=-1) in nl_holidays) self.assertFalse(dt + relativedelta(days=+1) in nl_holidays) def test_good_friday(self): qc_holidays = holidays.CA(prov="QC") for dt in [date(1900, 4, 13), date(1901, 4, 5), date(1902, 3, 28), date(1999, 4, 2), date(2000, 4, 21), date(2010, 4, 2), date(2018, 3, 30), date(2019, 4, 19), date(2020, 4, 10)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(dt in qc_holidays) def test_easter_monday(self): qc_holidays = holidays.CA(prov="QC") for dt in [date(1900, 4, 16), date(1901, 4, 8), date(1902, 3, 31), date(1999, 4, 5), date(2000, 4, 24), date(2010, 4, 5), date(2018, 4, 2), date(2019, 4, 22), date(2020, 4, 13)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in qc_holidays) self.assertFalse(dt + relativedelta(days=-1) in qc_holidays) self.assertFalse(dt + relativedelta(days=+1) in qc_holidays) def test_st_georges_day(self): nl_holidays = holidays.CA(prov="NL") for dt in [date(1990, 4, 23), date(1999, 4, 26), date(2000, 4, 24), date(2010, 4, 19), date(2016, 4, 25), date(2020, 4, 20)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in nl_holidays) self.assertFalse(dt + relativedelta(days=-1) in nl_holidays) self.assertFalse(dt + relativedelta(days=+1) in nl_holidays) def test_victoria_day(self): for dt in [date(1953, 5, 18), date(1999, 5, 24), date(2000, 5, 22), date(2010, 5, 24), date(2015, 5, 18), date(2020, 5, 18)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_national_aboriginal_day(self): nt_holidays = holidays.CA(prov="NT") self.assertFalse(date(1995, 6, 21) in nt_holidays) for year in range(1996, 2100): dt = date(year, 6, 21) self.assertFalse(dt in self.holidays) self.assertTrue(dt in nt_holidays) self.assertFalse(dt + relativedelta(days=-1) in nt_holidays) self.assertFalse(dt + relativedelta(days=+1) in nt_holidays) def test_st_jean_baptiste_day(self): qc_holidays = holidays.CA(prov="QC", observed=False) self.assertFalse(date(1924, 6, 24) in qc_holidays) for year in range(1925, 2100): dt = date(year, 6, 24) self.assertFalse(dt in self.holidays) self.assertTrue(dt in qc_holidays) self.assertFalse(dt + relativedelta(days=-1) in qc_holidays) self.assertFalse(dt + relativedelta(days=+1) in qc_holidays) self.assertFalse(date(2001, 6, 25) in qc_holidays) qc_holidays.observed = True self.assertTrue(date(2001, 6, 25) in qc_holidays) def test_discovery_day(self): nl_holidays = holidays.CA(prov="NL") yu_holidays = holidays.CA(prov="YU") for dt in [date(1997, 6, 23), date(1999, 6, 21), date(2000, 6, 26), date(2010, 6, 21), date(2016, 6, 27), date(2020, 6, 22)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in nl_holidays) self.assertFalse(dt in yu_holidays) for dt in [date(1912, 8, 19), date(1999, 8, 16), date(2000, 8, 21), date(2006, 8, 21), date(2016, 8, 15), date(2020, 8, 17)]: self.assertFalse(dt in self.holidays) self.assertFalse(dt in nl_holidays) self.assertTrue(dt in yu_holidays) def test_canada_day(self): for year in range(1900, 2100): dt = date(year, 7, 1) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(date(2006, 7, 3) in self.holidays) self.assertFalse(date(2007, 7, 2) in self.holidays) self.holidays.observed = True self.assertTrue(date(2006, 7, 3) in self.holidays) self.assertTrue(date(2007, 7, 2) in self.holidays) def test_nunavut_day(self): nu_holidays = holidays.CA(prov="NU", observed=False) self.assertFalse(date(1999, 7, 9) in nu_holidays) self.assertFalse(date(2000, 7, 9) in nu_holidays) self.assertTrue(date(2000, 4, 1) in nu_holidays) for year in range(2001, 2100): dt = date(year, 7, 9) self.assertFalse(dt in self.holidays) self.assertTrue(dt in nu_holidays) self.assertFalse(dt + relativedelta(days=-1) in nu_holidays) self.assertFalse(dt + relativedelta(days=+1) in nu_holidays) self.assertFalse(date(2017, 7, 10) in nu_holidays) nu_holidays.observed = True self.assertTrue(date(2017, 7, 10) in nu_holidays) def test_civic_holiday(self): bc_holidays = holidays.CA(prov="BC") for dt in [date(1900, 8, 6), date(1955, 8, 1), date(1973, 8, 6)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt in bc_holidays) for dt in [date(1974, 8, 5), date(1999, 8, 2), date(2000, 8, 7), date(2010, 8, 2), date(2015, 8, 3), date(2020, 8, 3)]: self.assertTrue(dt in self.holidays) self.assertTrue(dt in bc_holidays) def test_labour_day(self): self.assertFalse(date(1893, 9, 4) in self.holidays) for dt in [date(1894, 9, 3), date(1900, 9, 3), date(1999, 9, 6), date(2000, 9, 4), date(2014, 9, 1), date(2015, 9, 7)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_thanksgiving(self): ns_holidays = holidays.CA(prov="NB") for dt in [date(1931, 10, 12), date(1990, 10, 8), date(1999, 10, 11), date(2000, 10, 9), date(2013, 10, 14), date(2020, 10, 12)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(dt in ns_holidays) def test_remembrance_day(self): ab_holidays = holidays.CA(prov="AB", observed=False) nl_holidays = holidays.CA(prov="NL", observed=False) self.assertFalse(date(1930, 11, 11) in ab_holidays) self.assertFalse(date(1930, 11, 11) in nl_holidays) for year in range(1931, 2100): dt = date(year, 11, 11) self.assertFalse(dt in self.holidays) self.assertTrue(dt in ab_holidays) self.assertTrue(dt in nl_holidays) self.assertFalse(dt + relativedelta(days=-1) in nl_holidays) self.assertFalse(dt + relativedelta(days=+1) in nl_holidays) self.assertFalse(date(2007, 11, 12) in ab_holidays) self.assertFalse(date(2007, 11, 12) in nl_holidays) ab_holidays.observed = True nl_holidays.observed = True self.assertFalse(date(2007, 11, 12) in ab_holidays) self.assertTrue(date(2007, 11, 12) in nl_holidays) def test_christmas_day(self): for year in range(1900, 2100): dt = date(year, 12, 25) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(date(2010, 12, 24) in self.holidays) self.assertNotEqual(self.holidays[date(2011, 12, 26)], "Christmas Day (Observed)") self.holidays.observed = True self.assertTrue(date(2010, 12, 24) in self.holidays) self.assertEqual(self.holidays[date(2011, 12, 26)], "Christmas Day (Observed)") def test_boxing_day(self): for year in range(1900, 2100): dt = date(year, 12, 26) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(date(2009, 12, 28) in self.holidays) self.assertFalse(date(2010, 12, 27) in self.holidays) self.holidays.observed = True self.assertTrue(date(2009, 12, 28) in self.holidays) self.assertTrue(date(2010, 12, 27) in self.holidays) class TestCO(unittest.TestCase): def setUp(self): self.holidays = holidays.CO(observed=True) def test_2016(self): # http://www.officeholidays.com/countries/colombia/ self.assertTrue(date(2016, 1, 1) in self.holidays) self.assertTrue(date(2016, 1, 11) in self.holidays) self.assertTrue(date(2016, 3, 21) in self.holidays) self.assertTrue(date(2016, 3, 24) in self.holidays) self.assertTrue(date(2016, 3, 25) in self.holidays) self.assertTrue(date(2016, 5, 1) in self.holidays) self.assertTrue(date(2016, 5, 9) in self.holidays) self.assertTrue(date(2016, 5, 30) in self.holidays) self.assertTrue(date(2016, 6, 6) in self.holidays) self.assertTrue(date(2016, 7, 4) in self.holidays) self.assertTrue(date(2016, 7, 20) in self.holidays) self.assertTrue(date(2016, 8, 7) in self.holidays) self.assertTrue(date(2016, 8, 15) in self.holidays) self.assertTrue(date(2016, 10, 17) in self.holidays) self.assertTrue(date(2016, 11, 7) in self.holidays) self.assertTrue(date(2016, 11, 14) in self.holidays) self.assertTrue(date(2016, 12, 8) in self.holidays) self.assertTrue(date(2016, 12, 25) in self.holidays) class TestMX(unittest.TestCase): def setUp(self): self.holidays = holidays.MX(observed=False) def test_new_years(self): self.assertFalse(date(2010, 12, 31) in self.holidays) self.assertFalse(date(2017, 1, 2) in self.holidays) self.holidays.observed = True self.assertTrue(date(2010, 12, 31) in self.holidays) self.assertTrue(date(2017, 1, 2) in self.holidays) self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 1, 1) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_constitution_day(self): for dt in [date(2005, 2, 5), date(2006, 2, 5), date(2007, 2, 5), date(2008, 2, 4), date(2009, 2, 2), date(2010, 2, 1), date(2015, 2, 2), date(2016, 2, 1), date(2020, 2, 3)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_benito_juarez(self): for dt in [date(2005, 3, 21), date(2006, 3, 21), date(2007, 3, 19), date(2008, 3, 17), date(2009, 3, 16), date(2010, 3, 15), date(2015, 3, 16), date(2016, 3, 21), date(2020, 3, 16)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_labor_day(self): self.assertFalse(date(2010, 4, 30) in self.holidays) self.assertFalse(date(2011, 5, 2) in self.holidays) self.holidays.observed = True self.assertTrue(date(2010, 4, 30) in self.holidays) self.assertTrue(date(2011, 5, 2) in self.holidays) self.holidays.observed = False self.assertFalse(date(1922, 5, 1) in self.holidays) for year in range(1923, 2100): dt = date(year, 5, 1) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_independence_day(self): self.assertFalse(date(2006, 9, 15) in self.holidays) self.assertFalse(date(2007, 9, 17) in self.holidays) self.holidays.observed = True self.assertTrue(date(2006, 9, 15) in self.holidays) self.assertTrue(date(2007, 9, 17) in self.holidays) self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 9, 16) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_revolution_day(self): for dt in [date(2005, 11, 20), date(2006, 11, 20), date(2007, 11, 19), date(2008, 11, 17), date(2009, 11, 16), date(2010, 11, 15), date(2015, 11, 16), date(2016, 11, 21), date(2020, 11, 16)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_change_of_government(self): self.assertFalse(date(2012, 11, 30) in self.holidays) self.assertFalse(date(2024, 12, 2) in self.holidays) self.holidays.observed = True self.assertTrue(date(2012, 11, 30) in self.holidays) self.assertTrue(date(2024, 12, 2) in self.holidays) self.holidays.observed = False for year in range(1970, 2100): dt = date(year, 12, 1) if (2018 - year) % 6 == 0: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) else: self.assertFalse(dt in self.holidays) def test_christmas(self): for year in range(1900, 2100): dt = date(year, 12, 25) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(date(2010, 12, 24) in self.holidays) self.assertFalse(date(2016, 12, 26) in self.holidays) self.holidays.observed = True self.assertTrue(date(2010, 12, 24) in self.holidays) self.assertTrue(date(2016, 12, 26) in self.holidays) class TestNetherlands(unittest.TestCase): def setUp(self): self.holidays = holidays.NL() def test_2017(self): # http://www.iamsterdam.com/en/plan-your-trip/practical-info/public-holidays self.assertTrue(date(2017, 1, 1) in self.holidays) self.assertTrue(date(2017, 4, 16) in self.holidays) self.assertTrue(date(2017, 4, 17) in self.holidays) self.assertTrue(date(2017, 4, 27) in self.holidays) self.assertTrue(date(2017, 5, 25) in self.holidays) self.assertTrue(date(2017, 6, 4) in self.holidays) self.assertTrue(date(2017, 6, 5) in self.holidays) self.assertTrue(date(2017, 12, 25) in self.holidays) self.assertTrue(date(2017, 12, 26) in self.holidays) def test_new_years(self): self.assertTrue(date(2017, 1, 1) in self.holidays) def test_easter(self): self.assertTrue(date(2017, 4, 16) in self.holidays) def test_easter_monday(self): self.assertTrue(date(2017, 4, 17) in self.holidays) def test_queens_day_between_1891_and_1948(self): # Between 1891 and 1948 Queens Day was celebrated on 8-31 self.holidays = holidays.NL(years=[1901]) self.assertTrue(date(1901, 8, 31) in self.holidays) def test_queens_day_between_1891_and_1948_substituted_later(self): # Between 1891 and 1948 Queens Day was celebrated on 9-1 # (one day later) when Queens Day falls on a Sunday self.holidays = holidays.NL(years=[1947]) self.assertTrue(date(1947, 9, 1) in self.holidays) def test_queens_day_between_1949_and_2013(self): self.holidays = holidays.NL(years=[1965]) self.assertTrue(date(1965, 4, 30) in self.holidays) def test_queens_day_between_1949_and_1980_substituted_later(self): self.holidays = holidays.NL(years=[1967]) self.assertTrue(date(1967, 5, 1) in self.holidays) def test_queens_day_between_1980_and_2013_substituted_earlier(self): self.holidays = holidays.NL(years=[2006]) self.assertTrue(date(2006, 4, 29) in self.holidays) def test_kings_day_after_2014(self): self.holidays = holidays.NL(years=[2013]) self.assertFalse(date(2013, 4, 27) in self.holidays) self.holidays = holidays.NL(years=[2017]) self.assertTrue(date(2017, 4, 27) in self.holidays) def test_kings_day_after_2014_substituted_earlier(self): self.holidays = holidays.NL(years=[2188]) self.assertTrue(date(2188, 4, 26) in self.holidays) def test_liberation_day(self): self.holidays = holidays.NL(years=1900) self.assertFalse(date(1900, 5, 5) in self.holidays) def test_liberation_day_after_1990_non_lustrum_year(self): self.holidays = holidays.NL(years=2017) self.assertFalse(date(2017, 5, 5) in self.holidays) def test_liberation_day_after_1990_in_lustrum_year(self): self.holidays = holidays.NL(years=2020) self.assertTrue(date(2020, 5, 5) in self.holidays) def test_ascension_day(self): self.holidays = holidays.NL(years=2017) self.assertTrue(date(2017, 5, 25) in self.holidays) def test_whit_sunday(self): self.holidays = holidays.NL(years=2017) self.assertTrue(date(2017, 6, 4) in self.holidays) def test_whit_monday(self): self.holidays = holidays.NL(years=2017) self.assertTrue(date(2017, 6, 5) in self.holidays) def test_first_christmas(self): self.holidays = holidays.NL(years=2017) self.assertTrue(date(2017, 12, 25) in self.holidays) def test_second_christmas(self): self.holidays = holidays.NL(years=2017) self.assertTrue(date(2017, 12, 26) in self.holidays) class TestUS(unittest.TestCase): def setUp(self): self.holidays = holidays.US(observed=False) def test_new_years(self): self.assertFalse(date(2010, 12, 31) in self.holidays) self.assertFalse(date(2017, 1, 2) in self.holidays) self.holidays.observed = True self.assertTrue(date(2010, 12, 31) in self.holidays) self.assertTrue(date(2017, 1, 2) in self.holidays) self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 1, 1) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_epiphany(self): pr_holidays = holidays.US(state='PR') for year in range(2010, 2021): self.assertFalse(date(year, 1, 6) in self.holidays) self.assertTrue(date(year, 1, 6) in pr_holidays) def test_three_kings_day(self): vi_holidays = holidays.US(state='VI') for year in range(2010, 2021): self.assertFalse(date(year, 1, 6) in self.holidays) self.assertTrue(date(year, 1, 6) in vi_holidays) def test_lee_jackson_day(self): va_holidays = holidays.US(state='VA') self.assertFalse(date(1888, 1, 19) in va_holidays) self.assertFalse(date(1983, 1, 19) in va_holidays) self.assertFalse("Lee Jackson Day" in va_holidays.get_list(date(2000, 1, 17))) for dt in [date(1889, 1, 19), date(1982, 1, 19), date(1983, 1, 17), date(1999, 1, 18), date(2000, 1, 14), date(2001, 1, 12), date(2013, 1, 18), date(2014, 1, 17), date(2018, 1, 12)]: self.assertFalse("Lee Jackson Day" in self.holidays.get_list(dt)) self.assertTrue(dt in va_holidays) self.assertTrue("Lee Jackson Day" in va_holidays.get_list(dt)) def test_inauguration_day(self): name = "Inauguration Day" dc_holidays = holidays.US(state='DC') la_holidays = holidays.US(state='LA') md_holidays = holidays.US(state='MD') va_holidays = holidays.US(state='VA') for year in (1789, 1793, 1877, 1929, 1933): self.assertFalse(name in self.holidays.get_list(date(year, 3, 4))) self.assertTrue(name in dc_holidays.get_list(date(year, 3, 4))) self.assertTrue(name in la_holidays.get_list(date(year, 3, 4))) self.assertTrue(name in md_holidays.get_list(date(year, 3, 4))) self.assertTrue(name in va_holidays.get_list(date(year, 3, 4))) for year in (1937, 1941, 1957, 2013, 2017): self.assertFalse(name in self.holidays.get_list(date(year, 1, 20))) self.assertTrue(name in dc_holidays.get_list(date(year, 1, 20))) self.assertTrue(name in la_holidays.get_list(date(year, 1, 20))) self.assertTrue(name in md_holidays.get_list(date(year, 1, 20))) self.assertTrue(name in va_holidays.get_list(date(year, 1, 20))) for year in (1785, 1788, 2010, 2011, 2012, 2014, 2015, 2016): self.assertFalse(name in dc_holidays.get_list(date(year, 3, 4))) self.assertFalse(name in la_holidays.get_list(date(year, 3, 4))) self.assertFalse(name in md_holidays.get_list(date(year, 3, 4))) self.assertFalse(name in va_holidays.get_list(date(year, 3, 4))) self.assertFalse(name in dc_holidays.get_list(date(year, 1, 20))) self.assertFalse(name in la_holidays.get_list(date(year, 1, 20))) self.assertFalse(name in md_holidays.get_list(date(year, 1, 20))) self.assertFalse(name in va_holidays.get_list(date(year, 1, 20))) def test_marthin_luther(self): for dt in [date(1986, 1, 20), date(1999, 1, 18), date(2000, 1, 17), date(2012, 1, 16), date(2013, 1, 21), date(2014, 1, 20), date(2015, 1, 19), date(2016, 1, 18), date(2020, 1, 20)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse("Martin Luther King, Jr. Day" in holidays.US(years=[1985]).values()) self.assertTrue("Martin Luther King, Jr. Day" in holidays.US(years=[1986]).values()) self.assertEqual(holidays.US(state='AL').get('2015-01-19'), "Robert E. Lee/Martin Luther King Birthday") self.assertEqual(holidays.US(state='AS').get('2015-01-19'), ("Dr. Martin Luther King Jr. " "and Robert E. Lee's Birthdays")) self.assertEqual(holidays.US(state='MS').get('2015-01-19'), ("Dr. Martin Luther King Jr. " "and Robert E. Lee's Birthdays")) self.assertEqual(holidays.US(state='AZ').get('2015-01-19'), "Dr. Martin Luther King Jr./Civil Rights Day") self.assertEqual(holidays.US(state='NH').get('2015-01-19'), "Dr. Martin Luther King Jr./Civil Rights Day") self.assertEqual(holidays.US(state='ID').get('2015-01-19'), "Martin Luther King, Jr. - Idaho Human Rights Day") self.assertNotEqual(holidays.US(state='ID').get('2000-01-17'), "Martin Luther King, Jr. - Idaho Human Rights Day") self.assertEqual(holidays.US(state='GA').get('2011-01-17'), "Robert E. Lee's Birthday") def test_lincolns_birthday(self): ca_holidays = holidays.US(state='CA') ct_holidays = holidays.US(state='CT') il_holidays = holidays.US(state='IL') ia_holidays = holidays.US(state='IA') nj_holidays = holidays.US(state='NJ') ny_holidays = holidays.US(state='NY') for year in range(1971, 2010): self.assertFalse(date(year, 2, 12) in self.holidays) self.assertTrue(date(year, 2, 12) in ca_holidays) self.assertTrue(date(year, 2, 12) in ct_holidays) self.assertTrue(date(year, 2, 12) in il_holidays) self.assertTrue(date(year, 2, 12) in ia_holidays) self.assertTrue(date(year, 2, 12) in nj_holidays) self.assertTrue(date(year, 2, 12) in ny_holidays) if date(year, 2, 12).weekday() == 5: self.assertFalse(date(year, 2, 11) in self.holidays) self.assertTrue(date(year, 2, 11) in ca_holidays) self.assertTrue(date(year, 2, 11) in ct_holidays) self.assertTrue(date(year, 2, 11) in il_holidays) self.assertTrue(date(year, 2, 11) in ia_holidays) self.assertTrue(date(year, 2, 11) in nj_holidays) self.assertTrue(date(year, 2, 11) in ny_holidays) else: self.assertFalse(date(year, 2, 11) in ca_holidays) self.assertFalse(date(year, 2, 11) in ct_holidays) self.assertFalse(date(year, 2, 11) in il_holidays) self.assertFalse(date(year, 2, 11) in ia_holidays) self.assertFalse(date(year, 2, 11) in nj_holidays) self.assertFalse(date(year, 2, 11) in ny_holidays) if date(year, 2, 12).weekday() == 6: self.assertFalse(date(year, 2, 13) in self.holidays) self.assertTrue(date(year, 2, 13) in ca_holidays) self.assertTrue(date(year, 2, 13) in ct_holidays) self.assertTrue(date(year, 2, 13) in il_holidays) self.assertTrue(date(year, 2, 13) in ia_holidays) self.assertTrue(date(year, 2, 13) in nj_holidays) self.assertTrue(date(year, 2, 13) in ny_holidays) else: self.assertFalse(date(year, 2, 13) in ca_holidays) self.assertFalse(date(year, 2, 13) in ct_holidays) self.assertFalse(date(year, 2, 13) in il_holidays) self.assertFalse(date(year, 2, 13) in ia_holidays) self.assertFalse(date(year, 2, 13) in nj_holidays) self.assertFalse(date(year, 2, 13) in ny_holidays) for year in range(2010, 2050): self.assertFalse(date(year, 2, 12) in self.holidays) self.assertFalse(date(year, 2, 12) in ca_holidays) self.assertTrue(date(year, 2, 12) in ct_holidays) self.assertTrue(date(year, 2, 12) in il_holidays) self.assertTrue(date(year, 2, 12) in ia_holidays) self.assertTrue(date(year, 2, 12) in nj_holidays) self.assertTrue(date(year, 2, 12) in ny_holidays) if date(year, 2, 12).weekday() == 5: self.assertFalse(date(year, 2, 11) in self.holidays) self.assertFalse(date(year, 2, 11) in ca_holidays) self.assertTrue(date(year, 2, 11) in ct_holidays) self.assertTrue(date(year, 2, 11) in il_holidays) self.assertTrue(date(year, 2, 11) in ia_holidays) self.assertTrue(date(year, 2, 11) in nj_holidays) self.assertTrue(date(year, 2, 11) in ny_holidays) else: self.assertFalse(date(year, 2, 11) in ca_holidays) self.assertFalse(date(year, 2, 11) in ct_holidays) self.assertFalse(date(year, 2, 11) in il_holidays) self.assertFalse(date(year, 2, 11) in ia_holidays) self.assertFalse(date(year, 2, 11) in nj_holidays) self.assertFalse(date(year, 2, 11) in ny_holidays) if date(year, 2, 12).weekday() == 6: self.assertFalse(date(year, 2, 13) in self.holidays) self.assertFalse(date(year, 2, 13) in ca_holidays) self.assertTrue(date(year, 2, 13) in ct_holidays) self.assertTrue(date(year, 2, 13) in il_holidays) self.assertTrue(date(year, 2, 13) in ia_holidays) self.assertTrue(date(year, 2, 13) in nj_holidays) self.assertTrue(date(year, 2, 13) in ny_holidays) else: self.assertFalse(date(year, 2, 13) in ca_holidays) self.assertFalse(date(year, 2, 13) in ct_holidays) self.assertFalse(date(year, 2, 13) in il_holidays) self.assertFalse(date(year, 2, 13) in ia_holidays) self.assertFalse(date(year, 2, 13) in nj_holidays) self.assertFalse(date(year, 2, 13) in ny_holidays) def test_susan_b_anthony_day(self): ca_holidays = holidays.US(state='CA') fl_holidays = holidays.US(state='FL') ny_holidays = holidays.US(state='NY') wi_holidays = holidays.US(state='WI') self.assertFalse(date(1975, 2, 15) in wi_holidays) self.assertFalse(date(2000, 2, 15) in ca_holidays) self.assertFalse(date(2000, 2, 15) in fl_holidays) self.assertFalse(date(2000, 2, 15) in ny_holidays) self.assertTrue(date(2000, 2, 15) in wi_holidays) self.assertTrue(date(2004, 2, 15) in ny_holidays) self.assertFalse(date(2010, 2, 15) in fl_holidays) self.assertTrue(date(2010, 2, 15) in ny_holidays) self.assertFalse(date(2013, 2, 15) in self.holidays) self.assertFalse(date(2013, 2, 15) in ca_holidays) self.assertTrue(date(2013, 2, 15) in fl_holidays) self.assertTrue(date(2013, 2, 15) in ny_holidays) self.assertFalse(date(2014, 2, 15) in self.holidays) self.assertTrue(date(2014, 2, 15) in ca_holidays) self.assertTrue(date(2014, 2, 15) in fl_holidays) self.assertTrue(date(2014, 2, 15) in ny_holidays) self.assertTrue(date(2014, 2, 15) in wi_holidays) def test_washingtons_birthday(self): de_holidays = holidays.US(state='DE') fl_holidays = holidays.US(state='FL') ga_holidays = holidays.US(state='GA') nm_holidays = holidays.US(state='NM') for dt in [date(1969, 2, 22), date(1970, 2, 22), date(1971, 2, 15), date(1997, 2, 17), date(1999, 2, 15), date(2000, 2, 21), date(2012, 2, 20), date(2013, 2, 18), date(2014, 2, 17), date(2015, 2, 16), date(2016, 2, 15), date(2020, 2, 17)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(dt in de_holidays) self.assertNotEqual(fl_holidays.get(dt), "Washington's Birthday") self.assertFalse(dt in ga_holidays) self.assertFalse(dt in nm_holidays) for dt in [date(2013, 12, 24), date(2014, 12, 26), date(2015, 12, 24)]: self.assertTrue(dt in ga_holidays) self.assertTrue("Washington's Birthday" in ga_holidays.get_list(dt)) self.assertTrue(holidays.US(state='AL').get('2015-02-16'), "George Washington/Thomas Jefferson Birthday") self.assertTrue(holidays.US(state='AS').get('2015-02-16'), ("George Washington's Birthday " "and Daisy Gatson Bates Day")) self.assertTrue(holidays.US(state='PR').get('2015-02-16'), "Presidents' Day") self.assertTrue(holidays.US(state='VI').get('2015-02-16'), "Presidents' Day") def test_mardi_gras(self): la_holidays = holidays.US(state='LA') self.assertFalse(date(1856, 2, 5) in la_holidays) for dt in [date(1857, 2, 24), date(2008, 2, 5), date(2011, 3, 8), date(2012, 2, 21), date(2014, 3, 4), date(2018, 2, 13)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in la_holidays) def test_guam_discovery_day(self): gu_holidays = holidays.US(state='GU') self.assertFalse(date(1969, 3, 1) in gu_holidays) for dt in [date(1970, 3, 2), date(1971, 3, 1), date(1977, 3, 7), date(2014, 3, 3), date(2015, 3, 2), date(2016, 3, 7)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in gu_holidays) self.assertEqual(gu_holidays.get(dt), "Guam Discovery Day") def test_casimir_pulaski_day(self): il_holidays = holidays.US(state='IL') self.assertFalse(date(1977, 3, 7) in il_holidays) for dt in [date(1978, 3, 6), date(1982, 3, 1), date(1983, 3, 7), date(2014, 3, 3), date(2015, 3, 2), date(2016, 3, 7)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in il_holidays) self.assertEqual(il_holidays.get(dt), "Casimir Pulaski Day") def test_texas_independence_day(self): tx_holidays = holidays.US(state='TX') self.assertFalse(date(1873, 3, 2) in tx_holidays) for year in range(1874, 2050): self.assertFalse(date(year, 3, 2) in self.holidays) self.assertTrue(date(year, 3, 2) in tx_holidays) def test_town_meeting_day(self): vt_holidays = holidays.US(state='VT') self.assertFalse(date(1799, 3, 5) in vt_holidays) for dt in [date(1800, 3, 4), date(1803, 3, 1), date(1804, 3, 6), date(2011, 3, 1), date(2015, 3, 3), date(2017, 3, 7)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in vt_holidays) def test_evacuation_day(self): ma_holidays = holidays.US(state='MA') self.assertFalse(date(1900, 3, 17) in ma_holidays) for year in range(1901, 2050): self.assertFalse(date(year, 3, 17) in self.holidays) self.assertTrue(date(year, 3, 17) in ma_holidays) self.assertFalse(date(1995, 3, 20) in ma_holidays) for dt in [date(2012, 3, 19), date(2013, 3, 18), date(2018, 3, 19)]: self.assertTrue(dt in ma_holidays) ma_holidays.observed = False for dt in [date(2012, 3, 19), date(2013, 3, 18), date(2018, 3, 19)]: self.assertFalse(dt in ma_holidays) def test_emancipation_day_in_puerto_rico(self): pr_holidays = holidays.US(state='PR') for year in range(2010, 2021): self.assertFalse(date(year, 3, 22) in self.holidays) self.assertTrue(date(year, 3, 22) in pr_holidays) self.assertFalse(date(2014, 3, 21) in pr_holidays) self.assertFalse(date(2014, 3, 23) in pr_holidays) self.assertTrue(date(2015, 3, 23) in pr_holidays) def test_prince_jonah_kuhio_kalanianaole_day(self): hi_holidays = holidays.US(state='HI') self.assertFalse(date(1948, 3, 26) in hi_holidays) for year in range(1949, 2050): self.assertFalse(date(year, 3, 26) in self.holidays) self.assertTrue(date(year, 3, 26) in hi_holidays) for dt in [date(1949, 3, 25), date(2016, 3, 25), date(2017, 3, 27)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in hi_holidays) self.assertEqual(hi_holidays.get(dt), "Prince Jonah Kuhio Kalanianaole Day (Observed)") hi_holidays.observed = False for dt in [date(1949, 3, 25), date(2016, 3, 25), date(2017, 3, 27)]: self.assertFalse(dt in hi_holidays) def test_stewards_day(self): ak_holidays = holidays.US(state='AK') self.assertFalse(date(1917, 3, 30) in ak_holidays) for dt in [date(1918, 3, 30), date(1954, 3, 30), date(1955, 3, 28), date(2002, 3, 25), date(2014, 3, 31), date(2018, 3, 26)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in ak_holidays) def test_cesar_chavez_day(self): ca_holidays = holidays.US(state='CA') tx_holidays = holidays.US(state='TX') for year in range(1995, 2000): self.assertFalse(date(year, 3, 31) in self.holidays) self.assertTrue(date(year, 3, 31) in ca_holidays) for year in range(2000, 2020): self.assertFalse(date(year, 3, 31) in self.holidays) self.assertTrue(date(year, 3, 31) in ca_holidays) self.assertTrue(date(year, 3, 31) in tx_holidays) for year in (1996, 2002, 2013, 2019): self.assertFalse(date(year, 4, 1) in self.holidays) self.assertTrue(date(year, 4, 1) in ca_holidays) self.assertFalse(date(year, 4, 1) in tx_holidays) def test_transfer_day(self): vi_holidays = holidays.US(state='VI') for year in range(2010, 2021): self.assertFalse(date(year, 3, 31) in self.holidays) self.assertTrue(date(year, 3, 31) in vi_holidays) def test_emancipation_day(self): dc_holidays = holidays.US(state='DC') self.assertFalse(date(2004, 4, 16) in dc_holidays) for year in range(2005, 2020): self.assertFalse(date(year, 4, 16) in self.holidays) self.assertTrue(date(year, 4, 16) in dc_holidays) self.assertTrue(date(2005, 4, 15) in dc_holidays) self.assertTrue(date(2006, 4, 17) in dc_holidays) dc_holidays.observed = False self.assertFalse(date(2005, 4, 15) in dc_holidays) self.assertFalse(date(2006, 4, 17) in dc_holidays) def test_patriots_day(self): me_holidays = holidays.US(state='ME') ma_holidays = holidays.US(state='MA') self.assertFalse(date(1983, 4, 19) in me_holidays) self.assertFalse(date(1983, 4, 19) in ma_holidays) for year in range(1894, 1969): self.assertFalse(date(year, 4, 19) in self.holidays) self.assertTrue(date(year, 4, 19) in me_holidays) self.assertTrue(date(year, 4, 19) in ma_holidays) for dt in [date(1969, 4, 21), date(1974, 4, 15), date(1975, 4, 21), date(2015, 4, 20), date(2016, 4, 18), date(2019, 4, 15)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in me_holidays) self.assertTrue(dt in ma_holidays) def test_holy_thursday(self): vi_holidays = holidays.US(state='VI') for dt in [date(2010, 4, 1), date(2011, 4, 21), date(2013, 3, 28), date(2014, 4, 17), date(2015, 4, 2), date(2016, 3, 24)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in vi_holidays) def test_good_friday(self): ct_holidays = holidays.US(state='CT') de_holidays = holidays.US(state='DE') gu_holidays = holidays.US(state='GU') in_holidays = holidays.US(state='IN') ky_holidays = holidays.US(state='IN') la_holidays = holidays.US(state='LA') nj_holidays = holidays.US(state='NJ') nc_holidays = holidays.US(state='NC') tn_holidays = holidays.US(state='TN') tx_holidays = holidays.US(state='TX') vi_holidays = holidays.US(state='VI') for dt in [date(1900, 4, 13), date(1901, 4, 5), date(1902, 3, 28), date(1999, 4, 2), date(2000, 4, 21), date(2010, 4, 2), date(2018, 3, 30), date(2019, 4, 19), date(2020, 4, 10)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in ct_holidays) self.assertTrue(dt in de_holidays) self.assertTrue(dt in gu_holidays) self.assertTrue(dt in in_holidays) self.assertTrue(dt in ky_holidays) self.assertTrue(dt in la_holidays) self.assertTrue(dt in nj_holidays) self.assertTrue(dt in nc_holidays) self.assertTrue(dt in tn_holidays) self.assertTrue(dt in tx_holidays) self.assertTrue(dt in vi_holidays) def test_easter_monday(self): vi_holidays = holidays.US(state='VI') for dt in [date(1900, 4, 16), date(1901, 4, 8), date(1902, 3, 31), date(1999, 4, 5), date(2010, 4, 5), date(2018, 4, 2), date(2019, 4, 22), date(2020, 4, 13)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in vi_holidays) def test_confederate_memorial_day(self): al_holidays = holidays.US(state='AL') ga_holidays = holidays.US(state='GA') ms_holidays = holidays.US(state='MS') sc_holidays = holidays.US(state='SC') tx_holidays = holidays.US(state='TX') self.assertFalse(date(1865, 4, 24) in self.holidays) self.assertFalse(date(1865, 4, 24) in al_holidays) for dt in [date(1866, 4, 23), date(1878, 4, 22), date(1884, 4, 28), date(2014, 4, 28), date(2015, 4, 27), date(2019, 4, 22)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in al_holidays) self.assertTrue(dt in ga_holidays) self.assertTrue(dt in ms_holidays) self.assertTrue(dt in sc_holidays) self.assertFalse(date(1930, 1, 19) in tx_holidays) self.assertFalse(date(1931, 1, 19) in self.holidays) self.assertTrue(date(1931, 1, 19) in tx_holidays) def test_san_jacinto_day(self): tx_holidays = holidays.US(state='TX') self.assertFalse(date(1874, 4, 21) in tx_holidays) for year in (1875, 2050): self.assertFalse(date(year, 4, 21) in self.holidays) self.assertTrue(date(year, 4, 21) in tx_holidays) def test_arbor_day(self): ne_holidays = holidays.US(state='NE') for dt in [date(1875, 4, 22), date(1988, 4, 22), date(1989, 4, 28), date(2009, 4, 24), date(2010, 4, 30), date(2014, 4, 25)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in ne_holidays) def test_primary_election_day(self): in_holidays = holidays.US(state='IN') self.assertFalse(date(2004, 5, 4) in in_holidays) for dt in [date(2006, 5, 2), date(2008, 5, 6), date(2010, 5, 4), date(2012, 5, 8), date(2014, 5, 6), date(2015, 5, 5), date(2016, 5, 3)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in in_holidays) def test_truman_day(self): mo_holidays = holidays.US(state='MO', observed=False) self.assertFalse(date(1948, 5, 8) in self.holidays) self.assertFalse(date(1948, 5, 8) in mo_holidays) for year in range(1949, 2100): dt = date(year, 5, 8) self.assertFalse(dt in self.holidays) self.assertTrue(dt in mo_holidays) self.assertFalse(dt + relativedelta(days=-1) in mo_holidays) self.assertFalse(dt + relativedelta(days=+1) in mo_holidays) self.assertFalse(date(2004, 5, 7) in mo_holidays) self.assertFalse(date(2005, 5, 10) in mo_holidays) mo_holidays.observed = True self.assertTrue(date(2004, 5, 7) in mo_holidays) self.assertTrue(date(2005, 5, 10) in mo_holidays) def test_memorial_day(self): for dt in [date(1969, 5, 30), date(1970, 5, 30), date(1971, 5, 31), date(1997, 5, 26), date(1999, 5, 31), date(2000, 5, 29), date(2012, 5, 28), date(2013, 5, 27), date(2014, 5, 26), date(2015, 5, 25), date(2016, 5, 30), date(2020, 5, 25)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_jefferson_davis_birthday(self): al_holidays = holidays.US(state='AL') self.assertFalse(date(1889, 6, 3) in self.holidays) self.assertFalse(date(1889, 6, 3) in al_holidays) for dt in [date(1890, 6, 2), date(1891, 6, 1), date(1897, 6, 7), date(2014, 6, 2), date(2015, 6, 1), date(2016, 6, 6)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in al_holidays) def test_kamehameha_day(self): hi_holidays = holidays.US(state='HI') self.assertFalse(date(1871, 6, 11) in hi_holidays) for year in range(1872, 2050): self.assertFalse(date(year, 6, 11) in self.holidays) self.assertTrue(date(year, 6, 11) in hi_holidays) self.assertFalse(date(2006, 6, 12) in hi_holidays) for dt in [date(2011, 6, 10), date(2016, 6, 10), date(2017, 6, 12)]: self.assertTrue(dt in hi_holidays) self.assertEqual(hi_holidays.get(dt), "Kamehameha Day (Observed)") hi_holidays.observed = False for dt in [date(2011, 6, 10), date(2016, 6, 10), date(2017, 6, 12)]: self.assertFalse(dt in hi_holidays) def test_emancipation_day_in_texas(self): tx_holidays = holidays.US(state='TX') self.assertFalse(date(1979, 6, 19) in tx_holidays) for year in (1980, 2050): self.assertFalse(date(year, 6, 19) in self.holidays) self.assertTrue(date(year, 6, 19) in tx_holidays) def test_west_virginia_day(self): wv_holidays = holidays.US(state='WV') self.assertFalse(date(1926, 6, 20) in wv_holidays) for year in (1927, 2050): self.assertFalse(date(year, 6, 20) in self.holidays) self.assertTrue(date(year, 6, 20) in wv_holidays) self.assertTrue(date(2015, 6, 19) in wv_holidays) self.assertTrue(date(2010, 6, 21) in wv_holidays) wv_holidays.observed = False self.assertFalse(date(2015, 6, 19) in wv_holidays) self.assertFalse(date(2010, 6, 21) in wv_holidays) def test_emancipation_day_in_virgin_islands(self): vi_holidays = holidays.US(state='VI') for year in (2010, 2021): self.assertFalse(date(year, 7, 3) in self.holidays) self.assertTrue(date(year, 7, 3) in vi_holidays) def test_independence_day(self): for year in range(1900, 2100): dt = date(year, 7, 4) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(date(2010, 7, 5) in self.holidays) self.assertFalse(date(2020, 7, 3) in self.holidays) self.holidays.observed = True self.assertTrue(date(2010, 7, 5) in self.holidays) self.assertTrue(date(2020, 7, 3) in self.holidays) def test_liberation_day_guam(self): gu_holidays = holidays.US(state='GU') self.assertFalse(date(1944, 7, 21) in gu_holidays) for year in range(1945, 2100): self.assertFalse(date(year, 7, 21) in self.holidays) self.assertTrue(date(year, 7, 21) in gu_holidays) def test_pioneer_day(self): ut_holidays = holidays.US(state='UT') self.assertFalse(date(1848, 7, 24) in ut_holidays) for year in (1849, 2050): self.assertFalse(date(year, 7, 24) in self.holidays) self.assertTrue(date(year, 7, 24) in ut_holidays) self.assertTrue('2010-07-23' in ut_holidays) self.assertTrue('2011-07-25' in ut_holidays) ut_holidays.observed = False self.assertFalse('2010-07-23' in ut_holidays) self.assertFalse('2011-07-25' in ut_holidays) def test_constitution_day(self): pr_holidays = holidays.US(state='PR') for year in range(2010, 2021): self.assertFalse(date(year, 7, 25) in self.holidays) self.assertTrue(date(year, 7, 25) in pr_holidays) self.assertFalse(date(2015, 7, 24) in pr_holidays) self.assertFalse(date(2015, 7, 26) in pr_holidays) self.assertTrue(date(2021, 7, 26) in pr_holidays) def test_victory_day(self): ri_holidays = holidays.US(state='RI') self.assertFalse(date(1947, 8, 11) in ri_holidays) for dt in [date(1948, 8, 9), date(1995, 8, 14), date(2005, 8, 8), date(2015, 8, 10), date(2016, 8, 8), date(2017, 8, 14)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in ri_holidays) def test_statehood_day(self): hi_holidays = holidays.US(state='HI') self.assertFalse(date(1958, 8, 15) in hi_holidays) for dt in [date(1959, 8, 21), date(1969, 8, 15), date(1999, 8, 20), date(2014, 8, 15), date(2015, 8, 21), date(2016, 8, 19)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in hi_holidays) def test_bennington_battle_day(self): vt_holidays = holidays.US(state='VT') self.assertFalse(date(1777, 8, 16) in vt_holidays) for year in range(1778, 2050): self.assertFalse(date(year, 8, 16) in self.holidays) self.assertTrue(date(year, 8, 16) in vt_holidays) vt_holidays.observed = False self.assertFalse("Bennington Battle Day (Observed)" in vt_holidays.get_list(date(1997, 8, 15))) vt_holidays.observed = True self.assertTrue("Bennington Battle Day (Observed)" in vt_holidays.get_list(date(1997, 8, 15))) self.assertFalse("Bennington Battle Day (Observed)" in vt_holidays.get_list(date(1997, 8, 17))) self.assertTrue("Bennington Battle Day (Observed)" in vt_holidays.get_list(date(1998, 8, 17))) self.assertFalse("Bennington Battle Day (Observed)" in vt_holidays.get_list(date(1999, 8, 15))) self.assertFalse("Bennington Battle Day (Observed)" in vt_holidays.get_list(date(1999, 8, 17))) def test_lyndon_baines_johnson_day(self): tx_holidays = holidays.US(state='TX') self.assertFalse(date(1972, 8, 27) in tx_holidays) for year in (1973, 2050): self.assertFalse(date(year, 8, 27) in self.holidays) self.assertTrue(date(year, 8, 27) in tx_holidays) def test_labor_day(self): for dt in [date(1997, 9, 1), date(1999, 9, 6), date(2000, 9, 4), date(2012, 9, 3), date(2013, 9, 2), date(2014, 9, 1), date(2015, 9, 7), date(2016, 9, 5), date(2020, 9, 7)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_columbus_day(self): ak_holidays = holidays.US(state='AK') de_holidays = holidays.US(state='DE') fl_holidays = holidays.US(state='FL') hi_holidays = holidays.US(state='HI') sd_holidays = holidays.US(state='SD') vi_holidays = holidays.US(state='VI') for dt in [date(1937, 10, 12), date(1969, 10, 12), date(1970, 10, 12), date(1999, 10, 11), date(2000, 10, 9), date(2001, 10, 8), date(2013, 10, 14), date(2018, 10, 8), date(2019, 10, 14)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt in ak_holidays) self.assertFalse(dt in de_holidays) self.assertFalse(dt in fl_holidays) self.assertFalse(dt in hi_holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertEqual(sd_holidays.get(dt), "Native American Day") self.assertEqual(vi_holidays.get(dt), "Columbus Day and Puerto Rico Friendship Day") self.assertFalse(date(1936, 10, 12) in self.holidays) def test_alaska_day(self): ak_holidays = holidays.US(state='AK', observed=False) self.assertFalse(date(1866, 10, 18) in ak_holidays) for year in range(1867, 2050): self.assertTrue(date(year, 10, 18) in ak_holidays) self.assertFalse(date(year, 10, 17) in ak_holidays) self.assertFalse(date(year, 10, 19) in ak_holidays) self.assertFalse(date(year, 10, 18) in self.holidays) ak_holidays.observed = True self.assertTrue(date(2014, 10, 17) in ak_holidays) self.assertTrue(date(2015, 10, 19) in ak_holidays) def test_nevada_day(self): nv_holidays = holidays.US(state='NV') self.assertFalse(date(1932, 10, 31) in nv_holidays) for dt in [date(1933, 10, 31), date(1999, 10, 31), date(2000, 10, 27), date(2002, 10, 25), date(2014, 10, 31), date(2015, 10, 30)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in nv_holidays) self.assertTrue("Nevada Day (Observed)" in nv_holidays.get_list(date(1998, 10, 30))) self.assertTrue("Nevada Day (Observed)" in nv_holidays.get_list(date(1999, 11, 1))) nv_holidays.observed = False self.assertFalse("Nevada Day (Observed)" in nv_holidays.get_list(date(1998, 10, 30))) self.assertFalse("Nevada Day (Observed)" in nv_holidays.get_list(date(1999, 11, 1))) def test_liberty_day(self): vi_holidays = holidays.US(state='VI') for year in range(2010, 2021): self.assertFalse(date(year, 11, 1) in self.holidays) self.assertTrue(date(year, 11, 1) in vi_holidays) def test_election_day(self): de_holidays = holidays.US(state='DE') hi_holidays = holidays.US(state='HI') il_holidays = holidays.US(state='IL') in_holidays = holidays.US(state='IN') la_holidays = holidays.US(state='LA') mt_holidays = holidays.US(state='MT') nh_holidays = holidays.US(state='NH') nj_holidays = holidays.US(state='NJ') ny_holidays = holidays.US(state='NY') wv_holidays = holidays.US(state='WV') self.assertFalse(date(2004, 11, 2) in de_holidays) for dt in [date(2008, 11, 4), date(2010, 11, 2), date(2012, 11, 6), date(2014, 11, 4), date(2016, 11, 8), date(2018, 11, 6)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in de_holidays) self.assertTrue(dt in hi_holidays) self.assertTrue(dt in il_holidays) self.assertTrue(dt in in_holidays) self.assertTrue(dt in la_holidays) self.assertTrue(dt in mt_holidays) self.assertTrue(dt in nh_holidays) self.assertTrue(dt in nj_holidays) self.assertTrue(dt in ny_holidays) self.assertTrue(dt in wv_holidays) self.assertFalse(date(2015, 11, 3) in self.holidays) self.assertFalse(date(2015, 11, 3) in de_holidays) self.assertFalse(date(2015, 11, 3) in hi_holidays) self.assertFalse(date(2015, 11, 3) in il_holidays) self.assertTrue(date(2015, 11, 3) in in_holidays) self.assertFalse(date(2015, 11, 3) in la_holidays) self.assertFalse(date(2015, 11, 3) in mt_holidays) self.assertFalse(date(2015, 11, 3) in nh_holidays) self.assertFalse(date(2015, 11, 3) in nj_holidays) self.assertTrue(date(2015, 11, 3) in ny_holidays) self.assertFalse(date(2015, 11, 3) in wv_holidays) def test_all_souls_day(self): gu_holidays = holidays.US(state='GU') for year in range(1945, 2100): self.assertFalse(date(year, 11, 2) in self.holidays) self.assertTrue(date(year, 11, 2) in gu_holidays) def test_veterans_day(self): for dt in [date(1938, 11, 11), date(1939, 11, 11), date(1970, 11, 11), date(1971, 10, 25), date(1977, 10, 24), date(1978, 11, 11), date(2012, 11, 11), date(2013, 11, 11), date(2014, 11, 11), date(2015, 11, 11), date(2016, 11, 11), date(2020, 11, 11)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse("Armistice Day" in holidays.US(years=[1937]).values()) self.assertFalse("Armistice Day" in holidays.US(years=[1937]).values()) self.assertTrue("Armistice Day" in holidays.US(years=[1938]).values()) self.assertTrue("Armistice Day" in holidays.US(years=[1953]).values()) self.assertTrue("Veterans Day" in holidays.US(years=[1954]).values()) self.assertFalse(date(2012, 11, 12) in self.holidays) self.assertFalse(date(2017, 11, 10) in self.holidays) self.holidays.observed = True self.assertTrue(date(2012, 11, 12) in self.holidays) self.assertTrue(date(2017, 11, 10) in self.holidays) def test_discovery_day(self): pr_holidays = holidays.US(state='PR') for year in range(2010, 2021): self.assertFalse(date(year, 11, 19) in self.holidays) self.assertTrue(date(year, 11, 19) in pr_holidays) self.assertFalse(date(2016, 11, 18) in pr_holidays) self.assertFalse(date(2016, 11, 20) in pr_holidays) self.assertTrue(date(2017, 11, 20) in pr_holidays) def test_thanksgiving_day(self): de_holidays = holidays.US(state='DE') fl_holidays = holidays.US(state='FL') in_holidays = holidays.US(state='IN') md_holidays = holidays.US(state='MD') nv_holidays = holidays.US(state='NV') nh_holidays = holidays.US(state='NH') nm_holidays = holidays.US(state='NM') nc_holidays = holidays.US(state='NC') ok_holidays = holidays.US(state='OK') tx_holidays = holidays.US(state='TX') wv_holidays = holidays.US(state='WV') for dt in [date(1997, 11, 27), date(1999, 11, 25), date(2000, 11, 23), date(2012, 11, 22), date(2013, 11, 28), date(2014, 11, 27), date(2015, 11, 26), date(2016, 11, 24), date(2020, 11, 26)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertTrue(dt + relativedelta(days=+1) in de_holidays) self.assertEqual(de_holidays.get(dt + relativedelta(days=+1)), "Day After Thanksgiving") self.assertEqual(nh_holidays.get(dt + relativedelta(days=+1)), "Day After Thanksgiving") self.assertEqual(nc_holidays.get(dt + relativedelta(days=+1)), "Day After Thanksgiving") self.assertEqual(ok_holidays.get(dt + relativedelta(days=+1)), "Day After Thanksgiving") self.assertEqual(wv_holidays.get(dt + relativedelta(days=+1)), "Day After Thanksgiving") self.assertTrue(dt + relativedelta(days=+1) in fl_holidays) self.assertEqual(fl_holidays.get(dt + relativedelta(days=+1)), "Friday After Thanksgiving") self.assertTrue(dt + relativedelta(days=+1) in tx_holidays) self.assertEqual(tx_holidays.get(dt + relativedelta(days=+1)), "Friday After Thanksgiving") self.assertEqual(nv_holidays.get(dt + relativedelta(days=+1)), "Family Day") self.assertEqual(nm_holidays.get(dt + relativedelta(days=+1)), "Presidents' Day") if dt.year >= 2008: self.assertEqual(md_holidays.get(dt + relativedelta(days=1)), "American Indian Heritage Day") if dt.year >= 2010: self.assertEqual(in_holidays.get(dt + relativedelta(days=1)), "Lincoln's Birthday") else: self.assertNotEqual( in_holidays.get(dt + relativedelta(days=1)), "Lincoln's Birthday") def test_robert_lee_birthday(self): ga_holidays = holidays.US(state='GA') self.assertFalse(date(1985, 11, 25) in ga_holidays) for dt in [date(2007, 11, 23), date(2008, 11, 28), date(2010, 11, 26), date(2013, 11, 29), date(2014, 11, 28), date(2015, 11, 27), date(2018, 11, 23), date(2019, 11, 29), date(2020, 11, 27)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in ga_holidays) def test_lady_of_camarin_day(self): gu_holidays = holidays.US(state='GU') for year in range(1945, 2100): self.assertFalse(date(year, 12, 8) in self.holidays) self.assertTrue(date(year, 12, 8) in gu_holidays) def test_christmass_eve(self): as_holidays = holidays.US(state='AS') ks_holidays = holidays.US(state='KS') mi_holidays = holidays.US(state='MI') nc_holidays = holidays.US(state='NC') tx_holidays = holidays.US(state='TX') wi_holidays = holidays.US(state='WI') self.holidays.observed = False for year in range(1900, 2050): self.assertFalse(date(year, 12, 24) in self.holidays) self.assertTrue(date(year, 12, 24) in as_holidays) if year >= 2013: f = ks_holidays.get(date(year, 12, 24)).find("Eve") self.assertTrue(f > 0) f = mi_holidays.get(date(year, 12, 24)).find("Eve") self.assertTrue(f > 0) f = nc_holidays.get(date(year, 12, 24)).find("Eve") self.assertTrue(f > 0) if year >= 2012: f = wi_holidays.get(date(year, 12, 24)).find("Eve") self.assertTrue(f > 0) if year >= 1981: f = tx_holidays.get(date(year, 12, 24)).find("Eve") self.assertTrue(f > 0) if year < 1981: f = ks_holidays.get(date(year, 12, 24), "").find("Eve") self.assertTrue(f < 0) f = mi_holidays.get(date(year, 12, 24), "").find("Eve") self.assertTrue(f < 0) f = nc_holidays.get(date(year, 12, 24), "").find("Eve") self.assertTrue(f < 0) f = tx_holidays.get(date(year, 12, 24), "").find("Eve") self.assertTrue(f < 0) f = wi_holidays.get(date(year, 12, 24), "").find("Eve") self.assertTrue(f < 0) self.assertTrue(date(2016, 12, 23) in as_holidays) self.assertTrue(date(2016, 12, 23) in ks_holidays) self.assertTrue(date(2016, 12, 23) in mi_holidays) self.assertTrue(date(2016, 12, 23) in nc_holidays) self.assertTrue(date(2016, 12, 23) in tx_holidays) self.assertTrue(date(2016, 12, 23) in wi_holidays) self.assertTrue("Christmas Eve (Observed)" in as_holidays.get_list(date(2017, 12, 22))) self.assertTrue("Christmas Eve (Observed)" in ks_holidays.get_list(date(2017, 12, 22))) self.assertTrue("Christmas Eve (Observed)" in mi_holidays.get_list(date(2017, 12, 22))) self.assertTrue("Christmas Eve (Observed)" in nc_holidays.get_list(date(2017, 12, 22))) self.assertTrue("Christmas Eve (Observed)" in tx_holidays.get_list(date(2017, 12, 22))) self.assertTrue("Christmas Eve (Observed)" in wi_holidays.get_list(date(2017, 12, 22))) def test_christmas_day(self): for year in range(1900, 2100): dt = date(year, 12, 25) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(date(2010, 12, 24) in self.holidays) self.assertFalse(date(2016, 12, 26) in self.holidays) self.holidays.observed = True self.assertTrue(date(2010, 12, 24) in self.holidays) self.assertTrue(date(2016, 12, 26) in self.holidays) def test_day_after_christmas(self): nc_holidays = holidays.US(state='NC', observed=False) tx_holidays = holidays.US(state='TX', observed=False) self.assertFalse(date(2015, 12, 28) in nc_holidays) self.assertFalse(date(2016, 12, 27) in nc_holidays) self.assertFalse(date(2015, 12, 28) in tx_holidays) self.assertFalse(date(2016, 12, 27) in tx_holidays) nc_holidays.observed = True self.assertTrue("Day After Christmas (Observed)" in nc_holidays.get_list(date(2015, 12, 28))) self.assertTrue("Day After Christmas (Observed)" in nc_holidays.get_list(date(2016, 12, 27))) tx_holidays.observed = True self.assertFalse("Day After Christmas (Observed)" in tx_holidays.get_list(date(2015, 12, 28))) self.assertFalse("Day After Christmas (Observed)" in tx_holidays.get_list(date(2016, 12, 27))) def test_new_years_eve(self): ky_holidays = holidays.US(state='KY') mi_holidays = holidays.US(state='MI') wi_holidays = holidays.US(state='WI') self.assertFalse(date(2012, 12, 31) in ky_holidays) self.assertFalse(date(2012, 12, 31) in mi_holidays) self.assertFalse(date(2011, 12, 31) in wi_holidays) self.assertTrue(date(2012, 12, 31) in wi_holidays) for dt in [date(2013, 12, 31), date(2016, 12, 30)]: self.assertFalse(dt in self.holidays) self.assertTrue(dt in ky_holidays) self.assertTrue(dt in mi_holidays) self.assertTrue(dt in wi_holidays) class TestNZ(unittest.TestCase): def setUp(self): self.holidays = holidays.NZ(observed=True) def test_new_years(self): for year in range(1900, 2100): dt = date(year, 1, 1) self.assertTrue(dt in self.holidays) for year, day in enumerate([1, 1, 1, 1, 3, # 2001-05 3, 1, 1, 1, 1, # 2006-10 3, 3, 1, 1, 1, # 2011-15 1, 3, 1, 1, 1, 1], # 2016-21 2001): dt = date(year, 1, day) self.assertTrue(dt in self.holidays) self.assertEqual(self.holidays[dt][:10], "New Year's") self.assertFalse("1893-01-01" in self.holidays) self.assertTrue("1894-01-01" in self.holidays) def test_day_after_new_years(self): for year in range(1900, 2100): dt = date(year, 1, 2) self.assertTrue(dt in self.holidays) for year, day in enumerate([2, 2, 2, 2, 2, # 2001-05 2, 2, 2, 2, 4, # 2006-10 4, 2, 2, 2, 2, # 2011-15 4, 2, 2, 2, 2, 4], # 2016-21 2001): dt = date(year, 1, day) self.assertTrue(dt in self.holidays) self.assertEqual(self.holidays[dt][:10], "Day after ") self.assertFalse(date(2016, 1, 3) in self.holidays) def test_waitangi_day(self): ntl_holidays = holidays.NZ(prov='Northland') for year, day in enumerate([3, 8, 7, 6, 5], 1964): dt = date(year, 2, day) self.assertTrue(dt in ntl_holidays, dt) self.assertEqual(ntl_holidays[dt][:8], "Waitangi") for year in range(1900, 1974): dt = date(year, 2, 6) self.assertFalse(dt in self.holidays) for year in range(1974, 2100): dt = date(year, 2, 6) self.assertTrue(dt in self.holidays) for year, day in enumerate([6, 6, 6, 6, 6, # 2001-05 6, 6, 6, 6, 6, # 2006-10 6, 6, 6, 6, 6, # 2011-15 8, 6, 6, 6, 6, 8], # 2016-21 2001): dt = date(year, 2, day) self.assertTrue(dt in self.holidays) self.assertEqual(self.holidays[dt][:8], "Waitangi") self.assertFalse(date(2005, 2, 7) in self.holidays) self.assertFalse(date(2010, 2, 8) in self.holidays) self.assertFalse(date(2011, 2, 7) in self.holidays) def test_good_friday(self): for dt in [date(1900, 4, 13), date(1901, 4, 5), date(1902, 3, 28), date(1999, 4, 2), date(2000, 4, 21), date(2010, 4, 2), date(2018, 3, 30), date(2019, 4, 19), date(2020, 4, 10)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_easter_monday(self): for dt in [date(1900, 4, 16), date(1901, 4, 8), date(1902, 3, 31), date(1999, 4, 5), date(2010, 4, 5), date(2018, 4, 2), date(2019, 4, 22), date(2020, 4, 13)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_anzac_day(self): for year in range(1900, 1921): dt = date(year, 4, 25) self.assertFalse(dt in self.holidays) for year in range(1921, 2100): dt = date(year, 4, 25) self.assertTrue(dt in self.holidays) for year, day in enumerate([25, 25, 25, 25, 25, # 2001-05 25, 25, 25, 25, 25, # 2006-10 25, 25, 25, 25, 27, # 2011-15 25, 25, 25, 25, 27, 26], # 2016-21 2001): dt = date(year, 4, day) self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt][:5], "Anzac") self.assertFalse(date(2009, 4, 27) in self.holidays) self.assertFalse(date(2010, 4, 26) in self.holidays) def test_sovereigns_birthday(self): self.assertTrue(date(1909, 11, 9) in self.holidays) self.assertTrue(date(1936, 6, 23) in self.holidays) self.assertTrue(date(1937, 6, 9) in self.holidays) self.assertTrue(date(1940, 6, 3) in self.holidays) self.assertTrue(date(1952, 6, 2) in self.holidays) for year in range(1912, 1936): dt = date(year, 6, 3) self.assertTrue(dt in self.holidays) self.assertEqual(self.holidays[dt], "King's Birthday") for year, day in enumerate([4, 3, 2, 7, 6, # 2001-05 5, 4, 2, 1, 7, # 2006-10 6, 4, 3, 2, 1, # 2011-15 6, 5, 4, 3, 1, 7], # 2016-21 2001): dt = date(year, 6, day) self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt], "Queen's Birthday") def test_labour_day(self): for year, day in enumerate([22, 28, 27, 25, 24, # 2001-05 23, 22, 27, 26, 25, # 2006-10 24, 22, 28, 27, 26, # 2011-15 24, 23, 22, 28, 26, 25], # 2016-21 2001): dt = date(year, 10, day) self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt], "Labour Day") def test_christmas_day(self): self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 12, 25) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(date(2010, 12, 24) in self.holidays) self.assertNotEqual(self.holidays[date(2011, 12, 26)], "Christmas Day (Observed)") self.holidays.observed = True self.assertEqual(self.holidays[date(2011, 12, 27)], "Christmas Day (Observed)") for year, day in enumerate([25, 25, 25, 27, 27, # 2001-05 25, 25, 25, 25, 27, # 2006-10 27, 25, 25, 25, 25, # 2011-15 27, 25, 25, 25, 25, 25], # 2016-21 2001): dt = date(year, 12, day) self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt][:9], "Christmas") def test_boxing_day(self): self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 12, 26) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(date(2009, 12, 28) in self.holidays) self.assertFalse(date(2010, 12, 27) in self.holidays) self.holidays.observed = True self.assertTrue(date(2009, 12, 28) in self.holidays) self.assertTrue(date(2010, 12, 27) in self.holidays) for year, day in enumerate([26, 26, 26, 28, 26, # 2001-05 26, 26, 26, 28, 28, # 2006-10 26, 26, 26, 26, 28, # 2011-15 26, 26, 26, 26, 28, 28], # 2016-21 2001): dt = date(year, 12, day) self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt][:6], "Boxing") def test_auckland_anniversary_day(self): auk_holidays = holidays.NZ(prov='Auckland') for year, day in enumerate([29, 28, 27, 26, 31, # 2001-05 30, 29, 28, 26, 1, # 2006-10 31, 30, 28, 27, 26, # 2011-15 1, 30, 29, 28, 27, 1], # 2016-21 2001): dt = date(year, 2 if day < 9 else 1, day) self.assertTrue(dt in auk_holidays, dt) self.assertEqual(auk_holidays[dt], "Auckland Anniversary Day") def test_taranaki_anniversary_day(self): tki_holidays = holidays.NZ(prov='Taranaki') for year, day in enumerate([12, 11, 10, 8, 14, # 2001-05 13, 12, 10, 9, 8, # 2006-10 14, 12, 11, 10, 9, # 2011-15 14, 13, 12, 11, 9, 8], # 2016-21 2001): dt = date(year, 3, day) self.assertTrue(dt in tki_holidays, dt) self.assertEqual(tki_holidays[dt], "Taranaki Anniversary Day") def test_hawkes_bay_anniversary_day(self): hkb_holidays = holidays.NZ(prov="Hawke's Bay") for year, day in enumerate([19, 25, 24, 22, 21, # 2001-05 20, 19, 24, 23, 22, # 2006-10 21, 19, 25, 24, 23, # 2011-15 21, 20, 19, 25, 23, 22], # 2016-21 2001): dt = date(year, 10, day) self.assertTrue(dt in hkb_holidays, dt) self.assertEqual(hkb_holidays[dt], "Hawke's Bay Anniversary Day") def test_wellington_anniversary_day(self): wgn_holidays = holidays.NZ(prov='Wellington') for year, day in enumerate([22, 21, 20, 19, 24, # 2001-05 23, 22, 21, 19, 25, # 2006-10 24, 23, 21, 20, 19, # 2011-15 25, 23, 22, 21, 20, 25], # 2016-21 2001): dt = date(year, 1, day) self.assertTrue(dt in wgn_holidays, dt) self.assertEqual(wgn_holidays[dt], "Wellington Anniversary Day", dt) def test_marlborough_anniversary_day(self): mbh_holidays = holidays.NZ(prov='Marlborough') for year, day in enumerate([29, 4, 3, 1, 31, # 2001-05 30, 29, 3, 2, 1, # 2006-10 31, 29, 4, 3, 2, # 2011-15 31, 30, 29, 4, 2, 1], # 2016-21 2001): dt = date(year, 11 if day < 9 else 10, day) self.assertTrue(dt in mbh_holidays, dt) self.assertEqual(mbh_holidays[dt], "Marlborough Anniversary Day", dt) def test_nelson_anniversary_day(self): nsn_holidays = holidays.NZ(prov='Nelson') for year, day in enumerate([29, 4, 3, 2, 31, # 2001-05 30, 29, 4, 2, 1, # 2006-10 31, 30, 4, 3, 2, # 2011-15 1, 30, 29, 4, 3, 1], # 2016-21 2001): dt = date(year, 2 if day < 9 else 1, day) self.assertTrue(dt in nsn_holidays, dt) self.assertEqual(nsn_holidays[dt], "Nelson Anniversary Day", dt) def test_canterbury_anniversary_day(self): can_holidays = holidays.NZ(prov='Canterbury') for year, day in enumerate([16, 15, 14, 12, 11, # 2001-05 17, 16, 14, 13, 12, # 2006-10 11, 16, 15, 14, 13, # 2011-15 11, 17, 16, 15, 13, 12], # 2016-21 2001): dt = date(year, 11, day) self.assertTrue(dt in can_holidays, dt) self.assertEqual(can_holidays[dt], "Canterbury Anniversary Day", dt) def test_south_canterbury_anniversary_day(self): stc_holidays = holidays.NZ(prov='South Canterbury') for year, day in enumerate([24, 23, 22, 27, 26, # 2001-05 25, 24, 22, 28, 27, # 2006-10 26, 24, 23, 22, 28, # 2011-15 26, 25, 24, 23, 28, 27], # 2016-21 2001): dt = date(year, 9, day) self.assertTrue(dt in stc_holidays, dt) self.assertEqual(stc_holidays[dt], "South Canterbury Anniversary Day", dt) def test_westland_anniversary_day(self): wtc_holidays = holidays.NZ(prov='Westland') for year, day in enumerate([3, 2, 1, 29, 5, # 2001-05 4, 3, 1, 30, 29, # 2006-10 28, 3, 2, 1, 30, # 2011-15 28, 4, 3, 2, 30, 29], # 2016-21 2001): dt = date(year, 12 if day < 9 else 11, day) self.assertTrue(dt in wtc_holidays, dt) self.assertEqual(wtc_holidays[dt], "Westland Anniversary Day", dt) def test_otago_anniversary_day(self): ota_holidays = holidays.NZ(prov='Otago') for year, day in enumerate([26, 25, 24, 22, 21, # 2001-05 20, 26, 25, 23, 22, # 2006-10 21, 26, 25, 24, 23, # 2011-15 21, 20, 26, 25, 23, 22], # 2016-21 2001): dt = date(year, 3, day) self.assertTrue(dt in ota_holidays, dt) self.assertEqual(ota_holidays[dt], "Otago Anniversary Day", dt) def test_southland_anniversary_day(self): stl_holidays = holidays.NZ(prov='Southland') for year, day in enumerate([15, 14, 20, 19, 17, # 2001-05 16, 15, 14, 19, 18, 17], # 2006-11 2001): dt = date(year, 1, day) self.assertTrue(dt in stl_holidays, dt) self.assertEqual(stl_holidays[dt], "Southland Anniversary Day", dt) for year, (month, day) in enumerate([(4, 10), (4, 2), (4, 22), (4, 7), (3, 29), (4, 18), (4, 3), (4, 23), (4, 14), (4, 6)], 2012): dt = date(year, month, day) self.assertTrue(dt in stl_holidays, dt) self.assertEqual(stl_holidays[dt], "Southland Anniversary Day", dt) def test_chatham_islands_anniversary_day(self): cit_holidays = holidays.NZ(prov='Chatham Islands') for year, day in enumerate([3, 2, 1, 29, 28, # 2001-05 27, 3, 1, 30, 29, # 2006-10 28, 3, 2, 1, 30, # 2011-15 28, 27, 3, 2, 30, 29], # 2016-21 2001): dt = date(year, 12 if day < 9 else 11, day) self.assertTrue(dt in cit_holidays, dt) self.assertEqual(cit_holidays[dt], "Chatham Islands Anniversary Day", dt) def test_all_holidays_present(self): nz_1969 = sum(holidays.NZ(years=[1969], prov=p) for p in holidays.NZ.PROVINCES) holidays_in_1969 = sum((nz_1969.get_list(key) for key in nz_1969), []) nz_2015 = sum(holidays.NZ(years=[2015], prov=p) for p in holidays.NZ.PROVINCES) holidays_in_2015 = sum((nz_2015.get_list(key) for key in nz_2015), []) nz_1974 = sum(holidays.NZ(years=[1974], prov=p) for p in holidays.NZ.PROVINCES) holidays_in_1974 = sum((nz_1974.get_list(key) for key in nz_1974), []) all_holidays = ["New Year's Day", "Day after New Year's Day", "Waitangi Day", "Good Friday", "Easter Monday", "Anzac Day", "Queen's Birthday", "Labour Day", "Christmas Day", "Boxing Day", "Auckland Anniversary Day", "Taranaki Anniversary Day", "Hawke's Bay Anniversary Day", "Wellington Anniversary Day", "Marlborough Anniversary Day", "Nelson Anniversary Day", "Canterbury Anniversary Day", "South Canterbury Anniversary Day", "Westland Anniversary Day", "Otago Anniversary Day", "Southland Anniversary Day", "Chatham Islands Anniversary Day", "Queen's Birthday", "Labour Day", "Christmas Day", "Boxing Day"] for holiday in all_holidays: self.assertTrue(holiday in holidays_in_1969, holiday) self.assertTrue(holiday in holidays_in_2015, holiday) all_holidays.remove("Waitangi Day") all_holidays.insert(2, "New Zealand Day") for holiday in all_holidays: self.assertTrue(holiday in holidays_in_1974, holiday) self.assertFalse("Waitangi Day" in holidays_in_1974) class TestAU(unittest.TestCase): def setUp(self): self.holidays = holidays.AU(observed=True) self.state_hols = dict((state, holidays.AU(observed=True, prov=state)) for state in holidays.AU.PROVINCES) def test_new_years(self): for year in range(1900, 2100): dt = date(year, 1, 1) self.assertTrue(dt in self.holidays) for year, day in enumerate([3, 2, 1, 1, 1, # 2011-15 1, 2, 1, 1, 1, 1], # 2016-21 2011): dt = date(year, 1, day) for state, hols in self.state_hols.items(): self.assertTrue(dt in hols, (state, dt)) self.assertEqual(hols[dt][:10], "New Year's", state) def test_australia_day(self): for year, day in enumerate([26, 26, 28, 27, 26, # 2011-15 26, 26, 26, 28, 27, 26], # 2016-21 2011): jan26 = date(year, 1, 26) dt = date(year, 1, day) self.assertTrue(jan26 in self.holidays, dt) self.assertEqual(self.holidays[jan26], "Australia Day") self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt][:10], "Australia ") for state in holidays.AU.PROVINCES: self.assertTrue(jan26 in self.state_hols[state], (state, dt)) self.assertEqual(self.state_hols[state][jan26], "Australia Day") self.assertTrue(dt in self.state_hols[state], (state, dt)) self.assertEqual(self.state_hols[state][dt][:10], "Australia ") self.assertFalse(date(2016, 1, 27) in self.holidays) self.assertFalse(date(1887, 1, 26) in self.holidays) self.assertFalse(date(1934, 1, 26) in self.state_hols['SA']) for dt in [date(1889, 1, 26), date(1936, 1, 26), date(1945, 1, 26)]: self.assertTrue(dt in self.state_hols['NSW'], dt) self.assertEqual(self.state_hols['NSW'][dt], "Anniversary Day") def test_good_friday(self): for dt in [date(1900, 4, 13), date(1901, 4, 5), date(1902, 3, 28), date(1999, 4, 2), date(2000, 4, 21), date(2010, 4, 2), date(2018, 3, 30), date(2019, 4, 19), date(2020, 4, 10)]: self.assertTrue(dt in self.holidays) self.assertEqual(self.holidays[dt], "Good Friday") def test_easter_saturday(self): for dt in [date(1900, 4, 14), date(1901, 4, 6), date(1902, 3, 29), date(1999, 4, 3), date(2000, 4, 22), date(2010, 4, 3), date(2018, 3, 31), date(2019, 4, 20), date(2020, 4, 11)]: for state in ['ACT', 'NSW', 'NT', 'QLD', 'SA', 'VIC']: self.assertTrue(dt in self.state_hols[state], (state, dt)) self.assertEqual(self.state_hols[state][dt], "Easter Saturday") for state in ['TAS', 'WA']: self.assertFalse(dt in self.state_hols[state], (state, dt)) def test_easter_sunday(self): for dt in [date(1900, 4, 15), date(1901, 4, 7), date(1902, 3, 30), date(1999, 4, 4), date(2010, 4, 4), date(2018, 4, 1), date(2019, 4, 21), date(2020, 4, 12)]: self.assertTrue(dt in self.state_hols['NSW'], dt) self.assertEqual(self.state_hols['NSW'][dt], "Easter Sunday") for state in ['ACT', 'NT', 'QLD', 'SA', 'VIC', 'TAS', 'WA']: self.assertFalse(dt in self.state_hols[state], (state, dt)) def test_easter_monday(self): for dt in [date(1900, 4, 16), date(1901, 4, 8), date(1902, 3, 31), date(1999, 4, 5), date(2010, 4, 5), date(2018, 4, 2), date(2019, 4, 22), date(2020, 4, 13)]: self.assertTrue(dt in self.holidays) self.assertEqual(self.holidays[dt], "Easter Monday") self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_labour_day(self): for year, day in enumerate([7, 5, 4, 3, 2, 7, 6, ], 2011): dt = date(year, 3, day) self.assertTrue(dt in self.state_hols['WA'], dt) self.assertEqual(self.state_hols['WA'][dt], "Labour Day") for year, day in enumerate([10, 9, 14], 2014): dt = date(year, 3, day) self.assertFalse(dt in self.holidays, dt) self.assertTrue(dt in self.state_hols['VIC'], dt) self.assertEqual(self.state_hols['VIC'][dt], "Labour Day") def test_anzac_day(self): for year in range(1900, 1921): dt = date(year, 4, 25) self.assertFalse(dt in self.holidays) for year in range(1921, 2100): dt = date(year, 4, 25) self.assertTrue(dt in self.holidays) for dt in [date(2015, 4, 27), date(2020, 4, 27)]: self.assertFalse(dt in self.holidays, dt) for state in ['NT', 'WA']: self.assertTrue(dt in self.state_hols[state], (state, dt)) self.assertEqual(self.state_hols[state][dt][:5], "Anzac") for state in ['ACT', 'QLD', 'SA', 'NSW', 'TAS', 'VIC']: self.assertFalse(dt in self.state_hols[state], (state, dt)) dt = date(2021, 4, 26) for state in ['ACT', 'NT', 'QLD', 'SA', 'WA']: self.assertTrue(dt in self.state_hols[state], (state, dt)) self.assertEqual(self.state_hols[state][dt][:5], "Anzac") for state in ['NSW', 'TAS', 'VIC']: self.assertFalse(dt in self.state_hols[state], (state, dt)) def test_western_australia_day(self): for year, day in enumerate([4, 3, 2], 2012): dt = date(year, 6, day) self.assertTrue(dt in self.state_hols['WA'], dt) self.assertEqual(self.state_hols['WA'][dt], "Foundation Day") for year, day in enumerate([1, 6, 5], 2015): dt = date(year, 6, day) self.assertTrue(dt in self.state_hols['WA'], dt) self.assertEqual(self.state_hols['WA'][dt], "Western Australia Day") def test_adelaide_cup(self): for dt in [date(2015, 3, 9), date(2016, 3, 14), date(2017, 3, 13)]: self.assertTrue(dt in self.state_hols['SA'], dt) self.assertEqual(self.state_hols['SA'][dt], "Adelaide Cup") def test_queens_birthday(self): # Western Australia for dt in [date(2012, 10, 1), date(2013, 9, 30), date(2014, 9, 29), date(2015, 9, 28), date(2016, 9, 26), date(2017, 9, 25)]: self.assertTrue(dt in self.state_hols['WA'], dt) self.assertEqual(self.state_hols['WA'][dt], "Queen's Birthday") # Other states except Queensland other_states = [ date(2010, 6, 14), date(2011, 6, 13), date(2012, 6, 11), date(2013, 6, 10), date(2014, 6, 9), date(2015, 6, 8), date(2016, 6, 13), date(2017, 6, 12), date(2018, 6, 11)] for dt in other_states: self.assertTrue(dt in self.state_hols['NSW'], dt) self.assertTrue(dt in self.state_hols['VIC'], dt) self.assertTrue(dt in self.state_hols['ACT'], dt) # Queensland qld_dates = other_states[:-3] qld_dates.remove(date(2012, 6, 11)) qld_dates.extend([date(2012, 10, 1), date(2016, 10, 3), date(2017, 10, 2), date(2018, 10, 1)]) for dt in qld_dates: self.assertTrue(dt in self.state_hols['QLD'], dt) self.assertEqual(self.state_hols['QLD'][dt], "Queen's Birthday") self.assertTrue(date(2012, 6, 11) in self.state_hols['QLD']) def test_picnic_day(self): for dt in [date(2015, 8, 3), date(2016, 8, 1)]: self.assertTrue(dt in self.state_hols['NT'], dt) self.assertEqual(self.state_hols['NT'][dt], "Picnic Day") def test_family_and_community_day(self): for dt in [date(2010, 9, 26), date(2011, 10, 10), date(2012, 10, 8), date(2013, 9, 30), date(2014, 9, 29), date(2015, 9, 28), date(2016, 9, 26)]: self.assertTrue(dt in self.state_hols['ACT'], dt) self.assertEqual(self.state_hols['ACT'][dt], "Family & Community Day") def test_melbourne_cup(self): for dt in [date(2014, 11, 4), date(2015, 11, 3), date(2016, 11, 1)]: self.assertTrue(dt in self.state_hols['VIC'], dt) self.assertEqual(self.state_hols['VIC'][dt], "Melbourne Cup") def test_royal_queensland_show(self): for year, day in enumerate([15, 14, 12, 11, 10, 16], 2018): dt = date(year, 8, day) self.assertTrue(dt in self.state_hols['QLD'], dt) self.assertEqual(self.state_hols['QLD'][dt], "The Royal Queensland Show") def test_christmas_day(self): self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 12, 25) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(date(2010, 12, 24) in self.holidays) self.assertNotEqual(self.holidays[date(2011, 12, 26)], "Christmas Day (Observed)") self.holidays.observed = True self.assertEqual(self.holidays[date(2011, 12, 27)], "Christmas Day (Observed)") for year, day in enumerate([25, 25, 25, 27, 27, # 2001-05 25, 25, 25, 25, 27, # 2006-10 27, 25, 25, 25, 25, # 2011-15 27, 25, 25, 25, 25, 25], # 2016-21 2001): dt = date(year, 12, day) self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt][:9], "Christmas") def test_boxing_day(self): self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 12, 26) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(date(2009, 12, 28) in self.holidays) self.assertFalse(date(2010, 12, 27) in self.holidays) self.holidays.observed = True self.assertTrue(date(2009, 12, 28) in self.holidays) self.assertTrue(date(2010, 12, 27) in self.holidays) for year, day in enumerate([26, 26, 26, 28, 26, # 2001-05 26, 26, 26, 28, 28, # 2006-10 26, 26, 26, 26, 28, # 2011-15 26, 26, 26, 26, 28, 28], # 2016-21 2001): dt = date(year, 12, day) self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt][:6], "Boxing") def test_all_holidays_present(self): au_2015 = sum(holidays.AU(years=[2015], prov=p) for p in holidays.AU.PROVINCES) holidays_in_2015 = sum((au_2015.get_list(key) for key in au_2015), []) all_holidays = ["New Year's Day", "Australia Day", "Adelaide Cup", "Canberra Day", "Good Friday", "Easter Saturday", "Easter Sunday", "Easter Monday", "Anzac Day", "Queen's Birthday", "Western Australia Day", "Family & Community Day", "Labour Day", "Eight Hours Day", "May Day", "Picnic Day", "Melbourne Cup", "Christmas Day", "Proclamation Day", "Boxing Day"] for holiday in all_holidays: self.assertTrue(holiday in holidays_in_2015, holiday) class TestDE(unittest.TestCase): def setUp(self): self.holidays = holidays.DE() self.prov_hols = dict((prov, holidays.DE(prov=prov)) for prov in holidays.DE.PROVINCES) def test_no_data_before_1990(self): de_1989 = sum(holidays.DE(years=[1989], prov=p) for p in holidays.DE.PROVINCES) self.assertTrue(len(de_1989) == 0) def test_all_holidays_present(self): de_2015 = sum(holidays.DE(years=[2015], prov=p) for p in holidays.DE.PROVINCES) in_2015 = sum((de_2015.get_list(key) for key in de_2015), []) all_de = ["Neujahr", "Heilige Drei Könige", "Karfreitag", "Ostern", "Ostermontag", "Maifeiertag", "Christi Himmelfahrt", "Pfingsten", "Pfingstmontag", "Fronleichnam", "Mariä Himmelfahrt", "Tag der Deutschen Einheit", "Reformationstag", "Allerheiligen", "Buß- und Bettag", "Erster Weihnachtstag", "Zweiter Weihnachtstag"] for holiday in all_de: self.assertTrue(holiday in in_2015, "missing: {}".format(holiday)) for holiday in in_2015: self.assertTrue(holiday in all_de, "extra: {}".format(holiday)) def test_fixed_holidays(self): fixed_days_whole_country = ( (1, 1), # Neujahr (5, 1), # Maifeiertag (10, 3), # Tag der Deutschen Einheit (12, 25), # Erster Weihnachtstag (12, 26), # Zweiter Weihnachtstag ) for y, (m, d) in product(range(1991, 2050), fixed_days_whole_country): self.assertTrue(date(y, m, d) in self.holidays) def test_heilige_drei_koenige(self): provinces_that_have = {'BW', 'BY', 'ST'} provinces_that_dont = set(holidays.DE.PROVINCES) - provinces_that_have for province, year in product(provinces_that_have, range(1991, 2050)): self.assertTrue(date(year, 1, 6) in self.prov_hols[province]) for province, year in product(provinces_that_dont, range(1991, 2050)): self.assertTrue(date(year, 1, 6) not in self.prov_hols[province]) def test_karfreitag(self): known_good = [(2014, 4, 18), (2015, 4, 3), (2016, 3, 25), (2017, 4, 14), (2018, 3, 30), (2019, 4, 19), (2020, 4, 10), (2021, 4, 2), (2022, 4, 15), (2023, 4, 7), (2024, 3, 29)] for province, (y, m, d) in product(holidays.DE.PROVINCES, known_good): self.assertTrue(date(y, m, d) in self.prov_hols[province]) def test_ostern(self): known_good = [(2014, 4, 20), (2015, 4, 5), (2016, 3, 27), (2017, 4, 16), (2018, 4, 1), (2019, 4, 21), (2020, 4, 12), (2021, 4, 4), (2022, 4, 17), (2023, 4, 9), (2024, 3, 31)] provinces_that_have = {'BB'} provinces_that_dont = set(holidays.DE.PROVINCES) - provinces_that_have for province, (y, m, d) in product(provinces_that_have, known_good): self.assertTrue(date(y, m, d) in self.prov_hols[province]) for province, (y, m, d) in product(provinces_that_dont, known_good): self.assertTrue(date(y, m, d) not in self.prov_hols[province]) def test_ostermontag(self): known_good = [(2014, 4, 21), (2015, 4, 6), (2016, 3, 28), (2017, 4, 17), (2018, 4, 2), (2019, 4, 22), (2020, 4, 13), (2021, 4, 5), (2022, 4, 18), (2023, 4, 10), (2024, 4, 1)] for province, (y, m, d) in product(holidays.DE.PROVINCES, known_good): self.assertTrue(date(y, m, d) in self.prov_hols[province]) def test_christi_himmelfahrt(self): known_good = [(2014, 5, 29), (2015, 5, 14), (2016, 5, 5), (2017, 5, 25), (2018, 5, 10), (2019, 5, 30), (2020, 5, 21), (2021, 5, 13), (2022, 5, 26), (2023, 5, 18), (2024, 5, 9)] for province, (y, m, d) in product(holidays.DE.PROVINCES, known_good): self.assertTrue(date(y, m, d) in self.prov_hols[province]) def test_pfingsten(self): known_good = [(2014, 6, 8), (2015, 5, 24), (2016, 5, 15), (2017, 6, 4), (2018, 5, 20), (2019, 6, 9), (2020, 5, 31), (2021, 5, 23), (2022, 6, 5), (2023, 5, 28), (2024, 5, 19)] provinces_that_have = {'BB'} provinces_that_dont = set(holidays.DE.PROVINCES) - provinces_that_have for province, (y, m, d) in product(provinces_that_have, known_good): self.assertTrue(date(y, m, d) in self.prov_hols[province]) for province, (y, m, d) in product(provinces_that_dont, known_good): self.assertTrue(date(y, m, d) not in self.prov_hols[province]) def test_pfingstmontag(self): known_good = [(2014, 6, 9), (2015, 5, 25), (2016, 5, 16), (2017, 6, 5), (2018, 5, 21), (2019, 6, 10), (2020, 6, 1), (2021, 5, 24), (2022, 6, 6), (2023, 5, 29), (2024, 5, 20)] for province, (y, m, d) in product(holidays.DE.PROVINCES, known_good): self.assertTrue(date(y, m, d) in self.prov_hols[province]) def test_fronleichnam(self): known_good = [(2014, 6, 19), (2015, 6, 4), (2016, 5, 26), (2017, 6, 15), (2018, 5, 31), (2019, 6, 20), (2020, 6, 11), (2021, 6, 3), (2022, 6, 16), (2023, 6, 8), (2024, 5, 30)] provinces_that_have = {'BW', 'BY', 'HE', 'NW', 'RP', 'SL'} provinces_that_dont = set(holidays.DE.PROVINCES) - provinces_that_have for province, (y, m, d) in product(provinces_that_have, known_good): self.assertTrue(date(y, m, d) in self.prov_hols[province]) for province, (y, m, d) in product(provinces_that_dont, known_good): self.assertTrue(date(y, m, d) not in self.prov_hols[province]) def test_mariae_himmelfahrt(self): provinces_that_have = {'BY', 'SL'} provinces_that_dont = set(holidays.DE.PROVINCES) - provinces_that_have for province, year in product(provinces_that_have, range(1991, 2050)): self.assertTrue(date(year, 8, 15) in self.prov_hols[province]) for province, year in product(provinces_that_dont, range(1991, 2050)): self.assertTrue(date(year, 8, 15) not in self.prov_hols[province]) def test_reformationstag(self): provinces_that_have = {'BB', 'MV', 'SN', 'ST', 'TH'} provinces_that_dont = set(holidays.DE.PROVINCES) - provinces_that_have for province, year in product(provinces_that_have, range(1991, 2050)): # in 2017 all states got the reformationstag for that year if year == 2017: continue self.assertTrue(date(year, 10, 31) in self.prov_hols[province]) for province, year in product(provinces_that_dont, range(1991, 2050)): # in 2017 all states got the reformationstag for that year if year == 2017: continue self.assertTrue(date(year, 10, 31) not in self.prov_hols[province]) # check the 2017 case where all states have the reformationstag for province in holidays.DE.PROVINCES: self.assertTrue(date(2017, 10, 31) in self.prov_hols[province]) def test_allerheiligen(self): provinces_that_have = {'BW', 'BY', 'NW', 'RP', 'SL'} provinces_that_dont = set(holidays.DE.PROVINCES) - provinces_that_have for province, year in product(provinces_that_have, range(1991, 2050)): self.assertTrue(date(year, 11, 1) in self.prov_hols[province]) for province, year in product(provinces_that_dont, range(1991, 2050)): self.assertTrue(date(year, 11, 1) not in self.prov_hols[province]) def test_buss_und_bettag(self): known_good = [(2014, 11, 19), (2015, 11, 18), (2016, 11, 16), (2017, 11, 22), (2018, 11, 21), (2019, 11, 20), (2020, 11, 18), (2021, 11, 17), (2022, 11, 16), (2023, 11, 22), (2024, 11, 20)] provinces_that_have = {'SN'} provinces_that_dont = set(holidays.DE.PROVINCES) - provinces_that_have for province, (y, m, d) in product(provinces_that_have, known_good): self.assertTrue(date(y, m, d) in self.prov_hols[province]) for province, (y, m, d) in product(provinces_that_dont, known_good): self.assertTrue(date(y, m, d) not in self.prov_hols[province]) class TestAT(unittest.TestCase): def setUp(self): self.holidays = holidays.AT() def test_new_years(self): for year in range(1900, 2100): dt = date(year, 1, 1) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_christmas(self): for year in range(1900, 2100): dt = date(year, 12, 25) self.assertTrue(dt in self.holidays) self.assertTrue(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+2) in self.holidays) def test_easter_monday(self): for dt in [date(1900, 4, 16), date(1901, 4, 8), date(1902, 3, 31), date(1999, 4, 5), date(2000, 4, 24), date(2010, 4, 5), date(2018, 4, 2), date(2019, 4, 22), date(2020, 4, 13)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_national_day(self): for year in range(1919, 1934): dt = date(year, 11, 12) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) for year in range(1967, 2100): dt = date(year, 10, 26) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_all_holidays_present(self): at_2015 = holidays.AT(years=[2015]) all_holidays = ["Neujahr", "Heilige Drei Könige", "Ostermontag", "Staatsfeiertag", "Christi Himmelfahrt", "Pfingstmontag", "Fronleichnam", "Maria Himmelfahrt", "Nationalfeiertag", "Allerheiligen", "Maria Empfängnis", "Christtag", "Stefanitag"] for holiday in all_holidays: self.assertTrue(holiday in at_2015.values()) class TestDK(unittest.TestCase): def setUp(self): self.holidays = holidays.DK() def test_2016(self): # http://www.officeholidays.com/countries/denmark/2016.php self.assertTrue(date(2016, 1, 1) in self.holidays) self.assertTrue(date(2016, 3, 24) in self.holidays) self.assertTrue(date(2016, 3, 25) in self.holidays) self.assertTrue(date(2016, 3, 28) in self.holidays) self.assertTrue(date(2016, 4, 22) in self.holidays) self.assertTrue(date(2016, 5, 5) in self.holidays) self.assertTrue(date(2016, 5, 16) in self.holidays) self.assertTrue(date(2016, 12, 25) in self.holidays) class TestUK(unittest.TestCase): def setUp(self): self.holidays = holidays.UK() def test_new_years(self): for year in range(1974, 2100): dt = date(year, 1, 1) self.assertTrue(dt in self.holidays) if year == 2000: self.assertTrue(dt + relativedelta(days=-1) in self.holidays) else: self.assertFalse(dt + relativedelta(days=-1) in self.holidays) def test_good_friday(self): for dt in [date(1900, 4, 13), date(1901, 4, 5), date(1902, 3, 28), date(1999, 4, 2), date(2000, 4, 21), date(2010, 4, 2), date(2018, 3, 30), date(2019, 4, 19), date(2020, 4, 10)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_easter_monday(self): for dt in [date(1900, 4, 16), date(1901, 4, 8), date(1902, 3, 31), date(1999, 4, 5), date(2000, 4, 24), date(2010, 4, 5), date(2018, 4, 2), date(2019, 4, 22), date(2020, 4, 13)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_royal_wedding(self): self.assertTrue('2011-04-29' in self.holidays) self.assertFalse('2010-04-29' in self.holidays) self.assertFalse('2012-04-29' in self.holidays) def test_may_day(self): for dt in [date(1978, 5, 1), date(1979, 5, 7), date(1980, 5, 5), date(1999, 5, 3), date(2000, 5, 1), date(2010, 5, 3), date(2018, 5, 7), date(2019, 5, 6), date(2020, 5, 4)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_spring_bank_holiday(self): for dt in [date(1978, 5, 29), date(1979, 5, 28), date(1980, 5, 26), date(1999, 5, 31), date(2000, 5, 29), date(2010, 5, 31), date(2018, 5, 28), date(2019, 5, 27), date(2020, 5, 25)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_christmas_day(self): self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 12, 25) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(date(2010, 12, 24) in self.holidays) self.assertNotEqual(self.holidays[date(2011, 12, 26)], "Christmas Day (Observed)") self.holidays.observed = True self.assertEqual(self.holidays[date(2011, 12, 27)], "Christmas Day (Observed)") for year, day in enumerate([25, 25, 25, 27, 27, # 2001-05 25, 25, 25, 25, 27, # 2006-10 27, 25, 25, 25, 25, # 2011-15 27, 25, 25, 25, 25, 25], # 2016-21 2001): dt = date(year, 12, day) self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt][:9], "Christmas") def test_boxing_day(self): self.holidays.observed = False for year in range(1900, 2100): dt = date(year, 12, 26) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) self.assertFalse(date(2009, 12, 28) in self.holidays) self.assertFalse(date(2010, 12, 27) in self.holidays) self.holidays.observed = True self.assertTrue(date(2004, 12, 28) in self.holidays) self.assertTrue(date(2010, 12, 28) in self.holidays) for year, day in enumerate([26, 26, 26, 28, 26, 26, 26, 26, 28, 28, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 28], 2001): dt = date(year, 12, day) self.assertTrue(dt in self.holidays, dt) self.assertEqual(self.holidays[dt][:6], "Boxing") def test_all_holidays_present(self): uk_2015 = holidays.UK(years=[2015]) all_holidays = ["New Year's Day", "Good Friday", "Easter Monday [England, Wales, Northern Ireland]", "May Day", "Spring Bank Holiday", "Christmas Day", "Boxing Day"] for holiday in all_holidays: self.assertTrue(holiday in uk_2015.values()) class TestScotland(unittest.TestCase): def setUp(self): self.holidays = holidays.Scotland() def test_2017(self): self.assertTrue('2017-01-01' in self.holidays) self.assertTrue('2017-01-02' in self.holidays) self.assertTrue('2017-01-03' in self.holidays) self.assertTrue('2017-04-14' in self.holidays) self.assertTrue('2017-05-01' in self.holidays) self.assertTrue('2017-05-29' in self.holidays) self.assertTrue('2017-08-07' in self.holidays) self.assertTrue('2017-11-30' in self.holidays) self.assertTrue('2017-12-25' in self.holidays) self.assertTrue('2017-12-26' in self.holidays) class TestES(unittest.TestCase): def setUp(self): self.holidays = holidays.ES() self.prov_holidays = dict((prov, holidays.ES(prov=prov)) for prov in holidays.ES.PROVINCES) def test_fixed_holidays(self): fixed_days_whole_country = ( (1, 1), (1, 6), (5, 1), (8, 15), (10, 12), (11, 1), (12, 6), (12, 8), (12, 25), ) for y, (m, d) in product(range(1950, 2050), fixed_days_whole_country): self.assertTrue(date(y, m, d) in self.holidays) def test_variable_days_in_2016(self): self.assertTrue(date(2016, 3, 25) in self.holidays) for prov, prov_holidays in self.prov_holidays.items(): self.assertEqual( date(2016, 3, 24) in prov_holidays, prov != 'CAT') self.assertEqual( date(2016, 3, 28) in prov_holidays, prov in ['CAT', 'PVA', 'NAV', 'CVA', 'IBA']) def test_province_specific_days(self): province_days = { (2, 28): ['AND', 'CAN', 'CAM'], (3, 1): ['IBA'], (3, 8): ['AST'], (4, 23): ['ARG', 'CAL'], (5, 30): ['ICA'], (5, 2): ['MAD'], (6, 9): ['MUR', 'RIO'], (7, 25): ['GAL'], (9, 8): ['EXT'], (9, 11): ['CAT'], (9, 27): ['NAV'], (10, 9): ['CVA'], (10, 25): ['PVA'], } for prov, prov_holidays in self.prov_holidays.items(): for year in range(2010, 2020): self.assertEqual( date(year, 12, 26) in prov_holidays, prov in ['CAT', 'IBA']) self.assertEqual( date(year, 3, 19) in prov_holidays, prov in ['CVA', 'MUR', 'MAD', 'NAV', 'PVA']) self.assertEqual( date(year, 6, 24) in prov_holidays, prov in ['CAT', 'GAL']) for fest_day, fest_prov in province_days.items(): self.assertEqual( date(year, *fest_day) in prov_holidays, prov in fest_prov) class TestTAR(unittest.TestCase): def setUp(self): self.holidays = holidays.TAR() def test_new_years(self): for year in range(1974, 2100): dt = date(year, 1, 1) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) def test_good_friday(self): for dt in [date(1900, 4, 13), date(1901, 4, 5), date(1902, 3, 28), date(1999, 4, 2), date(2000, 4, 21), date(2010, 4, 2), date(2018, 3, 30), date(2019, 4, 19), date(2020, 4, 10)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_easter_monday(self): for dt in [date(1900, 4, 16), date(1901, 4, 8), date(1902, 3, 31), date(1999, 4, 5), date(2000, 4, 24), date(2010, 4, 5), date(2018, 4, 2), date(2019, 4, 22), date(2020, 4, 13)]: self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_labour_day(self): for year in range(1900, 2100): dt = date(year, 5, 1) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_christmas_day(self): for year in range(1900, 2100): dt = date(year, 12, 25) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=-1) in self.holidays) def test_26_december_day(self): for year in range(1900, 2100): dt = date(year, 12, 26) self.assertTrue(dt in self.holidays) self.assertFalse(dt + relativedelta(days=+1) in self.holidays) def test_all_holidays_present(self): tar_2015 = holidays.TAR(years=[2015]) all_holidays = ["New Year's Day", "Good Friday", "Easter Monday", "1 May (Labour Day)", "Christmas Day", "26 December"] for holiday in all_holidays: self.assertTrue(holiday in tar_2015.values()) class TestECB(unittest.TestCase): def setUp(self): self.holidays_ecb = holidays.ECB() self.holidays_tar = holidays.TAR() def test_new_years(self): for year in range(1974, 2100): self.holidays_ecb._populate(year) self.holidays_tar._populate(year) for holiday in self.holidays_tar: self.assertTrue(holiday in self.holidays_ecb) class TestCZ(unittest.TestCase): def setUp(self): self.holidays = holidays.CZ() def test_2017(self): # http://www.officeholidays.com/countries/czech_republic/2017.php self.assertTrue(date(2017, 1, 1) in self.holidays) self.assertTrue(date(2017, 4, 14) in self.holidays) self.assertTrue(date(2017, 4, 17) in self.holidays) self.assertTrue(date(2017, 5, 1) in self.holidays) self.assertTrue(date(2017, 5, 8) in self.holidays) self.assertTrue(date(2017, 7, 5) in self.holidays) self.assertTrue(date(2017, 7, 6) in self.holidays) self.assertTrue(date(2017, 9, 28) in self.holidays) self.assertTrue(date(2017, 10, 28) in self.holidays) self.assertTrue(date(2017, 11, 17) in self.holidays) self.assertTrue(date(2017, 12, 24) in self.holidays) self.assertTrue(date(2017, 12, 25) in self.holidays) self.assertTrue(date(2017, 12, 26) in self.holidays) class TestSK(unittest.TestCase): def setUp(self): self.holidays = holidays.SK() def test_2018(self): # https://www.officeholidays.com/countries/slovakia/2018.php self.assertTrue(date(2018, 1, 1) in self.holidays) self.assertTrue(date(2018, 1, 6) in self.holidays) self.assertTrue(date(2018, 3, 30) in self.holidays) self.assertTrue(date(2018, 5, 1) in self.holidays) self.assertTrue(date(2018, 5, 8) in self.holidays) self.assertTrue(date(2018, 4, 2) in self.holidays) self.assertTrue(date(2018, 7, 5) in self.holidays) self.assertTrue(date(2018, 8, 29) in self.holidays) self.assertTrue(date(2018, 9, 1) in self.holidays) self.assertTrue(date(2018, 9, 15) in self.holidays) self.assertTrue(date(2018, 11, 1) in self.holidays) self.assertTrue(date(2018, 11, 17) in self.holidays) self.assertTrue(date(2018, 12, 24) in self.holidays) self.assertTrue(date(2018, 12, 25) in self.holidays) self.assertTrue(date(2018, 12, 26) in self.holidays) class TestPL(unittest.TestCase): def setUp(self): self.holidays = holidays.PL() def test_2017(self): # http://www.officeholidays.com/countries/poland/2017.php self.assertTrue(date(2017, 1, 1) in self.holidays) self.assertTrue(date(2017, 1, 6) in self.holidays) self.assertTrue(date(2017, 4, 16) in self.holidays) self.assertTrue(date(2017, 4, 17) in self.holidays) self.assertTrue(date(2017, 5, 1) in self.holidays) self.assertTrue(date(2017, 5, 3) in self.holidays) self.assertTrue(date(2017, 6, 4) in self.holidays) self.assertTrue(date(2017, 6, 15) in self.holidays) self.assertTrue(date(2017, 8, 15) in self.holidays) self.assertTrue(date(2017, 11, 1) in self.holidays) self.assertTrue(date(2017, 11, 11) in self.holidays) self.assertTrue(date(2017, 12, 25) in self.holidays) self.assertTrue(date(2017, 12, 26) in self.holidays) class TestPT(unittest.TestCase): def setUp(self): self.holidays = holidays.PT() def test_2017(self): # http://www.officeholidays.com/countries/portugal/2017.php self.assertTrue(date(2017, 1, 1) in self.holidays) # New Year self.assertTrue(date(2017, 4, 14) in self.holidays) # Good Friday self.assertTrue(date(2017, 4, 16) in self.holidays) # Easter self.assertTrue(date(2017, 4, 25) in self.holidays) # Liberation Day self.assertTrue(date(2017, 5, 1) in self.holidays) # Labour Day self.assertTrue(date(2017, 6, 10) in self.holidays) # Portugal Day self.assertTrue(date(2017, 6, 15) in self.holidays) # Corpus Christi self.assertTrue(date(2017, 8, 15) in self.holidays) # Assumption Day self.assertTrue(date(2017, 10, 5) in self.holidays) # Republic Day self.assertTrue(date(2017, 11, 1) in self.holidays) # All Saints Day self.assertTrue(date(2017, 12, 1) in self.holidays) # Independence self.assertTrue(date(2017, 12, 8) in self.holidays) # Immaculate self.assertTrue(date(2017, 12, 25) in self.holidays) # Christmas class TestNorway(unittest.TestCase): def setUp(self): self.holidays_without_sundays = holidays.Norway(include_sundays=False) self.holidays_with_sundays = holidays.Norway() def test_new_years(self): self.assertTrue('1900-01-01' in self.holidays_without_sundays) self.assertTrue('2017-01-01' in self.holidays_without_sundays) self.assertTrue('2999-01-01' in self.holidays_without_sundays) def test_easter(self): self.assertTrue('2000-04-20' in self.holidays_without_sundays) self.assertTrue('2000-04-21' in self.holidays_without_sundays) self.assertTrue('2000-04-23' in self.holidays_without_sundays) self.assertTrue('2000-04-24' in self.holidays_without_sundays) self.assertTrue('2010-04-01' in self.holidays_without_sundays) self.assertTrue('2010-04-02' in self.holidays_without_sundays) self.assertTrue('2010-04-04' in self.holidays_without_sundays) self.assertTrue('2010-04-05' in self.holidays_without_sundays) self.assertTrue('2021-04-01' in self.holidays_without_sundays) self.assertTrue('2021-04-02' in self.holidays_without_sundays) self.assertTrue('2021-04-04' in self.holidays_without_sundays) self.assertTrue('2021-04-05' in self.holidays_without_sundays) self.assertTrue('2024-03-28' in self.holidays_without_sundays) self.assertTrue('2024-03-29' in self.holidays_without_sundays) self.assertTrue('2024-03-31' in self.holidays_without_sundays) self.assertTrue('2024-04-01' in self.holidays_without_sundays) def test_workers_day(self): self.assertFalse('1900-05-01' in self.holidays_without_sundays) self.assertFalse('1946-05-01' in self.holidays_without_sundays) self.assertTrue('1947-05-01' in self.holidays_without_sundays) self.assertTrue('2017-05-01' in self.holidays_without_sundays) self.assertTrue('2999-05-01' in self.holidays_without_sundays) def test_constitution_day(self): self.assertFalse('1900-05-17' in self.holidays_without_sundays) self.assertFalse('1946-05-17' in self.holidays_without_sundays) self.assertTrue('1947-05-17' in self.holidays_without_sundays) self.assertTrue('2017-05-17' in self.holidays_without_sundays) self.assertTrue('2999-05-17' in self.holidays_without_sundays) def test_pentecost(self): self.assertTrue('2000-06-11' in self.holidays_without_sundays) self.assertTrue('2000-06-12' in self.holidays_without_sundays) self.assertTrue('2010-05-23' in self.holidays_without_sundays) self.assertTrue('2010-05-24' in self.holidays_without_sundays) self.assertTrue('2021-05-23' in self.holidays_without_sundays) self.assertTrue('2021-05-24' in self.holidays_without_sundays) self.assertTrue('2024-05-19' in self.holidays_without_sundays) self.assertTrue('2024-05-20' in self.holidays_without_sundays) def test_christmas(self): self.assertTrue('1901-12-25' in self.holidays_without_sundays) self.assertTrue('1901-12-26' in self.holidays_without_sundays) self.assertTrue('2016-12-25' in self.holidays_without_sundays) self.assertTrue('2016-12-26' in self.holidays_without_sundays) self.assertTrue('2500-12-25' in self.holidays_without_sundays) self.assertTrue('2500-12-26' in self.holidays_without_sundays) def test_sundays(self): """ Sundays are considered holidays in Norway :return: """ self.assertTrue('1989-12-31' in self.holidays_with_sundays) self.assertTrue('2017-02-05' in self.holidays_with_sundays) self.assertTrue('2017-02-12' in self.holidays_with_sundays) self.assertTrue('2032-02-29' in self.holidays_with_sundays) def test_not_holiday(self): """ Note: Sundays in Norway are considered holidays, so make sure none of these are actually sundays TODO: Should add more dates that are often confused for being a holiday :return: """ self.assertFalse('2017-02-06' in self.holidays_without_sundays) self.assertFalse('2017-02-07' in self.holidays_without_sundays) self.assertFalse('2017-02-08' in self.holidays_without_sundays) self.assertFalse('2017-02-09' in self.holidays_without_sundays) self.assertFalse('2017-02-10' in self.holidays_without_sundays) self.assertFalse('2001-12-24' in self.holidays_without_sundays) self.assertFalse('2001-05-16' in self.holidays_without_sundays) self.assertFalse('2001-05-18' in self.holidays_without_sundays) self.assertFalse('1999-12-31' in self.holidays_without_sundays) self.assertFalse('2016-12-31' in self.holidays_without_sundays) self.assertFalse('2016-12-27' in self.holidays_without_sundays) self.assertFalse('2016-12-28' in self.holidays_without_sundays) self.assertFalse('2017-02-06' in self.holidays_with_sundays) self.assertFalse('2017-02-07' in self.holidays_with_sundays) self.assertFalse('2017-02-08' in self.holidays_with_sundays) self.assertFalse('2017-02-09' in self.holidays_with_sundays) self.assertFalse('2017-02-10' in self.holidays_with_sundays) self.assertFalse('2001-12-24' in self.holidays_with_sundays) self.assertFalse('2001-05-16' in self.holidays_with_sundays) self.assertFalse('2001-05-18' in self.holidays_with_sundays) self.assertFalse('1999-12-31' in self.holidays_with_sundays) self.assertFalse('2016-12-31' in self.holidays_with_sundays) self.assertFalse('2016-12-27' in self.holidays_with_sundays) self.assertFalse('2016-12-28' in self.holidays_with_sundays) class TestItaly(unittest.TestCase): def setUp(self): self.holidays = holidays.IT() def test_2017(self): # https://www.giorni-festivi.it/ self.assertTrue(date(2017, 1, 1) in self.holidays) self.assertTrue(date(2017, 1, 6) in self.holidays) self.assertTrue(date(2017, 4, 16) in self.holidays) self.assertTrue(date(2017, 4, 17) in self.holidays) self.assertTrue(date(2017, 4, 25) in self.holidays) self.assertTrue(date(2017, 5, 1) in self.holidays) self.assertTrue(date(2017, 6, 2) in self.holidays) self.assertTrue(date(2017, 8, 15) in self.holidays) self.assertTrue(date(2017, 11, 1) in self.holidays) self.assertTrue(date(2017, 12, 8) in self.holidays) self.assertTrue(date(2017, 12, 25) in self.holidays) self.assertTrue(date(2017, 12, 26) in self.holidays) def test_new_years(self): for year in range(1974, 2100): self.assertTrue(date(year, 1, 1) in self.holidays) def test_easter(self): self.assertTrue(date(2017, 4, 16) in self.holidays) def test_easter_monday(self): self.assertTrue(date(2017, 4, 17) in self.holidays) def test_republic_day_before_1948(self): self.holidays = holidays.IT(years=[1947]) self.assertFalse(date(1947, 6, 2) in self.holidays) def test_republic_day_after_1948(self): self.holidays = holidays.IT(years=[1948]) self.assertTrue(date(1948, 6, 2) in self.holidays) def test_liberation_day_before_1946(self): self.holidays = holidays.IT(years=1945) self.assertFalse(date(1945, 4, 25) in self.holidays) def test_liberation_day_after_1946(self): self.holidays = holidays.IT(years=1946) self.assertTrue(date(1946, 4, 25) in self.holidays) def test_christmas(self): self.holidays = holidays.IT(years=2017) self.assertTrue(date(2017, 12, 25) in self.holidays) def test_saint_stephan(self): self.holidays = holidays.IT(years=2017) self.assertTrue(date(2017, 12, 26) in self.holidays) def test_province_specific_days(self): provMI = (holidays.IT(prov='MI', years=[2017])) provRM = (holidays.IT(prov='RM', years=[2017])) self.assertTrue("2017-12-08" in provMI) self.assertTrue("2017-06-29" in provRM) class TestSweden(unittest.TestCase): def setUp(self): self.holidays_without_sundays = holidays.Sweden(include_sundays=False) self.holidays_with_sundays = holidays.Sweden() def test_new_years(self): self.assertTrue('1900-01-01' in self.holidays_without_sundays) self.assertTrue('2017-01-01' in self.holidays_without_sundays) self.assertTrue('2999-01-01' in self.holidays_without_sundays) def test_easter(self): self.assertFalse('2000-04-20' in self.holidays_without_sundays) self.assertTrue('2000-04-21' in self.holidays_without_sundays) self.assertTrue('2000-04-23' in self.holidays_without_sundays) self.assertTrue('2000-04-24' in self.holidays_without_sundays) self.assertFalse('2010-04-01' in self.holidays_without_sundays) self.assertTrue('2010-04-02' in self.holidays_without_sundays) self.assertTrue('2010-04-04' in self.holidays_without_sundays) self.assertTrue('2010-04-05' in self.holidays_without_sundays) self.assertFalse('2021-04-01' in self.holidays_without_sundays) self.assertTrue('2021-04-02' in self.holidays_without_sundays) self.assertTrue('2021-04-04' in self.holidays_without_sundays) self.assertTrue('2021-04-05' in self.holidays_without_sundays) self.assertFalse('2024-03-28' in self.holidays_without_sundays) self.assertTrue('2024-03-29' in self.holidays_without_sundays) self.assertTrue('2024-03-31' in self.holidays_without_sundays) self.assertTrue('2024-04-01' in self.holidays_without_sundays) def test_workers_day(self): self.assertFalse('1800-05-01' in self.holidays_without_sundays) self.assertFalse('1879-05-01' in self.holidays_without_sundays) self.assertTrue('1939-05-01' in self.holidays_without_sundays) self.assertTrue('2017-05-01' in self.holidays_without_sundays) self.assertTrue('2999-05-01' in self.holidays_without_sundays) def test_constitution_day(self): self.assertFalse('1900-06-06' in self.holidays_without_sundays) self.assertFalse('2004-06-06' in self.holidays_without_sundays) self.assertTrue('2005-06-06' in self.holidays_without_sundays) self.assertTrue('2017-06-06' in self.holidays_without_sundays) self.assertTrue('2999-06-06' in self.holidays_without_sundays) def test_pentecost(self): self.assertTrue('2000-06-11' in self.holidays_without_sundays) self.assertTrue('2000-06-12' in self.holidays_without_sundays) self.assertTrue('2010-05-23' in self.holidays_without_sundays) self.assertFalse('2010-05-24' in self.holidays_without_sundays) self.assertTrue('2021-05-23' in self.holidays_without_sundays) self.assertFalse('2021-05-24' in self.holidays_without_sundays) self.assertTrue('2003-06-09' in self.holidays_without_sundays) self.assertTrue('2024-05-19' in self.holidays_without_sundays) self.assertFalse('2024-05-20' in self.holidays_without_sundays) def test_christmas(self): self.assertTrue('1901-12-25' in self.holidays_without_sundays) self.assertTrue('1901-12-26' in self.holidays_without_sundays) self.assertTrue('2016-12-25' in self.holidays_without_sundays) self.assertTrue('2016-12-26' in self.holidays_without_sundays) self.assertTrue('2500-12-25' in self.holidays_without_sundays) self.assertTrue('2500-12-26' in self.holidays_without_sundays) def test_sundays(self): """ Sundays are considered holidays in Sweden :return: """ self.assertTrue('1989-12-31' in self.holidays_with_sundays) self.assertTrue('2017-02-05' in self.holidays_with_sundays) self.assertTrue('2017-02-12' in self.holidays_with_sundays) self.assertTrue('2032-02-29' in self.holidays_with_sundays) def test_not_holiday(self): """ Note: Sundays in Sweden are considered holidays, so make sure none of these are actually sundays :return: """ self.assertFalse('2017-02-06' in self.holidays_without_sundays) self.assertFalse('2017-02-07' in self.holidays_without_sundays) self.assertFalse('2017-02-08' in self.holidays_without_sundays) self.assertFalse('2017-02-09' in self.holidays_without_sundays) self.assertFalse('2017-02-10' in self.holidays_without_sundays) self.assertFalse('2016-12-27' in self.holidays_without_sundays) self.assertFalse('2016-12-28' in self.holidays_without_sundays) self.assertFalse('2017-02-06' in self.holidays_with_sundays) self.assertFalse('2017-02-07' in self.holidays_with_sundays) self.assertFalse('2017-02-08' in self.holidays_with_sundays) self.assertFalse('2017-02-09' in self.holidays_with_sundays) self.assertFalse('2017-02-10' in self.holidays_with_sundays) self.assertFalse('2016-12-27' in self.holidays_with_sundays) self.assertFalse('2016-12-28' in self.holidays_with_sundays) class TestJapan(unittest.TestCase): def setUp(self): self.holidays = holidays.Japan(observed=False) def test_new_years_day(self): self.assertTrue(date(1949, 1, 1) in self.holidays) self.assertTrue(date(2017, 1, 1) in self.holidays) self.assertTrue(date(2050, 1, 1) in self.holidays) def test_coming_of_age(self): self.assertTrue(date(1999, 1, 15)in self.holidays) self.assertTrue(date(2000, 1, 10)in self.holidays) self.assertTrue(date(2017, 1, 9)in self.holidays) self.assertTrue(date(2030, 1, 14)in self.holidays) self.assertTrue(date(2050, 1, 10)in self.holidays) self.assertFalse(date(2000, 1, 15)in self.holidays) self.assertFalse(date(2017, 1, 15)in self.holidays) self.assertFalse(date(2030, 1, 15)in self.holidays) def test_foundation_day(self): self.assertTrue(date(1949, 2, 11) in self.holidays) self.assertTrue(date(2017, 2, 11) in self.holidays) self.assertTrue(date(2050, 2, 11) in self.holidays) def test_vernal_equinox_day(self): self.assertTrue(date(1960, 3, 20) in self.holidays) self.assertTrue(date(1970, 3, 21) in self.holidays) self.assertTrue(date(1980, 3, 20) in self.holidays) self.assertTrue(date(1990, 3, 21) in self.holidays) self.assertTrue(date(2000, 3, 20) in self.holidays) self.assertTrue(date(2010, 3, 21) in self.holidays) self.assertTrue(date(2017, 3, 20) in self.holidays) self.assertTrue(date(2020, 3, 20) in self.holidays) self.assertTrue(date(2030, 3, 20) in self.holidays) self.assertTrue(date(2040, 3, 20) in self.holidays) def test_showa_day(self): self.assertTrue(date(1950, 4, 29) in self.holidays) self.assertTrue(date(1990, 4, 29) in self.holidays) self.assertTrue(date(2010, 4, 29) in self.holidays) def test_constitution_memorial_day(self): self.assertTrue(date(1950, 5, 3) in self.holidays) self.assertTrue(date(2000, 5, 3) in self.holidays) self.assertTrue(date(2050, 5, 3) in self.holidays) def test_greenery_day(self): self.assertFalse(date(1950, 5, 4) in self.holidays) self.assertTrue(date(2007, 5, 4) in self.holidays) self.assertTrue(date(2050, 5, 4) in self.holidays) def test_childrens_day(self): self.assertTrue(date(1950, 5, 5) in self.holidays) self.assertTrue(date(2000, 5, 5) in self.holidays) self.assertTrue(date(2050, 5, 5) in self.holidays) def test_marine_day(self): self.assertFalse(date(1950, 7, 20) in self.holidays) self.assertTrue(date(2000, 7, 20) in self.holidays) self.assertTrue(date(2003, 7, 21) in self.holidays) self.assertTrue(date(2017, 7, 17) in self.holidays) self.assertTrue(date(2050, 7, 18) in self.holidays) def test_mountain_day(self): self.assertFalse(date(1950, 8, 11) in self.holidays) self.assertFalse(date(2015, 8, 11) in self.holidays) self.assertTrue(date(2016, 8, 11) in self.holidays) self.assertTrue(date(2017, 8, 11) in self.holidays) self.assertTrue(date(2050, 8, 11) in self.holidays) def test_respect_for_the_aged_day(self): self.assertFalse(date(1965, 9, 15) in self.holidays) self.assertTrue(date(1966, 9, 15) in self.holidays) self.assertTrue(date(2002, 9, 15) in self.holidays) self.assertTrue(date(2003, 9, 15) in self.holidays) self.assertFalse(date(2004, 9, 15) in self.holidays) self.assertTrue(date(2004, 9, 20) in self.holidays) self.assertTrue(date(2017, 9, 18) in self.holidays) self.assertTrue(date(2050, 9, 19) in self.holidays) def test_autumnal_equinox_day(self): self.assertTrue(date(2000, 9, 23) in self.holidays) self.assertTrue(date(2010, 9, 23) in self.holidays) self.assertTrue(date(2017, 9, 23) in self.holidays) self.assertTrue(date(2020, 9, 22) in self.holidays) self.assertTrue(date(2030, 9, 23) in self.holidays) def test_health_and_sports_day(self): self.assertFalse(date(1965, 10, 10) in self.holidays) self.assertTrue(date(1966, 10, 10) in self.holidays) self.assertTrue(date(1999, 10, 10) in self.holidays) self.assertFalse(date(2000, 10, 10) in self.holidays) self.assertTrue(date(2000, 10, 9) in self.holidays) self.assertTrue(date(2017, 10, 9) in self.holidays) self.assertTrue(date(2050, 10, 10) in self.holidays) def test_culture_day(self): self.assertTrue(date(1950, 11, 3) in self.holidays) self.assertTrue(date(2000, 11, 3) in self.holidays) self.assertTrue(date(2050, 11, 3) in self.holidays) def test_labour_thanks_giving_day(self): self.assertTrue(date(1950, 11, 23) in self.holidays) self.assertTrue(date(2000, 11, 23) in self.holidays) self.assertTrue(date(2050, 11, 23) in self.holidays) def test_emperors_birthday(self): self.assertTrue(date(1989, 12, 23) in self.holidays) self.assertTrue(date(2017, 12, 23) in self.holidays) self.assertTrue(date(2050, 12, 23) in self.holidays) def test_invalid_years(self): self.assertRaises(NotImplementedError, lambda: date(1948, 1, 1) in self.holidays) self.assertRaises(NotImplementedError, lambda: date(2051, 1, 1) in self.holidays) class TestFR(unittest.TestCase): def setUp(self): self.holidays = holidays.France() self.prov_holidays = dict((prov, holidays.France(prov=prov)) for prov in holidays.France.PROVINCES) def test_2017(self): self.assertTrue(date(2017, 1, 1) in self.holidays) self.assertTrue(date(2017, 4, 17) in self.holidays) self.assertTrue(date(2017, 5, 1) in self.holidays) self.assertTrue(date(2017, 5, 8) in self.holidays) self.assertTrue(date(2017, 5, 25) in self.holidays) self.assertTrue(date(2017, 6, 5) in self.holidays) self.assertTrue(date(2017, 7, 14) in self.holidays) def test_alsace_moselle(self): am_holidays = self.prov_holidays['Alsace-Moselle'] self.assertTrue(date(2017, 4, 14) in am_holidays) self.assertTrue(date(2017, 12, 26) in am_holidays) class TestBelgium(unittest.TestCase): def setUp(self): self.holidays = holidays.BE() def test_2017(self): # https://www.belgium.be/nl/over_belgie/land/belgie_in_een_notendop/feestdagen self.assertTrue(date(2017, 1, 1) in self.holidays) self.assertTrue(date(2017, 4, 16) in self.holidays) self.assertTrue(date(2017, 4, 17) in self.holidays) self.assertTrue(date(2017, 5, 1) in self.holidays) self.assertTrue(date(2017, 5, 25) in self.holidays) self.assertTrue(date(2017, 6, 4) in self.holidays) self.assertTrue(date(2017, 6, 5) in self.holidays) self.assertTrue(date(2017, 7, 21) in self.holidays) self.assertTrue(date(2017, 8, 15) in self.holidays) self.assertTrue(date(2017, 11, 1) in self.holidays) self.assertTrue(date(2017, 11, 11) in self.holidays) self.assertTrue(date(2017, 12, 25) in self.holidays) class TestSouthAfrica(unittest.TestCase): def setUp(self): self.holidays = holidays.ZA() def test_new_years(self): self.assertTrue('1900-01-01' in self.holidays) self.assertTrue('2017-01-01' in self.holidays) self.assertTrue('2999-01-01' in self.holidays) self.assertTrue('2017-01-02' in self.holidays) # sunday def test_easter(self): self.assertTrue(date(2017, 4, 14) in self.holidays) self.assertTrue(date(2017, 4, 17) in self.holidays) self.assertTrue(date(1994, 4, 1) in self.holidays) def test_static(self): self.assertTrue('2004-08-09' in self.holidays) def test_not_holiday(self): self.assertFalse('2016-12-28' in self.holidays) self.assertFalse('2015-03-02' in self.holidays) class TestSI(unittest.TestCase): def setUp(self): self.holidays = holidays.SI() def test_holidays(self): """ Test all expected holiday dates :return: """ # New Year self.assertTrue(date(2017, 1, 1) in self.holidays) self.assertTrue(date(2017, 1, 2) in self.holidays) # Prešeren's day self.assertTrue(date(2017, 2, 8) in self.holidays) # Easter monday - 2016 and 2017 self.assertTrue(date(2016, 3, 28) in self.holidays) self.assertTrue(date(2017, 4, 17) in self.holidays) # Day of uprising against occupation self.assertTrue(date(2017, 4, 27) in self.holidays) # Labour day self.assertTrue(date(2017, 5, 1) in self.holidays) # Labour day self.assertTrue(date(2017, 5, 2) in self.holidays) # Statehood day self.assertTrue(date(2017, 6, 25) in self.holidays) # Assumption day self.assertTrue(date(2017, 8, 15) in self.holidays) # Reformation day self.assertTrue(date(2017, 10, 31) in self.holidays) # Remembrance day self.assertTrue(date(2017, 11, 1) in self.holidays) # Christmas self.assertTrue(date(2017, 12, 25) in self.holidays) # Day of independence and unity self.assertTrue(date(2017, 12, 26) in self.holidays) def test_non_holidays(self): """ Test dates that should be excluded from holidays list :return: """ # January 2nd was not public holiday between 2012 and 2017 self.assertFalse(date(2013, 1, 2) in self.holidays) self.assertFalse(date(2014, 1, 2) in self.holidays) self.assertFalse(date(2015, 1, 2) in self.holidays) self.assertFalse(date(2016, 1, 2) in self.holidays) class TestIE(unittest.TestCase): def setUp(self): self.irish_holidays = holidays.IE() def test_new_year_day(self): self.assertTrue('2017-01-02' in self.irish_holidays) self.assertTrue('2018-01-01' in self.irish_holidays) def test_st_patricks_day(self): self.assertTrue('2017-03-17' in self.irish_holidays) self.assertTrue('2018-03-17' in self.irish_holidays) def test_easter_monday(self): self.assertTrue('2017-04-17' in self.irish_holidays) self.assertTrue('2018-04-02' in self.irish_holidays) def test_may_bank_holiday(self): self.assertTrue('2017-05-01' in self.irish_holidays) self.assertTrue('2018-05-07' in self.irish_holidays) def test_june_bank_holiday(self): self.assertTrue('2017-06-05' in self.irish_holidays) self.assertTrue('2018-06-04' in self.irish_holidays) def test_august_bank_holiday(self): self.assertTrue('2017-08-07' in self.irish_holidays) self.assertTrue('2018-08-06' in self.irish_holidays) def test_october_bank_holiday(self): self.assertTrue('2017-10-30' in self.irish_holidays) self.assertTrue('2018-10-29' in self.irish_holidays) def test_christmas_period(self): self.assertTrue('2015-12-25' in self.irish_holidays) self.assertTrue('2015-12-28' in self.irish_holidays) self.assertTrue('2016-12-26' in self.irish_holidays) self.assertTrue('2016-12-27' in self.irish_holidays) self.assertTrue('2017-12-25' in self.irish_holidays) self.assertTrue('2017-12-26' in self.irish_holidays) self.assertTrue('2018-12-25' in self.irish_holidays) self.assertTrue('2018-12-26' in self.irish_holidays) class TestFinland(unittest.TestCase): def setUp(self): self.holidays = holidays.FI() def test_fixed_holidays(self): self.assertTrue(date(2017, 1, 1) in self.holidays) self.assertEqual(self.holidays[date(2017, 1, 1)], "Uudenvuodenpäivä") self.assertTrue(date(2017, 1, 6) in self.holidays) self.assertEqual(self.holidays[date(2017, 1, 6)], "Loppiainen") self.assertTrue(date(2017, 5, 1) in self.holidays) self.assertEqual(self.holidays[date(2017, 5, 1)], "Vappu") self.assertTrue(date(2017, 12, 6) in self.holidays) self.assertEqual(self.holidays[date(2017, 12, 6)], "Itsenäisyyspäivä") self.assertTrue(date(2017, 12, 25) in self.holidays) self.assertEqual(self.holidays[date(2017, 12, 25)], "Joulupäivä") self.assertTrue(date(2017, 12, 26) in self.holidays) self.assertEqual(self.holidays[date(2017, 12, 26)], "Tapaninpäivä") def test_relative_holidays(self): self.assertTrue(date(2017, 4, 14) in self.holidays) self.assertEqual(self.holidays[date(2017, 4, 14)], "Pitkäperjantai") self.assertTrue(date(2017, 4, 16) in self.holidays) self.assertEqual(self.holidays[date(2017, 4, 16)], "Pääsiäispäivä") self.assertTrue(date(2017, 4, 17) in self.holidays) self.assertEqual(self.holidays[date(2017, 4, 17)], "2. pääsiäispäivä") self.assertTrue(date(2017, 5, 25) in self.holidays) self.assertEqual(self.holidays[date(2017, 5, 25)], "Helatorstai") self.assertTrue(date(2017, 11, 4) in self.holidays) self.assertEqual(self.holidays[date(2017, 11, 4)], "Pyhäinpäivä") def test_Juhannus(self): self.assertTrue(date(2017, 6, 24) in self.holidays) self.assertFalse(date(2017, 6, 20) in self.holidays) self.assertTrue(date(2020, 6, 20) in self.holidays) self.assertTrue(date(2021, 6, 26) in self.holidays) self.assertTrue(date(2018, 6, 22) in self.holidays) self.assertEqual(self.holidays[date(2018, 6, 22)], "Juhannusaatto") self.assertEqual(self.holidays[date(2018, 6, 23)], "Juhannuspäivä") if __name__ == "__main__": unittest.main() holidays-0.9.3/holidays.egg-info/0000755000175000017500000000000013230430403017111 5ustar maurimauri00000000000000holidays-0.9.3/holidays.egg-info/SOURCES.txt0000644000175000017500000000034713230430403021001 0ustar maurimauri00000000000000LICENSE MANIFEST.in README.rst __init__.py holidays.py setup.py tests.py holidays.egg-info/PKG-INFO holidays.egg-info/SOURCES.txt holidays.egg-info/dependency_links.txt holidays.egg-info/requires.txt holidays.egg-info/top_level.txtholidays-0.9.3/holidays.egg-info/requires.txt0000644000175000017500000000002413230430403021505 0ustar maurimauri00000000000000python-dateutil six holidays-0.9.3/holidays.egg-info/top_level.txt0000644000175000017500000000001113230430403021633 0ustar maurimauri00000000000000holidays holidays-0.9.3/holidays.egg-info/PKG-INFO0000644000175000017500000004472313230430403020220 0ustar maurimauri00000000000000Metadata-Version: 1.1 Name: holidays Version: 0.9.3 Summary: Generate and work with holidays in Python Home-page: https://github.com/dr-prodigy/python-holidays Author: dr-prodigy Author-email: maurizio.montel@gmail.com License: MIT Description-Content-Type: UNKNOWN Description: =============== python-holidays =============== A fast, efficient Python library for generating country, province and state specific sets of holidays on the fly. It aims to make determining whether a specific date is a holiday as fast and flexible as possible. .. image:: http://img.shields.io/travis/dr-prodigy/python-holidays.svg :target: https://travis-ci.org/dr-prodigy/python-holidays .. image:: http://img.shields.io/coveralls/dr-prodigy/python-holidays.svg :target: https://coveralls.io/r/dr-prodigy/python-holidays .. image:: http://img.shields.io/pypi/v/holidays.svg :target: https://pypi.python.org/pypi/holidays .. image:: http://img.shields.io/pypi/l/holidays.svg :target: https://github.com/dr-prodigy/python-holidays/blob/master/LICENSE Example Usage ------------- .. code-block:: python from datetime import date import holidays us_holidays = holidays.UnitedStates() # or holidays.US() date(2015, 1, 1) in us_holidays # True date(2015, 1, 2) in us_holidays # False # The Holiday class will also recognize strings of any format # and int/float representing a Unix timestamp '2014-01-01' in us_holidays # True '1/1/2014' in us_holidays # True 1388597445 in us_holidays # True us_holidays.get('2014-01-01') # "New Year's Day" # Easily create custom Holiday objects with your own dates instead # of using the pre-defined countries/states/provinces available custom_holidays = holidays.HolidayBase() # Append custom holiday dates by passing: # 1) a dict with date/name key/value pairs, custom_holidays.append({"2015-01-01": "New Year's Day"}) # 2) a list of dates (in any format: date, datetime, string, integer), custom_holidays.append(['2015-07-01', '07/04/2015']) # 3) a single date item custom_holidays.append(date(2015, 12, 25)) date(2015, 1, 1) in custom_holidays # True date(2015, 1, 2) in custom_holidays # False '12/25/2015' in custom_holidays # True # For more complex logic like 4th Monday of January, you can inherit the # HolidayBase class and define your own _populate(year) method. See below # documentation for examples. Install ------- The latest stable version can always be installed or updated via pip: .. code-block:: bash $ pip install holidays If the above fails, please use easy_install instead: .. code-block:: bash $ easy_install holidays Available Countries ------------------- =================== ======== ============================================================= Country Abbr Provinces/States Available =================== ======== ============================================================= Australia AU prov = **ACT** (default), NSW, NT, QLD, SA, TAS, VIC, WA Austria AT prov = B, K, N, O, S, ST, T, V, **W** (default) Belgium BE None Canada CA prov = AB, BC, MB, NB, NL, NS, NT, NU, **ON** (default), PE, QC, SK, YU Colombia CO None Czech CZ None Denmark DK None England None EuropeanCentralBank ECB,TAR Trans-European Automated Real-time Gross Settlement (TARGET2) Finland FI None France FRA **Métropole** (default), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion, Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna Germany DE BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH Ireland IE Isle of Man None Italy IT prov = MI, RM Japan JP None Mexico MX None Netherlands NL None NewZealand NZ prov = NTL, AUK, TKI, HKB, WGN, MBH, NSN, CAN, STC, WTL, OTA, STL, CIT Northern Ireland None Norway NO None Polish PL None Portugal PT None PortugalExt PTE *Portugal plus extended days most people have off* Scotland None Slovenia SI None Slovakia SK None South Africa ZA None Spain ES prov = AND, ARG, AST, CAN, CAM, CAL, CAT, CVA, EXT, GAL, IBA, ICA, MAD, MUR, NAV, PVA, RIO Sweden SE None UnitedKingdom UK None UnitedStates US state = AL, AK, AS, AZ, AR, CA, CO, CT, DE, DC, FL, GA, GU, HI, ID, IL, IN, IA, KS, KY, LA, ME, MD, MH, MA, MI, FM, MN, MS, MO, MT, NE, NV, NH, NJ, NM, NY, NC, ND, MP, OH, OK, OR, PW, PA, PR, RI, SC, SD, TN, TX, UT, VT, VA, VI, WA, WV, WI, WY Wales None =================== ======== ============================================================= API --- class holidays.HolidayBase(years=[], expand=True, observed=True, prov=None, state=None) The base class used to create holiday country classes. Parameters: years An iterable list of integers specifying the years that the Holiday object should pre-generate. This would generally only be used if setting *expand* to False. (Default: []) expand A boolean value which specifies whether or not to append holidays in new years to the holidays object. (Default: True) observed A boolean value which when set to True will include the observed day of a holiday that falls on a weekend, when appropriate. (Default: True) prov A string specifying a province that has unique statutory holidays. (Default: Australia='ACT', Canada='ON', NewZealand=None) state A string specifying a state that has unique statutory holidays. (Default: UnitedStates=None) Methods: get(key, default=None) Returns a string containing the name of the holiday(s) in date `key`, which can be of date, datetime, string, unicode, bytes, integer or float type. If multiple holidays fall on the same date the names will be seperated by commas get_list(key) Same as `get` except returns a `list` of holiday names instead of a comma seperated string pop(key, default=None) Same as `get` except the key is removed from the holiday object update/append Accepts dictionary of {date: name} pairs, a list of dates, or even singular date/string/timestamp objects and adds them to the list of holidays More Examples ------------- .. code-block:: python # Simplest example possible >>> from datetime import date >>> import holidays >>> date(2014, 1, 1) in holidays.US() True >> date(2014, 1, 2) in holidays.US() False # But this is not efficient because it is initializing a new Holiday object # and generating a list of all the holidays in 2014 during each comparison # It is more efficient to create the object only once >>> us_holidays = holidays.US() >>> date(2014, 1, 1) in us_holidays True >> date(2014, 1, 2) in us_holidays False # Each country has two class names that can be called--a full name # and an abbreviation. Use whichever you prefer. >>> holidays.UnitedStates() == holidays.US() True >>> holidays.Canada() == holidays.CA() True >>> holidays.US() == holidays.CA() False # Let's print out the holidays in 2014 specific to California, USA >>> for date, name in sorted(holidays.US(state='CA', years=2014).items()): >>> print(date, name) 2014-01-01 New Year's Day 2014-01-20 Martin Luther King, Jr. Day 2014-02-15 Susan B. Anthony Day 2014-02-17 Washington's Birthday 2014-03-31 César Chávez Day 2014-05-26 Memorial Day 2014-07-04 Independence Day 2014-09-01 Labor Day 2014-10-13 Columbus Day 2014-11-11 Veterans Day 2014-11-27 Thanksgiving 2014-12-25 Christmas Day # So far we've only checked holidays in 2014 so that's the only year the # Holidays object has generated >>> us_holidays.years set([2014]) >>> len(us_holidays) 10 # Because by default the `expand` param is True the Holiday object will add # holidays from other years as they are required. >>> date(2013, 1, 1) in us_holidays True >>> us_holidays.years set([2013, 2014]) >>> len(us_holidays) 20 # If we change the `expand` param to False the Holiday object will no longer # add holidays from new years >>> us_holidays.expand = False >>> date(2012, 1, 1) in us_holidays False >>> us.holidays.expand = True >>> date(2012, 1, 1) in us_holidays True # January 1st, 2012 fell on a Sunday so the statutory holiday was observed # on the 2nd. By default the `observed` param is True so the holiday list # will include January 2nd, 2012 as a holiday. >>> date(2012, 1, 1) in us_holidays True >>> us_holidays[date(2012, 1, 1)] "New Year's Eve" >>> date(2012, 1, 2) in us_holidays True >>> us_holidays.get(date(2012 ,1, 2)) "New Year's Eve (Observed)" # The `observed` and `expand` values can both be changed on the fly and the # holiday list will be adjusted accordingly >>> us_holidays.observed = False >>> date(2012, 1, 2) in us_holidays False us_holidays.observed = True >> date(2012, 1, 2) in us_holidays True # Holiday objects can be added together and the resulting object will # generate the holidays from all of the initial objects >>> north_america = holidays.CA() + holidays.US() + holidays.MX() >>> north_america.get('2014-07-01') "Canada Day" >>> north_america.get('2014-07-04') "Independence Day" # The other form of addition is also available >>> north_america = holidays.Canada() >>> north_america += holidays.UnitedStates() >>> north_america += holidays.Mexico() >>> north_america.country ['CA', 'US', 'MX'] # We can even get a set of holidays that include all the province- or # state-specific holidays using the built-in sum() function >>> a = sum([holidays.CA(prov=x) for x in holidays.CA.PROVINCES]) >>> a.prov PROVINCES = ['AB', 'BC', 'MB', 'NB', 'NL', 'NS', 'NT', 'NU', 'ON', 'PE', 'QC', 'SK', 'YU'] # Sometimes we may not be able to use the official federal statutory # holiday list in our code. Let's pretend we work for a company that # does not include Columbus Day as a statutory holiday but does include # "Ninja Turtle Day" on July 13th. We can create a new class that inherits # the UnitedStates class and the only method we need to override is _populate() >>> from dateutil.relativedelta import relativedelta >>> class CorporateHolidays(holidays.UnitedStates): >>> def _populate(self, year): >>> # Populate the holiday list with the default US holidays >>> holidays.UnitedStates._populate(self, year) >>> # Remove Columbus Day >>> self.pop(date(year, 10, 1) + relativedelta(weekday=MO(+2)), None) >>> # Add Ninja Turtle Day >>> self[date(year, 7, 13)] = "Ninja Turtle Day" >>> date(2014, 10, 14) in Holidays(country="US") True >>> date(2014, 10, 14) in CorporateHolidays(country="US") False >>> date(2014, 7, 13) in Holidays(country="US") False >>> date(2014 ,7, 13) in CorporateHolidays(country="US") True # We can also inherit from the HolidayBase class which has an empty # _populate method so we start with no holidays and must define them # all ourself. This is how we would create a holidays class for a country # that is not supported yet. >>> class NewCountryHolidays(holidays.HolidayBase): >>> def _populate(self, year): >>> self[date(year, 1, 2)] = "Some Federal Holiday" >>> self[date(year, 2, 3)] = "Another Federal Holiday" >>> hdays = NewCountryHolidays() # We can also include prov/state specific holidays in our new class. >>> class NewCountryHolidays(holidays.HolidayBase): >>> def _populate(self, year): >>> # Set default prov if not provided >>> if self.prov == None: >>> self.prov = 'XX' >>> self[date(year, 1, 2)] = "Some Federal Holiday" >>> if self.prov == 'XX': >>> self[date(year, 2, 3)] = "Special XX province-only holiday" >>> if self.prov == 'YY': >>> self[date(year, 3, 4)] = "Special YY province-only holiday" >>> hdays = NewCountryHolidays() >>> hdays = NewCountryHolidays(prov='XX') # If you write the code necessary to create a holiday class for a country # not currently supported please contribute your code to the project! # Perhaps you just have a list of dates that are holidays and want to turn # them into a Holiday class to access all the useful functionality. You can # use the append() method which accepts a dictionary of {date: name} pairs, # a list of dates, or even singular date/string/timestamp objects. >>> custom_holidays = holidays.HolidaysBase() >>> custom_holidays.append(['2015-01-01', '07/04/2015']) >>> custom_holidays.append(date(2015, 12, 25)) Development Version ------------------- The latest development version can be installed directly from GitHub: .. code-block:: bash $ pip install --upgrade https://github.com/dr-prodigy/python-holidays/tarball/master Running Tests ------------- .. code-block:: bash $ pip install flake8 $ flake8 holidays.py tests.py $ python tests.py Coverage -------- .. code-block:: bash $ pip install coverage $ coverage run --omit=*site-packages* tests.py $ coverage report -m Contributions ------------- .. _issues: https://github.com/dr-prodigy/python-holidays/issues .. __: https://github.com/dr-prodigy/python-holidays/pulls Issues_ and `Pull Requests`__ are always welcome. License ------- .. __: https://github.com/dr-prodigy/python-holidays/raw/master/LICENSE Code and documentation are available according to the MIT License (see LICENSE__). Platform: any Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Office/Business :: Scheduling Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Software Development :: Localization holidays-0.9.3/holidays.egg-info/dependency_links.txt0000644000175000017500000000000113230430403023157 0ustar maurimauri00000000000000 holidays-0.9.3/MANIFEST.in0000644000175000017500000000005313203533516015350 0ustar maurimauri00000000000000include *.py include *.rst include LICENSE holidays-0.9.3/LICENSE0000644000175000017500000000213613230412755014624 0ustar maurimauri00000000000000Copyright (c) 2014-2017 Copyright (c) 2018 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.