holidays 11.0.0 → 11.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +25 -0
- data/lib/generated_definitions/REGIONS.rb +2 -0
- data/lib/generated_definitions/europe.rb +3 -2
- data/lib/generated_definitions/gb.rb +4 -3
- data/lib/generated_definitions/ph.rb +1 -5
- data/lib/generated_definitions/sg.rb +46 -4
- data/lib/holidays/date_calculator/lunar_date.rb +1 -0
- data/lib/holidays/definition/context/generator.rb +10 -1
- data/lib/holidays/definition/generator/regions.rb +11 -1
- data/lib/holidays/definition/repository/cache.rb +11 -5
- data/lib/holidays/version.rb +1 -1
- data/lib/holidays.rb +9 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3ddbd4a71c58985797a9d23c0915ab057dcc6c33955dd376c4d6bf666ebaf162
|
|
4
|
+
data.tar.gz: caff42a910a845239c211675f9f281d6eee616a701b890666638925ddf2bc4f5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 35817afac8beb46dba118b1919092d278a00281e8ef82819dbc55217520af2b3ccf27f64e84412a34d7826c7cd17002af310f42bcf94eb5423218de70a115bf0
|
|
7
|
+
data.tar.gz: 4bba40653e048451b4a02f1d360ba089c8211be3ce4d420f42b7f60ce57f82442ba1d77fe088978ec067af89506bf8aee71cfc0a1865e9534c16b6dea6c7f3c1
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Ruby Holidays Gem CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 11.2.0
|
|
4
|
+
|
|
5
|
+
* Update to [v8.0.2 definitions](https://github.com/holidays/definitions/releases/tag/v8.0.2). Please see the changelog for the definition details.
|
|
6
|
+
* Fix `sg` observed dates so Saturday holidays are no longer shifted back to Friday ([#488](https://github.com/holidays/holidays/issues/488)). New Year's Day, National Day and Christmas Day now follow the Ministry of Manpower rule that only a Sunday holiday gets a substitute. Callers using the `:observed` option will see these holidays return the Saturday date itself, and no longer see a substitute on the preceding Friday.
|
|
7
|
+
* Add `sg` Chinese New Year, Vesak Day, Hari Raya Puasa, Hari Raya Haji and Deepavali ([#351](https://github.com/holidays/holidays/issues/351))
|
|
8
|
+
* Add `gb_sct` bank holiday for 15 June 2026 to mark the World Cup
|
|
9
|
+
|
|
10
|
+
## 11.1.0
|
|
11
|
+
|
|
12
|
+
* Add `Holidays.region_names` and `Holidays.region_name(region)` to expose the English name of each region ([#160](https://github.com/holidays/holidays/issues/160)). Names are the ISO 3166 English short names added in [definitions #325](https://github.com/holidays/definitions/pull/325). `region_name` returns `nil` for an unknown region. `available_regions` is unchanged.
|
|
13
|
+
* Update to [v8.0.1 definitions](https://github.com/holidays/definitions/releases/tag/v8.0.1). Please see the changelog for the definition details.
|
|
14
|
+
* Fix `gb` Christmas and Boxing Day observed dates when Christmas falls on a Sunday ([#396](https://github.com/holidays/holidays/issues/396)). Boxing Day is now observed on Monday the 26th and Christmas Day is substituted to Tuesday the 27th. Callers matching on holiday name will see these two names swap for the affected dates.
|
|
15
|
+
* Fix `ph` National Heroes Day when August 31st falls on a Sunday ([definitions issue-345](https://github.com/holidays/definitions/issues/345))
|
|
16
|
+
|
|
3
17
|
## 11.0.0
|
|
4
18
|
|
|
5
19
|
* Update to [v8.0.0 definitions](https://github.com/holidays/definitions/releases/tag/v8.0.0). Please see the changelog for the definition details.
|
data/README.md
CHANGED
|
@@ -243,6 +243,31 @@ Holidays.available_regions
|
|
|
243
243
|
=> [:ar, :at, ..., :sg] # this will be a big array
|
|
244
244
|
```
|
|
245
245
|
|
|
246
|
+
#### Return region names
|
|
247
|
+
|
|
248
|
+
Return the English name of every region:
|
|
249
|
+
|
|
250
|
+
```ruby
|
|
251
|
+
Holidays.region_names
|
|
252
|
+
=> {:ar=>"Argentina", :at=>"Austria", ..., :sg=>"Singapore"} # this will be a big hash
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Return the English name of a single region:
|
|
256
|
+
|
|
257
|
+
```ruby
|
|
258
|
+
Holidays.region_name(:gb_eng)
|
|
259
|
+
=> "England"
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Unknown regions return `nil`:
|
|
263
|
+
|
|
264
|
+
```ruby
|
|
265
|
+
Holidays.region_name(:not_a_region)
|
|
266
|
+
=> nil
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Names are the [ISO 3166](https://www.iso.org/iso-3166-country-codes.html) English short names where one exists. Subregions and non-country regions (stock exchanges, central banks, shipping carriers) use their common English name.
|
|
270
|
+
|
|
246
271
|
## Loading Custom Definitions on the fly
|
|
247
272
|
|
|
248
273
|
In addition to the [provided definitions](https://github.com/holidays/definitions) you can load custom definitions file on the fly and use them immediately.
|
|
@@ -3,4 +3,6 @@ module Holidays
|
|
|
3
3
|
REGIONS = [:ar, :at, :au, :au_nsw, :au_vic, :au_qld, :au_nt, :au_act, :au_sa, :au_wa, :au_tas, :au_tas_south, :au_qld_cairns, :au_qld_brisbane, :au_tas_north, :au_vic_melbourne, :be_fr, :be_nl, :br, :bg_en, :bg_bg, :ca, :ca_qc, :ca_ab, :ca_sk, :ca_on, :ca_bc, :ca_nb, :ca_mb, :ca_ns, :ca_pe, :ca_nl, :ca_nt, :ca_nu, :ca_yt, :us, :ch_zh, :ch_be, :ch_lu, :ch_ur, :ch_sz, :ch_ow, :ch_nw, :ch_gl, :ch_zg, :ch_fr, :ch_so, :ch_bs, :ch_bl, :ch_sh, :ch_ar, :ch_ai, :ch_sg, :ch_gr, :ch_ag, :ch_tg, :ch_ti, :ch_vd, :ch_ne, :ch_ge, :ch_ju, :ch_vs, :ch, :cl, :co, :cr, :cy, :cz, :dk, :de, :de_bw, :de_by, :de_he, :de_nw, :de_rp, :de_sl, :de_sn_sorbian, :de_th_cath, :de_sn, :de_st, :de_be, :de_mv, :de_by_cath, :de_by_augsburg, :de_th, :de_bb, :de_hb, :de_hh, :de_ni, :de_sh, :ecbtarget, :ee, :es_pv, :es_na, :es_an, :es_ib, :es_cm, :es_mu, :es_m, :es_ar, :es_cl, :es_cn, :es_lo, :es_ga, :es_ce, :es_o, :es_ex, :es, :es_ct, :es_v, :es_vc, :federalreserve, :federalreservebanks, :fedex, :fi, :fr_a, :fr_m, :fr, :gb, :gb_eng, :gb_wls, :gb_eaw, :gb_nir, :gb_con, :je, :gb_jsy, :gg, :gb_gsy, :gb_sct, :im, :gb_iom, :ge, :gr, :hr, :hk, :hu, :ie, :il, :in, :in_wb, :in_od, :in_tr, :in_mh, :in_ar, :in_mz, :in_br, :in_hp, :in_gj, :in_sk, :in_ts, :in_jh, :in_py, :in_kl, :in_ka, :in_jk, :in_ap, :in_cg, :in_hr, :in_mp, :in_pb, :in_nl, :in_as, :in_ga, :is, :it, :it_ve, :it_tv, :it_vr, :it_pd, :it_fi, :it_ge, :it_to, :it_rm, :it_vi, :it_bl, :it_ro, :ke, :kr, :kz, :li, :lt, :lv, :ma, :mc, :mt_mt, :mt_en, :mx, :mx_pue, :nerc, :nl, :lu, :no, :nyse, :nz, :nz_sl, :nz_we, :nz_ak, :nz_nl, :nz_ne, :nz_ot, :nz_ta, :nz_sc, :nz_hb, :nz_mb, :nz_ca, :nz_ch, :nz_wl, :pe, :ph, :pl, :pt, :pt_li, :pt_po, :ro, :rs_cyrl, :rs_la, :ru, :se, :tn, :tr, :tsx, :ua, :us_fl, :us_al, :us_la, :us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_nj, :us_nc, :us_nd, :us_pa, :us_pr, :us_tn, :us_ga, :us_ms, :us_id, :us_ar, :us_tx, :us_dc, :us_md, :us_va, :us_vt, :us_ak, :us_ca, :us_me, :us_ma, :us_ne, :us_mo, :us_sc, :us_wv, :us_vi, :us_ut, :us_ri, :us_az, :us_co, :us_il, :us_mt, :us_nm, :us_ny, :us_oh, :us_mi, :us_mn, :us_nv, :us_or, :us_sd, :us_wa, :us_wi, :us_wy, :us_ia, :us_ks, :us_nh, :us_ok, :unitednations, :ups, :za, :ve, :sk, :si, :jp, :vn, :sg, :my, :th, :ng]
|
|
4
4
|
|
|
5
5
|
PARENT_REGION_LOOKUP = {ar: :ar, at: :at, au: :au, au_nsw: :au, au_vic: :au, au_qld: :au, au_nt: :au, au_act: :au, au_sa: :au, au_wa: :au, au_tas: :au, au_tas_south: :au, au_qld_cairns: :au, au_qld_brisbane: :au, au_tas_north: :au, au_vic_melbourne: :au, be_fr: :be_fr, be_nl: :be_nl, br: :br, bg_en: :bg, bg_bg: :bg, ca: :ca, ca_qc: :ca, ca_ab: :ca, ca_sk: :ca, ca_on: :ca, ca_bc: :ca, ca_nb: :ca, ca_mb: :ca, ca_ns: :ca, ca_pe: :ca, ca_nl: :ca, ca_nt: :ca, ca_nu: :ca, ca_yt: :ca, us: :us, ch_zh: :ch, ch_be: :ch, ch_lu: :ch, ch_ur: :ch, ch_sz: :ch, ch_ow: :ch, ch_nw: :ch, ch_gl: :ch, ch_zg: :ch, ch_fr: :ch, ch_so: :ch, ch_bs: :ch, ch_bl: :ch, ch_sh: :ch, ch_ar: :ch, ch_ai: :ch, ch_sg: :ch, ch_gr: :ch, ch_ag: :ch, ch_tg: :ch, ch_ti: :ch, ch_vd: :ch, ch_ne: :ch, ch_ge: :ch, ch_ju: :ch, ch_vs: :ch, ch: :ch, cl: :cl, co: :co, cr: :cr, cy: :cy, cz: :cz, dk: :dk, de: :de, de_bw: :de, de_by: :de, de_he: :de, de_nw: :de, de_rp: :de, de_sl: :de, de_sn_sorbian: :de, de_th_cath: :de, de_sn: :de, de_st: :de, de_be: :de, de_mv: :de, de_by_cath: :de, de_by_augsburg: :de, de_th: :de, de_bb: :de, de_hb: :de, de_hh: :de, de_ni: :de, de_sh: :de, ecbtarget: :ecbtarget, ee: :ee, es_pv: :es, es_na: :es, es_an: :es, es_ib: :es, es_cm: :es, es_mu: :es, es_m: :es, es_ar: :es, es_cl: :es, es_cn: :es, es_lo: :es, es_ga: :es, es_ce: :es, es_o: :es, es_ex: :es, es: :es, es_ct: :es, es_v: :es, es_vc: :es, federalreserve: :federalreserve, federalreservebanks: :federalreservebanks, fedex: :fedex, fi: :fi, fr_a: :fr, fr_m: :fr, fr: :fr, gb: :gb, gb_eng: :gb, gb_wls: :gb, gb_eaw: :gb, gb_nir: :gb, gb_con: :gb, je: :gb, gb_jsy: :gb, gg: :gb, gb_gsy: :gb, gb_sct: :gb, im: :gb, gb_iom: :gb, ge: :ge, gr: :gr, hr: :hr, hk: :hk, hu: :hu, ie: :ie, il: :il, in: :in, in_wb: :in, in_od: :in, in_tr: :in, in_mh: :in, in_ar: :in, in_mz: :in, in_br: :in, in_hp: :in, in_gj: :in, in_sk: :in, in_ts: :in, in_jh: :in, in_py: :in, in_kl: :in, in_ka: :in, in_jk: :in, in_ap: :in, in_cg: :in, in_hr: :in, in_mp: :in, in_pb: :in, in_nl: :in, in_as: :in, in_ga: :in, is: :is, it: :it, it_ve: :it, it_tv: :it, it_vr: :it, it_pd: :it, it_fi: :it, it_ge: :it, it_to: :it, it_rm: :it, it_vi: :it, it_bl: :it, it_ro: :it, ke: :ke, kr: :kr, kz: :kz, li: :li, lt: :lt, lv: :lv, ma: :ma, mc: :mc, mt_mt: :mt_mt, mt_en: :mt_en, mx: :mx, mx_pue: :mx, nerc: :nerc, nl: :nl, lu: :lu, no: :no, nyse: :nyse, nz: :nz, nz_sl: :nz, nz_we: :nz, nz_ak: :nz, nz_nl: :nz, nz_ne: :nz, nz_ot: :nz, nz_ta: :nz, nz_sc: :nz, nz_hb: :nz, nz_mb: :nz, nz_ca: :nz, nz_ch: :nz, nz_wl: :nz, pe: :pe, ph: :ph, pl: :pl, pt: :pt, pt_li: :pt, pt_po: :pt, ro: :ro, rs_cyrl: :rs_cyrl, rs_la: :rs_la, ru: :ru, se: :se, tn: :tn, tr: :tr, tsx: :tsx, ua: :ua, us_fl: :us, us_al: :us, us_la: :us, us_ct: :us, us_de: :us, us_gu: :us, us_hi: :us, us_in: :us, us_ky: :us, us_nj: :us, us_nc: :us, us_nd: :us, us_pa: :us, us_pr: :us, us_tn: :us, us_ga: :us, us_ms: :us, us_id: :us, us_ar: :us, us_tx: :us, us_dc: :us, us_md: :us, us_va: :us, us_vt: :us, us_ak: :us, us_ca: :us, us_me: :us, us_ma: :us, us_ne: :us, us_mo: :us, us_sc: :us, us_wv: :us, us_vi: :us, us_ut: :us, us_ri: :us, us_az: :us, us_co: :us, us_il: :us, us_mt: :us, us_nm: :us, us_ny: :us, us_oh: :us, us_mi: :us, us_mn: :us, us_nv: :us, us_or: :us, us_sd: :us, us_wa: :us, us_wi: :us, us_wy: :us, us_ia: :us, us_ks: :us, us_nh: :us, us_ok: :us, unitednations: :unitednations, ups: :ups, za: :za, ve: :southamerica, sk: :europe, si: :europe, jp: :jp, vn: :vn, sg: :sg, my: :my, th: :th, ng: :ng}
|
|
6
|
+
|
|
7
|
+
REGION_NAMES = {:ar => "Argentina", :at => "Austria", :au => "Australia", :au_act => "Australian Capital Territory", :au_nsw => "New South Wales", :au_nt => "Northern Territory", :au_qld => "Queensland", :au_qld_brisbane => "Brisbane", :au_qld_cairns => "Cairns", :au_sa => "South Australia", :au_tas => "Tasmania", :au_tas_north => "Northern Tasmania", :au_tas_south => "Southern Tasmania", :au_vic => "Victoria", :au_vic_melbourne => "Melbourne", :au_wa => "Western Australia", :be_fr => "Belgium (French)", :be_nl => "Belgium (Dutch)", :br => "Brazil", :bg_bg => "Bulgaria", :bg_en => "Bulgaria", :ca => "Canada", :ca_ab => "Alberta", :ca_bc => "British Columbia", :ca_mb => "Manitoba", :ca_nb => "New Brunswick", :ca_nl => "Newfoundland and Labrador", :ca_ns => "Nova Scotia", :ca_nt => "Northwest Territories", :ca_nu => "Nunavut", :ca_on => "Ontario", :ca_pe => "Prince Edward Island", :ca_qc => "Quebec", :ca_sk => "Saskatchewan", :ca_yt => "Yukon", :us => "United States", :ch => "Switzerland", :ch_ag => "Aargau", :ch_ai => "Appenzell Innerrhoden", :ch_ar => "Appenzell Ausserrhoden", :ch_be => "Bern", :ch_bl => "Basel-Landschaft", :ch_bs => "Basel-Stadt", :ch_fr => "Fribourg", :ch_ge => "Genève", :ch_gl => "Glarus", :ch_gr => "Graubünden", :ch_ju => "Jura", :ch_lu => "Luzern", :ch_ne => "Neuchâtel", :ch_nw => "Nidwalden", :ch_ow => "Obwalden", :ch_sg => "Sankt Gallen", :ch_sh => "Schaffhausen", :ch_so => "Solothurn", :ch_sz => "Schwyz", :ch_tg => "Thurgau", :ch_ti => "Ticino", :ch_ur => "Uri", :ch_vd => "Vaud", :ch_vs => "Valais", :ch_zg => "Zug", :ch_zh => "Zürich", :cl => "Chile", :co => "Colombia", :cr => "Costa Rica", :cy => "Cyprus", :cz => "Czechia", :dk => "Denmark", :de => "Germany", :de_bb => "Brandenburg", :de_be => "Berlin", :de_bw => "Baden-Württemberg", :de_by => "Bayern", :de_by_augsburg => "Augsburg (Bayern)", :de_by_cath => "Bayern (Catholic regions)", :de_hb => "Bremen", :de_he => "Hessen", :de_hh => "Hamburg", :de_mv => "Mecklenburg-Vorpommern", :de_ni => "Niedersachsen", :de_nw => "Nordrhein-Westfalen", :de_rp => "Rheinland-Pfalz", :de_sh => "Schleswig-Holstein", :de_sl => "Saarland", :de_sn => "Sachsen", :de_sn_sorbian => "Sachsen (Sorbian regions)", :de_st => "Sachsen-Anhalt", :de_th => "Thüringen", :de_th_cath => "Thüringen (Catholic regions)", :ecbtarget => "ECB TARGET (European Central Bank)", :ee => "Estonia", :es => "Spain", :es_an => "Andalucía", :es_ar => "Aragón", :es_ce => "Ceuta", :es_cl => "Castilla y León", :es_cm => "Castilla-La Mancha", :es_cn => "Canary Islands", :es_ct => "Cataluña", :es_ex => "Extremadura", :es_ga => "Galicia", :es_ib => "Islas Baleares", :es_lo => "Rioja, La", :es_m => "Madrid", :es_mu => "Murcia", :es_na => "Navarra", :es_o => "Asturias", :es_pv => "País Vasco", :es_v => "Valencia/València", :es_vc => "Comunidad Valenciana", :federalreserve => "Federal Reserve", :federalreservebanks => "Federal Reserve Banks", :fedex => "FedEx", :fi => "Finland", :fr => "France", :fr_a => "Alsace", :fr_m => "Moselle", :gb => "United Kingdom", :gb_con => "Cornwall", :gb_eaw => "England and Wales", :gb_eng => "England", :gb_gsy => "Guernsey", :gb_iom => "Isle of Man", :gb_jsy => "Jersey", :gb_nir => "Northern Ireland", :gb_sct => "Scotland", :gb_wls => "Wales", :gg => "Guernsey", :im => "Isle of Man", :je => "Jersey", :ge => "Georgia", :gr => "Greece", :hr => "Croatia", :hk => "Hong Kong", :hu => "Hungary", :ie => "Ireland", :il => "Israel", :in => "India", :in_ap => "Andhra Pradesh", :in_ar => "Arunachal Pradesh", :in_as => "Assam", :in_br => "Bihar", :in_cg => "Chhattisgarh", :in_ga => "Goa", :in_gj => "Gujarat", :in_hp => "Himachal Pradesh", :in_hr => "Haryana", :in_jh => "Jharkhand", :in_jk => "Jammu and Kashmir", :in_ka => "Karnataka", :in_kl => "Kerala", :in_mh => "Maharashtra", :in_mp => "Madhya Pradesh", :in_mz => "Mizoram", :in_nl => "Nagaland", :in_od => "Odisha", :in_pb => "Punjab", :in_py => "Pondicherry", :in_sk => "Sikkim", :in_tr => "Tripura", :in_ts => "तेलंगाना", :in_wb => "West Bengal", :is => "Iceland", :it => "Italy", :it_bl => "Belluno", :it_fi => "Firenze", :it_ge => "Genova", :it_pd => "Padova", :it_rm => "Roma", :it_ro => "Rovigo", :it_to => "Torino", :it_tv => "Treviso", :it_ve => "Venezia", :it_vi => "Vicenza", :it_vr => "Verona", :ke => "Kenya", :kr => "South Korea", :kz => "Kazakhstan", :li => "Liechtenstein", :lt => "Lithuania", :lv => "Latvia", :ma => "Morocco", :mc => "Monaco", :mt_mt => "Malta", :mt_en => "Malta", :mx => "Mexico", :mx_pue => "Puebla", :nerc => "North American Electric Reliability Corporation", :nl => "Netherlands", :lu => "Luxembourg", :no => "Norway", :nyse => "New York Stock Exchange", :nz => "New Zealand", :nz_ak => "Auckland", :nz_ca => "Canterbury", :nz_ch => "Chatham Islands", :nz_hb => "Hawke's Bay", :nz_mb => "Marlborough", :nz_ne => "Nelson", :nz_nl => "Northland", :nz_ot => "Otago", :nz_sc => "South Canterbury", :nz_sl => "Southland", :nz_ta => "Taranaki", :nz_we => "Wellington", :nz_wl => "Westland", :pe => "Peru", :ph => "Philippines", :pl => "Poland", :pt => "Portugal", :pt_li => "Lisbon", :pt_po => "Porto", :ro => "Romania", :rs_cyrl => "Serbia", :rs_la => "Serbia", :ru => "Russian Federation", :se => "Sweden", :tn => "Tunisia", :tr => "Türkiye", :tsx => "Toronto Stock Exchange", :ua => "Ukraine", :us_ak => "Alaska", :us_al => "Alabama", :us_ar => "Arkansas", :us_az => "Arizona", :us_ca => "California", :us_co => "Colorado", :us_ct => "Connecticut", :us_dc => "District of Columbia", :us_de => "Delaware", :us_fl => "Florida", :us_ga => "Georgia", :us_gu => "Guam", :us_hi => "Hawaii", :us_ia => "Iowa", :us_id => "Idaho", :us_il => "Illinois", :us_in => "Indiana", :us_ks => "Kansas", :us_ky => "Kentucky", :us_la => "Louisiana", :us_ma => "Massachusetts", :us_md => "Maryland", :us_me => "Maine", :us_mi => "Michigan", :us_mn => "Minnesota", :us_mo => "Missouri", :us_ms => "Mississippi", :us_mt => "Montana", :us_nc => "North Carolina", :us_nd => "North Dakota", :us_ne => "Nebraska", :us_nh => "New Hampshire", :us_nj => "New Jersey", :us_nm => "New Mexico", :us_nv => "Nevada", :us_ny => "New York", :us_oh => "Ohio", :us_ok => "Oklahoma", :us_or => "Oregon", :us_pa => "Pennsylvania", :us_pr => "Puerto Rico", :us_ri => "Rhode Island", :us_sc => "South Carolina", :us_sd => "South Dakota", :us_tn => "Tennessee", :us_tx => "Texas", :us_ut => "Utah", :us_va => "Virginia", :us_vi => "Virgin Islands, U.S.", :us_vt => "Vermont", :us_wa => "Washington", :us_wi => "Wisconsin", :us_wv => "West Virginia", :us_wy => "Wyoming", :unitednations => "United Nations", :ups => "UPS", :za => "South Africa", :ve => "Venezuela", :sk => "Slovakia", :si => "Slovenia", :jp => "Japan", :vn => "Vietnam", :sg => "Singapore", :my => "Malaysia", :th => "Thailand", :ng => "Nigeria"}
|
|
6
8
|
end
|
|
@@ -383,8 +383,8 @@ module Holidays
|
|
|
383
383
|
{:mday => 26, :observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "San Esteban", :regions => [:es_ib, :es_ct]},
|
|
384
384
|
{:mday => 25, :name => "Noël", :regions => [:fr]},
|
|
385
385
|
{:mday => 26, :name => "Saint-Étienne", :regions => [:fr_a, :fr_m]},
|
|
386
|
-
{:mday => 25, :observed => "
|
|
387
|
-
{:mday => 26, :observed => "
|
|
386
|
+
{:mday => 25, :observed => "to_tuesday_if_sunday_or_monday_if_saturday(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:gb]},
|
|
387
|
+
{:mday => 26, :observed => "to_tuesday_if_sunday_or_monday_if_saturday(date)", :observed_arguments => [:date], :name => "Boxing Day", :regions => [:gb]},
|
|
388
388
|
{:mday => 25, :name => "Χριστούγεννα", :regions => [:gr]},
|
|
389
389
|
{:mday => 26, :name => "Δεύτερη ημέρα των Χριστουγέννων", :regions => [:gr]},
|
|
390
390
|
{:mday => 25, :name => "Božić", :regions => [:hr]},
|
|
@@ -500,6 +500,7 @@ module Holidays
|
|
|
500
500
|
{:mday => 24, :name => "San Juan", :regions => [:es_ct, :es_vc]},
|
|
501
501
|
{:mday => 2, :year_ranges => { :limited => [2022] },:name => "Bank Holiday", :regions => [:gb]},
|
|
502
502
|
{:mday => 3, :year_ranges => { :limited => [2022] },:name => "Platinum Jubilee", :regions => [:gb]},
|
|
503
|
+
{:mday => 15, :year_ranges => { :limited => [2026] },:name => "World Cup Bank Holiday", :regions => [:gb_sct]},
|
|
503
504
|
{:mday => 22, :name => "Dan antifašističke borbe", :regions => [:hr]},
|
|
504
505
|
{:mday => 25, :year_ranges => { :until => 2019 },:name => "Dan državnosti", :regions => [:hr]},
|
|
505
506
|
{:wday => 1, :week => 1, :name => "June Bank Holiday", :regions => [:ie]},
|
|
@@ -28,7 +28,8 @@ module Holidays
|
|
|
28
28
|
{:wday => 1, :week => -1, :year_ranges => { :until => 2021 },:name => "Bank Holiday", :regions => [:gb]},
|
|
29
29
|
{:wday => 1, :week => -1, :year_ranges => { :from => 2023 },:name => "Bank Holiday", :regions => [:gb]}],
|
|
30
30
|
6 => [{:mday => 2, :year_ranges => { :limited => [2022] },:name => "Bank Holiday", :regions => [:gb]},
|
|
31
|
-
{:mday => 3, :year_ranges => { :limited => [2022] },:name => "Platinum Jubilee", :regions => [:gb]}
|
|
31
|
+
{:mday => 3, :year_ranges => { :limited => [2022] },:name => "Platinum Jubilee", :regions => [:gb]},
|
|
32
|
+
{:mday => 15, :year_ranges => { :limited => [2026] },:name => "World Cup Bank Holiday", :regions => [:gb_sct]}],
|
|
32
33
|
7 => [{:mday => 5, :name => "Tynwald Day", :regions => [:im, :gb_iom]},
|
|
33
34
|
{:mday => 12, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Battle of the Boyne", :regions => [:gb_nir]}],
|
|
34
35
|
8 => [{:wday => 1, :week => 1, :name => "Bank Holiday", :regions => [:gb_sct]},
|
|
@@ -37,8 +38,8 @@ module Holidays
|
|
|
37
38
|
11 => [{:mday => 5, :type => :informal, :name => "Guy Fawkes Day", :regions => [:gb]},
|
|
38
39
|
{:mday => 30, :year_ranges => { :until => 2006 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :type => :informal, :name => "St. Andrew's Day", :regions => [:gb_sct]},
|
|
39
40
|
{:mday => 30, :year_ranges => { :from => 2007 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "St. Andrew's Day", :regions => [:gb_sct]}],
|
|
40
|
-
12 => [{:mday => 25, :observed => "
|
|
41
|
-
{:mday => 26, :observed => "
|
|
41
|
+
12 => [{:mday => 25, :observed => "to_tuesday_if_sunday_or_monday_if_saturday(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:gb]},
|
|
42
|
+
{:mday => 26, :observed => "to_tuesday_if_sunday_or_monday_if_saturday(date)", :observed_arguments => [:date], :name => "Boxing Day", :regions => [:gb]}]
|
|
42
43
|
}
|
|
43
44
|
end
|
|
44
45
|
|
|
@@ -13,12 +13,54 @@ module Holidays
|
|
|
13
13
|
def self.holidays_by_month
|
|
14
14
|
{
|
|
15
15
|
0 => [{:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Good Friday", :regions => [:sg]}],
|
|
16
|
-
1 => [{:mday => 1, :observed => "
|
|
16
|
+
1 => [{:mday => 1, :observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "New Year's Day", :regions => [:sg]},
|
|
17
|
+
{:mday => 1, :function => "lunar_to_solar(year, month, day, region)", :function_arguments => [:year, :month, :day, :region], :observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Chinese New Year", :regions => [:sg]},
|
|
18
|
+
{:mday => 2, :function => "lunar_to_solar(year, month, day, region)", :function_arguments => [:year, :month, :day, :region], :observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Chinese New Year", :regions => [:sg]}],
|
|
17
19
|
2 => [{:mday => 14, :type => :informal, :name => "Valentine's Day", :regions => [:sg]},
|
|
18
20
|
{:mday => 15, :type => :informal, :name => "Total Defence Day", :regions => [:sg]}],
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
3 => [{:mday => 31, :year_ranges => { :limited => [2025] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]},
|
|
22
|
+
{:mday => 21, :year_ranges => { :limited => [2026] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]}],
|
|
23
|
+
4 => [{:mday => 22, :year_ranges => { :limited => [2023] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]},
|
|
24
|
+
{:mday => 10, :year_ranges => { :limited => [2024] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]}],
|
|
25
|
+
5 => [{:mday => 1, :name => "Labour Day", :regions => [:sg]},
|
|
26
|
+
{:mday => 10, :year_ranges => { :limited => [2017] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
27
|
+
{:mday => 29, :year_ranges => { :limited => [2018] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
28
|
+
{:mday => 19, :year_ranges => { :limited => [2019] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
29
|
+
{:mday => 7, :year_ranges => { :limited => [2020] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
30
|
+
{:mday => 26, :year_ranges => { :limited => [2021] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
31
|
+
{:mday => 15, :year_ranges => { :limited => [2022] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
32
|
+
{:mday => 22, :year_ranges => { :limited => [2024] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
33
|
+
{:mday => 12, :year_ranges => { :limited => [2025] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
34
|
+
{:mday => 31, :year_ranges => { :limited => [2026] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
35
|
+
{:mday => 24, :year_ranges => { :limited => [2020] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]},
|
|
36
|
+
{:mday => 13, :year_ranges => { :limited => [2021] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]},
|
|
37
|
+
{:mday => 3, :year_ranges => { :limited => [2022] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]},
|
|
38
|
+
{:mday => 27, :year_ranges => { :limited => [2026] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]}],
|
|
39
|
+
6 => [{:mday => 2, :year_ranges => { :limited => [2023] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Vesak Day", :regions => [:sg]},
|
|
40
|
+
{:mday => 25, :year_ranges => { :limited => [2017] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]},
|
|
41
|
+
{:mday => 15, :year_ranges => { :limited => [2018] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]},
|
|
42
|
+
{:mday => 5, :year_ranges => { :limited => [2019] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Puasa", :regions => [:sg]},
|
|
43
|
+
{:mday => 29, :year_ranges => { :limited => [2023] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]},
|
|
44
|
+
{:mday => 17, :year_ranges => { :limited => [2024] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]},
|
|
45
|
+
{:mday => 7, :year_ranges => { :limited => [2025] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]}],
|
|
46
|
+
7 => [{:mday => 31, :year_ranges => { :limited => [2020] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]},
|
|
47
|
+
{:mday => 20, :year_ranges => { :limited => [2021] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]},
|
|
48
|
+
{:mday => 10, :year_ranges => { :limited => [2022] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]}],
|
|
49
|
+
8 => [{:mday => 9, :observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "National Day", :regions => [:sg]},
|
|
50
|
+
{:mday => 22, :year_ranges => { :limited => [2018] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]},
|
|
51
|
+
{:mday => 11, :year_ranges => { :limited => [2019] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]}],
|
|
52
|
+
9 => [{:mday => 1, :year_ranges => { :limited => [2017] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Hari Raya Haji", :regions => [:sg]}],
|
|
53
|
+
10 => [{:mday => 18, :year_ranges => { :limited => [2017] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]},
|
|
54
|
+
{:mday => 27, :year_ranges => { :limited => [2019] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]},
|
|
55
|
+
{:mday => 24, :year_ranges => { :limited => [2022] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]},
|
|
56
|
+
{:mday => 31, :year_ranges => { :limited => [2024] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]},
|
|
57
|
+
{:mday => 20, :year_ranges => { :limited => [2025] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]}],
|
|
58
|
+
11 => [{:mday => 6, :year_ranges => { :limited => [2018] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]},
|
|
59
|
+
{:mday => 14, :year_ranges => { :limited => [2020] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]},
|
|
60
|
+
{:mday => 4, :year_ranges => { :limited => [2021] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]},
|
|
61
|
+
{:mday => 12, :year_ranges => { :limited => [2023] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]},
|
|
62
|
+
{:mday => 8, :year_ranges => { :limited => [2026] },:observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Deepavali", :regions => [:sg]}],
|
|
63
|
+
12 => [{:mday => 25, :observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:sg]}]
|
|
22
64
|
}
|
|
23
65
|
end
|
|
24
66
|
|
|
@@ -27,6 +27,7 @@ module Holidays
|
|
|
27
27
|
all_rules_by_month = {}
|
|
28
28
|
all_custom_methods = {}
|
|
29
29
|
all_tests = []
|
|
30
|
+
all_region_names = {}
|
|
30
31
|
|
|
31
32
|
files.flatten!
|
|
32
33
|
|
|
@@ -51,11 +52,19 @@ module Holidays
|
|
|
51
52
|
all_custom_methods.merge!(custom_methods)
|
|
52
53
|
|
|
53
54
|
all_tests += @test_parser.call(definition_file['tests'])
|
|
55
|
+
|
|
56
|
+
region_names = definition_file['region_names']
|
|
57
|
+
if region_names
|
|
58
|
+
symbolized_region_names = region_names.each_with_object({}) do |(region, name), hash|
|
|
59
|
+
hash[region.to_sym] = name
|
|
60
|
+
end
|
|
61
|
+
all_region_names.merge!(symbolized_region_names)
|
|
62
|
+
end
|
|
54
63
|
end
|
|
55
64
|
|
|
56
65
|
all_regions.flatten!.uniq!
|
|
57
66
|
|
|
58
|
-
[all_regions, all_rules_by_month, all_custom_methods, all_tests]
|
|
67
|
+
[all_regions, all_rules_by_month, all_custom_methods, all_tests, all_region_names]
|
|
59
68
|
end
|
|
60
69
|
|
|
61
70
|
def generate_definition_source(module_name, files, regions, rules_by_month, custom_methods, tests)
|
|
@@ -6,7 +6,7 @@ module Holidays
|
|
|
6
6
|
# holiday definitions, but that does not make these countries subregions of one another.
|
|
7
7
|
NORTH_AMERICA_REGIONS = %i[ca mx us].freeze
|
|
8
8
|
|
|
9
|
-
def call(regions)
|
|
9
|
+
def call(regions, region_names = {})
|
|
10
10
|
validate!(regions)
|
|
11
11
|
|
|
12
12
|
<<-EOF
|
|
@@ -15,6 +15,8 @@ module Holidays
|
|
|
15
15
|
REGIONS = #{to_array(regions)}
|
|
16
16
|
|
|
17
17
|
PARENT_REGION_LOOKUP = #{generate_parent_lookup(regions)}
|
|
18
|
+
|
|
19
|
+
REGION_NAMES = #{generate_region_names(region_names)}
|
|
18
20
|
end
|
|
19
21
|
EOF
|
|
20
22
|
end
|
|
@@ -50,6 +52,14 @@ EOF
|
|
|
50
52
|
pairs = lookup.map { |k, v| "#{k}: :#{v}" }.join(", ")
|
|
51
53
|
"{#{pairs}}"
|
|
52
54
|
end
|
|
55
|
+
|
|
56
|
+
# Symbol keys and string values are emitted via inspect so the literal
|
|
57
|
+
# round-trips exactly: YAML-reserved keys like :no stay symbols and
|
|
58
|
+
# values with quotes or commas are escaped rather than breaking the hash.
|
|
59
|
+
def generate_region_names(region_names)
|
|
60
|
+
pairs = region_names.map { |sym, name| "#{sym.inspect} => #{name.inspect}" }.join(", ")
|
|
61
|
+
"{#{pairs}}"
|
|
62
|
+
end
|
|
53
63
|
end
|
|
54
64
|
end
|
|
55
65
|
end
|
|
@@ -10,17 +10,19 @@ module Holidays
|
|
|
10
10
|
raise ArgumentError unless cache_data
|
|
11
11
|
raise ArgumentError unless start_date && end_date
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
@
|
|
13
|
+
key = normalize(options)
|
|
14
|
+
@cache_range[key] = start_date..end_date
|
|
15
|
+
@cache[key] = cache_data.group_by { |holiday| holiday[:date] }
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def find(start_date, end_date, options)
|
|
18
19
|
return nil unless in_cache_range?(start_date, end_date, options)
|
|
19
20
|
|
|
21
|
+
key = normalize(options)
|
|
20
22
|
if start_date == end_date
|
|
21
|
-
@cache[
|
|
23
|
+
@cache[key].fetch(start_date, [])
|
|
22
24
|
else
|
|
23
|
-
@cache[
|
|
25
|
+
@cache[key].select do |date, holidays|
|
|
24
26
|
date >= start_date && date <= end_date
|
|
25
27
|
end.flat_map { |date, holidays| holidays }
|
|
26
28
|
end
|
|
@@ -33,8 +35,12 @@ module Holidays
|
|
|
33
35
|
|
|
34
36
|
private
|
|
35
37
|
|
|
38
|
+
def normalize(options)
|
|
39
|
+
Array(options).flatten.map(&:to_sym).uniq.sort
|
|
40
|
+
end
|
|
41
|
+
|
|
36
42
|
def in_cache_range?(start_date, end_date, options)
|
|
37
|
-
range = @cache_range[options]
|
|
43
|
+
range = @cache_range[normalize(options)]
|
|
38
44
|
if range
|
|
39
45
|
range.begin <= start_date && range.end >= end_date
|
|
40
46
|
else
|
data/lib/holidays/version.rb
CHANGED
data/lib/holidays.rb
CHANGED
|
@@ -89,8 +89,16 @@ module Holidays
|
|
|
89
89
|
Holidays::REGIONS
|
|
90
90
|
end
|
|
91
91
|
|
|
92
|
+
def region_names
|
|
93
|
+
Holidays::REGION_NAMES
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def region_name(region)
|
|
97
|
+
Holidays::REGION_NAMES[region]
|
|
98
|
+
end
|
|
99
|
+
|
|
92
100
|
def load_custom(*files)
|
|
93
|
-
regions, rules_by_month, custom_methods, _ = Factory::Definition.file_parser.parse_definition_files(files)
|
|
101
|
+
regions, rules_by_month, custom_methods, _, _ = Factory::Definition.file_parser.parse_definition_files(files)
|
|
94
102
|
|
|
95
103
|
# Capture source code before converting entities to Procs so the merger
|
|
96
104
|
# can detect genuine conflicts (same name, different logic).
|