forked from vacanza/holidays
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_registry.py
More file actions
128 lines (109 loc) · 4.91 KB
/
test_registry.py
File metadata and controls
128 lines (109 loc) · 4.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# 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.
#
# Authors: Vacanza Team and individual contributors (see AUTHORS file)
# dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
# ryanss <ryanssdev@icloud.com> (c) 2014-2017
# Website: https://github.com/vacanza/python-holidays
# License: MIT (see LICENSE file)
import importlib
import inspect
import warnings
from unittest import TestCase
import pytest
import holidays
from holidays import countries, financial, registry
from tests.common import PYTHON_LATEST_SUPPORTED_VERSION, PYTHON_VERSION
class TestEntityLoader(TestCase):
@pytest.mark.skipif(
PYTHON_VERSION != PYTHON_LATEST_SUPPORTED_VERSION,
reason="Run once on the latest Python version only",
)
def test_countries_imports(self):
warnings.simplefilter("ignore")
loader_entities = set()
for module, entities in registry.COUNTRIES.items():
module = importlib.import_module(f"holidays.countries.{module}")
for entity in entities:
countries_cls = getattr(countries, entity)
loader_cls = getattr(holidays, entity)
module_cls = getattr(module, entity)
self.assertIsNotNone(countries_cls, entity)
self.assertIsNotNone(loader_cls, entity)
self.assertIsNotNone(module_cls, entity)
self.assertEqual(countries_cls, module_cls)
self.assertIsInstance(loader_cls, registry.EntityLoader)
self.assertIsInstance(loader_cls(), countries_cls)
self.assertIsInstance(loader_cls(), module_cls)
loader_entities.add(loader_cls.__name__)
countries_entities = set(
entity[0] for entity in inspect.getmembers(countries, inspect.isclass)
)
self.assertEqual(
countries_entities,
loader_entities,
"Registry entities and countries entities don't match: %s"
% countries_entities.difference(loader_entities),
)
def test_country_str(self):
self.assertEqual(
str(registry.EntityLoader("holidays.countries.united_states.US")),
"A lazy loader for <class 'holidays.countries.united_states.US'>. "
"For inheritance please use the "
"'holidays.countries.united_states.US' class directly.",
)
@pytest.mark.skipif(
PYTHON_VERSION != PYTHON_LATEST_SUPPORTED_VERSION,
reason="Run once on the latest Python version only",
)
def test_financial_imports(self):
loader_entities = set()
for module, entities in registry.FINANCIAL.items():
module = importlib.import_module(f"holidays.financial.{module}")
for entity in entities:
financial_cls = getattr(financial, entity)
loader_cls = getattr(holidays, entity)
module_cls = getattr(module, entity)
self.assertIsNotNone(financial_cls, entity)
self.assertIsNotNone(loader_cls, entity)
self.assertIsNotNone(module_cls, entity)
self.assertEqual(financial_cls, module_cls)
self.assertIsInstance(loader_cls, registry.EntityLoader)
self.assertIsInstance(loader_cls(), financial_cls)
self.assertIsInstance(loader_cls(), module_cls)
loader_entities.add(loader_cls.__name__)
financial_entities = set(
entity[0] for entity in inspect.getmembers(financial, inspect.isclass)
)
self.assertEqual(
financial_entities,
loader_entities,
"Registry entities and financial entities don't match: %s"
% financial_entities.difference(loader_entities),
)
def test_financial_str(self):
self.assertEqual(
str(registry.EntityLoader("holidays.financial.ny_stock_exchange.NYSE")),
"A lazy loader for "
"<class 'holidays.financial.ny_stock_exchange.NYSE'>. "
"For inheritance please use the "
"'holidays.financial.ny_stock_exchange.NYSE' class directly.",
)
def test_inheritance(self):
def create_instance(parent):
class SubClass(parent):
pass
return SubClass()
for cls in (holidays.UnitedStates, holidays.US, holidays.USA):
self.assertIsInstance(cls, holidays.registry.EntityLoader)
with self.assertRaises(TypeError):
create_instance(cls)
for cls in (
holidays.countries.UnitedStates,
holidays.countries.US,
holidays.countries.USA,
):
self.assertIsInstance(create_instance(cls), holidays.countries.UnitedStates)