diff --git a/README b/README index 1d70098..6628ca6 100644 --- a/README +++ b/README @@ -16,9 +16,9 @@ Extends Ruby's built-in Date class and supports custom holiday definition lists. # Get all holidays in July, 2008 in Canada and the US from = Date.civil(2008,7,1) to = Date.civil(2008,7,31) - Holidays.between(from, to, [:ca,:us]) + Holidays.between(from, to, :ca,:us) => [{:name => 'Canada Day',...} - {:name => 'Idenpendence Day',...}] + {:name => 'Independence Day',...}] ==== Extending Ruby's Date class diff --git a/CUSTOM DATES b/data/SYNTAX similarity index 62% rename from CUSTOM DATES rename to data/SYNTAX index a357f7d..fe138d1 100644 --- a/CUSTOM DATES +++ b/data/SYNTAX @@ -1,12 +1,4 @@ -= Custom dates with the Ruby Holidays Gem - -It's easy to add your own custom holiday definitions to the Holidays gem. In a nutshell: -1. Build a definition file -2. Run the rake task to make a custom module -3. require your new module and enjoy! - - -== 1. Building the YAML file +== Holiday Gem Definition Syntax Definition files have two main parts: *months* and *methods*. Before you start, you may want to look some of the existing files at http://code.dunae.ca/svn/holidays/trunk/data. @@ -28,7 +20,6 @@ For example, the following holiday is on the first of January and available in t regions: [ca, us, au] mday: 1 - ===== Dates defined by a week number (e.g. first Monday of a month) [wday] Integer representing day of the week (0 = Sunday through 6 = Saturday). @@ -43,9 +34,6 @@ For example, the following holiday is on the first Monday of September and avail week: 1 wday: 1 - - - === Calculating dates with methods In addition to defining holidays by day or week, you can create custom methods to calculate a date. @@ -69,40 +57,29 @@ This would be represented in the months section as: 5: - name: Victoria Day regions: [ca] - function: lambda { |year| ca_victoria_day(year) } + function: ca_victoria_day(year) + +If a holiday can occur in different months (e.g. Easter) it can go in the '0' month. + + 0: + - name: Easter Monday + regions: [ca] + function: easter(year)+1 + +Calculated-date functions take the year (integer) as a parameter and must return either a Date object or an integer representing the day of the month. -Functions called in this manner must return either a Date object or an integer representing the day of the month. +=== Calculating observed dates + +Several built-in methods are available for holidays that are observed on varying dates. For example, for a holiday that is observed on Monday if it falls on a weekend you could write: + + 7: + - name: Canada Day + regions: [ca] + mday: 1 + observed: to_monday_if_weekend(date) + +Observed-date functions take a Date object as a parameter and must return either a Date object or an integer representing the day of the month. -== 2. Building the definition module - -Once you have your YAML definition file you need to generate a Ruby module using rake. - -To build the module for school holidays - - rake generate MyCustomDates custom.yaml - - -Your module can include definitions from multiple YAML files. - - rake generate MyCustomDates ca.yaml us.yaml mx.yaml custom.yaml - - -== 3. Using your custom definitions - -Your custom module is ready to use. - - require 'holidays' - require 'path/to/custom' - - Holidays.by_day(date, :your_region) - - - -=== Sharing - -If you've built a definition file that others might enjoy, why not share it? - -Send any definition files to 'code' at 'dunae.ca'. diff --git a/data/au.yaml b/data/au.yaml index b009965..d8b2975 100644 --- a/data/au.yaml +++ b/data/au.yaml @@ -1,6 +1,10 @@ # Australian holiday definitions for the Ruby Holiday gem. -# Updated: 2008-11-21. -# Source: http://en.wikipedia.org/wiki/Australian_public_holidays +# Updated: 2008-11-29. +# Sources: +# - http://en.wikipedia.org/wiki/Australian_public_holidays +# - http://www.docep.wa.gov.au/lr/LabourRelations/Content/Wages%20and%20Conditions/Public%20Holidays/Public_Holidays.html +# - http://www.wst.tas.gov.au/employment_info/public_holidays +# TODO: missing some regional holidays --- months: 0: @@ -28,8 +32,12 @@ months: regions: [au_wa] week: 1 wday: 1 + - name: Eight Hours Day + regions: [au_tas] + week: 2 + wday: 1 - name: Labour Day - regions: [au_vic, au_tas] + regions: [au_vic] week: 2 wday: 1 4: @@ -38,12 +46,20 @@ months: mday: 25 5: - name: Labour Day - regions: [au_qld, au_nt] + regions: [au_qld] + week: 1 + wday: 1 + - name: May Day + regions: [au_nt] week: 1 wday: 1 6: + - name: Foundation Day + regions: [au_wa] + week: 1 + wday: 1 - name: Queen's Birthday - regions: [au] + regions: [au_act, au_nsw, au_sa, au_tas, au_nt, au_qld, au_vic] week: 2 wday: 1 - name: Queensland Day @@ -62,15 +78,3 @@ months: - 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/christian.yaml b/data/christian.yaml deleted file mode 100644 index 306b781..0000000 --- a/data/christian.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Christian holiday definitions for the Ruby Holiday gem. -# Updated 2008-11-21. ---- -0: -- name: Easter Sunday - regions: [christian] - function: easter(year) } -- name: Palm Sunday - regions: [christian] - function: easter(year)-7 } -- name: Good Friday - regions: [christian] - function: easter(year)-2 } -12: -- name: Christmas Day - regions: [christian] - mday: 25 diff --git a/data/za.yaml b/data/za.yaml index 8055fcf..6dfd644 100644 --- a/data/za.yaml +++ b/data/za.yaml @@ -1,6 +1,6 @@ # South African holiday definitions for the Ruby Holiday gem. # -# Updated: 2008-11-22. +# Updated: 2008-11-29. # Sources: # - http://en.wikipedia.org/wiki/Public_holidays_in_South_Africa # - http://www.info.gov.za/aboutsa/holidays.htm @@ -17,38 +17,48 @@ months: - name: New Year's Day regions: [za] mday: 1 + observed: to_monday_if_sunday 3: - name: Human Rights Day regions: [za] mday: 21 + observed: to_monday_if_sunday 4: - name: Freedom Day regions: [za] mday: 27 + observed: to_monday_if_sunday 5: - - name: Workers' Day + - name: Workers Day regions: [za] mday: 1 + observed: to_monday_if_sunday 6: - name: Youth Day regions: [za] mday: 16 + observed: to_monday_if_sunday 8: - name: National Women's Day regions: [za] mday: 9 + observed: to_monday_if_sunday 9: - name: Heritage Day regions: [za] mday: 24 + observed: to_monday_if_sunday 12: - name: Day of Reconciliation regions: [za] mday: 16 + observed: to_monday_if_sunday - name: Christmas Day regions: [za] mday: 25 + observed: to_monday_if_sunday - name: Day of Goodwill regions: [za] mday: 26 + observed: to_weekday_if_boxing_weekend diff --git a/lib/holidays/au.rb b/lib/holidays/au.rb index 899e265..2644361 100644 --- a/lib/holidays/au.rb +++ b/lib/holidays/au.rb @@ -11,38 +11,30 @@ module Holidays # # More definitions are available at http://code.dunae.ca/holidays. module AU # :nodoc: - DEFINED_REGIONS = [:au_qld, :au_nt, :au, :au_tas, :au_wa, :au_vic, :au_act, :au_nsw, :au_sa] + DEFINED_REGIONS = [:au_qld, :au_nt, :au, :au_tas, :au_wa, :au_act, :au_nsw, :au_sa, :au_vic] HOLIDAYS_BY_MONTH = { - 5 => [{:wday => 1, :week => 1, :name => "Labour Day", :regions => [:au_qld, :au_nt]}], + 5 => [{:wday => 1, :week => 1, :name => "Labour Day", :regions => [:au_qld]}, + {:wday => 1, :week => 1, :name => "May Day", :regions => [:au_nt]}], 0 => [{:function => lambda { |year| Holidays.easter(year)-2 }, :function_id => "easter(year)-2", :name => "Good Friday", :regions => [:au]}, {:function => lambda { |year| Holidays.easter(year)-1 }, :function_id => "easter(year)-1", :name => "Easter Saturday", :regions => [:au]}, {:function => lambda { |year| Holidays.easter(year)+1 }, :function_id => "easter(year)+1", :name => "Easter Monday", :regions => [:au]}, {:function => lambda { |year| Holidays.easter(year)+2 }, :function_id => "easter(year)+2", :name => "Easter Monday", :regions => [:au_tas]}], - 6 => [{:wday => 1, :week => 2, :name => "Queen's Birthday", :regions => [:au]}, + 6 => [{:wday => 1, :week => 1, :name => "Foundation Day", :regions => [:au_wa]}, + {:wday => 1, :week => 2, :name => "Queen's Birthday", :regions => [:au_act, :au_nsw, :au_sa, :au_tas, :au_nt, :au_qld, :au_vic]}, {:mday => 6, :type => :informal, :name => "Queensland Day", :regions => [:au_qld]}], 1 => [{:mday => 1, :name => "New Year's Day", :regions => [:au]}, {:mday => 26, :name => "Australia Day", :regions => [:au]}], 12 => [{:mday => 25, :name => "Christmas Day", :regions => [:au]}, {:mday => 26, :name => "Boxing Day", :regions => [:au]}], 3 => [{:wday => 1, :week => 1, :name => "Labour Day", :regions => [:au_wa]}, - {:wday => 1, :week => 2, :name => "Labour Day", :regions => [:au_vic, :au_tas]}], + {:wday => 1, :week => 2, :name => "Eight Hours Day", :regions => [:au_tas]}, + {:wday => 1, :week => 2, :name => "Labour Day", :regions => [:au_vic]}], 4 => [{:mday => 25, :name => "ANZAC Day", :regions => [:au]}], 10 => [{:wday => 1, :week => 1, :name => "Labour Day", :regions => [:au_act, :au_nsw, :au_sa]}] } 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 - end diff --git a/lib/holidays/za.rb b/lib/holidays/za.rb index 2d5e1af..b2b8aed 100644 --- a/lib/holidays/za.rb +++ b/lib/holidays/za.rb @@ -14,18 +14,18 @@ module Holidays DEFINED_REGIONS = [:za] HOLIDAYS_BY_MONTH = { - 5 => [{:mday => 1, :name => "Workers' Day", :regions => [:za]}], + 5 => [{:mday => 1, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "Workers Day", :regions => [:za]}], 0 => [{:function => lambda { |year| Holidays.easter(year)-2 }, :function_id => "easter(year)-2", :name => "Good Friday", :regions => [:za]}, {:function => lambda { |year| Holidays.easter(year)+1 }, :function_id => "easter(year)+1", :name => "Family Day", :regions => [:za]}], - 6 => [{:mday => 16, :name => "Youth Day", :regions => [:za]}], - 1 => [{:mday => 1, :name => "New Year's Day", :regions => [:za]}], - 12 => [{:mday => 16, :name => "Day of Reconciliation", :regions => [:za]}, - {:mday => 25, :name => "Christmas Day", :regions => [:za]}, - {:mday => 26, :name => "Day of Goodwill", :regions => [:za]}], - 8 => [{:mday => 9, :name => "National Women's Day", :regions => [:za]}], - 3 => [{:mday => 21, :name => "Human Rights Day", :regions => [:za]}], - 9 => [{:mday => 24, :name => "Heritage Day", :regions => [:za]}], - 4 => [{:mday => 27, :name => "Freedom Day", :regions => [:za]}] + 6 => [{:mday => 16, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "Youth Day", :regions => [:za]}], + 1 => [{:mday => 1, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "New Year's Day", :regions => [:za]}], + 12 => [{:mday => 16, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "Day of Reconciliation", :regions => [:za]}, + {:mday => 25, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "Christmas Day", :regions => [:za]}, + {:mday => 26, :observed => lambda { |date| Holidays.to_weekday_if_boxing_weekend(date) }, :observed_id => "to_weekday_if_boxing_weekend", :name => "Day of Goodwill", :regions => [:za]}], + 8 => [{:mday => 9, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "National Women's Day", :regions => [:za]}], + 3 => [{:mday => 21, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "Human Rights Day", :regions => [:za]}], + 9 => [{:mday => 24, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "Heritage Day", :regions => [:za]}], + 4 => [{:mday => 27, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "Freedom Day", :regions => [:za]}] } end diff --git a/rakefile.rb b/rakefile.rb index 6b08d00..af7d40d 100644 --- a/rakefile.rb +++ b/rakefile.rb @@ -98,7 +98,6 @@ EOH end end - desc 'Generate documentation.' Rake::RDocTask.new(:rdoc) do |rdoc| rdoc.rdoc_dir = 'doc' @@ -106,8 +105,8 @@ Rake::RDocTask.new(:rdoc) do |rdoc| rdoc.options << '--all' << '--inline-source' << '--line-numbers' rdoc.options << '--charset' << 'utf-8' rdoc.rdoc_files.include('README') + rdoc.rdoc_files.include('data/SYNTAX') rdoc.rdoc_files.include('lib/holidays/MANIFEST') - rdoc.rdoc_files.include('CUSTOM DATES') rdoc.rdoc_files.include('REFERENCES') rdoc.rdoc_files.include('LICENSE') rdoc.rdoc_files.include('lib/*.rb') diff --git a/test/test_region_europe.rb b/test/test_region_europe.rb index 54fc496..bd45ede 100644 --- a/test/test_region_europe.rb +++ b/test/test_region_europe.rb @@ -1,7 +1,7 @@ require File.dirname(__FILE__) + '/test_helper' require 'holidays/europe' -class RegionTests < Test::Unit::TestCase +class EuropeTests < Test::Unit::TestCase def test_de {Date.civil(2009,1,1) => 'Neujahrstag', Date.civil(2009,4,10) => 'Karfreitag',