unpack brazilian-rails

This commit is contained in:
2013-07-14 11:09:25 -04:00
parent 7d287fe530
commit e563725dc5
131 changed files with 5496 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
# encoding: UTF-8
# Load the rails application
$:.unshift(File.dirname(__FILE__)) unless
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
require 'rubygems'
require 'action_controller'
require 'active_support'
require 'action_view'
%w(date_portuguese
time_portuguese
version
br_date_helper
feriado
feriado_parser
excecoes
).each {|req| require File.dirname(__FILE__) + "/brdata/#{req}"}
module BrData
end
old_verbose = $VERBOSE
$VERBOSE = nil
[Time, Date].each do |clazz|
eval "#{clazz}::MONTHNAMES = [nil] + %w(Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro)"
eval "#{clazz}::DAYNAMES = %w(Domingo Segunda-Feira Terça-Feira Quarta-Feira Quinta-Feira Sexta-Feira Sábado)"
eval "#{clazz}::ABBR_MONTHNAMES = [nil] + %w(Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez)"
eval "#{clazz}::ABBR_DAYNAMES = %w(Dom Seg Ter Qua Qui Sex Sáb)"
end
$VERBOSE = old_verbose
feriados, metodos = FeriadoParser.parser(File.dirname(__FILE__) + "/brdata/config")
# Verifica se existe arquivo de feriados na aplicação e carrega-os
FERIADOS_PATH = ""
FERIADOS_PATH = File.expand_path(File.split(APP_PATH)[0] + "/feriados", __FILE__) if defined?(APP_PATH)
if File.directory?(FERIADOS_PATH)
f, m = FeriadoParser.parser(FERIADOS_PATH)
feriados += f
metodos += m
end
Date::FERIADOS.clear
Date::FERIADOS_METODOS.clear
feriados.each { |f| Date::FERIADOS << f }
metodos.each { |m| Date::FERIADOS_METODOS << m }

View File

@@ -0,0 +1,34 @@
# encoding: UTF-8
module ActionView::Helpers::DateHelper
# Traduz o método distance_of_time_in_words para retornar esse valor em português
#
def distance_of_time_in_words(from_time, to_time = 0, include_seconds = false)
from_time = from_time.to_time if from_time.respond_to?(:to_time)
to_time = to_time.to_time if to_time.respond_to?(:to_time)
distance_in_minutes = (((to_time - from_time).abs)/60).round
distance_in_seconds = ((to_time - from_time).abs).round
case distance_in_minutes
when 0..1
return (distance_in_minutes == 0) ? 'menos de um minuto' : '1 minuto' unless include_seconds
case distance_in_seconds
when 0..4 then 'menos de 5 segundos'
when 5..9 then 'menos de 10 segundos'
when 10..19 then 'menos de 20 segundos'
when 20..39 then 'meio minuto'
when 40..59 then 'menos de um minuto'
else '1 minuto'
end
when 2..44 then "#{distance_in_minutes} minutos"
when 45..89 then 'aproximadamente 1 hora'
when 90..1439 then "aproximadamente #{(distance_in_minutes.to_f / 60.0).round} horas"
when 1440..2879 then '1 dia'
when 2880..43199 then "#{(distance_in_minutes / 1440).round} dias"
when 43200..86399 then 'aproximadamente 1 mês'
when 86400..525959 then "#{(distance_in_minutes / 43200).round} meses"
when 525960..1051919 then 'aproximadamente 1 ano'
else "mais de #{(distance_in_minutes / 525960).round} anos"
end
end
end

View File

@@ -0,0 +1,24 @@
confraternizacao_mundial:
dia: 01
mes: 01
tiradentes:
dia: 21
mes: 04
trabalho:
dia: 01
mes: 05
independencia:
dia: 07
mes: 09
padroeira:
dia: 12
mes: 10
finados:
dia: 02
mes: 11
republica:
dia: 15
mes: 11
natal:
dia: 25
mes: 12

View File

@@ -0,0 +1,4 @@
pascoa:
metodo: pascoa
corpus_christi:
metodo: corpus_christi

View File

@@ -0,0 +1,50 @@
class String
# Cria a data no padrao brasileiro e permanece aceitando no formato tradicional.
#
# Exemplo:
# "27/09/2007".to_date
alias_method :_original_to_date, :to_date
def to_date
if /^(0[1-9]|[12]\d|3[01])\W(0[1-9]|1[012])\W(\d{4})$/ =~ self
::Date.new($3.to_i, $2.to_i, $1.to_i)
else
_original_to_date
end
end
end
class Date
# Retorna a data no padrao brasileiro
#
# Exemplo:
# data = Date.new(2007, 9, 27)
# data.to_s_br ==> "27/09/2007"
def to_s_br
strftime("%d/%m/%Y")
end
# Valida se uma string eh uma data valida
#
# Exemplo:
# Date.valid?('01/01/2007') ==> true
# Date.valid?('32/01/2007') ==> false
def self.valid?(date)
begin
date = date.to_date
Date.valid_civil?(date.year, date.month, date.day)
rescue
return false
end
true
end
end
class NilClass
def to_s_br
""
end
end

View File

