feriados 4.1.0 → 4.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b6304c6e0804e940a38a3d1bc976e2c4612f7222
4
- data.tar.gz: f05551d5ea220131d4daef3b8e3fa4f61e8d5b51
2
+ SHA256:
3
+ metadata.gz: 8cf1cd7d69a441cb282e4fd9636dd540b82eeaea55bd5d54e85eb4d705e7d075
4
+ data.tar.gz: 8146731541c46b93292b41e3c5e878a16186ca8c25aa3d9fe9d4ec4af574f43b
5
5
  SHA512:
6
- metadata.gz: 5044a6d3ceb31faf0c3ce61059f3fc795d8d9a59627f6b564dcd1808270ff4741289f93b45236e09a3f9d27160d03748958dfd5ab955277c2bde6be653a71e56
7
- data.tar.gz: d4087872f7c29a7731adf7e0ef91a673e972140a4684698575a06d1afdf44a9fe8cf49e25d2ae49b29f2cd97f949c1bfd56854602370a114534bddea5f8ceedb
6
+ metadata.gz: f869ff0db752a3120fbe5c00aebccc03bbe344e4d507c3fa21303354722da9d6db495e38ed96515087cbfebd32f18cef2e58f77aaf59a90e555297955184ef94
7
+ data.tar.gz: e873ac319a47ec080c7d2665aae74d22c92bcc2ec97f9e8349e72d673dd4c37de0f8afae96a3063c21749e414789026f4ed18d3d8067769b3142a7fa13331ee6
data/lib/feriados.rb CHANGED
@@ -1,4 +1,5 @@
1
- require_relative './feriados/calendar'
1
+ require 'yaml'
2
+
2
3
  require_relative './feriados/rules'
3
- require_relative './feriados/argentina'
4
- require_relative './feriados/brazil'
4
+ require_relative './feriados/calendar'
5
+ require_relative './feriados/loader'
@@ -8,20 +8,28 @@ module Feriados
8
8
  end
9
9
 
10
10
  def holiday?(date)
11
- @rules.any? { |rule| rule.holiday?(date) }
11
+ rules.any? { |rule| rule.holiday?(date) }
12
12
  end
13
13
 
14
14
  def add(rule)
15
- @rules << rule
15
+ rules << rule
16
16
  end
17
17
 
18
18
  def remove(rule)
19
- @rules.delete(rule)
19
+ rules.delete(rule)
20
20
  end
21
21
 
22
22
  def push(rules)
23
- @rules = rules
23
+ self.rules = rules
24
24
  end
25
+
26
+ def load_rules(file)
27
+ Loader.new(file, self).load
28
+ end
29
+
30
+ private
31
+
32
+ attr_accessor :rules
25
33
  end
26
34
 
27
35
  refine Date do
