diff --git a/create_defs.rb b/create_defs.rb index ffc26f3..547d28d 100644 --- a/create_defs.rb +++ b/create_defs.rb @@ -1,9 +1,9 @@ require 'yaml' -module_name = 'CA' +module_name = 'NorthAmerica' # Load the data files -files = ['data/ca.yaml', 'data/common_methods.yaml'] +files = ['data/ca.yaml', 'data/mx.yaml', 'data/us.yaml', 'data/common_methods.yaml', 'data/north_america_informal.yaml'] regions = [] rules_by_month = {} custom_methods = {} @@ -28,13 +28,13 @@ files.each do |file| exists = false rules_by_month[month].each do |ex| if ex['name'] == rule['name'] and ex['wday'] == rule['wday'] and ex['mday'] == rule['mday'] and ex['week'] == rule['week'] -# ex['regions'] << rule['regions'].flatten + ex['regions'] << rule['regions'].flatten exists = true end end - #unless exists + unless exists rules_by_month[month] << rule - #end + end end # /defs.each end diff --git a/data/au.yaml b/data/au.yaml new file mode 100644 index 0000000..6999a50 --- /dev/null +++ b/data/au.yaml @@ -0,0 +1,76 @@ +# Australian holiday definitions for the Ruby Holiday gem. +# Updated: 2008-11-21. +# Source: http://en.wikipedia.org/wiki/Australian_public_holidays +--- +months: + 0: + - name: Good Friday + regions: [au] + function: lambda { |year| easter(year)-2 } + - name: Easter Saturday + regions: [au] + function: lambda { |year| easter(year)-1 } + - name: Easter Monday + regions: [au] + function: lambda { |year| easter(year)+1 } + - name: Easter Monday + regions: [au_tas] + function: lambda { |year| easter(year)+2 } + 1: + - name: New Year's Day + regions: [au] + mday: 1 + - name: Australia Day + regions: [au] + mday: 26 + 3: + - name: Labour Day + regions: [au_wa] + week: 1 + wday: 1 + - name: Labour Day + regions: [au_vic, au_tas] + week: 2 + wday: 1 + 4: + - name: ANZAC Day + regions: [au] + mday: 25 + 5: + - name: Labour Day + regions: [au_qld, au_nt] + week: 1 + wday: 1 + 6: + - name: Queen's Birthday + regions: [au] + week: 2 + wday: 1 + - name: Queensland Day + regions: [au_qld] + mday: 6 + type: informal + 10: + - name: Labour Day + regions: [au_act, au_nsw, au_sa] + week: 1 + wday: 1 + 12: + - name: Christmas Day + regions: [au] + mday: 25 + - name: Boxing Day + regions: [au] + mday: 26 +methods: + ca_victoria_day: | + # Monday on or before May 24 + def self.ca_victoria_day(year) + date = Date.civil(year,5,24) + if date.wday > 1 + date -= (date.wday - 1) + elsif date.wday == 0 + date -= 6 + end + date + end \ No newline at end of file diff --git a/data/mx.yaml b/data/mx.yaml index db1e0ed..7042fac 100644 --- a/data/mx.yaml +++ b/data/mx.yaml @@ -1,56 +1,57 @@ # Mexican holiday definitions for the Ruby Holiday gem. # Updated 2008-11-21. --- -0: -- name: Good Thursday - regions: [mx] - function: lambda { |year| easter(year)-3 } -- name: Good Friday - regions: [mx] - function: lambda { |year| easter(year)-2 } -- name: Easter Sunday - regions: [mx] - function: lambda { |year| easter(year) } -1: -- name: New Year's Day - regions: [mx] - mday: 1 -- name: New Year's Day - regions: [mx] - mday: 2 -2: -- name: D\xC3\xADa de la Constituci\xC3\xB3n - week: 1 - regions: [mx] - wday: 1 -3: -- name: Natalicio de Benito Ju\xC3\xA1rez - week: 3 - regions: [mx] - wday: 1 -5: -- name: D\xC3\xADa del Trabajo - regions: [mx] - mday: 1 -- name: La Batalla de Puebla - regions: [mx] - mday: 5 -9: -- name: D\xC3\xADa de Independencia - regions: [mx] - mday: 16 -11: -- name: Dia de Muertos - regions: [mx] - mday: 2 -- name: D\xC3\xADa de la Revoluci\xC3\xB3n - week: 3 - regions: [mx] - wday: 1 -12: -- name: Our Lady of Guadalupe's day - regions: [mx] - mday: 12 -- name: Christmas Day - regions: [mx] - mday: 25 +months: + 0: + - name: Good Thursday + regions: [mx] + function: lambda { |year| easter(year)-3 } + - name: Good Friday + regions: [mx] + function: lambda { |year| easter(year)-2 } + - name: Easter Sunday + regions: [mx] + function: lambda { |year| easter(year) } + 1: + - name: New Year's Day + regions: [mx] + mday: 1 + - name: New Year's Day + regions: [mx] + mday: 2 + 2: + - name: D\xC3\xADa de la Constituci\xC3\xB3n + week: 1 + regions: [mx] + wday: 1 + 3: + - name: Natalicio de Benito Ju\xC3\xA1rez + week: 3 + regions: [mx] + wday: 1 + 5: + - name: D\xC3\xADa del Trabajo + regions: [mx] + mday: 1 + - name: La Batalla de Puebla + regions: [mx] + mday: 5 + 9: + - name: D\xC3\xADa de Independencia + regions: [mx] + mday: 16 + 11: + - name: Dia de Muertos + regions: [mx] + mday: 2 + - name: D\xC3\xADa de la Revoluci\xC3\xB3n + week: 3 + regions: [mx] + wday: 1 + 12: + - name: Our Lady of Guadalupe's day + regions: [mx] + mday: 12 + - name: Christmas Day + regions: [mx] + mday: 25 diff --git a/data/north_america_informal.yaml b/data/north_america_informal.yaml new file mode 100644 index 0000000..e51e062 --- /dev/null +++ b/data/north_america_informal.yaml @@ -0,0 +1,54 @@ +# Informal North American holiday definitions for the Ruby Holiday gem. +# Updated 2008-11-22. +--- +months: + 0: + - name: Good Friday + regions: [us] + function: lambda { |year| easter(year)-2 } + type: informal + 2: + - name: Groundhog Day + regions: [us, ca] + mday: 2 + type: informal + - name: Valentine's Day + regions: [us, ca] + mday: 14 + type: informal + 3: + - name: St. Patrick's Day + regions: [us, ca] + mday: 17 + type: informal + 4: + - name: April Fool's Day + regions: [us, ca] + mday: 1 + type: informal + - name: Earth Day + regions: [us, ca] + mday: 22 + type: informal + 5: + - name: Mother's Day + week: 2 + regions: [us, ca] + wday: 0 + type: informal + - name: Armed Forces Day + week: 3 + regions: [us] + wday: 6 + type: informal + 5: + - name: Father's Day + week: 3 + regions: [us, ca] + wday: 0 + type: informal + 10: + - name: Halloween + regions: [us, ca] + mday: 31 + type: informal diff --git a/data/us.yaml b/data/us.yaml index d11d119..1334303 100644 --- a/data/us.yaml +++ b/data/us.yaml @@ -1,47 +1,59 @@ # United States holiday definitions for the Ruby Holiday gem. -# Updated 2008-11-21. +# +# Updated: 2008-11-22. +# Source: http://en.wikipedia.org/wiki/Public_holidays_of_the_United_States --- -1: -- name: New Year's Day - regions: [us] - mday: 1 -- name: Martin Luther King, Jr. Day - week: 3 - regions: [us] - wday: 1 -3: -- name: George Washington's Birthday - week: 3 - regions: [us] - wday: 1 -5: -- name: Memorial Day - week: -1 - regions: [us] - wday: 1 -6: -- name: Flag Day - regions: [us] - mday: 14 -7: -- name: Independence Day - regions: [us] - mday: 4 -9: -- name: Labor Day - week: 1 - regions: [us] - wday: 1 -11: -- name: Veterans Day - regions: [us] - mday: 11 -- name: Thanksgiving Day - week: 4 - regions: [us] - wday: 4 -12: -- name: Christmas Day - regions: [us] - mday: 25 - wday: \ No newline at end of file +months: + 1: + - name: New Year's Day + regions: [us] + mday: 1 + - name: Martin Luther King, Jr. Day + week: 3 + regions: [us] + wday: 1 + - name: Inauguration Day + function: lambda { |year| us_inauguration_day(year) } + regions: [us] + 3: + - name: Presidents' Day + week: 3 + regions: [us] + wday: 1 + 5: + - name: Memorial Day + week: -1 + regions: [us] + wday: 1 + 7: + - name: Independence Day + regions: [us] + mday: 4 + 9: + - name: Labor Day + week: 1 + regions: [us] + wday: 1 + 10: + - name: Columbus Day + week: 2 + regions: [us] + wday: 1 + 11: + - name: Veterans Day + regions: [us] + mday: 11 + - name: Thanksgiving Day + week: 4 + regions: [us] + wday: 4 + 12: + - name: Christmas Day + regions: [us] + mday: 25 +methods: + us_inauguration_day: | + # January 20, every fourth year, following Presidential election + def self.us_inauguration_day(year) + year % 4 == 1 ? 20 : nil + end \ No newline at end of file diff --git a/lib/holidays/north_america.rb b/lib/holidays/north_america.rb new file mode 100644 index 0000000..e3cfe2e --- /dev/null +++ b/lib/holidays/north_america.rb @@ -0,0 +1,137 @@ +module Holidays + # This file is generated by the Ruby Holiday gem. + # + # Definitions loaded: data/ca.yaml, data/mx.yaml, data/us.yaml, data/common_methods.yaml, data/north_america_informal.yaml + # + # To use the definitions in the file, load them right after you load the + # Holiday gem: + # + # require 'holidays' + # require 'path/to/northamerica' + # + # More definitions are available at http://code.dunae.ca/holidays. + module NorthAmerica # :nodoc: + DEFINED_REGIONS = [:ca, :ca_qc, :mx, :us, :ca_nf, :ca_nt, :ca_nu, :ca_ab, :ca_on, :ca_sk, :ca_mb, :ca_bc, :ca_ns, :ca_yk] + + HOLIDAYS_BY_MONTH = { + 5 => [{:function => lambda { |year| ca_victoria_day(year) }, :name => "Victoria Day", :regions => [:ca]}, + {:function => lambda { |year| ca_victoria_day(year) }, :name => "National Patriotes Day", :regions => [:ca_qc]}, + {:mday => 1, :name => "D\xC3\xADa del Trabajo", :regions => [:mx]}, + {:mday => 5, :name => "La Batalla de Puebla", :regions => [:mx]}, + {:wday => 1, :week => -1, :name => "Memorial Day", :regions => [:us]}, + {:wday => 0, :week => 3, :name => "Father's Day", :regions => [:us, :ca]}], + 0 => [{:function => lambda { |year| easter(year)-2 }, :name => "Good Friday", :regions => [:ca, :mx, :us]}, + {:function => lambda { |year| easter(year)+1 }, :name => "Easter Monday", :regions => [:ca_qc]}, + {:function => lambda { |year| easter(year)-3 }, :name => "Good Thursday", :regions => [:mx]}, + {:function => lambda { |year| easter(year) }, :name => "Easter Sunday", :regions => [:mx]}], + 11 => [{:mday => 11, :name => "Rememberance Day", :regions => [:ca]}, + {:mday => 2, :name => "Dia de Muertos", :regions => [:mx]}, + {:wday => 1, :week => 3, :name => "D\xC3\xADa de la Revoluci\xC3\xB3n", :regions => [:mx]}, + {:mday => 11, :name => "Veterans Day", :regions => [:us]}, + {:wday => 4, :week => 4, :name => "Thanksgiving Day", :regions => [:us]}], + 6 => [{:mday => 24, :name => "Discovery Day", :regions => [:ca_nf]}, + {:mday => 24, :name => "Fête Nationale", :regions => [:ca_qc]}, + {:mday => 21, :name => "National Aboriginal Day", :regions => [:ca_nt]}], + 1 => [{:mday => 1, :name => "New Year's Day", :regions => [:ca, :mx, :us]}, + {:mday => 2, :name => "New Year's", :regions => [:ca_qc]}, + {:mday => 2, :name => "New Year's Day", :regions => [:mx]}, + {:wday => 1, :week => 3, :name => "Martin Luther King, Jr. Day", :regions => [:us]}, + {:function => lambda { |year| us_inauguration_day(year) }, :name => "Inauguration Day", :regions => [:us]}], + 12 => [{:mday => 25, :name => "Christmas Day", :regions => [:ca, :mx, :us]}, + {:mday => 26, :name => "Boxing Day", :regions => [:ca]}, + {:mday => 12, :name => "Our Lady of Guadalupe's day", :regions => [:mx]}], + 7 => [{:mday => 1, :name => "Canada Day", :regions => [:ca]}, + {:mday => 12, :name => "Orangemen's Day", :regions => [:ca_nf]}, + {:mday => 9, :name => "Nunavut Day", :regions => [:ca_nu]}, + {:mday => 4, :name => "Independence Day", :regions => [:us]}], + 2 => [{:wday => 1, :week => 3, :name => "Family Day", :regions => [:ca_ab, :ca_on, :ca_sk]}, + {:wday => 1, :week => 3, :name => "Louis Riel Day", :regions => [:ca_mb]}, + {:wday => 1, :week => 1, :name => "D\xC3\xADa de la Constituci\xC3\xB3n", :regions => [:mx]}, + {:mday => 2, :name => "Groundhog Day", :regions => [:us, :ca]}, + {:mday => 14, :name => "Valentine's Day", :regions => [:us, :ca]}], + 8 => [{:wday => 1, :week => 1, :name => "BC Day", :regions => [:ca_bc]}, + {:wday => 1, :week => 1, :name => "Saskatchewan Day", :regions => [:ca_sk]}, + {:wday => 1, :week => 1, :name => "Heritage Day", :regions => [:ca_ab]}, + {:wday => 1, :week => 1, :name => "Natal Day", :regions => [:ca_ns]}, + {:wday => 1, :week => 1, :name => "Civic Holiday", :regions => [:ca_on]}, + {:wday => 1, :week => 3, :name => "Discovery Day", :regions => [:ca_yk]}], + 3 => [{:mday => 23, :name => "St. George's Day", :regions => [:ca_nf]}, + {:wday => 1, :week => 3, :name => "Natalicio de Benito Ju\xC3\xA1rez", :regions => [:mx]}, + {:wday => 1, :week => 3, :name => "Presidents' Day", :regions => [:us]}, + {:mday => 17, :name => "St. Patrick's Day", :regions => [:us, :ca]}], + 9 => [{:wday => 1, :week => 1, :name => "Labour Day", :regions => [:ca]}, + {:mday => 16, :name => "D\xC3\xADa de Independencia", :regions => [:mx]}, + {:wday => 1, :week => 1, :name => "Labor Day", :regions => [:us]}], + 4 => [{:mday => 1, :name => "April Fool's Day", :regions => [:us, :ca]}, + {:mday => 22, :name => "Earth Day", :regions => [:us, :ca]}], + 10 => [{:wday => 1, :week => 2, :name => "Thanksgiving", :regions => [:ca]}, + {:wday => 1, :week => 2, :name => "Columbus Day", :regions => [:us]}, + {:mday => 31, :name => "Halloween", :regions => [:us, :ca]}] + } + +# Get the date of Easter in a given year. +# +# +year+ must be a valid Gregorian year. +# +# Returns a Date object. +#-- +# from http://snippets.dzone.com/posts/show/765 +# TODO: check year to ensure Gregorian +def self.easter(year) + y = year + a = y % 19 + b = y / 100 + c = y % 100 + d = b / 4 + e = b % 4 + f = (b + 8) / 25 + g = (b - f + 1) / 3 + h = (19 * a + b - d - g + 15) % 30 + i = c / 4 + k = c % 4 + l = (32 + 2 * e + 2 * i - h - k) % 7 + m = (a + 11 * h + 22 * l) / 451 + month = (h + l - 7 * m + 114) / 31 + day = ((h + l - 7 * m + 114) % 31) + 1 + Date.civil(year, month, day) +end + + +# Monday on or before May 24 +def self.ca_victoria_day(year) + date = Date.civil(year,5,24) + if date.wday > 1 + date -= (date.wday - 1) + elsif date.wday == 0 + date -= 6 + end + date +end + +# January 20, every fourth year, following Presidential election +def self.us_inauguration_day(year) + year % 4 == 1 ? 20 : nil +end + + + end +end + +Holidays.class_eval do + existing_regions = [] + if const_defined?(:DEFINED_REGIONS) + existing_regions = const_get(:DEFINED_REGIONS) + remove_const(:DEFINED_REGIONS) + end + const_set(:DEFINED_REGIONS, existing_regions | Holidays::NorthAmerica::DEFINED_REGIONS) + + existing_defs = {} + if const_defined?(:HOLIDAYS_BY_MONTH) + existing_defs = const_get(:HOLIDAYS_BY_MONTH) + remove_const(:HOLIDAYS_BY_MONTH) + end + #const_set(:HOLIDAYS_BY_MONTH, existing_defs.merge(Holidays::NorthAmerica::HOLIDAYS_BY_MONTH)) + const_set(:HOLIDAYS_BY_MONTH, Holidays::NorthAmerica::HOLIDAYS_BY_MONTH) + + include Holidays::NorthAmerica +end diff --git a/rakefile.rb b/rakefile.rb index ee7b3f1..890e6d0 100644 --- a/rakefile.rb +++ b/rakefile.rb @@ -14,6 +14,11 @@ Rake::TestTask.new do |t| t.verbose = false end +task :build_defs do + puts ARGV + puts ARGV[1] +end + desc 'Generate documentation.' Rake::RDocTask.new(:rdoc) do |rdoc|