feriados 4.2.2 → 4.3.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
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