@@ -0,0 +1,11 @@
# encoding: UTF-8
def cria_excecao(classe, mensagem)
eval "class #{classe}; def initialize; super('#{mensagem}'); end; end"
end
cria_excecao("FeriadoMesInvalidoError < ArgumentError", "O mês deve ser um número e estar entre 01 e 12")
cria_excecao("FeriadoDiaInvalidoError < ArgumentError", "O mês deve ser um número e estar entre 01 e 31")
cria_excecao("FeriadoParserDiretorioInvalidoError < ArgumentError", "Só é possivel fazer parser de um diretorio contendo os arquivos yml.")
cria_excecao("FeriadoParserDiretorioVazioError < ArgumentError", "Não existe nenhum yml no diretorio.")
cria_excecao("FeriadoParserMetodoInvalido < ArgumentError", "Quando for usado o parametro metodo não deve exitir dia nem mês.")

View File

@@ -0,0 +1,89 @@
# == Configuração dos Feriados
#
# 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.
#
# Você pode ver exemplos desses YML dentro do diretório samples/feriado.
#
class Feriado
attr_accessor :dia
attr_accessor :mes
attr_accessor :nome
# Construtor um feriado.
#
# Exemplo:
# Feriado.new("nome", "01", "01")
def initialize(nome, dia, mes)
valida_dia(dia)
valida_mes(mes)
self.nome = nome
self.dia = dia.to_i
self.mes = mes.to_i
end
# Compara dois feriados. Dois feriados são iguais se acontecem na mesma data.
def ==(outro_feriado)
self.mes == outro_feriado.mes && self.dia == outro_feriado.dia
end
private
def valida_dia(dia)
raise FeriadoDiaInvalidoError unless (1..31).include?(dia.to_i)
end
def valida_mes(mes)
raise FeriadoMesInvalidoError unless (1..12).include?(mes.to_i)
end
end
class Date
FERIADOS = []
FERIADOS_METODOS = []
# Retorna a true se a data for um feriado
#
# Exemplo:
# data = Date.new(2007, 12, 25)
# data.feriado? ==> true
def feriado?
return true if FERIADOS.include?(Feriado.new("novo_feriado", self.day, self.month))
FERIADOS_METODOS.each do |metodo|
return true if self == send(metodo)
end
false
end
# Retorna a pascoa no ano da data atual
#
# Exemplo:
# data = Date.new(2007, 12, 25)
# data.pascoa ==> "2007-4-8"
def pascoa
g = self.year % 19
c = (self.year / 100).floor
h = (c - ( c / 4 ).floor - ((8 * c) / 25).floor + 19 * g + 15) % 30
i = h - (h / 28).floor * (1 - (h / 28).floor * (29 / (h + 1)).floor * ((21 - g) / 11).floor)
j = (self.year + (self.year/ 4).floor + i + 2 - c + (c / 4).floor) % 7
l = i - j
month = 3 + ((l + 40) / 44).floor
day = l + 28 - (31 * (month / 4 ).floor)
Date.parse("#{self.year}-#{month}-#{day}")
end
# Retorna a corpus_christi no ano da data atual
#
# Exemplo:
# data = Date.new(2007, 12, 25)
# data.corpus_christi ==> "2007-06-07"
def corpus_christi
Date.parse((pascoa.to_time + 60.days).to_date.to_s)
end
end

View File

@@ -0,0 +1,30 @@
require 'find'
require 'yaml'
class FeriadoParser
# Faz o parser do YML e retorna a coleção de feriados.
def self.parser(diretorio)
files = []
feriados = []
metodos = []
raise FeriadoParserDiretorioInvalidoError unless File.directory?(diretorio)
Find.find(diretorio) do |file|
files << file if file =~ /.*\.yml$/
end
raise FeriadoParserDiretorioVazioError if files.empty?
files.each do |file|
itens = YAML.load_file(file)
itens.each do |key, value|
if value["metodo"]
FeriadoParserMetodoInvalido if value["dia"] && value["mes"]
metodos << value["metodo"]
else
feriados << Feriado.new(key, value["dia"], value["mes"])
end
end
end
[feriados, metodos]
end
end

View File

@@ -0,0 +1,44 @@
class String
# Cria a data com horário no padrao brasileiro e permanece aceitando no formato tradicional.
#
# Exemplo:
# "27/09/2007 01:23".to_date
alias_method :_original_to_time, :to_time
def to_time
if /^(0?[1-9]|[12]\d|3[01])\W(0?[1-9]|1[012])\W(\d{4})(\W([01]?\d|2[0123])\W([0-5]?\d)\W?([0-5]\d)?)?$/ =~ self
::Time.mktime($3.to_i, $2.to_i, $1.to_i, $5.to_i, $6.to_i, $7.to_i)
else
_original_to_time
end
end
end
class Time
alias :strftime_nolocale :strftime
# Retorna a hora no padrao brasileiro
#
# Exemplo:
# hora = Time.new
# hora.to_s_br ==> "27/09/2007 13:54"
def to_s_br
self.strftime("%d/%m/%Y %H:%M")
end
# Formata a hora usando nomes de dias e meses em Portugues
# Exemplo:
# hora = Time.new
# hora.strftime("%B") ==> "Janeiro"
# http://forum.rubyonbr.org/forums/1/topics/261
def strftime(format)
format = format.dup
format.gsub!(/%a/, Date::ABBR_DAYNAMES[self.wday])
format.gsub!(/%A/, Date::DAYNAMES[self.wday])
format.gsub!(/%b/, Date::ABBR_MONTHNAMES[self.mon])
format.gsub!(/%B/, Date::MONTHNAMES[self.mon])
self.strftime_nolocale(format)
end
end

View File

@@ -0,0 +1,10 @@
module BrData
module VERSION #:nodoc:
MAJOR = 3
MINOR = 3
TINY = 0
STRING = "#{MAJOR}.#{MINOR}.#{TINY}"
end
end