brdinheiro 3.0.4 → 3.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README +9 -9
- data/Rakefile +1 -1
- data/lib/brdinheiro/dinheiro.rb +56 -56
- data/lib/brdinheiro/dinheiro_active_record.rb +4 -0
- data/lib/brdinheiro/dinheiro_util.rb +2 -2
- data/lib/brdinheiro/excecoes.rb +1 -1
- data/lib/brdinheiro/nil_class.rb +2 -2
- data/lib/brdinheiro/version.rb +1 -1
- data/test/active_record/base_without_table.rb +27 -1
- data/test/br_dinheiro_test.rb +1 -1
- data/test/dinheiro_active_record_test.rb +6 -0
- data/test/dinheiro_test.rb +90 -90
- data/test/nil_class_test.rb +10 -10
- metadata +33 -9
data/README
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
== Como usar o Dinheiro em seu ActiveRecord?
|
2
|
-
|
2
|
+
|
3
3
|
* Arquivo 001_create_lancamentos.rb:
|
4
|
-
|
4
|
+
|
5
5
|
class CreateLancamentos < ActiveRecord::Migration
|
6
6
|
def self.up
|
7
7
|
create_table :lancamentos do |t|
|
@@ -15,20 +15,20 @@
|
|
15
15
|
drop_table :lancamentos
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
* Arquivo lancamento.rb:
|
20
|
-
|
20
|
+
|
21
21
|
class Lancamento < ActiveRecord::Base
|
22
22
|
usar_como_dinheiro :valor, :mensalidade
|
23
23
|
end
|
24
24
|
|
25
25
|
* No console (script/console):
|
26
|
-
|
26
|
+
|
27
27
|
Loading development environment.
|
28
28
|
>> lancamento = Lancamento.new
|
29
|
-
=> #<Lancamento:0x9652cd8 @attributes={"descricao"=>nil,
|
30
|
-
"valor"=>#<BigDecimal:9657008,'0.0',4(4)>,
|
31
|
-
"mensalidade"=>#<BigDecimal:9656e8c,'0.0',4(4)>},
|
29
|
+
=> #<Lancamento:0x9652cd8 @attributes={"descricao"=>nil,
|
30
|
+
"valor"=>#<BigDecimal:9657008,'0.0',4(4)>,
|
31
|
+
"mensalidade"=>#<BigDecimal:9656e8c,'0.0',4(4)>},
|
32
32
|
@new_record=true>
|
33
33
|
>> lancamento.valor = 100
|
34
34
|
=> 100
|
@@ -49,4 +49,4 @@
|
|
49
49
|
>> lancamento.valor.real
|
50
50
|
=> "R$ 354,58"
|
51
51
|
>> exit
|
52
|
-
|
52
|
+
|
data/Rakefile
CHANGED
data/lib/brdinheiro/dinheiro.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
class Dinheiro
|
2
2
|
include Comparable
|
3
|
-
|
3
|
+
|
4
4
|
attr_reader :quantia
|
5
|
-
|
5
|
+
|
6
6
|
FORMATO_VALIDO_BR = /^([R|r]\$\s*)?(([+-]?\d{1,3}(\.?\d{3})*))?(\,\d{0,2})?$/
|
7
7
|
FORMATO_VALIDO_EUA = /^([R|r]\$\s*)?(([+-]?\d{1,3}(\,?\d{3})*))?(\.\d{0,2})?$/
|
8
8
|
SEPARADOR_MILHAR = "."
|
9
9
|
SEPARADOR_FRACIONARIO = ","
|
10
10
|
QUANTIDADE_DIGITOS = 3
|
11
11
|
PRECISAO_DECIMAL = 100
|
12
|
-
|
12
|
+
|
13
13
|
def initialize(quantia)
|
14
14
|
self.quantia = quantia
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# Retorna o valor armazenado em string.
|
18
18
|
#
|
19
19
|
# Exemplo:
|
@@ -21,7 +21,7 @@ class Dinheiro
|
|
21
21
|
def to_s
|
22
22
|
inteiro_com_milhar(parte_inteira) + parte_decimal
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
# Compara com outro dinheiro se eh igual.
|
26
26
|
#
|
27
27
|
# Exemplo:
|
@@ -29,14 +29,14 @@ class Dinheiro
|
|
29
29
|
# um_real == Dinheiro.new(1) ==> true
|
30
30
|
# um_real == Dinheiro.new(2) ==> false
|
31
31
|
def ==(outro_dinheiro)
|
32
|
-
begin
|
32
|
+
begin
|
33
33
|
outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro)
|
34
34
|
rescue
|
35
35
|
return false
|
36
36
|
end
|
37
37
|
@quantia == outro_dinheiro.quantia
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
# Compara com outro dinheiro se eh maior ou menor.
|
41
41
|
#
|
42
42
|
# Exemplo:
|
@@ -48,25 +48,25 @@ class Dinheiro
|
|
48
48
|
outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro)
|
49
49
|
@quantia <=> outro_dinheiro.quantia
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
# Retorna a adicao entre dinheiros.
|
53
53
|
#
|
54
54
|
# Exemplo:
|
55
|
-
# 1.real + 1.real == 2.reais
|
56
|
-
# 1.real + 1 == 2.reais
|
55
|
+
# 1.real + 1.real == 2.reais
|
56
|
+
# 1.real + 1 == 2.reais
|
57
57
|
def +(outro)
|
58
58
|
Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia + quantia_de(outro)))
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
# Retorna a subtracao entre dinheiros.
|
62
62
|
#
|
63
63
|
# Exemplo:
|
64
|
-
# 10.reais - 2.reais == 8.reais
|
65
|
-
# 10.reais - 2 == 8.reais
|
64
|
+
# 10.reais - 2.reais == 8.reais
|
65
|
+
# 10.reais - 2 == 8.reais
|
66
66
|
def -(outro)
|
67
67
|
Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia - quantia_de(outro)))
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
# Retorna a multiplicacao entre dinheiros.
|
71
71
|
#
|
72
72
|
# Exemplo:
|
@@ -76,7 +76,7 @@ class Dinheiro
|
|
76
76
|
return Dinheiro.new(to_f * outro) unless outro.kind_of? Dinheiro
|
77
77
|
outro * to_f
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
# Retorna a divisao entre dinheiros.
|
81
81
|
#
|
82
82
|
# Exemplo:
|
@@ -104,44 +104,44 @@ class Dinheiro
|
|
104
104
|
valor_maior = Dinheiro.new((@quantia/numero_de_parcelar+1)/100.0)
|
105
105
|
[valor_menor] * (numero_de_parcelar - resto) + [valor_maior] * resto
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
# Escreve o valor por extenso.
|
109
|
-
#
|
109
|
+
#
|
110
110
|
# Exemplo:
|
111
111
|
# 1.real.to_extenso ==> 'um real'
|
112
112
|
# (100.58).to_extenso ==> 'cem reais e cinquenta e oito centavos'
|
113
113
|
def to_extenso
|
114
114
|
(@quantia/100.0).por_extenso_em_reais
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
# Alias para o metodo to_extenso.
|
118
118
|
alias_method :por_extenso, :to_extenso
|
119
|
-
|
119
|
+
|
120
120
|
# Alias para o metodo to_extenso.
|
121
121
|
alias_method :por_extenso_em_reais, :to_extenso
|
122
|
-
|
122
|
+
|
123
123
|
# Verifica se o valor é zero.
|
124
124
|
def zero?
|
125
125
|
to_f.zero?
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
# Retorna um Float.
|
129
129
|
def to_f
|
130
130
|
to_s.gsub('.', '').gsub(',', '.').to_f
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
def coerce(outro)#:nodoc:
|
134
134
|
[ Dinheiro.new(outro), self ]
|
135
135
|
end
|
136
|
-
|
136
|
+
|
137
137
|
# Retorna a própria instância/
|
138
138
|
def real
|
139
139
|
self
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
# Alias para real.
|
143
143
|
alias_method :reais, :real
|
144
|
-
|
144
|
+
|
145
145
|
# Retorna uma string formatada com sigla em valor monetário.
|
146
146
|
# Exemplo:
|
147
147
|
# Dinheiro.new(1).real_formatado ==> 'R$ 1,00'
|
@@ -149,10 +149,10 @@ class Dinheiro
|
|
149
149
|
def real_formatado
|
150
150
|
"R$ #{to_s}"
|
151
151
|
end
|
152
|
-
|
152
|
+
|
153
153
|
# Alias para real_formatado.
|
154
154
|
alias_method :reais_formatado, :real_formatado
|
155
|
-
|
155
|
+
|
156
156
|
# Retorna uma string formatada com sigla em valor contábil.
|
157
157
|
#
|
158
158
|
# Exemplo:
|
@@ -161,10 +161,10 @@ class Dinheiro
|
|
161
161
|
def real_contabil
|
162
162
|
"R$ " + contabil
|
163
163
|
end
|
164
|
-
|
164
|
+
|
165
165
|
# Alias para real_contabil.
|
166
166
|
alias_method :reais_contabeis, :real_contabil
|
167
|
-
|
167
|
+
|
168
168
|
# Retorna uma string formatada sem sigla.
|
169
169
|
#
|
170
170
|
# Exemplo:
|
@@ -172,15 +172,15 @@ class Dinheiro
|
|
172
172
|
# Dinheiro.new(-1).contabil ==> '(1,00)'
|
173
173
|
def contabil
|
174
174
|
if @quantia >= 0
|
175
|
-
to_s
|
176
|
-
else
|
177
|
-
"(" + to_s[1..-1] + ")"
|
178
|
-
end
|
175
|
+
to_s
|
176
|
+
else
|
177
|
+
"(" + to_s[1..-1] + ")"
|
178
|
+
end
|
179
179
|
end
|
180
|
-
|
180
|
+
|
181
181
|
# Method missing para retorna um BigDecinal quando chamada .
|
182
182
|
def method_missing(symbol, *args) #:nodoc:
|
183
|
-
#Ex: Chama ao método valor_decimal()
|
183
|
+
#Ex: Chama ao método valor_decimal()
|
184
184
|
if (symbol.to_s =~ /^(.*)_decimal$/) && args.size == 0
|
185
185
|
BigDecimal.new quantia_sem_separacao_milhares.gsub(',','.')
|
186
186
|
else
|
@@ -194,7 +194,7 @@ class Dinheiro
|
|
194
194
|
return outro.quantia if outro.kind_of?(Dinheiro)
|
195
195
|
(outro * 100).round
|
196
196
|
end
|
197
|
-
|
197
|
+
|
198
198
|
def transforma_em_string_que_represente_a_quantia(quantia)
|
199
199
|
if /^([+-]?)(\d)$/ =~ quantia.to_s
|
200
200
|
return "#{$1}0.0#{$2}"
|
@@ -202,69 +202,69 @@ class Dinheiro
|
|
202
202
|
/^([+-]?)(\d*)(\d\d)$/ =~ quantia.to_s
|
203
203
|
"#{$1}#{$2.to_i}.#{$3}"
|
204
204
|
end
|
205
|
-
|
205
|
+
|
206
206
|
def quantia=(quantia)
|
207
207
|
raise DinheiroInvalidoError unless quantia_valida?(quantia)
|
208
208
|
quantia = quantia.to_f if quantia.kind_of?(BigDecimal)
|
209
209
|
@quantia = (quantia * 100).round if quantia.kind_of?(Numeric)
|
210
210
|
@quantia = extrai_quantia_como_inteiro(quantia) if quantia.kind_of?(String)
|
211
211
|
end
|
212
|
-
|
212
|
+
|
213
213
|
def parte_inteira
|
214
214
|
quantia_sem_separacao_milhares[0,quantia_sem_separacao_milhares.length-QUANTIDADE_DIGITOS]
|
215
215
|
end
|
216
|
-
|
216
|
+
|
217
217
|
def parte_decimal
|
218
218
|
quantia_sem_separacao_milhares[-QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS]
|
219
219
|
end
|
220
|
-
|
220
|
+
|
221
221
|
def inteiro_com_milhar(inteiro)
|
222
222
|
return inteiro if quantidade_de_passos(inteiro) == 0
|
223
223
|
resultado = ""
|
224
|
-
quantidade_de_passos(inteiro).times do |passo|
|
225
|
-
resultado = "." + inteiro[-QUANTIDADE_DIGITOS + passo * -QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS] + resultado
|
224
|
+
quantidade_de_passos(inteiro).times do |passo|
|
225
|
+
resultado = "." + inteiro[-QUANTIDADE_DIGITOS + passo * -QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS] + resultado
|
226
226
|
end
|
227
227
|
resultado = inteiro[0, digitos_que_sobraram(inteiro)] + resultado
|
228
228
|
resultado.gsub(/^(-?)\./, '\1')
|
229
229
|
end
|
230
|
-
|
230
|
+
|
231
231
|
def quantia_sem_separacao_milhares
|
232
232
|
sprintf("%.2f", (@quantia.to_f / PRECISAO_DECIMAL)).gsub(SEPARADOR_MILHAR, SEPARADOR_FRACIONARIO)
|
233
|
-
end
|
234
|
-
|
233
|
+
end
|
234
|
+
|
235
235
|
def quantidade_de_passos(inteiro)
|
236
236
|
resultado = inteiro.length / QUANTIDADE_DIGITOS
|
237
237
|
resultado = (resultado - 1) if inteiro.length % QUANTIDADE_DIGITOS == 0
|
238
238
|
resultado
|
239
239
|
end
|
240
|
-
|
240
|
+
|
241
241
|
def digitos_que_sobraram(inteiro)
|
242
242
|
inteiro.length - (quantidade_de_passos(inteiro) * QUANTIDADE_DIGITOS)
|
243
243
|
end
|
244
|
-
|
244
|
+
|
245
245
|
def quantia_valida?(quantia)
|
246
246
|
return false if quantia.kind_of?(String) && !quantia_respeita_formato?(quantia)
|
247
247
|
quantia.kind_of?(String) || quantia.kind_of?(Numeric)
|
248
248
|
end
|
249
|
-
|
249
|
+
|
250
250
|
def extrai_quantia_como_inteiro(quantia)
|
251
251
|
if FORMATO_VALIDO_BR =~ quantia
|
252
252
|
return sem_milhar($2, $5, '.')
|
253
253
|
end
|
254
|
-
if FORMATO_VALIDO_EUA =~ quantia
|
254
|
+
if FORMATO_VALIDO_EUA =~ quantia
|
255
255
|
return sem_milhar($2, $5, ',')
|
256
256
|
end
|
257
257
|
end
|
258
|
-
|
258
|
+
|
259
259
|
def sem_milhar(parte_inteira, parte_decimal, delimitador_de_milhar)
|
260
260
|
(inteiro(parte_inteira, delimitador_de_milhar) + decimal(parte_decimal)).to_i
|
261
261
|
end
|
262
|
-
|
262
|
+
|
263
263
|
def inteiro(inteiro_com_separador_milhar, separador)
|
264
264
|
return inteiro_com_separador_milhar.gsub(separador, '') unless inteiro_com_separador_milhar.blank?
|
265
265
|
""
|
266
266
|
end
|
267
|
-
|
267
|
+
|
268
268
|
def decimal(parte_fracionaria)
|
269
269
|
unless parte_fracionaria.blank?
|
270
270
|
return sem_delimitador_decimal(parte_fracionaria) if parte_fracionaria.length == 3
|
@@ -272,15 +272,15 @@ class Dinheiro
|
|
272
272
|
end
|
273
273
|
"00"
|
274
274
|
end
|
275
|
-
|
275
|
+
|
276
276
|
def sem_delimitador_decimal(parte_fracionaria)
|
277
277
|
"#{parte_fracionaria}".gsub(/[.|,]/, '')
|
278
278
|
end
|
279
|
-
|
280
|
-
|
279
|
+
|
280
|
+
|
281
281
|
def quantia_respeita_formato?(quantia)
|
282
282
|
return true if FORMATO_VALIDO_BR.match(quantia) || FORMATO_VALIDO_EUA.match(quantia)
|
283
283
|
false
|
284
284
|
end
|
285
|
-
|
285
|
+
|
286
286
|
end
|
@@ -27,7 +27,7 @@ module DinheiroUtil
|
|
27
27
|
def real_contabil
|
28
28
|
Dinheiro.new(self).real_contabil
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
# Retorna string formatada com simbolo monetario
|
32
32
|
#
|
33
33
|
# Exemplo:
|
@@ -36,7 +36,7 @@ module DinheiroUtil
|
|
36
36
|
def reais_contabeis
|
37
37
|
Dinheiro.new(self).reais_contabeis
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
# Retorna string formatada com simbolo monetario
|
41
41
|
#
|
42
42
|
# Exemplo:
|
data/lib/brdinheiro/excecoes.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
def cria_excecao(classe, mensagem)
|
2
2
|
eval "class #{classe}; def initialize; super('#{mensagem}'); end; end"
|
3
3
|
end
|
4
|
-
|
4
|
+
|
5
5
|
cria_excecao("DinheiroInvalidoError < ArgumentError", "O valor deve estar preenchido e no formato correto. Ex.: 100.00 .")
|
6
6
|
cria_excecao("DivisaPorNaoEscalarError < ArgumentError", "So eh possivel dividir dinheiro por numeros.")
|
data/lib/brdinheiro/nil_class.rb
CHANGED
data/lib/brdinheiro/version.rb
CHANGED
@@ -11,7 +11,11 @@ module ActiveRecord
|
|
11
11
|
def save
|
12
12
|
self.valid?
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
|
+
def column_for_attribute(name)
|
16
|
+
self.class.columns_hash[name.to_s]
|
17
|
+
end
|
18
|
+
|
15
19
|
class << self
|
16
20
|
def columns()
|
17
21
|
@columns ||= []
|
@@ -27,7 +31,29 @@ module ActiveRecord
|
|
27
31
|
undefine_attribute_methods
|
28
32
|
@column_names = @columns_hash = @content_columns = @dynamic_methods_hash = @read_methods = nil
|
29
33
|
end
|
34
|
+
|
35
|
+
def columns_hash
|
36
|
+
hash = {}
|
37
|
+
columns.each do |column|
|
38
|
+
hash[column.name] = column
|
39
|
+
end
|
40
|
+
hash
|
41
|
+
end
|
42
|
+
|
43
|
+
def column_defaults
|
44
|
+
defaults = {}
|
45
|
+
columns.each do |column|
|
46
|
+
defaults[column.name.to_sym] = nil
|
47
|
+
end
|
48
|
+
defaults
|
49
|
+
end
|
30
50
|
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def self.attributes_protected_by_default
|
54
|
+
[]
|
55
|
+
end
|
56
|
+
|
31
57
|
end
|
32
58
|
end
|
33
59
|
|
data/test/br_dinheiro_test.rb
CHANGED
@@ -44,6 +44,12 @@ class DinheiroActiveRecordTest < Test::Unit::TestCase
|
|
44
44
|
carteira = Carteira.new(:saldo => "1")
|
45
45
|
assert_equal 1.real, carteira.saldo
|
46
46
|
end
|
47
|
+
|
48
|
+
def test_se_atualiza_valor_inicializado
|
49
|
+
carteira = Carteira.new(:saldo => 10.reais)
|
50
|
+
carteira.saldo += 5.reais
|
51
|
+
assert_equal 15.reais, carteira.saldo
|
52
|
+
end
|
47
53
|
|
48
54
|
end
|
49
55
|
|
data/test/dinheiro_test.rb
CHANGED
@@ -3,11 +3,11 @@ require File.dirname(__FILE__) + '/test_helper'
|
|
3
3
|
class DinheiroTest < Test::Unit::TestCase
|
4
4
|
|
5
5
|
CONTABIL = { "(2,00)" => -2,
|
6
|
-
"2,00" => 2,
|
6
|
+
"2,00" => 2,
|
7
7
|
"0,00" => 0,
|
8
8
|
"0,32" => 0.32,
|
9
9
|
"(0,01)" => -0.01 }
|
10
|
-
|
10
|
+
|
11
11
|
REAL_CONTABIL = { "R$ (1,00)" => -1,
|
12
12
|
"R$ (0,12)" => -0.12,
|
13
13
|
"R$ 1,00" => 1,
|
@@ -26,7 +26,7 @@ class DinheiroTest < Test::Unit::TestCase
|
|
26
26
|
0.3.real => 0.real + 0.3.real,
|
27
27
|
-0.3.real => 0.real + -0.3.real,
|
28
28
|
-0.03.real => 0 + -0.03.real,
|
29
|
-
-0.03.real => 0.real + -0.03,
|
29
|
+
-0.03.real => 0.real + -0.03,
|
30
30
|
-1.03.real => -1.real + -0.03,
|
31
31
|
-1.03.real => -1.real + BigDecimal.new("-0.03") }
|
32
32
|
|
@@ -41,10 +41,10 @@ class DinheiroTest < Test::Unit::TestCase
|
|
41
41
|
0.03.real => 0.03.real - 0.real,
|
42
42
|
0.03.real => 0.06.real - 0.03.real,
|
43
43
|
-0.03.real => 0 - 0.03.real,
|
44
|
-
-0.03.real => 0.real - 0.03,
|
45
|
-
-1.03.real => -1.real - 0.03,
|
44
|
+
-0.03.real => 0.real - 0.03,
|
45
|
+
-1.03.real => -1.real - 0.03,
|
46
46
|
-1.03.real => -1.real - BigDecimal.new("0.03") }
|
47
|
-
|
47
|
+
|
48
48
|
MULTIPLICACAO = { 0.real => 0.real * 0,
|
49
49
|
0.real => 0.real * 1,
|
50
50
|
0.real => 0.real * -1,
|
@@ -76,8 +76,8 @@ class DinheiroTest < Test::Unit::TestCase
|
|
76
76
|
0.01.real => 0.01 * 1.real,
|
77
77
|
0.01.real => 1.real * BigDecimal("0.01"),
|
78
78
|
0.01.real => BigDecimal("0.01") * 1.real }
|
79
|
-
|
80
|
-
DIVISAO = {
|
79
|
+
|
80
|
+
DIVISAO = {
|
81
81
|
Dinheiro.new(0.33) => Dinheiro.new(1) / 3,
|
82
82
|
Dinheiro.new(33.33) => Dinheiro.new(100) / 3,
|
83
83
|
Dinheiro.new(50.00) => Dinheiro.new(100) / 2,
|
@@ -85,8 +85,8 @@ class DinheiroTest < Test::Unit::TestCase
|
|
85
85
|
Dinheiro.new(0.17) => Dinheiro.new(0.5) / 3,
|
86
86
|
Dinheiro.new(0.33) => Dinheiro.new(0.33) / 1
|
87
87
|
}
|
88
|
-
|
89
|
-
PARCELAS = {
|
88
|
+
|
89
|
+
PARCELAS = {
|
90
90
|
[Dinheiro.new(0.33), Dinheiro.new(0.33), Dinheiro.new(0.34)] => Dinheiro.new(1).parcelar(3),
|
91
91
|
[Dinheiro.new(33.33), Dinheiro.new(33.33), Dinheiro.new(33.34)] => Dinheiro.new(100).parcelar(3),
|
92
92
|
[Dinheiro.new(50.00), Dinheiro.new(50)] => Dinheiro.new(100).parcelar(2),
|
@@ -94,9 +94,9 @@ class DinheiroTest < Test::Unit::TestCase
|
|
94
94
|
[Dinheiro.new(0.16), Dinheiro.new(0.17),Dinheiro.new(0.17)] => Dinheiro.new(0.5).parcelar(3),
|
95
95
|
[Dinheiro.new(0.33)] => Dinheiro.new(0.33).parcelar(1),
|
96
96
|
[Dinheiro.new(0.33)] => Dinheiro.new(0.33).parcelar(1),
|
97
|
-
}
|
98
|
-
|
99
|
-
|
97
|
+
}
|
98
|
+
|
99
|
+
|
100
100
|
QUANTIA_COM_FORMATO_VALIDO = [ "1211",
|
101
101
|
"1211.",
|
102
102
|
"1211.0",
|
@@ -138,7 +138,7 @@ class DinheiroTest < Test::Unit::TestCase
|
|
138
138
|
'12.123.99',
|
139
139
|
'1,123,99',
|
140
140
|
'1212,39.90' ]
|
141
|
-
|
141
|
+
|
142
142
|
COMPARACAO = [ 1.real < 2.reais,
|
143
143
|
1.real <= 2.reais,
|
144
144
|
2.real > 1.real,
|
@@ -154,11 +154,11 @@ class DinheiroTest < Test::Unit::TestCase
|
|
154
154
|
1.real == 1.00,
|
155
155
|
1.real >= 1.00,
|
156
156
|
1.real <= 1.00 ]
|
157
|
-
|
158
|
-
ARREDONDAMENTO = { 23049 => 230.49,
|
157
|
+
|
158
|
+
ARREDONDAMENTO = { 23049 => 230.49,
|
159
159
|
23049 => 230.4949999999,
|
160
160
|
23050 => 230.495 }
|
161
|
-
|
161
|
+
|
162
162
|
PONTO_NO_MILHAR = { "234.175.211" => "234175211",
|
163
163
|
"" => "",
|
164
164
|
"1" => "1",
|
@@ -192,103 +192,103 @@ class DinheiroTest < Test::Unit::TestCase
|
|
192
192
|
"2,30" => "2,30" ,
|
193
193
|
"2,30" => 2.30 ,
|
194
194
|
"2,30" => 2.3 ,
|
195
|
-
"1.211,00" => "1211,00" ,
|
196
|
-
"1.211,01" => "1211,01" ,
|
197
|
-
"1.211,50" => "1211,5" ,
|
198
|
-
"1.211,00" => "1211," ,
|
195
|
+
"1.211,00" => "1211,00" ,
|
196
|
+
"1.211,01" => "1211,01" ,
|
197
|
+
"1.211,50" => "1211,5" ,
|
198
|
+
"1.211,00" => "1211," ,
|
199
199
|
"1.211,00" => "1211" ,
|
200
|
-
"1.211,00" => "1211.00" ,
|
201
|
-
"1.211,01" => "1211.01" ,
|
202
|
-
"1.211,20" => "1211.2" ,
|
200
|
+
"1.211,00" => "1211.00" ,
|
201
|
+
"1.211,01" => "1211.01" ,
|
202
|
+
"1.211,20" => "1211.2" ,
|
203
203
|
"1.211,00" => "1211." ,
|
204
204
|
"1.211,00" => "1211" ,
|
205
205
|
"1.211,00" => "1.211" ,
|
206
|
-
"123.112.211,35" => "123112211,35" ,
|
207
|
-
"-123.112.211,35" => "-123112211,35" ,
|
206
|
+
"123.112.211,35" => "123112211,35" ,
|
207
|
+
"-123.112.211,35" => "-123112211,35" ,
|
208
208
|
"123.112.211,35" => "+123112211,35" }
|
209
|
-
|
209
|
+
|
210
210
|
PARTE_INTEIRA = [ -1, -123112211, 0, 1, 12344545 ]
|
211
|
-
|
212
|
-
|
211
|
+
|
212
|
+
|
213
213
|
def setup
|
214
214
|
tornar_metodos_publicos Dinheiro
|
215
215
|
@dinheiro = 1.real
|
216
216
|
end
|
217
217
|
|
218
218
|
def testa_se_cria_dinheiro_a_partir_de_quantias_validos
|
219
|
-
QUANTIA_VALIDA.each do |esperado, quantia|
|
219
|
+
QUANTIA_VALIDA.each do |esperado, quantia|
|
220
220
|
assert_equal esperado, Dinheiro.new(quantia).to_s, "Deveria ter vindo o quantia: #{esperado} quando recebeu #{quantia}"
|
221
221
|
end
|
222
222
|
end
|
223
|
-
|
223
|
+
|
224
224
|
# coloca_ponto_no_milhar
|
225
225
|
def testa_se_coloca_ponto_no_milhar
|
226
|
-
PONTO_NO_MILHAR.each do |esperado, quantia|
|
226
|
+
PONTO_NO_MILHAR.each do |esperado, quantia|
|
227
227
|
{ esperado => quantia,
|
228
|
-
"-#{esperado}" => "-#{quantia}" }.each do |esperado, quantia|
|
229
|
-
assert_equal esperado, @dinheiro.inteiro_com_milhar(quantia)
|
228
|
+
"-#{esperado}" => "-#{quantia}" }.each do |esperado, quantia|
|
229
|
+
assert_equal esperado, @dinheiro.inteiro_com_milhar(quantia)
|
230
230
|
end
|
231
231
|
end
|
232
232
|
end
|
233
|
-
|
233
|
+
|
234
234
|
def testa_to_s
|
235
235
|
assert_equal "1,00", Dinheiro.new(1).to_s
|
236
236
|
assert_equal "1.000,00", Dinheiro.new(1000).to_s
|
237
237
|
end
|
238
|
-
|
238
|
+
|
239
239
|
# real
|
240
240
|
def testa_real_nao_eh_dinheiro
|
241
241
|
assert_kind_of(Dinheiro, 1.real)
|
242
242
|
end
|
243
|
-
|
243
|
+
|
244
244
|
def testa_real_eh_dinheiro
|
245
245
|
assert_kind_of(Dinheiro, Dinheiro.new(1).real)
|
246
246
|
end
|
247
|
-
|
247
|
+
|
248
248
|
def testa_real_contabil
|
249
249
|
REAL_CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).real_contabil }
|
250
|
-
end
|
251
|
-
|
250
|
+
end
|
251
|
+
|
252
252
|
def testa_reais_contabeis
|
253
253
|
REAL_CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).reais_contabeis }
|
254
|
-
end
|
255
|
-
|
254
|
+
end
|
255
|
+
|
256
256
|
# reais
|
257
257
|
def testa_reais
|
258
258
|
assert_equal Dinheiro.new("2,00"), Dinheiro.new(2).reais
|
259
259
|
end
|
260
|
-
|
260
|
+
|
261
261
|
def testa_contabil
|
262
262
|
CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).contabil }
|
263
|
-
end
|
263
|
+
end
|
264
264
|
|
265
265
|
# real_formatado
|
266
266
|
def test_real_formatado
|
267
267
|
assert_equal "R$ 2,00", Dinheiro.new(2).real_formatado
|
268
268
|
end
|
269
|
-
|
269
|
+
|
270
270
|
# ==
|
271
271
|
def testa_igualdade
|
272
272
|
assert_equal Dinheiro.new(1), Dinheiro.new(1)
|
273
273
|
end
|
274
|
-
|
274
|
+
|
275
275
|
def testa_igualdade_quando_passa_possivel_dinheiro
|
276
276
|
assert_equal Dinheiro.new(1), 1.0
|
277
277
|
end
|
278
|
-
|
278
|
+
|
279
279
|
def testa_igualdade_quando_passa_algo_que_nao_seja_dinheiro
|
280
280
|
assert_equal false, Dinheiro.new(1) == 'salario'
|
281
281
|
end
|
282
|
-
|
282
|
+
|
283
283
|
# / (divisao)
|
284
284
|
def testa_divisao
|
285
285
|
DIVISAO.each { |parcelas, divisao| assert_equal parcelas, divisao }
|
286
286
|
end
|
287
|
-
|
287
|
+
|
288
288
|
def testa_divisao_por_zero
|
289
289
|
assert_raise(ZeroDivisionError) { 1.real / 0 }
|
290
290
|
end
|
291
|
-
|
291
|
+
|
292
292
|
def testa_divisao_por_algo_que_nao_seja_um_escalar
|
293
293
|
assert_raise(DivisaPorNaoEscalarError) { 10.reais / 2.reais }
|
294
294
|
end
|
@@ -297,55 +297,55 @@ class DinheiroTest < Test::Unit::TestCase
|
|
297
297
|
def testa_parcelar
|
298
298
|
PARCELAS.each { |parcelas, divisao| assert_equal parcelas, divisao }
|
299
299
|
end
|
300
|
-
|
300
|
+
|
301
301
|
def testa_parcelar_por_zero
|
302
302
|
assert_raise(ZeroDivisionError) { 1.real.parcelar 0 }
|
303
303
|
end
|
304
|
-
|
304
|
+
|
305
305
|
def testa_parcelar_por_algo_que_nao_seja_um_escalar
|
306
306
|
assert_raise(DivisaPorNaoEscalarError) { 10.reais.parcelar(2.reais) }
|
307
307
|
end
|
308
|
-
|
308
|
+
|
309
309
|
# initialize
|
310
310
|
def testa_se_cria_dinheiro_a_partir_de_float
|
311
311
|
verifica_se_cria_dinheiro_para 1.0
|
312
|
-
end
|
313
|
-
|
312
|
+
end
|
313
|
+
|
314
314
|
def testa_se_cria_dinheiro_a_partir_de_fixnum
|
315
315
|
verifica_se_cria_dinheiro_para 1
|
316
|
-
end
|
317
|
-
|
316
|
+
end
|
317
|
+
|
318
318
|
def testa_se_cria_dinheiro_a_partir_de_bigdecimal
|
319
319
|
verifica_se_cria_dinheiro_para BigDecimal.new("1")
|
320
|
-
end
|
320
|
+
end
|
321
321
|
|
322
322
|
def testa_se_cria_dinheiro_a_partir_de_string
|
323
323
|
verifica_se_cria_dinheiro_para "1"
|
324
|
-
end
|
325
|
-
|
324
|
+
end
|
325
|
+
|
326
326
|
def testa_se_rejeita_criacao_de_dinheiro_a_partir_de_string_invalida
|
327
|
-
QUANTIA_COM_FORMATO_INVALIDO.each do |quantia|
|
327
|
+
QUANTIA_COM_FORMATO_INVALIDO.each do |quantia|
|
328
328
|
assert_raise DinheiroInvalidoError, "Deveria ter rejeitado [#{quantia}]" do
|
329
329
|
Dinheiro.new quantia
|
330
330
|
end
|
331
331
|
end
|
332
332
|
end
|
333
|
-
|
333
|
+
|
334
334
|
# + (soma)
|
335
335
|
def testa_soma
|
336
336
|
SOMA.each{ |esperado, soma| assert_equal esperado, soma }
|
337
|
-
end
|
338
|
-
|
337
|
+
end
|
338
|
+
|
339
339
|
# - (subtracao)
|
340
340
|
def testa_subtracao
|
341
341
|
SUBTRACAO.each { |esperado, subtracao| assert_equal esperado, subtracao }
|
342
342
|
end
|
343
|
-
|
343
|
+
|
344
344
|
# * (multiplicacao)
|
345
345
|
def testa_multiplicacao
|
346
|
-
MULTIPLICACAO.each { |esperado, multiplicacao| assert_equal esperado, multiplicacao }
|
346
|
+
MULTIPLICACAO.each { |esperado, multiplicacao| assert_equal esperado, multiplicacao }
|
347
347
|
end
|
348
|
-
|
348
|
+
|
349
349
|
# quantia_de
|
350
350
|
def testa_quantia_de
|
351
351
|
assert_equal 0, @dinheiro.quantia_de(0.real)
|
@@ -384,39 +384,39 @@ class DinheiroTest < Test::Unit::TestCase
|
|
384
384
|
assert_equal 2.30, 2.30.real.to_f
|
385
385
|
assert_equal 1000, 1000.real.to_f
|
386
386
|
end
|
387
|
-
|
387
|
+
|
388
388
|
# quantia_respeita_formato?
|
389
389
|
def testa_se_quantia_respeita_formato
|
390
390
|
QUANTIA_COM_FORMATO_VALIDO.each { |quantia| verifica_se_quantia_respeita_formato quantia }
|
391
391
|
end
|
392
|
-
|
392
|
+
|
393
393
|
# >, <, == (ordenacao)
|
394
394
|
def testa_comparacao_entre_dinheiro
|
395
395
|
COMPARACAO.each { |comparacao| assert comparacao }
|
396
396
|
end
|
397
|
-
|
397
|
+
|
398
398
|
def testa_comparacao_entre_possivel_dinheiro
|
399
399
|
COMPARACAO_COM_ESCALAR.each { |comparacao_com_escalar| assert comparacao_com_escalar }
|
400
400
|
end
|
401
|
-
|
401
|
+
|
402
402
|
# decimal
|
403
403
|
def testa_decimal_quando_todas_as_casas_estao_preenchidas
|
404
404
|
verifica_decimal("12")
|
405
405
|
end
|
406
|
-
|
406
|
+
|
407
407
|
def testa_decimal_quando_apenas_uma_das_casas_esta_preenchida
|
408
408
|
verifica_decimal("10", "1")
|
409
409
|
end
|
410
|
-
|
410
|
+
|
411
411
|
def testa_decimal_quando_nenhuma_das_casas_esta_preenchida
|
412
412
|
verifica_decimal("00", "")
|
413
413
|
end
|
414
|
-
|
414
|
+
|
415
415
|
def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_tres_digitos
|
416
416
|
verifica_se_transforma_em_string_corretamente "1.23", 123
|
417
417
|
end
|
418
418
|
|
419
|
-
def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_dois_digitos
|
419
|
+
def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_dois_digitos
|
420
420
|
verifica_se_transforma_em_string_corretamente "0.12", 12
|
421
421
|
end
|
422
422
|
|
@@ -425,20 +425,20 @@ class DinheiroTest < Test::Unit::TestCase
|
|
425
425
|
end
|
426
426
|
|
427
427
|
def testa_se_transforma_em_string_para_valores_especiais
|
428
|
-
verifica_se_transforma_em_string_corretamente "-123112211.00", -12311221100
|
428
|
+
verifica_se_transforma_em_string_corretamente "-123112211.00", -12311221100
|
429
429
|
end
|
430
430
|
|
431
431
|
# parte_inteira
|
432
432
|
def testa_parte_inteira
|
433
433
|
PARTE_INTEIRA.each { |quantia| assert_equal "#{quantia}", Dinheiro.new(quantia).parte_inteira }
|
434
434
|
end
|
435
|
-
|
435
|
+
|
436
436
|
def testa_se_arredonda_valores_corretamente
|
437
|
-
ARREDONDAMENTO.each do |esperado, quantia|
|
437
|
+
ARREDONDAMENTO.each do |esperado, quantia|
|
438
438
|
assert_equal esperado, Dinheiro.new(quantia).quantia, "Deveria retornar #{esperado} para #{quantia}"
|
439
439
|
end
|
440
440
|
end
|
441
|
-
|
441
|
+
|
442
442
|
def testa_se_valor_decimal_cria_o_big_decimal_corretamente
|
443
443
|
assert_equal BigDecimal.new("1234.56"), Dinheiro.new("1234,56").valor_decimal
|
444
444
|
end
|
@@ -446,33 +446,33 @@ class DinheiroTest < Test::Unit::TestCase
|
|
446
446
|
def testa_soma_de_dinheiro_com_big_decimal
|
447
447
|
assert_equal Dinheiro.new(200), BigDecimal.new("100").reais + "100".reais
|
448
448
|
end
|
449
|
-
|
449
|
+
|
450
450
|
def testa_zero_quando_eh_zero
|
451
451
|
assert Dinheiro.new(0).zero?
|
452
452
|
end
|
453
|
-
|
453
|
+
|
454
454
|
def testa_zero_quando_nao_eh_zero
|
455
455
|
assert !Dinheiro.new(1).zero?
|
456
456
|
end
|
457
|
-
|
457
|
+
|
458
458
|
private
|
459
|
-
|
459
|
+
|
460
460
|
def verifica_se_transforma_em_string_corretamente(quantia_esperada, quantia)
|
461
461
|
assert_equal quantia_esperada, @dinheiro.transforma_em_string_que_represente_a_quantia(quantia)
|
462
462
|
end
|
463
|
-
|
463
|
+
|
464
464
|
def verifica_decimal(esperado, quantia = esperado)
|
465
465
|
assert_equal esperado, @dinheiro.decimal("." + quantia)
|
466
466
|
assert_equal esperado, @dinheiro.decimal("," + quantia)
|
467
467
|
assert_equal esperado, @dinheiro.decimal(quantia) if quantia.blank?
|
468
468
|
end
|
469
|
-
|
469
|
+
|
470
470
|
def verifica_se_quantia_respeita_formato(quantia)
|
471
|
-
formatos_validos(quantia).each do |quantia_str|
|
471
|
+
formatos_validos(quantia).each do |quantia_str|
|
472
472
|
assert 1.real.quantia_respeita_formato?(quantia_str), "O sistema deveria considerar o quantia '#{quantia_str}' dentro do formato valido."
|
473
473
|
end
|
474
474
|
end
|
475
|
-
|
475
|
+
|
476
476
|
def formatos_validos(quantia)
|
477
477
|
formatos_validos = []
|
478
478
|
quantias_validas(quantia).each do |quantia|
|
@@ -485,14 +485,14 @@ class DinheiroTest < Test::Unit::TestCase
|
|
485
485
|
end
|
486
486
|
formatos_validos
|
487
487
|
end
|
488
|
-
|
488
|
+
|
489
489
|
def quantias_validas(quantia)
|
490
490
|
return [quantia] if [ ".", "," ].include?(quantia[0..0])
|
491
491
|
[ quantia, "-#{quantia}" ]
|
492
492
|
end
|
493
|
-
|
493
|
+
|
494
494
|
def verifica_se_cria_dinheiro_para(quantia)
|
495
495
|
assert quantia.para_dinheiro.kind_of?(Dinheiro)
|
496
496
|
end
|
497
|
-
|
497
|
+
|
498
498
|
end
|
data/test/nil_class_test.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
3
|
class NilClassTest < Test::Unit::TestCase
|
4
|
-
|
4
|
+
|
5
5
|
def test_real
|
6
6
|
assert_equal Dinheiro.new(0), nil.real
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
def test_reais
|
10
10
|
assert_equal Dinheiro.new(0), nil.reais
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def test_para_dinheiro
|
14
14
|
assert_equal Dinheiro.new(0), nil.para_dinheiro
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def test_valor
|
18
18
|
assert_equal Dinheiro.new(0), nil.valor
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def test_contabil
|
22
22
|
assert_equal "0,00", nil.contabil
|
23
23
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
29
|
end
|
metadata
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brdinheiro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 3
|
7
|
+
- 0
|
8
|
+
- 5
|
9
|
+
version: 3.0.5
|
6
10
|
platform: ruby
|
7
11
|
authors:
|
8
12
|
- "Marcos Tapaj\xC3\xB3s"
|
@@ -16,52 +20,66 @@ autorequire:
|
|
16
20
|
bindir: bin
|
17
21
|
cert_chain: []
|
18
22
|
|
19
|
-
date:
|
23
|
+
date: 2012-01-02 00:00:00 -02:00
|
20
24
|
default_executable:
|
21
25
|
dependencies:
|
22
26
|
- !ruby/object:Gem::Dependency
|
23
27
|
name: actionpack
|
24
|
-
prerelease: false
|
25
28
|
requirement: &id001 !ruby/object:Gem::Requirement
|
26
29
|
none: false
|
27
30
|
requirements:
|
28
31
|
- - ">="
|
29
32
|
- !ruby/object:Gem::Version
|
33
|
+
segments:
|
34
|
+
- 3
|
35
|
+
- 0
|
36
|
+
- 0
|
30
37
|
version: 3.0.0
|
31
38
|
type: :runtime
|
39
|
+
prerelease: false
|
32
40
|
version_requirements: *id001
|
33
41
|
- !ruby/object:Gem::Dependency
|
34
42
|
name: activerecord
|
35
|
-
prerelease: false
|
36
43
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
44
|
none: false
|
38
45
|
requirements:
|
39
46
|
- - ">="
|
40
47
|
- !ruby/object:Gem::Version
|
48
|
+
segments:
|
49
|
+
- 3
|
50
|
+
- 0
|
51
|
+
- 0
|
41
52
|
version: 3.0.0
|
42
53
|
type: :runtime
|
54
|
+
prerelease: false
|
43
55
|
version_requirements: *id002
|
44
56
|
- !ruby/object:Gem::Dependency
|
45
57
|
name: brnumeros
|
46
|
-
prerelease: false
|
47
58
|
requirement: &id003 !ruby/object:Gem::Requirement
|
48
59
|
none: false
|
49
60
|
requirements:
|
50
61
|
- - "="
|
51
62
|
- !ruby/object:Gem::Version
|
52
|
-
|
63
|
+
segments:
|
64
|
+
- 3
|
65
|
+
- 0
|
66
|
+
- 5
|
67
|
+
version: 3.0.5
|
53
68
|
type: :runtime
|
69
|
+
prerelease: false
|
54
70
|
version_requirements: *id003
|
55
71
|
- !ruby/object:Gem::Dependency
|
56
72
|
name: rake
|
57
|
-
prerelease: false
|
58
73
|
requirement: &id004 !ruby/object:Gem::Requirement
|
59
74
|
none: false
|
60
75
|
requirements:
|
61
76
|
- - ">="
|
62
77
|
- !ruby/object:Gem::Version
|
78
|
+
segments:
|
79
|
+
- 0
|
63
80
|
version: "0"
|
64
81
|
type: :development
|
82
|
+
prerelease: false
|
65
83
|
version_requirements: *id004
|
66
84
|
description: "brdinheiro \xC3\xA9 uma das gems que compoem o Brazilian Rails"
|
67
85
|
email:
|
@@ -110,17 +128,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
110
128
|
requirements:
|
111
129
|
- - ">="
|
112
130
|
- !ruby/object:Gem::Version
|
131
|
+
hash: -3233565507204023944
|
132
|
+
segments:
|
133
|
+
- 0
|
113
134
|
version: "0"
|
114
135
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
136
|
none: false
|
116
137
|
requirements:
|
117
138
|
- - ">="
|
118
139
|
- !ruby/object:Gem::Version
|
140
|
+
hash: -3233565507204023944
|
141
|
+
segments:
|
142
|
+
- 0
|
119
143
|
version: "0"
|
120
144
|
requirements:
|
121
145
|
- brnumeros
|
122
146
|
rubyforge_project: brdinheiro
|
123
|
-
rubygems_version: 1.
|
147
|
+
rubygems_version: 1.3.7
|
124
148
|
signing_key:
|
125
149
|
specification_version: 3
|
126
150
|
summary: "brdinheiro \xC3\xA9 uma das gems que compoem o Brazilian Rails"
|