revised_holidays 9.0.0

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 (382) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +25 -0
  3. data/CHANGELOG.md +446 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +21 -0
  7. data/Makefile +45 -0
  8. data/README.md +337 -0
  9. data/Rakefile +109 -0
  10. data/bin/console +7 -0
  11. data/bin/setup +6 -0
  12. data/definitions/.github/workflows/ruby.yml +25 -0
  13. data/definitions/.gitignore +5 -0
  14. data/definitions/CHANGELOG.md +352 -0
  15. data/definitions/Gemfile +6 -0
  16. data/definitions/LICENSE +21 -0
  17. data/definitions/METHODS.yml +26 -0
  18. data/definitions/Makefile +9 -0
  19. data/definitions/README.md +22 -0
  20. data/definitions/ar.yaml +268 -0
  21. data/definitions/at.yaml +116 -0
  22. data/definitions/au.yaml +907 -0
  23. data/definitions/be_fr.yaml +153 -0
  24. data/definitions/be_nl.yaml +153 -0
  25. data/definitions/bg.yaml +186 -0
  26. data/definitions/br.yaml +178 -0
  27. data/definitions/ca.yaml +969 -0
  28. data/definitions/ch.yaml +277 -0
  29. data/definitions/cl.yaml +294 -0
  30. data/definitions/co.yaml +437 -0
  31. data/definitions/cr.yaml +100 -0
  32. data/definitions/cz.yaml +137 -0
  33. data/definitions/de.yaml +401 -0
  34. data/definitions/dk.yaml +220 -0
  35. data/definitions/doc/CONTRIBUTING.md +44 -0
  36. data/definitions/doc/MAINTAINERS.md +39 -0
  37. data/definitions/doc/SYNTAX.md +435 -0
  38. data/definitions/doc/architecture/README.md +15 -0
  39. data/definitions/doc/architecture/adr-001.md +86 -0
  40. data/definitions/doc/architecture/adr-002.md +64 -0
  41. data/definitions/ecbtarget.yaml +74 -0
  42. data/definitions/ee.yaml +123 -0
  43. data/definitions/es.yaml +495 -0
  44. data/definitions/federalreserve.yaml +389 -0
  45. data/definitions/federalreservebanks.yaml +821 -0
  46. data/definitions/fedex.yaml +102 -0
  47. data/definitions/fi.yaml +234 -0
  48. data/definitions/fr.yaml +157 -0
  49. data/definitions/gb.yaml +565 -0
  50. data/definitions/ge.yaml +158 -0
  51. data/definitions/gr.yaml +158 -0
  52. data/definitions/hk.yaml +287 -0
  53. data/definitions/hr.yaml +171 -0
  54. data/definitions/hu.yaml +156 -0
  55. data/definitions/ie.yaml +172 -0
  56. data/definitions/index.yaml +80 -0
  57. data/definitions/is.yaml +247 -0
  58. data/definitions/it.yaml +246 -0
  59. data/definitions/jp.yaml +761 -0
  60. data/definitions/ke.yaml +107 -0
  61. data/definitions/kr.yaml +166 -0
  62. data/definitions/kz.yaml +128 -0
  63. data/definitions/li.yaml +154 -0
  64. data/definitions/lib/validation/custom_method_validator.rb +38 -0
  65. data/definitions/lib/validation/definition_validator.rb +35 -0
  66. data/definitions/lib/validation/error.rb +11 -0
  67. data/definitions/lib/validation/month_validator.rb +58 -0
  68. data/definitions/lib/validation/run.rb +66 -0
  69. data/definitions/lib/validation/test_validator.rb +83 -0
  70. data/definitions/lt.yaml +198 -0
  71. data/definitions/lu.yaml +123 -0
  72. data/definitions/lv.yaml +229 -0
  73. data/definitions/ma.yaml +96 -0
  74. data/definitions/mt_en.yaml +131 -0
  75. data/definitions/mt_mt.yaml +131 -0
  76. data/definitions/mx.yaml +160 -0
  77. data/definitions/my.yaml +79 -0
  78. data/definitions/nerc.yaml +94 -0
  79. data/definitions/ng.yaml +97 -0
  80. data/definitions/nl.yaml +127 -0
  81. data/definitions/no.yaml +169 -0
  82. data/definitions/northamericainformal.yaml +105 -0
  83. data/definitions/nyse.yaml +137 -0
  84. data/definitions/nz.yaml +346 -0
  85. data/definitions/pe.yaml +208 -0
  86. data/definitions/ph.yaml +130 -0
  87. data/definitions/pl.yaml +796 -0
  88. data/definitions/pt.yaml +187 -0
  89. data/definitions/ro.yaml +240 -0
  90. data/definitions/rs_cyrl.yaml +129 -0
  91. data/definitions/rs_la.yaml +129 -0
  92. data/definitions/ru.yaml +108 -0
  93. data/definitions/se.yaml +238 -0
  94. data/definitions/sg.yaml +89 -0
  95. data/definitions/si.yaml +162 -0
  96. data/definitions/sk.yaml +154 -0
  97. data/definitions/spec/coverage_report.rb +7 -0
  98. data/definitions/spec/data/invalid/months/malformed/bad.yaml +15 -0
  99. data/definitions/spec/data/invalid/months/missing/no_months.yaml +9 -0
  100. data/definitions/spec/data/valid/simple.yaml +15 -0
  101. data/definitions/spec/spec_helper.rb +7 -0
  102. data/definitions/spec/validation/custom_method_validator_spec.rb +60 -0
  103. data/definitions/spec/validation/definition_validator_spec.rb +43 -0
  104. data/definitions/spec/validation/month_validator_spec.rb +175 -0
  105. data/definitions/spec/validation/test_validator_spec.rb +169 -0
  106. data/definitions/th.yaml +111 -0
  107. data/definitions/tn.yaml +83 -0
  108. data/definitions/tr.yaml +174 -0
  109. data/definitions/ua.yaml +161 -0
  110. data/definitions/unitednations.yaml +189 -0
  111. data/definitions/ups.yaml +102 -0
  112. data/definitions/us.yaml +965 -0
  113. data/definitions/ve.yaml +118 -0
  114. data/definitions/vi.yaml +54 -0
  115. data/definitions/za.yaml +139 -0
  116. data/doc/CONTRIBUTING.md +72 -0
  117. data/doc/MAINTAINERS.md +81 -0
  118. data/doc/REFERENCES +19 -0
  119. data/lib/generated_definitions/MANIFEST +83 -0
  120. data/lib/generated_definitions/REGIONS.rb +6 -0
  121. data/lib/generated_definitions/ar.rb +60 -0
  122. data/lib/generated_definitions/at.rb +37 -0
  123. data/lib/generated_definitions/au.rb +177 -0
  124. data/lib/generated_definitions/be.rb +42 -0
  125. data/lib/generated_definitions/be_fr.rb +36 -0
  126. data/lib/generated_definitions/be_nl.rb +36 -0
  127. data/lib/generated_definitions/bg.rb +53 -0
  128. data/lib/generated_definitions/br.rb +37 -0
  129. data/lib/generated_definitions/ca.rb +88 -0
  130. data/lib/generated_definitions/ch.rb +95 -0
  131. data/lib/generated_definitions/cl.rb +71 -0
  132. data/lib/generated_definitions/co.rb +121 -0
  133. data/lib/generated_definitions/cr.rb +35 -0
  134. data/lib/generated_definitions/cz.rb +37 -0
  135. data/lib/generated_definitions/de.rb +65 -0
  136. data/lib/generated_definitions/dk.rb +48 -0
  137. data/lib/generated_definitions/ecbtarget.rb +30 -0
  138. data/lib/generated_definitions/ee.rb +36 -0
  139. data/lib/generated_definitions/el.rb +38 -0
  140. data/lib/generated_definitions/es.rb +56 -0
  141. data/lib/generated_definitions/europe.rb +638 -0
  142. data/lib/generated_definitions/federalreserve.rb +35 -0
  143. data/lib/generated_definitions/federalreservebanks.rb +35 -0
  144. data/lib/generated_definitions/fedex.rb +36 -0
  145. data/lib/generated_definitions/fi.rb +61 -0
  146. data/lib/generated_definitions/fr.rb +39 -0
  147. data/lib/generated_definitions/gb.rb +51 -0
  148. data/lib/generated_definitions/ge.rb +41 -0
  149. data/lib/generated_definitions/gr.rb +38 -0
  150. data/lib/generated_definitions/hk.rb +106 -0
  151. data/lib/generated_definitions/hr.rb +40 -0
  152. data/lib/generated_definitions/hu.rb +35 -0
  153. data/lib/generated_definitions/ie.rb +33 -0
  154. data/lib/generated_definitions/is.rb +60 -0
  155. data/lib/generated_definitions/it.rb +45 -0
  156. data/lib/generated_definitions/jp.rb +166 -0
  157. data/lib/generated_definitions/ke.rb +34 -0
  158. data/lib/generated_definitions/kr.rb +40 -0
  159. data/lib/generated_definitions/kz.rb +38 -0
  160. data/lib/generated_definitions/li.rb +44 -0
  161. data/lib/generated_definitions/lt.rb +38 -0
  162. data/lib/generated_definitions/lu.rb +35 -0
  163. data/lib/generated_definitions/lv.rb +56 -0
  164. data/lib/generated_definitions/ma.rb +33 -0
  165. data/lib/generated_definitions/mt_en.rb +38 -0
  166. data/lib/generated_definitions/mt_mt.rb +38 -0
  167. data/lib/generated_definitions/mx.rb +54 -0
  168. data/lib/generated_definitions/my.rb +30 -0
  169. data/lib/generated_definitions/nerc.rb +30 -0
  170. data/lib/generated_definitions/ng.rb +33 -0
  171. data/lib/generated_definitions/nl.rb +37 -0
  172. data/lib/generated_definitions/no.rb +40 -0
  173. data/lib/generated_definitions/northamerica.rb +229 -0
  174. data/lib/generated_definitions/nyse.rb +34 -0
  175. data/lib/generated_definitions/nz.rb +105 -0
  176. data/lib/generated_definitions/pe.rb +43 -0
  177. data/lib/generated_definitions/ph.rb +50 -0
  178. data/lib/generated_definitions/pl.rb +73 -0
  179. data/lib/generated_definitions/pt.rb +40 -0
  180. data/lib/generated_definitions/ro.rb +39 -0
  181. data/lib/generated_definitions/rs_cyrl.rb +39 -0
  182. data/lib/generated_definitions/rs_la.rb +39 -0
  183. data/lib/generated_definitions/ru.rb +37 -0
  184. data/lib/generated_definitions/scandinavia.rb +166 -0
  185. data/lib/generated_definitions/se.rb +53 -0
  186. data/lib/generated_definitions/sg.rb +31 -0
  187. data/lib/generated_definitions/si.rb +39 -0
  188. data/lib/generated_definitions/sk.rb +39 -0
  189. data/lib/generated_definitions/southamerica.rb +248 -0
  190. data/lib/generated_definitions/th.rb +36 -0
  191. data/lib/generated_definitions/tn.rb +32 -0
  192. data/lib/generated_definitions/tr.rb +64 -0
  193. data/lib/generated_definitions/ua.rb +37 -0
  194. data/lib/generated_definitions/unitednations.rb +81 -0
  195. data/lib/generated_definitions/ups.rb +36 -0
  196. data/lib/generated_definitions/us.rb +153 -0
  197. data/lib/generated_definitions/ve.rb +36 -0
  198. data/lib/generated_definitions/vi.rb +29 -0
  199. data/lib/generated_definitions/za.rb +36 -0
  200. data/lib/holidays/core_extensions/date.rb +57 -0
  201. data/lib/holidays/core_extensions/time.rb +23 -0
  202. data/lib/holidays/date_calculator/day_of_month.rb +68 -0
  203. data/lib/holidays/date_calculator/easter.rb +91 -0
  204. data/lib/holidays/date_calculator/lunar_date.rb +371 -0
  205. data/lib/holidays/date_calculator/weekend_modifier.rb +80 -0
  206. data/lib/holidays/definition/context/function_processor.rb +91 -0
  207. data/lib/holidays/definition/context/generator.rb +209 -0
  208. data/lib/holidays/definition/context/load.rb +29 -0
  209. data/lib/holidays/definition/context/merger.rb +22 -0
  210. data/lib/holidays/definition/decorator/custom_method_proc.rb +28 -0
  211. data/lib/holidays/definition/decorator/custom_method_source.rb +30 -0
  212. data/lib/holidays/definition/decorator/test.rb +37 -0
  213. data/lib/holidays/definition/entity/custom_method.rb +11 -0
  214. data/lib/holidays/definition/entity/test.rb +11 -0
  215. data/lib/holidays/definition/generator/module.rb +54 -0
  216. data/lib/holidays/definition/generator/regions.rb +55 -0
  217. data/lib/holidays/definition/generator/test.rb +51 -0
  218. data/lib/holidays/definition/parser/custom_method.rb +67 -0
  219. data/lib/holidays/definition/parser/test.rb +86 -0
  220. data/lib/holidays/definition/repository/cache.rb +47 -0
  221. data/lib/holidays/definition/repository/custom_methods.rb +27 -0
  222. data/lib/holidays/definition/repository/holidays_by_month.rb +57 -0
  223. data/lib/holidays/definition/repository/proc_result_cache.rb +51 -0
  224. data/lib/holidays/definition/repository/regions.rb +46 -0
  225. data/lib/holidays/definition/validator/custom_method.rb +31 -0
  226. data/lib/holidays/definition/validator/region.rb +36 -0
  227. data/lib/holidays/definition/validator/test.rb +71 -0
  228. data/lib/holidays/errors.rb +11 -0
  229. data/lib/holidays/factory/date_calculator.rb +42 -0
  230. data/lib/holidays/factory/definition.rb +143 -0
  231. data/lib/holidays/factory/finder.rb +70 -0
  232. data/lib/holidays/finder/context/between.rb +45 -0
  233. data/lib/holidays/finder/context/dates_driver_builder.rb +64 -0
  234. data/lib/holidays/finder/context/next_holiday.rb +57 -0
  235. data/lib/holidays/finder/context/parse_options.rb +104 -0
  236. data/lib/holidays/finder/context/search.rb +111 -0
  237. data/lib/holidays/finder/context/year_holiday.rb +57 -0
  238. data/lib/holidays/finder/rules/in_region.rb +31 -0
  239. data/lib/holidays/finder/rules/year_range.rb +58 -0
  240. data/lib/holidays/load_all_definitions.rb +56 -0
  241. data/lib/holidays/version.rb +3 -0
  242. data/lib/holidays.rb +130 -0
  243. data/lib/revised_holidays.rb +1 -0
  244. data/revised_holidays.gemspec +31 -0
  245. data/test/coverage_report.rb +26 -0
  246. data/test/data/test_custom_govt_holiday_defs.yaml +5 -0
  247. data/test/data/test_custom_informal_holidays_defs.yaml +11 -0
  248. data/test/data/test_custom_year_range_holiday_defs.yaml +31 -0
  249. data/test/data/test_invalid_region.rb +15 -0
  250. data/test/data/test_multiple_custom_holiday_defs.yaml +12 -0
  251. data/test/data/test_multiple_regions_with_conflicts_region_1.yaml +38 -0
  252. data/test/data/test_multiple_regions_with_conflicts_region_2.yaml +38 -0
  253. data/test/data/test_region.rb +15 -0
  254. data/test/data/test_single_custom_holiday_defs.yaml +12 -0
  255. data/test/data/test_single_custom_holiday_with_custom_procs.yaml +28 -0
  256. data/test/defs/test_defs_ar.rb +69 -0
  257. data/test/defs/test_defs_at.rb +31 -0
  258. data/test/defs/test_defs_au.rb +233 -0
  259. data/test/defs/test_defs_be_fr.rb +45 -0
  260. data/test/defs/test_defs_be_nl.rb +45 -0
  261. data/test/defs/test_defs_bg.rb +41 -0
  262. data/test/defs/test_defs_br.rb +49 -0
  263. data/test/defs/test_defs_ca.rb +289 -0
  264. data/test/defs/test_defs_ch.rb +51 -0
  265. data/test/defs/test_defs_cl.rb +69 -0
  266. data/test/defs/test_defs_co.rb +113 -0
  267. data/test/defs/test_defs_cr.rb +29 -0
  268. data/test/defs/test_defs_cz.rb +37 -0
  269. data/test/defs/test_defs_de.rb +89 -0
  270. data/test/defs/test_defs_dk.rb +47 -0
  271. data/test/defs/test_defs_ecbtarget.rb +27 -0
  272. data/test/defs/test_defs_ee.rb +41 -0
  273. data/test/defs/test_defs_es.rb +137 -0
  274. data/test/defs/test_defs_europe.rb +1522 -0
  275. data/test/defs/test_defs_fed_ex.rb +24 -0
  276. data/test/defs/test_defs_federalreserve.rb +119 -0
  277. data/test/defs/test_defs_federalreservebanks.rb +251 -0
  278. data/test/defs/test_defs_fedex.rb +31 -0
  279. data/test/defs/test_defs_fi.rb +59 -0
  280. data/test/defs/test_defs_fr.rb +43 -0
  281. data/test/defs/test_defs_gb.rb +159 -0
  282. data/test/defs/test_defs_ge.rb +53 -0
  283. data/test/defs/test_defs_gr.rb +41 -0
  284. data/test/defs/test_defs_hk.rb +59 -0
  285. data/test/defs/test_defs_hr.rb +45 -0
  286. data/test/defs/test_defs_hu.rb +47 -0
  287. data/test/defs/test_defs_ie.rb +53 -0
  288. data/test/defs/test_defs_is.rb +51 -0
  289. data/test/defs/test_defs_it.rb +55 -0
  290. data/test/defs/test_defs_jp.rb +159 -0
  291. data/test/defs/test_defs_ke.rb +31 -0
  292. data/test/defs/test_defs_kr.rb +37 -0
  293. data/test/defs/test_defs_kz.rb +39 -0
  294. data/test/defs/test_defs_li.rb +35 -0
  295. data/test/defs/test_defs_lt.rb +65 -0
  296. data/test/defs/test_defs_lu.rb +35 -0
  297. data/test/defs/test_defs_lv.rb +98 -0
  298. data/test/defs/test_defs_ma.rb +29 -0
  299. data/test/defs/test_defs_mt_en.rb +41 -0
  300. data/test/defs/test_defs_mt_mt.rb +41 -0
  301. data/test/defs/test_defs_mx.rb +49 -0
  302. data/test/defs/test_defs_my.rb +23 -0
  303. data/test/defs/test_defs_nerc.rb +29 -0
  304. data/test/defs/test_defs_ng.rb +29 -0
  305. data/test/defs/test_defs_nl.rb +33 -0
  306. data/test/defs/test_defs_no.rb +43 -0
  307. data/test/defs/test_defs_northamerica.rb +667 -0
  308. data/test/defs/test_defs_nyse.rb +46 -0
  309. data/test/defs/test_defs_nz.rb +67 -0
  310. data/test/defs/test_defs_pe.rb +47 -0
  311. data/test/defs/test_defs_ph.rb +29 -0
  312. data/test/defs/test_defs_pl.rb +229 -0
  313. data/test/defs/test_defs_pt.rb +47 -0
  314. data/test/defs/test_defs_ro.rb +65 -0
  315. data/test/defs/test_defs_rs_cyrl.rb +46 -0
  316. data/test/defs/test_defs_rs_la.rb +46 -0
  317. data/test/defs/test_defs_ru.rb +34 -0
  318. data/test/defs/test_defs_scandinavia.rb +215 -0
  319. data/test/defs/test_defs_se.rb +59 -0
  320. data/test/defs/test_defs_sg.rb +25 -0
  321. data/test/defs/test_defs_si.rb +105 -0
  322. data/test/defs/test_defs_sk.rb +41 -0
  323. data/test/defs/test_defs_southamerica.rb +327 -0
  324. data/test/defs/test_defs_th.rb +33 -0
  325. data/test/defs/test_defs_tn.rb +27 -0
  326. data/test/defs/test_defs_tr.rb +60 -0
  327. data/test/defs/test_defs_ua.rb +41 -0
  328. data/test/defs/test_defs_unitednations.rb +11 -0
  329. data/test/defs/test_defs_ups.rb +31 -0
  330. data/test/defs/test_defs_us.rb +387 -0
  331. data/test/defs/test_defs_ve.rb +35 -0
  332. data/test/defs/test_defs_vi.rb +22 -0
  333. data/test/defs/test_defs_za.rb +35 -0
  334. data/test/holidays/core_extensions/test_date.rb +122 -0
  335. data/test/holidays/core_extensions/test_date_time.rb +60 -0
  336. data/test/holidays/date_calculator/test_day_of_month.rb +27 -0
  337. data/test/holidays/date_calculator/test_easter_gregorian.rb +30 -0
  338. data/test/holidays/date_calculator/test_easter_julian.rb +36 -0
  339. data/test/holidays/date_calculator/test_lunar_date.rb +89 -0
  340. data/test/holidays/date_calculator/test_weekend_modifier.rb +54 -0
  341. data/test/holidays/definition/context/test_function_processor.rb +199 -0
  342. data/test/holidays/definition/context/test_generator.rb +226 -0
  343. data/test/holidays/definition/context/test_load.rb +37 -0
  344. data/test/holidays/definition/context/test_merger.rb +25 -0
  345. data/test/holidays/definition/decorator/test_custom_method_proc.rb +113 -0
  346. data/test/holidays/definition/decorator/test_custom_method_source.rb +96 -0
  347. data/test/holidays/definition/decorator/test_test.rb +123 -0
  348. data/test/holidays/definition/generator/test_module.rb +268 -0
  349. data/test/holidays/definition/generator/test_regions.rb +97 -0
  350. data/test/holidays/definition/generator/test_test.rb +113 -0
  351. data/test/holidays/definition/parser/test_custom_method.rb +79 -0
  352. data/test/holidays/definition/parser/test_test.rb +142 -0
  353. data/test/holidays/definition/repository/test_cache.rb +123 -0
  354. data/test/holidays/definition/repository/test_custom_methods.rb +43 -0
  355. data/test/holidays/definition/repository/test_holidays_by_month.rb +275 -0
  356. data/test/holidays/definition/repository/test_proc_result_cache.rb +91 -0
  357. data/test/holidays/definition/repository/test_regions.rb +104 -0
  358. data/test/holidays/definition/validator/test_custom_method.rb +94 -0
  359. data/test/holidays/definition/validator/test_region.rb +54 -0
  360. data/test/holidays/definition/validator/test_test.rb +60 -0
  361. data/test/holidays/finder/context/test_between.rb +172 -0
  362. data/test/holidays/finder/context/test_dates_driver_builder.rb +91 -0
  363. data/test/holidays/finder/context/test_next_holiday.rb +156 -0
  364. data/test/holidays/finder/context/test_parse_options.rb +141 -0
  365. data/test/holidays/finder/context/test_search.rb +232 -0
  366. data/test/holidays/finder/context/test_year_holiday.rb +202 -0
  367. data/test/holidays/finder/rules/test_in_region.rb +42 -0
  368. data/test/holidays/finder/rules/test_year_range.rb +166 -0
  369. data/test/integration/README.md +9 -0
  370. data/test/integration/test_all_regions.rb +49 -0
  371. data/test/integration/test_any_holidays_during_work_week.rb +90 -0
  372. data/test/integration/test_available_regions.rb +23 -0
  373. data/test/integration/test_custom_holidays.rb +41 -0
  374. data/test/integration/test_custom_informal_holidays.rb +15 -0
  375. data/test/integration/test_custom_year_range_holidays.rb +35 -0
  376. data/test/integration/test_holidays.rb +243 -0
  377. data/test/integration/test_holidays_between.rb +87 -0
  378. data/test/integration/test_multiple_regions.rb +71 -0
  379. data/test/integration/test_multiple_regions_with_conflict.rb +29 -0
  380. data/test/integration/test_nonstandard_regions.rb +25 -0
  381. data/test/test_helper.rb +37 -0
  382. metadata +649 -0
