diff --git a/data/index.yaml b/data/index.yaml index 61f5391..aa9d14f 100644 --- a/data/index.yaml +++ b/data/index.yaml @@ -16,6 +16,7 @@ defs: NL: ['nl.yaml'] "NO": ['no.yaml'] NYSE: ['nyse.yaml'] + NZ: ['nz.yaml'] PT: ['pt.yaml'] US: ['us.yaml', 'north_america_informal.yaml'] United_Nations: ['united_nations.yaml'] diff --git a/data/nz.yaml b/data/nz.yaml new file mode 100644 index 0000000..2b461ef --- /dev/null +++ b/data/nz.yaml @@ -0,0 +1,141 @@ +# New Zealand holiday definitions for the Ruby Holiday gem. +# Updated: 2010-03-28. +# Sources: +# - http://en.wikipedia.org/wiki/Public_holidays_in_New_Zealand +--- +months: + 0: + - name: Good Friday + regions: [nz] + function: easter(year)-2 + - name: Easter Saturday + regions: [nz] + function: easter(year)-1 + - name: Easter Monday + regions: [nz] + function: easter(year)+1 + 1: + - name: New Year's Day + regions: [nz] + mday: 1 + observed: to_monday_if_weekend + - name: Day after New Year's Day + regions: [nz] + mday: 2 + observed: to_weekday_if_boxing_weekend + - name: Southland Anniversary Day + regions: [nz_sl] + mday: 17 + - name: Wellington Anniversary Day + regions: [nz_we] + mday: 22 + observed: closest_monday + - name: Auckland Anniversary Day + regions: [nz_ak] + mday: 29 + observed: closest_monday + - name: Northland Anniversary Day + regions: [nz_nl] + mday: 29 + observed: closest_monday + 2: + - name: Nelson Anniversary Day + regions: [nz_ak] + mday: 1 + observed: closest_monday + - name: Waitangi Day + regions: [au] + mday: 6 + 3: + - name: Otago Anniversary Day + regions: [nz_ot] + mday: 23 + observed: closest_monday + - name: Taranaki Anniversary Day + regions: [nz_ak] + week: 2 + wday: 1 + 4: + - name: ANZAC Day + regions: [au] + mday: 25 + 6: + - name: Queen's Birthday + regions: [nz] + week: 1 + wday: 1 + 9: + - name: Dominion Day + regions: [nz_sc] + week: 4 + wday: 1 + 10: + - name: Hawke's bay Anniversary Day + regions: [nz_hb] + week: 1 + wday: 1 + observed: previous_friday + - name: Labour Day + regions: [nz] + week: 4 + wday: 1 + - name: Marlborough Anniversary Day + regions: [nz_mb] + week: 4 + wday: 1 + observed: next_week + 11: + - name: Canterbury Anniversary Day + regions: [nz_ca] + week: 2 + wday: 5 + - name: Chatham Island Anniversary Day + regions: [nz_ch] + mday: 30 + observed: closest_monday + 12: + - name: Westland Anniversary Day + regions: [nz_wl] + mday: 1 + observed: closest_monday + - name: Christmas Day + regions: [nz] + mday: 25 + observed: to_monday_if_weekend + - name: Boxing Day + regions: [nz] + mday: 26 + observed: to_weekday_if_boxing_weekend +tests: | + {Date.civil(2007,1,1) => 'New Year\'s Day', + Date.civil(2007,1,2) => 'Day after New Year\'s Day', + Date.civil(2007,2,6) => 'Waitangi', + Date.civil(2007,4,6) => 'Good Friday', + Date.civil(2007,4,9) => 'Easter Monday', + Date.civil(2007,4,25) => 'ANZAC Day', + Date.civil(2007,12,25) => 'Christmas Day', + Date.civil(2007,12,26) => 'Boxing Day'}.each do |date, name| + assert_equal name, Holidays.on(date, :nz, :informal)[0][:name] + end +methods: + closest_monday: | + def self.closest_monday(date) + if [1, 2, 3, 4].include?(date.wday) + date -= (date.wday - 1) + elsif 0 == date.wday + date += 1 + else + date += 8 - date.wday + end + date + end + + previous_friday: | + def self.previous_friday(date) + date - 3 + end + + next_week: | + def self.next_week(date) + date + 7 + end \ No newline at end of file diff --git a/lib/holidays/MANIFEST b/lib/holidays/MANIFEST index 277e7a9..c88f543 100644 --- a/lib/holidays/MANIFEST +++ b/lib/holidays/MANIFEST @@ -17,6 +17,7 @@ The following definition files are included in this installation: * holidays/nl * holidays/north_america * holidays/nyse +* holidays/nz * holidays/pt * holidays/scandinavia * holidays/se diff --git a/lib/holidays/nz.rb b/lib/holidays/nz.rb new file mode 100644 index 0000000..6a1d5d9 --- /dev/null +++ b/lib/holidays/nz.rb @@ -0,0 +1,69 @@ +# coding: utf-8 +module Holidays + # This file is generated by the Ruby Holiday gem. + # + # Definitions loaded: data/nz.yaml + # + # To use the definitions in this file, load them right after you load the + # Holiday gem: + # + # require 'holidays' + # require 'holidays/nz' + # + # More definitions are available at http://code.dunae.ca/holidays. + module NZ # :nodoc: + DEFINED_REGIONS = [:nz_ca, :nz_ch, :nz, :nz_wl, :nz_sl, :nz_we, :nz_ak, :nz_nl, :au, :nz_ot, :nz_sc, :nz_hb, :nz_mb] + + HOLIDAYS_BY_MONTH = { + 0 => [{:function => lambda { |year| Holidays.easter(year)-2 }, :function_id => "easter(year)-2", :name => "Good Friday", :regions => [:nz]}, + {:function => lambda { |year| Holidays.easter(year)-1 }, :function_id => "easter(year)-1", :name => "Easter Saturday", :regions => [:nz]}, + {:function => lambda { |year| Holidays.easter(year)+1 }, :function_id => "easter(year)+1", :name => "Easter Monday", :regions => [:nz]}], + 11 => [{:wday => 5, :week => 2, :name => "Canterbury Anniversary Day", :regions => [:nz_ca]}, + {:mday => 30, :observed => lambda { |date| Holidays.closest_monday(date) }, :observed_id => "closest_monday", :name => "Chatham Island Anniversary Day", :regions => [:nz_ch]}], + 6 => [{:wday => 1, :week => 1, :name => "Queen's Birthday", :regions => [:nz]}], + 1 => [{:mday => 1, :observed => lambda { |date| Holidays.to_monday_if_weekend(date) }, :observed_id => "to_monday_if_weekend", :name => "New Year's Day", :regions => [:nz]}, + {:mday => 2, :observed => lambda { |date| Holidays.to_weekday_if_boxing_weekend(date) }, :observed_id => "to_weekday_if_boxing_weekend", :name => "Day after New Year's Day", :regions => [:nz]}, + {:mday => 17, :name => "Southland Anniversary Day", :regions => [:nz_sl]}, + {:mday => 22, :observed => lambda { |date| Holidays.closest_monday(date) }, :observed_id => "closest_monday", :name => "Wellington Anniversary Day", :regions => [:nz_we]}, + {:mday => 29, :observed => lambda { |date| Holidays.closest_monday(date) }, :observed_id => "closest_monday", :name => "Auckland Anniversary Day", :regions => [:nz_ak]}, + {:mday => 29, :observed => lambda { |date| Holidays.closest_monday(date) }, :observed_id => "closest_monday", :name => "Northland Anniversary Day", :regions => [:nz_nl]}], + 12 => [{:mday => 1, :observed => lambda { |date| Holidays.closest_monday(date) }, :observed_id => "closest_monday", :name => "Westland Anniversary Day", :regions => [:nz_wl]}, + {:mday => 25, :observed => lambda { |date| Holidays.to_monday_if_weekend(date) }, :observed_id => "to_monday_if_weekend", :name => "Christmas Day", :regions => [:nz]}, + {:mday => 26, :observed => lambda { |date| Holidays.to_weekday_if_boxing_weekend(date) }, :observed_id => "to_weekday_if_boxing_weekend", :name => "Boxing Day", :regions => [:nz]}], + 2 => [{:mday => 1, :observed => lambda { |date| Holidays.closest_monday(date) }, :observed_id => "closest_monday", :name => "Nelson Anniversary Day", :regions => [:nz_ak]}, + {:mday => 6, :name => "Waitangi Day", :regions => [:au]}], + 3 => [{:mday => 23, :observed => lambda { |date| Holidays.closest_monday(date) }, :observed_id => "closest_monday", :name => "Otago Anniversary Day", :regions => [:nz_ot]}, + {:wday => 1, :week => 2, :name => "Taranaki Anniversary Day", :regions => [:nz_ak]}], + 9 => [{:wday => 1, :week => 4, :name => "Dominion Day", :regions => [:nz_sc]}], + 4 => [{:mday => 25, :name => "ANZAC Day", :regions => [:au]}], + 10 => [{:wday => 1, :week => 1, :observed => lambda { |date| Holidays.previous_friday(date) }, :observed_id => "previous_friday", :name => "Hawke's bay Anniversary Day", :regions => [:nz_hb]}, + {:wday => 1, :week => 4, :name => "Labour Day", :regions => [:nz]}, + {:wday => 1, :week => 4, :observed => lambda { |date| Holidays.next_week(date) }, :observed_id => "next_week", :name => "Marlborough Anniversary Day", :regions => [:nz_mb]}] + } + end + +def self.closest_monday(date) + if [1, 2, 3, 4].include?(date.wday) + date -= (date.wday - 1) + elsif 0 == date.wday + date += 1 + else + date += 8 - date.wday + end + date +end + + +def self.next_week(date) + date + 7 +end + +def self.previous_friday(date) + date - 3 +end + + + +end + +Holidays.merge_defs(Holidays::NZ::DEFINED_REGIONS, Holidays::NZ::HOLIDAYS_BY_MONTH) diff --git a/test/defs/test_defs_nz.rb b/test/defs/test_defs_nz.rb new file mode 100644 index 0000000..b6b7287 --- /dev/null +++ b/test/defs/test_defs_nz.rb @@ -0,0 +1,22 @@ +require File.dirname(__FILE__) + '/../test_helper' +require 'holidays/nz' + +# This file is generated by the Ruby Holiday gem. +# +# Definitions loaded: data/nz.yaml +class NzDefinitionTests < Test::Unit::TestCase # :nodoc: + + def test_nz +{Date.civil(2007,1,1) => 'New Year\'s Day', + Date.civil(2007,1,2) => 'Day after New Year\'s Day', + Date.civil(2007,2,6) => 'Waitangi', + Date.civil(2007,4,6) => 'Good Friday', + Date.civil(2007,4,9) => 'Easter Monday', + Date.civil(2007,4,25) => 'ANZAC Day', + Date.civil(2007,12,25) => 'Christmas Day', + Date.civil(2007,12,26) => 'Boxing Day'}.each do |date, name| + assert_equal name, Holidays.on(date, :nz, :informal)[0][:name] +end + + end +end