fifadat 0.0.1

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 (93) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +4 -0
  3. data/Manifest.txt +91 -0
  4. data/README.md +24 -0
  5. data/Rakefile +32 -0
  6. data/bin/fifadat +14 -0
  7. data/lib/fifadat/api-config.rb +120 -0
  8. data/lib/fifadat/api.rb +110 -0
  9. data/lib/fifadat/config/codes_club-europe.csv +59 -0
  10. data/lib/fifadat/config/codes_club.csv +41 -0
  11. data/lib/fifadat/config/codes_nati.csv +6 -0
  12. data/lib/fifadat/config/seasons/ar.csv +7 -0
  13. data/lib/fifadat/config/seasons/at.csv +7 -0
  14. data/lib/fifadat/config/seasons/at.cup.csv +5 -0
  15. data/lib/fifadat/config/seasons/au.csv +7 -0
  16. data/lib/fifadat/config/seasons/be.csv +7 -0
  17. data/lib/fifadat/config/seasons/br.csv +6 -0
  18. data/lib/fifadat/config/seasons/ch.csv +7 -0
  19. data/lib/fifadat/config/seasons/clubworldcup.csv +2 -0
  20. data/lib/fifadat/config/seasons/cn.csv +7 -0
  21. data/lib/fifadat/config/seasons/co.csv +7 -0
  22. data/lib/fifadat/config/seasons/copa.l.csv +7 -0
  23. data/lib/fifadat/config/seasons/copa.s.csv +7 -0
  24. data/lib/fifadat/config/seasons/cz.csv +7 -0
  25. data/lib/fifadat/config/seasons/de.2.csv +6 -0
  26. data/lib/fifadat/config/seasons/de.csv +7 -0
  27. data/lib/fifadat/config/seasons/de.cup.csv +6 -0
  28. data/lib/fifadat/config/seasons/eg.csv +6 -0
  29. data/lib/fifadat/config/seasons/eng.2.csv +7 -0
  30. data/lib/fifadat/config/seasons/eng.csv +7 -0
  31. data/lib/fifadat/config/seasons/eng.facup.csv +6 -0
  32. data/lib/fifadat/config/seasons/es.csv +6 -0
  33. data/lib/fifadat/config/seasons/fr.csv +6 -0
  34. data/lib/fifadat/config/seasons/gr.csv +7 -0
  35. data/lib/fifadat/config/seasons/hu.csv +6 -0
  36. data/lib/fifadat/config/seasons/ie.csv +6 -0
  37. data/lib/fifadat/config/seasons/il.csv +6 -0
  38. data/lib/fifadat/config/seasons/interconticup.csv +24 -0
  39. data/lib/fifadat/config/seasons/is.csv +6 -0
  40. data/lib/fifadat/config/seasons/it.csv +7 -0
  41. data/lib/fifadat/config/seasons/it.cup.csv +5 -0
  42. data/lib/fifadat/config/seasons/jp.csv +7 -0
  43. data/lib/fifadat/config/seasons/kr.csv +7 -0
  44. data/lib/fifadat/config/seasons/lu.csv +3 -0
  45. data/lib/fifadat/config/seasons/ma.csv +3 -0
  46. data/lib/fifadat/config/seasons/mls.csv +6 -0
  47. data/lib/fifadat/config/seasons/mx.2.csv +5 -0
  48. data/lib/fifadat/config/seasons/mx.csv +6 -0
  49. data/lib/fifadat/config/seasons/mx.cup.csv +3 -0
  50. data/lib/fifadat/config/seasons/nir.csv +6 -0
  51. data/lib/fifadat/config/seasons/nl.csv +7 -0
  52. data/lib/fifadat/config/seasons/no.csv +6 -0
  53. data/lib/fifadat/config/seasons/pl.csv +6 -0
  54. data/lib/fifadat/config/seasons/pt.csv +7 -0
  55. data/lib/fifadat/config/seasons/sa.csv +7 -0
  56. data/lib/fifadat/config/seasons/sco.csv +7 -0
  57. data/lib/fifadat/config/seasons/se.csv +7 -0
  58. data/lib/fifadat/config/seasons/tn.csv +6 -0
  59. data/lib/fifadat/config/seasons/tr.csv +7 -0
  60. data/lib/fifadat/config/seasons/uefa.cl.csv +7 -0
  61. data/lib/fifadat/config/seasons/uefa.con.csv +6 -0
  62. data/lib/fifadat/config/seasons/uefa.europa.csv +6 -0
  63. data/lib/fifadat/config/seasons/uy.csv +6 -0
  64. data/lib/fifadat/config/seasons/wal.csv +6 -0
  65. data/lib/fifadat/config/seasons/worldcup.csv +24 -0
  66. data/lib/fifadat/config/seasons/za.csv +6 -0
  67. data/lib/fifadat/errata.rb +59 -0
  68. data/lib/fifadat/helper.rb +46 -0
  69. data/lib/fifadat/json.rb +113 -0
  70. data/lib/fifadat/pp/build_match.rb +105 -0
  71. data/lib/fifadat/pp/build_report.rb +135 -0
  72. data/lib/fifadat/pp/convert-reports.rb +114 -0
  73. data/lib/fifadat/pp/convert.rb +163 -0
  74. data/lib/fifadat/pp/goals-calc_score.rb +58 -0
  75. data/lib/fifadat/pp/goals.rb +89 -0
  76. data/lib/fifadat/pp/helper-date.rb +13 -0
  77. data/lib/fifadat/pp/helper-minute.rb +81 -0
  78. data/lib/fifadat/pp/helper-score.rb +139 -0
  79. data/lib/fifadat/pp/norm.rb +34 -0
  80. data/lib/fifadat/pp/officials.rb +86 -0
  81. data/lib/fifadat/pp/penalties.rb +132 -0
  82. data/lib/fifadat/pp/players.rb +323 -0
  83. data/lib/fifadat/pp/stadiums.rb +99 -0
  84. data/lib/fifadat/pp/stages.rb +119 -0
  85. data/lib/fifadat/pp/substitutions.rb +444 -0
  86. data/lib/fifadat/pp/teams.rb +91 -0
  87. data/lib/fifadat/ppdebug.rb +128 -0
  88. data/lib/fifadat/ppmatch.rb +78 -0
  89. data/lib/fifadat/prepare.rb +117 -0
  90. data/lib/fifadat/tool.rb +184 -0
  91. data/lib/fifadat/types.rb +166 -0
  92. data/lib/fifadat.rb +54 -0
  93. metadata +215 -0