@@ -0,0 +1,59 @@
1
+ module Feriados
2
+ class Loader
3
+ def initialize(file, calendar)
4
+ @file = file
5
+ @calendar = calendar
6
+ end
7
+
8
+ def load
9
+ load_day_of_month
10
+ load_functions
11
+ load_fix_weekdays
12
+ load_fix_days
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :file, :calendar
18
+
19
+ def config_rules
20
+ @config_rules ||= YAML.load_file(file)
21
+ end
22
+
23
+ def load_day_of_month
24
+ config_rules['months'].each do |month, rules|
25
+ rules.each do |rule|
26
+ calendar.add(Rules::DayOfMonth.new(rule['day'], month))
27
+ end
28
+ end
29
+ end
30
+
31
+ def load_functions
32
+ config_rules['functions'].each do |rule|
33
+ function_name = rule.split('_').collect(&:capitalize).join
34
+ class_name = "Feriados::Rules::#{function_name}".split('::')
35
+
36
+ klass = class_name.inject(Object) { |obj, const| obj.const_get(const) }
37
+ calendar.add(klass)
38
+ end
39
+ end
40
+
41
+ def load_fix_weekdays
42
+ config_rules['fix_weekdays']['months'].each do |month, rules|
43
+ rules.each do |rule|
44
+ calendar.add(Rules::FixWeekDay.new(rule['week'], rule['day'], month))
45
+ end
46
+ end
47
+ end
48
+
49
+ def load_fix_days
50
+ config_rules['fix_days'].each do |year, months|
51
+ months.each do |month, rules|
52
+ rules.each do |rule|
53
+ calendar.add(Rules::FixDate.new(year, month, rule['day']))
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -1,142 +1,10 @@
1
- module Feriados
2
- module Rules
3
- class RuleBase
4
- def hash
5
- state.hash
6
- end
7
-
8
- def eql?(other)
9
- hash == other.hash
10
- end
11
-
12
- def ==(other)
13
- eql?(other)
14
- end
15
- end
16
-
17
- class DayOfWeek < RuleBase
18
- def initialize(wday)
19
- @wday = wday
20
- end
21
-
22
- def holiday?(date)
23
- @wday == date.wday
24
- end
25
-
26
- protected
27
-
28
- def state
29
- [@wday]
30
- end
31
- end
32
-
33
- class DayOfMonth < RuleBase
34
- def initialize(day, month)
35
- @day = day
36
- @month = month
37
- end
38
-
39
- def holiday?(date)
40
- @day == date.day && @month == date.month
41
- end
42
-
43
- protected
44
-
45
- def state
46
- [@day, @month]
47
- end
48
- end
49
-
50
- class FixDate < RuleBase
51
- def initialize(year, month, day)
52
- @year = year
53
- @month = month
54
- @day = day
55
- end
56
-
57
- def holiday?(date)
58
- @year == date.year && @month == date.month && @day = date.day
59
- end
60
-
61
- protected
62
-
63
- def state
64
- [@year, @month, @day]
65
- end
66
- end
67
-
68
- class Easter
69
- def initialize(year)
70
- @year = year
71
- end
72
-
73
- def date
74
- a = @year % 19
75
- b = @year / 100
76
- c = @year % 100
77
- d = b / 4
78
- e = b % 4
79
- f = (b + 8) / 25
80
- g = (b - f + 1) / 3
81
- h = (19 * a + b - d - g + 15) % 30
82
- i = c / 4
83
- k = c % 4
84
- l = (32 + 2 * e + 2 * i - h - k) % 7
85
- m = (a + 11 * h + 22 * l) / 451
86
- month = (h + l - 7 * m + 114) / 31
87
- day = ((h + l - 7 * m + 114) % 31) + 1
88
-
89
- Date.new(@year, month, day)
90
- end
91
-
92
- def self.holiday?(date)
93
- easter = Easter.new(date.year)
94
-
95
- easter.date == date
96
- end
97
- end
98
-
99
- class HolyFriday
100
- def self.holiday?(date)
101
- Easter.new(date.year).date - 2 == date
102
- end
103
- end
104
-
105
- class HolyThursday
106
- def self.holiday?(date)
107
- Easter.new(date.year).date - 3 == date
108
- end
109
- end
110
-
111
- class CarnivalMonday
112
- def self.holiday?(date)
113
- Easter.new(date.year).date - 48 == date
114
- end
115
- end
116
-
117
- class CarnivalTuesday
118
- def self.holiday?(date)
119
- Easter.new(date.year).date - 47 == date
120
- end
121
- end
122
-
123
- class FixWeekDay < RuleBase
124
- def initialize(week, wday, month)
125
- @week = week
126
- @wday = wday
127
- @month = month
128
- end
129
-
130
- def holiday?(date)
131
- week = (date.day - 1) / 7 + 1
132
- @wday == date.wday && @month == date.month && @week == week
133
- end
134
-
135
- protected
136
-
137
- def state
138
- [@week, @wday, @month]
139
- end
140
- end
141
- end
142
- end
1
+ require_relative './rules/rule_base'
2
+ require_relative './rules/carnival_monday'
3
+ require_relative './rules/carnival_tuesday'
4
+ require_relative './rules/day_of_month'
5
+ require_relative './rules/day_of_week'
6
+ require_relative './rules/easter'
7
+ require_relative './rules/fix_date'
8
+ require_relative './rules/fix_week_day'
9
+ require_relative './rules/holy_friday'
10
+ require_relative './rules/holy_thursday'
@@ -0,0 +1,9 @@
1
+ module Feriados
2
+ module Rules
3
+ class CarnivalMonday
4
+ def self.holiday?(date)
5
+ Easter.new(date.year).date - 48 == date
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Feriados
2
+ module Rules
3
+ class CarnivalTuesday
4
+ def self.holiday?(date)
5
+ Easter.new(date.year).date - 47 == date
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,22 @@
1
+ module Feriados
2
+ module Rules
3
+ class DayOfMonth < RuleBase
4
+ def initialize(day, month)
5
+ @day = day
6
+ @month = month
7
+ end
8
+
9
+ def holiday?(date)
10
+ day == date.day && month == date.month
11
+ end
12
+
13
+ protected
14
+
15
+ attr_reader :day, :month
16
+
17
+ def state
18
+ [day, month]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ module Feriados
2
+ module Rules
3
+ class DayOfWeek < RuleBase
4
+ def initialize(wday)
5
+ @wday = wday
6
+ end
7
+
8
+ def holiday?(date)
9
+ wday == date.wday
10
+ end
11
+
12
+ protected
13
+ attr_reader :wday
14
+
15
+ def state
16
+ [wday]
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,39 @@
1
+ module Feriados
2
+ module Rules
3
+ class Easter
4
+ def initialize(year)
5
+ @year = year
6
+ end
7
+
8
+ def date
9
+ a = year % 19
10
+ b = year / 100
11
+ c = year % 100
12
+ d = b / 4
13
+ e = b % 4
14
+ f = (b + 8) / 25
15
+ g = (b - f + 1) / 3
16
+ h = (19 * a + b - d - g + 15) % 30
17
+ i = c / 4
18
+ k = c % 4
19
+ l = (32 + 2 * e + 2 * i - h - k) % 7
20
+ m = (a + 11 * h + 22 * l) / 451
21
+ result = h + l - 7 * m + 114
22
+ month = result / 31
23
+ day = (result % 31) + 1
24
+
25
+ Date.new(year, month, day)
26
+ end
27
+
28
+ def self.holiday?(date)
29
+ easter = Easter.new(date.year)
30
+
31
+ easter.date == date
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :year
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,23 @@
1
+ module Feriados
2
+ module Rules
3
+ class FixDate < RuleBase
4
+ def initialize(year, month, day)
5
+ @year = year
6
+ @month = month
7
+ @day = day
8
+ end
9
+
10
+ def holiday?(date)
11
+ year == date.year && month == date.month && day == date.day
12
+ end
13
+
14
+ protected
15
+
16
+ attr_reader :day, :month, :year
17
+
18
+ def state
19
+ [year, month, day]
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ module Feriados
2
+ module Rules
3
+ class FixWeekDay < RuleBase
4
+ def initialize(week, wday, month)
5
+ @week = week
6
+ @wday = wday
7
+ @month = month
8
+ end
9
+
10
+ def holiday?(date)
11
+ date_from_week = (date.day - 1) / 7 + 1
12
+ wday == date.wday && month == date.month && week == date_from_week
13
+ end
14
+
15
+ protected
16
+
17
+ attr_reader :week, :wday, :month
18
+
19
+ def state
20
+ [week, wday, month]
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ module Feriados
2
+ module Rules
3
+ class HolyFriday
4
+ def self.holiday?(date)
5
+ Easter.new(date.year).date - 2 == date
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Feriados
2
+ module Rules
3
+ class HolyThursday
4
+ def self.holiday?(date)
5
+ Easter.new(date.year).date - 3 == date
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ module Feriados
2
+ module Rules
3
+ class RuleBase
4
+ def hash
5
+ state.hash
6
+ end
7
+
8
+ def eql?(other)
9
+ hash == other.hash
10
+ end
11
+
12
+ def ==(other)
13
+ eql?(other)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -254,34 +254,45 @@ class CalendarTest < Minitest::Test
254
254
  def test_load_argentinian_holidays
