holidays 5.7.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +1 -1
  3. data/CHANGELOG.md +11 -0
  4. data/lib/generated_definitions/north_america.rb +1 -1
  5. data/lib/generated_definitions/tr.rb +1 -0
  6. data/lib/generated_definitions/us.rb +1 -1
  7. data/lib/holidays/definition/context/generator.rb +5 -36
  8. data/lib/holidays/definition/decorator/test.rb +37 -0
  9. data/lib/holidays/definition/entity/test.rb +11 -0
  10. data/lib/holidays/definition/generator/test.rb +51 -0
  11. data/lib/holidays/definition/parser/test.rb +86 -0
  12. data/lib/holidays/definition/validator/test.rb +71 -0
  13. data/lib/holidays/errors.rb +3 -0
  14. data/lib/holidays/factory/definition.rb +24 -0
  15. data/lib/holidays/version.rb +1 -1
  16. data/test/coverage_report.rb +1 -0
  17. data/test/data/test_custom_year_range_holiday_defs.yaml +7 -0
  18. data/test/data/test_multiple_custom_holiday_defs.yaml +7 -4
  19. data/test/data/test_single_custom_holiday_defs.yaml +7 -4
  20. data/test/data/test_single_custom_holiday_with_custom_procs.yaml +11 -7
  21. data/test/defs/test_defs_ar.rb +33 -19
  22. data/test/defs/test_defs_at.rb +14 -11
  23. data/test/defs/test_defs_au.rb +172 -141
  24. data/test/defs/test_defs_be_fr.rb +23 -14
  25. data/test/defs/test_defs_be_nl.rb +23 -14
  26. data/test/defs/test_defs_bg.rb +29 -17
  27. data/test/defs/test_defs_br.rb +33 -19
  28. data/test/defs/test_defs_ca.rb +175 -176
  29. data/test/defs/test_defs_ch.rb +29 -23
  30. data/test/defs/test_defs_cl.rb +49 -27
  31. data/test/defs/test_defs_cr.rb +17 -11
  32. data/test/defs/test_defs_cz.rb +25 -15
  33. data/test/defs/test_defs_de.rb +52 -61
  34. data/test/defs/test_defs_dk.rb +31 -19
  35. data/test/defs/test_defs_ecb_target.rb +14 -10
  36. data/test/defs/test_defs_ee.rb +28 -20
  37. data/test/defs/test_defs_el.rb +29 -17
  38. data/test/defs/test_defs_es.rb +114 -52
  39. data/test/defs/test_defs_europe.rb +1154 -715
  40. data/test/defs/test_defs_federal_reserve.rb +99 -57
  41. data/test/defs/test_defs_fedex.rb +19 -12
  42. data/test/defs/test_defs_fi.rb +47 -27
  43. data/test/defs/test_defs_fr.rb +29 -24
  44. data/test/defs/test_defs_gb.rb +90 -51
  45. data/test/defs/test_defs_ge.rb +40 -28
  46. data/test/defs/test_defs_hk.rb +47 -26
  47. data/test/defs/test_defs_hr.rb +32 -18
  48. data/test/defs/test_defs_hu.rb +26 -16
  49. data/test/defs/test_defs_ie.rb +41 -25
  50. data/test/defs/test_defs_is.rb +39 -22
  51. data/test/defs/test_defs_it.rb +23 -14
  52. data/test/defs/test_defs_jp.rb +112 -59
  53. data/test/defs/test_defs_kr.rb +25 -17
  54. data/test/defs/test_defs_li.rb +20 -20
  55. data/test/defs/test_defs_lt.rb +51 -30
  56. data/test/defs/test_defs_lu.rb +17 -12
  57. data/test/defs/test_defs_ma.rb +17 -11
  58. data/test/defs/test_defs_mt_en.rb +28 -19
  59. data/test/defs/test_defs_mt_mt.rb +28 -19
  60. data/test/defs/test_defs_mx.rb +33 -22
  61. data/test/defs/test_defs_my.rb +11 -8
  62. data/test/defs/test_defs_nerc.rb +17 -11
  63. data/test/defs/test_defs_nl.rb +21 -13
  64. data/test/defs/test_defs_no.rb +31 -18
  65. data/test/defs/test_defs_north_america.rb +507 -393
  66. data/test/defs/test_defs_nyse.rb +26 -15
  67. data/test/defs/test_defs_nz.rb +47 -28
  68. data/test/defs/test_defs_pe.rb +35 -20
  69. data/test/defs/test_defs_ph.rb +17 -11
  70. data/test/defs/test_defs_pl.rb +200 -119
  71. data/test/defs/test_defs_pt.rb +33 -24
  72. data/test/defs/test_defs_ro.rb +39 -24
  73. data/test/defs/test_defs_rs_cyrl.rb +33 -26
  74. data/test/defs/test_defs_rs_la.rb +33 -26
  75. data/test/defs/test_defs_ru.rb +22 -16
  76. data/test/defs/test_defs_scandinavia.rb +193 -116
  77. data/test/defs/test_defs_se.rb +47 -28
  78. data/test/defs/test_defs_sg.rb +13 -9
  79. data/test/defs/test_defs_si.rb +93 -24
  80. data/test/defs/test_defs_sk.rb +29 -17
  81. data/test/defs/test_defs_tn.rb +15 -10
  82. data/test/defs/test_defs_tr.rb +39 -30
  83. data/test/defs/test_defs_united_nations.rb +0 -1
  84. data/test/defs/test_defs_ups.rb +19 -12
  85. data/test/defs/test_defs_us.rb +333 -217
  86. data/test/defs/test_defs_ve.rb +23 -16
  87. data/test/defs/test_defs_vi.rb +10 -8
  88. data/test/defs/test_defs_za.rb +23 -14
  89. data/test/holidays/definition/context/test_generator.rb +40 -13
  90. data/test/holidays/definition/decorator/test_test.rb +123 -0
  91. data/test/holidays/definition/generator/test_test.rb +113 -0
  92. data/test/holidays/definition/parser/test_test.rb +142 -0
  93. data/test/holidays/definition/validator/test_region.rb +5 -0
  94. data/test/holidays/definition/validator/test_test.rb +60 -0
  95. metadata +15 -8
  96. data/test/holidays/factory/test_date_calculator.rb +0 -32
  97. data/test/holidays/factory/test_definition.rb +0 -62
  98. data/test/holidays/factory/test_finder.rb +0 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 234f8ef4fb4713b7b9c50ea60389e9868c220951
