feriados 4.1.0 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/feriados.rb +4 -3
- data/lib/feriados/calendar.rb +12 -4
- data/lib/feriados/loader.rb +59 -0
- data/lib/feriados/rules.rb +10 -142
- data/lib/feriados/rules/carnival_monday.rb +9 -0
- data/lib/feriados/rules/carnival_tuesday.rb +9 -0
- data/lib/feriados/rules/day_of_month.rb +22 -0
- data/lib/feriados/rules/day_of_week.rb +20 -0
- data/lib/feriados/rules/easter.rb +39 -0
- data/lib/feriados/rules/fix_date.rb +23 -0
- data/lib/feriados/rules/fix_week_day.rb +24 -0
- data/lib/feriados/rules/holy_friday.rb +9 -0
- data/lib/feriados/rules/holy_thursday.rb +9 -0
- data/lib/feriados/rules/rule_base.rb +17 -0
- data/test/feriados_test.rb +40 -29
- data/test/test_helper.rb +0 -5
- metadata +15 -7
- data/lib/feriados/argentina.rb +0 -49
- data/lib/feriados/brazil.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8cf1cd7d69a441cb282e4fd9636dd540b82eeaea55bd5d54e85eb4d705e7d075
|
4
|
+
data.tar.gz: 8146731541c46b93292b41e3c5e878a16186ca8c25aa3d9fe9d4ec4af574f43b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f869ff0db752a3120fbe5c00aebccc03bbe344e4d507c3fa21303354722da9d6db495e38ed96515087cbfebd32f18cef2e58f77aaf59a90e555297955184ef94
|
7
|
+
data.tar.gz: e873ac319a47ec080c7d2665aae74d22c92bcc2ec97f9e8349e72d673dd4c37de0f8afae96a3063c21749e414789026f4ed18d3d8067769b3142a7fa13331ee6
|
data/lib/feriados.rb
CHANGED
data/lib/feriados/calendar.rb
CHANGED
@@ -8,20 +8,28 @@ module Feriados
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def holiday?(date)
|
11
|
-
|
11
|
+
rules.any? { |rule| rule.holiday?(date) }
|
12
12
|
end
|
13
13
|
|
14
14
|
def add(rule)
|
15
|
-
|
15
|
+
rules << rule
|
16
16
|
end
|
17
17
|
|
18
18
|
def remove(rule)
|
19
|
-
|
19
|
+
rules.delete(rule)
|
20
20
|
end
|
21
21
|
|
22
22
|
def push(rules)
|
23
|
-
|
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
|
data/lib/feriados/rules.rb
CHANGED
@@ -1,142 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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,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
|
data/test/feriados_test.rb
CHANGED
@@ -254,34 +254,45 @@ class CalendarTest < Minitest::Test
|
|
254
254
|
def test_load_argentinian_holidays
|
255
255
|
calendar = Calendar.new
|
256
256
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
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
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.
|
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:
|
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
|
-
|
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
|
data/lib/feriados/argentina.rb
DELETED
@@ -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
|
data/lib/feriados/brazil.rb
DELETED
@@ -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
|