Remove brazilian-rails

master
Alinson S. Xavier 10 years ago
parent 89727ab950
commit 7da6f7137d

@ -1,11 +0,0 @@
language: ruby
rvm:
- 1.8.7
- 1.9.2
- 1.9.3
- ree
gemfile:
- gemfiles/on_rails_23x.gemfile
- gemfiles/on_rails_30x.gemfile
- gemfiles/on_rails_31x.gemfile
- gemfiles/on_rails_32x.gemfile

@ -1,9 +0,0 @@
source :rubygems
gem 'rails', '>= 3.0.0'
gem 'sqlite3-ruby', '1.3.3'
gem 'rake', '>=0.9.2'
gem 'rdoc'
gem 'rspec', '2.5.0'
gem 'mocha', '0.9.12'
gem 'fakeweb', '1.3.0'

@ -1,105 +0,0 @@
GEM
remote: http://rubygems.org/
specs:
actionmailer (3.2.6)
actionpack (= 3.2.6)
mail (~> 2.4.4)
actionpack (3.2.6)
activemodel (= 3.2.6)
activesupport (= 3.2.6)
builder (~> 3.0.0)
erubis (~> 2.7.0)
journey (~> 1.0.1)
rack (~> 1.4.0)
rack-cache (~> 1.2)
rack-test (~> 0.6.1)
sprockets (~> 2.1.3)
activemodel (3.2.6)
activesupport (= 3.2.6)
builder (~> 3.0.0)
activerecord (3.2.6)
activemodel (= 3.2.6)
activesupport (= 3.2.6)
arel (~> 3.0.2)
tzinfo (~> 0.3.29)
activeresource (3.2.6)
activemodel (= 3.2.6)
activesupport (= 3.2.6)
activesupport (3.2.6)
i18n (~> 0.6)
multi_json (~> 1.0)
arel (3.0.2)
builder (3.0.0)
diff-lcs (1.1.2)
erubis (2.7.0)
fakeweb (1.3.0)
hike (1.2.1)
i18n (0.6.0)
journey (1.0.4)
json (1.6.5)
mail (2.4.4)
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.19)
mocha (0.9.12)
multi_json (1.3.6)
polyglot (0.3.3)
rack (1.4.1)
rack-cache (1.2)
rack (>= 0.4)
rack-ssl (1.3.2)
rack
rack-test (0.6.1)
rack (>= 1.0)
rails (3.2.6)
actionmailer (= 3.2.6)
actionpack (= 3.2.6)
activerecord (= 3.2.6)
activeresource (= 3.2.6)
activesupport (= 3.2.6)
bundler (~> 1.0)
railties (= 3.2.6)
railties (3.2.6)
actionpack (= 3.2.6)
activesupport (= 3.2.6)
rack-ssl (~> 1.3.2)
rake (>= 0.8.7)
rdoc (~> 3.4)
thor (>= 0.14.6, < 2.0)
rake (0.9.2.2)
rdoc (3.12)
json (~> 1.4)
rspec (2.5.0)
rspec-core (~> 2.5.0)
rspec-expectations (~> 2.5.0)
rspec-mocks (~> 2.5.0)
rspec-core (2.5.1)
rspec-expectations (2.5.0)
diff-lcs (~> 1.1.2)
rspec-mocks (2.5.0)
sprockets (2.1.3)
hike (~> 1.2)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sqlite3 (1.3.3)
sqlite3-ruby (1.3.3)
sqlite3 (>= 1.3.3)
thor (0.15.4)
tilt (1.3.3)
treetop (1.4.10)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.33)
PLATFORMS
ruby
DEPENDENCIES
fakeweb (= 1.3.0)
mocha (= 0.9.12)
rails (>= 3.0.0)
rake (>= 0.9.2)
rdoc
rspec (= 2.5.0)
sqlite3-ruby (= 1.3.3)