4
- data.tar.gz: 166a9f5b82c4399c99c8a80d4227f8f22c35138d
3
+ metadata.gz: 788dbb02897d92ddba5782a595ff549ae9b90478
4
+ data.tar.gz: a6bf5489300f2232fc4f780e1c7da23b26ba4a5c
5
5
  SHA512:
6
- metadata.gz: 8adac311ee5aaab7272f300d8edda28a8efa41b0448725a376202ac70e9eeb28ce6283e2cbb88d91c133585ee8863122d9ac7562450abd8ae68c24d06daa365d
7
- data.tar.gz: 5ed5e47aa09290c931baf02ae3a6be7bdea0885d85591ba0499b103666af90616d3e25e0ec5235bd1124d1fa656fcc86530eafad1f898df671b724faae58ec80
6
+ metadata.gz: e9cfa0dde1527587bf9a6e97f6e9f21c1d630054246153f043ff2f8e1988e4d9c1af5e58356a4500087a7d2701c1e8a7d7b9647e429de8194d964ce8ad79d652
7
+ data.tar.gz: f5a2656bfddff46697837e710284879c778e7d9c37c86759f71aadabcb2999a3f169c676c81779550d435bc49d27f3a6e93a29d1ecb11d16def719ff97035d19
data/.gitmodules CHANGED
@@ -1,3 +1,3 @@
1
1
  [submodule "definitions"]
