imposition 0.8.8 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/impostor CHANGED
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
  begin
3
- require 'rubygems'
4
3
  require 'imposition'
5
4
  #METHODS
6
5
  def input(nombre)
@@ -19,7 +18,7 @@ def input(nombre)
19
18
  if split[2]=="" then
20
19
  retorno["unidad"]="point"#default
21
20
  else
22
- retorno["unidad"]=input2alchemist(split[2])
21
+ retorno["unidad"]=Metodos.input2alchemist(split[2])
23
22
  end
24
23
  return retorno
25
24
  else
@@ -97,7 +96,7 @@ end
97
96
  #
98
97
  entrada=ARGV.shift
99
98
  $salida=ARGV.shift
100
- check=Metodos.checksRun(entrada,$salida)
99
+ check=Metodos.checksRun()
101
100
  if check.instance_of? Clases::Mensaje then
102
101
  puts check.mensaje
103
102
  exit
@@ -131,28 +130,28 @@ def recursivo(w_,h_,wP_,hP_,nX,nY,nPaginas,nPliegos,cuadernillos, preguntas)
131
130
  exit
132
131
  end
133
132
  else
134
- if !impostor.preguntas["par"].ok then
133
+ if impostor.preguntas["par"]!=nil and !impostor.preguntas["par"].ok then
135
134
  puts impostor.preguntas["par"].mensaje
136
135
  impostor.preguntas["par"].metodo(exigePar(nX))
137
136
  recursivo(w_,h_,wP_,hP_,nX,nY,nPaginas,nPliegos,cuadernillos,impostor.preguntas)
138
- elsif !impostor.preguntas["cXC"].ok then
137
+ elsif impostor.preguntas["cXC"]!=nil and !impostor.preguntas["cXC"].ok then
139
138
  puts impostor.preguntas["cXC"].mensaje
140
139
  impostor.preguntas["cXC"].metodo(input("cXC:"))
141
140
  recursivo(w_,h_,wP_,hP_,nX,nY,nPaginas,nPliegos,cuadernillos,impostor.preguntas)
142
- elsif !impostor.preguntas["escaladoH"].ok then
141
+ elsif impostor.preguntas["escaladoH"]!=nil and !impostor.preguntas["escaladoH"].ok then
143
142
  puts !impostor.preguntas["escaladoH"].mensaje
144
143
  impostor.preguntas["escaladoH"].metodo(escalado(impostor.preguntas["escaladoH"].tipo))
145
144
  impostor.preguntas["escaladoH"].ok=true
146
145
  recursivo(w_,h_,wP_,hP_,nX,nY,nPaginas,nPliegos,cuadernillos,impostor.preguntas)
147
- elsif !impostor.preguntas["escaladoV"].ok then
146
+ elsif impostor.preguntas["escaladoV"]!=nil and !impostor.preguntas["escaladoV"].ok then
148
147
  puts impostor.preguntas["escaladoV"].mensaje
149
148
  impostor.preguntas["escaladoV"].metodo(escalado(impostor.preguntas["escaladoV"].tipo))
150
149
  recursivo(w_,h_,wP_,hP_,nX,nY,nPaginas,nPliegos,cuadernillos,impostor.preguntas)
151
- elsif !impostor.preguntas["todasPag"].ok then
150
+ elsif impostor.preguntas["todasPag"]!=nil and !impostor.preguntas["todasPag"].ok then
152
151
  puts impostor.preguntas["todasPag"].mensaje
153
152
  impostor.preguntas["todasPag"].metodo(todasPag(impostor.preguntas["todasPag"].nPliegos, impostor.preguntas["todasPag"].nX, impostor.preguntas["todasPag"].nY, impostor.preguntas["todasPag"].caben, impostor.preguntas["todasPag"].tiene))
154
153
  recursivo(w_,h_,wP_,hP_,nX,nY,nPaginas,nPliegos,cuadernillos,impostor.preguntas)
155
- elsif !impostor.preguntas["reducir"].ok then
154
+ elsif impostor.preguntas["reducir"]!=nil and !impostor.preguntas["reducir"].ok then
156
155
  puts impostor.preguntas["reducir"].mensaje
