holidays 3.3.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +44 -0
- data/CONTRIBUTING.md +37 -0
- data/README.md +16 -25
- data/REFERENCES +4 -1
- data/Rakefile +38 -8
- data/benchmark.rb +8 -0
- data/definitions/README.md +187 -8
- data/definitions/ar.yaml +2 -1
- data/definitions/at.yaml +17 -13
- data/definitions/au.yaml +65 -60
- data/definitions/be_fr.yaml +14 -10
- data/definitions/be_nl.yaml +8 -4
- data/definitions/bg.yaml +12 -6
- data/definitions/br.yaml +6 -3
- data/definitions/ca.yaml +8 -6
- data/definitions/ch.yaml +21 -15
- data/definitions/cl.yaml +4 -2
- data/definitions/cr.yaml +5 -3
- data/definitions/cz.yaml +4 -2
- data/definitions/de.yaml +25 -14
- data/definitions/dk.yaml +26 -17
- data/definitions/ecb_target.yaml +4 -2
- data/definitions/el.yaml +23 -18
- data/definitions/es.yaml +31 -28
- data/definitions/federal_reserve.yaml +12 -12
- data/definitions/fedex.yaml +6 -6
- data/definitions/fi.yaml +26 -25
- data/definitions/fr.yaml +8 -4
- data/definitions/gb.yaml +9 -7
- data/definitions/hr.yaml +8 -6
- data/definitions/hu.yaml +8 -6
- data/definitions/ie.yaml +17 -16
- data/definitions/index.yaml +1 -1
- data/definitions/is.yaml +29 -19
- data/definitions/it.yaml +10 -9
- data/definitions/jp.yaml +92 -44
- data/definitions/li.yaml +25 -20
- data/definitions/lt.yaml +2 -1
- data/definitions/ma.yaml +7 -7
- data/definitions/mx.yaml +11 -11
- data/definitions/nerc.yaml +6 -6
- data/definitions/nl.yaml +22 -18
- data/definitions/no.yaml +19 -11
- data/definitions/north_america_informal.yaml +6 -6
- data/definitions/nyse.yaml +9 -8
- data/definitions/nz.yaml +33 -29
- data/definitions/ph.yaml +15 -8
- data/definitions/pl.yaml +27 -17
- data/definitions/pt.yaml +4 -2
- data/definitions/ro.yaml +21 -18
- data/definitions/se.yaml +24 -18
- data/definitions/sg.yaml +10 -9
- data/definitions/si.yaml +4 -2
- data/definitions/sk.yaml +4 -2
- data/definitions/united_nations.yaml +12 -12
- data/definitions/ups.yaml +6 -6
- data/definitions/us.yaml +12 -11
- data/definitions/ve.yaml +8 -4
- data/definitions/vi.yaml +6 -6
- data/definitions/za.yaml +26 -24
- data/holidays.gemspec +3 -1
- data/lib/generated_definitions/MANIFEST +1 -1
- data/lib/generated_definitions/ar.rb +8 -6
- data/lib/generated_definitions/at.rb +11 -9
- data/lib/generated_definitions/au.rb +75 -99
- data/lib/generated_definitions/be.rb +12 -10
- data/lib/generated_definitions/be_fr.rb +12 -10
- data/lib/generated_definitions/be_nl.rb +12 -10
- data/lib/generated_definitions/bg.rb +14 -13
- data/lib/generated_definitions/br.rb +11 -9
- data/lib/generated_definitions/ca.rb +20 -20
- data/lib/generated_definitions/ch.rb +41 -44
- data/lib/generated_definitions/cl.rb +9 -7
- data/lib/generated_definitions/cr.rb +9 -7
- data/lib/generated_definitions/cz.rb +9 -6
- data/lib/generated_definitions/de.rb +25 -25
- data/lib/generated_definitions/dk.rb +17 -15
- data/lib/generated_definitions/ecb_target.rb +9 -7
- data/lib/generated_definitions/el.rb +13 -11
- data/lib/generated_definitions/es.rb +35 -33
- data/lib/generated_definitions/europe.rb +234 -247
- data/lib/generated_definitions/federal_reserve.rb +11 -9
- data/lib/generated_definitions/fedex.rb +42 -0
- data/lib/generated_definitions/fi.rb +32 -36
- data/lib/generated_definitions/fr.rb +12 -10
- data/lib/generated_definitions/gb.rb +15 -13
- data/lib/generated_definitions/hr.rb +10 -8
- data/lib/generated_definitions/hu.rb +9 -7
- data/lib/generated_definitions/ie.rb +17 -17
- data/lib/generated_definitions/is.rb +26 -26
- data/lib/generated_definitions/it.rb +9 -7
- data/lib/generated_definitions/jp.rb +112 -89
- data/lib/generated_definitions/li.rb +14 -12
- data/lib/generated_definitions/lt.rb +9 -7
- data/lib/generated_definitions/ma.rb +7 -5
- data/lib/generated_definitions/mx.rb +7 -5
- data/lib/generated_definitions/nerc.rb +10 -8
- data/lib/generated_definitions/nl.rb +15 -13
- data/lib/generated_definitions/no.rb +16 -14
- data/lib/generated_definitions/north_america.rb +34 -37
- data/lib/generated_definitions/nyse.rb +10 -8
- data/lib/generated_definitions/nz.rb +40 -40
- data/lib/generated_definitions/ph.rb +17 -13
- data/lib/generated_definitions/pl.rb +25 -27
- data/lib/generated_definitions/pt.rb +10 -8
- data/lib/generated_definitions/ro.rb +11 -9
- data/lib/generated_definitions/scandinavia.rb +92 -102
- data/lib/generated_definitions/se.rb +25 -27
- data/lib/generated_definitions/sg.rb +11 -9
- data/lib/generated_definitions/si.rb +10 -8
- data/lib/generated_definitions/sk.rb +9 -7
- data/lib/generated_definitions/united_nations.rb +7 -5
- data/lib/generated_definitions/ups.rb +13 -12
- data/lib/generated_definitions/us.rb +20 -21
- data/lib/generated_definitions/ve.rb +11 -9
- data/lib/generated_definitions/vi.rb +7 -5
- data/lib/generated_definitions/za.rb +19 -17
- data/lib/holidays.rb +20 -83
- data/lib/holidays/date_calculator/weekend_modifier.rb +22 -5
- data/lib/holidays/definition/context/generator.rb +67 -29
- data/lib/holidays/definition/context/merger.rb +8 -8
- data/lib/holidays/definition/decorator/custom_method_proc.rb +28 -0
- data/lib/holidays/definition/decorator/custom_method_source.rb +30 -0
- data/lib/holidays/definition/entity/custom_method.rb +11 -0
- data/lib/holidays/definition/parser/custom_method.rb +69 -0
- data/lib/holidays/definition/repository/custom_methods.rb +27 -0
- data/lib/holidays/definition/repository/holidays_by_month.rb +1 -1
- data/lib/holidays/definition/repository/{proc_cache.rb → proc_result_cache.rb} +19 -4
- data/lib/holidays/definition/validator/custom_method.rb +31 -0
- data/lib/holidays/definition_factory.rb +42 -6
- data/lib/holidays/errors.rb +6 -0
- data/lib/holidays/load_all_definitions.rb +57 -0
- data/lib/holidays/option/context/parse_options.rb +26 -16
- data/lib/holidays/option_factory.rb +1 -0
- data/lib/holidays/use_case/context/between.rb +41 -14
- data/lib/holidays/use_case_factory.rb +2 -1
- data/lib/holidays/version.rb +1 -1
- data/test/data/test_single_custom_holiday_with_custom_procs.yaml +24 -0
- data/test/defs/test_defs_at.rb +1 -1
- data/test/defs/test_defs_au.rb +3 -2
- data/test/defs/test_defs_cr.rb +1 -0
- data/test/defs/test_defs_cz.rb +1 -0
- data/test/defs/test_defs_dk.rb +2 -2
- data/test/defs/test_defs_el.rb +7 -6
- data/test/defs/test_defs_europe.rb +40 -33
- data/test/defs/test_defs_fedex.rb +24 -0
- data/test/defs/test_defs_fi.rb +4 -3
- data/test/defs/test_defs_hr.rb +2 -2
- data/test/defs/test_defs_hu.rb +2 -2
- data/test/defs/test_defs_is.rb +2 -1
- data/test/defs/test_defs_it.rb +2 -1
- data/test/defs/test_defs_jp.rb +1 -1
- data/test/defs/test_defs_li.rb +1 -1
- data/test/defs/test_defs_ma.rb +2 -1
- data/test/defs/test_defs_mx.rb +4 -3
- data/test/defs/test_defs_nl.rb +7 -6
- data/test/defs/test_defs_no.rb +1 -0
- data/test/defs/test_defs_north_america.rb +4 -3
- data/test/defs/test_defs_nyse.rb +2 -1
- data/test/defs/test_defs_pl.rb +1 -0
- data/test/defs/test_defs_ro.rb +11 -11
- data/test/defs/test_defs_scandinavia.rb +12 -8
- data/test/defs/test_defs_se.rb +3 -2
- data/test/defs/test_defs_sg.rb +2 -1
- data/test/defs/test_defs_vi.rb +1 -1
- data/test/defs/test_defs_za.rb +3 -2
- data/test/holidays/date_calculator/test_weekend_modifier.rb +11 -0
- data/test/holidays/definition/context/test_generator.rb +64 -5
- data/test/holidays/definition/context/test_merger.rb +5 -2
- data/test/holidays/definition/decorator/test_custom_method_proc.rb +113 -0
- data/test/holidays/definition/decorator/test_custom_method_source.rb +96 -0
- data/test/holidays/definition/parser/test_custom_method.rb +79 -0
- data/test/holidays/definition/repository/test_custom_methods.rb +43 -0
- data/test/holidays/definition/repository/test_holidays_by_month.rb +0 -32
- data/test/holidays/definition/repository/test_proc_result_cache.rb +84 -0
- data/test/holidays/definition/validator/test_custom_method.rb +89 -0
- data/test/holidays/option/context/test_parse_options.rb +5 -0
- data/test/holidays/test_definition_factory.rb +17 -2
- data/test/holidays/use_case/context/test_between.rb +2 -0
- data/test/test_all_regions.rb +7 -49
- data/test/test_custom_holidays.rb +8 -2
- data/test/test_helper.rb +9 -2
- data/test/test_holidays.rb +9 -29
- metadata +46 -11
- data/lib/generated_definitions/fed_ex.rb +0 -41
- data/test/holidays/definition/repository/test_proc_cache.rb +0 -29
- data/test/test_parse_definitions.rb +0 -30
|
@@ -58,8 +58,8 @@ end
|
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
|
|
61
|
-
{Date.civil(2007,1,1) => 'Año nuevo',
|
|
62
|
-
Date.civil(2007,2,5) => 'Día de la Constitución',
|
|
61
|
+
{Date.civil(2007,1,1) => 'Año nuevo',
|
|
62
|
+
Date.civil(2007,2,5) => 'Día de la Constitución',
|
|
63
63
|
Date.civil(2007,5,1) => 'Día del Trabajo',
|
|
64
64
|
Date.civil(2007,5,5) => 'Cinco de Mayo',
|
|
65
65
|
Date.civil(2007,9,16) => 'Día de la Independencia',
|
|
@@ -68,7 +68,8 @@ end
|
|
|
68
68
|
Date.civil(2007,11,19) => 'Día de la Revolución',
|
|
69
69
|
Date.civil(2007,12,25) => 'Navidad'}.each do |date, name|
|
|
70
70
|
assert_equal name, (Holidays.on(date, :mx, :informal)[0] || {})[:name]
|
|
71
|
-
end
|
|
71
|
+
end
|
|
72
|
+
|
|
72
73
|
|
|
73
74
|
{Date.civil(2008,1,1) => 'New Year\'s Day',
|
|
74
75
|
Date.civil(2008,1,21) => 'Martin Luther King, Jr. Day',
|
data/test/defs/test_defs_nyse.rb
CHANGED
|
@@ -7,7 +7,7 @@ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
|
7
7
|
class NyseDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
8
8
|
|
|
9
9
|
def test_nyse
|
|
10
|
-
{Date.civil(2008,1,1) => 'New Year\'s Day',
|
|
10
|
+
{Date.civil(2008,1,1) => 'New Year\'s Day',
|
|
11
11
|
Date.civil(2008,1,21) => 'Martin Luther King, Jr. Day',
|
|
12
12
|
Date.civil(2008,2,18) => 'Presidents\' Day',
|
|
13
13
|
Date.civil(2008,3,21) => 'Good Friday',
|
|
@@ -18,5 +18,6 @@ class NyseDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
|
18
18
|
Date.civil(2008,12,25) => 'Christmas Day'}.each do |date, name|
|
|
19
19
|
assert_equal name, (Holidays.on(date, :nyse)[0] || {})[:name]
|
|
20
20
|
end
|
|
21
|
+
|
|
21
22
|
end
|
|
22
23
|
end
|
data/test/defs/test_defs_pl.rb
CHANGED
|
@@ -141,5 +141,6 @@ end
|
|
|
141
141
|
# Wniebowzięcie Najświętszej Maryi Panny & Święto Wojska Polskiego
|
|
142
142
|
assert_equal 'Wniebowzięcie Najświętszej Maryi Panny', (Holidays.on(Date.civil(2011,8,15), :pl)[0] || {})[:name]
|
|
143
143
|
assert_equal 'Święto Wojska Polskiego', (Holidays.on(Date.civil(2011,8,15), :pl)[1] || {})[:name]
|
|
144
|
+
|
|
144
145
|
end
|
|
145
146
|
end
|
data/test/defs/test_defs_ro.rb
CHANGED
|
@@ -8,17 +8,17 @@ class RoDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
|
8
8
|
|
|
9
9
|
def test_ro
|
|
10
10
|
{
|
|
11
|
-
Date.civil(1961,4,9) => 'Paștele',
|
|
12
|
-
Date.civil(1961,4,10) => 'Paștele',
|
|
13
|
-
Date.civil(2013,5,5) => 'Paștele',
|
|
14
|
-
Date.civil(2013,5,6) => 'Paștele',
|
|
15
|
-
Date.civil(2027,5,2) => 'Paștele',
|
|
16
|
-
Date.civil(2027,5,3) => 'Paștele',
|
|
17
|
-
Date.civil(2012,6,4) => 'Rusaliile',
|
|
18
|
-
Date.civil(2013,6,23) => 'Rusaliile',
|
|
19
|
-
Date.civil(2013,6,24) => 'Rusaliile',
|
|
20
|
-
Date.civil(1986,6,22) => 'Rusaliile',
|
|
21
|
-
Date.civil(1986,6,23) => 'Rusaliile',
|
|
11
|
+
Date.civil(1961,4,9) => 'Paștele - duminică',
|
|
12
|
+
Date.civil(1961,4,10) => 'Paștele - luni',
|
|
13
|
+
Date.civil(2013,5,5) => 'Paștele - duminică',
|
|
14
|
+
Date.civil(2013,5,6) => 'Paștele - luni',
|
|
15
|
+
Date.civil(2027,5,2) => 'Paștele - duminică',
|
|
16
|
+
Date.civil(2027,5,3) => 'Paștele - luni',
|
|
17
|
+
Date.civil(2012,6,4) => 'Rusaliile - 51',
|
|
18
|
+
Date.civil(2013,6,23) => 'Rusaliile - 50',
|
|
19
|
+
Date.civil(2013,6,24) => 'Rusaliile - 51',
|
|
20
|
+
Date.civil(1986,6,22) => 'Rusaliile - 50',
|
|
21
|
+
Date.civil(1986,6,23) => 'Rusaliile - 51',
|
|
22
22
|
Date.civil(2009,1,1) => 'Anul nou',
|
|
23
23
|
Date.civil(2014,1,2) => 'Anul nou',
|
|
24
24
|
Date.civil(2009,5,1) => 'Ziua muncii',
|
|
@@ -7,8 +7,8 @@ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
|
7
7
|
class ScandinaviaDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
8
8
|
|
|
9
9
|
def test_scandinavia
|
|
10
|
-
{Date.civil(2007,1,1) => 'Nytårsdag',
|
|
11
|
-
Date.civil(2007,2,18) => 'Fastelavn',
|
|
10
|
+
{Date.civil(2007,1,1) => 'Nytårsdag',
|
|
11
|
+
Date.civil(2007,2,18) => 'Fastelavn',
|
|
12
12
|
Date.civil(2007,4,9) => 'Danmarks besættelse',
|
|
13
13
|
Date.civil(2007,4,16) => 'Dronningens fødselsdag',
|
|
14
14
|
Date.civil(2007,4,5) => 'Skærtorsdag',
|
|
@@ -28,7 +28,7 @@ class ScandinaviaDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
{Date.civil(2007,1,1) => 'Nýársdagur',
|
|
31
|
+
{Date.civil(2007,1,1) => 'Nýársdagur',
|
|
32
32
|
Date.civil(2007,1,6) => 'Þrettándinn',
|
|
33
33
|
Date.civil(2007,1,19) => 'Bóndadagur',
|
|
34
34
|
Date.civil(2007,2,18) => 'Konudagur',
|
|
@@ -51,6 +51,7 @@ end
|
|
|
51
51
|
assert_equal name, (Holidays.on(date, :is, :informal)[0] || {})[:name]
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
+
|
|
54
55
|
{Date.civil(2010,1,1) => 'Nyttårsdag',
|
|
55
56
|
Date.civil(2010,5,1) => '1. mai',
|
|
56
57
|
Date.civil(2010,5,17) => '17. mai',
|
|
@@ -70,11 +71,12 @@ end
|
|
|
70
71
|
assert_equal name, (Holidays.on(date, :no, :informal)[0] || {})[:name]
|
|
71
72
|
end
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
|
|
75
|
+
{Date.civil(2008,1,1) => 'Nyårsdagen',
|
|
74
76
|
Date.civil(2008,1,6) => 'Trettondedag jul',
|
|
75
77
|
Date.civil(2008,3,21) => 'Långfredagen',
|
|
76
78
|
Date.civil(2008,3,22) => 'Påskafton',
|
|
77
|
-
Date.civil(2008,3,23) => 'Påskdagen',
|
|
79
|
+
Date.civil(2008,3,23) => 'Påskdagen',
|
|
78
80
|
Date.civil(2008,3,24) => 'Annandag påsk',
|
|
79
81
|
Date.civil(2008,5,1) => 'Första maj',
|
|
80
82
|
Date.civil(2008,5,1) => 'Kristi himmelsfärdsdag',
|
|
@@ -99,10 +101,11 @@ end
|
|
|
99
101
|
assert_equal name, (Holidays.on(date, :se, :informal)[0] || {})[:name]
|
|
100
102
|
end
|
|
101
103
|
|
|
102
|
-
|
|
104
|
+
|
|
105
|
+
{Date.civil(2008,1,1) => 'Uudenvuodenpäivä',
|
|
103
106
|
Date.civil(2008,1,6) => 'Loppiainen',
|
|
104
|
-
Date.civil(2008,3,21) => 'Pitkäperjantai',
|
|
105
|
-
Date.civil(2008,3,23) => 'Pääsiäispäivä',
|
|
107
|
+
Date.civil(2008,3,21) => 'Pitkäperjantai',
|
|
108
|
+
Date.civil(2008,3,23) => 'Pääsiäispäivä',
|
|
106
109
|
Date.civil(2008,3,24) => '2. Pääsiäispäivä',
|
|
107
110
|
Date.civil(2008,5,1) => 'Vappu',
|
|
108
111
|
Date.civil(2008,5,1) => 'Helatorstai',
|
|
@@ -126,5 +129,6 @@ end
|
|
|
126
129
|
Date.civil(2008,12,26) => 'Tapaninpäivä'}.each do |date, name|
|
|
127
130
|
assert_equal name, (Holidays.on(date, :fi, :informal)[0] || {})[:name]
|
|
128
131
|
end
|
|
132
|
+
|
|
129
133
|
end
|
|
130
134
|
end
|
data/test/defs/test_defs_se.rb
CHANGED
|
@@ -7,11 +7,11 @@ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
|
7
7
|
class SeDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
8
8
|
|
|
9
9
|
def test_se
|
|
10
|
-
{Date.civil(2008,1,1) => 'Nyårsdagen',
|
|
10
|
+
{Date.civil(2008,1,1) => 'Nyårsdagen',
|
|
11
11
|
Date.civil(2008,1,6) => 'Trettondedag jul',
|
|
12
12
|
Date.civil(2008,3,21) => 'Långfredagen',
|
|
13
13
|
Date.civil(2008,3,22) => 'Påskafton',
|
|
14
|
-
Date.civil(2008,3,23) => 'Påskdagen',
|
|
14
|
+
Date.civil(2008,3,23) => 'Påskdagen',
|
|
15
15
|
Date.civil(2008,3,24) => 'Annandag påsk',
|
|
16
16
|
Date.civil(2008,5,1) => 'Första maj',
|
|
17
17
|
Date.civil(2008,5,1) => 'Kristi himmelsfärdsdag',
|
|
@@ -35,5 +35,6 @@ class SeDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
|
35
35
|
}.each do |date, name|
|
|
36
36
|
assert_equal name, (Holidays.on(date, :se, :informal)[0] || {})[:name]
|
|
37
37
|
end
|
|
38
|
+
|
|
38
39
|
end
|
|
39
40
|
end
|
data/test/defs/test_defs_sg.rb
CHANGED
|
@@ -7,7 +7,7 @@ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
|
7
7
|
class SgDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
8
8
|
|
|
9
9
|
def test_sg
|
|
10
|
-
{Date.civil(2014,1,1) => 'New Year\'s Day',
|
|
10
|
+
{Date.civil(2014,1,1) => 'New Year\'s Day',
|
|
11
11
|
Date.civil(2014,2,14) => 'Valentine\'s Day',
|
|
12
12
|
Date.civil(2014,2,15) => 'Total Defence Day',
|
|
13
13
|
Date.civil(2014,4,18) => 'Good Friday',
|
|
@@ -16,5 +16,6 @@ class SgDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
|
16
16
|
Date.civil(2014,12,25) => 'Christmas Day'}.each do |date, name|
|
|
17
17
|
assert_equal name, (Holidays.on(date, :sg, :informal)[0] || {})[:name]
|
|
18
18
|
end
|
|
19
|
+
|
|
19
20
|
end
|
|
20
21
|
end
|
data/test/defs/test_defs_vi.rb
CHANGED
|
@@ -7,7 +7,7 @@ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
|
7
7
|
class ViDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
8
8
|
|
|
9
9
|
def test_vi
|
|
10
|
-
{Date.civil(2014,1,1) => 'New Year',
|
|
10
|
+
{Date.civil(2014,1,1) => 'New Year',
|
|
11
11
|
Date.civil(2014,4,30) => 'Liberation Day',
|
|
12
12
|
Date.civil(2014,5,1) => "International Workers' Day",
|
|
13
13
|
Date.civil(2014,9,2) => 'National Day'}.each do |date, name|
|
data/test/defs/test_defs_za.rb
CHANGED
|
@@ -7,8 +7,8 @@ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
|
7
7
|
class ZaDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
8
8
|
|
|
9
9
|
def test_za
|
|
10
|
-
{Date.civil(2007,1,1) => 'New Year\'s Day',
|
|
11
|
-
Date.civil(2007,3,21) => 'Human Rights Day',
|
|
10
|
+
{Date.civil(2007,1,1) => 'New Year\'s Day',
|
|
11
|
+
Date.civil(2007,3,21) => 'Human Rights Day',
|
|
12
12
|
Date.civil(2007,4,6) => 'Good Friday',
|
|
13
13
|
Date.civil(2007,4,9) => 'Family Day',
|
|
14
14
|
Date.civil(2007,4,27) => 'Freedom Day',
|
|
@@ -21,5 +21,6 @@ class ZaDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
|
21
21
|
Date.civil(2007,12,26) => 'Day of Goodwill'}.each do |date, name|
|
|
22
22
|
assert_equal name, (Holidays.on(date, :za, :informal)[0] || {})[:name]
|
|
23
23
|
end
|
|
24
|
+
|
|
24
25
|
end
|
|
25
26
|
end
|
|
@@ -10,10 +10,15 @@ class WeekendModifierDateCalculatorTests < Test::Unit::TestCase
|
|
|
10
10
|
def test_to_monday_if_weekend
|
|
11
11
|
assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_weekend(Date.civil(2015, 5, 3))
|
|
12
12
|
assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_weekend(Date.civil(2015, 5, 2))
|
|
13
|
+
assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_weekend(Date.civil(2015, 5, 4))
|
|
14
|
+
assert_equal Date.civil(2015, 5, 1), @subject.to_monday_if_weekend(Date.civil(2015, 5, 1))
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
def test_to_monday_if_sunday
|
|
16
18
|
assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_sunday(Date.civil(2015, 5, 3))
|
|
19
|
+
assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_sunday(Date.civil(2015, 5, 4))
|
|
20
|
+
assert_equal Date.civil(2015, 5, 1), @subject.to_monday_if_sunday(Date.civil(2015, 5, 1))
|
|
21
|
+
assert_equal Date.civil(2015, 5, 2), @subject.to_monday_if_sunday(Date.civil(2015, 5, 2))
|
|
17
22
|
end
|
|
18
23
|
|
|
19
24
|
def test_to_weekday_if_boxing_weekend
|
|
@@ -40,4 +45,10 @@ class WeekendModifierDateCalculatorTests < Test::Unit::TestCase
|
|
|
40
45
|
assert_equal Date.civil(2016, 12, 26), @subject.to_tuesday_if_sunday_or_monday_if_saturday(Date.civil(2016, 12, 24)) # sat to mon
|
|
41
46
|
assert_equal Date.civil(2016, 12, 27), @subject.to_tuesday_if_sunday_or_monday_if_saturday(Date.civil(2016, 12, 25)) # sun to tue
|
|
42
47
|
end
|
|
48
|
+
|
|
49
|
+
def test_to_next_weekday
|
|
50
|
+
assert_equal Date.civil(2016, 3, 21), @subject.to_next_weekday(Date.civil(2016, 3, 20))
|
|
51
|
+
assert_equal Date.civil(2016, 3, 22), @subject.to_next_weekday(Date.civil(2016, 3, 21))
|
|
52
|
+
assert_equal Date.civil(2016, 3, 28), @subject.to_next_weekday(Date.civil(2016, 3, 25))
|
|
53
|
+
end
|
|
43
54
|
end
|
|
@@ -4,7 +4,21 @@ require 'holidays/definition/context/generator'
|
|
|
4
4
|
|
|
5
5
|
class GeneratorTests < Test::Unit::TestCase
|
|
6
6
|
def setup
|
|
7
|
-
@
|
|
7
|
+
@custom_method_parser = mock()
|
|
8
|
+
@custom_method_source_decorator = mock()
|
|
9
|
+
@custom_methods_repository = mock()
|
|
10
|
+
|
|
11
|
+
@parsed_custom_method = Holidays::Definition::Entity::CustomMethod.new(
|
|
12
|
+
name: 'custom_method',
|
|
13
|
+
arguments: [:year, :month],
|
|
14
|
+
source: "some source",
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
@generator = Holidays::Definition::Context::Generator.new(
|
|
18
|
+
@custom_method_parser,
|
|
19
|
+
@custom_method_source_decorator,
|
|
20
|
+
@custom_methods_repository,
|
|
21
|
+
)
|
|
8
22
|
end
|
|
9
23
|
|
|
10
24
|
def test_parse_definition_files_raises_error_if_argument_is_nil
|
|
@@ -21,6 +35,8 @@ class GeneratorTests < Test::Unit::TestCase
|
|
|
21
35
|
|
|
22
36
|
def test_parse_definition_files_correctly_parse_regions
|
|
23
37
|
files = ['test/data/test_single_custom_holiday_defs.yaml']
|
|
38
|
+
@custom_method_parser.expects(:call).with(nil).returns({})
|
|
39
|
+
|
|
24
40
|
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
25
41
|
|
|
26
42
|
assert_equal [:custom_single_file], regions
|
|
@@ -28,6 +44,8 @@ class GeneratorTests < Test::Unit::TestCase
|
|
|
28
44
|
|
|
29
45
|
def test_parse_definitions_files_correctly_parse_rules_by_month
|
|
30
46
|
files = ['test/data/test_single_custom_holiday_defs.yaml']
|
|
47
|
+
@custom_method_parser.expects(:call).with(nil).returns({})
|
|
48
|
+
|
|
31
49
|
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
32
50
|
|
|
33
51
|
expected_rules_by_month = {
|
|
@@ -45,6 +63,8 @@ class GeneratorTests < Test::Unit::TestCase
|
|
|
45
63
|
|
|
46
64
|
def test_parse_definition_files_correctly_parse_custom_methods
|
|
47
65
|
files = ['test/data/test_single_custom_holiday_defs.yaml']
|
|
66
|
+
@custom_method_parser.expects(:call).with(nil).returns({})
|
|
67
|
+
|
|
48
68
|
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
49
69
|
|
|
50
70
|
expected_custom_methods = {}
|
|
@@ -53,6 +73,8 @@ class GeneratorTests < Test::Unit::TestCase
|
|
|
53
73
|
|
|
54
74
|
def test_parse_definition_files_correctly_parse_tests
|
|
55
75
|
files = ['test/data/test_single_custom_holiday_defs.yaml']
|
|
76
|
+
@custom_method_parser.expects(:call).with(nil).returns({})
|
|
77
|
+
|
|
56
78
|
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
57
79
|
|
|
58
80
|
expected_tests = [[
|
|
@@ -64,16 +86,20 @@ class GeneratorTests < Test::Unit::TestCase
|
|
|
64
86
|
|
|
65
87
|
def test_generate_definition_source_correctly_generate_module_src
|
|
66
88
|
files = ['test/data/test_single_custom_holiday_defs.yaml']
|
|
89
|
+
@custom_method_parser.expects(:call).with(nil).returns({})
|
|
90
|
+
|
|
67
91
|
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
68
92
|
module_src, test_src = @generator.generate_definition_source("test", files, regions, rules_by_month, custom_methods, tests)
|
|
69
93
|
|
|
70
|
-
expected_module_src = "# encoding: utf-8\nmodule Holidays\n # This file is generated by the Ruby Holidays gem.\n #\n # Definitions loaded: test/data/test_single_custom_holiday_defs.yaml\n #\n # To use the definitions in this file, load it right after you load the\n # Holiday gem:\n #\n # require 'holidays'\n # require 'generated_definitions/test'\n #\n # All the definitions are available at https://github.com/
|
|
94
|
+
expected_module_src = "# encoding: utf-8\nmodule Holidays\n # This file is generated by the Ruby Holidays gem.\n #\n # Definitions loaded: test/data/test_single_custom_holiday_defs.yaml\n #\n # To use the definitions in this file, load it right after you load the\n # Holiday gem:\n #\n # require 'holidays'\n # require 'generated_definitions/test'\n #\n # All the definitions are available at https://github.com/holidays/holidays\n module TEST # :nodoc:\n def self.defined_regions\n [:custom_single_file]\n end\n\n def self.holidays_by_month\n {\n 6 => [{:mday => 20, :name => \"Company Founding\", :regions => [:custom_single_file]}]\n }\n end\n\n def self.custom_methods\n {\n \n }\n end\n end\nend\n"
|
|
71
95
|
|
|
72
96
|
assert_equal expected_module_src, module_src
|
|
73
97
|
end
|
|
74
98
|
|
|
75
|
-
def
|
|
99
|
+
def test_generate_definition_source_correctly_generate_test_src
|
|
76
100
|
files = ['test/data/test_single_custom_holiday_defs.yaml']
|
|
101
|
+
@custom_method_parser.expects(:call).with(nil).returns({})
|
|
102
|
+
|
|
77
103
|
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
78
104
|
module_src, test_src = @generator.generate_definition_source("test", files, regions, rules_by_month, custom_methods, tests)
|
|
79
105
|
|
|
@@ -84,6 +110,8 @@ class GeneratorTests < Test::Unit::TestCase
|
|
|
84
110
|
|
|
85
111
|
def test_parse_definitions_files_correctly_parse_year_range_by_month
|
|
86
112
|
files = ['test/data/test_custom_year_range_holiday_defs.yaml']
|
|
113
|
+
@custom_method_parser.expects(:call).with(nil).returns({})
|
|
114
|
+
|
|
87
115
|
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
88
116
|
|
|
89
117
|
expected_rules_by_month = {
|
|
@@ -124,13 +152,44 @@ class GeneratorTests < Test::Unit::TestCase
|
|
|
124
152
|
assert_equal expected_rules_by_month, rules_by_month
|
|
125
153
|
end
|
|
126
154
|
|
|
127
|
-
def
|
|
155
|
+
def test_generate_definition_source_correctly_generate_yearrange_test_src
|
|
128
156
|
files = ['test/data/test_custom_year_range_holiday_defs.yaml']
|
|
157
|
+
@custom_method_parser.expects(:call).with(nil).returns({})
|
|
158
|
+
|
|
129
159
|
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
130
160
|
module_src, test_src = @generator.generate_definition_source("test", files, regions, rules_by_month, custom_methods, tests)
|
|
131
|
-
expected_module_src = "# encoding: utf-8\nmodule Holidays\n # This file is generated by the Ruby Holidays gem.\n #\n # Definitions loaded: test/data/test_custom_year_range_holiday_defs.yaml\n #\n # To use the definitions in this file, load it right after you load the\n # Holiday gem:\n #\n # require 'holidays'\n # require 'generated_definitions/test'\n #\n # All the definitions are available at https://github.com/
|
|
161
|
+
expected_module_src = "# encoding: utf-8\nmodule Holidays\n # This file is generated by the Ruby Holidays gem.\n #\n # Definitions loaded: test/data/test_custom_year_range_holiday_defs.yaml\n #\n # To use the definitions in this file, load it right after you load the\n # Holiday gem:\n #\n # require 'holidays'\n # require 'generated_definitions/test'\n #\n # All the definitions are available at https://github.com/holidays/holidays\n module TEST # :nodoc:\n def self.defined_regions\n [:custom_year_range_file]\n end\n\n def self.holidays_by_month\n {\n 6 => [{:mday => 1, :year_ranges => [{:after => 2016}],:name => \"after_year\", :regions => [:custom_year_range_file]},\n {:mday => 2, :year_ranges => [{:before => 2017}],:name => \"before_year\", :regions => [:custom_year_range_file]},\n {:mday => 3, :year_ranges => [{:between => 2016..2018}],:name => \"between_year\", :regions => [:custom_year_range_file]},\n {:mday => 4, :year_ranges => [{:limited => [2016, 2018, 2019]}],:name => \"limited_year\", :regions => [:custom_year_range_file]},\n {:mday => 5, :year_ranges => [{:before => 2015},{:after => 2017}],:name => \"multiple_conditions\", :regions => [:custom_year_range_file]}]\n }\n end\n\n def self.custom_methods\n {\n \n }\n end\n end\nend\n"
|
|
132
162
|
|
|
133
163
|
assert_equal expected_module_src, module_src
|
|
134
164
|
end
|
|
135
165
|
|
|
166
|
+
def test_generate_definition_source_correctly_generate_module_src_with_custom_methods
|
|
167
|
+
files = ['test/data/test_single_custom_holiday_with_custom_procs.yaml']
|
|
168
|
+
|
|
169
|
+
@custom_method_parser.expects(:call).with('custom_method' => {'arguments' => 'year, month', 'source' => "d = Date.civil(year, month, 1)\nd + 2\n"}).returns({"custom_method(year, month)" => @parsed_custom_method})
|
|
170
|
+
@custom_methods_repository.expects(:find).twice.with('custom_method(year, month)').returns(nil)
|
|
171
|
+
@custom_method_source_decorator.expects(:call).once.with(@parsed_custom_method).returns("\"custom_method(year, month)\" => Proc.new { |year, month|\nsource_stuff\n}")
|
|
172
|
+
|
|
173
|
+
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
174
|
+
module_src, test_src = @generator.generate_definition_source("test", files, regions, rules_by_month, custom_methods, tests)
|
|
175
|
+
|
|
176
|
+
expected_module_src = "# encoding: utf-8\nmodule Holidays\n # This file is generated by the Ruby Holidays gem.\n #\n # Definitions loaded: test/data/test_single_custom_holiday_with_custom_procs.yaml\n #\n # To use the definitions in this file, load it right after you load the\n # Holiday gem:\n #\n # require 'holidays'\n # require 'generated_definitions/test'\n #\n # All the definitions are available at https://github.com/holidays/holidays\n module TEST # :nodoc:\n def self.defined_regions\n [:custom_single_file]\n end\n\n def self.holidays_by_month\n {\n 0 => [{:function => \"custom_method(year, month)\", :function_arguments => [:year, :month], :function_modifier => 5, :name => \"Custom Holiday\", :regions => [:custom_single_file]}],\n 6 => [{:mday => 20, :name => \"Company Founding\", :regions => [:custom_single_file]}]\n }\n end\n\n def self.custom_methods\n {\n \"custom_method(year, month)\" => Proc.new { |year, month|\nsource_stuff\n},\n\n\n }\n end\n end\nend\n"
|
|
177
|
+
|
|
178
|
+
assert_equal expected_module_src, module_src
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def test_generate_definition_source_correctly_generate_test_src_with_custom_methods
|
|
182
|
+
files = ['test/data/test_single_custom_holiday_with_custom_procs.yaml']
|
|
183
|
+
|
|
184
|
+
@custom_method_parser.expects(:call).with('custom_method' => {'arguments' => 'year, month', 'source' => "d = Date.civil(year, month, 1)\nd + 2\n"}).returns({:parsed => "method"})
|
|
185
|
+
@custom_methods_repository.expects(:find).twice.with('custom_method(year, month)').returns(nil)
|
|
186
|
+
@custom_method_source_decorator.expects(:call).once.with("method").returns("\"custom_method(year, month)\" => Proc.new { |year, month|\nsource_stuff\n}")
|
|
187
|
+
|
|
188
|
+
regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
|
|
189
|
+
module_src, test_src = @generator.generate_definition_source("test", files, regions, rules_by_month, custom_methods, tests)
|
|
190
|
+
|
|
191
|
+
expected_test_src = "# encoding: utf-8\nrequire File.expand_path(File.dirname(__FILE__)) + '/../test_helper'\n\n# This file is generated by the Ruby Holiday gem.\n#\n# Definitions loaded: test/data/test_single_custom_holiday_with_custom_procs.yaml\nclass TestDefinitionTests < Test::Unit::TestCase # :nodoc:\n\n def test_test\n{Date.civil(2013,6,20) => 'Company Founding'}.each do |date, name|\n assert_equal name, (Holidays.on(date, :custom_single_file)[0] || {})[:name]\nend\n\n{Date.civil(2015, 1, 1) => 'Custom Holiday'}.each do |date, name|\n assert_equal name, (Holidays.on(date, :custom_single_file)[0] || {}[:name]\nend\n\n end\nend\n"
|
|
192
|
+
|
|
193
|
+
assert_equal expected_test_src, test_src
|
|
194
|
+
end
|
|
136
195
|
end
|
|
@@ -6,17 +6,20 @@ class MergerTests < Test::Unit::TestCase
|
|
|
6
6
|
def setup
|
|
7
7
|
@target_regions = [:new_region]
|
|
8
8
|
@target_holidays = {0 => [:mday => 1, :name => "Test", :regions => [:test2, :test]]}
|
|
9
|
+
@target_custom_methods = {"test_method" => Proc.new { |year| Date.civil(year, 1, 1) } }
|
|
9
10
|
|
|
10
11
|
@holidays_repo = mock()
|
|
11
12
|
@regions_repo = mock()
|
|
13
|
+
@custom_methods_repo = mock()
|
|
12
14
|
|
|
13
|
-
@subject = Holidays::Definition::Context::Merger.new(@holidays_repo, @regions_repo)
|
|
15
|
+
@subject = Holidays::Definition::Context::Merger.new(@holidays_repo, @regions_repo, @custom_methods_repo)
|
|
14
16
|
end
|
|
15
17
|
|
|
16
18
|
def test_repos_are_called_to_add_regions_and_holidays
|
|
17
19
|
@holidays_repo.expects(:add).with(@target_holidays)
|
|
18
20
|
@regions_repo.expects(:add).with(@target_regions)
|
|
21
|
+
@custom_methods_repo.expects(:add).with(@target_custom_methods)
|
|
19
22
|
|
|
20
|
-
@subject.call(@target_regions, @target_holidays)
|
|
23
|
+
@subject.call(@target_regions, @target_holidays, @target_custom_methods)
|
|
21
24
|
end
|
|
22
25
|
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/definition/decorator/custom_method_proc'
|
|
4
|
+
require 'holidays/definition/entity/custom_method'
|
|
5
|
+
|
|
6
|
+
class DecoratorCustomMethodProcTests < Test::Unit::TestCase
|
|
7
|
+
def setup
|
|
8
|
+
@decorator = Holidays::Definition::Decorator::CustomMethodProc.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_generates_lambda_from_entity
|
|
12
|
+
entity = Holidays::Definition::Entity::CustomMethod.new(
|
|
13
|
+
name: "test",
|
|
14
|
+
arguments: ["year"],
|
|
15
|
+
source: "Date.civil(year, 1, 1)"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
proc = @decorator.call(entity)
|
|
19
|
+
expected_proc = Proc.new { |year| eval("Date.civil(year, 1, 1)") }
|
|
20
|
+
|
|
21
|
+
assert_equal expected_proc.call(2015), proc.call(2015)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_generates_lamba_from_entity_with_multiple_lines
|
|
25
|
+
entity = Holidays::Definition::Entity::CustomMethod.new(
|
|
26
|
+
name: "test",
|
|
27
|
+
arguments: ["year"],
|
|
28
|
+
source: "d = Date.civil(year, 1, 1)\nd + 2"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
proc = @decorator.call(entity)
|
|
32
|
+
expected_proc = Proc.new { |year| eval("d = Date.civil(year, 1, 1)\nd + 2") }
|
|
33
|
+
|
|
34
|
+
assert_equal expected_proc.call(2015), proc.call(2015)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_generates_lamba_from_entity_with_multiple_arguments
|
|
38
|
+
entity = Holidays::Definition::Entity::CustomMethod.new(
|
|
39
|
+
name: "test",
|
|
40
|
+
arguments: ["year", "month"],
|
|
41
|
+
source: "Date.civil(year, month, 1)"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
proc = @decorator.call(entity)
|
|
45
|
+
expected_proc = Proc.new { |year, month| eval("Date.civil(year, month, 1)") }
|
|
46
|
+
|
|
47
|
+
assert_equal expected_proc.call(2015, 6), proc.call(2015, 6)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_generate_returns_error_if_missing_name
|
|
51
|
+
entity = Holidays::Definition::Entity::CustomMethod.new(
|
|
52
|
+
arguments: ["year", "month"],
|
|
53
|
+
source: "Date.civil(year, month, 1)"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
assert_raises ArgumentError do
|
|
57
|
+
@decorator.call(entity)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
entity = Holidays::Definition::Entity::CustomMethod.new(
|
|
61
|
+
name: "",
|
|
62
|
+
arguments: ["year", "month"],
|
|
63
|
+
source: "Date.civil(year, month, 1)"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
assert_raises ArgumentError do
|
|
67
|
+
@decorator.call(entity)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_generate_returns_error_if_arguments_is_missing
|
|
72
|
+
entity = Holidays::Definition::Entity::CustomMethod.new(
|
|
73
|
+
name: "test",
|
|
74
|
+
source: "Date.civil(year, month, 1)"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
assert_raises ArgumentError do
|
|
78
|
+
@decorator.call(entity)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
entity = Holidays::Definition::Entity::CustomMethod.new(
|
|
82
|
+
name: "test",
|
|
83
|
+
arguments: [],
|
|
84
|
+
source: "Date.civil(year, month, 1)"
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
assert_raises ArgumentError do
|
|
88
|
+
@decorator.call(entity)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_generate_returns_error_if_source_is_missing
|
|
94
|
+
entity = Holidays::Definition::Entity::CustomMethod.new(
|
|
95
|
+
name: "test",
|
|
96
|
+
arguments: ["year"],
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
assert_raises ArgumentError do
|
|
100
|
+
@decorator.call(entity)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
entity = Holidays::Definition::Entity::CustomMethod.new(
|
|
104
|
+
name: "test",
|
|
105
|
+
arguments: ["year"],
|
|
106
|
+
source: "",
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
assert_raises ArgumentError do
|
|
110
|
+
@decorator.call(entity)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|