255
255
  calendar = Calendar.new
256
256
 
257
- Feriados::Argentina.rules.each { |rule| calendar.add rule }
258
-
259
- assert calendar.holiday?(Date.new(2016, 1, 1))
260
-
261
- assert calendar.holiday?(Date.new(2016, 2, 8))
262
- assert calendar.holiday?(Date.new(2016, 2, 9))
263
-
264
- assert calendar.holiday?(Date.new(2016, 3, 24))
265
- assert calendar.holiday?(Date.new(2016, 3, 25))
266
- assert calendar.holiday?(Date.new(2016, 3, 27))
267
-
268
- assert calendar.holiday?(Date.new(2016, 4, 2))
269
-
270
- assert calendar.holiday?(Date.new(2016, 5, 1))
271
- assert calendar.holiday?(Date.new(2016, 5, 25))
272
-
273
- assert calendar.holiday?(Date.new(2016, 6, 20))
274
-
275
- assert calendar.holiday?(Date.new(2016, 7, 8))
276
- assert calendar.holiday?(Date.new(2016, 7, 9))
277
-
278
- assert calendar.holiday?(Date.new(2016, 8, 15))
279
-
280
- assert calendar.holiday?(Date.new(2016, 10, 10))
281
-
282
- assert calendar.holiday?(Date.new(2016, 11, 28))
283
-
284
- assert calendar.holiday?(Date.new(2016, 12, 8))
285
- assert calendar.holiday?(Date.new(2016, 12, 25))
257
+ calendar.load_rules(File.join(__dir__, './argentina.yml'))
258
+
259
+ holidays_2020 = [
260
+ [1, 1],
261
+ [2, 24],
262
+ [2, 25],
263
+ [3, 23],
264
+ [3, 24],
265
+ [4, 2],
266
+ [4, 9],
267
+ [4, 10],
268
+ [4, 12],
269
+ [5, 1],
270
+ [5, 25],
271
+ [6, 15],
272
+ [6, 20],
273
+ [7, 9],
274
+ [7, 10],
275
+ [8, 17],
276
+ [10, 12],
277
+ [11, 23],
278
+ [12, 7],
279
+ [12, 8],
280
+ [12, 25]
281
+ ]
282
+
283
+ holidays_2020.each do |month, day|
284
+ assert calendar.holiday?(Date.new(2020, month, day))
285
+ end
286
+
287
+ date = Date.new(2020, 1, 1)
288
+ assertions = []
289
+ 0.upto(365) do |day|
290
+ today = date + day
291
+ holiday = calendar.holiday?(today)
292
+
293
+ assertions << holiday
294
+ end
295
+
296
+ assert_equal(holidays_2020.count, assertions.count { |e| e })
286
297
  end
