brferiados 0.0.1

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.
data/CHANGELOG ADDED
File without changes
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 [name of plugin creator]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,99 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/rdoctask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/contrib/sshpublisher'
8
+ require File.join(File.dirname(__FILE__), 'lib', 'brferiado', 'version')
9
+
10
+ PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
11
+ PKG_NAME = 'brferiados'
12
+ PKG_VERSION = BrFeriado::VERSION::STRING + PKG_BUILD
13
+ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
14
+
15
+ RELEASE_NAME = "REL #{PKG_VERSION}"
16
+
17
+ RUBY_FORGE_PROJECT = "brferiados"
18
+ RUBY_FORGE_USER = "tapajos"
19
+
20
+ desc "Default Task"
21
+ task :default => [ :test ]
22
+
23
+ # Run the unit tests
24
+ Rake::TestTask.new { |t|
25
+ t.libs << "test"
26
+ t.pattern = 'test/*_test.rb'
27
+ t.verbose = true
28
+ t.warning = false
29
+ }
30
+
31
+
32
+ # Generate the RDoc documentation
33
+ # Rake::RDocTask.new { |rdoc|
34
+ # rdoc.rdoc_dir = 'doc'
35
+ # rdoc.title = "Action Mailer -- Easy email delivery and testing"
36
+ # rdoc.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
37
+ # rdoc.options << '--charset' << 'utf-8'
38
+ # rdoc.template = "#{ENV['template']}.rb" if ENV['template']
39
+ # rdoc.rdoc_files.include('README', 'CHANGELOG')
40
+ # rdoc.rdoc_files.include('lib/action_mailer.rb')
41
+ # rdoc.rdoc_files.include('lib/action_mailer/*.rb')
42
+ # }
43
+
44
+
45
+ # Create compressed packages
46
+ spec = Gem::Specification.new do |s|
47
+ s.platform = Gem::Platform::RUBY
48
+ s.name = PKG_NAME
49
+ s.summary = "brferiado é uma das gems que compoem o Brazilian Rails"
50
+ s.description = %q{brferiado é uma das gems que compoem o Brazilian Rails}
51
+ s.version = PKG_VERSION
52
+
53
+ s.author = "Marcos Tapajós"
54
+ s.email = "tapajos@gmail.com"
55
+ s.rubyforge_project = "brferiado"
56
+ s.homepage = "http://www.improveit.com.br/software_livre/brazilian_rails"
57
+
58
+ s.has_rdoc = true
59
+ s.requirements << 'none'
60
+ s.require_path = 'lib'
61
+ # s.autorequire = 'brferiado'
62
+
63
+ s.add_dependency('brdata', '>= 0.0.1')
64
+
65
+ s.files = [ "Rakefile", "README", "CHANGELOG", "TODO", "MIT-LICENSE" ]
66
+ s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
67
+ s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
68
+ end
69
+
70
+ Rake::GemPackageTask.new(spec) do |p|
71
+ p.gem_spec = spec
72
+ p.need_tar = true
73
+ p.need_zip = true
74
+ end
75
+
76
+
77
+ # desc "Publish the API documentation"
78
+ # task :pgem => [:package] do
79
+ # Rake::SshFilePublisher.new("wrath.rubyonrails.org", "public_html/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
80
+ # end
81
+ #
82
+ # desc "Publish the API documentation"
83
+ # task :pdoc => [:rdoc] do
84
+ # Rake::SshDirPublisher.new("wrath.rubyonrails.org", "public_html/am", "doc").upload
85
+ # end
86
+ #
87
+
88
+ desc "Publish the release files to RubyForge."
89
+ task :release => [ :package ] do
90
+ require 'rubyforge'
91
+ require 'rake/contrib/rubyforgepublisher'
92
+
93
+ packages = %w( gem tgz zip ).collect{ |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }
94
+
95
+ rubyforge = RubyForge.new
96
+ rubyforge.configure
97
+ rubyforge.login
98
+ rubyforge.add_release(PKG_NAME, PKG_NAME, "REL #{PKG_VERSION}", *packages)
99
+ end
data/TODO ADDED
@@ -0,0 +1,4 @@
1
+ # gem brferiado
2
+
3
+ ## Ajustar o README
4
+ ## Verificar como gerar a documentação.
data/lib/brferiado.rb ADDED
@@ -0,0 +1,25 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'rubygems'
5
+ require 'active_support'
6
+ require 'brdata'
7
+
8
+ %w(feriado
9
+ feriado_parser
10
+ version
11
+ excecoes).each {|req| require File.dirname(__FILE__) + "/brferiado/#{req}"}
12
+
13
+
14
+ module BrFeriado
15
+ end
16
+
17
+ # FERIADOS_PATH = RAILS_ROOT + '/config/feriados'
18
+ feriados, metodos = FeriadoParser.parser(File.dirname(__FILE__) + "/brferiado/config")
19
+ # if File.directory?(FERIADOS_PATH)
20
+ # f, m = FeriadoParser.parser(FERIADOS_PATH)
21
+ # feriados += f
22
+ # metodos += m
23
+ # end
24
+ Date::FERIADOS = feriados;
25
+ Date::FERIADOS_METODOS = metodos
@@ -0,0 +1,18 @@
1
+ confraternizacao_mundial:
2
+ dia: 01
3
+ mes: 01
4
+ tiradentes:
5
+ dia: 21
6
+ mes: 04
7
+ trabalho:
8
+ dia: 01
9
+ mes: 05
10
+ independencia:
11
+ dia: 07
12
+ mes: 08
13
+ republica:
14
+ dia: 15
15
+ mes: 11
16
+ natal:
17
+ dia: 25
18
+ mes: 12
@@ -0,0 +1,4 @@
1
+ pascoa:
2
+ metodo: pascoa
3
+ corpus_christi:
4
+ metodo: corpus_christi
@@ -0,0 +1,10 @@
1
+ def cria_excecao(classe, mensagem)
2
+ eval "class #{classe}; def initialize; super('#{mensagem}'); end; end"
3
+ end
4
+
5
+ cria_excecao("FeriadoMesInvalidoError < ArgumentError", "O mês deve ser um número e estar entre 01 e 12")
6
+ cria_excecao("FeriadoDiaInvalidoError < ArgumentError", "O mês deve ser um número e estar entre 01 e 31")
7
+ cria_excecao("FeriadoParserDiretorioInvalidoError < ArgumentError", "Só é possivel fazer parser de um diretorio contendo os arquivos yml.")
8
+ cria_excecao("FeriadoParserDiretorioVazioError < ArgumentError", "Não existe nenhum yml no diretorio.")
9
+ cria_excecao("FeriadoParserMetodoInvalido < ArgumentError", "Quando for usado o parametro metodo não deve exitir dia nem mês.")
10
+
@@ -0,0 +1,89 @@
1
+ # == Configuração dos Feriados
2
+ #
3
+ # Os feriados são configurados através de arquivos YML que deverão estar na pasta feriados dentro da pasta config da sua aplicação.
4
+ #
5
+ # Você pode ver exemplos desses YML dentro do diretório samples/feriado.
6
+ #
7
+ class Feriado
8
+
9
+ attr_accessor :dia
10
+ attr_accessor :mes
11
+ attr_accessor :nome
12
+
13
+ # Construtor um feriado.
14
+ #
15
+ # Exemplo:
16
+ # Feriado.new("nome", "01", "01")
17
+ def initialize(nome, dia, mes)
18
+ valida_dia(dia)
19
+ valida_mes(mes)
20
+ self.nome = nome
21
+ self.dia = dia.to_i
22
+ self.mes = mes.to_i
23
+
24
+ end
25
+
26
+ # Compara dois feriados. Dois feriados são iguais se acontecem na mesma data.
27
+ def ==(outro_feriado)
28
+ self.mes == outro_feriado.mes && self.dia == outro_feriado.dia
29
+ end
30
+
31
+ private
32
+
33
+ def valida_dia(dia)
34
+ raise FeriadoDiaInvalidoError unless (1..31).include?(dia.to_i)
35
+ end
36
+
37
+ def valida_mes(mes)
38
+ raise FeriadoMesInvalidoError unless (1..12).include?(mes.to_i)
39
+ end
40
+
41
+ end
42
+
43
+ class Date
44
+
45
+ FERIADOS = []
46
+ FERIADOS_METODOS = []
47
+
48
+ # Retorna a true se a data for um feriado
49
+ #
50
+ # Exemplo:
51
+ # data = Date.new(2007, 12, 25)
52
+ # data.feriado? ==> true
53
+ def feriado?
54
+ return true if FERIADOS.include?(Feriado.new("novo_feriado", self.day, self.month))
55
+ FERIADOS_METODOS.each do |metodo|
56
+ return true if self == send(metodo)
57
+ end
58
+ false
59
+ end
60
+
61
+ # Retorna a pascoa no ano da data atual
62
+ #
63
+ # Exemplo:
64
+ # data = Date.new(2007, 12, 25)
65
+ # data.pascoa ==> "2007-4-8"
66
+ def pascoa
67
+ g = self.year % 19
68
+ c = (self.year / 100).floor
69
+ h = (c - ( c / 4 ).floor - ((8 * c) / 25).floor + 19 * g + 15) % 30
70
+ i = h - (h / 28).floor * (1 - (h / 28).floor * (29 / (h + 1)).floor * ((21 - g) / 11).floor)
71
+ j = (self.year + (self.year/ 4).floor + i + 2 - c + (c / 4).floor) % 7
72
+ l = i - j
73
+
74
+ month = 3 + ((l + 40) / 44).floor
75
+ day = l + 28 - (31 * (month / 4 ).floor)
76
+ Date.parse("#{self.year}-#{month}-#{day}")
77
+ end
78
+
79
+ # Retorna a corpus_christi no ano da data atual
80
+ #
81
+ # Exemplo:
82
+ # data = Date.new(2007, 12, 25)
83
+ # data.corpus_christi ==> "2007-06-07"
84
+ def corpus_christi
85
+ Date.parse((pascoa.to_time + 60.days).to_date.to_s)
86
+ end
87
+
88
+ end
89
+
@@ -0,0 +1,30 @@
1
+ require 'find'
2
+ require 'yaml'
3
+ class FeriadoParser
4
+
5
+ # Faz o parser do YML e retorna a coleção de feriados.
6
+ def self.parser(diretorio)
7
+ files = []
8
+ feriados = []
9
+ metodos = []
10
+ raise FeriadoParserDiretorioInvalidoError unless File.directory?(diretorio)
11
+ Find.find(diretorio) do |file|
12
+ files << file if file =~ /.*\.yml$/
13
+ end
14
+ raise FeriadoParserDiretorioVazioError if files.empty?
15
+ files.each do |file|
16
+ itens = YAML.load_file(file)
17
+ itens.each do |key, value|
18
+ if value["metodo"]
19
+ FeriadoParserMetodoInvalido if value["dia"] && value["mes"]
20
+ metodos << value["metodo"]
21
+ else
22
+ feriados << Feriado.new(key, value["dia"], value["mes"])
23
+ end
24
+ end
25
+ end
26
+ [feriados, metodos]
27
+ end
28
+
29
+
30
+ end
@@ -0,0 +1,9 @@
1
+ module BrFeriado
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class FeriadoParserTest < Test::Unit::TestCase
4
+
5
+ FERIADO_YML_PATH = File.expand_path(File.dirname(__FILE__) + '/../lib/brferiado/config')
6
+ p FERIADO_YML_PATH
7
+ NATAL = Feriado.new("natal", 25, 12)
8
+
9
+ def test_feriados
10
+ feriados, metodos = FeriadoParser.parser(FERIADO_YML_PATH)
11
+ feriados.each {|feriado| assert_kind_of Feriado, feriado}
12
+ assert_equal NATAL, feriados.first
13
+ assert_equal ["pascoa", "corpus_christi"], metodos
14
+ end
15
+
16
+ def test_feriados_quando_path_nao_eh_diretorio
17
+ assert_raise FeriadoParserDiretorioInvalidoError do
18
+ FeriadoParser.parser(File.dirname(__FILE__) + 'dinheiro_test.rb')
19
+ end
20
+ end
21
+
22
+ def test_feriados_quando_path_nao_contem_arquivos
23
+ assert_raise FeriadoParserDiretorioVazioError do
24
+ FeriadoParser.parser(File.dirname(__FILE__))
25
+ end
26
+ end
27
+
28
+
29
+ end
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class FeriadoTest < Test::Unit::TestCase
4
+
5
+ ATRIBUTOS = %w(dia mes nome)
6
+
7
+ # feriado
8
+ def test_feriado_quando_feriado
9
+ assert "25/12/2007".to_date.feriado?
10
+ end
11
+
12
+ def test_feriado_quando_nao_eh_feriado
13
+ assert !"01/12/2007".to_date.feriado?
14
+ end
15
+
16
+ def test_feriado_quando_feriado_eh_pascoa
17
+ assert "08/04/2007".to_date.feriado?
18
+ end
19
+
20
+ def test_feriado_quando_feriado_eh_corpus_christi
21
+ assert "07/06/2007".to_date.feriado?
22
+ end
23
+
24
+ # pascoa
25
+ def test_pascoa
26
+ assert_equal "08/04/2007", "01/01/2007".to_date.pascoa.to_s_br
27
+ end
28
+
29
+ # corpus_christi
30
+ def test_corpus_christi
31
+ assert_equal "07/06/2007", "01/01/2007".to_date.corpus_christi.to_s_br
32
+ end
33
+
34
+
35
+ def test_attributes
36
+ feriado = Feriado.new("nome", "01", "01")
37
+ ATRIBUTOS.each do |atributo|
38
+ assert_respond_to feriado, "#{atributo}", "Deveria existir o método #{atributo}"
39
+ assert_respond_to feriado, "#{atributo}=", "Deveria existir o método #{atributo}="
40
+ end
41
+ end
42
+
43
+ def test_initialize
44
+ feriado = Feriado.new("nome", "01", "01")
45
+ assert feriado, "deveria ter criado um feriado"
46
+ assert_equal "nome", feriado.nome
47
+ assert_equal 1, feriado.dia
48
+ assert_equal 1, feriado.mes
49
+ end
50
+
51
+ def test_initialize_com_dia_invalido
52
+ ['a', 0, -1, 32, '32', '-1', '0'].each do |invalid_day|
53
+ assert_raise FeriadoDiaInvalidoError do
54
+ Feriado.new("nome", invalid_day, "01")
55
+ raise "Deveria retornar FeriadoDiaInvalidoError para dia #{invalid_day}"
56
+ end
57
+ end
58
+ end
59
+
60
+ def test_initialize_com_mes_invalido
61
+ ['a', '13', 13, -1, '-1', '0'].each do |invalid_month|
62
+ assert_raise FeriadoMesInvalidoError do
63
+ Feriado.new("nome", "01", invalid_month)
64
+ raise "Deveria retornar FeriadoMesInvalidoError para mês #{invalid_month}"
65
+ end
66
+ end
67
+ end
68
+
69
+ def test_igualdade
70
+ assert_equal Feriado.new("nome", "01", "01"), Feriado.new("nome2", "01", "01")
71
+ end
72
+
73
+ def test_igualdade_quando_nao_eh_igual
74
+ assert_not_equal Feriado.new("nome", "01", "01"), Feriado.new("nome2", "01", "02")
75
+ end
76
+
77
+ end
@@ -0,0 +1,16 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/brferiado'
3
+
4
+
5
+ def tornar_metodos_publicos(clazz)
6
+ clazz.class_eval do
7
+ private_instance_methods.each { |instance_method| public instance_method }
8
+ private_methods.each { |method| public_class_method method }
9
+ end
10
+ end
11
+
12
+ def p80 text
13
+ p '*'*80
14
+ p text
15
+ p '*'*80
16
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: brferiados
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - "Marcos Tapaj\xC3\xB3s"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-06-23 00:00:00 -03:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: brdata
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.1
24
+ version:
25
+ description: "brferiado \xC3\xA9 uma das gems que compoem o Brazilian Rails"
26
+ email: tapajos@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - Rakefile
35
+ - README
36
+ - CHANGELOG
37
+ - TODO
38
+ - MIT-LICENSE
39
+ - lib/brferiado
40
+ - lib/brferiado/config
41
+ - lib/brferiado/config/nacionais_fixos.yml
42
+ - lib/brferiado/config/nacionais_moveis.yml
43
+ - lib/brferiado/excecoes.rb
44
+ - lib/brferiado/feriado.rb
45
+ - lib/brferiado/feriado_parser.rb
46
+ - lib/brferiado/version.rb
47
+ - lib/brferiado.rb
48
+ - test/feriado_parser_test.rb
49
+ - test/feriado_test.rb
50
+ - test/test_helper.rb
51
+ has_rdoc: true
52
+ homepage: http://www.improveit.com.br/software_livre/brazilian_rails
53
+ post_install_message:
54
+ rdoc_options: []
55
+
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements:
71
+ - none
72
+ rubyforge_project: brferiado
73
+ rubygems_version: 1.2.0
74
+ signing_key:
75
+ specification_version: 2
76
+ summary: "brferiado \xC3\xA9 uma das gems que compoem o Brazilian Rails"
77
+ test_files: []
78
+