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
|
||||
|
||||
[](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
|
Binary file not shown.
@ -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
Reference in new issue