Added basic mixin infrastructure
Converted data files to YAML Updated definition generator
This commit is contained in:
parent
1f11004bd7
commit
99874179df
15 changed files with 474 additions and 68 deletions
|
@ -10,6 +10,7 @@ I am grateful to the following sources.
|
|||
* http://www.smart.net/~mmontes/ec-cal.html
|
||||
|
||||
==== World dates
|
||||
* http://www.un.org/geninfo/faq/factsheets/FS18.HTM
|
||||
* http://en.wikipedia.org/wiki/List_of_holidays_by_country
|
||||
|
||||
==== US dates
|
||||
|
|
|
@ -1,44 +1,47 @@
|
|||
require 'fastercsv'
|
||||
require 'yaml'
|
||||
|
||||
files = ['data/ca.csv', 'data/christian.csv', 'data/us.csv']
|
||||
regions = {}
|
||||
module_name = 'TestModule'
|
||||
|
||||
# Load the data files
|
||||
files = ['data/ca.yaml']
|
||||
regions = [] #wtf
|
||||
rules_by_month = {}
|
||||
files.each do |file|
|
||||
FasterCSV.foreach(file, {:headers => :first_row, :return_headers => false, :force_quotes => true}) do |row|
|
||||
month = row['month'].to_i
|
||||
rules_by_month[month] = [] unless rules_by_month[month]
|
||||
custom_methods = {}
|
||||
|
||||
files.each do |file|
|
||||
def_file = YAML.load_file(file)
|
||||
def_file['months'].each do |month, definitions|
|
||||
rules_by_month[month] = []
|
||||
definitions.each do |definition|
|
||||
rule = {}
|
||||
row.each do |key, val|
|
||||
definition.each do |key, val|
|
||||
rule[key] = val
|
||||
end
|
||||
regions[rule['regions'].to_sym] = true
|
||||
rule['regions'] = [rule['regions']]
|
||||
regions = rule['regions'].collect { |r| r.to_sym }
|
||||
rule['regions'] = regions
|
||||
|
||||
# TODO: convert weeks to symbols
|
||||
# added data checking
|
||||
|
||||
# check if this rule already exists from another region
|
||||
existed = 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
|
||||
existed = true
|
||||
end
|
||||
|
||||
end
|
||||
# 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
|
||||
# existed = true
|
||||
# end
|
||||
# end
|
||||
unless existed
|
||||
rules_by_month[month] << rule
|
||||
end
|
||||
|
||||
end # /defs.each
|
||||
|
||||
def_file['methods'].each do |name, code|
|
||||
custom_methods[name] = code
|
||||
end # /methods.each
|
||||
end
|
||||
end
|
||||
|
||||
out = "# This file is generated by one of the Ruby Holiday gem's Rake tasks.\n"
|
||||
out << "DEFINED_REGIONS = [:" + regions.keys.join(', :') + "]\n\n"
|
||||
|
||||
out << "HOLIDAYS_BY_MONTH = {\n"
|
||||
|
||||
|
||||
# Build the definitions
|
||||
month_strs = []
|
||||
rules_by_month.each do |month, rules|
|
||||
month_str = " #{month.to_s} => ["
|
||||
|
@ -63,7 +66,50 @@ end
|
|||
|
||||
month_strs.join(",\n")
|
||||
|
||||
out << month_strs.join(",\n") + "\n}"
|
||||
|
||||
# Build the methods
|
||||
method_str = ''
|
||||
custom_methods.each do |key, code|
|
||||
method_str << code + "\n\n"
|
||||
end
|
||||
|
||||
|
||||
# Build the output file
|
||||
out =<<-EOC
|
||||
# This file is generated by the Ruby Holiday gem.
|
||||
#
|
||||
# To use the definitions in the file, load them right after you load the
|
||||
# Holiday gem:
|
||||
#
|
||||
# require 'holidays'
|
||||
# require 'path/to/#{module_name.downcase}'
|
||||
#
|
||||
# More definitions are available at http://code.dunae.ca/holidays.
|
||||
#
|
||||
# Definitions loaded: #{files.join(',')}
|
||||
module Holidays
|
||||
module #{module_name}
|
||||
DEFINED_REGIONS = [:#{regions.join(', :')}]
|
||||
|
||||
HOLIDAYS_BY_MONTH = {
|
||||
#{month_strs.join(",\n")}
|
||||
}
|
||||
|
||||
#{method_str}
|
||||
end
|
||||
end
|
||||
|
||||
Holidays.class_eval do
|
||||
new_regions = []
|
||||
if const_defined?(:DEFINED_REGIONS)
|
||||
new_regions = const_get(:DEFINED_REGIONS)
|
||||
remove_const(:DEFINED_REGIONS)
|
||||
end
|
||||
const_set(:DEFINED_REGIONS, new_regions | Holidays::#{module_name}::DEFINED_REGIONS)
|
||||
|
||||
include Holidays::MixinModule
|
||||
end
|
||||
EOC
|
||||
|
||||
File.open("test_file.rb","w") do |file|
|
||||
file.puts out
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
month,regions,function,mday,wday,week,name
|
||||
1,ca,,1,,,"New Year's Day"
|
||||
7,ca,,1,,,"Canada Day"
|
||||
9,ca,,,1,1,"Labour Day"
|
||||
11,ca,,11,,,"Rememberance Day"
|
||||
12,ca,,25,,,"Christmas Day"
|
||||
12,ca,,26,,,"Boxing Day"
|
|
44
data/ca.yaml
Normal file
44
data/ca.yaml
Normal file
|
@ -0,0 +1,44 @@
|
|||
# Canadian holiday definitions for the Ruby Holiday gem.
|
||||
# Updated 2008-11-21.
|
||||
---
|
||||
months:
|
||||
0:
|
||||
- name: Good Friday
|
||||
regions: [ca]
|
||||
function: lambda { |year| easter(year)-2 }
|
||||
- name: Easter Sunday
|
||||
regions: [ca]
|
||||
function: lambda { |year| easter(year) }
|
||||
1:
|
||||
- name: New Year's Day
|
||||
regions: [ca]
|
||||
mday: 1
|
||||
7:
|
||||
- name: Canada Day
|
||||
regions: [ca]
|
||||
mday: 1
|
||||
9:
|
||||
- name: Labour Day
|
||||
week: 1
|
||||
regions: [ca]
|
||||
wday: 1
|
||||
11:
|
||||
- name: Rememberance Day
|
||||
regions: [ca]
|
||||
mday: 11
|
||||
12:
|
||||
- name: Christmas Day
|
||||
regions: [ca]
|
||||
mday: 25
|
||||
- name: Boxing Day
|
||||
regions: [ca]
|
||||
mday: 26
|
||||
methods:
|
||||
easter: |
|
||||
def easter(year)
|
||||
Date.civil(2008,1,1)
|
||||
end
|
||||
tester: |
|
||||
def tester(year)
|
||||
Date.civil(2005,1,1)
|
||||
end
|
|
@ -1,5 +0,0 @@
|
|||
month,regions,function,mday,wday,week,name
|
||||
0,christian,"lambda { |year| easter(year) }",,,,"Easter Sunday"
|
||||
0,christian,"lambda { |year| easter(year)-7 }",,,,"Palm Sunday"
|
||||
0,christian,"lambda { |year| easter(year)-2 }",,,,"Good Friday"
|
||||
12,christian,,25,,,"Christmas Day"
|
|
17
data/christian.yaml
Normal file
17
data/christian.yaml
Normal file
|
@ -0,0 +1,17 @@
|
|||
# Christian holiday definitions for the Ruby Holiday gem.
|
||||
# Updated 2008-11-21.
|
||||
---
|
||||
0:
|
||||
- name: Easter Sunday
|
||||
regions: [christian]
|
||||
function: lambda { |year| easter(year) }
|
||||
- name: Palm Sunday
|
||||
regions: [christian]
|
||||
function: lambda { |year| easter(year)-7 }
|
||||
- name: Good Friday
|
||||
regions: [christian]
|
||||
function: lambda { |year| easter(year)-2 }
|
||||
12:
|
||||
- name: Christmas Day
|
||||
regions: [christian]
|
||||
mday: 25
|
|
@ -1,9 +0,0 @@
|
|||
month, region, mday, wday, week, name
|
||||
1, us, 1, , , 'New Year\'s Day'
|
||||
1, ca, 1, , , 'New Year\'s Day'
|
||||
1, au, 1, , , 'New Year\'s Day'
|
||||
1, christian, 6, , , 'Epiphany'
|
||||
1, us, , 1, 3, 'Martin Luther King, Jr. Day'
|
||||
3, us, , 1, 3, 'George Washington\'s Birthday'
|
||||
3, gr, 25, , , 'Independence Day'
|
||||
4, au, 25, , , 'ANZAC Day'
|
|
0
data/international.yaml
Normal file
0
data/international.yaml
Normal file
56
data/mx.yaml
Normal file
56
data/mx.yaml
Normal file
|
@ -0,0 +1,56 @@
|
|||
# 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
|
188
data/un.yaml
Normal file
188
data/un.yaml
Normal file
|
@ -0,0 +1,188 @@
|
|||
# United Nationas holiday definitions for the Ruby Holiday gem.
|
||||
# Updated 2008-11-21.
|
||||
---
|
||||
2:
|
||||
- name: International Mother Language Day
|
||||
regions: [un]
|
||||
mday: 2
|
||||
3:
|
||||
- name: United Nations Day for Women's Rights and International Peace
|
||||
regions: [un]
|
||||
mday: 8
|
||||
- name: International Day for the Elimination of Racial Discrimination
|
||||
regions: [un]
|
||||
mday: 21
|
||||
- name: Beginning of the Week of Solidarity with the Peoples Struggling against Racism and Racial Discrimination
|
||||
regions: [un]
|
||||
mday: 21
|
||||
- name: World Day for Water
|
||||
regions: [un]
|
||||
mday: 22
|
||||
- name: World Meteorological Day
|
||||
regions: [un]
|
||||
mday: 23
|
||||
4:
|
||||
- name: World Health Day
|
||||
regions: [un]
|
||||
mday: 7
|
||||
- name: World Book and Copyright Day
|
||||
regions: [un]
|
||||
mday: 23
|
||||
5:
|
||||
- name: World Press Freedom Day
|
||||
regions: [un]
|
||||
mday: 3
|
||||
- name: International Day of Families
|
||||
regions: [un]
|
||||
mday: 15
|
||||
- name: World Telecommunication Day
|
||||
regions: [un]
|
||||
mday: 17
|
||||
- name: World Day for Cultural Diversity for Dialogue and Development
|
||||
regions: [un]
|
||||
mday: 21
|
||||
- name: International Day for Biological Diversity
|
||||
regions: [un]
|
||||
mday: 22
|
||||
- name: Beginning of the Week of Solidarity with the Peoples of Non-Self-Governing Territories
|
||||
regions: [un]
|
||||
mday: 25
|
||||
- name: International Day of United Nations Peacekeepers
|
||||
regions: [un]
|
||||
mday: 29
|
||||
- name: World No-Tobacco Day
|
||||
regions: [un]
|
||||
mday: 31
|
||||
6:
|
||||
- name: International Day of Innocent Children Victims of Aggression
|
||||
regions: [un]
|
||||
mday: 4
|
||||
- name: World Environment Day
|
||||
regions: [un]
|
||||
mday: 5
|
||||
- name: World Day to Combat Desertification and Drought
|
||||
regions: [un]
|
||||
mday: 17
|
||||
- name: World Refugee Day
|
||||
regions: [un]
|
||||
mday: 20
|
||||
- name: United Nations Public Service Day
|
||||
regions: [un]
|
||||
mday: 23
|
||||
- name: International Day against Drug Abuse and Illicit Trafficking
|
||||
regions: [un]
|
||||
mday: 26
|
||||
- name: International Day in Support of Victims of Torture
|
||||
regions: [un]
|
||||
mday: 26
|
||||
7:
|
||||
- name: International Day of Cooperatives
|
||||
week: 1
|
||||
regions: [un]
|
||||
wday: 6
|
||||
- name: World Population Day
|
||||
regions: [un]
|
||||
mday: 11
|
||||
8:
|
||||
- name: International Day of the World's Indigenous People
|
||||
regions: [un]
|
||||
mday: 9
|
||||
- name: International Youth Day
|
||||
regions: [un]
|
||||
mday: 12
|
||||
- name: International Day for the Remembrance of the Slave Trade and Its Abolition
|
||||
regions: [un]
|
||||
mday: 23
|
||||
9:
|
||||
- name: International Literacy Day
|
||||
regions: [un]
|
||||
mday: 8
|
||||
- name: International Day for the Preservation of the Ozone Layer
|
||||
regions: [un]
|
||||
mday: 16
|
||||
- name: International Day of Peace
|
||||
regions: [un]
|
||||
mday: 21
|
||||
- name: International Day of Older Persons
|
||||
regions: [un]
|
||||
mday: 1
|
||||
10:
|
||||
- name: World Space Week
|
||||
regions: [un]
|
||||
mday: 4
|
||||
- name: World Teachers' Day
|
||||
regions: [un]
|
||||
mday: 5
|
||||
- name: World Habitat Day
|
||||
week: 1
|
||||
regions: [un]
|
||||
wday: 1
|
||||
- name: International Day for Natural Disaster Reduction
|
||||
week: 2
|
||||
regions: [un]
|
||||
wday: 3
|
||||
- name: World Post Day
|
||||
regions: [un]
|
||||
mday: 9
|
||||
- name: World Mental Health Day
|
||||
regions: [un]
|
||||
mday: 10
|
||||
- name: World Food Day
|
||||
regions: [un]
|
||||
mday: 16
|
||||
- name: International Day for the Eradication of Poverty
|
||||
regions: [un]
|
||||
mday: 17
|
||||
- name: United Nations Day
|
||||
regions: [un]
|
||||
mday: 24
|
||||
- name: World Development Information Day
|
||||
regions: [un]
|
||||
mday: 24
|
||||
- name: Disarmament Week
|
||||
regions: [un]
|
||||
mday: 24
|
||||
11:
|
||||
- name: International Day for Preventing the Exploitation of the Environment in War and Armed Conflict
|
||||
regions: [un]
|
||||
mday: 6
|
||||
- name: International Day for Tolerance
|
||||
regions: [un]
|
||||
mday: 16
|
||||
- name: Africa Industrialization Day
|
||||
regions: [un]
|
||||
mday: 20
|
||||
- name: Universal Children's Day
|
||||
regions: [un]
|
||||
mday: 20
|
||||
- name: World Television Day
|
||||
regions: [un]
|
||||
mday: 21
|
||||
- name: International Day for the Elimination of Violence against Women
|
||||
regions: [un]
|
||||
mday: 25
|
||||
- name: International Day of Solidarity with the Palestinian People
|
||||
regions: [un]
|
||||
mday: 29
|
||||
12:
|
||||
- name: World AIDS Day
|
||||
regions: [un]
|
||||
mday: 1
|
||||
- name: International Day for the Abolition of Slavery
|
||||
regions: [un]
|
||||
mday: 2
|
||||
- name: International Day of Disabled Persons
|
||||
regions: [un]
|
||||
mday: 3
|
||||
- name: International Volunteer Day for Economic and Social Development
|
||||
regions: [un]
|
||||
mday: 5
|
||||
- name: International Civil Aviation Day
|
||||
regions: [un]
|
||||
mday: 7
|
||||
- name: Human Rights Day
|
||||
regions: [un]
|
||||
mday: 10
|
||||
- name: International Migrants Day
|
||||
regions: [un]
|
||||
mday: 18
|
11
data/us.csv
11
data/us.csv
|
@ -1,11 +0,0 @@
|
|||
month,regions,function,mday,wday,week,name
|
||||
1,us,,1,,,"New Year's Day"
|
||||
1,us,,,1,3,"Martin Luther King, Jr. Day"
|
||||
3,us,,,1,3,"George Washington's Birthday"
|
||||
5,us,,,1,-1,"Memorial Day"
|
||||
6,us,,14,,,"Flag Day"
|
||||
7,us,,4,,,"Independence Day"
|
||||
9,us,,,1,1,"Labor Day"
|
||||
11,us,,11,,,"Veterans Day"
|
||||
11,us,,,4,4,"Thanksgiving Day"
|
||||
12,us,,25,,,"Christmas Day"
|
|
47
data/us.yaml
Normal file
47
data/us.yaml
Normal file
|
@ -0,0 +1,47 @@
|
|||
# United States holiday definitions for the Ruby Holiday gem.
|
||||
# Updated 2008-11-21.
|
||||
---
|
||||
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:
|
|
@ -9,11 +9,12 @@ module Holidays
|
|||
|
||||
VERSION = '0.9.0'
|
||||
|
||||
REGIONS = [:ca, :us, :au, :gr, :fr, :christian]
|
||||
HOLIDAYS_TYPES = [:bank, :statutory, :religious, :informal]
|
||||
WEEKS = {:first => 1, :second => 2, :third => 3, :fourth => 4, :fifth => 5, :last => -1}
|
||||
MONTH_LENGTHS = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
||||
|
||||
DEFINED_REGIONS = [:ca, :us, :au, :gr, :fr, :christian]
|
||||
HOLIDAYS_TYPES = [:bank, :statutory, :religious, :informal]
|
||||
|
||||
|
||||
# :wday Day of the week (0 is Sunday, 6 is Saturday)
|
||||
# :function Can return an integer representing mday or a Date object.
|
||||
|
@ -52,6 +53,8 @@ module Holidays
|
|||
{:mday => 26, :name => 'Boxing Day', :regions => [:ca,:gr,:au]}]
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Get all holidays on a given date.
|
||||
#
|
||||
# [<tt>date</tt>] A Date object.
|
||||
|
@ -145,7 +148,7 @@ private
|
|||
regions = [regions] unless regions.kind_of?(Array)
|
||||
regions = regions.collect { |r| r.to_sym }
|
||||
|
||||
raise UnkownRegionError unless regions.all? { |r| r == :any or REGIONS.include?(r) }
|
||||
raise UnkownRegionError unless regions.all? { |r| r == :any or DEFINED_REGIONS.include?(r) }
|
||||
|
||||
regions
|
||||
end
|
||||
|
|
21
test/fixtures/mixin_module.rb
vendored
Normal file
21
test/fixtures/mixin_module.rb
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
module Holidays
|
||||
module MixinModule
|
||||
DEFINED_REGIONS = [:merged_a,:merged_b]
|
||||
|
||||
def test_lambda(year)
|
||||
28
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Holidays.class_eval do
|
||||
# merge regions and holidays
|
||||
new_regions = []
|
||||
if const_defined?(:DEFINED_REGIONS)
|
||||
new_regions = const_get(:DEFINED_REGIONS)
|
||||
remove_const(:DEFINED_REGIONS)
|
||||
end
|
||||
const_set(:DEFINED_REGIONS, new_regions | Holidays::MixinModule::DEFINED_REGIONS)
|
||||
|
||||
include Holidays::MixinModule
|
||||
end
|
15
test/test_mixins.rb
Normal file
15
test/test_mixins.rb
Normal file
|
@ -0,0 +1,15 @@
|
|||
require File.dirname(__FILE__) + '/test_helper'
|
||||
require 'fixtures/mixin_module'
|
||||
|
||||
class MixinTests < Test::Unit::TestCase
|
||||
def test_tester
|
||||
#Holidays.append_features(Holidays::MixinModule)
|
||||
puts Holidays.constants
|
||||
puts Holidays::DEFINED_REGIONS.join(',')
|
||||
assert Holidays.method_defined?(:test_lambda)
|
||||
end
|
||||
|
||||
def test_adding_region_constants
|
||||
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue