brdata 0.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -0,0 +1 @@
1
+ Aqui vai o readme
data/Rakefile CHANGED
@@ -29,17 +29,16 @@ Rake::TestTask.new { |t|
29
29
  }
30
30
 
31
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
- # }
32
+ #Generate the RDoc documentation
33
+ Rake::RDocTask.new { |rdoc|
34
+ rdoc.rdoc_dir = 'doc'
35
+ rdoc.title = "Brazilian Rails -- Data"
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/**/*')
41
+ }
43
42
 
44
43
 
45
44
  # Create compressed packages
@@ -50,11 +49,12 @@ spec = Gem::Specification.new do |s|
50
49
  s.description = %q{brdata é uma das gems que compoem o Brazilian Rails}
51
50
  s.version = PKG_VERSION
52
51
 
53
- s.author = "Marcos Tapajós"
52
+ s.authors = ["Marcos Tapajós", "Celestino Gomes", "Andre Kupkosvki", "Vinícius Teles"]
54
53
  s.email = "tapajos@gmail.com"
55
54
  s.rubyforge_project = "brdata"
56
55
  s.homepage = "http://www.improveit.com.br/software_livre/brazilian_rails"
57
56
 
57
+ s.add_dependency('actionpack', '>= 1.13.6')
58
58
  s.add_dependency('activesupport', '>= 1.4.2')
59
59
 
60
60
  s.has_rdoc = true
@@ -62,7 +62,7 @@ spec = Gem::Specification.new do |s|
62
62
  s.require_path = 'lib'
63
63
  # s.autorequire = 'brdata'
64
64
 
65
- s.files = [ "Rakefile", "README", "CHANGELOG", "TODO", "MIT-LICENSE" ]
65
+ s.files = [ "Rakefile", "README", "CHANGELOG", "MIT-LICENSE" ]
66
66
  s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
67
67
  s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
68
68
  end
@@ -2,16 +2,22 @@ $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
4
  require 'rubygems'
5
+ require 'action_controller'
6
+ require 'html/document'
5
7
  require 'active_support'
6
-
8
+ require 'action_view'
7
9
 
8
10
  %w(date_portuguese
9
11
  time_portuguese
10
12
  version
13
+ br_date_helper
14
+ feriado
15
+ feriado_parser
16
+ excecoes
11
17
  ).each {|req| require File.dirname(__FILE__) + "/brdata/#{req}"}
12
18
 
13
19
 
14
- module BrCep
20
+ module BrData
15
21
  end
16
22
 
17
23
  old_verbose = $VERBOSE
@@ -24,3 +30,13 @@ $VERBOSE = nil
24
30
  end
25
31
 
26
32
  $VERBOSE = old_verbose
33
+
34
+ # FERIADOS_PATH = RAILS_ROOT + '/config/feriados'
35
+ feriados, metodos = FeriadoParser.parser(File.dirname(__FILE__) + "/brdata/config")
36
+ # if File.directory?(FERIADOS_PATH)
37
+ # f, m = FeriadoParser.parser(FERIADOS_PATH)
38
+ # feriados += f
39
+ # metodos += m
40
+ # end
41
+ Date::FERIADOS = feriados;
42
+ Date::FERIADOS_METODOS = metodos
@@ -0,0 +1,33 @@
1
+ module ActionView::Helpers::DateHelper
2
+ # Traduz o método distance_of_time_in_words para retornar esse valor em português
3
+ #
4
+ def distance_of_time_in_words(from_time, to_time = 0, include_seconds = false)
5
+ from_time = from_time.to_time if from_time.respond_to?(:to_time)
6
+ to_time = to_time.to_time if to_time.respond_to?(:to_time)
7
+ distance_in_minutes = (((to_time - from_time).abs)/60).round
8
+ distance_in_seconds = ((to_time - from_time).abs).round
9
+
10
+ case distance_in_minutes
11
+ when 0..1
12
+ return (distance_in_minutes == 0) ? 'menos de um minuto' : '1 minuto' unless include_seconds
13
+ case distance_in_seconds
14
+ when 0..4 then 'menos de 5 segundos'
15
+ when 5..9 then 'menos de 10 segundos'
16
+ when 10..19 then 'menos de 20 segundos'
17
+ when 20..39 then 'meio minuto'
18
+ when 40..59 then 'menos de um minuto'
19
+ else '1 minuto'
20
+ end
21
+
22
+ when 2..44 then "#{distance_in_minutes} minutos"
23
+ when 45..89 then 'aproximadamente 1 hora'
24
+ when 90..1439 then "aproximadamente #{(distance_in_minutes.to_f / 60.0).round} horas"
25
+ when 1440..2879 then '1 dia'
26
+ when 2880..43199 then "#{(distance_in_minutes / 1440).round} dias"
27
+ when 43200..86399 then 'aproximadamente 1 mês'
28
+ when 86400..525959 then "#{(distance_in_minutes / 43200).round} meses"
29
+ when 525960..1051919 then 'aproximadamente 1 ano'
30
+ else "mais de #{(distance_in_minutes / 525960).round} anos"
31
+ end
32
+ end
33
+ end
@@ -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
@@ -1,8 +1,8 @@
1
1
  module BrData
2
2
  module VERSION #:nodoc:
3
- MAJOR = 0
3
+ MAJOR = 2
4
4
  MINOR = 0
5
- TINY = 1
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'mocha'
3
+
4
+ class ActionViewTest < Test::Unit::TestCase
5
+
6
+ include ActionView::Helpers::DateHelper
7
+
8
+ def test_distance_of_time_in_words
9
+ assert_equal "menos de um minuto", distance_of_time_in_words("Sat Sep 08 22:51:58 -0300 2007".to_time, "Sat Sep 08 22:51:59 -0300 2007".to_time)
10
+ assert_equal "menos de 5 segundos", distance_of_time_in_words("Sat Sep 08 22:51:58 -0300 2007".to_time, "Sat Sep 08 22:51:59 -0300 2007".to_time, true)
11
+ assert_equal "menos de 10 segundos", distance_of_time_in_words("Sat Sep 08 22:51:50 -0300 2007".to_time, "Sat Sep 08 22:51:55 -0300 2007".to_time, true)
12
+ assert_equal "menos de 20 segundos", distance_of_time_in_words("Sat Sep 08 22:51:00 -0300 2007".to_time, "Sat Sep 08 22:51:10 -0300 2007".to_time, true)
13
+ assert_equal "meio minuto", distance_of_time_in_words("Sat Sep 08 22:51:00 -0300 2007".to_time, "Sat Sep 08 22:51:20 -0300 2007".to_time, true)
14
+ assert_equal "menos de um minuto", distance_of_time_in_words("Sat Sep 08 22:51:00 -0300 2007".to_time, "Sat Sep 08 22:51:40 -0300 2007".to_time, true)
15
+ assert_equal "1 minuto", distance_of_time_in_words("Sat Sep 08 22:51:00 -0300 2007".to_time, "Sat Sep 08 22:52:00 -0300 2007".to_time, true)
16
+ assert_equal "1 minuto", distance_of_time_in_words("Sat Sep 08 22:51:59 -0300 2007".to_time, "Sat Sep 08 22:52:59 -0300 2007".to_time)
17
+ assert_equal "2 minutos", distance_of_time_in_words("Sat Sep 08 22:51:59 -0300 2007".to_time, "Sat Sep 08 22:53:59 -0300 2007".to_time)
18
+ assert_equal "aproximadamente 1 hora", distance_of_time_in_words("Sat Sep 08 21:51:59 -0300 2007".to_time, "Sat Sep 08 22:51:59 -0300 2007".to_time)
19
+ assert_equal "aproximadamente 2 horas", distance_of_time_in_words("Sat Sep 08 20:51:59 -0300 2007".to_time, "Sat Sep 08 22:51:59 -0300 2007".to_time)
20
+ assert_equal "1 dia", distance_of_time_in_words("Sat Sep 07 20:51:59 -0300 2007".to_time, "Sat Sep 08 20:51:59 -0300 2007".to_time)
21
+ assert_equal "2 dias", distance_of_time_in_words("Sat Sep 06 20:51:59 -0300 2007".to_time, "Sat Sep 08 20:51:59 -0300 2007".to_time)
22
+ assert_equal "aproximadamente 1 mês", distance_of_time_in_words("Sat Oct 06 20:51:59 -0300 2007".to_time, "Sat Sep 06 20:51:59 -0300 2007".to_time)
23
+ assert_equal "2 meses", distance_of_time_in_words("Sat Nov 06 20:51:59 -0300 2007".to_time, "Sat Sep 06 20:51:59 -0300 2007".to_time)
24
+ assert_equal "12 meses", distance_of_time_in_words("Sat Nov 06 20:51:59 -0300 2006".to_time, "Sat Nov 06 20:51:59 -0300 2007".to_time)
25
+ assert_equal "aproximadamente 1 ano", distance_of_time_in_words("Sat Nov 06 20:51:59 -0300 2006".to_time, "Sat Dec 06 20:51:59 -0300 2007".to_time)
26
+ assert_equal "mais de 3 anos", distance_of_time_in_words("Sat Nov 06 20:51:59 -0300 2006".to_time, "Sat Dec 06 20:51:59 -0300 2009".to_time)
27
+ end
28
+ 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/brdata/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
metadata CHANGED
@@ -1,17 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brdata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Marcos Tapaj\xC3\xB3s"
8
+ - Celestino Gomes
9
+ - Andre Kupkosvki
10
+ - "Vin\xC3\xADcius Teles"
8
11
  autorequire:
9
12
  bindir: bin
10
13
  cert_chain: []
11
14
 
12
- date: 2008-06-22 00:00:00 -03:00
15
+ date: 2008-08-31 00:00:00 -03:00
13
16
  default_executable:
14
17
  dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: actionpack
20
+ type: :runtime
21
+ version_requirement:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.13.6
27
+ version:
15
28
  - !ruby/object:Gem::Dependency
16
29
  name: activesupport
17
30
  type: :runtime
@@ -34,14 +47,23 @@ files:
34
47
  - Rakefile
35
48
  - README
36
49
  - CHANGELOG
37
- - TODO
38
50
  - MIT-LICENSE
39
51
  - lib/brdata
52
+ - lib/brdata/br_date_helper.rb
53
+ - lib/brdata/config
54
+ - lib/brdata/config/nacionais_fixos.yml
55
+ - lib/brdata/config/nacionais_moveis.yml
40
56
  - lib/brdata/date_portuguese.rb
57
+ - lib/brdata/excecoes.rb
58
+ - lib/brdata/feriado.rb
59
+ - lib/brdata/feriado_parser.rb
41
60
  - lib/brdata/time_portuguese.rb
42
61
  - lib/brdata/version.rb
43
62
  - lib/brdata.rb
63
+ - test/br_date_helper_test.rb
44
64
  - test/date_test.rb
65
+ - test/feriado_parser_test.rb
66
+ - test/feriado_test.rb
45
67
  - test/test_helper.rb
46
68
  - test/time_test.rb
47
69
  has_rdoc: true
data/TODO DELETED
@@ -1,5 +0,0 @@
1
- # gem brdata
2
-
3
- ## Dependências da GEM
4
- ## Ajustar o README
5
- ## Verificar como regrar a documentação.