sportdb-sync 1.0.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +3 -3
- data/lib/sportdb/sync.rb +1 -1
- data/lib/sportdb/sync/club.rb +4 -4
- data/lib/sportdb/sync/event.rb +2 -2
- data/lib/sportdb/sync/league.rb +1 -4
- data/lib/sportdb/sync/season.rb +1 -1
- data/lib/sportdb/sync/sync.rb +80 -29
- data/lib/sportdb/sync/version.rb +2 -2
- data/test/helper.rb +1 -1
- data/test/test_league.rb +6 -6
- data/test/test_misc.rb +3 -3
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d6f63ecc82fe0773b77ffac62a59b62a70ac018
|
4
|
+
data.tar.gz: cf11d7385ccde200b85638cd1de92b830ab2696c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7ed1a5553ff8d1a79dcbc56efbe9b681dd6aeaa20c18fb1e1a85541329163ef53afc2217609955e66e295155c58edb0e247308b93cfa15e143e86e3d7e5e700
|
7
|
+
data.tar.gz: e21fed2e8925f362b9c5b135db21f5d466e4758f04d8f591762db3e37ad4f55814c0337a7c256ec8c8c398dd7d767cb221a51f8c1dd71bb830c4b35999afc1a0
|
data/Rakefile
CHANGED
@@ -8,7 +8,7 @@ Hoe.spec 'sportdb-sync' do
|
|
8
8
|
self.summary = "sportdb-sync - sport.db sync helpers for leagues, seasons, clubs, match schedules and results, and more"
|
9
9
|
self.description = summary
|
10
10
|
|
11
|
-
self.urls =
|
11
|
+
self.urls = { home: 'https://github.com/sportdb/sport.db' }
|
12
12
|
|
13
13
|
self.author = 'Gerald Bauer'
|
14
14
|
self.email = 'opensport@googlegroups.com'
|
@@ -20,8 +20,8 @@ Hoe.spec 'sportdb-sync' do
|
|
20
20
|
self.licenses = ['Public Domain']
|
21
21
|
|
22
22
|
self.extra_deps = [
|
23
|
-
['sportdb-
|
24
|
-
['sportdb-models',
|
23
|
+
['sportdb-catalogs', '>= 1.0.0'],
|
24
|
+
['sportdb-models', '>= 2.0.2'],
|
25
25
|
]
|
26
26
|
|
27
27
|
self.spec_extras = {
|
data/lib/sportdb/sync.rb
CHANGED
data/lib/sportdb/sync/club.rb
CHANGED
@@ -50,8 +50,8 @@ module SportDb
|
|
50
50
|
# finders
|
51
51
|
|
52
52
|
def self.find_or_create( club )
|
53
|
-
## note: assume "canonical uniquie" names
|
54
|
-
rec = Model::Team.find_by(
|
53
|
+
## note: assume "canonical uniquie" names for now for clubs
|
54
|
+
rec = Model::Team.find_by( name: club.name )
|
55
55
|
if rec.nil?
|
56
56
|
|
57
57
|
## todo/fix: move auto-key gen to structs for re(use)!!!!!!
|
@@ -61,7 +61,7 @@ module SportDb
|
|
61
61
|
|
62
62
|
attribs = {
|
63
63
|
key: key,
|
64
|
-
|
64
|
+
name: club.name,
|
65
65
|
country_id: Sync::Country.find_or_create( club.country ).id,
|
66
66
|
club: true,
|
67
67
|
national: false ## check -is default anyway - use - why? why not?
|
@@ -71,7 +71,7 @@ module SportDb
|
|
71
71
|
attribs[:code] = club.code if club.code ## add code (abbreviation) if present
|
72
72
|
|
73
73
|
if club.alt_names.empty? == false
|
74
|
-
attribs[:
|
74
|
+
attribs[:alt_names] = club.alt_names.join('|')
|
75
75
|
end
|
76
76
|
|
77
77
|
rec = Model::Team.create!( attribs )
|
data/lib/sportdb/sync/event.rb
CHANGED
@@ -79,8 +79,8 @@ module SportDb
|
|
79
79
|
## otherwise use 2017, 7, 1
|
80
80
|
## start_at use year and 7,1 e.g. Date.new( 2017, 7, 1 )
|
81
81
|
## hack: fix/todo1!!
|
82
|
-
## add "fake"
|
83
|
-
attribs[:
|
82
|
+
## add "fake" start_date for now
|
83
|
+
attribs[:start_date] = if season.year? ## e.g. assume 2018 etc.
|
84
84
|
Date.new( season.start_year, 1, 1 )
|
85
85
|
else ## assume 2014/15 etc.
|
86
86
|
Date.new( season.start_year, 7, 1 )
|
data/lib/sportdb/sync/league.rb
CHANGED
@@ -40,11 +40,8 @@ module SportDb
|
|
40
40
|
def self.find_or_create( league )
|
41
41
|
rec = find( league )
|
42
42
|
if rec.nil?
|
43
|
-
## use title and not name - why? why not?
|
44
|
-
## quick fix: change name to title
|
45
|
-
|
46
43
|
attribs = { key: league.key,
|
47
|
-
|
44
|
+
name: league.name }
|
48
45
|
|
49
46
|
if league.country
|
50
47
|
attribs[ :country_id ] = Sync::Country.find_or_create( league.country ).id
|
data/lib/sportdb/sync/season.rb
CHANGED
data/lib/sportdb/sync/sync.rb
CHANGED
@@ -6,14 +6,14 @@ module SportDb
|
|
6
6
|
|
7
7
|
class NationalTeam
|
8
8
|
def self.find_or_create( team )
|
9
|
-
rec = Model::Team.find_by(
|
9
|
+
rec = Model::Team.find_by( name: team.name )
|
10
10
|
if rec.nil?
|
11
11
|
puts "add national team: #{team.key}, #{team.name}, #{team.country.name} (#{team.country.key})"
|
12
12
|
|
13
13
|
### note: key expected three or more lowercase letters a-z /\A[a-z]{3,}\z/
|
14
14
|
attribs = {
|
15
15
|
key: team.key, ## note: always use downcase fifa code for now!!!
|
16
|
-
|
16
|
+
name: team.name,
|
17
17
|
code: team.code,
|
18
18
|
country_id: Sync::Country.find_or_create( team.country ).id,
|
19
19
|
club: false,
|
@@ -21,7 +21,7 @@ module SportDb
|
|
21
21
|
}
|
22
22
|
|
23
23
|
if team.alt_names.empty? == false
|
24
|
-
attribs[:
|
24
|
+
attribs[:alt_names] = team.alt_names.join('|')
|
25
25
|
end
|
26
26
|
|
27
27
|
rec = Model::Team.create!( attribs )
|
@@ -64,19 +64,19 @@ module SportDb
|
|
64
64
|
|
65
65
|
class Round
|
66
66
|
def self.find_or_create( round, event: )
|
67
|
-
rec = Model::Round.find_by(
|
67
|
+
rec = Model::Round.find_by( name: round.name, event_id: event.id )
|
68
68
|
if rec.nil?
|
69
69
|
## find last pos - check if it can be nil?
|
70
70
|
max_pos = Model::Round.where( event_id: event.id ).maximum( 'pos' )
|
71
71
|
max_pos = max_pos ? max_pos+1 : 1
|
72
72
|
|
73
73
|
attribs = { event_id: event.id,
|
74
|
-
|
74
|
+
name: round.name,
|
75
75
|
pos: max_pos
|
76
76
|
}
|
77
77
|
|
78
78
|
## todo/fix: check if round has (optional) start or end date and add!!!
|
79
|
-
## attribs[ :
|
79
|
+
## attribs[ :start_date] = round.start_date.to_date
|
80
80
|
|
81
81
|
rec = Model::Round.create!( attribs )
|
82
82
|
end
|
@@ -87,14 +87,14 @@ module SportDb
|
|
87
87
|
|
88
88
|
class Group
|
89
89
|
def self.find_or_create( group, event: )
|
90
|
-
rec = Model::Group.find_by(
|
90
|
+
rec = Model::Group.find_by( name: group.name, event_id: event.id )
|
91
91
|
if rec.nil?
|
92
92
|
## find last pos - check if it can be nil?
|
93
93
|
max_pos = Model::Group.where( event_id: event.id ).maximum( 'pos' )
|
94
94
|
max_pos = max_pos ? max_pos+1 : 1
|
95
95
|
|
96
96
|
attribs = { event_id: event.id,
|
97
|
-
|
97
|
+
name: group.name,
|
98
98
|
pos: max_pos
|
99
99
|
}
|
100
100
|
|
@@ -109,7 +109,7 @@ module SportDb
|
|
109
109
|
|
110
110
|
class Stage
|
111
111
|
def self.find( name, event: )
|
112
|
-
Model::Stage.find_by(
|
112
|
+
Model::Stage.find_by( name: name, event_id: event.id )
|
113
113
|
end
|
114
114
|
def self.find!( name, event: )
|
115
115
|
rec = find( name, event: event )
|
@@ -125,10 +125,8 @@ module SportDb
|
|
125
125
|
def self.find_or_create( name, event: )
|
126
126
|
rec = find( name, event: event )
|
127
127
|
if rec.nil?
|
128
|
-
## use title and not name - why? why not?
|
129
|
-
## quick fix: change name to title
|
130
128
|
attribs = { event_id: event.id,
|
131
|
-
|
129
|
+
name: name,
|
132
130
|
}
|
133
131
|
rec = Model::Stage.create!( attribs )
|
134
132
|
end
|
@@ -138,21 +136,38 @@ module SportDb
|
|
138
136
|
|
139
137
|
|
140
138
|
|
141
|
-
class Match
|
139
|
+
class Match
|
140
|
+
### todo/fix: rename to create!! (add update support later) !!!!
|
141
|
+
## use update_by_round or update_by_date or update_by_teams or such
|
142
|
+
## NO easy (unique always auto-id match) possible!!!!!!
|
142
143
|
def self.create_or_update( match, event: )
|
143
144
|
## note: MUST find round, thus, use bang (!)
|
144
145
|
|
145
146
|
## todo/check: allow strings too - why? why not?
|
146
147
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
148
|
+
|
149
|
+
## todo/check:
|
150
|
+
## how to model "same" rounds in different stages
|
151
|
+
## e.g. Belgium
|
152
|
+
## in regular season (stage) - round 1, round 2, etc.
|
153
|
+
## in playoff (stage) - round 1, round 2, etc.
|
154
|
+
## reference same round or create a new one for each stage!!???
|
155
|
+
## and lookup by name AND stage??
|
156
|
+
|
157
|
+
|
158
|
+
round_rec = if match.round
|
159
|
+
## query for round - allow string or round rec
|
160
|
+
round_name = match.round.is_a?( String ) ? match.round : match.round.name
|
161
|
+
Model::Round.find_by!( event_id: event.id,
|
162
|
+
name: round_name )
|
163
|
+
else # note: allow matches WITHOUT rounds too (e.g. England Football League 1888 and others)
|
164
|
+
nil
|
165
|
+
end
|
151
166
|
|
152
167
|
## todo/check: allow fallback with db lookup if NOT found in cache - why? why not?
|
153
168
|
## or better use Sync::Team.find_or_create( team ) !!!!!!! to auto-create on first hit!
|
154
169
|
## || Team.find_or_create( team1 ) -- note: does NOT work for string (only recs) - what to do?
|
155
|
-
## || Model::Team.find_by!(
|
170
|
+
## || Model::Team.find_by!( name: team1_name )
|
156
171
|
team1_name = match.team1.is_a?( String ) ? match.team1 : match.team1.name
|
157
172
|
team1_rec = Team.cache[ team1_name ]
|
158
173
|
team2_name = match.team2.is_a?( String ) ? match.team2 : match.team2.name
|
@@ -160,37 +175,73 @@ module SportDb
|
|
160
175
|
|
161
176
|
## check optional group (e.g. Group A, etc.)
|
162
177
|
group_rec = if match.group
|
163
|
-
|
178
|
+
group_name = match.group.is_a?( String ) ? match.group : match.group.name
|
164
179
|
Model::Group.find_by!( event_id: event.id,
|
165
|
-
|
180
|
+
name: group_name )
|
166
181
|
else
|
167
182
|
nil
|
168
183
|
end
|
169
184
|
|
185
|
+
## check optional stage (e.g. Regular, Play Off, Relegation, etc. )
|
186
|
+
stage_rec = if match.stage
|
187
|
+
stage_name = match.stage.is_a?( String ) ? match.stage : match.stage.name
|
188
|
+
Model::Stage.find_by!( event_id: event.id,
|
189
|
+
name: stage_name )
|
190
|
+
else
|
191
|
+
nil
|
192
|
+
end
|
193
|
+
|
194
|
+
### todo/check: what happens if there's more than one match? exception raised??
|
195
|
+
rec = if ['N. N.'].include?( team1_name ) && ## some special cases - always assume new record for now (to avoid ambigious update conflict)
|
196
|
+
['N. N.'].include?( team2_name )
|
197
|
+
## always assume new record for now
|
198
|
+
## check for date or such - why? why not?
|
199
|
+
nil
|
200
|
+
elsif round_rec
|
201
|
+
## add match status too? allows [abandoned] and [replay] in same round
|
202
|
+
find_attributes = { round_id: round_rec.id,
|
203
|
+
team1_id: team1_rec.id,
|
204
|
+
team2_id: team2_rec.id }
|
205
|
+
|
206
|
+
## add stage if present to query
|
207
|
+
find_attributes[ :stage_id] = stage_rec.id if stage_rec
|
208
|
+
|
209
|
+
Model::Match.find_by( find_attributes )
|
210
|
+
else
|
211
|
+
## always assume new record for now
|
212
|
+
## check for date or such - why? why not?
|
213
|
+
nil
|
214
|
+
end
|
170
215
|
|
171
|
-
rec = Model::Game.find_by( round_id: round_rec.id,
|
172
|
-
team1_id: team1_rec.id,
|
173
|
-
team2_id: team2_rec.id )
|
174
216
|
if rec.nil?
|
175
|
-
## find last pos - check if it can be nil?
|
176
|
-
max_pos = Model::
|
217
|
+
## find last pos - check if it can be nil? yes, is nil if no records found
|
218
|
+
max_pos = Model::Match.where( event_id: event.id ).maximum( 'pos' )
|
177
219
|
max_pos = max_pos ? max_pos+1 : 1
|
178
220
|
|
179
221
|
attribs = { event_id: event.id, ## todo/fix: change to data struct too?
|
180
|
-
round_id: round_rec.id,
|
181
222
|
team1_id: team1_rec.id,
|
182
223
|
team2_id: team2_rec.id,
|
183
224
|
pos: max_pos,
|
184
|
-
|
225
|
+
date: match.date.to_date, ## todo/fix: split and add date & time!!!!
|
185
226
|
score1: match.score1,
|
186
227
|
score2: match.score2,
|
187
228
|
score1i: match.score1i,
|
188
|
-
score2i: match.score2i
|
229
|
+
score2i: match.score2i,
|
230
|
+
score1et: match.score1et,
|
231
|
+
score2et: match.score2et,
|
232
|
+
score1p: match.score1p,
|
233
|
+
score2p: match.score2p,
|
234
|
+
status: match.status }
|
235
|
+
|
236
|
+
attribs[ :round_id ] = round_rec.id if round_rec
|
189
237
|
attribs[ :group_id ] = group_rec.id if group_rec
|
238
|
+
attribs[ :stage_id ] = stage_rec.id if stage_rec
|
190
239
|
|
191
|
-
rec = Model::
|
240
|
+
rec = Model::Match.create!( attribs )
|
192
241
|
else
|
193
242
|
# update - todo
|
243
|
+
puts "!! ERROR - match updates not yet supported (only inserts); sorry"
|
244
|
+
exit 1
|
194
245
|
end
|
195
246
|
rec
|
196
247
|
end
|
data/lib/sportdb/sync/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
## note: use the local version of sportdb gems
|
2
2
|
$LOAD_PATH.unshift( File.expand_path( '../sportdb-formats/lib' ))
|
3
|
-
$LOAD_PATH.unshift( File.expand_path( '../sportdb-
|
3
|
+
$LOAD_PATH.unshift( File.expand_path( '../sportdb-catalogs/lib' ))
|
4
4
|
$LOAD_PATH.unshift( File.expand_path( '../sportdb-models/lib' ))
|
5
5
|
|
6
6
|
|
data/test/test_league.rb
CHANGED
@@ -14,25 +14,25 @@ class TestLeague < MiniTest::Test
|
|
14
14
|
|
15
15
|
def test_search
|
16
16
|
rec = League.search_or_create!( 'eng' )
|
17
|
-
assert_equal 'Premier League', rec.
|
17
|
+
assert_equal 'Premier League', rec.name
|
18
18
|
assert_equal 'eng.1', rec.key
|
19
19
|
assert_equal 'eng', rec.country.key
|
20
20
|
assert_equal 'England', rec.country.name
|
21
|
-
# assert_equal true, rec.
|
21
|
+
# assert_equal true, rec.clubs
|
22
22
|
|
23
23
|
rec = League.search!( 'eng' )
|
24
|
-
assert_equal 'Premier League', rec.
|
24
|
+
assert_equal 'Premier League', rec.name
|
25
25
|
assert_equal 'eng.1', rec.key
|
26
26
|
assert_equal 'eng', rec.country.key
|
27
27
|
assert_equal 'England', rec.country.name
|
28
|
-
## assert_equal true, rec.
|
28
|
+
## assert_equal true, rec.clubs
|
29
29
|
|
30
30
|
## try 2nd call (just lookup)
|
31
31
|
rec = League.search_or_create!( 'eng' )
|
32
|
-
assert_equal 'Premier League', rec.
|
32
|
+
assert_equal 'Premier League', rec.name
|
33
33
|
assert_equal 'eng.1', rec.key
|
34
34
|
assert_equal 'eng', rec.country.key
|
35
35
|
assert_equal 'England', rec.country.name
|
36
|
-
## assert_equal true, rec.
|
36
|
+
## assert_equal true, rec.clubs
|
37
37
|
end
|
38
38
|
end # class TestLeague
|
data/test/test_misc.rb
CHANGED
@@ -14,15 +14,15 @@ class TestMisc < MiniTest::Test
|
|
14
14
|
|
15
15
|
def test_season
|
16
16
|
rec = Season.search_or_create( '2017-18' )
|
17
|
-
assert_equal '2017/18', rec.
|
17
|
+
assert_equal '2017/18', rec.name
|
18
18
|
assert_equal '2017/18', rec.key
|
19
19
|
|
20
20
|
rec = Season.search_or_create( '2017/2018' )
|
21
|
-
assert_equal '2017/18', rec.
|
21
|
+
assert_equal '2017/18', rec.name
|
22
22
|
assert_equal '2017/18', rec.key
|
23
23
|
|
24
24
|
rec = Season.search_or_create( '2017/8' )
|
25
|
-
assert_equal '2017/18', rec.
|
25
|
+
assert_equal '2017/18', rec.name
|
26
26
|
assert_equal '2017/18', rec.key
|
27
27
|
end
|
28
28
|
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sportdb-sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: sportdb-
|
14
|
+
name: sportdb-catalogs
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.
|
19
|
+
version: 1.0.0
|
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: 1.0.
|
26
|
+
version: 1.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sportdb-models
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 2.0.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 2.0.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rdoc
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|