feriados 4.2.2 → 4.3.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
2
  SHA256:
3
- metadata.gz: f987e77a82fb0a2f30fb0712c5238df644e19b17d774b82d2431e837f36f0073
4
- data.tar.gz: c2d5fb6517a05649ca540e41644f3bf4052c64cca2dee4a90cbe2551b2720e4d
3
+ metadata.gz: 2a0f8a45bd3052939f53aa3ed238852d161f0be93d8758e9e8bf8354b58a3969
4
+ data.tar.gz: 592ae7797b8f0999346996e0409163deaccd935c3967cb7c5e5067c13d3b31db
5
5
  SHA512:
6
- metadata.gz: 55c8afdf959e9144c5d9bd23469d56a4a8c0b73b5b29263e420d585b40a764b986d41aa5e36d6842b964e45c29e8fa84854667ec2d360f66fd2784d8055aa99b
7
- data.tar.gz: 98eb156d025c308deed1ddc498b08f8b1427be7d819b14bfe3523a10ed5c493053a7a75a1ad3d01cc5dd622af604826c7bc7ac10c2d4532e7eabdd42cebbb2ac
6
+ metadata.gz: 1154029a3b4446ee620fde02254b31edf874374d9bbbdcce948ff86c9c796d83d321dcbb262c83a8e344962ab10e7be8a616096d7c44311627aa4880368f708b
7
+ data.tar.gz: dc180372559ca005f02d418a66d2869deeb0f56e5a9caacd0d4ed8ce47545da69278e519ebb54070907a4c96640c171f63ac932b340d99ac35963cd7fe78120f
@@ -23,11 +23,19 @@ module Feriados
23
23
  rules.delete(rule)
24
24
  end
25
25
 
26
- def load(file)
27
- Loader.new(file, self).load
26
+ def load(rules)
27
+ Loader.new(rules, self).load
28
28
  end
29
29
 
30
- private
30
+ def eql?(other)
31
+ rules == other.rules
32
+ end
33
+
34
+ def ==(other)
35
+ eql?(other)
36
+ end
37
+
38
+ protected
31
39
 
32
40
  attr_accessor :rules
33
41
  end
@@ -1,79 +1,20 @@
1
- require 'ostruct'
2
-
3
1
  module Feriados
4
2
  class Loader
5
3
  include Rules
6
4
 
7
- def initialize(data, calendar)
8
- @data = data
5
+ def initialize(rules, calendar)
6
+ @rules = rules
9
7
  @calendar = calendar
10
8
  end
11
9
 
12
10
  def load
13
- load_day_of_month
14
- load_functions
15
- load_fix_week_days
16
- load_fix_dates
17
- end
18
-
19
- private
20
-
21
- attr_reader :data, :calendar
22
-
23
- def load_day_of_month
24
- day_of_month.each do |month, rules|
25
- rules.each do |rule_data|
26
- rule = OpenStruct.new(rule_data)
27
- calendar.add(DayOfMonth.new(rule.day, month, rule.name))
28
- end
11
+ rules.each do |rule|
12
+ calendar.add(Rules.create_with(rule))
29
13
  end
30
14
  end
31
15
 
32
- def load_functions
33
- function.each do |function, name|
34
- function_name = function.split('_').collect(&:capitalize).join
35
- class_name = "Feriados::Rules::#{function_name}".split('::')
36
-
37
- klass = class_name.inject(Object) { |obj, const| obj.const_get(const) }
38
- klass.name = name
39
- calendar.add(klass)
40
- end
41
- end
42
-
43
- def load_fix_week_days
44
- fix_week_day.each do |month, rules|
45
- rules.each do |rule_data|
46
- rule = OpenStruct.new(rule_data)
47
- calendar.add(FixWeekDay.new(rule.week, rule.day, month, rule.name))
48
- end
49
- end
50
- end
51
-
52
- def load_fix_dates
53
- fix_date.each do |year, months|
54
- months.each do |month, rules|
55
- rules.each do |rule_data|
56
- rule = OpenStruct.new(rule_data)
57
- calendar.add(FixDate.new(year, month, rule.day, rule.name))
58
- end
59
- end
60
- end
61
- end
62
-
63
- def day_of_month
64
- data['day_of_month']['month']
65
- end
66
-
67
- def function
68
- data['function']
69
- end
70
-
71
- def fix_week_day
72
- data['fix_week_day']['month']
73
- end
16
+ private
74
17
 
75
- def fix_date
76
- data['fix_date']
77
- end
18
+ attr_reader :rules, :calendar
78
19
  end
79
20
  end
@@ -1,3 +1,6 @@
1
+ require 'ostruct'
2
+ require 'forwardable'
3
+
1
4
  require_relative './rules/rule_base'
2
5
  require_relative './rules/function'
3
6
  require_relative './rules/carnival_monday'
@@ -9,3 +12,62 @@ require_relative './rules/fix_date'
9
12
  require_relative './rules/fix_week_day'
10
13
  require_relative './rules/holy_friday'
11
14
  require_relative './rules/holy_thursday'
15
+
16
+ module Feriados
17
+ module Rules
18
+ class Rule
19
+ extend Forwardable
20
+
21
+ def_delegators :@rule, :day, :month, :year, :week
22
+
23
+ attr_reader :rule
24
+
25
+ def initialize(rule)
26
+ @rule = OpenStruct.new(rule)
27
+ end
28
+
29
+ def week_day?
30
+ rule.day && rule.month && rule.week
31
+ end
32
+
33
+ def fix_date?
34
+ rule.day && rule.month && rule.year
35
+ end
36
+
37
+ def day_of_month?
38
+ rule.day && rule.month && !fix_date? && !week_day?
39
+ end
40
+
41
+ def function?
42
+ functions = %i[easter holy_thursday holy_friday carnival_monday
43
+ carnival_tuesday]
44
+
45
+ functions.map { |e| rule.respond_to?(e) }.any?
46
+ end
47
+
48
+ def name
49
+ rule[:name] || rule.to_h.values.first
50
+ end
51
+
52
+ def function_name
53
+ rule.to_h.keys.first.to_s.split('_').collect(&:capitalize).join
54
+ end
55
+ end
56
+
57
+ def self.create_with(rule)
58
+ rule = Rule.new(rule)
59
+ return DayOfMonth.new(rule.day, rule.month, rule.name) if rule.day_of_month?
60
+ return FixWeekDay.new(rule.week, rule.day, rule.month, rule.name) if rule.week_day?
61
+ return FixDate.new(rule.year, rule.month, rule.day, rule.name) if rule.fix_date?
62
+
63
+ raise ArgumentError, "Argument #{rule} is not a valid rule" unless rule.function?
64
+
65
+ function_name = rule.function_name
66
+ class_name = "Feriados::Rules::#{function_name}".split('::')
67
+ klass = class_name.inject(Object) { |obj, const| obj.const_get(const) }
68
+ klass.name = rule.name
69
+
70
+ klass
71
+ end
72
+ end
73
+ end
@@ -39,7 +39,7 @@ class CalendarTest < Minitest::Test
39
39
  holidays2020_data.each do |month, day, description|
40
40
  date = Date.new(2020, month, day)
41
41
 
42
- assert calendar.holiday?(date)
42
+ assert calendar.holiday?(date), date
43
43
 
44
44
  assert_equal description, calendar.holiday_name(date), date
45
45
  end
@@ -53,4 +53,14 @@ class CalendarTest < Minitest::Test
53
53
 
54
54
  assert_equal(holidays2020_data.count, detected_holidays.count { |e| e })
55
55
  end
56
+
57
+ def test_load_incomplete_rules
58
+ rules = {}
59
+
60
+ calendar = Calendar.new
61
+
62
+ calendar.load(rules)
63
+
64
+ assert_equal calendar, Calendar.new
65
+ end
56
66
  end
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.2.2
4
+ version: 4.3.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: 2020-02-12 00:00:00.000000000 Z
11
+ date: 2020-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -83,14 +83,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
83
83
  requirements:
84
84
  - - ">="
85
85
  - !ruby/object:Gem::Version
86
- version: '0'
86
+ version: '2.3'
87
87
  required_rubygems_version: !ruby/object:Gem::Requirement
88
88
  requirements:
89
89
  - - ">="
90
90
  - !ruby/object:Gem::Version
91
91
  version: '0'
92
92
  requirements: []
93
- rubygems_version: 3.1.2
93
+ rubygems_version: 3.0.3
94
94
  signing_key:
95
95
  specification_version: 4
96
96
  summary: Holidays calendars