2
2
  path = definitions
3
- url = https://github.com/holidays/definitions
3
+ url = https://github.com/holidays/definitions
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Ruby Holidays Gem CHANGELOG
2
2
 
3
+ ## 6.0.0
4
+
5
+ * Remove support for ruby 2.1.0 since it is [no longer officially supported](https://www.ruby-lang.org/en/news/2017/04/01/support-of-ruby-2-1-has-ended/). This is the cause of the major
6
+ version bump.
7
+ * Update to [v2.0.0 definitions](https://github.com/holidays/definitions/releases/tag/v2.0.0). This changes the format
8
+ of definition tests and requires the other changes.
9
+ * Rewrite test generation logic to consume new YAML format.
10
+
11
+ To be crystal clear: this version should not behave differently in terms of holiday results than v5.7.0 of the gem. Any
12
+ differences are a bug that should be addressed.
13
+
3
14
  ## 5.7.0
4
15
 
5
16
  * Update to [v1.7.1 definitions](https://github.com/holidays/definitions/releases/tag/v1.7.1). Please see the
@@ -158,7 +158,7 @@ date
158
158
 
159
159
  "christmas_eve_holiday(date)" => Proc.new { |date|
160
160
  beginning_of_month = Date.civil(date.year, date.month, 1)
161
- (date.saturday? || date.sunday?) ? date.downto(beginning_of_month).find {|date| date if date.wday == 5} : date
161
+ (date.saturday? || date.sunday?) ? date.downto(beginning_of_month).find {|d| d if d.wday == 5} : date
162
162
  },
163
163
 
164
164
  "rosh_hashanah(year)" => Proc.new { |year|
@@ -23,6 +23,7 @@ module Holidays
23
23
  4 => [{:mday => 23, :name => "Ulusal Egemenlik ve Çocuk Bayramı", :regions => [:tr]}],
24
24
  5 => [{:mday => 1, :name => "Emek ve Dayanışma Günü", :regions => [:tr]},
25
25
  {:mday => 19, :name => "Atatürk'ü Anma Gençlik ve Spor Bayramı", :regions => [:tr]}],
26
+ 7 => [{:mday => 15, :year_ranges => [{:after => 2016}],:name => "Demokrasi ve Milli Birlik Günü", :regions => [:tr]}],
26
27
  8 => [{:mday => 30, :name => "Zafer Bayramı", :regions => [:tr]}],
27
28
  10 => [{:mday => 29, :name => "Cumhuriyet Bayramı", :regions => [:tr]}]
28
29
  }
@@ -92,7 +92,7 @@ module Holidays
92
92
  {
93
93
  "christmas_eve_holiday(date)" => Proc.new { |date|
94
94
  beginning_of_month = Date.civil(date.year, date.month, 1)
95
- (date.saturday? || date.sunday?) ? date.downto(beginning_of_month).find {|date| date if date.wday == 5} : date
95
+ (date.saturday? || date.sunday?) ? date.downto(beginning_of_month).find {|d| d if d.wday == 5} : date
96
96
  },
97
97
 
98
98
  "rosh_hashanah(year)" => Proc.new { |year|
@@ -11,10 +11,12 @@ module Holidays
11
11
  module Definition
12
12
  module Context
13
13
  class Generator
14
- def initialize(custom_method_parser, custom_method_source_decorator, custom_methods_repository)
14
+ def initialize(custom_method_parser, custom_method_source_decorator, custom_methods_repository, test_parser, test_source_generator)
15
15
  @custom_method_parser = custom_method_parser
16
16
  @custom_method_source_decorator = custom_method_source_decorator
17
17
  @custom_methods_repository = custom_methods_repository
18
+ @test_parser = test_parser
19
+ @test_source_generator = test_source_generator
18
20
  end
19
21
 
20
22
  def parse_definition_files(files)
@@ -47,7 +49,7 @@ module Holidays
47
49
  # on each other so we need a solution.
48
50
  all_custom_methods.merge!(custom_methods)
49
51
 
50
- all_tests << parse_test_definitions(definition_file['tests'])
52
+ all_tests += @test_parser.call(definition_file['tests'])
51
53
  end
52
54
 
53
55
  all_regions.flatten!.uniq!
@@ -65,7 +67,7 @@ module Holidays
65
67
  end
66
68
 
67
69
  module_src = generate_module_src(module_name, files, regions, month_strings, custom_method_string)
68
- test_src = generate_test_src(module_name, files, tests)
70
+ test_src = @test_source_generator.call(module_name, files, tests)
69
71
 
70
72
  return module_src, test_src || ''
71
73
  end
@@ -135,16 +137,6 @@ module Holidays
135
137
  end
136
138
  end
137
139
 
138
- def parse_test_definitions(tests)
139
- test_strings = []
140
-
141
- if tests
142
- test_strings << tests
143
- end
144
-
145
- test_strings
146
- end
147
-
148
140
  #FIXME This should really be split out and tested with its own unit tests.
149
141
  def generate_month_definition_strings(rules_by_month, parsed_custom_methods)
150
142
  month_strings = []
@@ -258,29 +250,6 @@ end
258
250
 
259
251
  return module_src
260
252
  end
261
-
262
- def generate_test_src(module_name, files, tests)
263
- unless tests.empty?
264
- test_src = ""
265
-
266
- test_src =<<-EndOfTests
267
- # encoding: utf-8
268
- require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
269
-
270
- # This file is generated by the Ruby Holiday gem.
271
- #
272
- # Definitions loaded: #{files.join(', ')}
273
- class #{module_name.to_s.capitalize}DefinitionTests < Test::Unit::TestCase # :nodoc:
274
-
275
- def test_#{module_name.to_s.downcase}
276
- #{tests.join("\n\n")}
277
- end
278
- end
279
- EndOfTests
280
- end
281
-
282
- return test_src
283
- end
284
253
  end
285
254
  end
286
255
  end
@@ -0,0 +1,37 @@
1
+ module Holidays
2
+ module Definition
3
+ module Decorator
4
+ class Test
5
+ def call(t)
6
+ src = ""
7
+
8
+ t.dates.each do |d|
9
+ date = "Date.civil(#{d.year}, #{d.month}, #{d.day})"
10
+
11
+ holiday_call = "Holidays.on(#{date}, #{t.regions}"
12
+
13
+ if t.options
14
+ holiday_call += ", #{decorate_options(t.options)}"
15
+ end
16
+
17
+ if t.holiday?
18
+ src += "assert_equal \"#{t.name}\", (#{holiday_call})[0] || {})[:name]\n"
19
+ else
20
+ src += "assert_nil (#{holiday_call})[0] || {})[:name]\n"
21
+ end
22
+ end
23
+
24
+ src
25
+ end
26
+
27
+ private
28
+
29
+ def decorate_options(options)
30
+ options.map do |o|
31
+ o.to_sym
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,11 @@
1
+ module Holidays
2
+ module Definition
3
+ module Entity
4
+ Test = Struct.new(:dates, :regions, :options, :name, :holiday?) do
5
+ def initialize(fields = {})
6
+ super(*fields.values_at(*members))
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,51 @@
1
+ require 'holidays/errors'
2
+
3
+ module Holidays
4
+ module Definition
5
+ module Generator
6
+ class Test
7
+ def initialize(decorator)
8
+ @decorator = decorator
9
+ end
10
+
11
+ def call(module_name, file_names, tests)
12
+ validate!(module_name, file_names, tests)
13
+
14
+ test_src =<<-EndOfTests
15
+ # encoding: utf-8
16
+ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
17
+
18
+ # This file is generated by the Ruby Holiday gem.
19
+ #
20
+ # Definitions loaded: #{file_names.join(', ')}
21
+ class #{module_name.to_s.capitalize}DefinitionTests < Test::Unit::TestCase # :nodoc:
22
+
23
+ def test_#{module_name.to_s.downcase}#{decorate(tests)}
24
+ end
25
+ end
26
+ EndOfTests
27
+
28
+ test_src
29
+ end
30
+
31
+ private
32
+
33
+ def validate!(module_name, file_names, tests)
34
+ raise ArgumentError.new("module_name cannot be missing") if module_name.nil? || module_name.empty?
35
+ raise ArgumentError.new("file_names for '#{module_name}' cannot be missing") if file_names.nil? || file_names.empty?
36
+ raise ArgumentError.new("tests for '#{module_name}' cannot be missing") if tests.nil?
37
+ end
38
+
39
+ def decorate(tests)
40
+ out = ""
41
+
42
+ tests.each do |t|
43
+ out << "\n " + @decorator.call(t)
44
+ end
45
+
46
+ out
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,86 @@
1
+ require 'holidays/definition/entity/test'
2
+
3
+ module Holidays
4
+ module Definition
5
+ module Parser
6
+ class Test
7
+ def initialize(validator)
8
+ @validator = validator
9
+ end
10
+
11
+ def call(tests)
12
+ return [] if tests.nil?
13
+
14
+ validate!(tests)
15
+
16
+ tests.map do |t|
17
+ given = t["given"]
18
+ expect = t["expect"]
19
+
20
+ Entity::Test.new(
21
+ dates: parse_dates(given["date"]),
22
+ regions: parse_regions(given["regions"]),
23
+ options: parse_options(given["options"]),
24
+ name: expect["name"],
25
+ holiday?: is_holiday?(expect["holiday"]),
26
+ )
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def validate!(tests)
33
+ raise ArgumentError unless tests.all? do |t|
34
+ dates = t["given"]["date"]
35
+ unless dates.is_a?(Array)
36
+ dates = [ dates ]
37
+ end
38
+
39
+ @validator.valid?(
40
+ {
41
+ :dates => dates,
42
+ :regions => t["given"]["regions"],
43
+ :options => t["given"]["options"],
44
+ :name => t["expect"]["name"],
45
+ :holiday => t["expect"]["holiday"],
46
+ }
47
+ )
48
+ end
49
+ end
50
+
51
+ def parse_dates(dates)
52
+ unless dates.is_a?(Array)
53
+ dates = [ dates ]
54
+ end
55
+
56
+ dates.map do |d|
57
+ DateTime.parse(d)
58
+ end
59
+ end
60
+
61
+ def parse_regions(regions)
62
+ regions.map do |r|
63
+ r.to_sym
64
+ end
65
+ end
66
+
67
+ def parse_options(options)
68
+ if options
69
+ if options.is_a?(Array)
70
+ options.map do |o|
71
+ o.to_sym
72
+ end
73
+ else
74
+ [ options.to_sym ]
75
+ end
76
+ end
77
+ end
78
+
79
+ # If flag is not present then default to 'true'
80
+ def is_holiday?(flag)
81
+ flag.nil? ? true : !!flag
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,71 @@
1
+ module Holidays
2
+ module Definition
3
+ module Validator
4
+ class Test
5
+ def valid?(t)
6
+ valid_dates?(t[:dates]) &&
7
+ valid_regions?(t[:regions]) &&
8
+ valid_name?(t[:name]) &&
9
+ valid_holiday?(t[:holiday]) &&
10
+ valid_options?(t[:options]) &&
11
+ required_fields?(t)
12
+ end
13
+
14
+ private
15
+
16
+ def valid_dates?(dates)
17
+ return false unless dates
18
+
19
+ dates.all? do |d|
20
+ begin
21
+ DateTime.parse(d)
22
+ true
23
+ rescue TypeError, ArgumentError
24
+ false
25
+ end
26
+ end
27
+ end
28
+
29
+ def valid_regions?(regions)
30
+ return false unless regions
31
+
32
+ regions.all? do |r|
33
+ r.is_a?(String)
34
+ end
35
+ end
36
+
37
+ # Can be missing
38
+ def valid_name?(n)
39
+ return true unless n
40
+ n.is_a?(String)
41
+ end
42
+
43
+ # Can be missing
44
+ def valid_holiday?(h)
45
+ return true unless h
46
+ h.is_a?(TrueClass)
47
+ end
48
+
49
+ # Okay to be missing and can be either string or array of strings
50
+ def valid_options?(options)
51
+ return true unless options
52
+
53
+ if options.is_a?(Array)
54
+ options.all? do |o|
55
+ o.is_a?(String)
56
+ end
57
+ elsif options.is_a?(String)
58
+ true
59
+ else
60
+ false
61
+ end
62
+ end
63
+
64
+ def required_fields?(t)
65
+ return false if t[:name].nil? && t[:holiday].nil?
66
+ true
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -3,6 +3,9 @@ module Holidays
3
3
 
4
4
  class FunctionNotFound < Error; end
5
5
  class InvalidFunctionResponse < Error; end
6
+
6
7
  class UnknownRegionError < Error ; end
7
8
  class InvalidRegion < Error; end
9
+
10
+ class DefinitionTestError < Error; end
8
11
  end
@@ -4,8 +4,11 @@ require 'holidays/definition/context/function_processor'
4
4
  require 'holidays/definition/context/load'
5
5
  require 'holidays/definition/decorator/custom_method_proc'
6
6
  require 'holidays/definition/decorator/custom_method_source'
7
+ require 'holidays/definition/decorator/test'
7
8
  require 'holidays/definition/generator/regions'
9
+ require 'holidays/definition/generator/test'
8
10
  require 'holidays/definition/parser/custom_method'
11
+ require 'holidays/definition/parser/test'
9
12
  require 'holidays/definition/repository/holidays_by_month'
10
13
  require 'holidays/definition/repository/regions'
11
14
  require 'holidays/definition/repository/cache'
@@ -13,6 +16,7 @@ require 'holidays/definition/repository/proc_result_cache'
13
16
  require 'holidays/definition/repository/custom_methods'
14
17
  require 'holidays/definition/validator/custom_method'
15
18
  require 'holidays/definition/validator/region'
19
+ require 'holidays/definition/validator/test'
16
20
 
17
21
  module Holidays
18
22
  module Factory
@@ -23,6 +27,8 @@ module Holidays
23
27
  custom_method_parser,
24
28
  custom_method_source_decorator,
25
29
  custom_methods_repository,
30
+ test_parser,
31
+ test_generator,
26
32
  )
27
33
  end
28
34
 
@@ -31,6 +37,8 @@ module Holidays
31
37
  custom_method_parser,
32
38
  custom_method_source_decorator,
33
39
  custom_methods_repository,
40
+ test_parser,
41
+ test_generator,
34
42
  )
35
43
  end
36
44
 
@@ -106,6 +114,22 @@ module Holidays
106
114
  Holidays::FULL_DEFINITIONS_PATH,
107
115
  )
108
116
  end
117
+
118
+ def test_generator
119
+ Holidays::Definition::Generator::Test.new(
120
+ test_decorator,
121
+ )
122
+ end
123
+
124
+ def test_decorator
125
+ Holidays::Definition::Decorator::Test.new
126
+ end
127
+
128
+ def test_parser
129
+ Holidays::Definition::Parser::Test.new(
130
+ Holidays::Definition::Validator::Test.new,
131
+ )
132
+ end
109
133
  end
110
134
  end
111
135
  end