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
@@ -0,0 +1,123 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/definition/repository/cache'
4
+
5
+ class CacheRepoTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::Definition::Repository::Cache.new
8
+ end
9
+
10
+ def test_find_supports_overlapping_holidays
11
+ start_date = Date.civil(2015, 1, 1)
12
+ end_date = Date.civil(2015, 7, 1)
13
+ cache_data = [
14
+ {:date=>Date.civil(2015, 1, 1), :name=>"New Year's Day A", :regions=>[:us]},
15
+ {:date=>Date.civil(2015, 1, 1), :name=>"New Year's Day B", :regions=>[:us]}
16
+ ]
17
+ options = :us
18
+
19
+ @subject.cache_between(start_date, end_date, cache_data, options)
20
+
21
+ assert_equal(cache_data, @subject.find(start_date, start_date, options))
22
+ assert_equal(cache_data, @subject.find(start_date, end_date, options))
23
+ end
24
+
25
+ def test_cache_returns_empty_array_no_holidays_are_found
26
+ start_date = Date.civil(2015, 1, 1)
27
+ end_date = Date.civil(2015, 7, 1)
28
+ cache_data = [{:date=>Date.civil(2015, 1, 1), :name=>"New Year's Day", :regions=>[:us]}]
29
+ options = :us
30
+
31
+ @subject.cache_between(start_date, end_date, cache_data, options)
32
+
33
+ assert_empty(@subject.find(Date.civil(2015, 1, 2), Date.civil(2015, 1, 2), options))
34
+ assert_empty(@subject.find(Date.civil(2015, 1, 2), Date.civil(2015, 1, 3), options))
35
+ end
36
+
37
+ def test_cache_returns_empty_array_when_cache_is_empty
38
+ start_date = Date.civil(2015, 1, 1)
39
+ end_date = Date.civil(2015, 7, 1)
40
+ cache_data = []
41
+ options = :us
42
+
43
+ @subject.cache_between(start_date, end_date, cache_data, options)
44
+
45
+ assert_empty(@subject.find(Date.civil(2015, 1, 2), Date.civil(2015, 1, 2), options))
46
+ assert_empty(@subject.find(Date.civil(2015, 1, 2), Date.civil(2015, 1, 3), options))
47
+ end
48
+
49
+ def test_find_returns_correct_cache_data
50
+ start_date = Date.civil(2015, 1, 1)
51
+ end_date = Date.civil(2015, 7, 1)
52
+ cache_data = [{:date=>Date.civil(2015, 1, 1), :name=>"New Year's Day", :regions=>[:us]}]
53
+ options = :us
54
+ @subject.cache_between(start_date, end_date, cache_data, options)
55
+
56
+ assert_equal(cache_data, @subject.find(start_date, start_date, options))
57
+ assert_equal(cache_data, @subject.find(start_date, end_date, options))
58
+ end
59
+
60
+ def test_find_returns_nil_if_no_match_is_found
61
+ start_date = Date.civil(2015, 1, 1)
62
+ end_date = Date.civil(2015, 1, 1)
63
+ cache_data = [{:date=>Date.civil(2015, 1, 1), :name=>"New Year's Day", :regions=>[:us]}]
64
+ options = :us
65
+ @subject.cache_between(start_date, end_date, cache_data, options)
66
+
67
+ assert_nil(@subject.find(Date.civil(2015, 7, 1), Date.civil(2015, 12, 1), options))
68
+ assert_nil(@subject.find(Date.civil(2015, 7, 1), Date.civil(2015, 12, 1), options))
69
+ end
70
+
71
+ def test_cache_between_returns_error_if_dates_are_missing
72
+ start_date = Date.civil(2015, 1, 1)
73
+ end_date = Date.civil(2015, 1, 1)
74
+ cache_data = [{:date=>Date.civil(2015, 1, 1), :name=>"New Year's Day", :regions=>[:us]}]
75
+ options = :us
76
+
77
+ assert_raise ArgumentError do
78
+ @subject.cache_between(nil, end_date, cache_data, options)
79
+ end
80
+
81
+ assert_raise ArgumentError do
82
+ @subject.cache_between(start_date, nil, cache_data, options)
83
+ end
84
+ end
85
+
86
+ def test_cache_between_returns_error_if_dates_are_invalid
87
+ start_date = Date.civil(2015, 1, 1)
88
+ end_date = Date.civil(2015, 1, 1)
89
+ cache_data = [{:date=>Date.civil(2015, 1, 1), :name=>"New Year's Day", :regions=>[:us]}]
90
+ options = :us
91
+
92
+ assert_raise ArgumentError do
93
+ @subject.cache_between("invalid-date", end_date, cache_data, options)
94
+ end
95
+
96
+ assert_raise ArgumentError do
97
+ @subject.cache_between(start_date, "invalid-date", cache_data, options)
98
+ end
99
+ end
100
+
101
+ def test_cache_between_returns_error_if_cached_data_is_not_present
102
+ start_date = Date.civil(2015, 1, 1)
103
+ end_date = Date.civil(2015, 1, 1)
104
+ options = :us
105
+
106
+ assert_raise ArgumentError do
107
+ @subject.cache_between(start_date, end_date, nil, options)
108
+ end
109
+ end
110
+
111
+ def test_reset_clears_cache
112
+ start_date = Date.civil(2015, 1, 1)
113
+ end_date = Date.civil(2015, 1, 1)
114
+ cache_data = [{:date=>Date.civil(2015, 1, 1), :name=>"New Year's Day", :regions=>[:us]}]
115
+ options = :us
116
+ @subject.cache_between(start_date, end_date, cache_data, options)
117
+
118
+ assert_equal(cache_data, @subject.find(start_date, end_date, options))
119
+
120
+ @subject.reset!
121
+ assert_nil(@subject.find(start_date, end_date, options))
122
+ end
123
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/definition/repository/custom_methods'
4
+
5
+ class CustomMethodsRepoTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::Definition::Repository::CustomMethods.new
8
+ end
9
+
10
+ def test_add_raises_error_if_input_is_nil
11
+ assert_raise ArgumentError do
12
+ @subject.add(nil)
13
+ end
14
+ end
15
+
16
+ def test_find_returns_nil_if_method_id_does_not_exist
17
+ assert_nil @subject.find("some-method-id")
18
+ end
19
+
20
+ def test_add_successfully_adds_new_custom_methods
21
+ new_custom_methods = {
22
+ "some-method-id" => Proc.new { |year|
23
+ Date.civil(year, 1, 1)
24
+ }
25
+ }
26
+
27
+ @subject.add(new_custom_methods)
28
+
29
+ target_method = @subject.find("some-method-id")
30
+
31
+ assert_equal new_custom_methods["some-method-id"], target_method
32
+ end
33
+
34
+ def test_find_raises_error_if_target_method_id_is_nil_or_empty
35
+ assert_raise ArgumentError do
36
+ @subject.find(nil)
37
+ end
38
+
39
+ assert_raise ArgumentError do
40
+ @subject.find("")
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,275 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/definition/repository/holidays_by_month'
4
+
5
+ class HolidaysByMonthRepoTests < Test::Unit::TestCase
6
+ def setup
7
+ @existing_holidays_by_month = {0 => [:mday => 1, :name => "Test", :regions => [:test]]}
8
+
9
+ @subject = Holidays::Definition::Repository::HolidaysByMonth.new
10
+ end
11
+
12
+ def test_all_returns_empty_hash_if_no_holidays_have_been_added
13
+ assert_equal({}, @subject.all)
14
+ end
15
+
16
+ def test_all_returns_existing_holidays
17
+ @subject.add(@existing_holidays_by_month)
18
+ assert_equal(@existing_holidays_by_month, @subject.all)
19
+ end
20
+
21
+ def test_add_does_not_change_data_if_it_already_exists
22
+ target_holidays = {0 => [:mday => 1, :name => "Test", :regions => [:test]]}
23
+
24
+ @subject.add(@existing_holidays_by_month)
25
+ @subject.add(target_holidays)
26
+
27
+ expected = @existing_holidays_by_month
28
+
29
+ assert_equal(expected, @subject.all)
30
+ end
31
+
32
+ def test_add_is_successful_if_name_is_different
33
+ target_holidays = {0 => [:mday => 1, :name => "Different", :regions => [:test]]}
34
+
35
+ @subject.add(@existing_holidays_by_month)
36
+ @subject.add(target_holidays)
37
+
38
+ expected = {
39
+ 0 => [
40
+ {:mday=>1, :name=>"Test", :regions=>[:test]},
41
+ {:mday=>1, :name=>"Different", :regions=>[:test]}
42
+ ]
43
+ }
44
+
45
+ assert_equal(expected, @subject.all)
46
+ end
47
+
48
+ def test_add_is_successful_if_wday_is_different
49
+ target_holidays = {0 => [:mday => 1, :name => "Test", :wday => 1, :regions => [:test]]}
50
+
51
+ @subject.add(@existing_holidays_by_month)
52
+ @subject.add(target_holidays)
53
+
54
+ expected = {
55
+ 0 => [
56
+ {:mday=>1, :name=>"Test", :regions=>[:test]},
57
+ {:mday=>1, :name=>"Test", :wday => 1, :regions=>[:test]}
58
+ ]
59
+ }
60
+
61
+ assert_equal(expected, @subject.all)
62
+ end
63
+
64
+ def test_add_is_successful_if_mday_is_different
65
+ target_holidays = {0 => [:mday => 2, :name => "Test", :regions => [:test]]}
66
+
67
+ @subject.add(@existing_holidays_by_month)
68
+ @subject.add(target_holidays)
69
+
70
+ expected = {
71
+ 0 => [
72
+ {:mday=>1, :name=>"Test", :regions=>[:test]},
73
+ {:mday=>2, :name=>"Test", :regions=>[:test]}
74
+ ]
75
+ }
76
+
77
+ assert_equal(expected, @subject.all)
78
+ end
79
+
80
+ def test_add_is_successful_if_week_is_different
81
+ target_holidays = {0 => [:mday => 1, :name => "Test", :week => :first, :regions => [:test]]}
82
+
83
+ @subject.add(@existing_holidays_by_month)
84
+ @subject.add(target_holidays)
85
+
86
+ expected = {
87
+ 0 => [
88
+ {:mday=>1, :name=>"Test", :regions=>[:test]},
89
+ {:mday=>1, :name=>"Test", :week => :first, :regions=>[:test]}
90
+ ]
91
+ }
92
+
93
+ assert_equal(expected, @subject.all)
94
+ end
95
+
96
+ def test_add_is_successful_if_type_is_different
97
+ target_holidays = {0 => [:mday => 1, :name => "Test", :type => :informal, :regions => [:test]]}
98
+
99
+ @subject.add(@existing_holidays_by_month)
100
+ @subject.add(target_holidays)
101
+
102
+ expected = {
103
+ 0 => [
104
+ {:mday=>1, :name=>"Test", :regions=>[:test]},
105
+ {:mday=>1, :name=>"Test", :type => :informal, :regions=>[:test]}
106
+ ]
107
+ }
108
+
109
+ assert_equal(expected, @subject.all)
110
+ end
111
+
112
+ def test_add_is_successful_if_only_region_is_different_and_updates_regions_to_existing_matching_definitions
113
+ target_holidays = {0 => [:mday => 1, :name => "Test", :regions => [:test2]]}
114
+
115
+ @subject.add(@existing_holidays_by_month)
116
+ @subject.add(target_holidays)
117
+
118
+ expected = { 0 => [ {:mday=>1, :name=>"Test", :regions=>[:test, :test2]} ] }
119
+
120
+ assert_equal(expected, @subject.all)
121
+ end
122
+
123
+ def test_add_is_successful_and_updates_regions_to_existing_matching_definitions_and_deduped_correctly
124
+ target_holidays = {0 => [:mday => 1, :name => "Test", :regions => [:test2, :test]]}
125
+
126
+ @subject.add(@existing_holidays_by_month)
127
+ @subject.add(target_holidays)
128
+
129
+ expected = { 0 => [ {:mday=>1, :name=>"Test", :regions=>[:test, :test2]} ] }
130
+
131
+ assert_equal(expected, @subject.all)
132
+ end
133
+
134
+ def test_find_by_month_returns_nil_if_none_found
135
+ @subject.add(@existing_holidays_by_month)
136
+
137
+ holidays_for_month = @subject.find_by_month(12)
138
+ assert_equal(nil, holidays_for_month)
139
+ end
140
+
141
+ def test_find_by_month_returns_array_if_found
142
+ @subject.add(@existing_holidays_by_month)
143
+
144
+ holidays_for_month = @subject.find_by_month(0)
145
+ assert_equal(@existing_holidays_by_month[0], holidays_for_month)
146
+ end
147
+
148
+ def test_find_by_month_raises_error_if_month_is_not_valid
149
+ @subject.add(@existing_holidays_by_month)
150
+
151
+ assert_raise ArgumentError do
152
+ @subject.find_by_month(-1)
153
+ end
154
+ end
155
+
156
+ def test_add_is_successful_if_only_function_is_different
157
+ initial_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test], :function=>"easter(year)", :function_arguments=>[:year]}]}
158
+
159
+ @subject.add(initial_holidays)
160
+
161
+ second_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test2], :function=>"orthodox_easter(year)", :function_arguments=>[:year]}]}
162
+ @subject.add(second_holidays)
163
+
164
+ expected = {
165
+ 0 => [
166
+ {
167
+ :function=>"easter(year)",
168
+ :function_arguments=>[:year],
169
+ :mday=>1,
170
+ :name=>"Test",
171
+ :regions=>[:test]
172
+ },
173
+ {
174
+ :function=>"orthodox_easter(year)",
175
+ :function_arguments=>[:year],
176
+ :mday=>1,
177
+ :name=>"Test",
178
+ :regions=>[:test2]
179
+ }
180
+ ]
181
+ }
182
+
183
+ assert_equal(expected, @subject.all)
184
+ end
185
+
186
+ def test_add_is_successful_if_only_function_modifier_is_different
187
+ initial_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test], :function=>"easter(year)", :function_modifier=>1, :function_arguments=>[:year]}]}
188
+
189
+ @subject.add(initial_holidays)
190
+
191
+ second_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test2], :function=>"easter(year)", :function_modifier=>2, :function_arguments=>[:year]}]}
192
+ @subject.add(second_holidays)
193
+
194
+ expected = {
195
+ 0 => [
196
+ {
197
+ :function=>"easter(year)",
198
+ :function_arguments=>[:year],
199
+ :function_modifier=>1,
200
+ :mday=>1,
201
+ :name=>"Test",
202
+ :regions=>[:test]
203
+ },
204
+ {
205
+ :function=>"easter(year)",
206
+ :function_arguments=>[:year],
207
+ :function_modifier=>2,
208
+ :mday=>1,
209
+ :name=>"Test",
210
+ :regions=>[:test2]
211
+ }
212
+ ]
213
+ }
214
+
215
+ assert_equal(expected, @subject.all)
216
+ end
217
+
218
+ def test_add_is_successful_if_only_observed_is_different
219
+ initial_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test], :observed=>"to_weekday_if_weekend(year)", :function_arguments=>[:year]}]}
220
+
221
+ @subject.add(initial_holidays)
222
+
223
+ second_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test2], :observed =>"to_friday_if_saturday(year)", :function_arguments=>[:year]}]}
224
+ @subject.add(second_holidays)
225
+
226
+ expected = {
227
+ 0 => [
228
+ {
229
+ :observed =>"to_weekday_if_weekend(year)",
230
+ :function_arguments=>[:year],
231
+ :mday=>1,
232
+ :name=>"Test",
233
+ :regions=>[:test]
234
+ },
235
+ {
236
+ :observed =>"to_friday_if_saturday(year)",
237
+ :function_arguments=>[:year],
238
+ :mday=>1,
239
+ :name=>"Test",
240
+ :regions=>[:test2]
241
+ }
242
+ ]
243
+ }
244
+
245
+ assert_equal(expected, @subject.all)
246
+ end
247
+
248
+ def test_add_is_successful_if_only_year_ranges_is_different
249
+ initial_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test], :year_ranges => {:from => 1990}}]}
250
+
251
+ @subject.add(initial_holidays)
252
+
253
+ second_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test2], :year_ranges => {:until => 2002}}]}
254
+ @subject.add(second_holidays)
255
+
256
+ expected = {
257
+ 0 => [
258
+ {
259
+ :mday=>1,
260
+ :name=>"Test",
261
+ :regions=>[:test],
262
+ :year_ranges => {:from => 1990}
263
+ },
264
+ {
265
+ :mday=>1,
266
+ :name=>"Test",
267
+ :regions=>[:test2],
268
+ :year_ranges => {:until => 2002}
269
+ }
270
+ ]
271
+ }
272
+
273
+ assert_equal(expected, @subject.all)
274
+ end
275
+ end
@@ -0,0 +1,91 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/definition/repository/proc_result_cache'
4
+
5
+ class ProcResultCacheRepoTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::Definition::Repository::ProcResultCache.new
8
+ end
9
+
10
+ def test_lookup_stores_and_returns_result_of_function_if_it_is_not_present
11
+ function = lambda { |year| Date.civil(year, 2, 1) - 1 }
12
+ function_argument = 2015
13
+
14
+ assert_equal(Date.civil(2015, 1, 31), @subject.lookup(function, function_argument))
15
+ end
16
+
17
+ #FIXME This test stinks. I don't know how to show that the second invocation
18
+ # doesn't call the function. In rspec I could just do an expect().not_to
19
+ # but it doesn't seem like Mocha can do that? I'm punting.
20
+ def test_lookup_simply_returns_result_of_cache_if_present_after_first_call
21
+ function = lambda { |year| Date.civil(year, 2, 1) - 1 }
22
+ function_argument = 2015
23
+
24
+ assert_equal(Date.civil(2015, 1, 31), @subject.lookup(function, function_argument))
25
+ end
26
+
27
+ def test_lookup_raises_error_if_function_is_not_a_proc
28
+ function = "Holidays.easter(year)"
29
+ function_argument = 2015
30
+
31
+ assert_raise ArgumentError do
32
+ @subject.lookup(function, function_argument)
33
+ end
34
+ end
35
+
36
+ def test_lookup_accepts_date_as_function_argument
37
+ function = lambda { |date| date - 1 }
38
+ function_argument = Date.civil(2015, 2, 1)
39
+
40
+ assert_equal(Date.civil(2015, 1, 31), @subject.lookup(function, function_argument))
41
+ end
42
+
43
+ def test_lookup_accepts_symbol_as_function_argument
44
+ function = lambda { |symbol| symbol }
45
+ function_argument = :test
46
+
47
+ assert_equal(:test, @subject.lookup(function, function_argument))
48
+ end
49
+
50
+ def test_accepts_multiple_arguments_for_functions
51
+ function = lambda { |year, month, day| Date.civil(year, month, day) + 1 }
52
+ year = 2016
53
+ month = 1
54
+ day = 1
55
+
56
+ assert_equal(Date.civil(2016, 1, 2), @subject.lookup(function, year, month, day))
57
+ end
58
+
59
+ def test_raises_error_if_one_of_multiple_arguments_is_not_an_int_or_date
60
+ function = lambda { |year, month, day| Date.civil(year, month, day) + 1 }
61
+ year = 2016
62
+ month = 1
63
+ day = "1"
64
+
65
+ assert_raise ArgumentError do
66
+ @subject.lookup(function, year, month, day)
67
+ end
68
+ end
69
+
70
+ def test_accepts_mix_of_integers_and_dates_for_multiple_function_arguments
71
+ function = lambda { |date, modifier| date + modifier }
72
+ date = Date.civil(2016, 1, 1)
73
+ modifier = 5
74
+
75
+ assert_equal(Date.civil(2016, 1, 6), @subject.lookup(function, date, modifier))
76
+ end
77
+
78
+ def test_lookup_raises_error_if_function_argument_is_not_valid
79
+ function = lambda { |year| Date.civil(year, 2, 1) - 1 }
80
+ function_argument = "2015"
81
+
82
+ assert_raise ArgumentError do
83
+ @subject.lookup(function, function_argument)
84
+ end
85
+
86
+ function_argument = Proc.new { |arg1| "arg1" + "something"}
87
+ assert_raise ArgumentError do
88
+ @subject.lookup(function, function_argument)
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,104 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/definition/repository/regions'
4
+
5
+ class RegionsRepoTests < Test::Unit::TestCase
6
+ def setup
7
+ @all_generated_regions = [:parent, :subregion, :subregion_with_underscores, :region1, :region2]
8
+ @parent_region_lookup = {
9
+ :subregion => :parent,
10
+ :subregion_with_underscores => :parent,
11
+ }
12
+
13
+ @subject = Holidays::Definition::Repository::Regions.new(@all_generated_regions, @parent_region_lookup)
14
+ end
15
+
16
+ def test_all_loaded_returns_an_empty_array_if_just_initialize
17
+ assert_equal([], @subject.all_loaded)
18
+ end
19
+
20
+ def test_add_successfully_adds_a_region
21
+ @subject.add(:test)
22
+ assert_equal([:test], @subject.all_loaded)
23
+ end
24
+
25
+ def test_add_raises_error_if_symbol_not_provided
26
+ assert_raises ArgumentError do
27
+ @subject.add('not-a-symbol')
28
+ end
29
+ end
30
+
31
+ def test_add_raises_error_if_argument_is_nil
32
+ assert_raises ArgumentError do
33
+ @subject.add(nil)
34
+ end
35
+ end
36
+
37
+ def test_add_raises_error_if_any_region_is_not_a_symbol
38
+ assert_raises ArgumentError do
39
+ @subject.add([:test, 'not-a-symbol'])
40
+ end
41
+ end
42
+
43
+ def test_add_does_not_add_if_the_region_already_exists
44
+ @subject.add(:test)
45
+ @subject.add(:test)
46
+ assert_equal([:test], @subject.all_loaded)
47
+ end
48
+
49
+ def test_add_accepts_array_of_regions
50
+ @subject.add([:test, :test2])
51
+ assert_equal([:test, :test2], @subject.all_loaded)
52
+ end
53
+
54
+ def test_exists_returns_true_if_region_is_present
55
+ @subject.add(:test)
56
+ assert @subject.loaded?(:test)
57
+ end
58
+
59
+ def tests_exists_returns_false_if_region_is_not_present
60
+ assert_equal(false, @subject.loaded?(:something))
61
+ end
62
+
63
+ def test_exists_raises_error_if_invalid_argument
64
+ assert_raises ArgumentError do
65
+ @subject.loaded?(nil)
66
+ end
67
+ end
68
+
69
+ def test_search_returns_empty_array_if_no_matches_found
70
+ assert_equal([], @subject.search(:something))
71
+ end
72
+
73
+ def test_search_returns_matches_on_prefix
74
+ @subject.add([:another_region, :test_region])
75
+ assert_equal([:test_region], @subject.search(:test_))
76
+ end
77
+
78
+ def test_search_returns_multiple_matches_on_prefix
79
+ @subject.add([:another_region, :test_region, :test_region2])
80
+ assert_equal([:test_region, :test_region2], @subject.search(:test_))
81
+ end
82
+
83
+ def test_search_raises_error_if_prefix_is_not_a_string
84
+ assert_raises ArgumentError do
85
+ @subject.search("string")
86
+ end
87
+
88
+ assert_raises ArgumentError do
89
+ @subject.search(nil)
90
+ end
91
+ end
92
+
93
+ def test_all_generated_returns_value_from_initializer
94
+ assert_equal(@all_generated_regions, @subject.all_generated)
95
+ end
96
+
97
+ def test_parent_region_lookup_returns_region_if_it_exists
98
+ assert_equal(@parent_region_lookup[:subregion], @subject.parent_region_lookup(:subregion))
99
+ end
100
+
101
+ def test_parent_region_lookup_returns_nil_if_does_not_exist_in_lookup
102
+ assert_nil(@subject.parent_region_lookup(:parent))
103
+ end
104
+ end