@@ -0,0 +1,444 @@
1
+ =begin
2
+ "Substitutions":
3
+ [{"IdEvent": null,
4
+ "Period": 5,
5
+ "Reason": 2,
6
+ "SubstitutePosition": 2,
7
+ "IdPlayerOff": "448148",
8
+ "IdPlayerOn": "395318",
9
+ "PlayerOffName":
10
+ [{"Locale": "en-GB", "Description": "Jeremie FRIMPONG"}],
11
+ "PlayerOnName": [{"Locale": "en-GB", "Description": "Wataru ENDO"}],
12
+ "Minute": "60'",
13
+ "IdTeam": "1896634"},
14
+
15
+ "Period"=>??,
16
+ "SubstitutePosition"=>2,
17
+ "IdPlayerOff"=>"403319",
18
+ "IdPlayerOn"=>"436537",
19
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"NASSER ALDAWSARI"}],
20
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"MUSAB ALJUWAYR"}],
21
+ "Minute"=>"", ## note - empty string!!
22
+ "IdTeam"=>"1943992"}
23
+ ---
24
+ "Period"=>17,
25
+ "SubstitutePosition"=>2,
26
+ "IdPlayerOff"=>"473062",
27
+ "IdPlayerOn"=>"418961",
28
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Emiliano MARTINEZ"}],
29
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Anibal MORENO"}],
30
+ "Minute"=>"", ## note - empty string!!
31
+ "IdTeam"=>"1884426"}
32
+ =end
33
+
34
+
35
+
36
+ def _build_sub_minute( h )
37
+
38
+ ## split into minute
39
+ ## and offset (stoppage/injury/added time)
40
+ ## e.g. 90'+11'
41
+
42
+ minute_str = h['Minute']
43
+
44
+ ##
45
+ ## check what is "Period"=>4
46
+ ## minute is "" empty!!
47
+
48
+ if minute_str.nil? || minute_str.empty?
49
+ if h['Period'] == 4 ## quick fix - use 46' half-time sub??
50
+ minute_str = "46'"
51
+ elsif h['Period'] == 8 ## quick fix - use 116' 1st half-time extra time?
52
+ minute_str = "116'"
53
+ elsif h['Period'] == 17 ## quick fix- what is period 17 beyond pens??
54
+ minute_str = "121'"
55
+ else
56
+ puts "!! minute in sub is nil or empty:"
57
+ pp h
58
+ exit 1
59
+ end
60
+ end
61
+
62
+ ## _fmt_minute( *_parse_minute( minute_str ))
63
+
64
+ minute, offset = _parse_minute( minute_str )
65
+
66
+ Minute.new( m: minute,
67
+ offset: offset,
68
+ period: h['Period'] )
69
+ end
70
+
71
+
72
+
73
+ def build_sub( h, players: )
74
+
75
+ minute = _build_sub_minute( h )
76
+
77
+ playerOff = players.find!( h['IdPlayerOff'] )
78
+ playerOn = players.find!( h['IdPlayerOn'] )
79
+
80
+ rec = { off: playerOff[ :name ],
81
+ on: playerOn[ :name ],
82
+ minute: minute
83
+ }
84
+
85
+ rec
86
+ end
87
+
88
+
89
+
90
+ def build_subs( recs, players: )
91
+ recs = recs.map { |h| build_sub( h, players: players ) }
92
+ recs
93
+ end
94
+
95
+
96
+ __END__
97
+
98
+ ! minute in sub is nil or empty:
99
+ {"IdEvent"=>nil,
100
+ "Period"=>4,
101
+ "Reason"=>0,
102
+ "SubstitutePosition"=>3,
103
+ "IdPlayerOff"=>"418747",
104
+ "IdPlayerOn"=>"411174",
105
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Tomas RODRIGUEZ"}],
106
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Jose FAJARDO"}],
107
+ "Minute"=>"",
108
+ "IdTeam"=>"43914"}
109
+
110
+ !! minute in sub is nil or empty:
111
+ {"IdEvent"=>nil,
112
+ "Period"=>4,
113
+ "Reason"=>0,
114
+ "SubstitutePosition"=>1,
115
+ "IdPlayerOff"=>"494351",
116
+ "IdPlayerOn"=>"511022",
117
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Jonas ADJETEY"}],
118
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Kojo Peprah OPPONG"}],
119
+ "Minute"=>"",
120
+ "IdTeam"=>"43860"}
121
+
122
+ !! minute in sub is nil or empty:
123
+ {"IdEvent"=>nil,
124
+ "Period"=>4,
125
+ "Reason"=>0,
126
+ "SubstitutePosition"=>2,
127
+ "IdPlayerOff"=>"441341",
128
+ "IdPlayerOn"=>"441342",
129
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Elisha OWUSU"}],
130
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Abdul FATAWU"}],
131
+ "Minute"=>"",
132
+ "IdTeam"=>"43860"}
133
+
134
+ !! minute in sub is nil or empty:
135
+ {"IdEvent"=>nil,
136
+ "Period"=>4,
137
+ "Reason"=>0,
138
+ "SubstitutePosition"=>2,
139
+ "IdPlayerOff"=>"395216",
140
+ "IdPlayerOn"=>"484141",
141
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"RUBEN NEVES"}],
142
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"JOAO NEVES"}],
143
+ "Minute"=>"",
144
+ "IdTeam"=>"43963"}
145
+
146
+ !! minute in sub is nil or empty:
147
+ {"IdEvent"=>nil,
148
+ "Period"=>4,
149
+ "Reason"=>0,
150
+ "SubstitutePosition"=>1,
151
+ "IdPlayerOff"=>"368649",
152
+ "IdPlayerOn"=>"403002",
153
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"JOAO CANCELO"}],
154
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"DIOGO DALOT"}],
155
+ "Minute"=>"",
156
+ "IdTeam"=>"43963"}
157
+
158
+ !! minute in sub is nil or empty:
159
+ {"IdEvent"=>nil,
160
+ "Period"=>4,
161
+ "Reason"=>0,
162
+ "SubstitutePosition"=>3,
163
+ "IdPlayerOff"=>"299200",
164
+ "IdPlayerOn"=>"401131",
165
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Marko ARNAUTOVIC"}],
166
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Michael Gregoritsch"}],
167
+ "Minute"=>"",
168
+ "IdTeam"=>"43934"}
169
+
170
+ !! minute in sub is nil or empty:
171
+ {"IdEvent"=>nil,
172
+ "Period"=>4,
173
+ "Reason"=>0,
174
+ "SubstitutePosition"=>2,
175
+ "IdPlayerOff"=>"463283",
176
+ "IdPlayerOn"=>"520036",
177
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Romano SCHMID"}],
178
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Paul WANNER"}],
179
+ "Minute"=>"",
180
+ "IdTeam"=>"43934"}
181
+
182
+ !! minute in sub is nil or empty:
183
+ {"IdEvent"=>nil,
184
+ "Period"=>4,
185
+ "Reason"=>0,
186
+ "SubstitutePosition"=>2,
187
+ "IdPlayerOff"=>"385531",
188
+ "IdPlayerOn"=>"385248",
189
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Xaver Schlager"}],
190
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Florian GRILLITSCH"}],
191
+ "Minute"=>"",
192
+ "IdTeam"=>"43934"}
193
+
194
+ !! minute in sub is nil or empty:
195
+ {"IdEvent"=>nil,
196
+ "Period"=>4,
197
+ "Reason"=>0,
198
+ "SubstitutePosition"=>3,
199
+ "IdPlayerOff"=>"511875",
200
+ "IdPlayerOn"=>"396950",
201
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"ODEH FAKHOURY"}],
202
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"MAHMOUD ALMARDI"}],
203
+ "Minute"=>"",
204
+ "IdTeam"=>"43820"}
205
+
206
+ !! minute in sub is nil or empty:
207
+ {"IdEvent"=>nil,
208
+ "Period"=>4,
209
+ "Reason"=>0,
210
+ "SubstitutePosition"=>3,
211
+ "IdPlayerOff"=>"498514",
212
+ "IdPlayerOn"=>"431211",
213
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"ALI AZAIZEH"}],
214
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"MOUSA ALTAMARI"}],
215
+ "Minute"=>"",
216
+ "IdTeam"=>"43820"}
217
+
218
+ !! minute in sub is nil or empty:
219
+ {"IdEvent"=>nil,
220
+ "Period"=>4,
221
+ "Reason"=>0,
222
+ "SubstitutePosition"=>3,
223
+ "IdPlayerOff"=>"486161",
224
+ "IdPlayerOn"=>"494248",
225
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Relebohile MOFOKENG"}],
226
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Thalente MBATHA"}],
227
+ "Minute"=>"",
228
+ "IdTeam"=>"43883"}
229
+
230
+ !! minute in sub is nil or empty:
231
+ {"IdEvent"=>nil,
232
+ "Period"=>4,
233
+ "Reason"=>0,
234
+ "SubstitutePosition"=>2,
235
+ "IdPlayerOff"=>"411726",
236
+ "IdPlayerOn"=>"463746",
237
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"LUCAS PAQUETA"}],
238
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"ENDRICK"}],
239
+ "Minute"=>"",
240
+ "IdTeam"=>"43924"}
241
+
242
+ !! minute in sub is nil or empty:
243
+ {"IdEvent"=>nil,
244
+ "Period"=>4,
245
+ "Reason"=>0,
246
+ "SubstitutePosition"=>2,
247
+ "IdPlayerOff"=>"492363",
248
+ "IdPlayerOn"=>"379953",
249
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Felix NMECHA"}],
250
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Leon GORETZKA"}],
251
+ "Minute"=>"",
252
+ "IdTeam"=>"43948"}
253
+
254
+ !! minute in sub is nil or empty:
255
+ {"IdEvent"=>nil,
256
+ "Period"=>17,
257
+ "Reason"=>0,
258
+ "SubstitutePosition"=>2,
259
+ "IdPlayerOff"=>"369761",
260
+ "IdPlayerOn"=>"486875",
261
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Miguel ALMIRON"}],
262
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Gustavo VELAZQUEZ"}],
263
+ "Minute"=>"",
264
+ "IdTeam"=>"43928"}
265
+
266
+ !! minute in sub is nil or empty:
267
+ {"IdEvent"=>nil,
268
+ "Period"=>4,
269
+ "Reason"=>0,
270
+ "SubstitutePosition"=>2,
271
+ "IdPlayerOff"=>"389784",
272
+ "IdPlayerOn"=>"463489",
273
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Alan FRANCO"}],
274
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Yaimar MEDINA"}],
275
+ "Minute"=>"",
276
+ "IdTeam"=>"43927"}
277
+
278
+ !! minute in sub is nil or empty:
279
+ {"IdEvent"=>nil,
280
+ "Period"=>4,
281
+ "Reason"=>0,
282
+ "SubstitutePosition"=>1,
283
+ "IdPlayerOff"=>"463465",
284
+ "IdPlayerOn"=>"402974",
285
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Joel ORDONEZ"}],
286
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Angelo PRECIADO"}],
287
+ "Minute"=>"",
288
+ "IdTeam"=>"43927"}
289
+
290
+ !! minute in sub is nil or empty:
291
+ {"IdEvent"=>nil,
292
+ "Period"=>4,
293
+ "Reason"=>0,
294
+ "SubstitutePosition"=>3,
295
+ "IdPlayerOff"=>"448362",
296
+ "IdPlayerOn"=>"358112",
297
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Charles DE KETELAERE"}],
298
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Romelu LUKAKU"}],
299
+ "Minute"=>"",
300
+ "IdTeam"=>"43935"}
301
+
302
+ !! minute in sub is nil or empty:
303
+ {"IdEvent"=>nil,
304
+ "Period"=>4,
305
+ "Reason"=>0,
306
+ "SubstitutePosition"=>2,
307
+ "IdPlayerOff"=>"385531",
308
+ "IdPlayerOn"=>"385248",
309
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Xaver Schlager"}],
310
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Florian GRILLITSCH"}],
311
+ "Minute"=>"",
312
+ "IdTeam"=>"43934"}
313
+
314
+ !! minute in sub is nil or empty:
315
+ {"IdEvent"=>nil,
316
+ "Period"=>4,
317
+ "Reason"=>0,
318
+ "SubstitutePosition"=>2,
319
+ "IdPlayerOff"=>"441088",
320
+ "IdPlayerOn"=>"463800",
321
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Nicolas SEIWALD"}],
322
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Carney CHUKWUEMEKA"}],
323
+ "Minute"=>"",
324
+ "IdTeam"=>"43934"}
325
+
326
+ !! minute in sub is nil or empty:
327
+ {"IdEvent"=>nil,
328
+ "Period"=>4,
329
+ "Reason"=>0,
330
+ "SubstitutePosition"=>3,
331
+ "IdPlayerOff"=>"430070",
332
+ "IdPlayerOn"=>"485068",
333
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Ante BUDIMIR"}],
334
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Igor MATANOVIC"}],
335
+ "Minute"=>"",
336
+ "IdTeam"=>"43938"}
337
+
338
+ !! minute in sub is nil or empty:
339
+ {"IdEvent"=>nil,
340
+ "Period"=>4,
341
+ "Reason"=>0,
342
+ "SubstitutePosition"=>1,
343
+ "IdPlayerOff"=>"423522",
344
+ "IdPlayerOn"=>"494411",
345
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Jordan BOS"}],
346
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Kai TREWIN"}],
347
+ "Minute"=>"",
348
+ "IdTeam"=>"43976"}
349
+
350
+ !! minute in sub is nil or empty:
351
+ {"IdEvent"=>nil,
352
+ "Period"=>17,
353
+ "Reason"=>0,
354
+ "SubstitutePosition"=>2,
355
+ "IdPlayerOff"=>"430452",
356
+ "IdPlayerOn"=>"406606",
357
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Connor METCALFE"}],
358
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Awer MABIL"}],
359
+ "Minute"=>"",
360
+ "IdTeam"=>"43976"}
361
+
362
+ !! minute in sub is nil or empty:
363
+ {"IdEvent"=>nil,
364
+ "Period"=>17,
365
+ "Reason"=>0,
366
+ "SubstitutePosition"=>2,
367
+ "IdPlayerOff"=>"430440",
368
+ "IdPlayerOn"=>"498421",
369
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Aiden ONEILL"}],
370
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Paul OKON-ENGSTLER"}],
371
+ "Minute"=>"",
372
+ "IdTeam"=>"43976"}
373
+
374
+ !! minute in sub is nil or empty:
375
+ {"IdEvent"=>nil,
376
+ "Period"=>8,
377
+ "Reason"=>0,
378
+ "SubstitutePosition"=>3,
379
+ "IdPlayerOff"=>"430476",
380
+ "IdPlayerOn"=>"495488",
381
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"OMAR MARMOUSH"}],
382
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"HAMZA ABDELKARIM"}],
383
+ "Minute"=>"",
384
+ "IdTeam"=>"43855"}
385
+
386
+ !! minute in sub is nil or empty:
387
+ {"IdEvent"=>nil,
388
+ "Period"=>4,
389
+ "Reason"=>0,
390
+ "SubstitutePosition"=>2,
391
+ "IdPlayerOff"=>"269058",
392
+ "IdPlayerOn"=>"473050",
393
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"James RODRIGUEZ"}],
394
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Richard RIOS"}],
395
+ "Minute"=>"",
396
+ "IdTeam"=>"43926"}
397
+
398
+ !! minute in sub is nil or empty:
399
+ {"IdEvent"=>nil,
400
+ "Period"=>4,
401
+ "Reason"=>0,
402
+ "SubstitutePosition"=>3,
403
+ "IdPlayerOff"=>"483448",
404
+ "IdPlayerOn"=>"494626",
405
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Antonio NUSA"}],
406
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Andreas SCHJELDERUP"}],
407
+ "Minute"=>"",
408
+ "IdTeam"=>"43961"}
409
+
410
+ !! minute in sub is nil or empty:
411
+ {"IdEvent"=>nil,
412
+ "Period"=>4,
413
+ "Reason"=>0,
414
+ "SubstitutePosition"=>3,
415
+ "IdPlayerOff"=>"398588",
416
+ "IdPlayerOn"=>"477470",
417
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Alexander SORLOTH"}],
418
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Oscar BOBB"}],
419
+ "Minute"=>"",
420
+ "IdTeam"=>"43961"}
421
+
422
+ !! minute in sub is nil or empty:
423
+ {"IdEvent"=>nil,
424
+ "Period"=>4,
425
+ "Reason"=>0,
426
+ "SubstitutePosition"=>1,
427
+ "IdPlayerOff"=>"395516",
428
+ "IdPlayerOn"=>"400634",
429
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Cesar MONTES"}],
430
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Edson ALVAREZ"}],
431
+ "Minute"=>"",
432
+ "IdTeam"=>"43911"}
433
+
434
+ !! minute in sub is nil or empty:
435
+ {"IdEvent"=>nil,
436
+ "Period"=>4,
437
+ "Reason"=>0,
438
+ "SubstitutePosition"=>1,
439
+ "IdPlayerOff"=>"406280",
440
+ "IdPlayerOn"=>"419068",
441
+ "PlayerOffName"=>[{"Locale"=>"en-GB", "Description"=>"Sergino DEST"}],
442
+ "PlayerOnName"=>[{"Locale"=>"en-GB", "Description"=>"Giovanni REYNA"}],
443
+ "Minute"=>"",
444
+ "IdTeam"=>"43921"}
@@ -0,0 +1,91 @@
1
+
2
+
3
+ def build_team( h )
4
+
5
+ if h
6
+ name = desc( h['TeamName'] )
7
+
8
+ ## name = norm_team( name )
9
+
10
+ rec = {
11
+ id: h['IdTeam'],
12
+ name: name,
13
+ code: h['Abbreviation'],
14
+ country: h['IdCountry'], ## change to cc (country code) - why? why not?
15
+ }
16
+
17
+ rec
18
+ else ## assume nil - dummy record
19
+ rec = {
20
+ id: '<nil>',
21
+ name: '?',
22
+ code: '?', ## use nil - why? why not?
23
+ country: '?' ## use nil - why? why not?
24
+ }
25
+ rec
26
+ end
27
+ end
28
+
29
+
30
+
31
+
32
+ class Teams
33
+ def initialize
34
+ @recs = {}
35
+ end
36
+
37
+ def add_matches( matches )
38
+ ## note - if team nil - will (auto-)add nil team (<nil>,?,?,?)
39
+ matches.each do |m|
40
+ _add( build_team( m['Home'] ) )
41
+ _add( build_team( m['Away'] ) )
42
+ end
43
+ end
44
+
45
+
46
+ =begin
47
+ !! ASSERT FAILED - team records NOT matching -
48
+ {:id=>"44129",
49
+ :name=>"Vasco da Gama",
50
+ :code=>"VDG",
51
+ :country=>"BRA",
52
+ :count=>7}
53
+ !=
54
+ {:id=>"44129",
55
+ :name=>"Vasco da Gama",
56
+ :code=>"VAS",
57
+ :country=>"BRA"}
58
+ =end
59
+
60
+
61
+ def _add( new_rec )
62
+ rec = @recs[ new_rec[:id] ]
63
+ if rec.nil?
64
+ rec = new_rec
65
+ rec[:count] = 1 ## add counter - why? why not?
66
+ @recs[ new_rec[:id]] = new_rec
67
+ else
68
+ rec[:count] += 1
69
+
70
+ ## assert attributes equal - why? why not?
71
+ ## note - ignore code for now
72
+ ## new_rec[:code] == rec[:code] &&
73
+ assert( new_rec[:name] == rec[:name] &&
74
+ new_rec[:country] == rec[:country],
75
+ "team records NOT matching - #{rec.pretty_inspect} != #{new_rec.pretty_inspect}")
76
+ end
77
+ end
78
+
79
+
80
+ def as_json( id: false )
81
+ ## note - always remove code for now
82
+ if id
83
+ @recs.values.map { |rec| rec.except(:code) }
84
+ else
85
+ @recs.values.map { |rec| rec.except(:code, :id ) }
86
+ end
87
+ end
88
+
89
+ def size() @recs.size; end
90
+
91
+ end # class Teams
@@ -0,0 +1,128 @@
1
+
2
+
3
+
4
+ def pp_debug( data )
5
+
6
+ errors = []
7
+
8
+
9
+ stats = {
10
+ ## match stats
11
+ 'MatchStatus' => Hash.new(0),
12
+ 'ResultType' => Hash.new(0),
13
+ 'TimeDefined' => Hash.new(0),
14
+ 'Leg' => Hash.new(0),
15
+ 'IsHomeMatch' => Hash.new(0),
16
+ 'MatchDay' => Hash.new(0),
17
+ 'MatchNumber' => Hash.new(0),
18
+ 'Attendance' => Hash.new(0),
19
+ 'Weather' => Hash.new(0),
20
+
21
+ ## add stage & group
22
+ ## add agg score and pen score!!
23
+
24
+ ## team stats
25
+ 'TeamType' => Hash.new(0),
26
+ 'AgeType' => Hash.new(0),
27
+ 'FootballType' => Hash.new(0),
28
+ }
29
+
30
+ matches = data['Results'] ## only use results (match) array
31
+
32
+ ## get SeasonName from first match
33
+ m = matches[0]
34
+ competitionName = desc( m['CompetitionName'])
35
+ seasonName = desc( m['SeasonName'])
36
+
37
+
38
+ ## pp data
39
+ puts " #{matches.size} match(es) in #{competitionName} / #{seasonName}"
40
+
41
+
42
+ buf = String.new
43
+
44
+ matches.each_with_index do |m, i|
45
+
46
+
47
+ ## todo -- log match details
48
+ ## if matchstatus not 0,1
49
+ ## or result type not 0,1,2,3,4,5 !!!
50
+
51
+
52
+ buf << "==> [#{i+1}/#{matches.size}] "
53
+ buf << pp_match(m)
54
+
55
+
56
+ idMatch = m['IdMatch']
57
+
58
+ matchStatus = m['MatchStatus']
59
+ resultType = m['ResultType']
60
+
61
+ ## add aggregate score too
62
+ score = [m['HomeTeamScore'], m['AwayTeamScore']].compact
63
+ penScore = [m['HomeTeamPenaltyScore'], m['AwayTeamPenaltyScore']].compact
64
+ aggScore = [m['AggregateHomeTeamScore'],m['AggregateAwayTeamScore']].compact
65
+
66
+
67
+ if resultType == 0 && !score.empty?
68
+ ## pachuca vs salzburg in cwc 2025??
69
+ ## double check if score present
70
+ ## raise ArgumentError,
71
+ ## " resultType == 0 but score present idMatch #{m['IdMatch']} #{m['HomeTeamScore']}-#{m['AwayTeamScore']}"
72
+
73
+ msg = " resultType == 0 but score present idMatch #{idMatch} #{score.inspect}"
74
+ errors << msg
75
+ end
76
+
77
+ if ![0,1,9].include?(matchStatus)
78
+ msg = "matchStatus 0-FIN,1-SCHED,9-AWD expected; got #{matchStatus} in: #{m.pretty_inspect}"
79
+ errors << msg
80
+ end
81
+
82
+ if ![0,1,2,3,4,5,8,12].include?(resultType)
83
+ msg = "resultType 0,1,2,3,4,5,8,12 expected; got #{resultType} in: #{m.pretty_inspect}"
84
+ errors << msg
85
+ end
86
+
87
+
88
+
89
+ ##
90
+ ## check usage
91
+ stats[ 'MatchStatus' ][m['MatchStatus']] +=1
92
+ stats[ 'ResultType'][m['ResultType']] +=1
93
+
94
+ stats[ 'TimeDefined'][m['TimeDefined']] +=1
95
+
96
+ stats[ 'Leg'][m['Leg']] +=1
97
+ stats[ 'IsHomeMatch'][m['IsHomeMatch']] +=1
98
+
99
+ stats[ 'MatchDay'][!m['MatchDay'].nil?] +=1
100
+ stats[ 'MatchNumber'][!m['MatchNumber'].nil?] +=1
101
+ stats[ 'Attendance'][!m['MatchDay'].nil?] +=1
102
+ stats[ 'Weather'][!m['Weather'].nil?] +=1
103
+
104
+ =begin
105
+ if m['Home']
106
+ stats[ 'TeamType'][m['Home']['TeamType']] +=1
107
+ stats[ 'AgeType'][m['Home']['AgeType']] +=1
108
+ stats[ 'FootballType'][m['Home']['FootballType']] +=1
109
+ end
110
+ if m['Away']
111
+ stats[ 'TeamType'][m['Away']['TeamType']] +=1
112
+ stats[ 'AgeType'][m['Away']['AgeType']] +=1
113
+ stats[ 'FootballType'][m['Away']['FootballType']] +=1
114
+ end
115
+ =end
116
+ end
117
+
118
+
119
+
120
+ ## note - move stats up-front into header
121
+ # header = String.new
122
+ # header << "stats:\n"
123
+ # header << stats.pretty_inspect
124
+ # header << "\n"
125
+
126
+
127
+ [buf, stats, errors]
128
+ end