OpenFisca-Core-test 46.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. openfisca_core/__init__.py +0 -0
  2. openfisca_core/commons/__init__.py +18 -0
  3. openfisca_core/commons/dummy.py +25 -0
  4. openfisca_core/commons/formulas.py +121 -0
  5. openfisca_core/commons/misc.py +109 -0
  6. openfisca_core/commons/py.typed +0 -0
  7. openfisca_core/commons/rates.py +114 -0
  8. openfisca_core/commons/tests/__init__.py +0 -0
  9. openfisca_core/commons/tests/test_dummy.py +9 -0
  10. openfisca_core/commons/tests/test_formulas.py +75 -0
  11. openfisca_core/commons/tests/test_rates.py +26 -0
  12. openfisca_core/data_storage/__init__.py +7 -0
  13. openfisca_core/data_storage/in_memory_storage.py +198 -0
  14. openfisca_core/data_storage/on_disk_storage.py +307 -0
  15. openfisca_core/data_storage/types.py +14 -0
  16. openfisca_core/entities/__init__.py +23 -0
  17. openfisca_core/entities/_core_entity.py +217 -0
  18. openfisca_core/entities/_description.py +55 -0
  19. openfisca_core/entities/entity.py +60 -0
  20. openfisca_core/entities/group_entity.py +123 -0
  21. openfisca_core/entities/helpers.py +165 -0
  22. openfisca_core/entities/py.typed +0 -0
  23. openfisca_core/entities/role.py +92 -0
  24. openfisca_core/entities/tests/__init__.py +0 -0
  25. openfisca_core/entities/tests/test_entity.py +10 -0
  26. openfisca_core/entities/tests/test_group_entity.py +70 -0
  27. openfisca_core/entities/tests/test_role.py +11 -0
  28. openfisca_core/entities/types.py +44 -0
  29. openfisca_core/errors/__init__.py +64 -0
  30. openfisca_core/errors/cycle_error.py +2 -0
  31. openfisca_core/errors/empty_argument_error.py +39 -0
  32. openfisca_core/errors/nan_creation_error.py +2 -0
  33. openfisca_core/errors/parameter_not_found_error.py +16 -0
  34. openfisca_core/errors/parameter_parsing_error.py +18 -0
  35. openfisca_core/errors/period_mismatch_error.py +9 -0
  36. openfisca_core/errors/situation_parsing_error.py +26 -0
  37. openfisca_core/errors/spiral_error.py +2 -0
  38. openfisca_core/errors/variable_name_config_error.py +2 -0
  39. openfisca_core/errors/variable_not_found_error.py +29 -0
  40. openfisca_core/experimental/__init__.py +9 -0
  41. openfisca_core/experimental/_errors.py +5 -0
  42. openfisca_core/experimental/_memory_config.py +41 -0
  43. openfisca_core/formula_helpers.py +9 -0
  44. openfisca_core/holders/__init__.py +33 -0
  45. openfisca_core/holders/helpers.py +93 -0
  46. openfisca_core/holders/holder.py +328 -0
  47. openfisca_core/holders/tests/__init__.py +0 -0
  48. openfisca_core/holders/tests/test_helpers.py +134 -0
  49. openfisca_core/holders/types.py +3 -0
  50. openfisca_core/indexed_enums/__init__.py +18 -0
  51. openfisca_core/indexed_enums/_enum_type.py +79 -0
  52. openfisca_core/indexed_enums/_errors.py +35 -0
  53. openfisca_core/indexed_enums/_guards.py +209 -0
  54. openfisca_core/indexed_enums/_utils.py +180 -0
  55. openfisca_core/indexed_enums/config.py +6 -0
  56. openfisca_core/indexed_enums/enum.py +218 -0
  57. openfisca_core/indexed_enums/enum_array.py +316 -0
  58. openfisca_core/indexed_enums/py.typed +0 -0
  59. openfisca_core/indexed_enums/tests/__init__.py +0 -0
  60. openfisca_core/indexed_enums/tests/test_enum.py +135 -0
  61. openfisca_core/indexed_enums/tests/test_enum_array.py +30 -0
  62. openfisca_core/indexed_enums/types.py +49 -0
  63. openfisca_core/memory_config.py +9 -0
  64. openfisca_core/model_api.py +71 -0
  65. openfisca_core/parameters/__init__.py +71 -0
  66. openfisca_core/parameters/at_instant_like.py +17 -0
  67. openfisca_core/parameters/config.py +55 -0
  68. openfisca_core/parameters/helpers.py +106 -0
  69. openfisca_core/parameters/parameter.py +217 -0
  70. openfisca_core/parameters/parameter_at_instant.py +75 -0
  71. openfisca_core/parameters/parameter_node.py +176 -0
  72. openfisca_core/parameters/parameter_node_at_instant.py +57 -0
  73. openfisca_core/parameters/parameter_scale.py +121 -0
  74. openfisca_core/parameters/parameter_scale_bracket.py +7 -0
  75. openfisca_core/parameters/values_history.py +5 -0
  76. openfisca_core/parameters/vectorial_parameter_node_at_instant.py +179 -0
  77. openfisca_core/periods/__init__.py +77 -0
  78. openfisca_core/periods/_errors.py +28 -0
  79. openfisca_core/periods/_parsers.py +122 -0
  80. openfisca_core/periods/config.py +20 -0
  81. openfisca_core/periods/date_unit.py +110 -0
  82. openfisca_core/periods/helpers.py +314 -0
  83. openfisca_core/periods/instant_.py +226 -0
  84. openfisca_core/periods/period_.py +919 -0
  85. openfisca_core/periods/py.typed +0 -0
  86. openfisca_core/periods/tests/__init__.py +0 -0
  87. openfisca_core/periods/tests/helpers/__init__.py +0 -0
  88. openfisca_core/periods/tests/helpers/test_helpers.py +65 -0
  89. openfisca_core/periods/tests/helpers/test_instant.py +73 -0
  90. openfisca_core/periods/tests/helpers/test_period.py +134 -0
  91. openfisca_core/periods/tests/test_instant.py +32 -0
  92. openfisca_core/periods/tests/test_parsers.py +129 -0
  93. openfisca_core/periods/tests/test_period.py +283 -0
  94. openfisca_core/populations/__init__.py +64 -0
  95. openfisca_core/populations/_core_population.py +454 -0
  96. openfisca_core/populations/_errors.py +65 -0
  97. openfisca_core/populations/group_population.py +326 -0
  98. openfisca_core/populations/population.py +142 -0
  99. openfisca_core/populations/tests/__init__.py +0 -0
  100. openfisca_core/populations/tests/test_members_position.py +116 -0
  101. openfisca_core/populations/types.py +110 -0
  102. openfisca_core/projectors/__init__.py +39 -0
  103. openfisca_core/projectors/entity_to_person_projector.py +12 -0
  104. openfisca_core/projectors/first_person_to_entity_projector.py +13 -0
  105. openfisca_core/projectors/helpers.py +139 -0
  106. openfisca_core/projectors/projector.py +38 -0
  107. openfisca_core/projectors/typing.py +27 -0
  108. openfisca_core/projectors/unique_role_to_entity_projector.py +14 -0
  109. openfisca_core/rates.py +9 -0
  110. openfisca_core/reforms/__init__.py +24 -0
  111. openfisca_core/reforms/in_yaml_test_reform.py +28 -0
  112. openfisca_core/reforms/reform.py +86 -0
  113. openfisca_core/scripts/__init__.py +106 -0
  114. openfisca_core/scripts/__pycache__/__init__.cpython-310-pytest-8.3.3.pyc +0 -0
  115. openfisca_core/scripts/__pycache__/__init__.cpython-310-pytest-8.4.2.pyc +0 -0
  116. openfisca_core/scripts/__pycache__/__init__.cpython-310.pyc +0 -0
  117. openfisca_core/scripts/__pycache__/__init__.cpython-311-pytest-8.3.3.pyc +0 -0
  118. openfisca_core/scripts/__pycache__/__init__.cpython-311-pytest-8.4.2.pyc +0 -0
  119. openfisca_core/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  120. openfisca_core/scripts/__pycache__/__init__.cpython-312-pytest-8.4.2.pyc +0 -0
  121. openfisca_core/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
  122. openfisca_core/scripts/__pycache__/__init__.cpython-313-pytest-8.3.3.pyc +0 -0
  123. openfisca_core/scripts/__pycache__/__init__.cpython-313-pytest-8.4.2.pyc +0 -0
  124. openfisca_core/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
  125. openfisca_core/scripts/__pycache__/find_placeholders.cpython-311.pyc +0 -0
  126. openfisca_core/scripts/__pycache__/find_placeholders.cpython-313.pyc +0 -0
  127. openfisca_core/scripts/__pycache__/measure_numpy_condition_notations.cpython-311.pyc +0 -0
  128. openfisca_core/scripts/__pycache__/measure_numpy_condition_notations.cpython-313.pyc +0 -0
  129. openfisca_core/scripts/__pycache__/measure_performances.cpython-311.pyc +0 -0
  130. openfisca_core/scripts/__pycache__/measure_performances.cpython-313.pyc +0 -0
  131. openfisca_core/scripts/__pycache__/measure_performances_fancy_indexing.cpython-311.pyc +0 -0
  132. openfisca_core/scripts/__pycache__/measure_performances_fancy_indexing.cpython-313.pyc +0 -0
  133. openfisca_core/scripts/__pycache__/openfisca_command.cpython-310.pyc +0 -0
  134. openfisca_core/scripts/__pycache__/openfisca_command.cpython-311.pyc +0 -0
  135. openfisca_core/scripts/__pycache__/openfisca_command.cpython-312.pyc +0 -0
  136. openfisca_core/scripts/__pycache__/openfisca_command.cpython-313.pyc +0 -0
  137. openfisca_core/scripts/__pycache__/remove_fuzzy.cpython-311.pyc +0 -0
  138. openfisca_core/scripts/__pycache__/remove_fuzzy.cpython-313.pyc +0 -0
  139. openfisca_core/scripts/__pycache__/run_test.cpython-310.pyc +0 -0
  140. openfisca_core/scripts/__pycache__/run_test.cpython-311.pyc +0 -0
  141. openfisca_core/scripts/__pycache__/run_test.cpython-312.pyc +0 -0
  142. openfisca_core/scripts/__pycache__/run_test.cpython-313.pyc +0 -0
  143. openfisca_core/scripts/__pycache__/simulation_generator.cpython-311.pyc +0 -0
  144. openfisca_core/scripts/__pycache__/simulation_generator.cpython-313.pyc +0 -0
  145. openfisca_core/scripts/assets/__init__.py +0 -0
  146. openfisca_core/scripts/assets/__pycache__/__init__.cpython-311.pyc +0 -0
  147. openfisca_core/scripts/assets/__pycache__/__init__.cpython-313.pyc +0 -0
  148. openfisca_core/scripts/assets/index.html +140 -0
  149. openfisca_core/scripts/find_placeholders.py +51 -0
  150. openfisca_core/scripts/measure_numpy_condition_notations.py +137 -0
  151. openfisca_core/scripts/measure_performances.py +291 -0
  152. openfisca_core/scripts/measure_performances_fancy_indexing.py +89 -0
  153. openfisca_core/scripts/migrations/__init__.py +0 -0
  154. openfisca_core/scripts/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
  155. openfisca_core/scripts/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  156. openfisca_core/scripts/migrations/__pycache__/v24_to_25.cpython-311.pyc +0 -0
  157. openfisca_core/scripts/migrations/__pycache__/v24_to_25.cpython-313.pyc +0 -0
  158. openfisca_core/scripts/migrations/v16_2_to_v17/__init__.py +0 -0
  159. openfisca_core/scripts/migrations/v16_2_to_v17/__pycache__/__init__.cpython-311.pyc +0 -0
  160. openfisca_core/scripts/migrations/v16_2_to_v17/__pycache__/__init__.cpython-313.pyc +0 -0
  161. openfisca_core/scripts/migrations/v16_2_to_v17/__pycache__/xml_to_yaml_country_template.cpython-311.pyc +0 -0
  162. openfisca_core/scripts/migrations/v16_2_to_v17/__pycache__/xml_to_yaml_country_template.cpython-313.pyc +0 -0
  163. openfisca_core/scripts/migrations/v16_2_to_v17/__pycache__/xml_to_yaml_extension_template.cpython-311.pyc +0 -0
  164. openfisca_core/scripts/migrations/v16_2_to_v17/__pycache__/xml_to_yaml_extension_template.cpython-313.pyc +0 -0
  165. openfisca_core/scripts/migrations/v16_2_to_v17/legislation.xsd +102 -0
  166. openfisca_core/scripts/migrations/v16_2_to_v17/xml_to_yaml_country_template.py +30 -0
  167. openfisca_core/scripts/migrations/v16_2_to_v17/xml_to_yaml_extension_template.py +26 -0
  168. openfisca_core/scripts/migrations/v24_to_25.py +156 -0
  169. openfisca_core/scripts/openfisca_command.py +192 -0
  170. openfisca_core/scripts/remove_fuzzy.py +213 -0
  171. openfisca_core/scripts/run_test.py +51 -0
  172. openfisca_core/scripts/simulation_generator.py +90 -0
  173. openfisca_core/simulation_builder.py +16 -0
  174. openfisca_core/simulations/__init__.py +45 -0
  175. openfisca_core/simulations/_build_default_simulation.py +158 -0
  176. openfisca_core/simulations/_build_from_variables.py +230 -0
  177. openfisca_core/simulations/_type_guards.py +298 -0
  178. openfisca_core/simulations/helpers.py +111 -0
  179. openfisca_core/simulations/simulation.py +618 -0
  180. openfisca_core/simulations/simulation_builder.py +855 -0
  181. openfisca_core/simulations/typing.py +203 -0
  182. openfisca_core/taxbenefitsystems/__init__.py +26 -0
  183. openfisca_core/taxbenefitsystems/tax_benefit_system.py +584 -0
  184. openfisca_core/taxscales/__init__.py +35 -0
  185. openfisca_core/taxscales/abstract_rate_tax_scale.py +41 -0
  186. openfisca_core/taxscales/abstract_tax_scale.py +53 -0
  187. openfisca_core/taxscales/amount_tax_scale_like.py +55 -0
  188. openfisca_core/taxscales/helpers.py +44 -0
  189. openfisca_core/taxscales/linear_average_rate_tax_scale.py +76 -0
  190. openfisca_core/taxscales/marginal_amount_tax_scale.py +34 -0
  191. openfisca_core/taxscales/marginal_rate_tax_scale.py +286 -0
  192. openfisca_core/taxscales/rate_tax_scale_like.py +214 -0
  193. openfisca_core/taxscales/single_amount_tax_scale.py +32 -0
  194. openfisca_core/taxscales/tax_scale_like.py +65 -0
  195. openfisca_core/tools/__init__.py +94 -0
  196. openfisca_core/tools/parallel_plugin.py +55 -0
  197. openfisca_core/tools/simulation_dumper.py +137 -0
  198. openfisca_core/tools/test_runner.py +802 -0
  199. openfisca_core/tracers/__init__.py +40 -0
  200. openfisca_core/tracers/computation_log.py +196 -0
  201. openfisca_core/tracers/flat_trace.py +87 -0
  202. openfisca_core/tracers/full_tracer.py +172 -0
  203. openfisca_core/tracers/performance_log.py +133 -0
  204. openfisca_core/tracers/simple_tracer.py +64 -0
  205. openfisca_core/tracers/trace_node.py +121 -0
  206. openfisca_core/tracers/tracing_parameter_node_at_instant.py +81 -0
  207. openfisca_core/types.py +548 -0
  208. openfisca_core/variables/__init__.py +26 -0
  209. openfisca_core/variables/config.py +53 -0
  210. openfisca_core/variables/helpers.py +67 -0
  211. openfisca_core/variables/tests/__init__.py +0 -0
  212. openfisca_core/variables/tests/test_definition_period.py +43 -0
  213. openfisca_core/variables/variable.py +474 -0
  214. openfisca_core/warnings/__init__.py +25 -0
  215. openfisca_core/warnings/libyaml_warning.py +2 -0
  216. openfisca_core/warnings/tempfile_warning.py +2 -0
  217. openfisca_core_test-46.0.0.data/data/share/openfisca/openfisca-core/CHANGELOG.md +4209 -0
  218. openfisca_core_test-46.0.0.data/data/share/openfisca/openfisca-core/README.md +152 -0
  219. openfisca_core_test-46.0.0.dist-info/METADATA +194 -0
  220. openfisca_core_test-46.0.0.dist-info/RECORD +237 -0
  221. openfisca_core_test-46.0.0.dist-info/WHEEL +5 -0
  222. openfisca_core_test-46.0.0.dist-info/entry_points.txt +3 -0
  223. openfisca_core_test-46.0.0.dist-info/licenses/LICENSE +661 -0
  224. openfisca_core_test-46.0.0.dist-info/top_level.txt +2 -0
  225. openfisca_web_api/__init__.py +0 -0
  226. openfisca_web_api/app.py +226 -0
  227. openfisca_web_api/errors.py +11 -0
  228. openfisca_web_api/handlers.py +90 -0
  229. openfisca_web_api/loader/__init__.py +22 -0
  230. openfisca_web_api/loader/entities.py +28 -0
  231. openfisca_web_api/loader/parameters.py +122 -0
  232. openfisca_web_api/loader/spec.py +168 -0
  233. openfisca_web_api/loader/tax_benefit_system.py +27 -0
  234. openfisca_web_api/loader/variables.py +121 -0
  235. openfisca_web_api/openAPI.yml +434 -0
  236. openfisca_web_api/scripts/__init__.py +0 -0
  237. openfisca_web_api/scripts/serve.py +99 -0
