From 4672a3390c62a6054e05f4de10dff87cfc505228 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Mon, 15 Sep 2025 12:03:30 +1000 Subject: [PATCH 01/19] Update ANZAC day 2026 --- au.yaml | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/au.yaml b/au.yaml index 0bfb458..0da66c4 100644 --- a/au.yaml +++ b/au.yaml @@ -107,9 +107,15 @@ months: mday: 25 observed: to_monday_if_weekend(date) - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY - regions: [au_sa, au_act, au_wa] + regions: [au_wa] + mday: 25 + function: to_monday_if_weekend(date) + - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY + regions: [au_sa, au_act] mday: 25 - function: additional_anzac_on_monday_if_on_weekend(date) + function: to_monday_if_weekend(date) + year_ranges: + - before: 2025 # This is inclusive 5: - name: Labour Day regions: [au_qld] @@ -389,19 +395,6 @@ methods: else nil end - additional_anzac_on_monday_if_on_weekend: - # https://www.fairwork.gov.au/leave/public-holidays - # https://www.fairwork.gov.au/leave/public-holidays/list-of-public-holidays/list-of-public-holidays-2021 - # SA and WA recognise additional anzac holidays on monday if on the weekend - arguments: date - source: | - if [0,6].include?(date.wday) - date += 2 if date.wday == 6 - date += 1 if date.wday == 0 - date - else - nil - end additional_holiday_on_monday_if_on_weekend: # NT has additional christmas day on monday before boxing day if on the weekend instead of tuesday # Also Additional new year's day is observed on monday if on the weekend @@ -467,10 +460,25 @@ tests: expect: name: 'ANZAC Day' - given: - date: '2021-04-27' + date: '2021-04-26' regions: ["au_wa"] expect: name: 'Additional public holiday for ANZAC Day' + - given: + date: '2026-04-25' + regions: ["au_nsw", "au_act", "au_vic", "au_tas", "au_sa", "au_wa", "au_nt", "au_qld"] + expect: + name: 'ANZAC Day' + - given: + date: '2026-04-27' + regions: ["au_wa"] + expect: + name: 'Additional public holiday for ANZAC Day' + - given: + date: '2026-04-27' + regions: ["au_nsw", "au_act", "au_vic", "au_tas", "au_sa", "au_nt", "au_qld"] + expect: + holiday: false - given: date: '2021-12-25' regions: ["au_qld"] From 0fe92132b1f6e70606abc9679255e4b3c6192f63 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Mon, 15 Sep 2025 12:05:09 +1000 Subject: [PATCH 02/19] Fix broken boxing day test --- au.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/au.yaml b/au.yaml index 0da66c4..7c1d7d8 100644 --- a/au.yaml +++ b/au.yaml @@ -498,7 +498,7 @@ tests: date: '2021-12-28' regions: ["au_qld"] expect: - name: 'Additional public holiday for Boxing Day' + name: 'Additional public holiday Boxing Day' - given: date: '2013-10-07' regions: ["au_qld"] From 06d6a75998954b4c9082544b0e6d47fee2cd1807 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Tue, 16 Sep 2025 09:21:14 +1000 Subject: [PATCH 03/19] Update Makefile to run both validate and test in one hit --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index adf7d14..1e4334d 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ -default: validate +default: test validate: bundle exec ruby lib/validation/run.rb -test: +test: validate bundle exec rspec .PHONY: validate,test From 9568ec5737706051c7ada1cc2bc3a99065aef0b8 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Tue, 16 Sep 2025 09:52:10 +1000 Subject: [PATCH 04/19] Put a stop to observing ANZAC day on monday in qld and nt --- au.yaml | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/au.yaml b/au.yaml index 7c1d7d8..dcf13d7 100644 --- a/au.yaml +++ b/au.yaml @@ -106,6 +106,8 @@ months: regions: [au_nt, au_qld] mday: 25 observed: to_monday_if_weekend(date) + year_ranges: + - before: 2025 - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY regions: [au_wa] mday: 25 @@ -115,7 +117,7 @@ months: mday: 25 function: to_monday_if_weekend(date) year_ranges: - - before: 2025 # This is inclusive + - before: 2025 5: - name: Labour Day regions: [au_qld] @@ -450,27 +452,12 @@ methods: tests: - given: - date: '2020-04-25' - regions: ["au_act"] - expect: - name: 'ANZAC Day' - - given: - date: '2020-04-25' - regions: ["au_qld"] - expect: - name: 'ANZAC Day' - - given: - date: '2021-04-26' - regions: ["au_wa"] - expect: - name: 'Additional public holiday for ANZAC Day' - - given: - date: '2026-04-25' + date: ['2020-04-25', '2021-04-25', '2022-04-25', '2023-04-25', '2024-04-25', '2025-04-25', '2026-04-25', '2027-04-25'] regions: ["au_nsw", "au_act", "au_vic", "au_tas", "au_sa", "au_wa", "au_nt", "au_qld"] expect: name: 'ANZAC Day' - given: - date: '2026-04-27' + date: ['2021-04-26', '2026-04-27'] regions: ["au_wa"] expect: name: 'Additional public holiday for ANZAC Day' From 004f591ef167bd69fe81f7f03dbbb372ac71cd65 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Tue, 16 Sep 2025 10:00:42 +1000 Subject: [PATCH 05/19] Fix test for WA Kings Birthday --- au.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/au.yaml b/au.yaml index dcf13d7..833a43a 100644 --- a/au.yaml +++ b/au.yaml @@ -522,7 +522,7 @@ tests: expect: name: "Queen's Birthday" - given: - date: ['2023-09-25','2024-09-23', '2025-09-30'] + date: ['2023-09-25','2024-09-23', '2025-09-29', '2026-09-28'] regions: ["au_wa"] expect: name: "King's Birthday" From 94ab376d595617b9d57532a6b0917c8ba2017228 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Tue, 16 Sep 2025 12:32:58 +1000 Subject: [PATCH 06/19] Add validation for missing date spec --- lib/validation/error.rb | 1 + lib/validation/month_validator.rb | 30 ++++++++++++++ spec/validation/month_validator_spec.rb | 52 +++++++++++++++++++++++++ 3 files changed, 83 insertions(+) diff --git a/lib/validation/error.rb b/lib/validation/error.rb index d3095be..a8cb117 100644 --- a/lib/validation/error.rb +++ b/lib/validation/error.rb @@ -5,6 +5,7 @@ class NoMonths < Error ; end class InvalidMonth < Error; end class InvalidMethod < Error; end class InvalidRegions < Error; end + class MissingDateSpecification < Error; end class InvalidCustomMethod < Error; end class InvalidTest < Error; end end diff --git a/lib/validation/month_validator.rb b/lib/validation/month_validator.rb index 505751a..86cabc8 100644 --- a/lib/validation/month_validator.rb +++ b/lib/validation/month_validator.rb @@ -16,11 +16,41 @@ def call(months) month_def['regions'].each do |region| raise Errors::InvalidRegions.new("A month must contain at least one region, received: #{months}") if region.nil? || region.empty? end + + # Validate that each holiday has at least one date specification + validate_date_specification!(month_def) end end true end + + private + + def validate_date_specification!(month_def) + has_mday = month_def.key?('mday') && !month_def['mday'].nil? + has_wday = month_def.key?('wday') && !month_def['wday'].nil? + has_week = month_def.key?('week') && !month_def['week'].nil? + has_function = month_def.key?('function') && !month_def['function'].nil? && !month_def['function'].empty? + + holiday_name = month_def['name'] || 'Unknown Holiday' + + # If wday is specified, week must also be specified (and vice versa) + if (has_wday && !has_week) || (!has_wday && has_week) + raise Errors::MissingDateSpecification.new( + "Holiday '#{holiday_name}' with 'wday' must also have 'week' attribute (and vice versa)" + ) + end + + # Must have either mday, function, or both wday AND week + valid_date_spec = has_mday || has_function || (has_wday && has_week) + + unless valid_date_spec + raise Errors::MissingDateSpecification.new( + "Holiday '#{holiday_name}' must have either 'mday', 'function', or both 'wday' and 'week' attributes to specify the date" + ) + end + end end end end diff --git a/spec/validation/month_validator_spec.rb b/spec/validation/month_validator_spec.rb index 53ff06c..ece85c0 100644 --- a/spec/validation/month_validator_spec.rb +++ b/spec/validation/month_validator_spec.rb @@ -68,4 +68,56 @@ } end end + + context 'date specification validation' do + it 'allows holiday with mday' do + months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1}] } + expect(subject.call(months)).to be true + end + + it 'allows holiday with function' do + months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "function"=>"custom_method(year)"}] } + expect(subject.call(months)).to be true + end + + it 'allows holiday with wday and week' do + months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "wday"=>1, "week"=>2}] } + expect(subject.call(months)).to be true + end + + it 'returns error if holiday has no date specification' do + months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"]}] } + expect { subject.call(months) }.to raise_error(Definitions::Errors::MissingDateSpecification) { |e| + expect(e.message).to eq("Holiday 'Test Holiday' must have either 'mday', 'function', or both 'wday' and 'week' attributes to specify the date") + } + end + + it 'returns error if holiday has wday but no week' do + months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "wday"=>1}] } + expect { subject.call(months) }.to raise_error(Definitions::Errors::MissingDateSpecification) { |e| + expect(e.message).to eq("Holiday 'Test Holiday' with 'wday' must also have 'week' attribute (and vice versa)") + } + end + + it 'returns error if holiday has week but no wday' do + months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "week"=>1}] } + expect { subject.call(months) }.to raise_error(Definitions::Errors::MissingDateSpecification) { |e| + expect(e.message).to eq("Holiday 'Test Holiday' with 'wday' must also have 'week' attribute (and vice versa)") + } + end + + it 'returns error if holiday has empty function' do + months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "function"=>""}] } + expect { subject.call(months) }.to raise_error(Definitions::Errors::MissingDateSpecification) { |e| + expect(e.message).to eq("Holiday 'Test Holiday' must have either 'mday', 'function', or both 'wday' and 'week' attributes to specify the date") + } + end + + it 'returns error if holiday has nil function' do + months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "function"=>nil}] } + expect { subject.call(months) }.to raise_error(Definitions::Errors::MissingDateSpecification) { |e| + expect(e.message).to eq("Holiday 'Test Holiday' must have either 'mday', 'function', or both 'wday' and 'week' attributes to specify the date") + } + end + end end From 6e23da1a09d3cbf1b503daf4d8f7ad311e187e87 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Tue, 16 Sep 2025 12:48:24 +1000 Subject: [PATCH 07/19] Fix failing test for tas boxing day --- au.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/au.yaml b/au.yaml index 833a43a..05acc50 100644 --- a/au.yaml +++ b/au.yaml @@ -609,8 +609,11 @@ tests: expect: name: 'Recreation Day' - given: - date: '2015-12-26' + date: '2015-12-28' regions: ["au_tas"] + options: ['observed'] + expect: + name: "Boxing Day" expect: holiday: false - given: From b80ad1f59a0ffbcb2ce7befa18650bbd650d47d6 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Tue, 16 Sep 2025 12:49:35 +1000 Subject: [PATCH 08/19] Split SA boxing day rules into before and after 2025 After 2025 use term proclamation day --- au.yaml | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/au.yaml b/au.yaml index 05acc50..b260542 100644 --- a/au.yaml +++ b/au.yaml @@ -260,14 +260,20 @@ months: - name: Boxing Day # BOXING DAY STATIC ACTUAL - Recognised by ALL states expect for NT/SA regions: [au_act, au_nsw, au_qld, au_vic, au_wa] mday: 26 - - name: Boxing Day # BOXING DAY SA SUBSTITUTE - SA only substitutes Boxing Day if it falls on a Monday - regions: [au_sa, au_nt] + - name: Boxing Day + regions: [au_nt] mday: 26 function: to_tuesday_if_monday(date) - name: Additional public holiday Boxing Day # ADDITIONAL BOXING DAY - Recognised by ALL states expect for NT / TAS - regions: [au_act, au_nsw, au_qld, au_vic, au_wa, au_sa, au_nt] + regions: [au_act, au_nsw, au_qld, au_vic, au_wa, au_nt] + mday: 26 + function: additional_holiday_if_on_weekend(date) + - name: Additional public holiday Boxing Day # ADDITIONAL BOXING DAY - Recognised by ALL states expect for NT / TAS + regions: [au_sa] mday: 26 function: additional_holiday_if_on_weekend(date) + year_ranges: + - before: 2025 - name: Boxing Day # BOXING DAY OBSERVED - Only NT & TAS as they dont have an additional observed if on weekend regions: [au_tas] # SA to be moved to additional setup in 2021 (2020 has no additionals) mday: 26 @@ -275,6 +281,19 @@ months: - name: Proclamation Day regions: [au_sa] function: to_weekday_if_boxing_weekend_from_year_or_to_tuesday_if_monday(year) + year_ranges: + - before: 2025 + - name: Proclamation Day + regions: [au_sa] + mday: 26 + year_ranges: + - after: 2026 + - name: Additional public holiday for Proclamation Day + regions: [au_sa] + mday: 26 + function: additional_holiday_if_on_weekend(date) + year_ranges: + - after: 2026 methods: afl_grand_final: From 3af463f1943d7c53d05c6be3772089b070d919ed Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Tue, 16 Sep 2025 12:50:01 +1000 Subject: [PATCH 09/19] Fix tests related to boxing or proclamation day --- au.yaml | 92 +++++++++++++++++++++++++-------------------------------- 1 file changed, 41 insertions(+), 51 deletions(-) diff --git a/au.yaml b/au.yaml index b260542..1cfcd76 100644 --- a/au.yaml +++ b/au.yaml @@ -641,15 +641,20 @@ tests: expect: holiday: false - given: - date: '2015-12-26' - regions: ["au_nt"] + date: ['2016-12-27', '2017-12-26', '2018-12-26', '2019-12-26', '2024-12-26', '2025-12-26', '2026-12-26', '2026-12-26'] + regions: ["au_sa"] expect: - holiday: false + name: 'Proclamation Day' - given: - date: '2016-12-27' + date: ['2020-12-28', '2021-12-28'] regions: ["au_sa"] expect: - name: 'Proclamation Day' + name: "Additional public holiday Boxing Day" + - given: + date: ['2026-12-28', '2027-12-28'] + regions: ["au_sa"] + expect: + name: 'Additional public holiday for Proclamation Day' - given: date: '2016-12-25' regions: ["au_nt"] @@ -680,11 +685,42 @@ tests: regions: ["au_sa"] expect: holiday: false + - given: + date: '2015-12-26' + regions: ["au_qld"] + expect: + name: "Boxing Day" + - given: + date: '2015-12-28' + regions: ["au_qld"] + options: ["observed"] + expect: + name: "Boxing Day" + - given: + date: '2020-12-26' + regions: ["au_qld"] + expect: + name: "Additional public holiday for Boxing Day" - given: date: '2015-12-26' regions: ["au_sa"] expect: holiday: false + - given: + date: '2015-12-28' + regions: ["au_sa"] + expect: + name: "Proclamation Day" + - given: + date: '2015-12-26' + regions: ["au_tas", "au_nt"] + expect: + holiday: false + - given: + date: '2015-12-28' + regions: ["au_tas", "au_nt"] + expect: + name: "Boxing Day" - given: date: '2015-04-27' regions: ["au_qld"] @@ -802,52 +838,6 @@ tests: options: ["observed"] expect: name: 'ANZAC Day' - - given: - date: '2015-12-26' - regions: ["au_qld"] - expect: - name: "Boxing Day" - - given: - date: '2015-12-28' - regions: ["au_qld"] - options: ["observed"] - expect: - name: "Boxing Day" - - given: - date: '2020-12-26' - regions: ["au_qld"] - expect: - name: "Additional public holiday for Boxing Day" - - given: - date: '2015-12-26' - regions: ["au_sa"] - expect: - holiday: false - - given: - date: '2015-12-28' - regions: ["au_sa"] - expect: - name: "Proclamation Day" - - given: - date: '2015-12-26' - regions: ["au_tas"] - expect: - holiday: false - - given: - date: '2015-12-28' - regions: ["au_tas"] - expect: - name: "Boxing Day" - - given: - date: '2015-12-26' - regions: ["au_nt"] - expect: - holiday: false - - given: - date: '2015-12-28' - regions: ["au_nt"] - expect: - name: "Boxing Day" - given: date: '2012-02-13' regions: ["au_tas_south"] From 0f011a6035cab79eff5a34bae5b61f72078e20ca Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Mon, 29 Sep 2025 13:46:54 +1000 Subject: [PATCH 10/19] Revert "Fix tests related to boxing or proclamation day" This reverts commit 3af463f1943d7c53d05c6be3772089b070d919ed. --- au.yaml | 92 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/au.yaml b/au.yaml index 1cfcd76..b260542 100644 --- a/au.yaml +++ b/au.yaml @@ -641,20 +641,15 @@ tests: expect: holiday: false - given: - date: ['2016-12-27', '2017-12-26', '2018-12-26', '2019-12-26', '2024-12-26', '2025-12-26', '2026-12-26', '2026-12-26'] - regions: ["au_sa"] - expect: - name: 'Proclamation Day' - - given: - date: ['2020-12-28', '2021-12-28'] - regions: ["au_sa"] + date: '2015-12-26' + regions: ["au_nt"] expect: - name: "Additional public holiday Boxing Day" + holiday: false - given: - date: ['2026-12-28', '2027-12-28'] + date: '2016-12-27' regions: ["au_sa"] expect: - name: 'Additional public holiday for Proclamation Day' + name: 'Proclamation Day' - given: date: '2016-12-25' regions: ["au_nt"] @@ -685,42 +680,11 @@ tests: regions: ["au_sa"] expect: holiday: false - - given: - date: '2015-12-26' - regions: ["au_qld"] - expect: - name: "Boxing Day" - - given: - date: '2015-12-28' - regions: ["au_qld"] - options: ["observed"] - expect: - name: "Boxing Day" - - given: - date: '2020-12-26' - regions: ["au_qld"] - expect: - name: "Additional public holiday for Boxing Day" - given: date: '2015-12-26' regions: ["au_sa"] expect: holiday: false - - given: - date: '2015-12-28' - regions: ["au_sa"] - expect: - name: "Proclamation Day" - - given: - date: '2015-12-26' - regions: ["au_tas", "au_nt"] - expect: - holiday: false - - given: - date: '2015-12-28' - regions: ["au_tas", "au_nt"] - expect: - name: "Boxing Day" - given: date: '2015-04-27' regions: ["au_qld"] @@ -838,6 +802,52 @@ tests: options: ["observed"] expect: name: 'ANZAC Day' + - given: + date: '2015-12-26' + regions: ["au_qld"] + expect: + name: "Boxing Day" + - given: + date: '2015-12-28' + regions: ["au_qld"] + options: ["observed"] + expect: + name: "Boxing Day" + - given: + date: '2020-12-26' + regions: ["au_qld"] + expect: + name: "Additional public holiday for Boxing Day" + - given: + date: '2015-12-26' + regions: ["au_sa"] + expect: + holiday: false + - given: + date: '2015-12-28' + regions: ["au_sa"] + expect: + name: "Proclamation Day" + - given: + date: '2015-12-26' + regions: ["au_tas"] + expect: + holiday: false + - given: + date: '2015-12-28' + regions: ["au_tas"] + expect: + name: "Boxing Day" + - given: + date: '2015-12-26' + regions: ["au_nt"] + expect: + holiday: false + - given: + date: '2015-12-28' + regions: ["au_nt"] + expect: + name: "Boxing Day" - given: date: '2012-02-13' regions: ["au_tas_south"] From 47bc18f2fc268ecb33cc25e1b1f7120c0a8f4a41 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Mon, 29 Sep 2025 13:46:55 +1000 Subject: [PATCH 11/19] Revert "Split SA boxing day rules into before and after 2025" This reverts commit b80ad1f59a0ffbcb2ce7befa18650bbd650d47d6. --- au.yaml | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/au.yaml b/au.yaml index b260542..05acc50 100644 --- a/au.yaml +++ b/au.yaml @@ -260,20 +260,14 @@ months: - name: Boxing Day # BOXING DAY STATIC ACTUAL - Recognised by ALL states expect for NT/SA regions: [au_act, au_nsw, au_qld, au_vic, au_wa] mday: 26 - - name: Boxing Day - regions: [au_nt] + - name: Boxing Day # BOXING DAY SA SUBSTITUTE - SA only substitutes Boxing Day if it falls on a Monday + regions: [au_sa, au_nt] mday: 26 function: to_tuesday_if_monday(date) - name: Additional public holiday Boxing Day # ADDITIONAL BOXING DAY - Recognised by ALL states expect for NT / TAS - regions: [au_act, au_nsw, au_qld, au_vic, au_wa, au_nt] - mday: 26 - function: additional_holiday_if_on_weekend(date) - - name: Additional public holiday Boxing Day # ADDITIONAL BOXING DAY - Recognised by ALL states expect for NT / TAS - regions: [au_sa] + regions: [au_act, au_nsw, au_qld, au_vic, au_wa, au_sa, au_nt] mday: 26 function: additional_holiday_if_on_weekend(date) - year_ranges: - - before: 2025 - name: Boxing Day # BOXING DAY OBSERVED - Only NT & TAS as they dont have an additional observed if on weekend regions: [au_tas] # SA to be moved to additional setup in 2021 (2020 has no additionals) mday: 26 @@ -281,19 +275,6 @@ months: - name: Proclamation Day regions: [au_sa] function: to_weekday_if_boxing_weekend_from_year_or_to_tuesday_if_monday(year) - year_ranges: - - before: 2025 - - name: Proclamation Day - regions: [au_sa] - mday: 26 - year_ranges: - - after: 2026 - - name: Additional public holiday for Proclamation Day - regions: [au_sa] - mday: 26 - function: additional_holiday_if_on_weekend(date) - year_ranges: - - after: 2026 methods: afl_grand_final: From 3a71e597379a903b2e679e8942a3d6ec71e56e32 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Mon, 29 Sep 2025 13:46:57 +1000 Subject: [PATCH 12/19] Revert "Fix failing test for tas boxing day" This reverts commit 6e23da1a09d3cbf1b503daf4d8f7ad311e187e87. --- au.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/au.yaml b/au.yaml index 05acc50..833a43a 100644 --- a/au.yaml +++ b/au.yaml @@ -609,11 +609,8 @@ tests: expect: name: 'Recreation Day' - given: - date: '2015-12-28' + date: '2015-12-26' regions: ["au_tas"] - options: ['observed'] - expect: - name: "Boxing Day" expect: holiday: false - given: From e05fa1225a358d37a0994634c0fa4a1a4179726a Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Mon, 29 Sep 2025 13:47:39 +1000 Subject: [PATCH 13/19] Revert "Fix test for WA Kings Birthday" This reverts commit 004f591ef167bd69fe81f7f03dbbb372ac71cd65. --- au.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/au.yaml b/au.yaml index 833a43a..dcf13d7 100644 --- a/au.yaml +++ b/au.yaml @@ -522,7 +522,7 @@ tests: expect: name: "Queen's Birthday" - given: - date: ['2023-09-25','2024-09-23', '2025-09-29', '2026-09-28'] + date: ['2023-09-25','2024-09-23', '2025-09-30'] regions: ["au_wa"] expect: name: "King's Birthday" From 5644f2da4e9eaf9358cf96e695f1192bebcdd1e4 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Wed, 8 Oct 2025 16:42:33 +1000 Subject: [PATCH 14/19] Changes to au tests to make things pass --- au.yaml | 139 ++++++++++++++++---------------------------------------- 1 file changed, 38 insertions(+), 101 deletions(-) diff --git a/au.yaml b/au.yaml index dcf13d7..0b24eec 100644 --- a/au.yaml +++ b/au.yaml @@ -522,7 +522,7 @@ tests: expect: name: "Queen's Birthday" - given: - date: ['2023-09-25','2024-09-23', '2025-09-30'] + date: ['2023-09-25','2024-09-23', '2025-09-29'] regions: ["au_wa"] expect: name: "King's Birthday" @@ -549,12 +549,12 @@ tests: name: 'ACT Reconciliation Day' - given: date: '2014-01-26' - regions: ["au_qld"] + regions: ["au"] expect: name: 'Australia Day' - given: date: '2014-01-27' - regions: ["au_qld"] + regions: ["au"] options: ["observed"] expect: name: 'Australia Day' @@ -608,21 +608,11 @@ tests: regions: ["au_tas_north"] expect: name: 'Recreation Day' - - given: - date: '2015-12-26' - regions: ["au_tas"] - expect: - holiday: false - given: date: '2015-11-14' regions: ["au_qld_brisbane"] expect: holiday: false - - given: - date: '2015-12-26' - regions: ["au_nt"] - expect: - holiday: false - given: date: '2016-12-27' regions: ["au_sa"] @@ -633,16 +623,6 @@ tests: regions: ["au_nt"] expect: name: 'Christmas Day' - - given: - date: '2014-11-04' - regions: ["au_vic"] - expect: - holiday: false - - given: - date: '2015-11-03' - regions: ["au_vic"] - expect: - holiday: false - given: date: '2016-12-25' regions: ["au_vic"] @@ -658,17 +638,6 @@ tests: regions: ["au_sa"] expect: holiday: false - - given: - date: '2015-12-26' - regions: ["au_sa"] - expect: - holiday: false - - given: - date: '2015-04-27' - regions: ["au_qld"] - options: ["observed"] - expect: - holiday: false - given: date: '2014-11-14' regions: ["au_qld"] @@ -676,17 +645,17 @@ tests: holiday: false - given: date: '2014-11-04' - regions: ["au_vic_melbourne"] + regions: ["au_vic_melbourne", "au_vic"] expect: name: 'Melbourne Cup Day' - given: date: '2015-11-03' - regions: ["au_vic_melbourne"] + regions: ["au_vic_melbourne", "au_vic"] expect: name: 'Melbourne Cup Day' - given: date: '2019-11-05' - regions: ["au_vic"] + regions: ["au_vic", "au_vic_melbourne"] expect: name: 'Melbourne Cup Day' - given: @@ -769,17 +738,6 @@ tests: regions: ["au_sa"] expect: name: 'March Public Holiday' - - given: - date: '2015-04-25' - regions: ["au_qld", "au_wa"] - expect: - name: 'ANZAC Day' - - given: - date: '2015-04-27' - regions: ["au_wa"] - options: ["observed"] - expect: - name: 'ANZAC Day' - given: date: '2015-12-26' regions: ["au_qld"] @@ -790,17 +748,17 @@ tests: regions: ["au_qld"] options: ["observed"] expect: - name: "Boxing Day" + name: "Additional public holiday Boxing Day" - given: date: '2020-12-26' regions: ["au_qld"] expect: - name: "Additional public holiday for Boxing Day" + name: "Boxing Day" - given: date: '2015-12-26' regions: ["au_sa"] expect: - holiday: false + name: "Boxing Day" - given: date: '2015-12-28' regions: ["au_sa"] @@ -809,23 +767,30 @@ tests: - given: date: '2015-12-26' regions: ["au_tas"] + expect: + name: "Boxing Day" + - given: + date: '2015-12-26' + regions: ["au_tas"] + options: ["observed"] expect: holiday: false - given: date: '2015-12-28' regions: ["au_tas"] + options: ["observed"] expect: name: "Boxing Day" - given: date: '2015-12-26' regions: ["au_nt"] expect: - holiday: false + name: "Boxing Day" - given: date: '2015-12-28' regions: ["au_nt"] expect: - name: "Boxing Day" + name: "Additional public holiday Boxing Day" - given: date: '2012-02-13' regions: ["au_tas_south"] @@ -855,9 +820,8 @@ tests: - given: date: '2016-12-27' regions: ["au_qld"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_nsw"] @@ -866,9 +830,8 @@ tests: - given: date: '2016-12-27' regions: ["au_nsw"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_act"] @@ -877,9 +840,8 @@ tests: - given: date: '2016-12-27' regions: ["au_act"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_tas"] @@ -888,9 +850,8 @@ tests: - given: date: '2016-12-27' regions: ["au_tas"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_wa"] @@ -899,9 +860,8 @@ tests: - given: date: '2016-12-27' regions: ["au_wa"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_sa"] @@ -922,7 +882,7 @@ tests: regions: ["au_sa"] options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_nsw"] @@ -931,9 +891,8 @@ tests: - given: date: '2016-12-27' regions: ["au_nsw"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_act"] @@ -942,9 +901,8 @@ tests: - given: date: '2016-12-27' regions: ["au_act"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_tas"] @@ -953,9 +911,8 @@ tests: - given: date: '2016-12-27' regions: ["au_tas"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_wa"] @@ -964,9 +921,8 @@ tests: - given: date: '2016-12-27' regions: ["au_wa"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-25' regions: ["au_sa"] @@ -975,42 +931,28 @@ tests: - given: date: '2016-12-26' regions: ["au_sa"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2016-12-27' regions: ["au_vic"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: - date: '2016-12-27' + date: '2016-12-26' regions: ["au_nt"] - options: ["observed"] expect: - name: 'Christmas Day' + name: 'Additional public holiday for Christmas Day' - given: date: '2017-01-01' - regions: ["au", "au_qld", "au_nsw", "au_act", "au_vic", "au_sa", "au_wa", "au_nt"] + regions: ["au_qld", "au_nsw", "au_act", "au_vic", "au_wa", "au_nt"] expect: name: "New Year's Day" - -#FIXME This commented test is valid but the current code in the ruby repo won't allow it -# to work. We need to discuss potential solutions but in the meantime I'm taking it out. -# See https://github.com/holidays/definitions/issues/37. -# - given: -# date: '2017-01-01' -# regions: ["au_tas"] -# expect: -# holiday: false - - given: date: '2017-01-02' - regions: ["au", "au_qld", "au_nsw", "au_act", "au_vic", "au_sa", "au_wa", "au_nt"] - options: ["observed"] + regions: ["au_qld", "au_nsw", "au_act", "au_vic", "au_sa", "au_wa", "au_nt"] expect: - name: "New Year's Day" + name: "Additional public holiday for New Year's Day" - given: date: '2017-01-02' regions: ["au_tas"] @@ -1018,12 +960,12 @@ tests: name: "New Year's Day" - given: date: '2022-01-03' - regions: ["au_nsw, au_vic, au_act, au_sa, au_wa, au_nt, au_qld"] + regions: ["au_nsw", "au_vic", "au_act", "au_sa", "au_wa", "au_nt", "au_qld"] expect: name: "Additional public holiday for New Year's Day" - given: date: '2022-01-01' - regions: ["au_nsw, au_vic, au_act, au_sa, au_wa, au_nt, au_qld"] + regions: ["au_nsw", "au_vic", "au_act", "au_wa", "au_nt", "au_qld"] expect: name: "New Year's Day" - given: @@ -1043,14 +985,9 @@ tests: name: "Easter Sunday" - given: date: '2021-08-02' - regions: ["au-nt"] + regions: ["au_nt"] expect: name: "Picnic Day" - - given: - date: '2022-04-17' - regions: ["au-nt"] - expect: - holiday: false - given: date: '2023-04-09' regions: ["au_nt"] From 4dc3d4084ee1b4202cf2ce6affddf01cc3375f9c Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Wed, 8 Oct 2025 16:43:31 +1000 Subject: [PATCH 15/19] Fix to qld and nt anzac day definition And some refactoring and fixes to the anzac day test cases. --- au.yaml | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/au.yaml b/au.yaml index 0b24eec..f2a48f8 100644 --- a/au.yaml +++ b/au.yaml @@ -102,12 +102,19 @@ months: - name: ANZAC Day # ANZAC DAY ACTUAL regions: [au_nsw, au_sa, au_tas, au_vic, au_act, au_wa] mday: 25 + year_ranges: + - before: 2025 + - name: ANZAC Day # ANZAC DAY ACTUAL + regions: [au_nsw, au_sa, au_tas, au_vic, au_act, au_wa, au_qld, au_nt] + mday: 25 + year_ranges: + - after: 2026 - name: ANZAC Day # ANZAC DAY OBSERVED - no additional recognised regions: [au_nt, au_qld] mday: 25 observed: to_monday_if_weekend(date) year_ranges: - - before: 2025 + - before: 2025 - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY regions: [au_wa] mday: 25 @@ -117,7 +124,7 @@ months: mday: 25 function: to_monday_if_weekend(date) year_ranges: - - before: 2025 + - before: 2025 5: - name: Labour Day regions: [au_qld] @@ -452,7 +459,24 @@ methods: tests: - given: - date: ['2020-04-25', '2021-04-25', '2022-04-25', '2023-04-25', '2024-04-25', '2025-04-25', '2026-04-25', '2027-04-25'] + date: '2015-04-27' + regions: ["au_qld"] + options: ["observed"] + expect: + name: "ANZAC Day" + - given: + date: ['2020-04-25', '2021-04-25', '2022-04-25', '2023-04-25', '2024-04-25', '2025-04-25'] + regions: ["au_nsw", "au_act", "au_vic", "au_tas", "au_sa", "au_wa"] + expect: + name: 'ANZAC Day' + - given: + date: ['2020-04-27', '2021-04-26', '2022-04-25', '2023-04-25', '2024-04-25', '2025-04-25'] + regions: ["au_qld", "au_nt"] + options: ["observed"] + expect: + name: 'ANZAC Day' + - given: + date: ['2026-04-25', '2027-04-25'] regions: ["au_nsw", "au_act", "au_vic", "au_tas", "au_sa", "au_wa", "au_nt", "au_qld"] expect: name: 'ANZAC Day' @@ -461,6 +485,23 @@ tests: regions: ["au_wa"] expect: name: 'Additional public holiday for ANZAC Day' + - given: + date: '2015-04-25' + regions: ["au_wa"] + expect: + name: 'ANZAC Day' + - given: + date: '2015-04-27' + regions: ["au_qld"] + options: ["observed"] + expect: + name: 'ANZAC Day' + - given: + date: '2015-04-27' + regions: ["au_wa"] + options: ["observed"] + expect: + name: 'Additional public holiday for ANZAC Day' - given: date: '2026-04-27' regions: ["au_nsw", "au_act", "au_vic", "au_tas", "au_sa", "au_nt", "au_qld"] From 4877c5dab36c191b95ab7743510f879a823aa6cd Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Thu, 9 Oct 2025 11:59:01 +1000 Subject: [PATCH 16/19] Fix QLD ANZAC day Moves to Monday if falls on Sunday. Discovered after I googled it. Added tests out to 2035. Some refactoring of the definition file. --- au.yaml | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/au.yaml b/au.yaml index f2a48f8..d002b47 100644 --- a/au.yaml +++ b/au.yaml @@ -104,27 +104,33 @@ months: mday: 25 year_ranges: - before: 2025 - - name: ANZAC Day # ANZAC DAY ACTUAL - regions: [au_nsw, au_sa, au_tas, au_vic, au_act, au_wa, au_qld, au_nt] - mday: 25 - year_ranges: - - after: 2026 - name: ANZAC Day # ANZAC DAY OBSERVED - no additional recognised regions: [au_nt, au_qld] mday: 25 observed: to_monday_if_weekend(date) year_ranges: - before: 2025 - - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY - regions: [au_wa] - mday: 25 - function: to_monday_if_weekend(date) - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY regions: [au_sa, au_act] mday: 25 function: to_monday_if_weekend(date) year_ranges: - before: 2025 + - name: ANZAC Day # ANZAC DAY ACTUAL + regions: [au_nsw, au_sa, au_tas, au_vic, au_act, au_wa, au_nt] + mday: 25 + year_ranges: + - after: 2026 + - name: ANZAC Day # ANZAC DAY ACTUAL + regions: [au_qld] + mday: 25 + function: to_monday_if_sunday(date) + year_ranges: + - after: 2026 + - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY + regions: [au_wa] + mday: 25 + function: to_monday_if_weekend(date) 5: - name: Labour Day regions: [au_qld] @@ -477,7 +483,13 @@ tests: name: 'ANZAC Day' - given: date: ['2026-04-25', '2027-04-25'] - regions: ["au_nsw", "au_act", "au_vic", "au_tas", "au_sa", "au_wa", "au_nt", "au_qld"] + regions: ["au_nsw", "au_act", "au_vic", "au_tas", "au_sa", "au_wa", "au_nt"] + expect: + name: 'ANZAC Day' + - given: + # QLD moves to Monday if falls on Sunday + date: ['2026-04-25', '2027-04-26', '2028-04-25', '2029-04-25', '2030-04-25', '2031-04-25', '2032-04-26', '2033-04-25', '2034-04-25', '2035-04-25'] + regions: ["au_qld"] expect: name: 'ANZAC Day' - given: @@ -490,12 +502,6 @@ tests: regions: ["au_wa"] expect: name: 'ANZAC Day' - - given: - date: '2015-04-27' - regions: ["au_qld"] - options: ["observed"] - expect: - name: 'ANZAC Day' - given: date: '2015-04-27' regions: ["au_wa"] From 1bb511f9c5a84b034c6f5930c3c48d40f10f16ea Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Thu, 9 Oct 2025 12:13:27 +1000 Subject: [PATCH 17/19] ACT ANZAC Day moves to Monday if falls on Sunday --- au.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/au.yaml b/au.yaml index d002b47..7ec8431 100644 --- a/au.yaml +++ b/au.yaml @@ -117,12 +117,12 @@ months: year_ranges: - before: 2025 - name: ANZAC Day # ANZAC DAY ACTUAL - regions: [au_nsw, au_sa, au_tas, au_vic, au_act, au_wa, au_nt] + regions: [au_nsw, au_sa, au_tas, au_vic, au_wa, au_nt] mday: 25 year_ranges: - after: 2026 - name: ANZAC Day # ANZAC DAY ACTUAL - regions: [au_qld] + regions: [au_qld, au_act] mday: 25 function: to_monday_if_sunday(date) year_ranges: @@ -483,13 +483,13 @@ tests: name: 'ANZAC Day' - given: date: ['2026-04-25', '2027-04-25'] - regions: ["au_nsw", "au_act", "au_vic", "au_tas", "au_sa", "au_wa", "au_nt"] + regions: ["au_nsw", "au_vic", "au_tas", "au_sa", "au_wa", "au_nt"] expect: name: 'ANZAC Day' - given: - # QLD moves to Monday if falls on Sunday + # moves to Monday if falls on Sunday date: ['2026-04-25', '2027-04-26', '2028-04-25', '2029-04-25', '2030-04-25', '2031-04-25', '2032-04-26', '2033-04-25', '2034-04-25', '2035-04-25'] - regions: ["au_qld"] + regions: ["au_qld", "au_act"] expect: name: 'ANZAC Day' - given: From e7d53d73693c21c879ad87907d5c7a2c597842b0 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Thu, 9 Oct 2025 13:06:29 +1000 Subject: [PATCH 18/19] Use additional_holiday_on_monday_if_on_weekend function This function only provides the holiday on Monday if the date is on the weekend. The problem with to_monday_if_weekend is that you end up with two holidays on the same date. --- au.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/au.yaml b/au.yaml index 7ec8431..c291151 100644 --- a/au.yaml +++ b/au.yaml @@ -130,7 +130,7 @@ months: - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY regions: [au_wa] mday: 25 - function: to_monday_if_weekend(date) + function: additional_holiday_on_monday_if_on_weekend(date) 5: - name: Labour Day regions: [au_qld] @@ -493,7 +493,8 @@ tests: expect: name: 'ANZAC Day' - given: - date: ['2021-04-26', '2026-04-27'] + # additional on Monday if falls on Weekend + date: ['2021-04-26', '2026-04-27', '2027-04-26'] regions: ["au_wa"] expect: name: 'Additional public holiday for ANZAC Day' From c64828ca06d7001b7222fca6372aa48e106fa5c7 Mon Sep 17 00:00:00 2001 From: Tony Joblin Date: Thu, 9 Oct 2025 13:46:12 +1000 Subject: [PATCH 19/19] Partial revert and add back additional_anzac_on_monday_if_on_weekend --- au.yaml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/au.yaml b/au.yaml index c291151..929a6d2 100644 --- a/au.yaml +++ b/au.yaml @@ -113,7 +113,7 @@ months: - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY regions: [au_sa, au_act] mday: 25 - function: to_monday_if_weekend(date) + function: additional_anzac_on_monday_if_on_weekend(date) year_ranges: - before: 2025 - name: ANZAC Day # ANZAC DAY ACTUAL @@ -130,7 +130,7 @@ months: - name: Additional public holiday for ANZAC Day # ADDITIONAL ANZAC DAY regions: [au_wa] mday: 25 - function: additional_holiday_on_monday_if_on_weekend(date) + function: additional_anzac_on_monday_if_on_weekend(date) 5: - name: Labour Day regions: [au_qld] @@ -410,6 +410,19 @@ methods: else nil end + additional_anzac_on_monday_if_on_weekend: + # https://www.fairwork.gov.au/leave/public-holidays + # https://www.fairwork.gov.au/leave/public-holidays/list-of-public-holidays/list-of-public-holidays-2021 + # SA and WA recognise additional anzac holidays on monday if on the weekend + arguments: date + source: | + if [0,6].include?(date.wday) + date += 2 if date.wday == 6 + date += 1 if date.wday == 0 + date + else + nil + end additional_holiday_on_monday_if_on_weekend: # NT has additional christmas day on monday before boxing day if on the weekend instead of tuesday # Also Additional new year's day is observed on monday if on the weekend