157
156
  impostor.preguntas["reducir"].metodo(reducirUltimo(impostor.preguntas["reducir"].cuadernillosPorCostura, impostor.preguntas["reducir"].paginasSobran, impostor.preguntas["reducir"].nCuad, impostor.preguntas["reducir"].sobranMenos))
158
157
  recursivo(w_,h_,wP_,hP_,nX,nY,nPaginas,nPliegos,cuadernillos,impostor.preguntas)
data/lib/imposition.rb CHANGED
@@ -1,16 +1,22 @@
1
- #GEMA
1
+ #GEMAS
2
+ require 'rubygems'
3
+ require 'uuidtools'
4
+ require 'fileutils'
5
+ require 'alchemist'
6
+ #Clases
2
7
  require 'imposition/clases'
3
8
  require 'imposition/metodos'
4
9
  #
10
+ #
5
11
  $requerimientos=Hash.new
6
12
  $requerimientos["pdflatex"]="pdflatex"
7
13
  $requerimientos["pdfinfo"]="pdfinfo"
8
14
  #
9
- work="/tmp/impostor"
15
+ $work="/tmp"
10
16
  #
11
- check=Metodos.checksCompile($requerimientos,work)
17
+ check=Metodos.checksCompile()
12
18
  if check.instance_of? Clases::Mensaje then
13
19
  puts check.mensaje
14
- exit#TODO raise
20
+ exit
15
21
  end
16
22
 
@@ -79,10 +79,14 @@ class Mix
79
79
  end
80
80
 
81
81
  class Mensaje
82
- attr_reader :level, :mensaje
83
- def initialize(level, mensaje)
84
- @level=level #1=info, 2=warn, 3=error
85
- @mensaje=mensaje
82
+ attr_reader :id, :level, :mensaje
83
+ def initialize(*args)
84
+ if args.size==1 then
85
+ @id=args[0]
86
+ elsif args.size==2 then
87
+ @level=args[0] #level 1=info, 2=warn, 3=error
88
+ @mensaje=args[1]
89
+ end
86
90
  end
87
91
  def to_s
88
92
  if @level==1 then
@@ -92,37 +96,36 @@ class Mensaje
92
96
  elsif @level==3 then
93
97
  @retorno="ERROR: "
94
98
  end
95
- @retorno+=@mensaje
99
+ @retorno+=@mensaje.to_s
96
100
  return @retorno
97
101
  end
98
102
  def ==(msg)
99
- return (!(msg.instance_of? MensajeDato) and !(msg.instance_of? MensajeMedida) and !(msg.instance_of? MensajeTiempo) and !(msg.instance_of? MensajeLadoLado) and @level===msg.level)# and @mensaje==msg.mensaje)
103
+ return @id==msg.id
100
104
  end
101
105
  end
102
106
  #
103
107
  class MensajeDato < Mensaje
104
108
  attr_reader :tipo, :numero
105
- def initialize(level, tipo, numero)
106
- @tipo=tipo
107
- @numero=numero
108
- @mensaje=deducirMensaje(tipo,level,numero)
109
- super(level, @mensaje)
110
- end
111
- def ==(msg)
112
- #super(?)
113
- return (msg.instance_of? MensajeDato and @level==msg.level and @tipo==msg.tipo and @numero==msg.numero)# and @mensaje==msg.mensaje)
114
- end
109
+ def initialize(level,tipo,numero)
110
+ @level=level
111
+ @tipo=tipo
112
+ @numero=numero
113
+ dd=deducirMensaje(tipo,level,numero)
114
+ @id=dd[0]
115
+ @mensaje=dd[1]
116
+ super(level, @mensaje)
117
+ end
115
118
  def deducirMensaje(tipo, level, numero)
116
119
  if tipo=="horizontal" then
117
120
  if level==1 then#info
118
121
  if numero==1 then
119
122
  return "se calcula la cantidad de paginas por pliego horizontalmente en base al ancho del pliego y el de la pagina"
120
123
  elsif numero==2 then
121
- return "se calcula el ancho del pliego en base al de la pagina y la cantidad de paginas por pliego horizontalmente"
124
+ return [2,"se calcula el ancho del pliego en base al de la pagina y la cantidad de paginas por pliego horizontalmente"]
122
125
  elsif numero==3 then
123
- return "se calcula el ancho de la pagina en base al del pliego y la cantidad de paginas por pliego horizontalmente"
126
+ return [12,"se calcula el ancho de la pagina en base al del pliego y la cantidad de paginas por pliego horizontalmente"]
124
127
  elsif numero==4 then
125
- return "se toma el ancho real de la pagina"
128
+ return [1,"se toma el ancho real de la pagina"]
126
129
  end
127
130
  elsif level==3 then#error
128
131
  if numero==1 then
@@ -142,11 +145,11 @@ class MensajeDato < Mensaje
142
145
  if numero==1 then
143
146
  return "se calcula la cantidad de paginas por pliego verticalmente en base al alto del pliego y el de la pagina"
144
147
  elsif numero==2 then
145
- return "se calcula el alto del pliego en base al de la pagina y la cantidad de paginas por pliego verticalmente"
148
+ return [4,"se calcula el alto del pliego en base al de la pagina y la cantidad de paginas por pliego verticalmente"]
146
149
  elsif numero==3 then
147
- return "se calcula el alto de la pagina en base al del pliego y la cantidad de paginas por pliego verticalmente"
150
+ return [11,"se calcula el alto de la pagina en base al del pliego y la cantidad de paginas por pliego verticalmente"]
148
151
  elsif numero==4 then
149
- return "se toma el alto real de la pagina"
152
+ return [3,"se toma el alto real de la pagina"]
150
153
  end
151
154
  elsif level==3 then#error
152
155
  if numero==1 then
@@ -166,9 +169,9 @@ class MensajeDato < Mensaje
166
169
  if numero==1 then
167
170
  return "se calcula el numero de paginas a partir del numero de pliegos y de la cantidad de paginas por pliego"
168
171
  elsif numero==2 then
169
- return "se calcula el numero de pliegos a partir del numero de paginas y de la cantidad de paginas por pliego"
172
+ return [6,"se calcula el numero de pliegos a partir del numero de paginas y de la cantidad de paginas por pliego"]
170
173
  elsif numero==3 then
171
- return "se usan todas las paginas del pdf"
174
+ return [5,"se usan todas las paginas del pdf"]
172
175
  end
173
176
  elsif level==3 then
174
177
  if numero==1 then
@@ -195,9 +198,6 @@ class MensajeMedida < Mensaje
195
198
  @mensaje=deducirMensaje(level, tipo, args)
196
199
  super(level, @mensaje)
197
200
  end
198
- def ==(msg)
199
- return (msg.instance_of? MensajeMedida and @level==msg.level and @tipo==msg.tipo) #!args ?
200
- end
201
201
  def deducirMensaje(level, tipo, args)
202
202
  if tipo=="horizontal" then
203
203
  if level==3 then
@@ -221,40 +221,68 @@ class MensajeTiempo < Mensaje
221
221
  @tiempo=tiempo
222
222
  @level=1
223
223
  if tipo==1 then#booklets
224
+ @id=14#fijo
224
225
  @mensaje="::::::::::::booklets:::::::::::::\n"#blink blink
225
226
  @mensaje+="booklets: "
226
227
  elsif tipo==2 then
228
+ @id=9#fijo
227
229
  @mensaje="::::::::::::cut&Stack::::::::::::\n"#blink blink
228
230
  @mensaje+="cut&Stack: "
229
231
  end
230
232
  @mensaje+=@tiempo.to_s+" segundos"
231
- @tiempo=tiempo
232
233
  super(level,mensaje)
233
234
  end
234
- def ==(msg)
235
- return (msg.instance_of? MensajeTiempo and @tipo==msg.tipo)
236
- end
237
235
  end
238
236
  #
239
237
  class MensajeLadoLado < Mensaje
240
238
  attr_reader :nP
241
239
  def initialize(nP)
240
+ @id=7#fijo
242
241
  @nP=nP
243
242
  @mensaje="como son cuadernillos lado y lado los pliegos no pueden ser impares, se toman #{@nP}+1"
244
243
  super(1,@mensaje)
245
244
  end
246
- def ==(msg)
247
- return (msg.instance_of? MensajeLadoLado and @nP==msg.nP)
245
+ end
246
+ #
247
+ class MensajeVars < Mensaje
248
+ def initialize(*args)
249
+ if args.size==0 then
250
+ super(8)#clásico
251
+ elsif args.size==2 then
252
+ @id=8
253
+ super(args[0],args[1])
254
+ end
255
+ end
256
+ end
257
+ #
258
+ class MensajeMultiplo < Mensaje
259
+ def initialize(level, mensaje)
260
+ @id=10
261
+ super(level,mensaje)
262
+ end
263
+ end
264
+ #TODO DRY!
265
+ class MensajeBooklets < Mensaje
266
+ def initialize(level,mensaje)
267
+ @id=13
268
+ super(level,mensaje)
248
269
  end
249
270
  end
250
271
 
251
272
  class Pregunta
252
273
  attr_accessor :ok, :yn, :mensaje
274
+ attr_reader :ide
253
275
  def initialize(mensaje)
254
276
  @mensaje=mensaje
255
277
  end
256
278
  def metodo()
257
279
  end
280
+ def ==(question)
281
+ if question==nil then
282
+ return false
283
+ end
284
+ return @ide==question.ide
285
+ end
258
286
  end
259
287
  #
260
288
  #TODO sugerencia si + o -
@@ -288,6 +316,11 @@ class PreguntaEscalado < Pregunta
288
316
  def initialize(tipo)
289
317
  @mensaje="en duro"
290
318
  @tipo=tipo
319
+ if @tipo=="horizontal" then
320
+ @ide=1
321
+ elsif @tipo=="vertical" then
322
+ @ide=2
323
+ end
291
324
  end
292
325
  def metodo(yn)
293
326
  @yn=yn
@@ -1,9 +1,4 @@
1
1
  module Metodos
2
-
3
- require 'rubygems'
4
- require 'uuidtools'
5
- require 'fileutils'
6
- require 'alchemist'
7
2
 
8
3
  #WORK
9
4
  def funcionar(w_,h_,wP_,hP_,nX,nY,nPaginas,nPliegos,cuadernillos,preguntas)
@@ -11,21 +6,21 @@ def funcionar(w_,h_,wP_,hP_,nX,nY,nPaginas,nPliegos,cuadernillos,preguntas)
11
6
  pdfinfo(impostor, $temp)
12
7
  retorno=validacion(impostor, preguntas)
13
8
  if retorno.preguntasOk then
14
- retorno.mensajes.push(Clases::Mensaje.new(1,impostor.to_s))
9
+ retorno.mensajes.push(Clases::MensajeVars.new(1,impostor.to_s))
15
10
  if impostor.cuadernillos then
16
11
  retorno.mensajes.push(imponerBooklet(impostor, $temp))
17
12
  end
18
13
  retorno.mensajes.push(imponerStack(impostor, $temp))
19
14
  #lo devuelvo
20
- if $salida != nil then
21
- entrada=$salida
15
+ if $salida == nil then
16
+ $salida=$entrada
22
17
  end
23
- FileUtils.mv($dir+"/"+"cutStack.pdf", entrada)
18
+ FileUtils.mv($dir+"/"+"cutStack.pdf", $salida)
24
19
  end
25
20
  return retorno
26
21
  end
27
22
 
28
- def checksCompile(requerimientos, work)
23
+ def checksCompile()
29
24
  #paquetes
30
25
  $requerimientos.each do |k,v|
31
26
  `which #{v}`
@@ -35,38 +30,42 @@ def checksCompile(requerimientos, work)
35
30
  end
36
31
  #archivos
37
32
  #probamos que exista el directorio de trabajo
38
- if File.exists?(work) then
33
+ if File.exists?($work) then
39
34
  #y que sea escribible
40
- if File.writable?(work) and File.writable_real?(work) then
35
+ if File.writable?($work) and File.writable_real?($work) then
36
+ $work+="/impostor"
37
+ if !File.exists?($work) then
38
+ Dir.mkdir($work)
39
+ end
41
40
  #creo mi directorio
42
- $dir=work+"/"+UUIDTools::UUID.random_create
41
+ $dir=$work+"/"+UUIDTools::UUID.random_create
43
42
  Dir.mkdir($dir)
44
43
  $codeDir = Dir.pwd
45
44
  else
46
- return Clases::Mensaje.new(3,"el directorio de trabajo "+work+" no se puede escribir")
45
+ return Clases::Mensaje.new(3,"el directorio de trabajo "+$work+" no se puede escribir")
47
46
  end
48
47
  else
49
- return Clases::Mensaje.new(3,"el directorio de trabajo "+work+ " no existe")
48
+ return Clases::Mensaje.new(3,"el directorio de trabajo "+$work+ " no existe")
50
49
  end
51
50
  end
52
51
 
53
- def checksRun(entrada, salida)
52
+ def checksRun()
54
53
  #la entrada
55
- if entrada != nil then
56
- if File.file?(entrada) then
57
- if File.owned?(entrada) then
54
+ if $entrada != nil then
55
+ if File.file?($entrada) then
56
+ if File.owned?($entrada) then
58
57
  busca = /.*(.pdf)/
59
- if busca.match(File.basename(entrada)) then
60
- $temp=$dir+"/"+File.basename(entrada)#me lo llevo
61
- FileUtils.cp(entrada, $temp)
58
+ if busca.match(File.basename($entrada)) then
59
+ $temp=$dir+"/"+File.basename($entrada)#me lo llevo
60
+ FileUtils.cp($entrada, $temp)
62
61
  else
63
- return Clases::Mensaje.new(3,"el archivo "+entrada+" no es pdf")
62
+ return Clases::Mensaje.new(3,"el archivo "+$entrada+" no es pdf")
64
63
  end
65
64
  else
66
- return Clases::Mensaje.new(3,"el archivo "+entrada+" no es mío")
65
+ return Clases::Mensaje.new(3,"el archivo "+$entrada+" no es mío")
67
66
  end
68
67
  else
69
- return Clases::Mensaje.new(3,entrada+" no es un archivo")
68
+ return Clases::Mensaje.new(3,$entrada+" no es un archivo")
70
69
  end
71
70
  else
72
71
  return Clases::Mensaje.new(3,"no ha especificado archivo a imponer")
@@ -85,9 +84,19 @@ def checksRun(entrada, salida)
85
84
  end
86
85
  end
87
86
 
87
+ #TODO validar que unidad exista en alchemist
88
+ def input2alchemist(unidad)
89
+ if unidad=="pt" or unidad=="pts" then
90
+ return "point"
91
+ elsif unidad=="PT" or unidad=="bp" then
92
+ return "printer_point"
93
+ else
94
+ return unidad.downcase
95
+ end
96
+ end
97
+
88
98
  #########
89
- module_function :funcionar, :checksCompile, :checksRun
90
- #########
99
+ module_function :funcionar, :checksCompile, :checksRun, :input2alchemist
91
100
 
92
101
  def self.pdfinfo(impostor, temp)
93
102
  Dir.chdir($dir)
@@ -370,17 +379,6 @@ def self.unaDentroDeOtra(paginasReal, paginasEnCuadernillo, inicio, fin)
370
379
  return arreglo
371
380
  end
372
381
 
373
- #TODO validar que unidad exista en alchemist
374
- def self.input2alchemist(unidad)
375
- if unidad=="pt" or unidad=="pts" then
376
- return "point"
377
- elsif unidad=="PT" or unidad=="bp" then
378
- return "printer_point"
379
- else
380
- return unidad.downcase
381
- end
382
- end
383
-
384
382
  def self.redondear(n)#por BUG de alchemist (ruby 1.9 tiene round(3))
385
383
  (n*1000).round/1000
