feriados 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 71cd22bc425ac6ae05dc1627bf19c299259854b2
4
+ data.tar.gz: 81b3267c496407e6c68fd9906198bd7e598f9cc6
5
+ SHA512:
6
+ metadata.gz: a46fc0d08030e46a3305dc3607eff76db05a8af2b6efa3a44a189735643e052c86bdf6a0381dc1f90791c3b8ee3099b2b2c9e1ccd15d0abc844d116a0bb245c2
7
+ data.tar.gz: a8d4d901173bcfef33a62abbe356f308fe97b3f68389105481024c217203b9163e4ed93b7272540655330a1ed5e33e59529ab074104b9d3e7b7c824e429cae8c
@@ -0,0 +1,61 @@
1
+ #encoding: utf-8
2
+
3
+ module Feriados
4
+ module Argentina
5
+ # Feriados Fijos
6
+ Feriados.add 'Año nuevo', day: 1, month: 1
7
+ Feriados.add 'Día Nacional de la Memoria por la Verdad y la Justicia',
8
+ day: 24, month: 3
9
+ Feriados.add 'Día del Veterano y de los Caídos en la Guerra de Malvinas',
10
+ day: 2, month: 4
11
+ Feriados.add 'Día del trabajador', day: 1, month: 5
12
+ Feriados.add 'Día de la Revolución de Mayo', day: 25, month: 5
13
+ Feriados.add 'Paso a la Inmortalidad del General Manuel Belgrano', day: 20,
14
+ month: 6
15
+ Feriados.add 'Día de la Independencia', day: 9, month: 7
16
+ Feriados.add 'Inmaculada Concepción de María', day: 8, month: 12
17
+ Feriados.add 'Navidad', day: 25, month: 12
18
+
19
+ # Feriados calculados
20
+ Feriados.add 'easter', function: ->(year) { Feriados.easter(year) }
21
+ Feriados.add 'Viernes Santo', function: ->(year) { Feriados.easter(year) - 2 }
22
+ Feriados.add 'Jueves Santo', function: ->(year) { Feriados.easter(year) - 3 }
23
+ Feriados.add 'Lunes de Carnaval', function: ->(year) { Feriados.easter(year) - 48 }
24
+ Feriados.add 'Martes de Carnaval', function: ->(year) { Feriados.easter(year) - 47 }
25
+
26
+ # Feriados relativos
27
+ Feriados.add 'Paso a la Inmortalidad del General José de San Martín',
28
+ day: 17, month: 8, fix_change: [:third, :monday]
29
+ Feriados.add 'Día del Respeto a la Diversidad Cultural', day: 12, month: 10,
30
+ fix_change: [:second, :monday]
31
+ Feriados.add 'Día de la Soberanía Nacional', day: 20, month: 11,
32
+ fix_change: [:fourth, :monday]
33
+
34
+ # Feriados especiales 2012
35
+ Feriados.add "Día del Bicentenario de la Creación y Primera Jura de la \
36
+ Bandera Argentina", day: 27, month: 2, year: 2012
37
+ Feriados.add "Día del Bicentenario de la Batalla de Tucumán", day: 24,
38
+ month: 9, year: 2012
39
+ Feriados.add "Feriado puente", day: 30, month: 4, year: 2012
40
+ Feriados.add "Feriado puente", day: 24, month: 12, year: 2012
41
+
42
+ # Feriados especiales 2013
43
+ Feriados.add "Bicentenario de la Asamblea General Constituyente de 1813",
44
+ day: 31, month: 1, year: 2013
45
+ Feriados.add "Día de la Batalla de Salta", day: 20, month: 2
46
+ Feriados.add "Feriado puente", day: 1, month: 4, year: 2013
47
+ Feriados.add "Feriado puente", day: 21, month: 6, year: 2013
48
+
49
+ # Feriados especiales 2014
50
+ Feriados.add "Feriado puente", day: 2, month: 5, year: 2014
51
+ Feriados.add "Feriado puente", day: 26, month: 12, year: 2014
52
+
53
+ # Feriados especiales 2015
54
+ Feriados.add "Feriado puente", day: 23, month: 3, year: 2015
55
+ Feriados.add "Feriado puente", day: 7, month: 12, year: 2015
56
+
57
+ # Feriados especiales 2016
58
+ Feriados.add "Feriado puente", day: 8, month: 7, year: 2016
59
+ Feriados.add "Feriado puente", day: 9, month: 12, year: 2016
60
+ end
61
+ end
data/lib/feriados.rb ADDED
@@ -0,0 +1,93 @@
1
+ require 'date'
2
+
3
+ module Feriados
4
+ DAYS = {sunday: 7, monday: 1, tuesday: 2, wednesday: 3, thursday: 4,
5
+ friday: 5, saturday: 6}
6
+
7
+ def self.add(description, options = {})
8
+ @holidays_by_month ||= {}
9
+ month = options[:month] || 0
10
+ @holidays_by_month[month] ||= []
11
+ @holidays_by_month[month] << {description: description}.merge!(options)
12
+ end
13
+
14
+ def self.calculated(th, day, month, year)
15
+ n = {first: 1, second: 2, third: 3, fourth: 4}
16
+
17
+ week = n[th]
18
+ date = Date.civil(year, month, 1)
19
+ offset = DAYS[day] - date.wday
20
+ offset += 7 if offset < 0
21
+ offset += 7 * (week - 1)
22
+ date + offset
23
+ end
24
+
25
+ def self.easter(year)
26
+ y = year
27
+ a = y % 19
28
+ b = y / 100
29
+ c = y % 100
30
+ d = b / 4
31
+ e = b % 4
32
+ f = (b + 8) / 25
33
+ g = (b - f + 1) / 3
34
+ h = (19 * a + b - d - g + 15) % 30
35
+ i = c / 4
36
+ k = c % 4
37
+ l = (32 + 2 * e + 2 * i - h - k) % 7
38
+ m = (a + 11 * h + 22 * l) / 451
39
+ month = (h + l - 7 * m + 114) / 31
40
+ day = ((h + l - 7 * m + 114) % 31) + 1
41
+ Date.civil(year, month, day)
42
+ end
43
+
44
+ def self.between(start_date, end_date)
45
+ dates, list = {}, []
46
+
47
+ (start_date..end_date).each do |date|
48
+ dates[date.year] = [0] unless dates[date.year]
49
+ unless dates[date.year].include?(date.month)
50
+ dates[date.year] << date.month
51
+ end
52
+ end
53
+
54
+ dates.each do |year, months|
55
+ months.each do |month|
56
+ if holidays = @holidays_by_month[month]
57
+ holidays.each do |holiday|
58
+ description = holiday[:description]
59
+
60
+ date = if holiday[:function]
61
+ holiday[:function].call(year)
62
+ elsif holiday[:fix_change]
63
+ calculated(holiday[:fix_change][0], holiday[:fix_change][1],
64
+ month, year)
65
+ elsif holiday[:variable_change]
66
+ holiday[:variable_change].call(Date.civil(year, month,
67
+ holiday[:day]))
68
+ else
69
+ Date.civil(holiday[:year] || year, month, holiday[:day])
70
+ end
71
+
72
+ if date.between?(start_date, end_date) && date.year == year
73
+ list << { date: date, description: description }
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ list.sort_by { |holidays| holidays[:date] }
81
+ end
82
+ end
83
+
84
+ class Date
85
+ def is_holiday?
86
+ holidays = Feriados.between(self, self)
87
+ holidays && !holidays.empty?
88
+ end
89
+
90
+ def is_week_end?
91
+ self.wday == 6 or self.wday == 0
92
+ end
93
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'minitest/autorun'
2
+ require 'feriados'
3
+ require 'feriados/argentina'
4
+ require 'date'
data/test/test_date.rb ADDED
@@ -0,0 +1,74 @@
1
+ #encoding:utf-8
2
+
3
+ require 'helper.rb'
4
+
5
+ class DateTests < MiniTest::Test
6
+ def setup
7
+ @date = Date.civil(2012,1,1)
8
+ end
9
+
10
+ def test_extending_date_class
11
+ assert @date.respond_to?('is_holiday?')
12
+ assert @date.respond_to?('is_week_end?')
13
+ end
14
+
15
+ def test_week_end
16
+ regulars = [ :monday, :tuesday, :wednesday, :thursday, :friday ]
17
+ week_end = [ :saturday, :sunday ]
18
+ nths = [ :first, :second, :third, :fourth ]
19
+
20
+ (2012..2015).each do |year|
21
+ (1..12).each do |month|
22
+ nths.each do |n|
23
+ regulars.each do |day|
24
+ assert !Feriados.calculated(n, day, month, year).is_week_end?
25
+ end
26
+ week_end.each do |day|
27
+ assert Feriados.calculated(n, day, month, year).is_week_end?
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ def test_calculated
35
+ # Día de la bandera.
36
+ assert_equal 18, Feriados.calculated(:third, :monday, 6, 2012).day
37
+ assert_equal 17, Feriados.calculated(:third, :monday, 6, 2013).day
38
+ assert_equal 16, Feriados.calculated(:third, :monday, 6, 2014).day
39
+ assert_equal 15, Feriados.calculated(:third, :monday, 6, 2015).day
40
+
41
+ # Diecisiete de Agosto.
42
+ assert_equal 20, Feriados.calculated(:third, :monday, 8, 2012).day
43
+ assert_equal 19, Feriados.calculated(:third, :monday, 8, 2013).day
44
+ assert_equal 18, Feriados.calculated(:third, :monday, 8, 2014).day
45
+ assert_equal 17, Feriados.calculated(:third, :monday, 8, 2015).day
46
+
47
+ # Easter.
48
+ assert_equal 8, Feriados.easter(2012).day
49
+ assert_equal 31, Feriados.easter(2013).day
50
+ assert_equal 20, Feriados.easter(2014).day
51
+ assert_equal 5, Feriados.easter(2015).day
52
+
53
+ # Carnaval
54
+ assert_equal 11, (Feriados.easter(2013) - 48).day
55
+ assert_equal 3, (Feriados.easter(2014) - 48).day
56
+ assert_equal 16, (Feriados.easter(2015) - 48).day
57
+
58
+ assert_equal 12, (Feriados.easter(2013) - 47).day
59
+ assert_equal 4, (Feriados.easter(2014) - 47).day
60
+ assert_equal 17, (Feriados.easter(2015) - 47).day
61
+ end
62
+
63
+ def test_fix_holidays
64
+ 2012.upto(2015) do |year|
65
+ assert Date.civil(year, 1, 1).is_holiday?
66
+ assert Date.civil(year, 3, 24).is_holiday?
67
+ assert Date.civil(year, 4, 2).is_holiday?
68
+ assert Date.civil(year, 5, 1).is_holiday?
69
+ assert Date.civil(year, 7, 9).is_holiday?
70
+ assert Date.civil(year, 12, 8).is_holiday?
71
+ assert Date.civil(year, 12, 25).is_holiday?
72
+ end
73
+ end
74
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: feriados
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sebastian Rabuini
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-25 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Feriados argentinos. Adaptable to other countries
14
+ email:
15
+ - srabuini@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/feriados.rb
21
+ - lib/feriados/argentina.rb
22
+ - test/helper.rb
23
+ - test/test_date.rb
24
+ homepage: https://github.com/srabuini/feriados
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.2.2
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Feriados argentinos
48
+ test_files:
49
+ - test/helper.rb
50
+ - test/test_date.rb