exner 1.0.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.
Files changed (46) hide show
  1. data/.autotest +23 -0
  2. data/.gemtest +0 -0
  3. data/History.txt +4 -0
  4. data/Manifest.txt +42 -0
  5. data/README.txt +49 -0
  6. data/Rakefile +19 -0
  7. data/bin/rorschach +4 -0
  8. data/bin/zulliger +4 -0
  9. data/data/.~lock.sumario_Zulliger.rtf# +1 -0
  10. data/data/Rorschach_Zest.txt +50 -0
  11. data/data/Zulliger_Zest.txt +50 -0
  12. data/data/sumario.rtf +240 -0
  13. data/data/sumario2.rtf +271 -0
  14. data/data/sumario_Rorschach.rtf +233 -0
  15. data/data/sumario_Zulliger.rtf +203 -0
  16. data/data/test_manchas.txt +16 -0
  17. data/data/zulli_test.txt +11 -0
  18. data/lib/exner/respuesta.rb +110 -0
  19. data/lib/exner/rorschach.rb +11 -0
  20. data/lib/exner/rorschach_plugins/cdi.rb +22 -0
  21. data/lib/exner/rorschach_plugins/depi.rb +38 -0
  22. data/lib/exner/rorschach_plugins/hvi.rb +25 -0
  23. data/lib/exner/rorschach_plugins/interpretacion.rb +438 -0
  24. data/lib/exner/rorschach_plugins/obs.rb +36 -0
  25. data/lib/exner/rorschach_plugins/scon.rb +44 -0
  26. data/lib/exner/rorschach_plugins/sczi.rb +25 -0
  27. data/lib/exner/rtf/rorschach.rb +69 -0
  28. data/lib/exner/rtf/zulliger.rb +59 -0
  29. data/lib/exner/rtf.rb +46 -0
  30. data/lib/exner/test_manchas.rb +445 -0
  31. data/lib/exner/zulliger.rb +26 -0
  32. data/lib/exner/zulliger_plugins/interpretacion.rb +328 -0
  33. data/lib/exner.rb +44 -0
  34. data/test/extras.rb +11 -0
  35. data/test/helpers_tests.rb +41 -0
  36. data/test/test_depi.rb +29 -0
  37. data/test/test_exner.rb +100 -0
  38. data/test/test_hvi.rb +33 -0
  39. data/test/test_obs.rb +29 -0
  40. data/test/test_rorschach.rb +1 -0
  41. data/test/test_scon.rb +34 -0
  42. data/test/test_sczi.rb +29 -0
  43. data/test/text_cdi.rb +28 -0
  44. data.tar.gz.sig +0 -0
  45. metadata +193 -0
  46. metadata.gz.sig +0 -0
data/lib/exner/rtf.rb ADDED
@@ -0,0 +1,46 @@
1
+ # -encoding: UTF-8
2
+ module Exner
3
+ module Rtf
4
+ def _dcp(c)
5
+ _ds[c.gsub('C',"C'")]
6
+ end
7
+ def _cd(c)
8
+ c+" = "+_f['contenidos_1'][c].to_s+","+_f['contenidos_2'][c].to_s
9
+ end
10
+ def detRtf
11
+ s=""
12
+ @respuestas.each {|n,r|
13
+ s+="\n\\par "+r.determinantes.join('.')+r.fq if r.determinantes.size>1
14
+ }
15
+ s
16
+ end
17
+ def _ds
18
+ determinantes_simples
19
+ end
20
+ def superscript(a)
21
+ '{{\*\updnprop5801}\up8 '+a+'}'
22
+ end
23
+ def _res_enf
24
+ a=resumen_del_enfoque.collect {|lam|
25
+ Exner.a_romano(lam[0])+":"+lam[1].join(',')
26
+ }.join("\n\\par ")+"\n"
27
+ end
28
+ def _lq(tipo)
29
+ s=''
30
+ Exner::FQ_VALIDAS.each {|fq|
31
+ s+=fq+":"+_f[tipo][fq].to_s+"\n\\par "
32
+ }
33
+ s
34
+ end
35
+ def ldq
36
+ s=''
37
+ Exner::DQ_VALIDAS.each {|dq|
38
+ s+=dq+":"+_f['dq'][dq].to_s+"\n\\par "
39
+ }
40
+ s
41
+ end
42
+ end
43
+ end
44
+ require 'exner/rtf/zulliger'
45
+ require 'exner/rtf/rorschach'
46
+
@@ -0,0 +1,445 @@
1
+ # -encoding: UTF-8
2
+ module Exner
3
+ class TestManchas
4
+ FRECUENCIAS=%w{localizacion dq contenidos contenidos_1 contenidos_2 determinantes ccee fqx fqf mq sqx wqx dqx wdx pares}
5
+ attr_reader :respuestas, :laminas, :zf,:zsum, :frecuencias, :complejos, :sencillos, :msumm, :pares, :populares, :extras, :tipos_contenidos
6
+ ZEST_FILE=''
7
+ def initialize
8
+ @zf= @zsum= @pares= @populares=@tipos_contenidos= 0
9
+ @respuestas=Hash.new
10
+ @laminas=Hash.new
11
+ @frecuencias=Hash.new
12
+ @complejos=Array.new
13
+ @extras=Array.new
14
+ FRECUENCIAS.each {|i|
15
+ @frecuencias[i]=Hash.new
16
+ }
17
+ LOC_VALIDAS.each {|i|
18
+ @frecuencias['localizacion'][i]=0;
19
+ }
20
+ DQ_VALIDAS.each {|i|
21
+ @frecuencias['dq'][i]=0;
22
+ }
23
+ DET_VALIDOS.each {|i|
24
+ @frecuencias['determinantes'][i]=0;
25
+ }
26
+ CONT_VALIDOS.each {|i|
27
+ @frecuencias['contenidos'][i]=0;
28
+ @frecuencias['contenidos_1'][i]=0;
29
+ @frecuencias['contenidos_2'][i]=0;
30
+ }
31
+ CCEE_VALIDOS.each {|i|
32
+ @frecuencias['ccee'][i]=0;
33
+ }
34
+ FQ_VALIDAS.each {|i|
35
+ @frecuencias['fqx'][i]=0;
36
+ @frecuencias['fqf'][i]=0;
37
+ @frecuencias['mq'][i]=0;
38
+ @frecuencias['sqx'][i]=0;
39
+ @frecuencias['wqx'][i]=0;
40
+ @frecuencias['dqx'][i]=0;
41
+ @frecuencias['wdx'][i]=0;
42
+ }
43
+
44
+ end
45
+ def _d
46
+ @frecuencias['determinantes']
47
+ end
48
+ def _c
49
+ @frecuencias['contenidos']
50
+ end
51
+ def _ccee
52
+ @frecuencias['ccee']
53
+ end
54
+ def _f
55
+ @frecuencias
56
+ end
57
+ def _l
58
+ localizaciones
59
+ end
60
+
61
+ def zest
62
+ aEst=Exner::open_zest(self.ZEST_FILE)
63
+ aEst[@zf]
64
+ end
65
+ def open_stream(stream)
66
+ stream.each_line {|linea|
67
+ resp=Exner::Respuesta.new(self,linea)
68
+ lam=resp.lamina
69
+ @laminas[lam]=Array.new if @laminas[lam].nil?
70
+ raise "no pueden existir dos respuestas con el mismo número" if @respuestas.has_key?(resp.respuesta)
71
+ @respuestas[resp.respuesta]=resp
72
+ @laminas[lam].push(resp)
73
+ }
74
+ end
75
+ def open_file(file)
76
+ raise "No se definió archivo" if file.nil?
77
+ File.open(file,'r') {|file|
78
+ open_stream(file)
79
+ }
80
+ end
81
+ def each_determinante
82
+ @respuestas.each {|n,resp| resp.determinantes.each {|det| yield det }}
83
+ end
84
+ def obtenerZ(lamina,tipo)
85
+ return @laminas_z[lamina][tipo]
86
+ end
87
+ def procesar
88
+ @respuestas.each do |n,resp|
89
+ @zf+=1 if resp.z >0
90
+ @zsum+=resp.z
91
+ @pares+=1 if resp.par
92
+ @populares+=1 if resp.popular
93
+ raise "No existe localizacion para la respuesta "+n.to_s if resp.localizacion.nil?
94
+ @frecuencias['localizacion'][resp.localizacion]+=1
95
+ @frecuencias['dq'][resp.dq]+=1
96
+ @frecuencias['fqx'][resp.fq]+=1
97
+ @frecuencias['fqf'][resp.fq]+=1 if resp.determinantes==['F']
98
+ @frecuencias['mq'][resp.fq]+=1 if resp.tiene_movimiento_humano?
99
+ @frecuencias['sqx'][resp.fq]+=1 if resp.localizacion=~/S/
100
+ @frecuencias['wqx'][resp.fq]+=1 if resp.localizacion_pura=='W'
101
+ @frecuencias['dqx'][resp.fq]+=1 if resp.localizacion_pura=='D'
102
+ @frecuencias['wdx'][resp.fq]+=1 if resp.localizacion_pura=='W' or resp.localizacion_pura=='D'
103
+ @complejos.push(resp) if resp.determinantes.size>1
104
+ resp.determinantes.each {|d|
105
+ @frecuencias['determinantes'][d]+=1
106
+ }
107
+ cp=true
108
+ resp.contenidos.each {|d|
109
+ @frecuencias['contenidos'][d]+=1
110
+ @tipos_contenidos+=1 if @frecuencias['contenidos'][d]==1
111
+ if cp
112
+ @frecuencias['contenidos_1'][d]+=1
113
+ cp=false
114
+ else
115
+ @frecuencias['contenidos_2'][d]+=1
116
+ end
117
+
118
+ }
119
+ resp.ccee.each {|d|
120
+ @frecuencias['ccee'][d]+=1
121
+ }
122
+ end
123
+ procesar_extras
124
+ end
125
+ def procesar_extras
126
+ Dir[Exner.dir_root+'/exner/'+self.class.to_s.gsub('Exner::','').downcase+'_plugins/*.rb'].each {|file|
127
+ require file
128
+ }
129
+
130
+ end
131
+ def localizaciones
132
+ res=Hash.new
133
+ locs=%w{W Wv D Dd S}
134
+ locs.each {|i| res[i]=0}
135
+ @respuestas.each {|n,resp|
136
+ res['W']+=1 if resp.localizacion_pura=='W'
137
+ res['Wv']+=1 if resp.localizacion_pura=='W' and resp.dq=='v'
138
+ res['D']+=1 if resp.localizacion_pura=='D'
139
+ res['Dd']+=1 if resp.localizacion_pura=='Dd'
140
+ res['S']+=1 if resp.localizacion=~/S/
141
+ }
142
+ res
143
+ end
144
+ def determinantes_simples
145
+ res=@frecuencias['determinantes'].dup
146
+ ['M','FM','m'].each {|mov|
147
+ res[mov]=res[mov+'a']+res[mov+'p']
148
+ res.delete(mov+'a')
149
+ res.delete(mov+'p')
150
+ }
151
+ res['(2)']=@pares
152
+ res
153
+ end
154
+
155
+ def msum
156
+ sumdet('M')
157
+ end
158
+ # sumatoria de color ponderado
159
+ def det
160
+ @frecuencias['determinantes']
161
+ end
162
+ def sumcolpond
163
+ _d['C']*1.5+_d['CF']+_d['FC']*0.5
164
+ end
165
+
166
+ # sumatoria de items de un determinado tipo
167
+ def sumdet(tipo)
168
+ suma=0
169
+ each_determinante {|det|
170
+ if tipo=='M'
171
+ suma+=1 if det=='Ma' or det=='Mp'
172
+ elsif tipo=='FD'
173
+ suma+=1 if det=='FD'
174
+ elsif tipo=='C'
175
+ suma+=1 if det=='C' or det=='FC' or det=='CF'
176
+ elsif tipo=='Cn'
177
+ suma+=1 if det=='Cn'
178
+ elsif tipo=='F'
179
+ suma+1 if det=='F'
180
+ else
181
+ det=det.gsub(/[ap]/,'')
182
+ suma+=1 if det=~/#{tipo}/
183
+ end
184
+ }
185
+ suma
186
+ end
187
+ def resumen_del_enfoque
188
+ res=Hash.new
189
+ @laminas.each {|ln,resps|
190
+ resps.sort.each {|resp|
191
+ res[ln]=Array.new if res[ln].nil?
192
+ res[ln].push(resp.localizacion_pura)
193
+ }
194
+ }
195
+ res.sort
196
+ end
197
+ # Controles
198
+ def R
199
+ @respuestas.size
200
+ end
201
+ def L
202
+ fp=0.0
203
+ @respuestas.each {|n,resp|
204
+ fp+=1 if resp.determinantes==['F']
205
+ }
206
+ return fp.to_f / (self.R-fp)
207
+ end
208
+ def EB
209
+ sumdet('M').to_s+":"+sumcolpond.to_s
210
+ end
211
+ def EA
212
+ (msum+sumcolpond).to_f
213
+ end
214
+ def eb_izq
215
+ (sumdet('FM')+sumdet('m'))
216
+ end
217
+ def eb_der
218
+ (sumdet('T')+sumdet('V')+sumdet("C'")+ sumdet('Y'))
219
+ end
220
+ def eb
221
+ eb_izq.to_s+":"+eb_der.to_s
222
+ end
223
+ def es
224
+ eb_izq+eb_der
225
+ end
226
+ def Adjes
227
+ madj=(sumdet('m')>0) ? 1:0;
228
+ yadj=(sumdet('Y')>0) ? 1:0;
229
+ sumdet('FM')+madj+(sumdet('T')+sumdet('V')+sumdet("C'")+ yadj)
230
+ end
231
+ def EBPer
232
+ if (((msum-sumcolpond).abs<=2 and self.EA<=10) or
233
+ self.EA>10)
234
+ if msum>sumcolpond
235
+ msum/sumcolpond
236
+ else
237
+ sumcolpond/msum
238
+ end
239
+ else
240
+ false
241
+ end
242
+ end
243
+ def Dscore(d)
244
+ return 0 if d>=-2.5 and d<=2.5
245
+ (((d.abs-3)/2.5)+1).to_i*(d<0 ? -1:+1)
246
+ end
247
+ def D
248
+ Dscore(self.EA-es)
249
+ end
250
+ def AdjD
251
+ Dscore(self.EA-self.Adjes)
252
+ end
253
+ #Afectos
254
+
255
+ #FC:CF+C
256
+ def fc_cf_c
257
+ (det['FC']).to_s+':'+(det['CF']+det['C']).to_s
258
+ end
259
+ def sumc_wsumc
260
+ (sumdet("C'")).to_s+":"+(det['FC']*0.5+det['CF']+det['C']*1.5).to_s
261
+ end
262
+ def Afr
263
+ n=Hash.new
264
+ @laminas.each {|x,l|
265
+ n[x]=l.size
266
+ }
267
+ (n[8]+n[9]+n[10]).to_f/(n[1]+n[2]+n[3]+n[4]+n[5]+n[6]+n[7]).to_f
268
+ end
269
+ def complj_r
270
+ porcentaje(@complejos.size)
271
+ end
272
+ def CP
273
+ @frecuencias['ccee']['CP']
274
+ end
275
+ #interpersonal
276
+ def COP
277
+ @frecuencias['ccee']['COP']
278
+ end
279
+ def Fd
280
+ @frecuencias['contenidos']['Fd']
281
+ end
282
+ def AG
283
+ @frecuencias['ccee']['AG']
284
+ end
285
+ def aislamiento_r
286
+ c=@frecuencias['contenidos']
287
+ (2*c['Na']+2*c['Cl']+c['Bt']+c['Ls']+c['Ge']).to_f/self.R
288
+ end
289
+ def h_h_hd_hd
290
+ _c['H'].to_s+':'+(_c['(H)']+_c['Hd']+_c['(Hd)']).to_s
291
+ end
292
+ def p_h_hd_p_a_ad
293
+ c=@frecuencias['contenidos']
294
+ (c['(H)']+c['(Hd)']).to_s+':'+(c['(A)']+c['(Ad)']).to_s
295
+
296
+ end
297
+ def h_a_hd_ad
298
+ c=@frecuencias['contenidos']
299
+ (c['H']+c['A']).to_s+':'+(c['Hd']+c['Ad']).to_s
300
+ end
301
+ def a_porciento
302
+ c=@frecuencias['contenidos']
303
+ porcentaje(c['A']+c['Ad'])
304
+ end
305
+ def porcentaje(valor)
306
+ return valor.to_f/self.R
307
+ end
308
+ #Ideación
309
+ def suma_preg(p)
310
+ suma=0
311
+ each_determinante {|det| suma+=1 if det=~/#{p}/ }
312
+ suma
313
+ end
314
+ def activos
315
+ suma_preg('a')
316
+ end
317
+ def pasivos
318
+ suma_preg('p')
319
+ end
320
+ def a_p
321
+ activos.to_s+":"+pasivos.to_s
322
+ end
323
+ def Ma_Mp
324
+ a=p=0
325
+ each_determinante {|det|
326
+ if(det=='Ma' or det=='Mp')
327
+ a+=1 if det=~/a/
328
+ p+=1 if det=~/p/
329
+ end
330
+ }
331
+ a.to_s+":"+p.to_s
332
+ end
333
+ def intelectualizacion
334
+ c=@frecuencias['contenidos']
335
+ 2*@frecuencias['ccee']['AB']+(c['Art']+c['Ay'])
336
+ end
337
+ def m_menos
338
+ @frecuencias['mq']['-']
339
+ end
340
+ def SumBr6
341
+ suma=0
342
+ @respuestas.each {|n,resp|
343
+ resp.ccee.each {|ccee|
344
+ suma+=1 if CCEE_IDEACION.has_key?(ccee)
345
+ }
346
+ }
347
+ suma
348
+ end
349
+ def SumPon6
350
+ suma=0
351
+ @respuestas.each {|n,resp|
352
+ resp.ccee.each {|ccee|
353
+ suma+=CCEE_IDEACION[ccee] if CCEE_IDEACION.has_key?(ccee)
354
+ }
355
+ }
356
+ suma
357
+ end
358
+ def nvl2
359
+ suma=0
360
+ @respuestas.each {|n,resp|
361
+ resp.ccee.each {|ccee|
362
+ suma+=1 if CCEE_IDEACION.has_key?(ccee) and ccee=~/2/
363
+ }
364
+ }
365
+ suma
366
+ end
367
+ def msin
368
+ suma=0
369
+ @respuestas.each {|n,resp|
370
+ suma+=1 if resp.fq=='sin' and resp.determinantes.detect {|a| a=='Ma' or a=='Mp'}
371
+ }
372
+ suma
373
+ end
374
+ # mediacion
375
+ def P
376
+ @populares
377
+ end
378
+ def xmas
379
+ (@frecuencias['fqx']['o']+@frecuencias['fqx']['+']).to_f/self.R
380
+ end
381
+ def fmas
382
+ (@frecuencias['fqf']['o']+@frecuencias['fqf']['+']).to_f/ determinantes_simples['F']
383
+ end
384
+ def xmenos
385
+ @frecuencias['fqx']['-'].to_f/self.R
386
+ end
387
+ def smenos
388
+ @frecuencias['sqx']['-'].to_f/@frecuencias['fqx']['-']
389
+
390
+ end
391
+ def xu
392
+ @frecuencias['fqx']['u'].to_f/self.R
393
+ end
394
+ def xa
395
+ (@frecuencias['fqx']['o']+@frecuencias['fqx']['+']+ @frecuencias['fqx']['u']).to_f/self.R
396
+ end
397
+ def wda
398
+ wdx=@frecuencias['wdx']
399
+ loc=localizaciones
400
+ (wdx['+']+wdx['o']+wdx['u']).to_f/(loc['W']+loc['D'])
401
+ end
402
+ #Procesamiento
403
+ def Zf
404
+ @zf
405
+ end
406
+ def Zd
407
+ @zsum-zest
408
+ end
409
+ def w_d_dd
410
+ l=localizaciones
411
+ sprintf("%d:%d:%d",l['W'],l['D'],l['Dd'])
412
+ end
413
+ def w_m
414
+ l=localizaciones
415
+ sprintf("%d:%d",l['W'],determinantes_simples['M'])
416
+ end
417
+ def dqmas
418
+ @frecuencias['dq']['+']
419
+ end
420
+ def dqv
421
+ @frecuencias['dq']['v']
422
+ end
423
+ # autopercepcion
424
+ def autocentracion
425
+ (3*sumdet('r')+@pares).to_f/self.R
426
+ end
427
+ def fr_rf
428
+ sumdet('r')
429
+ end
430
+ def FD
431
+ @frecuencias['determinantes']['FD']
432
+ end
433
+ def an_xy
434
+ @frecuencias['contenidos']['An']+@frecuencias['contenidos']['Xy']
435
+ end
436
+ def mor
437
+ @frecuencias['ccee']['MOR']
438
+ end
439
+ end
440
+
441
+
442
+ end
443
+
444
+ require 'exner/rorschach'
445
+ require 'exner/zulliger'
@@ -0,0 +1,26 @@
1
+ # -encoding: UTF-8
2
+ module Exner
3
+ class Zulliger < TestManchas
4
+ def initialize
5
+ @laminas_z={
6
+ 1=>{'a'=>1.0,'b'=>4.0,'c'=>6.0,'d'=>3.5},
7
+ 2=>{'a'=>5.5,'b'=>3.0,'c'=>3.0,'d'=>4.0},
8
+ 3=>{'a'=>5.5,'b'=>3.0,'c'=>4.0,'d'=>4.5}
9
+ }
10
+ super
11
+ end
12
+ def ZEST_FILE
13
+ Exner.dir_data+'/Zulliger_Zest.txt'
14
+ end
15
+ def N
16
+ 3
17
+ end
18
+ def Afr
19
+ n=Hash.new
20
+ @laminas.each {|x,l|
21
+ n[x]=l.size
22
+ }
23
+ n[2].to_f/(n[1]+n[3]).to_f
24
+ end
25
+ end
26
+ end