287
298
  end
data/test/test_helper.rb CHANGED
@@ -1,8 +1,3 @@
1
1
  require 'minitest/autorun'
2
- require 'minitest/reporters'
3
-
4
- Minitest::Reporters.use! [
5
- Minitest::Reporters::DefaultReporter.new(detailed_skip: false)
6
- ]
7
2
 
8
3
  require 'feriados'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feriados
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Rabuini
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-14 00:00:00.000000000 Z
11
+ date: 2020-02-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Make holidays calendars from rules
14
14
  email:
@@ -18,10 +18,19 @@ extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - lib/feriados.rb
21
- - lib/feriados/argentina.rb
22
- - lib/feriados/brazil.rb
23
21
  - lib/feriados/calendar.rb
22
+ - lib/feriados/loader.rb
24
23
  - lib/feriados/rules.rb
24
+ - lib/feriados/rules/carnival_monday.rb
25
+ - lib/feriados/rules/carnival_tuesday.rb
26
+ - lib/feriados/rules/day_of_month.rb
27
+ - lib/feriados/rules/day_of_week.rb
28
+ - lib/feriados/rules/easter.rb
29
+ - lib/feriados/rules/fix_date.rb
30
+ - lib/feriados/rules/fix_week_day.rb
31
+ - lib/feriados/rules/holy_friday.rb
32
+ - lib/feriados/rules/holy_thursday.rb
33
+ - lib/feriados/rules/rule_base.rb
25
34
  - test/date_test.rb