@@ -0,0 +1,283 @@
1
+ import pytest
2
+
3
+ from openfisca_core.periods import DateUnit, Instant, Period
4
+
5
+
6
+ @pytest.mark.parametrize(
7
+ ("date_unit", "instant", "size", "expected"),
8
+ [
9
+ (DateUnit.YEAR, Instant((2022, 1, 1)), 1, "2022"),
10
+ (DateUnit.MONTH, Instant((2022, 1, 1)), 12, "2022"),
11
+ (DateUnit.YEAR, Instant((2022, 3, 1)), 1, "year:2022-03"),
12
+ (DateUnit.MONTH, Instant((2022, 3, 1)), 12, "year:2022-03"),
13
+ (DateUnit.YEAR, Instant((2022, 1, 1)), 3, "year:2022:3"),
14
+ (DateUnit.YEAR, Instant((2022, 1, 3)), 3, "year:2022:3"),
15
+ ],
16
+ )
17
+ def test_str_with_years(date_unit, instant, size, expected) -> None:
18
+ assert str(Period((date_unit, instant, size))) == expected
19
+
20
+
21
+ @pytest.mark.parametrize(
22
+ ("date_unit", "instant", "size", "expected"),
23
+ [
24
+ (DateUnit.MONTH, Instant((2022, 1, 1)), 1, "2022-01"),
25
+ (DateUnit.MONTH, Instant((2022, 1, 1)), 3, "month:2022-01:3"),
26
+ (DateUnit.MONTH, Instant((2022, 3, 1)), 3, "month:2022-03:3"),
27
+ ],
28
+ )
29
+ def test_str_with_months(date_unit, instant, size, expected) -> None:
30
+ assert str(Period((date_unit, instant, size))) == expected
31
+
32
+
33
+ @pytest.mark.parametrize(
34
+ ("date_unit", "instant", "size", "expected"),
35
+ [
36
+ (DateUnit.DAY, Instant((2022, 1, 1)), 1, "2022-01-01"),
37
+ (DateUnit.DAY, Instant((2022, 1, 1)), 3, "day:2022-01-01:3"),
38
+ (DateUnit.DAY, Instant((2022, 3, 1)), 3, "day:2022-03-01:3"),
39
+ ],
40
+ )
41
+ def test_str_with_days(date_unit, instant, size, expected) -> None:
42
+ assert str(Period((date_unit, instant, size))) == expected
43
+
44
+
45
+ @pytest.mark.parametrize(
46
+ ("date_unit", "instant", "size", "expected"),
47
+ [
48
+ (DateUnit.WEEK, Instant((2022, 1, 1)), 1, "2021-W52"),
49
+ (DateUnit.WEEK, Instant((2022, 1, 1)), 3, "week:2021-W52:3"),
50
+ (DateUnit.WEEK, Instant((2022, 3, 1)), 1, "2022-W09"),
51
+ (DateUnit.WEEK, Instant((2022, 3, 1)), 3, "week:2022-W09:3"),
52
+ ],
53
+ )
54
+ def test_str_with_weeks(date_unit, instant, size, expected) -> None:
55
+ assert str(Period((date_unit, instant, size))) == expected
56
+
57
+
58
+ @pytest.mark.parametrize(
59
+ ("date_unit", "instant", "size", "expected"),
60
+ [
61
+ (DateUnit.WEEKDAY, Instant((2022, 1, 1)), 1, "2021-W52-6"),
62
+ (DateUnit.WEEKDAY, Instant((2022, 1, 1)), 3, "weekday:2021-W52-6:3"),
63
+ (DateUnit.WEEKDAY, Instant((2022, 3, 1)), 1, "2022-W09-2"),
64
+ (DateUnit.WEEKDAY, Instant((2022, 3, 1)), 3, "weekday:2022-W09-2:3"),
65
+ ],
66
+ )
67
+ def test_str_with_weekdays(date_unit, instant, size, expected) -> None:
68
+ assert str(Period((date_unit, instant, size))) == expected
69
+
70
+
71
+ @pytest.mark.parametrize(
72
+ ("date_unit", "instant", "size", "expected"),
73
+ [
74
+ (DateUnit.YEAR, Instant((2022, 12, 1)), 1, 1),
75
+ (DateUnit.YEAR, Instant((2022, 1, 1)), 2, 2),
76
+ ],
77
+ )
78
+ def test_size_in_years(date_unit, instant, size, expected) -> None:
79
+ period = Period((date_unit, instant, size))
80
+ assert period.size_in_years == expected
81
+
82
+
83
+ @pytest.mark.parametrize(
84
+ ("date_unit", "instant", "size", "expected"),
85
+ [
86
+ (DateUnit.YEAR, Instant((2020, 1, 1)), 1, 12),
87
+ (DateUnit.YEAR, Instant((2022, 1, 1)), 2, 24),
88
+ (DateUnit.MONTH, Instant((2012, 1, 3)), 3, 3),
89
+ ],
90
+ )
91
+ def test_size_in_months(date_unit, instant, size, expected) -> None:
92
+ period = Period((date_unit, instant, size))
93
+ assert period.size_in_months == expected
94
+
95
+
96
+ @pytest.mark.parametrize(
97
+ ("date_unit", "instant", "size", "expected"),
98
+ [
99
+ (DateUnit.YEAR, Instant((2022, 12, 1)), 1, 365),
100
+ (DateUnit.YEAR, Instant((2020, 1, 1)), 1, 366),
101
+ (DateUnit.YEAR, Instant((2022, 1, 1)), 2, 730),
102
+ (DateUnit.MONTH, Instant((2022, 12, 1)), 1, 31),
103
+ (DateUnit.MONTH, Instant((2020, 2, 3)), 1, 29),
104
+ (DateUnit.MONTH, Instant((2022, 1, 3)), 3, 31 + 28 + 31),
105
+ (DateUnit.MONTH, Instant((2012, 1, 3)), 3, 31 + 29 + 31),
106
+ (DateUnit.DAY, Instant((2022, 12, 31)), 1, 1),
107
+ (DateUnit.DAY, Instant((2022, 12, 31)), 3, 3),
108
+ (DateUnit.WEEK, Instant((2022, 12, 31)), 1, 7),
109
+ (DateUnit.WEEK, Instant((2022, 12, 31)), 3, 21),
110
+ (DateUnit.WEEKDAY, Instant((2022, 12, 31)), 1, 1),
111
+ (DateUnit.WEEKDAY, Instant((2022, 12, 31)), 3, 3),
112
+ ],
113
+ )
114
+ def test_size_in_days(date_unit, instant, size, expected) -> None:
115
+ period = Period((date_unit, instant, size))
116
+ assert period.size_in_days == expected
117
+ assert period.size_in_days == period.days
118
+
119
+
120
+ @pytest.mark.parametrize(
121
+ ("date_unit", "instant", "size", "expected"),
122
+ [
123
+ (DateUnit.YEAR, Instant((2022, 12, 1)), 1, 52),
124
+ (DateUnit.YEAR, Instant((2020, 1, 1)), 5, 261),
125
+ (DateUnit.MONTH, Instant((2022, 12, 1)), 1, 4),
126
+ (DateUnit.MONTH, Instant((2020, 2, 3)), 1, 4),
127
+ (DateUnit.MONTH, Instant((2022, 1, 3)), 3, 12),
128
+ (DateUnit.MONTH, Instant((2012, 1, 3)), 3, 13),
129
+ (DateUnit.WEEK, Instant((2022, 12, 31)), 1, 1),
130
+ (DateUnit.WEEK, Instant((2022, 12, 31)), 3, 3),
131
+ ],
132
+ )
133
+ def test_size_in_weeks(date_unit, instant, size, expected) -> None:
134
+ period = Period((date_unit, instant, size))
135
+ assert period.size_in_weeks == expected
136
+
137
+
138
+ @pytest.mark.parametrize(
139
+ ("date_unit", "instant", "size", "expected"),
140
+ [
141
+ (DateUnit.YEAR, Instant((2022, 12, 1)), 1, 364),
142
+ (DateUnit.YEAR, Instant((2020, 1, 1)), 1, 364),
143
+ (DateUnit.YEAR, Instant((2022, 1, 1)), 2, 728),
144
+ (DateUnit.MONTH, Instant((2022, 12, 1)), 1, 31),
145
+ (DateUnit.MONTH, Instant((2020, 2, 3)), 1, 29),
146
+ (DateUnit.MONTH, Instant((2022, 1, 3)), 3, 31 + 28 + 31),
147
+ (DateUnit.MONTH, Instant((2012, 1, 3)), 3, 31 + 29 + 31),
148
+ (DateUnit.DAY, Instant((2022, 12, 31)), 1, 1),
149
+ (DateUnit.DAY, Instant((2022, 12, 31)), 3, 3),
150
+ (DateUnit.WEEK, Instant((2022, 12, 31)), 1, 7),
151
+ (DateUnit.WEEK, Instant((2022, 12, 31)), 3, 21),
152
+ (DateUnit.WEEKDAY, Instant((2022, 12, 31)), 1, 1),
153
+ (DateUnit.WEEKDAY, Instant((2022, 12, 31)), 3, 3),
154
+ ],
155
+ )
156
+ def test_size_in_weekdays(date_unit, instant, size, expected) -> None:
157
+ period = Period((date_unit, instant, size))
158
+ assert period.size_in_weekdays == expected
159
+
160
+
161
+ @pytest.mark.parametrize(
162
+ ("period_unit", "sub_unit", "instant", "start", "cease", "count"),
163
+ [
164
+ (
165
+ DateUnit.YEAR,
166
+ DateUnit.YEAR,
167
+ Instant((2022, 12, 31)),
168
+ Instant((2022, 1, 1)),
169
+ Instant((2024, 1, 1)),
170
+ 3,
171
+ ),
172
+ (
173
+ DateUnit.YEAR,
174
+ DateUnit.MONTH,
175
+ Instant((2022, 12, 31)),
176
+ Instant((2022, 12, 1)),
177
+ Instant((2025, 11, 1)),
178
+ 36,
179
+ ),
180
+ (
181
+ DateUnit.YEAR,
182
+ DateUnit.DAY,
183
+ Instant((2022, 12, 31)),
184
+ Instant((2022, 12, 31)),
185
+ Instant((2025, 12, 30)),
186
+ 1096,
187
+ ),
188
+ (
189
+ DateUnit.YEAR,
190
+ DateUnit.WEEK,
191
+ Instant((2022, 12, 31)),
192
+ Instant((2022, 12, 26)),
193
+ Instant((2025, 12, 15)),
194
+ 156,
195
+ ),
196
+ (
197
+ DateUnit.YEAR,
198
+ DateUnit.WEEKDAY,
199
+ Instant((2022, 12, 31)),
200
+ Instant((2022, 12, 31)),
201
+ Instant((2025, 12, 26)),
202
+ 1092,
203
+ ),
204
+ (
205
+ DateUnit.MONTH,
206
+ DateUnit.MONTH,
207
+ Instant((2022, 12, 31)),
208
+ Instant((2022, 12, 1)),
209
+ Instant((2023, 2, 1)),
210
+ 3,
211
+ ),
212
+ (
213
+ DateUnit.MONTH,
214
+ DateUnit.DAY,
215
+ Instant((2022, 12, 31)),
216
+ Instant((2022, 12, 31)),
217
+ Instant((2023, 3, 30)),
218
+ 90,
219
+ ),
220
+ (
221
+ DateUnit.DAY,
222
+ DateUnit.DAY,
223
+ Instant((2022, 12, 31)),
224
+ Instant((2022, 12, 31)),
225
+ Instant((2023, 1, 2)),
226
+ 3,
227
+ ),
228
+ (
229
+ DateUnit.DAY,
230
+ DateUnit.WEEKDAY,
231
+ Instant((2022, 12, 31)),
232
+ Instant((2022, 12, 31)),
233
+ Instant((2023, 1, 2)),
234
+ 3,
235
+ ),
236
+ (
237
+ DateUnit.WEEK,
238
+ DateUnit.DAY,
239
+ Instant((2022, 12, 31)),
240
+ Instant((2022, 12, 31)),
241
+ Instant((2023, 1, 20)),
242
+ 21,
243
+ ),
244
+ (
245
+ DateUnit.WEEK,
246
+ DateUnit.WEEK,
247
+ Instant((2022, 12, 31)),
248
+ Instant((2022, 12, 26)),
249
+ Instant((2023, 1, 9)),
250
+ 3,
251
+ ),
252
+ (
253
+ DateUnit.WEEK,
254
+ DateUnit.WEEKDAY,
255
+ Instant((2022, 12, 31)),
256
+ Instant((2022, 12, 31)),
257
+ Instant((2023, 1, 20)),
258
+ 21,
259
+ ),
260
+ (
261
+ DateUnit.WEEKDAY,
262
+ DateUnit.DAY,
263
+ Instant((2022, 12, 31)),
264
+ Instant((2022, 12, 31)),
265
+ Instant((2023, 1, 2)),
266
+ 3,
267
+ ),
268
+ (
269
+ DateUnit.WEEKDAY,
270
+ DateUnit.WEEKDAY,
271
+ Instant((2022, 12, 31)),
272
+ Instant((2022, 12, 31)),
273
+ Instant((2023, 1, 2)),
274
+ 3,
275
+ ),
276
+ ],
277
+ )
278
+ def test_subperiods(period_unit, sub_unit, instant, start, cease, count) -> None:
279
+ period = Period((period_unit, instant, 3))
280
+ subperiods = period.get_subperiods(sub_unit)
281
+ assert len(subperiods) == count
282
+ assert subperiods[0] == Period((sub_unit, start, 1))
283
+ assert subperiods[-1] == Period((sub_unit, cease, 1))
@@ -0,0 +1,64 @@
1
+ # Transitional imports to ensure non-breaking changes.
2
+ # Could be deprecated in the next major release.
3
+ #
4
+ # How imports are being used today:
5
+ #
6
+ # >>> from openfisca_core.module import symbol
7
+ #
8
+ # The previous example provokes cyclic dependency problems
9
+ # that prevent us from modularizing the different components
10
+ # of the library so to make them easier to test and to maintain.
11
+ #
12
+ # How could them be used after the next major release:
13
+ #
14
+ # >>> from openfisca_core import module
15
+ # >>> module.symbol()
16
+ #
17
+ # And for classes:
18
+ #
19
+ # >>> from openfisca_core.module import Symbol
20
+ # >>> Symbol()
21
+ #
22
+ # See: https://www.python.org/dev/peps/pep-0008/#imports
23
+
24
+ from openfisca_core.projectors import (
25
+ EntityToPersonProjector,
26
+ FirstPersonToEntityProjector,
27
+ Projector,
28
+ UniqueRoleToEntityProjector,
29
+ )
30
+ from openfisca_core.projectors.helpers import get_projector_from_shortcut, projectable
31
+
32
+ from . import types
33
+ from ._core_population import CorePopulation
34
+ from ._errors import (
35
+ IncompatibleOptionsError,
36
+ InvalidArraySizeError,
37
+ InvalidOptionError,
38
+ PeriodValidityError,
39
+ )
40
+ from .group_population import GroupPopulation
41
+ from .population import Population
42
+
43
+ ADD, DIVIDE = types.Option
44
+ SinglePopulation = Population
45
+
46
+ __all__ = [
47
+ "ADD",
48
+ "DIVIDE",
49
+ "CorePopulation",
50
+ "EntityToPersonProjector",
51
+ "FirstPersonToEntityProjector",
52
+ "GroupPopulation",
53
+ "IncompatibleOptionsError",
54
+ "InvalidArraySizeError",
55
+ "InvalidOptionError",
56
+ "PeriodValidityError",
57
+ "Population",
58
+ "Projector",
59
+ "SinglePopulation",
60
+ "UniqueRoleToEntityProjector",
61
+ "get_projector_from_shortcut",
62
+ "projectable",
63
+ "types",
64
+ ]