caligrafo 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ rdoc
3
3
  pkg
4
4
  test/arquivo_gerado.txt
5
5
  test/tmp.txt
6
+ test/retorno.txt
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{caligrafo}
8
- s.version = "0.1.4"
8
+ s.version = "0.1.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Lucas de Castro"]
12
- s.date = %q{2009-11-18}
12
+ s.date = %q{2009-11-20}
13
13
  s.description = %q{DSL para geração de arquivos texto.}
14
14
  s.email = %q{castro.lucas@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -111,9 +111,13 @@ module Caligrafo
111
111
  end
112
112
  end
113
113
 
114
- def ler(linha)
114
+ def intervalo
115
115
  fim = self.fim || 0
116
- substring = linha[(self.inicio - 1)..(fim - 1)]
116
+ (self.inicio - 1)..(fim - 1)
117
+ end
118
+
119
+ def ler(linha)
120
+ substring = linha[self.intervalo]
117
121
 
118
122
  if formatador
119
123
  formatador.string_to_value substring
@@ -142,12 +146,6 @@ module Caligrafo
142
146
  raise "Erro ao preencher valor para #{objeto.inspect} no campo #{self.inspect}: #{e.message}"
143
147
  end
144
148
 
145
- private
146
-
147
- def chamar_metodo?
148
- @chamar_metodo
149
- end
150
-
151
149
  def formatar(valor)
152
150
  formatador = self.formatador
153
151
  formatador ||= Converter.pesquisar_por_tipo valor.class
@@ -157,6 +155,12 @@ module Caligrafo
157
155
  string
158
156
  end
159
157
 
158
+ private
159
+
160
+ def chamar_metodo?
161
+ @chamar_metodo
162
+ end
163
+
160
164
  def ajustar_inicio_e_fim(tamanho)
161
165
  self.inicio ||= calcular_inicio
162
166
  self.fim ||= self.inicio + tamanho - 1 if tamanho
@@ -1,28 +1,41 @@
1
1
  module Caligrafo
2
2
  module Reader
3
- def ler_arquivo(nome, &bloco)
3
+ def ler_arquivo(nome, opcoes={}, &bloco)
4
4
  estrutura = (self.is_a?(Class) ? self.estrutura : self.class.estrutura)
5
5
  raise 'A estrutura nao foi definida' unless estrutura
6
6
 
7
+ if output = opcoes.delete(:arquivo_retorno)
8
+ output_file = File.new(output, 'w')
9
+ secoes_retorno = opcoes.delete(:secoes_retorno)
10
+ secoes_retorno ||= estrutura.secoes.collect {|secao| secao.nome }
11
+ linha_retorno = 1
12
+ end
13
+
7
14
  File.open(nome, 'r') do |file|
8
15
  while linha = file.gets
9
16
  linha.extend LineExtension
10
17
  linha.arquivo = estrutura
11
18
  linha.descobrir_secao
12
19
  linha.numero = file.lineno
20
+ linha.numero_retorno = linha_retorno
13
21
 
14
22
  bloco.call linha
23
+
24
+ if output and secoes_retorno.include? linha.secao
25
+ output_file.puts linha.chomp
26
+ linha_retorno += 1
27
+ end
15
28
  end
16
29
  end
30
+
31
+ output_file.close if output
17
32
  end
18
33
 
19
34
  module LineExtension
20
- attr_accessor :arquivo, :numero
35
+ attr_accessor :arquivo, :numero, :numero_retorno
21
36
 
22
37
  def secao
23
- if @secao
24
- @secao.nome
25
- end
38
+ @secao.nome
26
39
  end
27
40
 
28
41
  def secao?(nome_secao)
@@ -30,23 +43,30 @@ module Caligrafo
30
43
  end
31
44
 
32
45
  def ler(nome_campo)
33
- if @secao
34
- campo = @secao.campos.find {|c| c.nome == nome_campo }
35
- campo.ler(self) if campo
36
- end
46
+ self.campo(nome_campo).ler(self)
47
+ end
48
+
49
+ def preencher(nome_campo, novo_valor)
50
+ campo = self.campo(nome_campo)
51
+ self[campo.intervalo] = campo.formatar(novo_valor)
52
+ self
37
53
  end
38
54
 
39
55
  def ler_campos
40
- if @secao
41
- hash = {}
42
- @secao.campos.each {|c| hash[c.nome] = c.ler(self) }
43
- hash
44
- end
56
+ hash = {}
57
+ @secao.campos.each {|c| hash[c.nome] = c.ler(self) }
58
+ hash
45
59
  end
46
60
 
47
61
  def descobrir_secao
48
62
  @secao = @arquivo.secoes.find {|s| s.dessa_linha?(self) }
49
63
  end
64
+
65
+ def campo(nome_campo)
66
+ campo = @secao.campos.find {|c| c.nome == nome_campo }
67
+ raise ArgumentError, "campo com o nome '#{nome_campo}' nao foi encontrado." unless campo
68
+ campo
69
+ end
50
70
  end
51
71
  end
52
72
  end
@@ -68,6 +68,51 @@ class CaligrafoTest < Test::Unit::TestCase
68
68
  end
69
69
  end
70
70
 
71
+ def test_preencher_campo
72
+ @portifolio.ler_arquivo 'test/example.txt' do |linha|
73
+ case linha.secao
74
+ when :cabecalho
75
+ linha.preencher(:nome, 'Lucas de Castro')
76
+ assert_equal 'Lucas de Castro', linha.ler(:nome)
77
+ assert_equal "01Lucas de Castro 0259000050 1\n", linha
78
+ end
79
+ end
80
+ end
81
+
82
+ def test_criar_arquivo_retorno
83
+ Portifolio.ler_arquivo 'test/example.txt', :arquivo_retorno => 'test/retorno.txt' do |linha|
84
+ case linha.secao
85
+ when :cabecalho
86
+ linha.preencher(:nome, 'Lucas de Castro')
87
+ end
88
+ end
89
+ assert_file_content 'test/retorno.txt', <<-EOF
90
+ 01Lucas de Castro 0259000050 1
91
+ 02Fone#1: 55 86 2222-3333 2
92
+ 02Fone#2: 55 86 9999-1234 3
93
+ 03google.com 4
94
+ 03blip.tv 5
95
+ 03slideshare.net 6
96
+ 04FIM 7
97
+ EOF
98
+ end
99
+
100
+ def test_criar_arquivo_retorno_limitando_secoes
101
+ Portifolio.ler_arquivo 'test/example.txt',
102
+ :arquivo_retorno => 'test/retorno.txt',
103
+ :secoes_retorno => [:cabecalho, :rodape] do |linha|
104
+ case linha.secao
105
+ when :cabecalho
106
+ linha.preencher :nome, 'Lucas de Castro'
107
+ when :rodape
108
+ linha.preencher :linha, linha.numero_retorno
109
+ end
110
+ end
111
+ assert_file_content 'test/retorno.txt', <<-EOF
112
+ 01Lucas de Castro 0259000050 1
113
+ 04FIM 2
114
+ EOF
115
+ end
71
116
  def test_description
72
117
  arquivo = Portifolio.estrutura
73
118
  assert arquivo
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caligrafo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucas de Castro
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-18 00:00:00 -03:00
12
+ date: 2009-11-20 00:00:00 -03:00
13
13
  default_executable:
14
14
  dependencies: []
15
15