@ -1,131 +0,0 @@
# Brazilian Rails
[![Build Status](https://secure.travis-ci.org/tapajos/brazilian-rails.png?branch=master)](http://travis-ci.org/tapajos/brazilian-rails)
Estamos testando, via Travis-CI, nas versões de Ruby ree, 1.8.7, 1.9.2 e 1.9.3, nas versões de Rails 2.3.x, 3.0.x, 3.1.x e 3.2.x
## O que foi?
O Brazilian Rails foi o plugin de internacionalização mais conhecido do Brasil e tinha como objetivo unir vários recursos de regras e traduções para o desenvolvedor brasileiro.
## O que é?
Brazilian Rails é um conjunto de gems para serem usadas com Ruby e com o Ruby on Rails e tem como objetivo unir alguns recursos úteis para os desenvolvedores brasileiros.
## Quais as gems que compõe o Brazilian Rails?
* brcep
* brdata
* brdinheiro
* brhelper
* brnumeros
* brstring
* brcpfcnpj
* brI18n
**OBS**: A gem brtraducao foi removida do Brazilian Rails devido a adição do suporte i18n do Rails. Ele continua podendo ser usada, porém não faz mais parte desse projeto. Para maiores detalhes, leia o post [O Brazilian Rails e o suporte i18n][brtraducoes]
**OBS**: A gem brI18n foi criada para acomodar as traduções usando suporte i18n das versões mais recentes do Rails.
## Como faço para instalar?
É muito difícil...
### com Bundler
Adicionar ao seu Gemfile:
gem 'brazilian-rails'
### sem Bundler
require "brazilian-rails"
Por padrão, a pluralização vem desabilitada, isso para não atrapalhar os projetos que já existem.
### I18n
Por padrão a gem não carrega o suporte de traduções do Rails, para usa-la você deve fazer o require abaixo:
require 'brI18n'
## Como funciona?
Está tudo explicado na nossa [api][].
## Achei um BUG, o que eu faço?
No melhor seria fazer um fork, adicionar os testes para reproduzir o erro, implementar a devida correção e fazer um pull request. Se acha que não tem capacidade para isso (tá com preguiça), por favor, nos avise! Isso é fácil e rápido. Isso pode ser feito em <http://github.com/tapajos/brazilian-rails/issues>
## Como contribuir?
1. Fazer um fork do projeto
1. Instalar as dependências: bundle install (Se não tiver o bundler instalado, faça antes: gem install bundler)
1. Fazer os devidos ajustes com os respectivos testes (TestUnit se possível e tente fazer commits atômicos)
1. Fazer pull request
## Quem está por traz disso tudo?
O [Marcos Tapajós][mt] tomou coragem para publicar todas as funcionalidades em um plugin, com testes unitários para garantir que tudo funcione conforme manda o figurino. Além do Tápa, outros loucos mantém tudo organizado, são: [Celestino Gomes][tino], [André Luiz Kupkovski][andre], [A galera da Improve It][ii] e mais alguns que ficam escondidos para não pagar esse mico...
Muitos já contribuíram com o projeto.
git log --format='%an' | sort -u
[Andre Bernardes](https://github.com/albertobraschi),
[Cássio Marques](https://github.com/cassiomarques),
[Danilo Jeremias da Silva](https://github.com/dannnylo),
[Eduardo Fiorezi](https://github.com/eduardofiorezi),
[Eduardo Hertz](https://github.com/eduardohertz),
[Elomar Nascimento dos Santos](https://github.com/elomarns),
[Everton Ribeiro](https://github.com/nuxlli),
[Fabio Akita](https://github.com/akitaonrails),
[Fernando Gomes](https://github.com/fernandogomes),
[Fernando Migliorini Luizão](https://github.com/fernandoluizao),
[Frederico Macedo](https://github.com/frederico),
[Gun.io Whitespace Robot](https://github.com/GunioRobot),
[Jhimy Fernandes Villar](https://github.com/stjhimy),
[João Vitor](https://github.com/joaovitor),
[Julio Santos Monteiro](https://github.com/jmonteiro),
[Kivanio Barbosa](https://github.com/kivanio),
[Marcus Derencius](https://github.com/derencius),
[Marcus Sá](http://about.me/marcus_sa),
[Mauricio Zaffari](https://github.com/mauriciozaffari),
[Rafael Felix](https://github/com/fellix),
[Rafael Uchoa](https://github.com/uchoaaa),
[Rafeal Carvalho](https://github.com/rafaeldx7),
[Ricardo Shiota Yasuda](https://github.com/shadow11),
[Rodrigo Manhães](https://github.com/rodrigomanhaes) e
[Sergio Brant](https://github.com/smbrant)
## Algumas funcionalidades:
* Date e Time no formato brasileiro
* Números por Extenso
* Dinheiro
* Cpf e Cnpj
* Feriado
* Mensagens de erro traduzidas
* etc
## Duvidas?
As duvidas podem ser enviadas diretamente a um dos desenvolvedores ou através da página do projeto no [RubyForge][rf]
## Quem apoia nesta gem?
[Improve It][ii]
[![Improve It][logo]][ii]
[rf]: http://rubyforge.org/projects/brazilian-rails/
[api]: http://brazilian-rails.improveit.com.br/software_livre/brazilian_rails
[ii]: http://www.improveit.com.br
[logo]: http://www.improveit.com.br/images/logo/logo_improve_it_screen.gif "Improve It"
[tino]: http://tinogomes.wordpress.com
[andre]: http://www.workingwithrails.com/person/9227-andr-luiz-kupkovski
[rf]: http://rubyforge.org/projects/brazilian-rails
[mt]: http://www.improveit.com.br/tapajos
[vt]: http://www.improveit.com.br/vinicius
[gg]: http://ggarnier.wordpress.com/
[brtraducoes]: http://blog.improveit.com.br/articles/2009/02/13/o-brazilian-rails-e-o-suporte-i18n

@ -1,101 +0,0 @@
v3.3.0 - 20 de setembro de 2012
# brdata
4ffc4e0 Inclusao do feriado de 12 de Outubro - (http://www.planalto.gov.br/ccivil_03/leis/l6802.htm)
3791616 Inclusao do feriado de 02 de Novembro - (http://www.planalto.gov.br/ccivil_03/leis/2002/L10607.htm)
aec8f91 Acerto mes do feriado da independencia
a5b36b6 Permitir criar arquivos com novos feriados dentro da app no diretorio config/feriados
# brdinheiro
c002db3 Quando convertia um objeto ou coleção para JSON, no lugar do valor, era criado mais uma seção chamada "quantia", e o valor era exibido sem formatação. (ATENÇÃO: mundado a assinatura de resposta, pode quebrar sua aplicação)
v3.2.0 - 28 de agosto de 2012
# brcep
f8503d9 2 minutes ago -- Invalidando método por_cep, em lugar ao método cep no BuscaEndereco (tinogomes)
3519675 - Convertendo List para Hash no resultado da busca de endereço pelo cep (Victor Dolirio Ferreira Barbosa)
# brstring
a1236b1 - Ajuste na expressão regular usada na remoção de acentos para que o caracter "|" não seja mais substituído pelo caracter "a". (Vinícius Silva)
v3.1.0 - 25 de fevereiro de 2012
0be6ca4 Substituindo o webservice para busca de cep
v3.0.8 - 03 de janeiro de 2012
bf0dfbb Using invalid error when invalid cpf/cnpj on `cpf_valido?` and `cnpj_valido?`
v3.0.7 - 03 de janeiro de 2012
627a4a7 Retornar sempre um objeto da classe dinheiro.
aab72f7 Using invalid error when invalid cpf/cnpj
v3.0.6 - 02 de janeiro de 2012
85127a1 Adicionado validador no estilo rails 3 para CPF e CNPJ validates :cnpj => true, :cpf => true
v3.0.5 - 02 de janeiro de 2012
4188aab Fixing requires for rake tasks and addded rake into Gemfile
44c349b Correção de um problema que não permitia atualização de valores inicializados em um objeto ActiveRecord no brDinheiro
26fdc7c Remove whitespace [Gun.io WhitespaceBot]
e8e988e fixed Psych::SyntaxError
c2b6e93 adicionando Gemfile
v3.0.4 - 1 de março de 2011
bb9123c Compatibilizando a gem brcpfcnpj com o Ruby 1.9.2
v3.0.3 - 14 de fevereiro de 2011
e5a2dee Corrige erro de português na validação
v3.0.2 - 9 de dezembro de 2010
2685784 Removed deprecated autorequire
61084f0 removed patch.diff file
ca76814 Corrigido requires
v3.0.1 - 5 de novembro de 2010
692d5ae Bugfix to force version of correctly gem dependency version Thanks to @timotta http://programandosemcafeina.blogspot.com/2010/11/gem-brazilian-rails-em-versoes-de-rails.html
19856a4 Adjustment on Rakefile files
v3.0.0 - 22 de outubro de 2010
90a0353 Final merge for Rails 3 support! \0/ Tks Eduardo Hertz
...
v2.1.15 - 5 de novembro de 2010
v2.1.14 - 23 de outubro de 2010
v2.1.13 - 23 de agosto de 2010
v2.1.12 - 1 de julho de 2010
v2.1.11 - 29 de junho de 2010
v2.1.10 - 4 de dezembro de 2009
v2.1.9 - 4 de dezembro de 2009
v2.1.8 - 16 de abril de 2009
v2.1.7 - 14 de abril de 2009
v2.1.6 - 6 de março de 2009
v2.1.5 - 5 de março de 2009
v2.1.4 - 4 de março de 2009
v2.1.3 - 3 de março de 2009
v2.1.2 - 25 de fevereiro de 2009
v2.1.1 - 18 de fevereiro de 2009
v2.1.0 - 17 de fevereiro de 2009
v2.0.14 - 20 de janeiro de 2009
v2.0.13 - 16 de dezembro de 2008
v2.0.12 - 1 de dezembro de 2008
v2.0.11 - 27 de novembro de 2008
v2.0.10 - 24 de setembro de 2008
v2.0.9 - 23 de setembro de 2008
v2.0.8 - 23 de setembro de 2008
v2.0.7 - 23 de setembro de 2008
v2.0.6 - 8 de setembro de 2008
v2.0.5 - 4 de setembro de 2008
v2.0.4 - 4 de setembro de 2008
v2.0.3 - 31 de agosto de 2008
v2.0.2 - 31 de agosto de 2008
v2.0.1 - 31 de agosto de 2008
v2.0.0 - 31 de agosto de 2008
v1.0.0 - 31 de agosto de 2008

@ -1,130 +0,0 @@
# encoding: UTF-8
require "rubygems"
require "rake"
require "rake/testtask"
require "rdoc/task"
require "rake/packagetask"
require "rake/gempackagetask"
env = %(PKG_BUILD="#{ENV["PKG_BUILD"]}") if ENV["PKG_BUILD"]
PROJECTS_WITH_TEST_UNIT = %w(brnumeros brdinheiro brcep brdata brhelper brstring brI18n)
PROJECTS_WITH_RSPEC = %w(brcpfcnpj)
PROJECTS = PROJECTS_WITH_TEST_UNIT + PROJECTS_WITH_RSPEC
PKG_VERSION = "3.3.0"
Dir["#{File.dirname(__FILE__)}/*/lib/*/version.rb"].each do |version_path|
require version_path
end
desc "Run all tests by default"
task :default => [:test, :spec]
desc "Run test/spec task for all projects with test unit"
task :test do
PROJECTS_WITH_TEST_UNIT.each do |project|
system %(cd #{project} && #{env} #{$0} test)
end
end
desc "Run spec task for all projects with rspec"
task :spec do
PROJECTS_WITH_RSPEC.each do |project|
system %(cd #{project} && #{env} #{$0} spec)
end
end
%w(rdoc package release).each do |task_name|
desc "Run #{task_name} task for all projects"
task task_name do
PROJECTS.each do |project|
system %(cd #{project} && #{env} #{$0} #{task_name})
end
end
end
desc "install all gems"
task :install_all do
PROJECTS.each do |project|
Dir.entries("#{project}/pkg").select{ |d| d =~ /\.gem$/ }.each do |gem_file|
system %(sudo gem install #{project}/pkg/#{gem_file})
end
end
Dir.entries("./pkg").select{ |d| d =~ /\.gem$/ }.each do |gem_file|
system %(sudo gem install ./pkg/#{gem_file})
end
end
desc "remove old gem packages"
task :clean_packages do
require "fileutils"
PROJECTS.each do |project|
Dir.entries("#{project}/pkg").select{ |d| d =~ /#{project}/ }.each do |file|
FileUtils.rm_rf(File.join(project,"pkg",file))
end
end
Dir.entries("./pkg").select{ |d| d =~ /brazilian/ }.each do |file|
FileUtils.rm_rf(File.join("./pkg", file))
end
end
desc "Generate documentation for the Brazilian Rails"
Rake::RDocTask.new do |rdoc|
rdoc.rdoc_dir = "doc"
rdoc.title = "Brazilian Rails Documentation"
rdoc.options << "--line-numbers" << "--inline-source"
rdoc.options << "-A cattr_accessor=object"
rdoc.options << "--charset" << "utf-8"
rdoc.options << "-T html"
rdoc.options << "--all"
rdoc.options << "-U"
rdoc.template = "#{ENV["template"]}.rb" if ENV["template"]
rdoc.rdoc_files.include("README.mkdn")
PROJECTS.each do |project|
rdoc.rdoc_files.include("#{project}/README")
rdoc.rdoc_files.include("#{project}/README.mkdn")
rdoc.rdoc_files.include("#{project}/CHANGELOG")
rdoc.rdoc_files.include("#{project}/lib/**/*.rb")
end
end
# Create compressed packages
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "brazilian-rails"
s.summary = "O Brazilian Rails é um conjunto de gems para facilitar a vida dos programadores brasileiros."
s.description = %q{O Brazilian Rails é um conjunto de gems para facilitar a vida dos programadores brasileiros.}
s.version = PKG_VERSION
s.authors = ["Marcos Tapajós", "Celestino Gomes", "Andre Kupkosvki", "Vinícius Teles", "Felipe Barreto", "Rafael Walter", "Cassio Marques"]
s.email = %w"tapajos@gmail.com tinorj@gmail.com kupkovski@gmail.com vinicius.m.teles@gmail.com felipebarreto@gmail.com rafawalter@gmail.com cassiommc@gmail.com"
s.rubyforge_project = "brazilian-rails"
s.homepage = "http://www.improveit.com.br/software_livre/brazilian_rails"
s.has_rdoc = true
s.requirements << "none"
s.require_path = "lib"
PROJECTS.each do |project|
s.add_dependency(project, ["= #{PKG_VERSION}"])
end
s.add_development_dependency "rake"
s.files = [ "README.mkdn", "lib/brazilian-rails.rb"]
end
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
end
desc "Publish the release files to RubyForge."
task :release => [ :package ] do
`gem push pkg/brazilian-rails-#{PKG_VERSION}.gem`
end

@ -1,20 +0,0 @@
Copyright (c) 2008 [name of plugin creator]
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -1,8 +0,0 @@
Brazilian Rails -- Tradução
Gem que sobrescreve a implementação de inflections para português, para ser
usado junto com o Rails
Para habilitar, basta:
require 'brtraducao'

@ -1,70 +0,0 @@
# encoding: UTF-8
require "rubygems"
require "rake"
require "rake/testtask"
require "rdoc/task"
require "rake/packagetask"
require "rake/gempackagetask"
require File.join(File.dirname(__FILE__), "lib", "brI18n", "version")
PKG_BUILD = ENV["PKG_BUILD"] ? "." + ENV["PKG_BUILD"] : ""
PKG_NAME = "brI18n"
PKG_VERSION = BrI18n::VERSION::STRING + PKG_BUILD
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
desc "Default Task"
task :default => [ :test ]
desc "Task description"
task :test do
puts "No tests for brI18n"
end
#Generate the RDoc documentation
Rake::RDocTask.new { |rdoc|
rdoc.rdoc_dir = "doc"
rdoc.title = "Brazilian Rails -- Tradução"
rdoc.options << "--line-numbers" << "--inline-source" << "-A cattr_accessor=object"
rdoc.options << "--charset" << "utf-8"
rdoc.template = "#{ENV["template"]}.rb" if ENV["template"]
rdoc.rdoc_files.include("README", "CHANGELOG")
rdoc.rdoc_files.include("lib/**/*")
}
# Create compressed packages
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = PKG_NAME
s.summary = "brtraducao é uma das gems que compoem o Brazilian Rails"
s.description = %q{brtraducao é uma das gems que compoem o Brazilian Rails}
s.version = PKG_VERSION
s.authors = ["Marcos Tapajós", "Celestino Gomes", "Andre Kupkosvki", "Vinícius Teles", "Felipe Barreto", "Rafael Walter", "Cassio Marques"]
s.email = %w"tapajos@gmail.com tinorj@gmail.com kupkovski@gmail.com vinicius.m.teles@gmail.com felipebarreto@gmail.com rafawalter@gmail.com cassiommc@gmail.com"
s.rubyforge_project = "brtraducao"
s.homepage = "http://www.improveit.com.br/software_livre/brazilian_rails"
s.add_dependency("actionpack", ">= 3.0.0")
s.add_dependency("activerecord", ">= 3.0.0")
s.add_dependency("activesupport", ">= 3.0.0")
s.add_development_dependency "rake"
s.has_rdoc = true
s.requirements << "none"
s.require_path = "lib"
s.files = [ "Rakefile", "README", "CHANGELOG", "MIT-LICENSE" ]
s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
end
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
end
desc "Publish the release files to RubyForge."
task :release => [ :package ] do
`gem push pkg/#{PKG_FILE_NAME}.gem`
end

@ -1,13 +0,0 @@
$:.unshift(File.dirname(__FILE__)) unless
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
%w(version).each {|req| require File.dirname(__FILE__) + "/brI18n/#{req}"}
module BrI18n
I18N_FILES = File.expand_path(File.dirname(__FILE__) + "/files")
end
I18n.load_path = Dir.glob("#{Rails.root}/config/locales/*") + Dir.glob("#{BrI18n::I18N_FILES}/*")
I18n.default_locale = 'pt-BR'

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

@ -1,132 +0,0 @@
pt-BR:
# formatos de data e hora
date:
formats:
default: "%d/%m/%Y"
short: "%d de %B"
long: "%d de %B de %Y"
only_day: "%d"
day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado]
abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb]
month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro]
abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez]
order:
- :day
- :month
- :year
time:
formats:
default: "%A, %d de %B de %Y, %H:%M hs"
time: "%H:%M hs"
short: "%d/%m, %H:%M hs"
long: "%A, %d de %B de %Y, %H:%M hs"
only_second: "%S"
datetime:
formats:
default: "%Y-%m-%dT%H:%M:%S%Z"
am: ''
pm: ''
# date helper distanci em palavras
datetime:
distance_in_words:
half_a_minute: 'meio minuto'
less_than_x_seconds:
one: 'menos de 1 segundo'
other: 'menos de {{count}} segundos'
x_seconds:
one: '1 segundo'
other: '{{count}} segundos'
less_than_x_minutes:
one: 'menos de um minuto'
other: 'menos de {{count}} minutos'
x_minutes:
one: '1 minuto'
other: '{{count}} minutos'
about_x_hours:
one: 'aproximadamente 1 hora'
other: 'aproximadamente {{count}} horas'
x_days:
one: '1 dia'
other: '{{count}} dias'
about_x_months:
one: 'aproximadamente 1 mês'
other: 'aproximadamente {{count}} meses'
x_months:
one: '1 mês'
other: '{{count}} meses'
about_x_years:
one: 'aproximadamente 1 ano'
other: 'aproximadamente {{count}} anos'
over_x_years:
one: 'mais de 1 ano'
other: 'mais de {{count}} anos'
# numeros
number:
format:
precision: 3
separator: ','
delimiter: '.'
currency:
format:
unit: 'R$'
precision: 2
format: '%u %n'
separator: ','
delimiter: '.'
percentage:
format:
delimiter: '.'
precision:
format:
delimiter: '.'
human:
format:
precision: 1
delimiter: '.'
support:
array:
sentence_connector: "e"
skip_last_comma: true
# Active Record
activerecord:
errors:
template:
header:
one: "Não pôde ser salvo: 1 erro"
other: "Não pôde ser salvo: {{count}} erros."
body: "Por favor, cheque os seguintes campos:"
messages:
inclusion: "não está incluso na lista"
exclusion: "não está disponível"
invalid: "não é válido"
confirmation: "não bate com a confirmação"
accepted: "precisa ser aceito"
empty: "não pode ser vazio"
blank: "não pode ser vazio"
too_long: "é muito longo (não mais do que {{count}} caracteres)"
too_short: "é muito curto (não menos do que {{count}} caracteres)"
wrong_length: "não é do tamanho correto (precisa ter {{count}} caracteres)"
taken: "não está disponível"
not_a_number: "não é um número"
greater_than: "precisa ser maior do que {{count}}"
greater_than_or_equal_to: "precisa ser maior ou igual a {{count}}"
equal_to: "precisa ser igual a {{count}}"
less_than: "precisa ser menor do que {{count}}"
less_than_or_equal_to: "precisa ser menor ou igual a {{count}}"
odd: "precisa ser ímpar"
even: "precisa ser par"

@ -1,20 +0,0 @@
Copyright (c) 2008 [name of plugin creator]
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -1 +0,0 @@
Aqui vai o readme...

@ -1,31 +0,0 @@
# BrCep
## O que é?
O BrCep é um gem que tem como objetivo buscar um endereço com base no seu CEP. Para isso ele utiliza dois web services:
* Bronze Business
* Buscar CEP
Primeiro o endereço é procurado no web service da Bronze Business, e caso não ache o endereço lá, ou caso este web service esteja indisponível, o endereço será então procurado no web service do Buscar CEP. Portanto, o endereço tem duas chances para ser encontrado, sendo mais difícil o serviço de busca de endereço por CEP estar indisponível ou não encontrar o endereço.
## Como usar?
BuscaEndereco.por_cep(22640100) ==> ['Avenida', 'das Americas', 'Barra da Tijuca', 'RJ', 'Rio de Janeiro', 22640100]
BuscaEndereco.por_cep('22640100') ==> ['Avenida', 'das Americas', 'Barra da Tijuca', 'RJ', 'Rio de Janeiro', 22640100]
BuscaEndereco.por_cep('22640-100') ==> ['Avenida', 'das Americas', 'Barra da Tijuca', 'RJ', 'Rio de Janeiro', 22640100]
BuscaEndereco.por_cep('22.640-100') ==> ['Avenida', 'das Americas', 'Barra da Tijuca', 'RJ', 'Rio de Janeiro', 22640100]
## O que acontece se o CEP informado tiver um formato inválido?
BuscaEndereco.por_cep('00000000') ==> RuntimeError 'O CEP informado possui um formato inválido.'
## E se os dois web services estiverem indisponíveis?
BuscaEndereco.por_cep('22.640-100') ==> RuntimeError, "A busca de endereço por CEP está indisponível no momento."
## E se por acaso o CEP não for encontrado em nenhum dos dois web services:
BuscaEndereco.por_cep('12345678') ==> RuntimeError, "CEP 12345678 não encontrado."
P.S.: Nesse caso o endereço não foi encontrado porque não existe um endereço associado ao CEP 12345678. No entanto, pode haver situações em que CEPs que possuem endereços associados não tenham os seus endereços encontrados, no entanto, até o momemnto os dois web services utilizados cobrem todas os CEPs testados na prática.

@ -1,72 +0,0 @@
# encoding: UTF-8
require "rubygems"
require "rake"
require "rake/testtask"
require "rdoc/task"
require "rake/packagetask"
require "rake/gempackagetask"
require File.join(File.dirname(__FILE__), "lib", "brcep", "version")
PKG_BUILD = ENV["PKG_BUILD"] ? "." + ENV["PKG_BUILD"] : ""
PKG_NAME = "brcep"
PKG_VERSION = BrCep::VERSION::STRING + PKG_BUILD
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
desc "Default Task"
task :default => [ :test ]
# Run the unit tests
Rake::TestTask.new { |t|
t.libs << "test"
t.pattern = "test/*_test.rb"
t.verbose = true
t.warning = false
}
#Generate the RDoc documentation
Rake::RDocTask.new { |rdoc|
rdoc.rdoc_dir = "doc"
rdoc.title = "Brazilian Rails -- CEP"
rdoc.options << "--line-numbers" << "--inline-source" << "-A cattr_accessor=object"
rdoc.options << "--charset" << "utf-8"
rdoc.template = "#{ENV["template"]}.rb" if ENV["template"]
rdoc.rdoc_files.include("README.mkdn", "CHANGELOG")
rdoc.rdoc_files.include("lib/**/*")
}
# Create compressed packages
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = PKG_NAME
s.summary = "brcep é uma das gems que compoem o Brazilian Rails"
s.description = %q{brcep é uma das gems que compoem o Brazilian Rails}
s.version = PKG_VERSION
s.authors = ["Marcos Tapajós", "Celestino Gomes", "Andre Kupkosvki", "Vinícius Teles", "Felipe Barreto", "Rafael Walter", "Cassio Marques"]
s.email = %w"tapajos@gmail.com tinorj@gmail.com kupkovski@gmail.com vinicius.m.teles@gmail.com felipebarreto@gmail.com rafawalter@gmail.com cassiommc@gmail.com"
s.rubyforge_project = "brcep"
s.homepage = "http://www.improveit.com.br/software_livre/brazilian_rails"
s.has_rdoc = true
s.requirements << "none"
s.require_path = "lib"
s.add_development_dependency "rake"
s.add_development_dependency "mocha"
s.files = [ "Rakefile", "README.mkdn", "CHANGELOG", "MIT-LICENSE" ]
s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
end
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
end
desc "Publish the release files to RubyForge."
task :release => [ :package ] do
`gem push pkg/#{PKG_FILE_NAME}.gem`
end

@ -1,8 +0,0 @@
$:.unshift(File.dirname(__FILE__)) unless
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
%w(busca_endereco version).each {|req| require File.dirname(__FILE__) + "/brcep/#{req}"}
module BrCep
end

@ -1,92 +0,0 @@
# encoding: UTF-8
require 'net/http'
require 'cgi'
# Este recurso tem como finalidade encontrar um endereço através de um CEP, e
# para isso ele utiliza o web service da Republica Virtual (http://cep.republicavirtual.com.br/web_cep.php)
# Obviamente, para utilizar este serviço é necessário uma conexão com a Internet.
#
# Como fazer a busca de endereço por cep?
#
# BuscaEndereco.cep(22640100) ==> {:tipo_logradouro => 'Avenida', :logradouro => 'das Américas', :bairro => 'Barra da Tijuca', :uf => 'RJ', :cidade => 'Rio de Janeiro', :cep => '22640100'}
# BuscaEndereco.cep('22640100') ==> {:tipo_logradouro => 'Avenida', :logradouro => 'das Américas', :bairro => 'Barra da Tijuca', :uf => 'RJ', :cidade => 'Rio de Janeiro', :cep => '22640100'}
# BuscaEndereco.cep('22640-100') ==> {:tipo_logradouro => 'Avenida', :logradouro => 'das Américas', :bairro => 'Barra da Tijuca', :uf => 'RJ', :cidade => 'Rio de Janeiro', :cep => '22640100'}
# BuscaEndereco.cep('22.640-100') ==> {:tipo_logradouro => 'Avenida', :logradouro => 'das Américas', :bairro => 'Barra da Tijuca', :uf => 'RJ', :cidade => 'Rio de Janeiro', :cep => '22640100'}
#
# É feita uma validação para ver se o cep possui 8 caracteres após a remoção de '.' e '-'.
# BuscaEndereco.cep('0000000') ==> RuntimeError 'O CEP informado possui um formato inválido.'
#
# Se necessário usar proxy, faça (de preferência em environment.rb):
# BuscaEndereco.proxy_addr= 'endereco.do.proxy'
# BuscaEndereco.proxy_port= 999 # porta a ser utilizada
#
class BuscaEndereco
@@proxy_addr = nil
@@proxy_port = nil
class << self
def proxy_addr
@@proxy_addr
end
def proxy_addr=(addr)
@@proxy_addr = addr
end
def proxy_port
@@proxy_port
end
def proxy_port=(port)
@@proxy_port = port
end
end
WEB_SERVICE_REPUBLICA_VIRTUAL_URL = "http://cep.republicavirtual.com.br/web_cep.php?formato=query_string&cep="
# Deprecated: Será removido
def self.por_cep(numero)
warn("DEPRECATION WARNING: O método `BuscaEnderedo.por_cep` será removido. Use o BuscaEndereco.cep e faça os ajustes necessarios")
_cep = cep(numero)
[
_cep[:tipo_logradouro],
_cep[:logradouro],
_cep[:bairro],
_cep[:cidade],
_cep[:uf],
_cep[:cep]
]
end
# Retorna um hash com os dados de endereçamento para o cep informado ou
# um erro quando o serviço está indisponível, quando o cep informado possui
# um formato inválido ou quando o endereço não foi encontrado.
#
# Exemplo:
# BuscaEndereco.cep(22640100) ==> {:tipo_logradouro => 'Avenida', :logradouro => 'das Américas', :bairro => 'Barra da Tijuca', :uf => 'RJ', :cidade => 'Rio de Janeiro', :cep => '22640100'}
def self.cep(numero)
cep = numero.to_s.gsub(/[\.-]/, '')
raise "O CEP informado possui um formato inválido." unless cep.to_s.match(/^\d{8}$/)
response = Net::HTTP.Proxy(self.proxy_addr, self.proxy_port).get_response(URI.parse("#{WEB_SERVICE_REPUBLICA_VIRTUAL_URL}#{cep}"))
raise "A busca de endereço por CEP através do web service da República Virtual está indisponível." unless response.kind_of?(Net::HTTPSuccess)
doc = Hash[* CGI::parse(response.body).map {|k,v| [k,v[0]]}.flatten]
retorno = {}
raise "CEP #{cep} não encontrado." unless [1,2].include?(doc['resultado'].to_i)
%w(tipo_logradouro logradouro bairro cidade uf).each do |field|
retorno[field.to_sym] = if RUBY_VERSION < '1.9'
require 'iconv'
Iconv.conv("utf-8", "ISO-8859-1", doc[field])
else
doc[field].force_encoding("ISO-8859-1").encode("UTF-8")
end
end
retorno[:cep] = cep
retorno
end
end

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

@ -1 +0,0 @@
require File.dirname(__FILE__) + '/../lib/brcep'

@ -1,77 +0,0 @@
# encoding: UTF-8
require File.dirname(__FILE__) + '/test_helper'
require 'rubygems'
require 'net/http'
require 'mocha'
require 'fakeweb'
FakeWeb.allow_net_connect = false
INVALID_ZIPS = [0, '0', '00', '000', '0000', '00000', '000000', '0000000', '4006000']
VALID_ZIPS = [22640100, '22640100', '22.640100', '22640-100', '22.640-100']
VALID_ZIPS_WITH_ZERO_AT_BEGINNING = ['05145100', '05145-100', '05.145-100']
ZIPS_WITH_NO_ADDRESS_ASSOCIATED = [12345678, '12345678', '12.345678', '12345-678', '12.345-678']
URL = BuscaEndereco::WEB_SERVICE_REPUBLICA_VIRTUAL_URL
class BuscaEnderecoTest < Test::Unit::TestCase
def test_if_warn_for_por_cep_usage
cep = VALID_ZIPS.sample
expected = {:tipo_logradouro => 'Avenida', :logradouro => 'das Américas', :bairro => 'Barra da Tijuca', :cidade => 'Rio de Janeiro', :uf => 'RJ', :cep => cep}
BuscaEndereco.expects(:warn).with("DEPRECATION WARNING: O método `BuscaEnderedo.por_cep` será removido. Use o BuscaEndereco.cep e faça os ajustes necessarios")
BuscaEndereco.expects(:cep).with(cep).returns(expected)
assert_equal expected.values, BuscaEndereco.por_cep(cep)
end
def test_raise_without_service_on_both_web_services
FakeWeb.register_uri(:get, "#{URL}#{22640100}", :status => 504, :body => "Service Unavailable")
assert_raise RuntimeError, "A busca de endereço por CEP está indisponível no momento." do
BuscaEndereco.cep(22640100)
end
end
INVALID_ZIPS.each do |invalid_zip|
define_method "test_raise_for_invalid_zip_code_#{invalid_zip}" do
assert_raise RuntimeError, "O CEP informado possui um formato inválido." do
BuscaEndereco.cep(invalid_zip)
end
end
end
VALID_ZIPS.each do |valid_zip|
define_method "test_valid_code_#{valid_zip}" do
cep = VALID_ZIPS.first.to_s
expected = {:tipo_logradouro => 'Avenida', :logradouro => 'das Américas', :bairro => 'Barra da Tijuca', :cidade => 'Rio de Janeiro', :uf => 'RJ', :cep => cep}
body = "&resultado=1&resultado_txt=sucesso+-+cep+completo&uf=RJ&cidade=Rio+de+Janeiro&bairro=Barra+da+Tijuca&tipo_logradouro=Avenida&logradouro=das+Am%E9ricas"
FakeWeb.register_uri(:get, "#{URL}#{cep}", :body => body)
assert_equal expected,BuscaEndereco.cep(valid_zip)
end
end
VALID_ZIPS_WITH_ZERO_AT_BEGINNING.each do |valid_zip|
define_method "test_valid_code_#{valid_zip}" do
cep = VALID_ZIPS_WITH_ZERO_AT_BEGINNING.first
expected = {:tipo_logradouro => "Avenida", :logradouro => "Raimundo Pereira de Magalhães", :bairro => "Jardim Iris", :cidade => "São Paulo", :uf => "SP", :cep => cep}
body = "&resultado=1&resultado_txt=sucesso+-+cep+completo&uf=SP&cidade=S%E3o+Paulo&bairro=Jardim+Iris&tipo_logradouro=Avenida&logradouro=Raimundo+Pereira+de+Magalh%E3es"
FakeWeb.register_uri(:get, "#{URL}#{cep}", :body => body)
assert_equal expected, BuscaEndereco.cep(cep)
end
end
def test_should_raise_exception_when_invalid_code
cep = "12345678"
body = "&resultado=0&resultado_txt=servi%E7o+indispon%EDvel%2Fcep+inv%E1lido&uf=&cidade=&bairro=&tipo_logradouro=&logradouro="
assert_raise RuntimeError, "CEP #{cep} não encontrado." do
FakeWeb.register_uri(:get, "#{URL}#{cep}", :body => body)
BuscaEndereco.cep("12345678")
end
end
end

@ -1,15 +0,0 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../lib/brcep'
def tornar_metodos_publicos(clazz)
clazz.class_eval do
private_instance_methods.each { |instance_method| public instance_method }
private_methods.each { |method| public_class_method method }
end
end
def p80 text
p '*'*80
p text
yield if block_given?
end

@ -1,20 +0,0 @@
Copyright (c) 2008 [name of plugin creator]
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -1,49 +0,0 @@
# Como usar a classe CNPJ no seu ActiveRecord
Objetos da classe CNPJ recebem strings representando números de CNPJ e verificam a validade destes números usando dois critérios:
1. O formato da string, que deve seguir o padrão xx.xxx.xxx/xxxx-xx, onde 'x' pode ser qualquer dígito de 0 a 9 e os traços (-), barra (/) e pontos (.) *são opcionais*.
2. O conteúdo numérico desta string, que é validado através do cálculo do 'módulo 11' dos dígitos que compõem a string.
Caso o conteúdo da string obedeça ao formato especificado acima, o mesmo será formatado para obedecer ao padrão xx.xxx.xxx/xxxx-xx
É importante observar que caso você associe um valor de CNPJ inválido ao seu model, o mesmo passará automaticamente a ser inválido, o que impede que valores de CNPJ incorretos sejam salvos no banco de dados.
Suponha que temos um model Empresa, com um atributo 'cnpj' que você quer usar como um número de documento para CNPJ. Basta usar o método `usar_como_cnpj`, assim:
```ruby
class Empresa < ActiveRecord::Base
usar_como_cnpj :cnpj
end
```
## Agora você pode usar o atributo para CNPJ da seguinte forma:
```ruby
e = Empresa.new
e.cnpj = "69103604000160"
puts e.cnpj # ==> 69.103.604/0001-60
e.cnpj.valido? # ==> true
e.cnpj_valido? # ==> true
e = Empresa.new(:cnpj => "69.103.604/0001-60")
puts e.cnpj # ==> 69.103.604/0001-60
e = Empresa.new
e.cnpj = Cnpj.new("691036040001-60")
puts e.cnpj # ==> 69.103.604/0001-60
e = Empresa.new
e.cnpj = "12343" # ==> um cnpj invalido
puts e.valid? # ==> false
e.save # ==> false
e.errors.on(:cnpj) # ==> 'não é válido' # de acordo com a I18n
c = Cnpj.new("69103604000160")
e.cnpj = "69.103.604/0001-60"
c == e.cnpj # ==> true
```
# Como usar a classe CPF no seu ActiveRecord
Objetos da classe CPF seguem especificações semelhantes as da classe CNPJ, possuindo apenas alterações na validação para acomodar o formato dos números de CPF e têm seus métodos alterados de `usar_como_cnpj` para `usar_como_cpf`, por exemplo.

@ -1,75 +0,0 @@
# encoding: UTF-8
require "rubygems"
require "rake"
require "rdoc/task"
require "rake/packagetask"
require "rake/gempackagetask"
require File.join(File.dirname(__FILE__), "lib", "brcpfcnpj", "version")
PKG_BUILD = ENV["PKG_BUILD"] ? "." + ENV["PKG_BUILD"] : ""
PKG_NAME = "brcpfcnpj"
PKG_VERSION = BrCpfCnpj::VERSION::STRING + PKG_BUILD
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
begin
require "rspec/core/rake_task"
RSpec::Core::RakeTask.new
desc "Default Task"
task :default => [ :spec ]
task :test do
system("rake spec")
end
rescue LoadError
puts "To execute tests for brcnpjcpf gem, you want to install rspec gem before"
end
#Generate the RDoc documentation
Rake::RDocTask.new { |rdoc|
rdoc.rdoc_dir = "doc"
rdoc.title = "Brazilian Rails -- CPF/CNPJ"
rdoc.options << "--line-numbers" << "--inline-source" << "-A cattr_accessor=object"
rdoc.options << "--charset" << "utf-8"
rdoc.template = "#{ENV["template"]}.rb" if ENV["template"]
rdoc.rdoc_files.include("README.mkdn", "CHANGELOG")
rdoc.rdoc_files.include("lib/**/*")
}
# Create compressed packages
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = PKG_NAME
s.summary = "brcpfcnpj é uma das gems que compoem o Brazilian Rails"
s.description = %q{brcpfcnpj é uma das gems que compoem o Brazilian Rails}
s.version = PKG_VERSION
s.authors = ["Marcos Tapajós", "Celestino Gomes", "Andre Kupkosvki", "Vinícius Teles", "Felipe Barreto", "Rafael Walter", "Cassio Marques"]
s.email = %w"tapajos@gmail.com tinorj@gmail.com kupkovski@gmail.com vinicius.m.teles@gmail.com felipebarreto@gmail.com rafawalter@gmail.com cassiommc@gmail.com"
s.rubyforge_project = "brcpfcnpj"
s.homepage = "http://www.improveit.com.br/software_livre/brazilian_rails"
s.add_dependency("actionpack", ">= 3.0.0")
s.add_dependency("activesupport", ">= 3.0.0")
s.add_development_dependency "rake"
s.add_development_dependency "rspec", ">= 2.4.0"
s.has_rdoc = true
s.requirements << "none"
s.require_path = "lib"
s.files = [ "Rakefile", "README.mkdn", "CHANGELOG", "MIT-LICENSE" ]
s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
end
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
end
desc "Publish the release files to RubyForge."
task :release => [ :package ] do
`gem push pkg/#{PKG_FILE_NAME}.gem`
end

@ -1,13 +0,0 @@
# -*- encoding : utf-8 -*-
$:.unshift(File.dirname(__FILE__)) unless
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
%w(cpf_cnpj cnpj cpf cpf_cnpj_activerecord cnpj_validator cpf_validator).each {|req| require File.dirname(__FILE__) + "/brcpfcnpj/#{req}"}
%w(rubygems active_record active_support).each {|req| require req }
ActiveRecord::Base.send :include, CpfCnpjActiveRecord
module BrCpfCnpj
end

@ -1,46 +0,0 @@
# -*- encoding : utf-8 -*-
# Representa um numero de CNPJ. Objetos da classe Cnpj recebem strings representando numeros de cnpj e verificam a validade destes numeros usando dois criterios:
# 1. O formato da string, que deve seguir o padrao xx.xxx.xxx/xxxx-xx, onde 'x' pode ser qualquer digito de 0 a 9 e os tracos (-), barra (/) e pontos (.) *sao opcionais*.
# 2. O conteudo numerico desta string, que eh validado atraves do calculo do 'modulo 11' dos digitos que compoe a string.
#
# Caso o conteudo da string obedeca ao formato especificado acima, o mesmo sera formatado para obedecer ao padrao xx.xxx.xxx/xxxx-xx
#
# Eh importante observar que caso voce associe um valor de cnpj invalido ao seu model, o mesmo passara automaticamente a ser invalido, o que impede que valores de cpf incorretos sejam salvos no banco de dados.
#
# Como usar a classe Cnpj no seu ActiveRecord:
#
# Suponha que temos um model Empresa, com um atributo 'cnpj'
# que voce quer usar como um numero de documento para cnpj. Basta usar o
# metodo <tt>usar_como_cnpj</tt>, assim:
#
# class Empresa < ActiveRecord::Base
# usar_como_cnpj :cnpj
# end
#
# Agora voce pode usar o atributo para cnpj da seguinte forma:
#
# e = Empresa.new
# e.cnpj = "69103604000160"
# puts e.cnpj # ==> 69.103.604/0001-60
# e.cnpj.valido? # ==> true
# e.cnpj_valido? # ==> true
#
# e = Empresa.new(:cnpj => "69.103.604/0001-60")
# puts e.cnpj # ==> 69.103.604/0001-60
#
# e = Empresa.new
# e.cnpj = Cnpj.new("691036040001-60")
# puts e.cnpj # ==> 69.103.604/0001-60
#
# e = Empresa.new
# e.cnpj = "12343" # ==> um cnpj invalido
# puts e.valid? # ==> false
# e.save # ==> false
# e.errors.on(:cnpj) # ==> 'não é válido' # de acordo com a I18n
#
# c = Cnpj.new("69103604000160")
# e.cnpj = "69.103.604/0001-60"
# c == e.cnpj # ==> true
class Cnpj
include CpfCnpj
end

@ -1,6 +0,0 @@
class CnpjValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
return if value.nil?
record.errors.add attribute, :invalid unless Cnpj.new(value).valido?
end
end

@ -1,52 +0,0 @@
# -*- encoding : utf-8 -*-
# Representa um numero de CPF. Objetos da classe Cpf recebem strings representando
# numeros de cpf e verificam a validade destes numeros usando dois criterios:
# 1. O formato da string, que deve seguir o padrao xxx.xxx.xxx-xx, onde 'x' pode ser qualquer digito de 0 a 9 e os tracos (-) e pontos (.) *sao opcionais*.
# 2. O conteudo numerico desta string, que eh validado atraves do calculo do 'modulo 11' dos digitos que compoe a string.
#
# Caso o conteudo da string obedeca ao formato especificado acima, o mesmo sera formatado para obedecer ao padrao xxx.xxx.xxx-xx
#
# Eh importante observar que caso voce associe um valor de cpf invalido ao seu model, o mesmo passara automaticamente a ser invalido, o que impede que valores de cpf incorretos sejam salvos no banco de dados.
#
# Como usar a classe Cpf no seu ActiveRecord:
#
# Suponha que temos um model Pessoa, com um atributo 'cpf'
# que voce quer usar como um numero de documento para cpf. Basta usar o
# metodo <tt>usar_como_cpf</tt>, assim:
#
# class Pessoa < ActiveRecord::Base
# usar_como_cpf :cpf
# end
#
# O atributo que sera usado como cpf pode ter qualquer nome e nao apenas 'cpf'
#
# Agora voce pode usar o atributo para cpf da seguinte forma:
#
# p = Pessoa.new
# p.cpf = "11144477735"
# puts p.cpf # ==> 111.444.777-35
# p.cpf.valido? # ==> true
# p.cpf_valido? # ==> true
#
# p = Pessoa.new(:cpf => "111.444.777-35")
# puts p.cpf # ==> 111.444.777-35
#
# p = Pessoa.new
# p.cpf = Cpf.new("111444777-35")
# puts p.cpf # ==> 111.444.777-35
#
# p = Pessoa.new
# p.cpf = "12345" # ==> um cpf invalido
# puts p.valid? # ==> false
# p.save # ==> false
# p.errors.on(:cpf) # ==> 'não é válido' # de acordo com o I18n
#
# c = Cpf.new("11144477735")
# p.cpf = "111.444.777-35"
# c == p.cpf # ==> true
#
class Cpf
include CpfCnpj
end

@ -1,90 +0,0 @@
# -*- encoding : utf-8 -*-
module CpfCnpj
attr_reader :numero
def initialize(numero)
@numero = numero
@match = self.instance_of?(Cpf) ? @numero =~ CPF_REGEX : @numero =~ CNPJ_REGEX
@numero_puro = $1
@para_verificacao = $2
@numero = (@match ? format_number! : nil)
end
def to_s
@numero || ""
end
def ==(outro_doc)
self.numero == outro_doc.numero
end
# Verifica se o numero possui o formato correto e se
# constitui um numero de documento valido, dependendo do seu
# tipo (Cpf ou Cnpj).
def valido?
return false unless @match
verifica_numero
end
private
DIVISOR = 11
CPF_LENGTH = 11
CPF_REGEX = /^(\d{3}\.?\d{3}\.?\d{3})-?(\d{2})$/
CPF_ALGS_1 = [10, 9, 8, 7, 6, 5, 4, 3, 2]
CPF_ALGS_2 = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]
CNPJ_LENGTH = 14
CNPJ_REGEX = /^(\d{2}\.?\d{3}\.?\d{3}\/?\d{4})-?(\d{2})$/ # <= 11.222.333/0001-XX
CNPJ_ALGS_1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
CNPJ_ALGS_2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
def verifica_numero
limpo = @numero.gsub(/[\.\/-]/, "")
if self.instance_of? Cpf
return false if limpo.length != 11
elsif self.instance_of? Cnpj
return false if limpo.length != 14
end
return false if limpo.scan(/\d/).uniq.length == 1
primeiro_verificador = primeiro_digito_verificador
segundo_verificador = segundo_digito_verificador(primeiro_verificador)
verif = primeiro_verificador + segundo_verificador
verif == @para_verificacao
end
def multiplica_e_soma(algs, numero_str)
multiplicados = []
numero_str.scan(/\d{1}/).each_with_index { |e, i| multiplicados[i] = e.to_i * algs[i] }
multiplicados.inject { |s,e| s + e }
end
def digito_verificador(resto)
resto < 2 ? 0 : DIVISOR - resto
end
def primeiro_digito_verificador
array = self.instance_of?(Cpf) ? CPF_ALGS_1 : CNPJ_ALGS_1
soma = multiplica_e_soma(array, @numero_puro)
digito_verificador(soma%DIVISOR).to_s
end
def segundo_digito_verificador(primeiro_verificador)
array = self.instance_of?(Cpf) ? CPF_ALGS_2 : CNPJ_ALGS_2
soma = multiplica_e_soma(array, @numero_puro + primeiro_verificador)
digito_verificador(soma%DIVISOR).to_s
end
def format_number!
if self.instance_of? Cpf
@numero =~ /(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/
@numero = "#{$1}.#{$2}.#{$3}-#{$4}"
else
@numero =~ /(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/
@numero = "#{$1}.#{$2}.#{$3}/#{$4}-#{$5}"
end
end
end

@ -1,61 +0,0 @@
# -*- encoding : utf-8 -*-
module CpfCnpjActiveRecord #:nodoc:
def self.included(base) #:nodoc:
base.extend ClassMethods
end
module ClassMethods #:nodoc:
def usar_como_cpf(*args) #:nodoc:
init(args, 'Cpf')
end
def usar_como_cnpj(*args) #:nodoc:
init(args, 'Cnpj')
end
def init(args, klass)
unless args.size.zero?
args.each do |name|
add_composed_class(name, klass)
module_eval create_code(name.to_s, klass)
end
end
end
def add_composed_class(name, klass)
options = {:class_name => klass, :mapping => [name.to_s, "numero"], :allow_nil => true}
constructor = Proc.new { |numero| eval(klass).new(numero) }
converter = Proc.new { |value| eval(klass).new(value) }
begin
composed_of name, options.merge( { :constructor => constructor, :converter => converter } )
rescue Exception
composed_of name, options { eval(klass).new(name[:numero]) }
end
end
def create_code(name, klass)
str = <<-CODE
validate :#{name}_valido?
def #{name}_valido?
value = read_attribute('#{name}')
if !value.nil? && value.strip != '' && !#{name}.nil? && !#{name}.valido?
self.errors.add('#{name}', :invalid)
end
end
def #{name}=(value)
if value.blank?
write_attribute('#{name}', nil)
elsif value.kind_of?(#{eval(klass)})
write_attribute('#{name}', value.numero)
else
begin
c = #{eval(klass)}.new(value)
c.valido? ? write_attribute('#{name}', c.numero) : write_attribute('#{name}', value)
rescue
@#{name} = value
end
end
end
CODE
end
end
end

@ -1,6 +0,0 @@
class CpfValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
return if value.nil?
record.errors.add attribute, :invalid unless Cpf.new(value).valido?
end
end

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

@ -1,2 +0,0 @@
# -*- encoding : utf-8 -*-
require File.dirname(__FILE__) + '/../lib/brcpfcnpj'

@ -1,33 +0,0 @@
# -*- encoding : utf-8 -*-
require 'active_record'
module ActiveRecord
class BaseWithoutTable < Base
self.abstract_class = true
def create_or_update
errors.empty?
end
def save
self.valid?
end
class << self
def columns()
@columns ||= []
end
def column(name, sql_type = nil, default = nil, null = true)
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
reset_column_information
end
# Do not reset @columns
def reset_column_information
generated_methods.each { |name| undef_method(name) }
@column_names = @columns_hash = @content_columns = @dynamic_methods_hash = @read_methods = nil
end
end
end
end

@ -1,114 +0,0 @@
# -*- encoding : utf-8 -*-
require File.dirname(__FILE__) + '/spec_helper'
require File.dirname(__FILE__) + '/active_record/base_without_table'
class Empresa < ActiveRecord::Base
usar_como_cnpj :cnpj
end
describe "Using a model attribute as Cnpj" do
before(:each) do
@company = Empresa.new
end
it "should format the received number" do
@company.cnpj = "69103604000160"
@company.cnpj.numero.should == "69.103.604/0001-60"
end
it "should respond to cnpj_valido?" do
@company.respond_to?('cnpj_valido?').should be_true
end
it "should be invalid with an invalid cnpj number" do
@company.cnpj = "123545"
@company.should_not be_valid
end
it "should be invalid with a too long number" do
@company.cnpj = "12323456678654454"
@company.should_not be_valid
end
it "should not save the instance with an invalid cnpj" do
@company.cnpj = "sdwewe"
@company.save.should be_false
end
it "should have an error in the cnpj field when invalid" do
@company.cnpj = "232df"
@company.save
@company.errors[:cnpj].should == ["is invalid"]
end
it "should be valid with a null cnpj number" do
@company.cnpj = nil
@company.should be_valid
end
it "should be valid with an empty string in the constructor of an instance of cnpj" do
@company.cnpj = Cnpj.new("")
@company.should be_valid
end
it "should be valid with an empty string as the cnpj number" do
@company.cnpj = ""
@company.should be_valid
end
it "should accept an instance of Cnpj" do
@company.cnpj = Cnpj.new("69103604000160")
@company.cnpj.should be_instance_of(Cnpj)
end
it "should be able to receive parameters at initialization" do
@company = Empresa.new(:cnpj => "69103604000160")
@company.cnpj.numero.should == "69.103.604/0001-60"
end
end
describe "when validating" do
before do
Empresa.validates_presence_of :cnpj
end
describe "presence" do
it "should be invalid with a new cnpj number" do
e = Empresa.new(:nome => "Bla")
e.should_not be_valid
e.errors[:cnpj].should eql(["can't be blank"])
end
it "should be invalid using an empty string as the cnpj number" do
e = Empresa.new(:nome => "Bla", :cnpj => "")
e.should_not be_valid
e.errors[:cnpj].should_not be_empty
end
it "should be valid with a cnpj" do
Empresa.new(:nome => "Bla", :cnpj => "00012345000165").should be_valid
end
end
describe "uniqueness" do
before(:each) do
Empresa.validates_uniqueness_of :cnpj
@e1 = Empresa.new(:nome => "Bla", :cnpj => "69103604000160")
@e1.save
end
it "should validate uniqueness of cnpj" do
e2 = Empresa.new(:nome => "Ble", :cnpj => "69103604000160")
e2.should_not be_valid
e2.errors[:cnpj].should_not be_empty
end
it "should be valid using a new cnpj" do
e2 = Empresa.new(:nome => "Ble", :cnpj => "00012345000165")
e2.should be_valid
end
end
end

@ -1,51 +0,0 @@
# -*- encoding : utf-8 -*-
require File.dirname(__FILE__) + '/spec_helper'
describe Cnpj do
it "should be invalid with malformed number" do
numeros = %w(04.22A.284/0001-11 04.222-284.0001-11 04222/284/0001-11)
numeros.each do |n|
cnpj = Cnpj.new(n)
cnpj.should_not be_valido
end
end
it "should be invalid with invalid number" do
numeros = %w(69103604020160 00000000000000 69.103.604/0001-61 01618211000264)
numeros.each do |n|
cnpj = Cnpj.new(n)
cnpj.should_not be_valido
end
end
it "should be invalid with a number longer than 14 chars, even if the first 14 represent a valid number" do
%w(691036040001-601 69103604000160a 69103604000160ABC 6910360400016000).each do |n|
Cnpj.new(n).should_not be_valido
end
end
it "should be valid with correct number" do
numeros = %w(69103604000160 69.103.604/0001-60 01518211/000264 01.5182110002-64 00.000.000/1447-89)
numeros.each do |n|
cnpj = Cnpj.new(n)
cnpj.should be_valido
end
end
it "should return the formated cnpj" do
cnpj = Cnpj.new("69103604000160")
cnpj.to_s.should == "69.103.604/0001-60"
end
it "should format the received number at instantiation" do
cnpj = Cnpj.new("69103604000160")
cnpj.numero.should == "69.103.604/0001-60"
end
it "should be equal to another instance with the same number" do
Cnpj.new("69103604000160").should == Cnpj.new("69.103.604/0001-60")
end
end

@ -1,22 +0,0 @@
require File.dirname(__FILE__) + '/spec_helper'
require File.dirname(__FILE__) + '/active_record/base_without_table'
class Company < ActiveRecord::Base
validates :cnpj, :cnpj => true
end
describe CnpjValidator do
it "should isn't valid when the cnpj isn't valid" do
@empresa = Company.new(:cnpj => "12345")
@empresa.valid?.should be_false
@empresa.errors[:cnpj].should == ["is invalid"]
end
it "should accept a nil cnpj" do
@empresa = Company.new(:cnpj => nil)
@empresa.valid?.should be_true
end
it "should be valid with a valid CNPJ" do
@empresa = Company.new(:cnpj => "69103604000160")
@empresa.valid?.should be_true
end
end

@ -1,120 +0,0 @@
# -*- encoding : utf-8 -*-
require File.dirname(__FILE__) + '/spec_helper'
require File.dirname(__FILE__) + '/active_record/base_without_table'
class Pessoa < ActiveRecord::Base
usar_como_cpf :cpf
end
describe "Using a model attribute as Cpf" do
before(:each) do
@person = Pessoa.new(:nome => "Fulano")
end
it "should format the received number" do
@person.cpf = "11144477735"
@person.cpf.numero.should == "111.444.777-35"
end
it "should respond to cpf_valido?" do
@person.respond_to?('cpf_valido?').should be_true
end
it "should be invalid with an invalid cpf number" do
@person.cpf = "123545"
@person.should_not be_valid
end
it "should be invalid with a too long number" do
@person.cpf = "123456678654454"
@person.should_not be_valid
end
it "should be valid with an empty string in the constructor of an instance of Cpf" do
@person.cpf = Cpf.new("")
@person.should be_valid
end
it "should be valid with an empty string as the cpf number" do
@person.cpf = ""
@person.should be_valid
end
it "should not save the instance with an invalid cpf" do
@person.cpf = "sdwewe"
@person.save.should be_false
end
it "should have an error in the cpf field when invalid" do
@person.cpf = "232df"
@person.save.should be_false
@person.errors[:cpf].should == ["is invalid"]
end
it "should be valid with a null cpf number" do
@person.cpf = nil
@person.should be_valid
end
it "should accept an instance of Cpf" do
@person.cpf = Cpf.new("11144477735")
@person.cpf.should be_instance_of(Cpf)
end
it "should be able to receive parameters at initialization" do
@person = Pessoa.new(:cpf => "111.44477735")
@person.cpf.numero.should == "111.444.777-35"
end
it "should change the current attribute's value" do
@person.cpf = Cpf.new("13434")
lambda {
@person.cpf = Cpf.new("111.444.777-35")
}.should change(@person, :cpf)
end
end
describe "when validating" do
describe "presence" do
before do
Pessoa.validates_presence_of :cpf
end
it "should be invalid with a nil cpf number" do
p = Pessoa.new(:nome => "Fulano", :cpf => nil)
p.should_not be_valid
p.errors[:cpf].should eql(["can't be blank"])
end
it "should be invalid with an empty string as the cpf number" do
p = Pessoa.new(:nome => "Fulano", :cpf => "")
p.should_not be_valid
p.errors[:cpf].should_not be_empty
end
it "should be valid with a cpf" do
Pessoa.new(:nome => "Fulano", :cpf => "11144477735").should be_valid
end
end
describe "uniqueness" do
before(:each) do
Pessoa.validates_uniqueness_of :cpf
@p1 = Pessoa.new(:nome => "Beltrano", :cpf => "11144477735")
@p1.save
end
it "should validate uniqueness of cpf" do
p2 = Pessoa.new(:nome => "Beltrano", :cpf => "11144477735")
p2.should_not be_valid
p2.errors[:cpf].should_not be_empty
end
it "should be valid using a new cpf" do
p2 = Pessoa.new(:nome => "Fulano", :cpf => "00123456797")
p2.should be_valid
end
end
end

@ -1,50 +0,0 @@
# -*- encoding : utf-8 -*-
require File.dirname(__FILE__) + '/spec_helper'
describe Cpf do
it "should be invalid with malformed number" do
numeros = %w(345.65.67.3 567.765-87698 345456-654-01 123456)
numeros.each do |n|
cpf = Cpf.new(n)
cpf.should_not be_valido
end
end
it "should be invalid with invalid number" do
numeros = %w(23342345699 34.543.567-98 456.676456-87 333333333-33 00000000000 000.000.000-00)
numeros.each do |n|
cpf = Cpf.new(n)
cpf.should_not be_valido
end
end
it "should be valid with correct number" do
numeros = %w(111.444.777-35 11144477735 111.444777-35 111444.777-35 111.444.77735)
numeros.each do |n|
cpf = Cpf.new(n)
cpf.should be_valido
end
end
it "should be invalid with a number longer than 11 chars, even if the first 11 char represent a valid cpf number" do
%w(111.444.777-3500 11144477735AB).each do |n|
Cpf.new(n).should_not be_valido
end
end
it "should return the formated cpf" do
cpf = Cpf.new("11144477735")
cpf.to_s.should == "111.444.777-35"
end
it "should format the received number at instantiation" do
cpf = Cpf.new("11144477735")
cpf.numero.should == "111.444.777-35"
end
it "should be equal to another instance with the same number" do
Cpf.new("11144477735").should == Cpf.new("111.444.777-35")
end
end

@ -1,21 +0,0 @@
require File.dirname(__FILE__) + '/spec_helper'
require File.dirname(__FILE__) + '/active_record/base_without_table'
class Person < ActiveRecord::Base
validates :cpf, :cpf => true
end
describe CpfValidator do
it "should isn't valid when the cpf isn't valid" do
@pessoa = Person.new(:cpf => "12345")
@pessoa.valid?.should be_false
@pessoa.errors[:cpf].should == ["is invalid"]
end
it "should accept a nil cpf" do
@pessoa = Person.new(:cpf => nil)
@pessoa.valid?.should be_true
end
it "should be valid with a valid cpf" do
@pessoa = Person.new(:cpf => "11144477735")
@pessoa.valid?.should be_true
end
end

@ -1,29 +0,0 @@
# -*- encoding : utf-8 -*-
class CreateTestingStructure < ActiveRecord::Migration
def self.up
create_table :empresas do |t|
t.string :nome
t.string :cnpj
end
create_table :pessoas do |t|
t.string :nome
t.string :cpf
end
create_table :companies do |t|
t.string :nome
t.string :cnpj
end
create_table :people do |t|
t.string :nome
t.string :cpf
end
end
def self.down
drop_table :pessoas
drop_table :empresas
drop_table :companies
drop_table :people
end
end

@ -1,11 +0,0 @@
# -*- encoding : utf-8 -*-
require "rubygems"
require "rspec"
require "active_record"
require File.expand_path(File.dirname(__FILE__) + "/../lib/brcpfcnpj")
ActiveRecord::Base.establish_connection(:adapter=>"sqlite3", :database => ":memory:")
require File.dirname(__FILE__) + "/db/create_testing_structure"
CreateTestingStructure.migrate(:up)

@ -1,20 +0,0 @@
Copyright (c) 2008 [name of plugin creator]
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -1 +0,0 @@
Aqui vai o readme

@ -1,74 +0,0 @@
# encoding: UTF-8
require "rubygems"
require "rake"
require "rake/testtask"
require "rdoc/task"
require "rake/packagetask"
require "rake/gempackagetask"
require File.join(File.dirname(__FILE__), "lib", "brdata", "version")
PKG_BUILD = ENV["PKG_BUILD"] ? "." + ENV["PKG_BUILD"] : ""
PKG_NAME = "brdata"
PKG_VERSION = BrData::VERSION::STRING + PKG_BUILD
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
desc "Default Task"
task :default => [ :test ]
# Run the unit tests
Rake::TestTask.new { |t|
t.libs << "test"
t.pattern = "test/*_test.rb"
t.verbose = true
t.warning = false
}
#Generate the RDoc documentation
Rake::RDocTask.new { |rdoc|
rdoc.rdoc_dir = "doc"
rdoc.title = "Brazilian Rails -- Data"
rdoc.options << "--line-numbers" << "--inline-source" << "-A cattr_accessor=object"
rdoc.options << "--charset" << "utf-8"
rdoc.template = "#{ENV["template"]}.rb" if ENV["template"]
rdoc.rdoc_files.include("README", "CHANGELOG")
rdoc.rdoc_files.include("lib/**/*")
}
# Create compressed packages
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = PKG_NAME
s.summary = "brdata é uma das gems que compoem o Brazilian Rails"
s.description = %q{brdata é uma das gems que compoem o Brazilian Rails}
s.version = PKG_VERSION
s.authors = ["Marcos Tapajós", "Celestino Gomes", "Andre Kupkosvki", "Vinícius Teles", "Felipe Barreto", "Rafael Walter", "Cassio Marques"]
s.email = %w"tapajos@gmail.com tinorj@gmail.com kupkovski@gmail.com vinicius.m.teles@gmail.com felipebarreto@gmail.com rafawalter@gmail.com cassiommc@gmail.com"
s.rubyforge_project = "brdata"
s.homepage = "http://www.improveit.com.br/software_livre/brazilian_rails"
s.add_dependency("actionpack", ">= 3.0.0")
s.add_dependency("activesupport", ">= 3.0.0")
s.add_development_dependency "rake"
s.add_development_dependency "mocha"
s.has_rdoc = true
s.requirements << "none"
s.require_path = "lib"
# s.autorequire = "brdata"
s.files = [ "Rakefile", "README", "CHANGELOG", "MIT-LICENSE" ]
s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
end
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
end
desc "Publish the release files to RubyForge."
task :release => [ :package ] do
`gem push pkg/#{PKG_FILE_NAME}.gem`
end

@ -1,47 +0,0 @@
# 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 }

@ -1,34 +0,0 @@
# 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

@ -1,24 +0,0 @@
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

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

@ -1,50 +0,0 @@
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

@ -1,11 +0,0 @@
# 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.")

@ -1,89 +0,0 @@
# == 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

@ -1,30 +0,0 @@
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

@ -1,44 +0,0 @@
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

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

@ -1 +0,0 @@
require File.dirname(__FILE__) + '/../lib/brdata'

@ -1,18 +0,0 @@
confraternizacao_mundial:
dia: 01
mes: 01
tiradentes:
dia: 21
mes: 04
trabalho:
dia: 01
mes: 05
independencia:
dia: 07
mes: 08
republica:
dia: 15
mes: 11
natal:
dia: 25
mes: 12

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

@ -1,29 +0,0 @@
# encoding: UTF-8
require File.dirname(__FILE__) + '/test_helper'
require 'mocha'
class ActionViewTest < Test::Unit::TestCase
include ActionView::Helpers::DateHelper
def test_distance_of_time_in_words
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
end
end

@ -1,76 +0,0 @@
# encoding: UTF-8
require File.dirname(__FILE__) + '/test_helper'
class DateTest < Test::Unit::TestCase
# to_date
def test_create_date_with_traditional_date_format
assert_equal "2007-01-02", "2007/01/02".to_date.to_s
end
def test_create_date_with_brazilian_date_format
assert_equal "2007-12-13", "13/12/2007".to_date.to_s
end
def test_create_date_with_other_brazilian_date_format
assert_equal "2007-02-01", "01-02-2007".to_date.to_s
end
#to_s
def test_date_to_s_with_traditional_format
assert_equal "2007-02-01", "01/02/2007".to_date.to_s
end
#to_s_br
def test_date_to_s_br
assert_equal "13/12/2007", "13/12/2007".to_date.to_s_br
end
#to_s_br when date is nil
def test_date_to_s_br_when_date_is_nil
assert_equal "", nil.to_s_br
end
#valid?
def test_valid_when_date_format_is_traditional_and_valid_format_and_valid_civil
assert Date.valid?("2007/01/02"), "Should be a valid date"
end
def test_valid_when_date_format_is_brazilian_and_valid_format_and_valid_civil
assert Date.valid?("13/12/2007"), "Should be a valid date"
end
if RUBY_VERSION < '1.9'
# IMPORTANTE: Date#parse se comporta de forma diferente no ruby 1.9,
# por isso esse teste não é executado no 1.9, ate que haja uma solução melhor
def test_valid_when_date_format_is_invalid
assert !Date.valid?("13/12/200A"), "Should be a invalid date"
end
end
def test_valid_when_date_format_is_brazilian_and_valid_format_and_invalid_civil
assert !Date.valid?("00/00/0000"), "Should be a invalid date"
end
def test_month_names
expected = [nil] + %w[Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro]
assert_equal expected, Date::MONTHNAMES
end
def test_days_names
assert_equal %w[Domingo Segunda-Feira Terça-Feira Quarta-Feira Quinta-Feira Sexta-Feira Sábado], Date::DAYNAMES
end
def test_abbr_monthnames
assert_equal [nil] + %w[Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez], Date::ABBR_MONTHNAMES
end
def test_abbr_daysnames
assert_equal %w[Dom Seg Ter Qua Qui Sex Sáb], Date::ABBR_DAYNAMES
end
def test_date_translation_with_strftime
assert_equal "Dezembro Dez Sexta-Feira Sex", Date.parse("2008-12-05").strftime("%B %b %A %a")
end
end

@ -1,30 +0,0 @@
require File.dirname(__FILE__) + '/test_helper'
class FeriadoParserTest < Test::Unit::TestCase
FERIADO_YML_PATH = File.expand_path(File.dirname(__FILE__) + '/../lib/brdata/config')
p FERIADO_YML_PATH
NATAL = Feriado.new("natal", 25, 12)
def test_feriados
feriados, metodos = FeriadoParser.parser(FERIADO_YML_PATH)
feriados.each {|feriado| assert_kind_of Feriado, feriado}
assert_equal NATAL, feriados.find {|f| f.nome == "natal"}
assert metodos.include?( "pascoa")
assert metodos.include?( "corpus_christi")
end
def test_feriados_quando_path_nao_eh_diretorio
assert_raise FeriadoParserDiretorioInvalidoError do
FeriadoParser.parser(File.dirname(__FILE__) + 'dinheiro_test.rb')
end
end
def test_feriados_quando_path_nao_contem_arquivos
assert_raise FeriadoParserDiretorioVazioError do
FeriadoParser.parser(File.dirname(__FILE__))
end
end
end

@ -1,114 +0,0 @@
# encoding: UTF-8
require File.dirname(__FILE__) + '/test_helper'
require 'rubygems'
require 'active_support/all'
class FeriadoTest < Test::Unit::TestCase
ATRIBUTOS = %w(dia mes nome)
# feriado
def test_feriado_quando_feriado
assert "25/12/2007".to_date.feriado?
end
def test_feriado_quando_nao_eh_feriado
assert !"01/12/2007".to_date.feriado?
end
def test_feriado_quando_feriado_eh_pascoa
assert "08/04/2007".to_date.feriado?
end
def test_feriado_quando_feriado_eh_corpus_christi
assert "07/06/2007".to_date.feriado?
end
# feriados nacionais
def test_confraternizacao_mundial
assert "01/01/2012".to_date.feriado?
end
def test_tiradentes
assert "21/04/2012".to_date.feriado?
end
def test_trabalho
assert "01/05/2012".to_date.feriado?
end
def test_independencia
assert "07/09/2012".to_date.feriado?
end
def test_finados
assert "02/11/2012".to_date.feriado?
end
def test_republica
assert "15/11/2012".to_date.feriado?
end
def test_natal
assert "25/12/2012".to_date.feriado?
end
def test_padroeira_brasil
assert "12/10/2012".to_date.feriado?
end
# pascoa
def test_pascoa
assert_equal "08/04/2007", "01/01/2007".to_date.pascoa.to_s_br
end
# corpus_christi
def test_corpus_christi
assert_equal "07/06/2007", "01/01/2007".to_date.corpus_christi.to_s_br
end
def test_attributes
feriado = Feriado.new("nome", "01", "01")
ATRIBUTOS.each do |atributo|
assert_respond_to feriado, "#{atributo}", "Deveria existir o método #{atributo}"
assert_respond_to feriado, "#{atributo}=", "Deveria existir o método #{atributo}="
end
end
def test_initialize
feriado = Feriado.new("nome", "01", "01")
assert feriado, "deveria ter criado um feriado"
assert_equal "nome", feriado.nome
assert_equal 1, feriado.dia
assert_equal 1, feriado.mes
end
def test_initialize_com_dia_invalido
['a', 0, -1, 32, '32', '-1', '0'].each do |invalid_day|
assert_raise FeriadoDiaInvalidoError do
Feriado.new("nome", invalid_day, "01")
raise "Deveria retornar FeriadoDiaInvalidoError para dia #{invalid_day}"
end
end
end
def test_initialize_com_mes_invalido
['a', '13', 13, -1, '-1', '0'].each do |invalid_month|
assert_raise FeriadoMesInvalidoError do
Feriado.new("nome", "01", invalid_month)
raise "Deveria retornar FeriadoMesInvalidoError para mês #{invalid_month}"
end
end
end
def test_igualdade
assert_equal Feriado.new("nome", "01", "01"), Feriado.new("nome2", "01", "01")
end
def test_igualdade_quando_nao_eh_igual
assert_not_equal Feriado.new("nome", "01", "01"), Feriado.new("nome2", "01", "02")
end
end

@ -1,2 +0,0 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../lib/brdata'

@ -1,59 +0,0 @@
# encoding: UTF-8
require File.dirname(__FILE__) + '/test_helper'
class TimeTest < Test::Unit::TestCase
# to_time
def test_create_time_with_traditional_time_format
assert_equal "2007-01-02 01:23:00", "2007/01/02 01:23".to_time.to_s(:db)
end
def test_create_time_with_brazilian_time_format_without_time
assert_equal "2007-12-13 00:00:00", "13/12/2007".to_time.to_s(:db)
end
def test_create_time_with_brazilian_time_format_with_time
assert_equal "2007-12-13 01:23:00", "13/12/2007 01:23".to_time.to_s(:db)
end
def test_create_time_with_brazilian_time_format_with_time_with_single_number
assert_equal "2007-02-01 01:23:00", "1/2/2007 1:23".to_time.to_s(:db)
end
#to_s
def test_time_to_s_with_traditional_format
if RUBY_VERSION < '1.9'
assert_equal "Mon Sep 24 16:03:05 UTC 2007", "Mon Sep 24 16:03:05 UTC 2007".to_time.to_s
else
assert_equal "2007-09-24 16:03:05 UTC", "2007-09-24 16:03:05 UTC".to_time.to_s
end
end
#to_s_br
def test_time_to_s_br
assert_equal "24/09/2007 16:03", "Mon Sep 24 16:03:05 UTC 2007".to_time.to_s_br
end
def test_month_names
assert_equal [nil] + %w[Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro], Time::MONTHNAMES
end
def test_days_names
assert_equal %w[Domingo Segunda-Feira Terça-Feira Quarta-Feira Quinta-Feira Sexta-Feira Sábado],
Time::DAYNAMES
end
def test_abbr_monthnames
assert_equal [nil] + %w[Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez], Time::ABBR_MONTHNAMES
end
def test_abbr_daysnames
assert_equal %w[Dom Seg Ter Qua Qui Sex Sáb], Time::ABBR_DAYNAMES
end
def test_time_translation_with_strftime
assert_equal "Dezembro Dez Sexta-Feira Sex", Time.parse("2008-12-05").strftime("%B %b %A %a")
end
end

@ -1 +0,0 @@
Version 0.0.1 -> Versão beta da gem.

@ -1,20 +0,0 @@
Copyright (c) 2008 [name of plugin creator]
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -1,52 +0,0 @@
== Como usar o Dinheiro em seu ActiveRecord?
* Arquivo 001_create_lancamentos.rb:
class CreateLancamentos < ActiveRecord::Migration
def self.up
create_table :lancamentos do |t|
t.column :descricao, :string, :null => false
t.column :valor, :decimal, :precision => 14, :scale => 2
t.column :mensalidade, :decimal, :precision => 14, :scale => 2
end
end
def self.down
drop_table :lancamentos
end
end
* Arquivo lancamento.rb:
class Lancamento < ActiveRecord::Base
usar_como_dinheiro :valor, :mensalidade
end
* No console (script/console):
Loading development environment.
>> lancamento = Lancamento.new
=> #<Lancamento:0x9652cd8 @attributes={"descricao"=>nil,
"valor"=>#<BigDecimal:9657008,'0.0',4(4)>,
"mensalidade"=>#<BigDecimal:9656e8c,'0.0',4(4)>},
@new_record=true>
>> lancamento.valor = 100
=> 100
>> lancamento.valor
=> #<Dinheiro:0x9650f3c @quantia=10000>
>> lancamento.valor.real
=> "R$ 100,00"
>> lancamento.valor = 100.50
=> 100.5
>> lancamento.valor.real
=> "R$ 100,50"
>> lancamento.valor = "250.50"
=> "250.50"
>> lancamento.valor.real
=> "R$ 250,50"
>> lancamento.valor = 354.58.reais
=> #<Dinheiro:0x9646384 @quantia=35458>
>> lancamento.valor.real
=> "R$ 354,58"
>> exit

@ -1,73 +0,0 @@
# encoding: UTF-8
require "rubygems"
require "rake"
require "rake/testtask"
require "rdoc/task"
require "rake/packagetask"
require "rake/gempackagetask"
require File.join(File.dirname(__FILE__), "lib", "brdinheiro", "version")
PKG_BUILD = ENV["PKG_BUILD"] ? "." + ENV["PKG_BUILD"] : ""
PKG_NAME = "brdinheiro"
PKG_VERSION = BrDinheiro::VERSION::STRING + PKG_BUILD
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
desc "Default Task"
task :default => [ :test ]
# Run the unit tests
Rake::TestTask.new { |t|
t.libs << "test"
t.pattern = "test/*_test.rb"
t.verbose = true
t.warning = false
}
#Generate the RDoc documentation
Rake::RDocTask.new { |rdoc|
rdoc.rdoc_dir = "doc"
rdoc.title = "Brazilian Rails -- Dinheiro"
rdoc.options << "--line-numbers" << "--inline-source" << "-A cattr_accessor=object"
rdoc.options << "--charset" << "utf-8"
rdoc.template = "#{ENV["template"]}.rb" if ENV["template"]
rdoc.rdoc_files.include("README", "CHANGELOG")
rdoc.rdoc_files.include("lib/**/*")
}
# Create compressed packages
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = PKG_NAME
s.summary = "brdinheiro é uma das gems que compoem o Brazilian Rails"
s.description = %q{brdinheiro é uma das gems que compoem o Brazilian Rails}
s.version = PKG_VERSION
s.authors = ["Marcos Tapajós", "Celestino Gomes", "Andre Kupkosvki", "Vinícius Teles", "Felipe Barreto", "Rafael Walter", "Cassio Marques"]
s.email = %w"tapajos@gmail.com tinorj@gmail.com kupkovski@gmail.com vinicius.m.teles@gmail.com felipebarreto@gmail.com rafawalter@gmail.com cassiommc@gmail.com"
s.rubyforge_project = "brdinheiro"
s.homepage = "http://www.improveit.com.br/software_livre/brazilian_rails"
s.add_dependency("actionpack", ">= 3.0.0")
s.add_dependency("activerecord", ">= 3.0.0")
s.add_dependency("brnumeros", "= #{PKG_VERSION}")
s.add_development_dependency "rake"
s.has_rdoc = true
s.requirements << "brnumeros"
s.require_path = "lib"
s.files = [ "Rakefile", "README", "CHANGELOG", "MIT-LICENSE" ]
s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
end
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
end
desc "Publish the release files to RubyForge."
task :release => [ :package ] do
`gem push pkg/#{PKG_FILE_NAME}.gem`
end

@ -1,22 +0,0 @@
$:.unshift(File.dirname(__FILE__)) unless
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
%w(dinheiro
dinheiro_util
dinheiro_active_record
excecoes
nil_class).each {|req| require File.dirname(__FILE__) + "/brdinheiro/#{req}"}
%w(bigdecimal
rubygems
active_record
active_support/all).each {|req| require req }
require 'brnumeros'
String.send(:include, DinheiroUtil)
ActiveRecord::Base.send :include, DinheiroActiveRecord
module BrDinheiro
end

@ -1,296 +0,0 @@
class Dinheiro
include Comparable
attr_reader :quantia
FORMATO_VALIDO_BR = /^([R|r]\$\s*)?(([+-]?\d{1,3}(\.?\d{3})*))?(\,\d{0,2})?$/
FORMATO_VALIDO_EUA = /^([R|r]\$\s*)?(([+-]?\d{1,3}(\,?\d{3})*))?(\.\d{0,2})?$/
SEPARADOR_MILHAR = "."
SEPARADOR_FRACIONARIO = ","
QUANTIDADE_DIGITOS = 3
PRECISAO_DECIMAL = 100
def initialize(quantia)
self.quantia = quantia
end
# Retorna o valor em Float quando uma coleção
# ou objeto é convertido para JSON
#
# Exemplo:
# produto = Produto.find 1
# produto.to_json // {"nome": "MacBook", "valor": 3500.0}
def as_json
self.to_f
end
# Retorna o valor armazenado em string.
#
# Exemplo:
# 1000.to_s ==> '1.000,00'
def to_s
inteiro_com_milhar(parte_inteira) + parte_decimal
end
# Compara com outro dinheiro se eh igual.
#
# Exemplo:
# um_real = Dinheiro.new(1)
# um_real == Dinheiro.new(1) ==> true
# um_real == Dinheiro.new(2) ==> false
def ==(outro_dinheiro)
begin
outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro)
rescue
return false
end
@quantia == outro_dinheiro.quantia
end
# Compara com outro dinheiro se eh maior ou menor.
#
# Exemplo:
# 1.real < 2.reais ==> true
# 1.real > 2.reais ==> false
# 2.real < 1.reais ==> false
# 2.real > 1.reais ==> true
def <=>(outro_dinheiro)
outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro)
@quantia <=> outro_dinheiro.quantia
end
# Retorna a adicao entre dinheiros.
#
# Exemplo:
# 1.real + 1.real == 2.reais
# 1.real + 1 == 2.reais
def +(outro)
Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia + quantia_de(outro)))
end
# Retorna a subtracao entre dinheiros.
#
# Exemplo:
# 10.reais - 2.reais == 8.reais
# 10.reais - 2 == 8.reais
def -(outro)
Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia - quantia_de(outro)))
end
# Retorna a multiplicacao entre dinheiros.
#
# Exemplo:
# 5.reais * 2 == 10.reais
# 5.reais * 2.reais == 10.reais
def *(outro)
return Dinheiro.new(to_f * outro) unless outro.kind_of? Dinheiro
outro * to_f
end
# Retorna a divisao entre dinheiros.
#
# Exemplo:
# 5.reais / 2 == (2.5).reais
# 5.reais / 2.reais == DivisaPorNaoEscalarError
# 5.reais / 0 == ZeroDivisionError
#
# Veja também o método parcelar
def /(outro)
raise DivisaPorNaoEscalarError unless outro.kind_of?(Numeric)
return @quantia/outro if outro == 0
Dinheiro.new(to_f / outro.to_f)
end
# Retorna um array de dinheiro com as parcelas
#
# Exemplo:
# 6.reais.parcelar(2) == [3.reais, 3.reais]
# 6.reais.parcelar(2.reais) == DisivaPorNaoEscalarError
# 6.reais.parcelar(0) == ZeroDivisionError
def parcelar(numero_de_parcelar)
raise DivisaPorNaoEscalarError unless numero_de_parcelar.kind_of?(Integer)
resto = @quantia % numero_de_parcelar
valor_menor = Dinheiro.new((@quantia/numero_de_parcelar)/100.0)
valor_maior = Dinheiro.new((@quantia/numero_de_parcelar+1)/100.0)
[valor_menor] * (numero_de_parcelar - resto) + [valor_maior] * resto
end
# Escreve o valor por extenso.
#
# Exemplo:
# 1.real.to_extenso ==> 'um real'
# (100.58).to_extenso ==> 'cem reais e cinquenta e oito centavos'
def to_extenso
(@quantia/100.0).por_extenso_em_reais
end
# Alias para o metodo to_extenso.
alias_method :por_extenso, :to_extenso
# Alias para o metodo to_extenso.
alias_method :por_extenso_em_reais, :to_extenso
# Verifica se o valor é zero.
def zero?
to_f.zero?
end
# Retorna um Float.
def to_f
to_s.gsub('.', '').gsub(',', '.').to_f
end
def coerce(outro)#:nodoc:
[ Dinheiro.new(outro), self ]
end
# Retorna a própria instância/
def real
self
end
# Alias para real.
alias_method :reais, :real
# Retorna uma string formatada com sigla em valor monetário.
# Exemplo:
# Dinheiro.new(1).real_formatado ==> 'R$ 1,00'
# Dinheiro.new(-1).real_formatado ==> 'R$ -1,00'
def real_formatado
"R$ #{to_s}"
end
# Alias para real_formatado.
alias_method :reais_formatado, :real_formatado
# Retorna uma string formatada com sigla em valor contábil.
#
# Exemplo:
# Dinheiro.new(1).real_contabil ==> 'R$ 1,00'
# Dinheiro.new(-1).real_contabil ==> 'R$ (1,00)'
def real_contabil
"R$ " + contabil
end
# Alias para real_contabil.
alias_method :reais_contabeis, :real_contabil
# Retorna uma string formatada sem sigla.
#
# Exemplo:
# Dinheiro.new(1).contabil ==> '1,00'
# Dinheiro.new(-1).contabil ==> '(1,00)'
def contabil
if @quantia >= 0
to_s
else
"(" + to_s[1..-1] + ")"
end
end
# Method missing para retorna um BigDecinal quando chamada .
def method_missing(symbol, *args) #:nodoc:
#Ex: Chama ao método valor_decimal()
if (symbol.to_s =~ /^(.*)_decimal$/) && args.size == 0
BigDecimal.new quantia_sem_separacao_milhares.gsub(',','.')
else
super.method_missing(symbol, *args)
end
end
private
def quantia_de(outro)
outro = outro.to_f if outro.kind_of?(BigDecimal)
return outro.quantia if outro.kind_of?(Dinheiro)
(outro * 100).round
end
def transforma_em_string_que_represente_a_quantia(quantia)
if /^([+-]?)(\d)$/ =~ quantia.to_s
return "#{$1}0.0#{$2}"
end
/^([+-]?)(\d*)(\d\d)$/ =~ quantia.to_s
"#{$1}#{$2.to_i}.#{$3}"
end
def quantia=(quantia)
raise DinheiroInvalidoError unless quantia_valida?(quantia)
quantia = quantia.to_f if quantia.kind_of?(BigDecimal)
@quantia = (quantia * 100).round if quantia.kind_of?(Numeric)
@quantia = extrai_quantia_como_inteiro(quantia) if quantia.kind_of?(String)
end
def parte_inteira
quantia_sem_separacao_milhares[0,quantia_sem_separacao_milhares.length-QUANTIDADE_DIGITOS]
end
def parte_decimal
quantia_sem_separacao_milhares[-QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS]
end
def inteiro_com_milhar(inteiro)
return inteiro if quantidade_de_passos(inteiro) == 0
resultado = ""
quantidade_de_passos(inteiro).times do |passo|
resultado = "." + inteiro[-QUANTIDADE_DIGITOS + passo * -QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS] + resultado
end
resultado = inteiro[0, digitos_que_sobraram(inteiro)] + resultado
resultado.gsub(/^(-?)\./, '\1')
end
def quantia_sem_separacao_milhares
sprintf("%.2f", (@quantia.to_f / PRECISAO_DECIMAL)).gsub(SEPARADOR_MILHAR, SEPARADOR_FRACIONARIO)
end
def quantidade_de_passos(inteiro)
resultado = inteiro.length / QUANTIDADE_DIGITOS
resultado = (resultado - 1) if inteiro.length % QUANTIDADE_DIGITOS == 0
resultado
end
def digitos_que_sobraram(inteiro)
inteiro.length - (quantidade_de_passos(inteiro) * QUANTIDADE_DIGITOS)
end
def quantia_valida?(quantia)
return false if quantia.kind_of?(String) && !quantia_respeita_formato?(quantia)
quantia.kind_of?(String) || quantia.kind_of?(Numeric)
end
def extrai_quantia_como_inteiro(quantia)
if FORMATO_VALIDO_BR =~ quantia
return sem_milhar($2, $5, '.')
end
if FORMATO_VALIDO_EUA =~ quantia
return sem_milhar($2, $5, ',')
end
end
def sem_milhar(parte_inteira, parte_decimal, delimitador_de_milhar)
(inteiro(parte_inteira, delimitador_de_milhar) + decimal(parte_decimal)).to_i
end
def inteiro(inteiro_com_separador_milhar, separador)
return inteiro_com_separador_milhar.gsub(separador, '') unless inteiro_com_separador_milhar.blank?
""
end
def decimal(parte_fracionaria)
unless parte_fracionaria.blank?
return sem_delimitador_decimal(parte_fracionaria) if parte_fracionaria.length == 3
return sem_delimitador_decimal(parte_fracionaria) + "0" if parte_fracionaria.length == 2
end
"00"
end
def sem_delimitador_decimal(parte_fracionaria)
"#{parte_fracionaria}".gsub(/[.|,]/, '')
end
def quantia_respeita_formato?(quantia)
return true if FORMATO_VALIDO_BR.match(quantia) || FORMATO_VALIDO_EUA.match(quantia)
false
end
end

@ -1,45 +0,0 @@
module DinheiroActiveRecord#:nodoc:
def self.included(base)#:nodoc:
base.extend ClassMethods
end
module ClassMethods#:nodoc:
def usar_como_dinheiro(*args)#:nodoc:
unless args.size.zero?
args.each do |name|
composed_of name, :class_name => 'Dinheiro', :mapping => [name.to_s, "valor_decimal"], :allow_nil => true
name = name.to_s
module_eval <<-ADICIONANDO_METODO
validate :#{name}_valido?
def #{name}_valido?
begin
@#{name}.to_s.reais
rescue Exception => e
self.errors.add('#{name}', e.message)
end
end
def #{name}=(value)
if value.nil?
write_attribute('#{name}', nil)
elsif value.kind_of?(Dinheiro)
write_attribute('#{name}', value.valor_decimal)
else
begin
write_attribute('#{name}', value.reais.valor_decimal)
rescue
@#{name} = value
end
end
end
def #{name}
read_attribute(:#{name}).reais if read_attribute(:#{name})
end
ADICIONANDO_METODO
end
end
end
end
end

@ -1,51 +0,0 @@
module DinheiroUtil
# Ao incluir o modulo, cria aliases para_dinheiro
def self.included(base)
base.class_eval do
# Alias para para_dinheiro
alias_method :real, :para_dinheiro
# Alias para para_dinheiro
alias_method :reais, :para_dinheiro
end
end
# Transforma numero em dinheiro
#
# Exemplo:
# 1.para_dinheiro.class ==> Dinheiro
def para_dinheiro
Dinheiro.new(self)
end
# Retorna string formatada com simbolo monetario
#
# Exemplo:
# 1.real_contabil ==> 'R$ 1,00'
# -1.real_contabil ==> 'R$ (1,00)'
def real_contabil
Dinheiro.new(self).real_contabil
end
# Retorna string formatada com simbolo monetario
#
# Exemplo:
# 2.reais_contabeis ==> 'R$ 2,00'
# -2.reais_contabeis ==> 'R$ 2,00'
def reais_contabeis
Dinheiro.new(self).reais_contabeis
end
# Retorna string formatada com simbolo monetario
#
# Exemplo:
# 1.contabil ==> '1,00'
# -1.contabil ==> '(1,00)'
def contabil
Dinheiro.new(self).contabil
end
end
Numeric.send(:include, DinheiroUtil)
String.send(:include, DinheiroUtil)

@ -1,6 +0,0 @@
def cria_excecao(classe, mensagem)
eval "class #{classe}; def initialize; super('#{mensagem}'); end; end"
end
cria_excecao("DinheiroInvalidoError < ArgumentError", "O valor deve estar preenchido e no formato correto. Ex.: 100.00 .")
cria_excecao("DivisaPorNaoEscalarError < ArgumentError", "So eh possivel dividir dinheiro por numeros.")

@ -1,24 +0,0 @@
class NilClass
def valor
0.real
end
def contabil
0.contabil
end
def para_dinheiro
0.real
end
def reais
0.real
end
def real
0.real
end
end

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

@ -1 +0,0 @@
require File.dirname(__FILE__) + '/../lib/brdinheiro'

@ -1,12 +0,0 @@
class CreateLancamentos < ActiveRecord::Migration
def self.up
create_table :lancamentos do |t|
t.column :descricao, :string, :null => false
t.column :valor, :decimal, :precision => 14, :scale => 2
end
end
def self.down
drop_table :lancamentos
end
end

@ -1,8 +0,0 @@
* Como utilizar a classe Dinheiro em uma classe de modelo da aplicação?
Vamos imaginar um exemplo. Suponha uma classe Lancamento que possui dois atributos: descricao e valor.
Veja a migration utilizada no arquivo(em samples): 001_create_lancamentos.rb
Veja a classe de modelo Lancamento no arquivo(em samples): lancamento.rb

@ -1,5 +0,0 @@
class Lancamento < ActiveRecord::Base
usar_como_dinheiro :valor
end

@ -1,59 +0,0 @@
require 'active_record'
module ActiveRecord
class BaseWithoutTable < Base
self.abstract_class = true
def create_or_update
errors.empty?
end
def save
self.valid?
end
def column_for_attribute(name)
self.class.columns_hash[name.to_s]
end
class << self
def columns()
@columns ||= []
end
def column(name, sql_type = nil, default = nil, null = true)
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
reset_column_information
end
# Do not reset @columns
def reset_column_information
undefine_attribute_methods
@column_names = @columns_hash = @content_columns = @dynamic_methods_hash = @read_methods = nil
end
def columns_hash
hash = {}
columns.each do |column|
hash[column.name] = column
end
hash
end
def column_defaults
defaults = {}
columns.each do |column|
defaults[column.name.to_sym] = nil
end
defaults
end
end
private
def self.attributes_protected_by_default
[]
end
end
end

@ -1,12 +0,0 @@
# encoding: UTF-8
require File.dirname(__FILE__) + '/test_helper.rb'
class TestBrDinheiro < Test::Unit::TestCase
def setup
end
def test_truth
assert true
end
end

@ -1,60 +0,0 @@
require File.dirname(__FILE__) + '/test_helper'
require File.dirname(__FILE__) + '/active_record/base_without_table'
class Carteira < ActiveRecord::BaseWithoutTable
column :saldo, :decimal
usar_como_dinheiro :saldo
end
class DinheiroActiveRecordTest < Test::Unit::TestCase
def setup
@carteira = Carteira.new
end
def teste_se_aceita_dinheiro
@carteira.saldo = 8.reais
assert @carteira.save
assert_equal 8.reais, @carteira.saldo
end
def teste_se_aceita_numero
@carteira.saldo = 30
assert @carteira.save
assert_equal 30.reais, @carteira.saldo
end
def teste_se_rejeita_valor_invalido
@carteira.saldo = 30
assert @carteira.save
@carteira.saldo = 'bla'
assert_false @carteira.save
assert_equal ["O valor deve estar preenchido e no formato correto. Ex.: 100.00 ."], @carteira.errors['saldo']
end
def teste_se_trata_nulo_corretamente
assert_nil @carteira.saldo
@carteira.saldo = nil
assert_nil @carteira.saldo
@carteira.save
assert_nil @carteira.saldo
end
def test_se_cria_carteira_corretamente_quando_recebe_parametros
carteira = Carteira.new(:saldo => "1")
assert_equal 1.real, carteira.saldo
end
def test_se_atualiza_valor_inicializado
carteira = Carteira.new(:saldo => 10.reais)
carteira.saldo += 5.reais
assert_equal 15.reais, carteira.saldo
end
def test_se_retorna_objeto_do_mesmo_tipo
@carteira.saldo = 10.reais
assert_equal 10.reais.class, @carteira.saldo.class
end
end

@ -1,498 +0,0 @@
require File.dirname(__FILE__) + '/test_helper'
class DinheiroTest < Test::Unit::TestCase
CONTABIL = { "(2,00)" => -2,
"2,00" => 2,
"0,00" => 0,
"0,32" => 0.32,
"(0,01)" => -0.01 }
REAL_CONTABIL = { "R$ (1,00)" => -1,
"R$ (0,12)" => -0.12,
"R$ 1,00" => 1,
"R$ 1,00" => 1,
"R$ 1,00" => 1,
"R$ 0,00" => 0 }
SOMA = { 0.real => 0.real + 0.real,
1.real => 0.real + 1.real,
1.real => 1.real + 0.real,
2.reais => 1.real + 1.real,
2.reais => 0.real + 2.reais,
2.reais => 2.reais + 0.real,
0.real => 2.real + -2.real,
0.real => 0.real + BigDecimal.new("0"),
0.3.real => 0.real + 0.3.real,
-0.3.real => 0.real + -0.3.real,
-0.03.real => 0 + -0.03.real,
-0.03.real => 0.real + -0.03,
-1.03.real => -1.real + -0.03,
-1.03.real => -1.real + BigDecimal.new("-0.03") }
SUBTRACAO = { 0.real => 0.real - 0.real,
-1.real => 0.real - 1.real,
1.real => 1.real - 0.real,
0.real => 1.real - 1.real,
-2.reais => 0.real - 2.reais,
2.reais => 2.reais - 0.real,
-4.reais => -2.reais - 2.reais,
0.3.real => 0.3.real - 0.real,
0.03.real => 0.03.real - 0.real,
0.03.real => 0.06.real - 0.03.real,
-0.03.real => 0 - 0.03.real,
-0.03.real => 0.real - 0.03,
-1.03.real => -1.real - 0.03,
-1.03.real => -1.real - BigDecimal.new("0.03") }
MULTIPLICACAO = { 0.real => 0.real * 0,
0.real => 0.real * 1,
0.real => 0.real * -1,
1.real => 1.real * 1,
10.real => 10.real * 1,
100.real => 100.real * 1,
1000.real => 1000.real * 1,
1.real => -1.real * -1,
-1.real => 1.real * -1,
-1.real => -1.real * 1,
0.1.real => 1.real * 0.1,
0.01.real => 1.real * 0.01,
0.01.real => 1.real * 0.009,
0.01.real => 1.real * 0.005,
0.00.real => 1.real * 0.0049,
0.1.real => 0.1.real * 1,
0.01.real => 0.01.real * 1,
0.01.real => 0.009.real * 1,
0.00.real => 0.00049.real * 1,
0.real => 0.real * 0.real,
0.real => 0.real * BigDecimal("0"),
1.real => 1.real * 1.real,
1.real => 1.real * BigDecimal("1"),
1.real => 0.5.real * 2.real,
1.real => 0.5.real * BigDecimal("2"),
1.real => 1 * 1.real,
-1.real => -1 * 1.real,
1.real => -1 * -1.real,
0.01.real => 0.01 * 1.real,
0.01.real => 1.real * BigDecimal("0.01"),
0.01.real => BigDecimal("0.01") * 1.real }
DIVISAO = {
Dinheiro.new(0.33) => Dinheiro.new(1) / 3,
Dinheiro.new(33.33) => Dinheiro.new(100) / 3,
Dinheiro.new(50.00) => Dinheiro.new(100) / 2,
Dinheiro.new(0.25) => Dinheiro.new(0.5) / 2,
Dinheiro.new(0.17) => Dinheiro.new(0.5) / 3,
Dinheiro.new(0.33) => Dinheiro.new(0.33) / 1
}
PARCELAS = {
[Dinheiro.new(0.33), Dinheiro.new(0.33), Dinheiro.new(0.34)] => Dinheiro.new(1).parcelar(3),
[Dinheiro.new(33.33), Dinheiro.new(33.33), Dinheiro.new(33.34)] => Dinheiro.new(100).parcelar(3),
[Dinheiro.new(50.00), Dinheiro.new(50)] => Dinheiro.new(100).parcelar(2),
[Dinheiro.new(0.25), Dinheiro.new(0.25)] => Dinheiro.new(0.5).parcelar(2),
[Dinheiro.new(0.16), Dinheiro.new(0.17),Dinheiro.new(0.17)] => Dinheiro.new(0.5).parcelar(3),
[Dinheiro.new(0.33)] => Dinheiro.new(0.33).parcelar(1),
[Dinheiro.new(0.33)] => Dinheiro.new(0.33).parcelar(1),
}
QUANTIA_COM_FORMATO_VALIDO = [ "1211",
"1211.",
"1211.0",
"1211.23",
"1211,23",
"1.211",
"1.211,00",
"1.211,01",
"1.211,1",
"1.211,",
"1,",
"12,",
"32349898989912,",
"32.349.898.989.912,",
"32.349.898.989.912,1",
"32.349.898.989.912,12",
"1",
"1.00",
"1.01",
"1.1",
"1.",
".1",
".12",
"0.12",
"1.12",
"12.12",
"12.12",
"123.12",
"1,234.12",
"12,234.12",
"123,234.12",
"2,123,234.12",
",1",
",11",
",01",
"0,01" ]
QUANTIA_COM_FORMATO_INVALIDO = [ 'teste',
'12,123,99',
'12.123.99',
'1,123,99',
'1212,39.90' ]
COMPARACAO = [ 1.real < 2.reais,
1.real <= 2.reais,
2.real > 1.real,
2.real >= 1.real,
1.real == 1.real,
1.real >= 1.real,
1.real <= 1.real ]
COMPARACAO_COM_ESCALAR = [ 1.real < 2.00,
1.real <= 2.00,
2.real > 1.00,
2.real >= 1.00,
1.real == 1.00,
1.real >= 1.00,
1.real <= 1.00 ]
ARREDONDAMENTO = { 23049 => 230.49,
23049 => 230.4949999999,
23050 => 230.495 }
PONTO_NO_MILHAR = { "234.175.211" => "234175211",
"" => "",
"1" => "1",
"12" => "12",
"123" => "123",
"1.234" => "1234",
"12.345" => "12345",
"123.456" => "123456",
"123.112.211" => "123112211",
"1.234.567" => "1234567" }
QUANTIA_VALIDA = { "0,00" => 0 ,
"0,00" => 0.0 ,
"0,00" => "0" ,
"0,00" => "0,00" ,
"1,00" => 1 ,
"1,03" => 1.03 ,
"1,03" => "1,03" ,
"0,03" => ",03" ,
"0,30" => ",3" ,
"0,03" => ".03" ,
"0,30" => ".3" ,
"-0,30" => -0.3 ,
"-0,03" => -0.03 ,
"1,00" => "1,00" ,
"-1,00" => -1 ,
"-1,00" => -1.0 ,
"-1,00" => "-1" ,
"-1,00" => "-1,00" ,
"-2,30" => "-2,30" ,
"2,30" => "2,30" ,
"2,30" => 2.30 ,
"2,30" => 2.3 ,
"1.211,00" => "1211,00" ,
"1.211,01" => "1211,01" ,
"1.211,50" => "1211,5" ,
"1.211,00" => "1211," ,
"1.211,00" => "1211" ,
"1.211,00" => "1211.00" ,
"1.211,01" => "1211.01" ,
"1.211,20" => "1211.2" ,
"1.211,00" => "1211." ,
"1.211,00" => "1211" ,
"1.211,00" => "1.211" ,
"123.112.211,35" => "123112211,35" ,
"-123.112.211,35" => "-123112211,35" ,
"123.112.211,35" => "+123112211,35" }
PARTE_INTEIRA = [ -1, -123112211, 0, 1, 12344545 ]
def setup
tornar_metodos_publicos Dinheiro
@dinheiro = 1.real
end
def testa_se_cria_dinheiro_a_partir_de_quantias_validos
QUANTIA_VALIDA.each do |esperado, quantia|
assert_equal esperado, Dinheiro.new(quantia).to_s, "Deveria ter vindo o quantia: #{esperado} quando recebeu #{quantia}"
end
end
# coloca_ponto_no_milhar
def testa_se_coloca_ponto_no_milhar
PONTO_NO_MILHAR.each do |esperado, quantia|
{ esperado => quantia,
"-#{esperado}" => "-#{quantia}" }.each do |esperado, quantia|
assert_equal esperado, @dinheiro.inteiro_com_milhar(quantia)
end
end
end
def testa_to_s
assert_equal "1,00", Dinheiro.new(1).to_s
assert_equal "1.000,00", Dinheiro.new(1000).to_s
end
# real
def testa_real_nao_eh_dinheiro
assert_kind_of(Dinheiro, 1.real)
end
def testa_real_eh_dinheiro
assert_kind_of(Dinheiro, Dinheiro.new(1).real)
end
def testa_real_contabil
REAL_CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).real_contabil }
end
def testa_reais_contabeis
REAL_CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).reais_contabeis }
end
# reais
def testa_reais
assert_equal Dinheiro.new("2,00"), Dinheiro.new(2).reais
end
def testa_contabil
CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).contabil }
end
# real_formatado
def test_real_formatado
assert_equal "R$ 2,00", Dinheiro.new(2).real_formatado
end
# ==
def testa_igualdade
assert_equal Dinheiro.new(1), Dinheiro.new(1)
end
def testa_igualdade_quando_passa_possivel_dinheiro
assert_equal Dinheiro.new(1), 1.0
end
def testa_igualdade_quando_passa_algo_que_nao_seja_dinheiro
assert_equal false, Dinheiro.new(1) == 'salario'
end
# / (divisao)
def testa_divisao
DIVISAO.each { |parcelas, divisao| assert_equal parcelas, divisao }
end
def testa_divisao_por_zero
assert_raise(ZeroDivisionError) { 1.real / 0 }
end
def testa_divisao_por_algo_que_nao_seja_um_escalar
assert_raise(DivisaPorNaoEscalarError) { 10.reais / 2.reais }
end
# parcelar
def testa_parcelar
PARCELAS.each { |parcelas, divisao| assert_equal parcelas, divisao }
end
def testa_parcelar_por_zero
assert_raise(ZeroDivisionError) { 1.real.parcelar 0 }
end
def testa_parcelar_por_algo_que_nao_seja_um_escalar
assert_raise(DivisaPorNaoEscalarError) { 10.reais.parcelar(2.reais) }
end
# initialize
def testa_se_cria_dinheiro_a_partir_de_float
verifica_se_cria_dinheiro_para 1.0
end
def testa_se_cria_dinheiro_a_partir_de_fixnum
verifica_se_cria_dinheiro_para 1
end
def testa_se_cria_dinheiro_a_partir_de_bigdecimal
verifica_se_cria_dinheiro_para BigDecimal.new("1")
end
def testa_se_cria_dinheiro_a_partir_de_string
verifica_se_cria_dinheiro_para "1"
end
def testa_se_rejeita_criacao_de_dinheiro_a_partir_de_string_invalida
QUANTIA_COM_FORMATO_INVALIDO.each do |quantia|
assert_raise DinheiroInvalidoError, "Deveria ter rejeitado [#{quantia}]" do
Dinheiro.new quantia
end
end
end
# + (soma)
def testa_soma
SOMA.each{ |esperado, soma| assert_equal esperado, soma }
end
# - (subtracao)
def testa_subtracao
SUBTRACAO.each { |esperado, subtracao| assert_equal esperado, subtracao }
end
# * (multiplicacao)
def testa_multiplicacao
MULTIPLICACAO.each { |esperado, multiplicacao| assert_equal esperado, multiplicacao }
end
# quantia_de
def testa_quantia_de
assert_equal 0, @dinheiro.quantia_de(0.real)
assert_equal 0, @dinheiro.quantia_de(0)
end
#por_extenso
def testa_por_extenso
assert_equal 'um real', 1.real.por_extenso
assert_equal 'um centavo', (0.01).real.por_extenso
assert_equal 'cem reais', 100.real.por_extenso
assert_equal 'cem reais e um centavo', (100.01).real.por_extenso
end
#por_extenso_em_reais
def testa_por_extenso_em_reais
assert_equal 'um real', 1.real.por_extenso_em_reais
assert_equal 'um centavo', (0.01).real.por_extenso_em_reais
assert_equal 'cem reais', 100.real.por_extenso_em_reais
assert_equal 'cem reais e um centavo', (100.01).real.por_extenso_em_reais
end
def testa_por_extenso_negativo
assert_equal 'um real negativo', -1.real.por_extenso_em_reais
assert_equal 'um centavo negativo', (-0.01).real.por_extenso_em_reais
assert_equal 'cem reais negativos', -100.real.por_extenso_em_reais
assert_equal 'cem reais e um centavo negativos', (-100.01).real.por_extenso_em_reais
assert_equal 'cento e dez reais negativos', (-110).real.por_extenso_em_reais
assert_equal 'vinte e dois reais negativos', -22.reais.por_extenso
assert_not_equal 'vinte e dois centavos negativos', -22.reais.por_extenso
assert_not_equal 'vinte e dois centavos', -22.reais.por_extenso
end
# to_f
def testa_to_f
assert_equal 2.30, 2.30.real.to_f
assert_equal 1000, 1000.real.to_f
end
# quantia_respeita_formato?
def testa_se_quantia_respeita_formato
QUANTIA_COM_FORMATO_VALIDO.each { |quantia| verifica_se_quantia_respeita_formato quantia }
end
# >, <, == (ordenacao)
def testa_comparacao_entre_dinheiro
COMPARACAO.each { |comparacao| assert comparacao }
end
def testa_comparacao_entre_possivel_dinheiro
COMPARACAO_COM_ESCALAR.each { |comparacao_com_escalar| assert comparacao_com_escalar }
end
# decimal
def testa_decimal_quando_todas_as_casas_estao_preenchidas
verifica_decimal("12")
end
def testa_decimal_quando_apenas_uma_das_casas_esta_preenchida
verifica_decimal("10", "1")
end
def testa_decimal_quando_nenhuma_das_casas_esta_preenchida
verifica_decimal("00", "")
end
def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_tres_digitos
verifica_se_transforma_em_string_corretamente "1.23", 123
end
def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_dois_digitos
verifica_se_transforma_em_string_corretamente "0.12", 12
end
def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_um_digito
verifica_se_transforma_em_string_corretamente "0.03", 3
end
def testa_se_transforma_em_string_para_valores_especiais
verifica_se_transforma_em_string_corretamente "-123112211.00", -12311221100
end
# parte_inteira
def testa_parte_inteira
PARTE_INTEIRA.each { |quantia| assert_equal "#{quantia}", Dinheiro.new(quantia).parte_inteira }
end
def testa_se_arredonda_valores_corretamente
ARREDONDAMENTO.each do |esperado, quantia|
assert_equal esperado, Dinheiro.new(quantia).quantia, "Deveria retornar #{esperado} para #{quantia}"
end
end
def testa_se_valor_decimal_cria_o_big_decimal_corretamente
assert_equal BigDecimal.new("1234.56"), Dinheiro.new("1234,56").valor_decimal
end
def testa_soma_de_dinheiro_com_big_decimal
assert_equal Dinheiro.new(200), BigDecimal.new("100").reais + "100".reais
end
def testa_zero_quando_eh_zero
assert Dinheiro.new(0).zero?
end
def testa_zero_quando_nao_eh_zero
assert !Dinheiro.new(1).zero?
end
private
def verifica_se_transforma_em_string_corretamente(quantia_esperada, quantia)
assert_equal quantia_esperada, @dinheiro.transforma_em_string_que_represente_a_quantia(quantia)
end
def verifica_decimal(esperado, quantia = esperado)
assert_equal esperado, @dinheiro.decimal("." + quantia)
assert_equal esperado, @dinheiro.decimal("," + quantia)
assert_equal esperado, @dinheiro.decimal(quantia) if quantia.blank?
end
def verifica_se_quantia_respeita_formato(quantia)
formatos_validos(quantia).each do |quantia_str|
assert 1.real.quantia_respeita_formato?(quantia_str), "O sistema deveria considerar o quantia '#{quantia_str}' dentro do formato valido."
end
end
def formatos_validos(quantia)
formatos_validos = []
quantias_validas(quantia).each do |quantia|
formatos_validos << quantia
[ "R$", "r$" ].each do |simbolo|
[ "", " ", " " ].each do |espacos|
formatos_validos << "#{simbolo}#{espacos}#{quantia}"
end
end
end
formatos_validos
end
def quantias_validas(quantia)
return [quantia] if [ ".", "," ].include?(quantia[0..0])
[ quantia, "-#{quantia}" ]
end
def verifica_se_cria_dinheiro_para(quantia)
assert quantia.para_dinheiro.kind_of?(Dinheiro)
end
end

@ -1,29 +0,0 @@
require File.dirname(__FILE__) + '/test_helper'
class NilClassTest < Test::Unit::TestCase
def test_real
assert_equal Dinheiro.new(0), nil.real
end
def test_reais
assert_equal Dinheiro.new(0), nil.reais
end
def test_para_dinheiro
assert_equal Dinheiro.new(0), nil.para_dinheiro
end
def test_valor
assert_equal Dinheiro.new(0), nil.valor
end
def test_contabil
assert_equal "0,00", nil.contabil
end
end

@ -1,23 +0,0 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../../brnumeros/lib/brnumeros'
require File.dirname(__FILE__) + '/../lib/brdinheiro'
def tornar_metodos_publicos(clazz)
clazz.class_eval do
private_instance_methods.each { |instance_method| public instance_method }
private_methods.each { |method| public_class_method method }
end
end
def p80 text
p '*'*80
p text
p '*'*80
end
class Test::Unit::TestCase
def assert_false(boolean, message=nil)
assert_block("assert should not be called with a block.") { !block_given? }
assert_block(build_message(message, "<?> is not false.", boolean)) { !boolean }
end
end

@ -1,20 +0,0 @@
Copyright (c) 2008 [name of plugin creator]
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -1 +0,0 @@
Aqui vai o readme...

@ -1,73 +0,0 @@
# encoding: UTF-8
require "rubygems"
require "rake"
require "rake/testtask"
require "rdoc/task"
require "rake/packagetask"
require "rake/gempackagetask"
require File.join(File.dirname(__FILE__), "lib", "brhelper", "version")
PKG_BUILD = ENV["PKG_BUILD"] ? "." + ENV["PKG_BUILD"] : ""
PKG_NAME = "brhelper"
PKG_VERSION = BrHelper::VERSION::STRING + PKG_BUILD
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
desc "Default Task"
task :default => [ :test ]
# Run the unit tests
Rake::TestTask.new { |t|
t.libs << "test"
t.pattern = "test/*_test.rb"
t.verbose = true
t.warning = false
}
#Generate the RDoc documentation
Rake::RDocTask.new { |rdoc|
rdoc.rdoc_dir = "doc"
rdoc.title = "Brazilian Rails -- Helper"
rdoc.options << "--line-numbers" << "--inline-source" << "-A cattr_accessor=object"
rdoc.options << "--charset" << "utf-8"
rdoc.template = "#{ENV["template"]}.rb" if ENV["template"]
rdoc.rdoc_files.include("README", "CHANGELOG")
rdoc.rdoc_files.include("lib/**/*")
}
# Create compressed packages
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = PKG_NAME
s.summary = "brhelper é uma das gems que compoem o Brazilian Rails"
s.description = %q{brhelper é uma das gems que compoem o Brazilian Rails}
s.version = PKG_VERSION
s.authors = ["Marcos Tapajós", "Celestino Gomes", "Andre Kupkosvki", "Vinícius Teles", "Felipe Barreto", "Rafael Walter", "Cassio Marques"]
s.email = %w"tapajos@gmail.com tinorj@gmail.com kupkovski@gmail.com vinicius.m.teles@gmail.com felipebarreto@gmail.com rafawalter@gmail.com cassiommc@gmail.com"
s.rubyforge_project = "brhelper"
s.homepage = "http://www.improveit.com.br/software_livre/brazilian_rails"
s.add_dependency("actionpack", ">= 3.0.0")
s.add_dependency("activesupport", ">= 3.0.0")
s.add_development_dependency "rake"
s.add_development_dependency "mocha"
s.has_rdoc = true
s.requirements << "none"
s.require_path = "lib"
s.files = [ "Rakefile", "README", "CHANGELOG", "MIT-LICENSE" ]
s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
end
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
end
desc "Publish the release files to RubyForge."
task :release => [ :package ] do
`gem push pkg/#{PKG_FILE_NAME}.gem`
end

@ -1,16 +0,0 @@
$:.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(version
br_form_options_helper
br_form_helper).each {|req| require File.dirname(__FILE__) + "/brhelper/#{req}"}
module BrHelper
end

@ -1,13 +0,0 @@
module ActionView::Helpers::FormHelper
# Helper para seleção de sexo com radio_buttom.
def radio_button_sexo(object, method, options_radio_male = {}, options_radio_female = {})
options_male = { }.update(options_radio_male.stringify_keys)
options_female = { }.update(options_radio_female.stringify_keys)
op1= radio_button(object, method, 'M', options_male)
op2 = radio_button(object, method, 'F', options_female)
"#{op1} Masculino\n#{op2} Feminino"
end
end

@ -1,60 +0,0 @@
# encoding: UTF-8
module ActionView::Helpers::FormOptionsHelper
ESTADOS_BRASILEIROS = [["Acre", "AC"],
["Alagoas", "AL"],
["Amapá", "AP"],
["Amazonas", "AM"],
["Bahia", "BA"],
["Ceará", "CE"],
["Distrito Federal", "DF"],
["Espírito Santo", "ES"],
["Goiás", "GO"],
["Maranhão", "MA"],
["Mato Grosso", "MT"],
["Mato Grosso do Sul", "MS"],
["Minas Gerais", "MG"],
["Pará", "PA"],
["Paraíba", "PB"],
["Paraná", "PR"],
["Pernambuco", "PE"],
["Piauí", "PI"],
["Rio de Janeiro", "RJ"],
["Rio Grande do Norte", "RN"],
["Rio Grande do Sul", "RS"],
["Rondônia", "RO"],
["Roraima", "RR"],
["Santa Catarina", "SC"],
["São Paulo", "SP"],
["Sergipe", "SE"],
["Tocantins", "TO"]
] unless const_defined?("ESTADOS_BRASILEIROS")
# Helper para montar um select para seleção de estados brasileiros por nome,
# mas com armazenamento da sigla.
def select_estado(object, method, options = {}, html_options = {})
select object, method, ESTADOS_BRASILEIROS, options, html_options
end
# Helper para montar um select para seleção de estados brasileiros por sigla.
def select_uf(object, method, options = {}, html_options = {})
select object, method, ESTADOS_BRASILEIROS.collect {|estado, sigla| sigla}, options, html_options
end
# Retorna uma string com a lista de estados brasileiros para usar em uma tag select,
# com exibição do nome do estado, mas armazenando a sigla.
def option_estados_for_select
options_for_select ESTADOS_BRASILEIROS
end
# Retorna uma string com a lista de estados brasileiros para usar em uma tag select,
# com exibição e armazenamento a sigla.
def option_uf_for_select
options_for_select ESTADOS_BRASILEIROS.collect {|nome,sigla| sigla}
end
# Helper para montar um select para seleção de sexo, armazenando apenas a
# inicial.
def select_sexo(object, method, options = {}, html_options = {})
select object, method, [['Masculino', 'M'], ['Feminino', 'F']], options, html_options
end
end

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

@ -1 +0,0 @@
require File.dirname(__FILE__) + '/../lib/brhelper'

Some files were not shown because too many files have changed in this diff Show More