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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +4 -0
- data/Manifest.txt +91 -0
- data/README.md +24 -0
- data/Rakefile +32 -0
- data/bin/fifadat +14 -0
- data/lib/fifadat/api-config.rb +120 -0
- data/lib/fifadat/api.rb +110 -0
- data/lib/fifadat/config/codes_club-europe.csv +59 -0
- data/lib/fifadat/config/codes_club.csv +41 -0
- data/lib/fifadat/config/codes_nati.csv +6 -0
- data/lib/fifadat/config/seasons/ar.csv +7 -0
- data/lib/fifadat/config/seasons/at.csv +7 -0
- data/lib/fifadat/config/seasons/at.cup.csv +5 -0
- data/lib/fifadat/config/seasons/au.csv +7 -0
- data/lib/fifadat/config/seasons/be.csv +7 -0
- data/lib/fifadat/config/seasons/br.csv +6 -0
- data/lib/fifadat/config/seasons/ch.csv +7 -0
- data/lib/fifadat/config/seasons/clubworldcup.csv +2 -0
- data/lib/fifadat/config/seasons/cn.csv +7 -0
- data/lib/fifadat/config/seasons/co.csv +7 -0
- data/lib/fifadat/config/seasons/copa.l.csv +7 -0
- data/lib/fifadat/config/seasons/copa.s.csv +7 -0
- data/lib/fifadat/config/seasons/cz.csv +7 -0
- data/lib/fifadat/config/seasons/de.2.csv +6 -0
- data/lib/fifadat/config/seasons/de.csv +7 -0
- data/lib/fifadat/config/seasons/de.cup.csv +6 -0
- data/lib/fifadat/config/seasons/eg.csv +6 -0
- data/lib/fifadat/config/seasons/eng.2.csv +7 -0
- data/lib/fifadat/config/seasons/eng.csv +7 -0
- data/lib/fifadat/config/seasons/eng.facup.csv +6 -0
- data/lib/fifadat/config/seasons/es.csv +6 -0
- data/lib/fifadat/config/seasons/fr.csv +6 -0
- data/lib/fifadat/config/seasons/gr.csv +7 -0
- data/lib/fifadat/config/seasons/hu.csv +6 -0
- data/lib/fifadat/config/seasons/ie.csv +6 -0
- data/lib/fifadat/config/seasons/il.csv +6 -0
- data/lib/fifadat/config/seasons/interconticup.csv +24 -0
- data/lib/fifadat/config/seasons/is.csv +6 -0
- data/lib/fifadat/config/seasons/it.csv +7 -0
- data/lib/fifadat/config/seasons/it.cup.csv +5 -0
- data/lib/fifadat/config/seasons/jp.csv +7 -0
- data/lib/fifadat/config/seasons/kr.csv +7 -0
- data/lib/fifadat/config/seasons/lu.csv +3 -0
- data/lib/fifadat/config/seasons/ma.csv +3 -0
- data/lib/fifadat/config/seasons/mls.csv +6 -0
- data/lib/fifadat/config/seasons/mx.2.csv +5 -0
- data/lib/fifadat/config/seasons/mx.csv +6 -0
- data/lib/fifadat/config/seasons/mx.cup.csv +3 -0
- data/lib/fifadat/config/seasons/nir.csv +6 -0
- data/lib/fifadat/config/seasons/nl.csv +7 -0
- data/lib/fifadat/config/seasons/no.csv +6 -0
- data/lib/fifadat/config/seasons/pl.csv +6 -0
- data/lib/fifadat/config/seasons/pt.csv +7 -0
- data/lib/fifadat/config/seasons/sa.csv +7 -0
- data/lib/fifadat/config/seasons/sco.csv +7 -0
- data/lib/fifadat/config/seasons/se.csv +7 -0
- data/lib/fifadat/config/seasons/tn.csv +6 -0
- data/lib/fifadat/config/seasons/tr.csv +7 -0
- data/lib/fifadat/config/seasons/uefa.cl.csv +7 -0
- data/lib/fifadat/config/seasons/uefa.con.csv +6 -0
- data/lib/fifadat/config/seasons/uefa.europa.csv +6 -0
- data/lib/fifadat/config/seasons/uy.csv +6 -0
- data/lib/fifadat/config/seasons/wal.csv +6 -0
- data/lib/fifadat/config/seasons/worldcup.csv +24 -0
- data/lib/fifadat/config/seasons/za.csv +6 -0
- data/lib/fifadat/errata.rb +59 -0
- data/lib/fifadat/helper.rb +46 -0
- data/lib/fifadat/json.rb +113 -0
- data/lib/fifadat/pp/build_match.rb +105 -0
- data/lib/fifadat/pp/build_report.rb +135 -0
- data/lib/fifadat/pp/convert-reports.rb +114 -0
- data/lib/fifadat/pp/convert.rb +163 -0
- data/lib/fifadat/pp/goals-calc_score.rb +58 -0
- data/lib/fifadat/pp/goals.rb +89 -0
- data/lib/fifadat/pp/helper-date.rb +13 -0
- data/lib/fifadat/pp/helper-minute.rb +81 -0
- data/lib/fifadat/pp/helper-score.rb +139 -0
- data/lib/fifadat/pp/norm.rb +34 -0
- data/lib/fifadat/pp/officials.rb +86 -0
- data/lib/fifadat/pp/penalties.rb +132 -0
- data/lib/fifadat/pp/players.rb +323 -0
- data/lib/fifadat/pp/stadiums.rb +99 -0
- data/lib/fifadat/pp/stages.rb +119 -0
- data/lib/fifadat/pp/substitutions.rb +444 -0
- data/lib/fifadat/pp/teams.rb +91 -0
- data/lib/fifadat/ppdebug.rb +128 -0
- data/lib/fifadat/ppmatch.rb +78 -0
- data/lib/fifadat/prepare.rb +117 -0
- data/lib/fifadat/tool.rb +184 -0
- data/lib/fifadat/types.rb +166 -0
- data/lib/fifadat.rb +54 -0
- 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
|