imposition 0.8.8 → 0.9.0

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/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: