brdata 0.0.1 → 2.0.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.
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.