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/lib/holidays.rb ADDED
@@ -0,0 +1,130 @@
1
+ ## encoding: utf-8
2
+ $:.unshift File.dirname(__FILE__)
3
+
4
+ require 'date'
5
+ require 'digest/md5'
6
+ require 'holidays/factory/definition'
7
+ require 'holidays/factory/date_calculator'
8
+ require 'holidays/factory/finder'
9
+ require 'holidays/errors'
10
+ require 'holidays/load_all_definitions'
11
+
12
+ module Holidays
13
+ WEEKS = {:first => 1, :second => 2, :third => 3, :fourth => 4, :fifth => 5, :last => -1, :second_last => -2, :third_last => -3}
14
+ MONTH_LENGTHS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
15
+ DAY_SYMBOLS = Date::DAYNAMES.collect { |n| n.downcase.intern }
16
+
17
+ DEFINITIONS_PATH = 'generated_definitions'
18
+ FULL_DEFINITIONS_PATH = File.expand_path(File.dirname(__FILE__) + "/#{DEFINITIONS_PATH}")
19
+
20
+ class << self
21
+ def any_holidays_during_work_week?(date, *options)
22
+ monday = date - (date.wday - 1)
23
+ friday = date + (5 - date.wday)
24
+
25
+ holidays = between(monday, friday, *options)
26
+
27
+ holidays && holidays.count > 0
28
+ end
29
+
30
+ def on(date, *options)
31
+ between(date, date, *options)
32
+ end
33
+
34
+ def between(start_date, end_date, *options)
35
+ raise ArgumentError unless start_date && end_date
36
+
37
+ # remove the timezone
38
+ start_date = start_date.new_offset(0) + start_date.offset if start_date.respond_to?(:new_offset)
39
+ end_date = end_date.new_offset(0) + end_date.offset if end_date.respond_to?(:new_offset)
40
+
41
+ start_date, end_date = get_date(start_date), get_date(end_date)
42
+
43
+ raise ArgumentError if end_date < start_date
44
+
45
+ if cached_holidays = Factory::Definition.cache_repository.find(start_date, end_date, options)
46
+ return cached_holidays
47
+ end
48
+
49
+ Factory::Finder.between.call(start_date, end_date, options)
50
+ end
51
+
52
+ #FIXME All other methods start with a date and require a date. For the next
53
+ # major version bump we should take the opportunity to change this
54
+ # signature to match, e.g. next_holidays(from_date, count, options)
55
+ def next_holidays(holidays_count, options, from_date = Date.today)
56
+ raise ArgumentError unless holidays_count
57
+ raise ArgumentError if options.empty?
58
+ raise ArgumentError unless options.is_a?(Array)
59
+
60
+ # remove the timezone
61
+ from_date = from_date.new_offset(0) + from_date.offset if from_date.respond_to?(:new_offset)
62
+
63
+ from_date = get_date(from_date)
64
+
65
+ Factory::Finder.next_holiday.call(holidays_count, from_date, options)
66
+ end
67
+
68
+ #FIXME All other methods start with a date and require a date. For the next
69
+ # major version bump we should take the opportunity to change this
70
+ # signature to match, e.g. year_holidays(from_date, options)
71
+ def year_holidays(options, from_date = Date.today)
72
+ raise ArgumentError if options.empty?
73
+ raise ArgumentError unless options.is_a?(Array)
74
+
75
+ # remove the timezone
76
+ from_date = from_date.new_offset(0) + from_date.offset if from_date.respond_to?(:new_offset)
77
+ from_date = get_date(from_date)
78
+
79
+ Factory::Finder.year_holiday.call(from_date, options)
80
+ end
81
+
82
+ def cache_between(start_date, end_date, *options)
83
+ start_date, end_date = get_date(start_date), get_date(end_date)
84
+ cache_data = between(start_date, end_date, *options)
85
+
86
+ Factory::Definition.cache_repository.cache_between(start_date, end_date, cache_data, options)
87
+ end
88
+
89
+ def available_regions
90
+ Holidays::REGIONS
91
+ end
92
+
93
+ def load_custom(*files)
94
+ regions, rules_by_month, custom_methods, _ = Factory::Definition.file_parser.parse_definition_files(files)
95
+
96
+ custom_methods.each do |method_key, method_entity|
97
+ custom_methods[method_key] = Factory::Definition.custom_method_proc_decorator.call(method_entity)
98
+ end
99
+
100
+ Factory::Definition.merger.call(regions, rules_by_month, custom_methods)
101
+
102
+ rules_by_month
103
+ end
104
+
105
+ def load_all
106
+ path = FULL_DEFINITIONS_PATH + "/"
107
+
108
+ Dir.foreach(path) do |item|
109
+ next if item == '.' or item == '..'
110
+
111
+ target = path+item
112
+ next if File.extname(target) != '.rb'
113
+
114
+ require target
115
+ end
116
+ end
117
+
118
+ private
119
+
120
+ def get_date(date)
121
+ if date.respond_to?(:to_date)
122
+ date.to_date
123
+ else
124
+ Date.civil(date.year, date.mon, date.mday)
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ Holidays::LoadAllDefinitions.call
@@ -0,0 +1 @@
1
+ require 'holidays'
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'holidays/version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = 'revised_holidays'
9
+ gem.version = Holidays::VERSION
10
+ gem.authors = ['Alex Dunae', 'Phil Peble']
11
+ gem.email = ['holidaysgem@gmail.com']
12
+ gem.homepage = 'https://github.com/dabroz/holidays'
13
+ gem.description = %q(A collection of Ruby methods to deal with statutory and other holidays. You deserve a holiday!)
14
+ gem.summary = %q(A collection of Ruby methods to deal with statutory and other holidays.)
15
+ gem.metadata = {
16
+ 'changelog_uri' => "https://github.com/dabroz/holidays/blob/master/CHANGELOG.md",
17
+ 'source_code_uri' => 'https://github.com/dabroz/holidays',
18
+ 'bug_tracker_uri' => 'https://github.com/dabroz/holidays/issues'
19
+ }
20
+ gem.files = `git ls-files`.split("\n") - ['.gitignore', '.travis.yml']
21
+ gem.test_files = gem.files.grep(/^test/)
22
+ gem.require_paths = ['lib']
23
+ gem.licenses = ['MIT']
24
+ gem.required_ruby_version = '>= 2.4'
25
+ gem.add_development_dependency 'bundler', '~> 2'
26
+ gem.add_development_dependency 'rake', '~> 12'
27
+ gem.add_development_dependency 'simplecov', '~> 0.16'
28
+ gem.add_development_dependency 'test-unit', '~> 3'
29
+ gem.add_development_dependency 'mocha', '~> 1'
30
+ gem.add_development_dependency 'pry', '~> 0.12'
31
+ end
@@ -0,0 +1,26 @@
1
+ require 'simplecov'
2
+
3
+ # For reasons I don't understand jruby implementations report lower coverage
4
+ # than other ruby versions. Ruby 2.5.3, for instance, is at 92%.
5
+ #
6
+ # We set the floor based on jruby so that all automated tests pass on Travis CI.
7
+ SimpleCov.minimum_coverage 89
8
+
9
+ SimpleCov.add_filter [
10
+ # Apparently simplecov doesn't automatically filter 'spec' or 'test' so we
11
+ # have to do it manually.
12
+ 'test',
13
+
14
+ # Only filtered because I tend to not see value in testing factories.
15
+ 'lib/holidays/factory/',
16
+
17
+ # jruby coverage flips out here and doesn't count much of the large date
18
+ # arrays used by this class. This results in an extremely low reported
19
+ # coverage for this specific file but only in jruby, not other ruby versions.
20
+ # Since it obliterates coverage percentages I'll filter it until I can come
21
+ # up with a solution.
22
+ 'lib/holidays/date_calculator/lunar_date.rb',
23
+ ]
24
+
25
+ SimpleCov.coverage_dir 'reports/coverage'
26
+ SimpleCov.start
@@ -0,0 +1,5 @@
1
+ months:
2
+ 3:
3
+ - name: Yaaay Government Day
4
+ regions: [custom_multiple_files, custom_multiple_files_govt]
5
+ mday: 1
@@ -0,0 +1,11 @@
1
+ ---
2
+ months:
3
+ 1:
4
+ - name: informal day with type as string
5
+ regions: [custom_informal]
6
+ mday: 1
7
+ type: informal
8
+ - name: informal day with type as symbol
9
+ regions: [custom_informal]
10
+ mday: 5
11
+ type: :informal
@@ -0,0 +1,31 @@
1
+ months:
2
+ 6:
3
+ - name: after_year
4
+ regions: [custom_year_range_file]
5
+ mday: 1
6
+ year_ranges:
7
+ from: 2016
8
+ - name: before_year
9
+ regions: [custom_year_range_file]
10
+ mday: 2
11
+ year_ranges:
12
+ until: 2017
13
+ - name: between_year
14
+ regions: [custom_year_range_file]
15
+ mday: 3
16
+ year_ranges:
17
+ between:
18
+ start: 2016
19
+ end: 2018
20
+ - name: limited_year
21
+ regions: [custom_year_range_file]
22
+ mday: 4
23
+ year_ranges:
24
+ limited: [2016,2018,2019]
25
+
26
+ tests:
27
+ - given:
28
+ date: '2017-01-01'
29
+ regions: [custom_year_range_file]
30
+ expect:
31
+ name: "after_year"
@@ -0,0 +1,15 @@
1
+ module Holidays
2
+ module BAD_REGION_NAME
3
+ def self.defined_regions
4
+ [:test_region]
5
+ end
6
+
7
+ def self.holidays_by_month
8
+ {}
9
+ end
10
+
11
+ def self.custom_methods
12
+ {}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ months:
2
+ 10:
3
+ - name: Company Founding!
4
+ regions: [custom_multiple_files]
5
+ mday: 5
6
+
7
+ tests:
8
+ - given:
9
+ date: "2013-10-5"
10
+ regions: ["custom_multiple_files"]
11
+ expect:
12
+ name: "Company Founding!"
@@ -0,0 +1,38 @@
1
+ months:
2
+ 0:
3
+ - name: With Function Modifier
4
+ regions: [multiple_with_conflict_1]
5
+ function: easter(year)
6
+ function_modifier: 60
7
+ - name: With Function Only Different Function Name
8
+ regions: [multiple_with_conflict_1]
9
+ function: conflict_custom_method_1(year)
10
+ - name: With Function Only Same Function Name
11
+ regions: [multiple_with_conflict_1]
12
+ function: conflict_custom_method_identical_name_between_regions(year)
13
+ - name: With Function Only Same Function Name - Region 1
14
+ regions: [multiple_with_conflict_1]
15
+ function: conflict_custom_method_identical_name_between_regions_but_different_holiday_names(year)
16
+ 1:
17
+ - name: New Year's Day
18
+ regions: [multiple_with_conflict_1]
19
+ mday: 1
20
+ observed: to_monday_if_weekend(date)
21
+ 10:
22
+ - name: Testing Conflict Month 10
23
+ regions: [multiple_with_conflict_1]
24
+ mday: 5
25
+
26
+ methods:
27
+ conflict_custom_method_1:
28
+ arguments: year
29
+ ruby: |
30
+ Date.civil(year, 8, 1)
31
+ conflict_custom_method_identical_name_between_regions:
32
+ arguments: year
33
+ ruby: |
34
+ Date.civil(year, 9, 1)
35
+ conflict_custom_method_identical_name_between_regions_but_different_holiday_names:
36
+ arguments: year
37
+ ruby: |
38
+ Date.civil(year, 9, 15)
@@ -0,0 +1,38 @@
1
+ months:
2
+ 0:
3
+ - name: With Function Modifier
4
+ regions: [multiple_with_conflict_2]
5
+ function: easter(year)
6
+ function_modifier: 64
7
+ - name: With Function Only Different Function Name
8
+ regions: [multiple_with_conflict_2]
9
+ function: conflict_custom_method_2(year)
10
+ - name: With Function Only Same Function Name
11
+ regions: [multiple_with_conflict_2]
12
+ function: conflict_custom_method_identical_name_between_regions(year)
13
+ - name: With Function Only Same Function Name - Region 2
14
+ regions: [multiple_with_conflict_2]
15
+ function: conflict_custom_method_identical_name_between_regions_but_different_holiday_names(year)
16
+ 1:
17
+ - name: New Year's Day
18
+ regions: [multiple_with_conflict_2]
19
+ mday: 1
20
+ observed: to_tuesday_if_sunday_or_monday_if_saturday(date)
21
+ 10:
22
+ - name: Testing Conflict Month 10
23
+ regions: [multiple_with_conflict_2]
24
+ mday: 7
25
+
26
+ methods:
27
+ conflict_custom_method_2:
28
+ arguments: year
29
+ ruby: |
30
+ Date.civil(year, 12, 1)
31
+ conflict_custom_method_identical_name_between_regions:
32
+ arguments: year
33
+ ruby: |
34
+ Date.civil(year, 11, 1)
35
+ conflict_custom_method_identical_name_between_regions_but_different_holiday_names:
36
+ arguments: year
37
+ ruby: |
38
+ Date.civil(year, 11, 15)
@@ -0,0 +1,15 @@
1
+ module Holidays
2
+ module TEST_REGION
3
+ def self.defined_regions
4
+ [:test_region, :test_region2]
5
+ end
6
+
7
+ def self.holidays_by_month
8
+ {}
9
+ end
10
+
11
+ def self.custom_methods
12
+ {}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ months:
2
+ 6:
3
+ - name: Company Founding
4
+ regions: [custom_single_file]
5
+ mday: 20
6
+
7
+ tests:
8
+ - given:
9
+ date: '2013-06-20'
10
+ regions: [custom_single_file]
11
+ expect:
12
+ name: "Company Founding"
@@ -0,0 +1,28 @@
1
+ months:
2
+ 0:
3
+ - name: Custom Holiday
4
+ regions: [custom_single_file]
5
+ function: custom_method(year, month)
6
+ function_modifier: 5
7
+ 6:
8
+ - name: Company Founding
9
+ regions: [custom_single_file]
10
+ mday: 20
11
+ methods:
12
+ custom_method:
13
+ arguments: year, month
14
+ source: |
15
+ d = Date.civil(year, month, 1)
16
+ d + 2
17
+
18
+ tests:
19
+ - given:
20
+ date: '2013-06-20'
21
+ regions: [custom_single_file]
22
+ expect:
23
+ name: "Company Founding"
24
+ - given:
25
+ date: '2015-01-01'
26
+ regions: [custom_single_file]
27
+ expect:
28
+ name: "Custom Holiday"
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
3
+
4
+ # This file is generated by the Ruby Holiday gem.
5
+ #
6
+ # Definitions loaded: definitions/ar.yaml
7
+ class ArDefinitionTests < Test::Unit::TestCase # :nodoc:
8
+
9
+ def test_ar
10
+ assert_equal "Año Nuevo", (Holidays.on(Date.civil(2016, 1, 1), [:ar], [:informal])[0] || {})[:name]
11
+
12
+ assert_equal "Carnaval Lunes", (Holidays.on(Date.civil(2016, 2, 8), [:ar], [:informal])[0] || {})[:name]
13
+
14
+ assert_equal "Carnaval Martes", (Holidays.on(Date.civil(2016, 2, 9), [:ar], [:informal])[0] || {})[:name]
15
+
16
+ assert_equal "Carnaval Lunes", (Holidays.on(Date.civil(2017, 2, 27), [:ar], [:informal])[0] || {})[:name]
17
+
18
+ assert_equal "Carnaval Martes", (Holidays.on(Date.civil(2017, 2, 28), [:ar], [:informal])[0] || {})[:name]
19
+
20
+ assert_equal "Carnaval Lunes", (Holidays.on(Date.civil(2018, 2, 12), [:ar], [:informal])[0] || {})[:name]
21
+
22
+ assert_equal "Carnaval Martes", (Holidays.on(Date.civil(2018, 2, 13), [:ar], [:informal])[0] || {})[:name]
23
+
24
+ assert_equal "Día Nacional de la Memoria por la Verdad y la Justicia", (Holidays.on(Date.civil(2016, 3, 24), [:ar], [:informal])[0] || {})[:name]
25
+
26
+ assert_equal "Viernes Santo", (Holidays.on(Date.civil(2016, 3, 25), [:ar], [:informal])[0] || {})[:name]
27
+
28
+ assert_equal "Día del Veterano y de los Caídos en la Guerra de Malvinas", (Holidays.on(Date.civil(2016, 4, 2), [:ar], [:informal])[0] || {})[:name]
29
+
30
+ assert_equal "Día del Trabajador", (Holidays.on(Date.civil(2016, 5, 1), [:ar], [:informal])[0] || {})[:name]
31
+
32
+ assert_equal "Día de la Revolución de Mayo", (Holidays.on(Date.civil(2016, 5, 25), [:ar], [:informal])[0] || {})[:name]
33
+
34
+ assert_equal "Paso a la Inmortalidad del General Martín Miguel de Güemes", (Holidays.on(Date.civil(2020, 6, 15), [:ar], [:informal])[0] || {})[:name]
35
+ assert_equal "Paso a la Inmortalidad del General Martín Miguel de Güemes", (Holidays.on(Date.civil(2021, 6, 21), [:ar], [:informal])[0] || {})[:name]
36
+
37
+ assert_nil (Holidays.on(Date.civil(2020, 6, 17), [:ar], [:informal])[0] || {})[:name]
38
+ assert_nil (Holidays.on(Date.civil(2021, 6, 17), [:ar], [:informal])[0] || {})[:name]
39
+
40
+ assert_equal "Paso a la Inmortalidad del General Martín Miguel de Güemes", (Holidays.on(Date.civil(2016, 6, 20), [:ar], [:informal])[0] || {})[:name]
41
+
42
+ assert_equal "Día de la Independencia", (Holidays.on(Date.civil(2016, 7, 9), [:ar], [:informal])[0] || {})[:name]
43
+
44
+ assert_equal "Paso a la Inmortalidad del General José de San Martín", (Holidays.on(Date.civil(2016, 8, 15), [:ar], [:informal])[0] || {})[:name]
45
+ assert_equal "Paso a la Inmortalidad del General José de San Martín", (Holidays.on(Date.civil(2020, 8, 17), [:ar], [:informal])[0] || {})[:name]
46
+ assert_equal "Paso a la Inmortalidad del General José de San Martín", (Holidays.on(Date.civil(2021, 8, 16), [:ar], [:informal])[0] || {})[:name]
47
+
48
+ assert_nil (Holidays.on(Date.civil(2016, 8, 17), [:ar], [:informal])[0] || {})[:name]
49
+ assert_nil (Holidays.on(Date.civil(2021, 8, 17), [:ar], [:informal])[0] || {})[:name]
50
+
51
+ assert_equal "Día del Respeto a la Diversidad Cultural", (Holidays.on(Date.civil(2016, 10, 10), [:ar], [:informal])[0] || {})[:name]
52
+ assert_equal "Día del Respeto a la Diversidad Cultural", (Holidays.on(Date.civil(2021, 10, 11), [:ar], [:informal])[0] || {})[:name]
53
+
54
+ assert_nil (Holidays.on(Date.civil(2021, 10, 12), [:ar], [:informal])[0] || {})[:name]
55
+
56
+ assert_equal "Día de la Soberanía Nacional", (Holidays.on(Date.civil(2016, 11, 20), [:ar], [:informal])[0] || {})[:name]
57
+
58
+ assert_equal "Inmaculada Concepción de María", (Holidays.on(Date.civil(2016, 12, 8), [:ar], [:informal])[0] || {})[:name]
59
+
60
+ assert_equal "Feriado con fines turísticos", (Holidays.on(Date.civil(2016, 7, 8), [:ar], [:informal])[0] || {})[:name]
61
+ assert_equal "Feriado con fines turísticos", (Holidays.on(Date.civil(2016, 12, 9), [:ar], [:informal])[0] || {})[:name]
62
+ assert_equal "Feriado con fines turísticos", (Holidays.on(Date.civil(2021, 5, 24), [:ar], [:informal])[0] || {})[:name]
63
+ assert_equal "Feriado con fines turísticos", (Holidays.on(Date.civil(2021, 10, 8), [:ar], [:informal])[0] || {})[:name]
64
+ assert_equal "Feriado con fines turísticos", (Holidays.on(Date.civil(2021, 11, 22), [:ar], [:informal])[0] || {})[:name]
65
+
66
+ assert_equal "Navidad", (Holidays.on(Date.civil(2016, 12, 25), [:ar], [:informal])[0] || {})[:name]
67
+
68
+ end
69
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
3
+
4
+ # This file is generated by the Ruby Holiday gem.
5
+ #
6
+ # Definitions loaded: definitions/at.yaml
7
+ class AtDefinitionTests < Test::Unit::TestCase # :nodoc:
8
+
9
+ def test_at
10
+ assert_equal "Neujahrstag", (Holidays.on(Date.civil(2009, 1, 1), [:at], [:informal])[0] || {})[:name]
11
+
12
+ assert_equal "Ostermontag", (Holidays.on(Date.civil(2009, 4, 13), [:at])[0] || {})[:name]
13
+
14
+ assert_equal "Christi Himmelfahrt", (Holidays.on(Date.civil(2009, 5, 21), [:at])[0] || {})[:name]
15
+
16
+ assert_equal "Pfingstmontag", (Holidays.on(Date.civil(2009, 6, 1), [:at])[0] || {})[:name]
17
+
18
+ assert_equal "Nationalfeiertag", (Holidays.on(Date.civil(2009, 10, 26), [:at], [:informal])[0] || {})[:name]
19
+
20
+ assert_equal "Mariä Empfängnis", (Holidays.on(Date.civil(2009, 12, 8), [:at], [:informal])[0] || {})[:name]
21
+
22
+ assert_equal "1. Weihnachtstag", (Holidays.on(Date.civil(2009, 12, 25), [:at], [:informal])[0] || {})[:name]
23
+
24
+ assert_equal "2. Weihnachtstag", (Holidays.on(Date.civil(2009, 12, 26), [:at], [:informal])[0] || {})[:name]
25
+
26
+ assert_nil (Holidays.on(Date.civil(2010, 5, 8), [:at])[0] || {})[:name]
27
+
28
+ assert_equal "Fronleichnam", (Holidays.on(Date.civil(2017, 6, 15), [:at])[0] || {})[:name]
29
+
30
+ end
31
+ end