data/README.md ADDED
@@ -0,0 +1,337 @@
1
+ # Ruby Holidays Gem [![Build Status](https://github.com/holidays/holidays/actions/workflows/ruby.yml/badge.svg)](https://github.com/holidays/holidays/actions/workflows/ruby.yml)
2
+
3
+ Functionality to deal with holidays in Ruby.
4
+
5
+ Extends Ruby's built-in Date and Time classes and supports custom holiday definition lists.
6
+
7
+ ## Installation
8
+
9
+ ```
10
+ gem install holidays
11
+ ```
12
+
13
+ ## Tested versions
14
+
15
+ This gem is tested with the following ruby versions:
16
+
17
+ * 2.4.5
18
+ * 2.5.3
19
+ * 2.6.1
20
+ * 2.7.7
21
+ * 3.0.6
22
+ * 3.1.4
23
+ * 3.2.2
24
+ * 3.3.0
25
+ * JRuby 9.2.21.0
26
+ * JRuby 9.4.2.0
27
+
28
+ ## Semver
29
+
30
+ This gem follows [semantic versioning](http://semver.org/). The guarantee specifically covers:
31
+
32
+ * methods in the top-most `Holidays` namespace e.g. `Holidays.<method>`
33
+ * the [core extensions](#extending-rubys-date-and-time-classes)
34
+
35
+ Please note that we consider definition changes to be 'minor' bumps, meaning they are backwards compatible with your code but might give different holiday results!
36
+
37
+ ## Time zones
38
+
39
+ Time zones are ignored. This library assumes that all dates are within the same time zone.
40
+
41
+ ## Usage
42
+
43
+ This gem offers multiple ways to check for holidays for a variety of scenarios.
44
+
45
+ #### Checking a specific date
46
+
47
+ Get all holidays on April 25, 2008 in Australia:
48
+
49
+ ```ruby
50
+ Holidays.on(Date.new(2008, 4, 25), :au)
51
+ => [{:name => 'ANZAC Day',...}]
52
+ ```
53
+
54
+ You can check multiple regions in a single call:
55
+
56
+ ```ruby
57
+ Holidays.on(Date.new(2008, 1, 1), :us, :fr)
58
+ => [{:name=>"New Year's Day", :regions=>[:us],...},
59
+ {:name=>"Jour de l'an", :regions=>[:fr],...}]
60
+ ```
61
+
62
+ You can leave off 'regions' to get holidays for any region in our [definitions](https://github.com/holidays/definitions):
63
+
64
+ ```ruby
65
+ Holidays.on(Date.new(2007, 4, 25))
66
+ => [{:name=>"ANZAC Day", :regions=>[:au],...},
67
+ {:name=>"Festa della Liberazione", :regions=>[:it],...},
68
+ {:name=>"Dia da Liberdade", :regions=>[:pt],...}
69
+ ...
70
+ ]
71
+ ```
72
+
73
+ #### Checking a date range
74
+
75
+ Get all holidays during the month of July 2008 in Canada and the US:
76
+
77
+ ```ruby
78
+ from = Date.new(2008,7,1)
79
+ to = Date.new(2008,7,31)
80
+
81
+ Holidays.between(from, to, :ca, :us)
82
+ => [{:name => 'Canada Day',...}
83
+ {:name => 'Independence Day',...}]
84
+ ```
85
+
86
+ #### Check for 'informal' holidays
87
+
88
+ You can pass the 'informal' flag to include holidays specified as informal in your results. See [here](https://github.com/holidays/definitions/blob/master/doc/SYNTAX.md#formalinformal) for information on what constitutes 'informal' vs 'formal'.
89
+
90
+ By default this flag is turned off, meaning no informal holidays will be returned.
91
+
92
+ Get Valentine's Day in the US:
93
+
94
+ ```ruby
95
+ Holidays.on(Date.new(2018, 2, 14), :us, :informal)
96
+ => [{:name=>"Valentine's Day",...}]
97
+ ```
98
+
99
+ Leaving off 'informal' will mean that Valentine's Day is not returned:
100
+
101
+ ```ruby
102
+ Holidays.on(Date.new(2018, 2, 14), :us)
103
+ => []
104
+ ```
105
+
106
+ Get informal holidays during the month of February 2008 for any region:
107
+
108
+ ```ruby
109
+ from = Date.new(2008,2,1)
110
+ to = Date.new(2008,2,15)
111
+
112
+ Holidays.between(from, to, :informal)
113
+ => [{:name => 'Valentine\'s Day',...}]
114
+ ```
115
+
116
+ #### Check for 'observed' holidays
117
+
118
+ You can pass the 'observed' flag to include holidays that are observed on different days than they actually occur. See [here](https://github.com/holidays/definitions/blob/master/doc/SYNTAX.md#observed) for further explanation of 'observed'.
119
+
120
+ By default this flag is turned off, meaning no observed logic will be applied.
121
+
122
+ Get holidays that are observed on Monday July 2, 2007 in British Columbia, Canada:
123
+
124
+ ```ruby
125
+ Holidays.on(Date.new(2007, 7, 2), :ca_bc, :observed)
126
+ => [{:name => 'Canada Day',...}]
127
+ ```
128
+
129
+ Leaving off the 'observed' flag will mean that 'Canada Day' is not returned since it actually falls on Sunday July 1:
130
+
131
+ ```ruby
132
+ Holidays.on(Date.new(2007, 7, 2), :ca_bc)
133
+ => []
134
+
135
+ Holidays.on(Date.new(2007, 7, 1), :ca_bc)
136
+ => [{:name=>"Canada Day", :regions=>[:ca],...}]
137
+ ```
138
+
139
+ Get all observed US Federal holidays between 2018 and 2019:
140
+
141
+ ```ruby
142
+ from = Date.new(2018,1,1)
143
+ to = Date.new(2019,12,31)
144
+
145
+ Holidays.between(from, to, :federalreserve, :observed)
146
+ => [{:name => "New Year's Day"....}
147
+ {:name => "Birthday of Martin Luther King, Jr"....}]
148
+ ```
149
+
150
+ #### Check whether any holidays occur during work week
151
+
152
+ Check if there are any holidays taking place during a specified work week. 'Work week' is defined as the period of Monday through Friday of the week specified by the date.
153
+
154
+ Check whether a holiday falls during first week of the year for any region:
155
+
156
+ ```ruby
157
+ Holidays.any_holidays_during_work_week?(Date.new(2016, 1, 1))
158
+ => true
159
+ ```
160
+
161
+ You can also pass in `informal` or `observed`:
162
+
163
+ ```ruby
164
+ # Returns true since Valentine's Day falls on a Wednesday
165
+ Holidays.any_holidays_during_work_week?(Date.new(2018, 2, 14), :us, :informal)
166
+ => true
167
+
168
+ # Returns false if you don't specify informal
169
+ Holidays.any_holidays_during_work_week?(Date.new(2018, 2, 14), :us)
170
+ => false
171
+
172
+ # Returns true since Veteran's Day is observed on Monday November 12, 2018
173
+ Holidays.any_holidays_during_work_week?(Date.new(2018, 11, 12), :us, :observed)
174
+ => true
175
+
176
+ # Returns false if you don't specify observed since the actual holiday is on Sunday November 11th 2018
177
+ Holidays.any_holidays_during_work_week?(Date.new(2018, 11, 12), :us)
178
+ => false
179
+ ```
180
+
181
+ #### Find the next holiday(s) that will occur from a specific date
182
+
183
+ Get the next holidays occurring from February 23, 2016 for the US:
184
+
185
+ ```ruby
186
+ Holidays.next_holidays(3, [:us, :informal], Date.new(2016, 2, 23))
187
+ => [{:name => "St. Patrick's Day",...}, {:name => "Good Friday",...}, {:name => "Easter Sunday",...}]
188
+ ```
189
+
190
+ You can specify the number of holidays to return. This method will default to `Date.today` if no date is provided.
191
+
192
+ #### Find all holidays occurring starting from a specific date to the end of the year
193
+
194
+ Get all holidays starting from February 23, 2016 to end of year in the US:
195
+
196
+ ```ruby
197
+ Holidays.year_holidays([:ca_on], Date.new(2016, 2, 23))
198
+ => [{:name=>"Good Friday",...},
199
+ {:name=>"Easter Sunday",...},
200
+ {:name=>"Victoria Day",...},
201
+ {:name=>"Canada Day",...},
202
+ {:name=>"Civic Holiday",...},
203
+ {:name=>"Labour Day",...},
204
+ {:name=>"Thanksgiving",...},
205
+ {:name=>"Remembrance Day",...},
206
+ {:name=>"Christmas Day",...},
207
+ {:name=>"Boxing Day",...}]
208
+ ```
209
+
210
+ This method will default to `Date.today` if no date is provided.
211
+
212
+ #### Return all available regions
213
+
214
+ Return all available regions:
215
+
216
+ ```ruby
217
+ Holidays.available_regions
218
+ => [:ar, :at, ..., :sg] # this will be a big array
219
+ ```
220
+
221
+ ## Loading Custom Definitions on the fly
222
+
223
+ In addition to the [provided definitions](https://github.com/holidays/definitions) you can load custom definitions file on the fly and use them immediately.
224
+
225
+ To load custom 'Company Founding' holiday on June 1st:
226
+
227
+ ```ruby
228
+ Holidays.load_custom('/home/user/holiday_definitions/custom_holidays.yaml')
229
+ Holidays.on(Date.new(2013, 6, 1), :my_custom_region)
230
+ => [{:name => 'Company Founding',...}]
231
+ ```
232
+
233
+ Custom definition files must match the [syntax of the existing definition files](https://github.com/holidays/definitions/blob/master/doc/SYNTAX.md).
234
+
235
+ Multiple files can be loaded at the same time:
236
+
237
+ ```ruby
238
+ Holidays.load_custom(
239
+ '/home/user/holidays/custom_holidays1.yaml',
240
+ '/home/user/holidays/custom_holidays2.yaml'
241
+ )
242
+ ```
243
+
244
+ ## Extending Ruby's Date and Time classes
245
+
246
+ ### Date
247
+
248
+ To extend the 'Date' class:
249
+
250
+ ```ruby
251
+ require 'holidays/core_extensions/date'
252
+
253
+ class Date
254
+ include Holidays::CoreExtensions::Date
255
+ end
256
+ ```
257
+
258
+ Now you can check which holidays occur in Iceland on January 1, 2008:
259
+
260
+ ```ruby
261
+ d = Date.new(2008,7,1)
262
+
263
+ d.holidays(:is)
264
+ => [{:name => 'Nýársdagur'}...]
265
+ ```
266
+
267
+ Or lookup Canada Day in different regions:
268
+
269
+ ```ruby
270
+ d = Date.new(2008,7,1)
271
+
272
+ d.holiday?(:ca) # Canada
273
+ => true
274
+
275
+ d.holiday?(:ca_bc) # British Columbia, Canada
276
+ => true
277
+
278
+ d.holiday?(:fr) # France
279
+ => false
280
+ ```
281
+
282
+ Or return the new date based on the options:
283
+
284
+ ```ruby
285
+ d = Date.new(2008,7,1)
286
+ d.change(:year => 2016, :month => 1, :day => 1)
287
+ => #<Date: 2016-01-01 ((2457389j,0s,0n),+0s,2299161j)>
288
+ ```
289
+
290
+ Or you can calculate the day of the month:
291
+
292
+ ```ruby
293
+ Date.calculate_mday(2015, 4, :first, 2)
294
+ => 7
295
+ ```
296
+
297
+ ### Time
298
+
299
+ ```ruby
300
+ require 'holidays/core_extensions/time'
301
+
302
+ class Time
303
+ include Holidays::CoreExtensions::Time
304
+ end
305
+ ```
306
+
307
+ Find end of month for given date:
308
+
309
+ ```ruby
310
+ d = Date.new(2016,8,1)
311
+ d.end_of_month
312
+ => #<Date: 2016-08-31 ((2457632j,0s,0n),+0s,2299161j)>
313
+ ```
314
+
315
+ ## Caching Holiday Lookups
316
+
317
+ If you are checking holidays regularly you can cache your results for improved performance. Run this before looking up a holiday (e.g. in an initializer):
318
+
319
+ ```ruby
320
+ YEAR = 365 * 24 * 60 * 60
321
+ Holidays.cache_between(Time.now, Time.now + 2 * YEAR, :ca, :us, :observed)
322
+ ```
323
+
324
+ Holidays for the regions specified within the dates specified will be pre-calculated and stored in-memory. Future lookups will be much faster.
325
+
326
+ ## How to contribute
327
+
328
+ See our [contribution guidelines](doc/CONTRIBUTING.md) for information on how to help out!
329
+
330
+ ## Credits and code
331
+
332
+ * Started by [@alexdunae](http://github.com/alexdunae) 2007-2012
333
+ * Maintained by [@hahahana](https://github.com/hahahana), 2013
334
+ * Maintained by [@ppeble](https://github.com/ppeble), 2014-present
335
+ * Maintained by [@ttwo32](https://github.com/ttwo32), 2016-present
336
+
337
+ Plus all of these [wonderful contributors!](https://github.com/holidays/holidays/contributors)
data/Rakefile ADDED
@@ -0,0 +1,109 @@
1
+ $:.unshift File.expand_path('../lib', __FILE__)
2
+ $:.unshift File.expand_path('../test', __FILE__)
3
+
4
+ require 'bundler/gem_tasks'
5
+ require 'rake/testtask'
6
+ require 'yaml'
7
+ require 'fileutils'
8
+ require 'holidays'
9
+
10
+ DEFINITION_PATH = 'definitions'
11
+ DEFINITION_TESTS_PATH = 'test/defs'
12
+
13
+ Rake::TestTask.new(:test) do |t|
14
+ t.libs << 'test'
15
+ t.test_files = FileList['test/**/test_*.rb']
16
+ end
17
+
18
+ task :default => :test
19
+
20
+ desc "Run tests for only a single region. Do not provide sub regions. Example (without quotes): 'rake test_region jp'"
21
+ task :test_region do
22
+ # Magic to define empty tasks on the fly so we have nicer arguments, see http://cobwwweb.com/4-ways-to-pass-arguments-to-a-rake-task
23
+ ARGV.each { |a| task a.to_sym do ; end }
24
+
25
+ if ARGV[1].nil? || ARGV[1].empty?
26
+ raise ArgumentError.new("You must provide a region. Example (without quotes): 'rake test_region us'")
27
+ end
28
+
29
+ region = ARGV[1].downcase
30
+
31
+ unless Holidays.available_regions.include?(region.to_sym)
32
+ raise ArgumentError.new("Region '#{region}' not recognized")
33
+ end
34
+
35
+ unless File.file?("#{DEFINITION_TESTS_PATH}/test_defs_#{region}.rb")
36
+ raise ArgumentError.new("Test file not found for region '#{region}'. Do not use sub regions, try the overall region instead. Example: 'us' instead of 'us_dc'")
37
+ end
38
+
39
+ sh "bundle exec ruby #{DEFINITION_TESTS_PATH}/test_defs_#{region}.rb"
40
+ end
41
+
42
+ desc 'Launch IRB session'
43
+ task :console do
44
+ sh "irb -r rubygems -I lib -r holidays.rb"
45
+ end
46
+
47
+ desc 'Generate definitions and tests used in main holiday logic based on raw YAML definitions'
48
+ namespace :generate do
49
+ desc 'Generate the holiday definition files'
50
+ task :definitions do
51
+ # load the index
52
+ def_index = YAML.load_file("#{DEFINITION_PATH}/index.yaml")
53
+
54
+ # create a dir for the generated tests
55
+ FileUtils.mkdir_p(DEFINITION_TESTS_PATH)
56
+
57
+ #TODO This entire section should be moved into '/lib/holidays/definition'. I don't think such an
58
+ # important part of the gem should be left in the Rakefile and without unit tests. There's no
59
+ # reason we can't move it.
60
+ all_regions = {}
61
+
62
+ def_index['defs'].each do |region, files|
63
+ puts "Building #{region} definition module:"
64
+ files = files.collect { |f| "#{DEFINITION_PATH}/#{f}" }.uniq
65
+
66
+ regions, rules_by_month, custom_methods, tests = Holidays::Factory::Definition.file_parser.parse_definition_files(files)
67
+ module_src, test_src = Holidays::Factory::Definition.source_generator.generate_definition_source(region, files, regions, rules_by_month, custom_methods, tests)
68
+
69
+ File.open("lib/#{Holidays::DEFINITIONS_PATH}/#{region.downcase.to_s}.rb","w") do |file|
70
+ file.puts module_src
71
+ end
72
+ unless test_src.empty?
73
+ File.open("#{DEFINITION_TESTS_PATH}/test_defs_#{region.downcase.to_s}.rb","w") do |file|
74
+ file.puts test_src
75
+ end
76
+ end
77
+
78
+ all_regions[region.downcase.to_sym] = regions
79
+
80
+ puts "Done.\n\n"
81
+ end
82
+
83
+ puts "Building regions master file for later validation:"
84
+
85
+ File.open("lib/#{Holidays::DEFINITIONS_PATH}/REGIONS.rb","w") do |file|
86
+ file.puts Holidays::Factory::Definition.regions_generator.call(all_regions)
87
+ end
88
+
89
+ puts "Done.\n\n"
90
+ end
91
+
92
+ desc 'Build the definition manifest'
93
+ task :manifest do
94
+ File.open("lib/#{Holidays::DEFINITIONS_PATH}/MANIFEST","w") do |file|
95
+ #TODO Generating the file source should be done interally, in the /lib dir, not in the Rakefile
96
+ file.puts <<-EOH
97
+ ==== Regional definitions
98
+ The following definition files are included in this installation:
99
+
100
+ EOH
101
+ FileList.new("lib/#{Holidays::DEFINITIONS_PATH}/*.rb").exclude(/version/).each do |str|
102
+ file.puts('* ' + str.gsub(/^lib\/|\.rb$/, ''))
103
+ end
104
+ end
105
+ puts "Updated manifest file."
106
+ end
107
+ end
108
+
109
+ task :generate => ['generate:definitions', 'generate:manifest']
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "holidays"
5
+
6
+ require "irb"
7
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,6 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
@@ -0,0 +1,25 @@
1
+ name: Ruby
2
+ on:
3
+ push:
4
+ branches: [ "master" ]
5
+ pull_request:
6
+ branches: [ "master" ]
7
+ permissions:
8
+ contents: read
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby: ['2.4', '2.5', '2.6', '2.7', '3.0', '3.1', '3.2', '3.3', 'ruby-head']
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - name: Setup Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: ${{ matrix.ruby }}
21
+ bundler-cache: true
22
+ - name: Run tests
23
+ run: make test
24
+ - name: Run validate
25
+ run: make validate
@@ -0,0 +1,5 @@
1
+ .DS_Store
2
+ .ruby-version
3
+ coverage/
4
+ Gemfile.lock
5
+ tmp/