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 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