brferiados 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+