sportdb-readers 2.0.0 → 2.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -1
- data/Manifest.txt +0 -1
- data/Rakefile +1 -2
- data/lib/sportdb/readers/match_reader.rb +66 -38
- data/lib/sportdb/readers/package.rb +3 -51
- data/lib/sportdb/readers/sync/match.rb +8 -2
- data/lib/sportdb/readers/version.rb +1 -2
- data/lib/sportdb/readers.rb +1 -21
- metadata +4 -19
- data/lib/sportdb/readers/conf_reader.rb +0 -99
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f272d4ffee7d8d56aa09bc05ec0280ab252ef793cc26090206e4dad41824cd43
|
4
|
+
data.tar.gz: 3343b9b089991220fa61584f166a229ce1bd35aad695a0aef76ac692fc62825e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 665bd28de289348d82f8bb3157e08601f20ebe35794c3e1694802fb77df34151bb15589a784c615c3c83fb3c1ad30a0e66f51a0c4a34a366dd666be3b1249d41
|
7
|
+
data.tar.gz: d330593cd5ae11a2a887ef365e69c3cd02486623e9a0fbca132466eef7408b65a455ab9ee1cad6f55f6f1d706c7f901f816f23bb01060fd28457ca6df5879092
|
data/CHANGELOG.md
CHANGED
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
###
|
2
|
+
# todo/fix:
|
3
|
+
# add optional stage to
|
4
|
+
# group, round to make uniquie
|
5
|
+
# same group or round name is different (record) if differant stage !!!!
|
6
|
+
|
1
7
|
|
2
8
|
module SportDb
|
3
9
|
class MatchReader ## todo/check: rename to MatchReaderV2 (use plural?) why? why not?
|
@@ -29,17 +35,43 @@ class MatchReader ## todo/check: rename to MatchReaderV2 (use plural?) why? w
|
|
29
35
|
@txt = txt
|
30
36
|
end
|
31
37
|
|
38
|
+
|
39
|
+
|
32
40
|
def parse( season: nil )
|
33
|
-
secs =
|
34
|
-
pp secs
|
41
|
+
secs = QuickLeagueOutlineReader.parse( @txt )
|
42
|
+
## pp secs
|
43
|
+
|
44
|
+
########
|
45
|
+
# step 1 - prepare secs
|
46
|
+
# -- filter seasons if filter present
|
47
|
+
secs = filter_secs( sec, season: season ) if season
|
48
|
+
|
49
|
+
## -- check & map; replace inline (string with data struct record)
|
50
|
+
secs.each do |sec|
|
51
|
+
sec[:season] = Season.parse( sec[:season ] )
|
52
|
+
sec[:league] = Import::League.find!( sec[:league] )
|
53
|
+
|
54
|
+
##
|
55
|
+
## quick hack - assume "Regular" or "Regular Season"
|
56
|
+
## as default stage (thus, no stage)
|
57
|
+
if sec[:stage]
|
58
|
+
sec[:stage] = nil if ['Regular',
|
59
|
+
'Regular Season',
|
60
|
+
'Regular Stage',
|
61
|
+
].include?( sec[:stage] )
|
62
|
+
end
|
63
|
+
end
|
35
64
|
|
65
|
+
|
66
|
+
###
|
67
|
+
# step 2 - handle secs
|
36
68
|
secs.each do |sec| ## sec(tion)s
|
37
69
|
season = sec[:season]
|
38
70
|
league = sec[:league]
|
39
71
|
stage = sec[:stage]
|
40
72
|
lines = sec[:lines]
|
41
73
|
|
42
|
-
### check if event info
|
74
|
+
### check if event info available - use start_date;
|
43
75
|
## otherwise we have to guess (use a "synthetic" start_date)
|
44
76
|
event_info = catalog.events.find_by( season: season,
|
45
77
|
league: league )
|
@@ -74,51 +106,18 @@ class MatchReader ## todo/check: rename to MatchReaderV2 (use plural?) why? w
|
|
74
106
|
pp groups
|
75
107
|
|
76
108
|
|
77
|
-
|
109
|
+
##################################
|
78
110
|
## step 1: map/find teams
|
79
111
|
|
80
112
|
## note: loop over keys (holding the names); values hold the usage counter!! e.g. 'Arsenal' => 2, etc.
|
81
|
-
mods = nil
|
82
|
-
if league.clubs? && league.intl? ## todo/fix: add intl? to ActiveRecord league!!!
|
83
|
-
|
84
|
-
## quick hack - use "dynamic" keys for keys
|
85
|
-
uefa_el_q = Import::League.match_by( code: 'uefa.el.quali' )[0]
|
86
|
-
uefa_cl_q = Import::League.match_by( code: 'uefa.cl.quali' )[0]
|
87
|
-
uefa_cl = Import::League.match_by( code: 'uefa.cl' )[0]
|
88
|
-
uefa_el = Import::League.match_by( code: 'uefa.el' )[0]
|
89
|
-
|
90
|
-
pp [uefa_el_q, uefa_cl_q, uefa_cl, uefa_el]
|
91
|
-
|
92
|
-
### quick hack mods for popular/known ambigious club names
|
93
|
-
## todo/fix: make more generic / reuseable!!!!
|
94
|
-
mods = {}
|
95
|
-
## europa league uses same mods as champions league
|
96
|
-
mods[ uefa_el_q.key ] =
|
97
|
-
mods[ uefa_cl_q.key ] =
|
98
|
-
mods[ uefa_el.key ] =
|
99
|
-
mods[ uefa_cl.key ] = catalog.clubs.build_mods(
|
100
|
-
{ 'Liverpool | Liverpool FC' => 'Liverpool FC, ENG',
|
101
|
-
'Arsenal | Arsenal FC' => 'Arsenal FC, ENG',
|
102
|
-
'Barcelona' => 'FC Barcelona, ESP',
|
103
|
-
'Valencia' => 'Valencia CF, ESP',
|
104
|
-
'Rangers FC' => 'Rangers FC, SCO',
|
105
|
-
})
|
106
|
-
end
|
107
|
-
|
108
113
|
# puts " [debug] auto_conf_teams:"
|
109
114
|
# pp auto_conf_teams
|
110
115
|
|
111
|
-
|
112
|
-
## todo/fix
|
113
|
-
## ** !!! ERROR - too many matches (2) for club >Barcelona<:
|
114
|
-
## [<Club: FC Barcelona (ESP)>, <Club: Barcelona Guayaquil (ECU)>]
|
115
|
-
|
116
116
|
puts "league:"
|
117
117
|
pp league
|
118
118
|
|
119
119
|
teams = catalog.teams.find_by!( name: auto_conf_teams,
|
120
|
-
league: league
|
121
|
-
mods: mods )
|
120
|
+
league: league )
|
122
121
|
|
123
122
|
puts " [debug] teams:"
|
124
123
|
pp teams
|
@@ -223,5 +222,34 @@ class MatchReader ## todo/check: rename to MatchReaderV2 (use plural?) why? w
|
|
223
222
|
end # method parse
|
224
223
|
|
225
224
|
|
225
|
+
|
226
|
+
|
227
|
+
|
228
|
+
#####
|
229
|
+
# filter by season helpers
|
230
|
+
def filter_secs( secs, season: )
|
231
|
+
filtered_secs = []
|
232
|
+
filter = norm_seasons( season )
|
233
|
+
secs.each do |sec|
|
234
|
+
if filter.include?( Season.parse( sec[:season] ).key )
|
235
|
+
filtered_secs << sec
|
236
|
+
else
|
237
|
+
puts " skipping season >#{sec[:season]}< NOT matched by filter"
|
238
|
+
end
|
239
|
+
end
|
240
|
+
filtered_secs
|
241
|
+
end
|
242
|
+
|
243
|
+
def norm_seasons( season_or_seasons ) ## todo/check: add alias norm_seasons - why? why not?
|
244
|
+
seasons = if season_or_seasons.is_a?( Array ) # is it an array already
|
245
|
+
season_or_seasons
|
246
|
+
elsif season_or_seasons.is_a?( Range ) # e.g. Season(1999)..Season(2001) or such
|
247
|
+
season_or_seasons.to_a
|
248
|
+
else ## assume - single entry - wrap in array
|
249
|
+
[season_or_seasons]
|
250
|
+
end
|
251
|
+
|
252
|
+
seasons.map { |season| Season( season ).key }
|
253
|
+
end
|
226
254
|
end # class MatchReader
|
227
255
|
end # module SportDb
|
@@ -3,33 +3,6 @@ module SportDb
|
|
3
3
|
class Package
|
4
4
|
|
5
5
|
## note: add readers here; for full class def see the sourcein sportdb-formats!!!
|
6
|
-
|
7
|
-
def read_leagues
|
8
|
-
each_leagues { |entry| SportDb.parse_leagues( entry.read ) }
|
9
|
-
end
|
10
|
-
|
11
|
-
def read_clubs
|
12
|
-
each_clubs { |entry| SportDb.parse_clubs( entry.read ) }
|
13
|
-
end
|
14
|
-
|
15
|
-
def read_club_props
|
16
|
-
each_club_props { |entry| SportDb.parse_club_props( entry.read ) }
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
def read_conf( *names, season: nil )
|
21
|
-
if names.empty? ## no (entry) names passed in; read in all
|
22
|
-
each_conf do |entry|
|
23
|
-
SportDb.parse_conf( entry.read, season: season )
|
24
|
-
end
|
25
|
-
else
|
26
|
-
names.each do |name|
|
27
|
-
entry = @pack.find( name )
|
28
|
-
SportDb.parse_conf( entry.read, season: season )
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
6
|
def read_match( *names, season: nil )
|
34
7
|
if names.empty? ## no (entry) names passed in; read in all
|
35
8
|
each_match do |entry|
|
@@ -43,29 +16,8 @@ module SportDb
|
|
43
16
|
end
|
44
17
|
end
|
45
18
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
read_leagues()
|
50
|
-
read_clubs()
|
51
|
-
read_club_props()
|
52
|
-
## note: skip conf(iguration)s for now!!!!!!!
|
53
|
-
## read_conf( season: season )
|
54
|
-
read_match( season: season )
|
55
|
-
else
|
56
|
-
names.each do |name|
|
57
|
-
entry = @pack.find( name )
|
58
|
-
## fix/todo: add read_leagues, read_clubs too!!!
|
59
|
-
if match_conf?( name ) ## check if datafile matches conf(iguration) naming (e.g. .conf.txt)
|
60
|
-
SportDb.parse_conf( entry.read, season: season )
|
61
|
-
elsif match_club_props?( name )
|
62
|
-
SportDb.parse_club_props( entry.read )
|
63
|
-
else ## assume "regular" match datafile or check pattern and report error on fail - why? why not?
|
64
|
-
SportDb.parse_match( entry.read, season: season )
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
19
|
+
## note: read is same as read_match for now!!!
|
20
|
+
## in the future add (again) more formats (see attic for history)
|
21
|
+
alias_method :read, :read_match
|
69
22
|
end # class Package
|
70
|
-
|
71
23
|
end # module SportDb
|
@@ -20,6 +20,8 @@ module Sync
|
|
20
20
|
## and lookup by name AND stage??
|
21
21
|
|
22
22
|
|
23
|
+
|
24
|
+
|
23
25
|
round_rec = if match.round
|
24
26
|
## query for round - allow string or round rec
|
25
27
|
round_name = match.round.is_a?( String ) ? match.round : match.round.name
|
@@ -57,8 +59,8 @@ module Sync
|
|
57
59
|
end
|
58
60
|
|
59
61
|
### todo/check: what happens if there's more than one match? exception raised??
|
60
|
-
rec = if ['N. N.'].include?( team1_name ) && ## some special cases - always assume new record for now (to avoid ambigious update conflict)
|
61
|
-
['N. N.'].include?( team2_name )
|
62
|
+
rec = if ['N. N.', 'N.N.'].include?( team1_name ) && ## some special cases - always assume new record for now (to avoid ambigious update conflict)
|
63
|
+
['N. N.', 'N.N.'].include?( team2_name )
|
62
64
|
## always assume new record for now
|
63
65
|
## check for date or such - why? why not?
|
64
66
|
nil
|
@@ -137,6 +139,10 @@ module Sync
|
|
137
139
|
else
|
138
140
|
# update - todo
|
139
141
|
puts "!! ERROR - match updates not yet supported (only inserts); sorry"
|
142
|
+
pp match
|
143
|
+
puts "---"
|
144
|
+
puts "found match record:"
|
145
|
+
pp rec
|
140
146
|
exit 1
|
141
147
|
end
|
142
148
|
rec
|
data/lib/sportdb/readers.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'sportdb/formats'
|
2
|
-
require 'sportdb/catalogs'
|
3
2
|
require 'sportdb/models'
|
4
3
|
|
5
4
|
|
@@ -17,7 +16,6 @@ require_relative 'readers/sync/more'
|
|
17
16
|
require_relative 'readers/sync/match' ## note - let match sync go last
|
18
17
|
|
19
18
|
## add readers & friends
|
20
|
-
require_relative 'readers/conf_reader'
|
21
19
|
require_relative 'readers/match_reader'
|
22
20
|
require_relative 'readers/package'
|
23
21
|
|
@@ -27,20 +25,10 @@ require_relative 'readers/package'
|
|
27
25
|
##
|
28
26
|
## add convenience shortcut helpers
|
29
27
|
module SportDb
|
30
|
-
def self.read_conf( path, season: nil ) ConfReader.read( path, season: season ); end
|
31
|
-
def self.parse_conf( txt, season: nil ) ConfReader.parse( txt, season: season ); end
|
32
|
-
|
33
28
|
### todo/check: add alias read_matches - why? why not?
|
34
29
|
def self.read_match( path, season: nil ) MatchReader.read( path, season: season ); end
|
35
30
|
def self.parse_match( txt, season: nil ) MatchReader.parse( txt, season: season ); end
|
36
31
|
|
37
|
-
def self.read_club_props( path ) Import::ClubPropsReader.read( path ); end
|
38
|
-
def self.parse_club_props( txt ) Import::ClubPropsReader.parse( txt ); end
|
39
|
-
|
40
|
-
def self.parse_leagues( txt ) recs = Import::LeagueReader.parse( txt ); Import.catalog.leagues.add( recs ); end
|
41
|
-
def self.parse_clubs( txt ) recs = Import::ClubReader.parse( txt ); Import.catalog.clubs.add( recs ); end
|
42
|
-
|
43
|
-
|
44
32
|
def self.read( path, season: nil )
|
45
33
|
pack = if File.directory?( path ) ## if directory assume "unzipped" package
|
46
34
|
DirPackage.new( path )
|
@@ -53,17 +41,9 @@ module SportDb
|
|
53
41
|
if pack
|
54
42
|
pack.read( season: season )
|
55
43
|
else
|
56
|
-
|
57
|
-
read_conf( path, season: season )
|
58
|
-
elsif Package.club_props?( path )
|
59
|
-
read_club_props( path )
|
60
|
-
else ## assume "regular" match datafile
|
61
|
-
read_match( path, season: season )
|
62
|
-
end
|
44
|
+
read_match( path, season: season )
|
63
45
|
end
|
64
46
|
end # method read
|
65
|
-
|
66
|
-
|
67
47
|
end # module SportDb
|
68
48
|
|
69
49
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sportdb-readers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sportdb-formats
|
@@ -16,28 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.0.
|
19
|
+
version: 2.0.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.0.
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: sportdb-catalogs
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.2.1
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 1.2.1
|
26
|
+
version: 2.0.1
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: sportdb-models
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -103,7 +89,6 @@ files:
|
|
103
89
|
- README.md
|
104
90
|
- Rakefile
|
105
91
|
- lib/sportdb/readers.rb
|
106
|
-
- lib/sportdb/readers/conf_reader.rb
|
107
92
|
- lib/sportdb/readers/match_reader.rb
|
108
93
|
- lib/sportdb/readers/package.rb
|
109
94
|
- lib/sportdb/readers/sync/club.rb
|
@@ -1,99 +0,0 @@
|
|
1
|
-
|
2
|
-
module SportDb
|
3
|
-
|
4
|
-
|
5
|
-
class ConfReader ## todo/check: rename to EventsReaderV2 (use plural?) why? why not?
|
6
|
-
|
7
|
-
def self.read( path, season: nil ) ## use - rename to read_file or from_file etc. - why? why not?
|
8
|
-
txt = File.open( path, 'r:utf-8' ) {|f| f.read }
|
9
|
-
parse( txt, season: season )
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.parse( txt, season: nil )
|
13
|
-
new( txt ).parse( season: season )
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
include Logging
|
18
|
-
|
19
|
-
def initialize( txt )
|
20
|
-
@txt = txt
|
21
|
-
end
|
22
|
-
|
23
|
-
def parse( season: nil )
|
24
|
-
secs = LeagueOutlineReader.parse( @txt, season: season )
|
25
|
-
pp secs
|
26
|
-
|
27
|
-
## pass 1 - check & map; replace inline (string with record)
|
28
|
-
secs.each do |sec| # sec(tion)s
|
29
|
-
|
30
|
-
conf = ConfParser.parse( sec[:lines] )
|
31
|
-
|
32
|
-
league = sec[:league]
|
33
|
-
teams = [] ## convert lines to teams
|
34
|
-
|
35
|
-
if league.clubs?
|
36
|
-
if league.intl?
|
37
|
-
conf.each do |name, rec|
|
38
|
-
country_key = rec[:country]
|
39
|
-
teams << catalog.clubs.find_by!( name: name,
|
40
|
-
country: country_key )
|
41
|
-
end
|
42
|
-
else
|
43
|
-
conf.each do |name, _|
|
44
|
-
## note: rank and standing gets ignored (not used) for now
|
45
|
-
teams << catalog.clubs.find_by!( name: name,
|
46
|
-
league: league )
|
47
|
-
end
|
48
|
-
end
|
49
|
-
else ### assume national teams
|
50
|
-
conf.each do |name, _|
|
51
|
-
## note: rank and standing gets ignored (not used) for now
|
52
|
-
teams << catalog.national_teams.find!( name )
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
sec[:teams] = teams
|
58
|
-
|
59
|
-
sec.delete( :lines ) ## remove lines entry
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
## pass 2 - import (insert/update) into db
|
64
|
-
secs.each do |sec| # sec(tion)s
|
65
|
-
## todo/fix: always return Season struct record in LeagueReader - why? why not?
|
66
|
-
event_rec = Sync::Event.find_or_create_by( league: sec[:league],
|
67
|
-
season: sec[:season] )
|
68
|
-
|
69
|
-
stage_rec = if sec[:stage]
|
70
|
-
Sync::Stage.find_or_create( sec[:stage], event: event_rec )
|
71
|
-
else
|
72
|
-
nil
|
73
|
-
end
|
74
|
-
|
75
|
-
## todo/fix: check if all teams are unique
|
76
|
-
## check if uniq works for club/national_team record (struct) - yes,no ??
|
77
|
-
teams = sec[:teams]
|
78
|
-
teams = teams.uniq
|
79
|
-
|
80
|
-
## add to database
|
81
|
-
team_recs = stage_rec ? stage_rec.teams : event_rec.teams
|
82
|
-
team_ids = stage_rec ? stage_rec.team_ids : event_rec.team_ids
|
83
|
-
|
84
|
-
new_team_recs = Sync::Team.find_or_create( teams )
|
85
|
-
new_team_recs.each do |team_rec|
|
86
|
-
## add teams to event
|
87
|
-
## for now check if team is alreay included
|
88
|
-
## todo/fix: clear/destroy_all first - why? why not!!!
|
89
|
-
team_recs << team_rec unless team_ids.include?( team_rec.id )
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
true ## todo/fix: return true/false or something
|
94
|
-
end # method read
|
95
|
-
|
96
|
-
def catalog() Import.catalog; end ## shortcut convenience helper
|
97
|
-
|
98
|
-
end # class ConfReader
|
99
|
-
end # module SportDb
|