386
384
  end
@@ -451,11 +449,11 @@ def self.validacion(impostor, preguntas)
451
449
  return Clases::RespuestaImpostor.new(preguntas,mensajes)
452
450
  else
453
451
  impostor.cuadernillosPorCostura=preguntas["cXC"].cXC
454
- end
452
+ end
455
453
  impostor.nX=impostor.nX/2
456
454
  impostor.w=impostor.w*2
457
455
  impostor.w_["numero"]=impostor.w
458
- mensajes.push(Clases::Mensaje.new(1, "como imponemos en cuadernillos, tomamos la mitad de paginas horizontalmente y una pagina del doble de ancho"))
456
+ mensajes.push(Clases::MensajeBooklets.new(1, "como imponemos en cuadernillos, tomamos la mitad de paginas horizontalmente y una pagina del doble de ancho"))
459
457
  end
460
458
  #HORIZONTALMENTE
461
459
  if impostor.w!=0.point then
@@ -485,7 +483,7 @@ def self.validacion(impostor, preguntas)
485
483
  preguntas["escaladoH"]=Clases::PreguntaEscalado.new("horizontalmente")
486
484
  else
487
485
  if preguntas["escaladoH"].yn then
488
- impostor.w=(impostor.wP.to_f/impostor.nX).send(impostor.wP_["unidad"])
486
+ impostor.w=(impostor.wP.to_f/(impostor.nX*(impostor.cuadernillos ? 2 : 1))).send(impostor.wP_["unidad"])#divido en 2 porque ya lo multipliqué
489
487
  impostor.w_["numero"]=impostor.w
490
488
  impostor.w_["unidad"]=impostor.wP_["unidad"]
491
489
  mensajes.push(Clases::MensajeDato.new(1, "horizontal", 3))#info
@@ -504,6 +502,7 @@ def self.validacion(impostor, preguntas)
504
502
  if impostor.cuadernillos then
505
503
  impostor.w=impostor.w*2
506
504
  impostor.w_["numero"]=impostor.w
505
+ puts impostor.w
507
506
  end
508
507
  impostor.w_["unidad"]=impostor.size["unidad"]
509
508
  mensajes.push(Clases::MensajeDato.new(1, "horizontal", 4))#info
@@ -691,7 +690,7 @@ def self.validacion(impostor, preguntas)
691
690
  #nPaginas multiplo de nX*nY
692
691
  if impostor.nX*impostor.nY!=0 and impostor.nPaginas%(impostor.nX*impostor.nY)!=0 then
693
692
  impostor.nPaginas=(impostor.nPaginas/(impostor.nX*impostor.nY)+1)*(impostor.nX*impostor.nY)
694
- mensajes.push(Clases::Mensaje.new(1, "El pdf tiene #{impostor.nPaginasReal} paginas, que impuestas en #{impostor.nX}x#{impostor.nY} son #{impostor.nPaginas} paginas"))
693
+ mensajes.push(Clases::MensajeMultiplo.new(1, "El pdf tiene #{impostor.nPaginasReal} paginas, que impuestas en #{impostor.nX}x#{impostor.nY} son #{impostor.nPaginas} paginas"))
695
694
  end
696
695
  #TODO ¿ROTAR? si se gasta menos espacio por pliego o en total da menos pliegos
697
696
  return Clases::RespuestaImpostor.new(preguntas,mensajes)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imposition
3
3
  version: !ruby/object:Gem::Version
4
- hash: 47
4
+ hash: 59
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 8
9
- - 8
10
- version: 0.8.8
8
+ - 9
9
+ - 0
10
+ version: 0.9.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Numerico
@@ -16,8 +16,63 @@ bindir: bin
16
16
  cert_chain: []
17
17
 
18
18
  date: 2012-08-16 00:00:00 Z
19
- dependencies: []
20
-
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: alchemist
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: uuidtools
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: fileutils
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ type: :runtime
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: test/unit
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ type: :development
75
+ version_requirements: *id004
21
76
  description: nUp & booklets
22
77
  email: webmaster@numerica.cl
23
78
  executables: