== 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.
=== Months
Holidays are grouped by month from 1 through 12. Each entry within a month can have several fields.
[name] The name of the holiday.
[regions] One or more region codes.
===== Dates defined by a fixed date (e.g. January 1st)
[wday] Integer representing day of the month (1 through 31).
For example, the following holiday is on the first of January and available in the ca, us and au regions.
1:
- name: New Year's Day
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).
[week] Integer representing week number (1 = first week, 3 = third week, -1 = last week),
For example, the following holiday is on the first Monday of September and available in the ca region.
9:
- name: Labour Day
regions: [ca]
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.
For example, Canada celebrates Victoria Day, which falls on the Monday on or before May 24. So, under the methods section we could create a custom method that returns a Date object.
methods:
ca_victoria_day: |
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
This would be represented in the months section as:
5:
- name: Victoria Day
regions: [ca]
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.
=== 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)
Methods included in the Holidays module are:
* Holidays#to_monday_if_sunday
* Holidays#to_monday_if_weekend
* Holidays#to_weekday_if_boxing_weekend
* Holidays#to_weekday_if_weekend
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.