26
35
  - test/feriados_test.rb
27
36
  - test/runner.rb
@@ -45,13 +54,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
45
54
  - !ruby/object:Gem::Version
46
55
  version: '0'
47
56
  requirements: []
48
- rubyforge_project:
49
- rubygems_version: 2.6.4
57
+ rubygems_version: 3.1.2
50
58
  signing_key:
51
59
  specification_version: 4
52
60
  summary: Holidays calendars
53
61
  test_files:
54
62
  - test/date_test.rb
55
63
  - test/feriados_test.rb
56
- - test/runner.rb
57
64
  - test/test_helper.rb
65
+ - test/runner.rb
@@ -1,49 +0,0 @@
1
- module Feriados
2
- module Argentina
3
- include Feriados::Rules
4
-
5
- def self.rules
6
- [
7
- DayOfMonth.new(1, 1),
8
- DayOfMonth.new(24, 3),
9
- DayOfMonth.new(2, 4),
10
- DayOfMonth.new(1, 5),
11
- DayOfMonth.new(25, 5),
12
- DayOfMonth.new(20, 6),
13
- DayOfMonth.new(9, 7),
14
- DayOfMonth.new(8, 12),
15
- DayOfMonth.new(25, 12),
16
-
17
- Easter,
18
- HolyThursday,
19
- HolyFriday,
20
- CarnivalMonday,
21
- CarnivalTuesday,
22
-
23
- FixWeekDay.new(3, 1, 8),
24
- FixWeekDay.new(2, 1, 10),
25
- FixWeekDay.new(4, 1, 11),
26
-
27
- FixDate.new(2012, 2, 27),
28
- FixDate.new(2012, 9, 24),
29
- FixDate.new(2012, 4, 30),
30
- FixDate.new(2012, 12, 24),
31
-
32
- FixDate.new(2013, 1, 31),
33
- FixDate.new(2013, 2, 20),
34
- FixDate.new(2013, 1, 31),
35
- FixDate.new(2013, 4, 1),
36
- FixDate.new(2013, 6, 21),
37
-
38
- FixDate.new(2014, 5, 2),
39
- FixDate.new(2014, 12, 26),
40
-
41
- FixDate.new(2015, 3, 23),
42
- FixDate.new(2015, 12, 7),
43
-
44
- FixDate.new(2016, 7, 8),
45
- FixDate.new(2016, 12, 9)
46
- ]
47
- end
48
- end
49
- end
@@ -1,23 +0,0 @@
1
- module Feriados
2
- module Brazil
3
- include Feriados::Rules
4
-
5
- def self.rules
6
- [
7
- DayOfMonth.new(1, 1),
8
- DayOfMonth.new(21, 4),
9
- DayOfMonth.new(1, 5),
10
- DayOfMonth.new(4, 6),
11
- DayOfMonth.new(7, 9),
12
- DayOfMonth.new(12, 10),
13
- DayOfMonth.new(2, 11),
14
- DayOfMonth.new(15, 11),
15
- DayOfMonth.new(25, 12),
16
-
17
- HolyFriday,
18
- CarnivalMonday,
19
- CarnivalTuesday
20
- ]
21
- end
22
- end
23
- end