sportdb-sync 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/Manifest.txt +9 -0
- data/README.md +28 -0
- data/Rakefile +31 -0
- data/lib/sportdb/sync.rb +18 -0
- data/lib/sportdb/sync/sync.rb +241 -0
- data/lib/sportdb/sync/version.rb +25 -0
- data/test/helper.rb +8 -0
- data/test/test_sync.rb +29 -0
- metadata +129 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 03f672e265c84d8bcac59a05381705e7b64acc69
|
4
|
+
data.tar.gz: 3fcdc3f0bbc5968e641fb0b873e473b10adbe94e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 98d27e26d97d13eab1fb49907e77bac2f326592451fedc7f839b26d0e96ba659fef61c44d1bd0bb5addccd79c948ef42b1926ea6091a06eaca42eaa01eca369b
|
7
|
+
data.tar.gz: 8913f9a0a783e93b43a2db943164812888e85c60675d9602b18d87745909905512bc8f0ac58264ce8789140e4ad00bf4aea6b90b2c0061468b5dc70aa5b75a4c
|
data/CHANGELOG.md
ADDED
data/Manifest.txt
ADDED
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# sportdb-sync - sport.db sync helpers for leagues, seasons, clubs, match schedules and results, and more
|
2
|
+
|
3
|
+
|
4
|
+
* home :: [github.com/sportdb/sport.db](https://github.com/sportdb/sport.db)
|
5
|
+
* bugs :: [github.com/sportdb/sport.db/issues](https://github.com/sportdb/sport.db/issues)
|
6
|
+
* gem :: [rubygems.org/gems/sportdb-sync](https://rubygems.org/gems/sportdb-sync)
|
7
|
+
* rdoc :: [rubydoc.info/gems/sportdb-sync](http://rubydoc.info/gems/sportdb-sync)
|
8
|
+
* forum :: [opensport](http://groups.google.com/group/opensport)
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
TBD
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
## License
|
19
|
+
|
20
|
+
The `sportdb-sync` scripts are dedicated to the public domain.
|
21
|
+
Use it as you please with no restrictions whatsoever.
|
22
|
+
|
23
|
+
|
24
|
+
## Questions? Comments?
|
25
|
+
|
26
|
+
Send them along to the
|
27
|
+
[Open Sports & Friends Forum/Mailing List](http://groups.google.com/group/opensport).
|
28
|
+
Thanks!
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'hoe'
|
2
|
+
require './lib/sportdb/sync/version.rb'
|
3
|
+
|
4
|
+
Hoe.spec 'sportdb-sync' do
|
5
|
+
|
6
|
+
self.version = SportDb::Sync::VERSION
|
7
|
+
|
8
|
+
self.summary = "sportdb-sync - sport.db sync helpers for leagues, seasons, clubs, match schedules and results, and more"
|
9
|
+
self.description = summary
|
10
|
+
|
11
|
+
self.urls = ['https://github.com/sportdb/sport.db']
|
12
|
+
|
13
|
+
self.author = 'Gerald Bauer'
|
14
|
+
self.email = 'opensport@googlegroups.com'
|
15
|
+
|
16
|
+
# switch extension to .markdown for gihub formatting
|
17
|
+
self.readme_file = 'README.md'
|
18
|
+
self.history_file = 'CHANGELOG.md'
|
19
|
+
|
20
|
+
self.licenses = ['Public Domain']
|
21
|
+
|
22
|
+
self.extra_deps = [
|
23
|
+
['sportdb-clubs', '>= 0.2.3'],
|
24
|
+
['sportdb-leagues', '>= 0.2.1'],
|
25
|
+
['sportdb-models', '>= 1.18.2'],
|
26
|
+
]
|
27
|
+
|
28
|
+
self.spec_extras = {
|
29
|
+
required_ruby_version: '>= 2.2.2'
|
30
|
+
}
|
31
|
+
end
|
data/lib/sportdb/sync.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
require 'sportdb/clubs'
|
5
|
+
require 'sportdb/leagues'
|
6
|
+
|
7
|
+
|
8
|
+
require 'sportdb/models' ## add sql database support
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
###
|
13
|
+
# our own code
|
14
|
+
require 'sportdb/sync/version' # let version always go first
|
15
|
+
require 'sportdb/sync/sync'
|
16
|
+
|
17
|
+
|
18
|
+
puts SportDb::Sync.banner # say hello
|
@@ -0,0 +1,241 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
module SportDb
|
5
|
+
|
6
|
+
module Sync
|
7
|
+
class Country
|
8
|
+
def self.find_or_create( country )
|
9
|
+
rec = WorldDb::Model::Country.find_by( key: country.key )
|
10
|
+
if rec.nil?
|
11
|
+
attribs = {
|
12
|
+
key: country.key,
|
13
|
+
name: country.name,
|
14
|
+
code: country.fifa, ## fix: uses fifa code now (should be iso-alpha3 if available)
|
15
|
+
fifa: country.fifa,
|
16
|
+
area: 1,
|
17
|
+
pop: 1
|
18
|
+
}
|
19
|
+
rec = WorldDb::Model::Country.create!( attribs )
|
20
|
+
end
|
21
|
+
rec
|
22
|
+
end
|
23
|
+
end # class Country
|
24
|
+
|
25
|
+
|
26
|
+
class League
|
27
|
+
def self.find( league )
|
28
|
+
SportDb::Model::League.find_by( key: league.key )
|
29
|
+
end
|
30
|
+
def self.find!( league )
|
31
|
+
rec = find( league )
|
32
|
+
if rec.nil?
|
33
|
+
puts "** !!!ERROR!!! db sync - no league match found for:"
|
34
|
+
pp league
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
rec
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.find_or_create( league )
|
41
|
+
rec = find( league )
|
42
|
+
if rec.nil?
|
43
|
+
## use title and not name - why? why not?
|
44
|
+
## quick fix: change name to title
|
45
|
+
attribs = { key: league.key,
|
46
|
+
title: league.name }
|
47
|
+
if league.country
|
48
|
+
attribs[ :country_id ] = Country.find_or_create( league.country ).id
|
49
|
+
end
|
50
|
+
|
51
|
+
rec = SportDb::Model::League.create!( attribs )
|
52
|
+
end
|
53
|
+
rec
|
54
|
+
end
|
55
|
+
end # class League
|
56
|
+
|
57
|
+
|
58
|
+
class Season
|
59
|
+
def self.normalize_key( key ) ## helper for season key (rename to norm_key ???)
|
60
|
+
## note: "normalize" season key
|
61
|
+
## always use 2017/18 (and not 2017-18 or 2017-2018 or 2017/2018)
|
62
|
+
## 1) change 2017-18 to 2017/18
|
63
|
+
key = key.tr( '-', '/' )
|
64
|
+
## 2) check for 2017/2018 - change to 2017/18
|
65
|
+
if key.length == 9
|
66
|
+
key = "#{key[0..3]}/#{key[7..8]}"
|
67
|
+
end
|
68
|
+
key
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.find( key )
|
72
|
+
key = normalize_key( key )
|
73
|
+
SportDb::Model::Season.find_by( key: key )
|
74
|
+
end
|
75
|
+
def self.find!( key )
|
76
|
+
rec = find( key )
|
77
|
+
if rec.nil?
|
78
|
+
puts "** !!!ERROR!!! db sync - no season match found for >#{normalize_key(key)}<:"
|
79
|
+
pp key
|
80
|
+
exit 1
|
81
|
+
end
|
82
|
+
rec
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.find_or_create( key ) ## e.g. key = '2017/18'
|
86
|
+
rec = find( key )
|
87
|
+
if rec.nil?
|
88
|
+
key = normalize_key( key ) ## note: do NOT forget to normalize key e.g. always use slash (2019/20) etc.
|
89
|
+
attribs = { key: key,
|
90
|
+
title: key }
|
91
|
+
rec = SportDb::Model::Season.create!( attribs )
|
92
|
+
end
|
93
|
+
rec
|
94
|
+
end
|
95
|
+
end # class Season
|
96
|
+
|
97
|
+
class Club
|
98
|
+
def self.find_or_create( club )
|
99
|
+
rec = SportDb::Model::Team.find_by( title: club.name )
|
100
|
+
if rec.nil?
|
101
|
+
## remove all non-ascii a-z chars
|
102
|
+
key = club.name.downcase.gsub( /[^a-z]/, '' )
|
103
|
+
puts "add club: #{key}, #{club.name}, #{club.country.name} (#{club.country.key})"
|
104
|
+
|
105
|
+
attribs = {
|
106
|
+
key: key,
|
107
|
+
title: club.name,
|
108
|
+
country_id: Country.find_or_create( club.country ).id,
|
109
|
+
club: true,
|
110
|
+
national: false ## check -is default anyway - use - why? why not?
|
111
|
+
## todo/fix: add city if present - why? why not?
|
112
|
+
}
|
113
|
+
if club.alt_names.empty? == false
|
114
|
+
attribs[:synonyms] = club.alt_names.join('|')
|
115
|
+
end
|
116
|
+
|
117
|
+
rec = SportDb::Model::Team.create!( attribs )
|
118
|
+
end
|
119
|
+
rec
|
120
|
+
end
|
121
|
+
end # class Club
|
122
|
+
|
123
|
+
class Event
|
124
|
+
def self.find( league:, season: )
|
125
|
+
SportDb::Model::Event.find_by( league_id: league.id, season_id: season.id )
|
126
|
+
end
|
127
|
+
def self.find!( league:, season: )
|
128
|
+
rec = find( league: league, season: season )
|
129
|
+
if rec.nil?
|
130
|
+
puts "** !!!ERROR!!! db sync - no event match found for:"
|
131
|
+
pp league
|
132
|
+
pp season
|
133
|
+
exit 1
|
134
|
+
end
|
135
|
+
rec
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.find_or_create( league:, season: )
|
139
|
+
rec = find( league: league, season: season )
|
140
|
+
if rec.nil?
|
141
|
+
## quick hack/change later !!
|
142
|
+
## todo/fix: check season - if is length 4 (single year) use 2017, 1, 1
|
143
|
+
## otherwise use 2017, 7, 1
|
144
|
+
## start_at use year and 7,1 e.g. Date.new( 2017, 7, 1 )
|
145
|
+
## hack: fix/todo1!!
|
146
|
+
## add "fake" start_at date for now
|
147
|
+
if season.key.size == '4' ## e.g. assume 2018 etc.
|
148
|
+
year = season.key.to_i
|
149
|
+
start_at = Date.new( year, 1, 1 )
|
150
|
+
else ## assume 2014/15 etc.
|
151
|
+
year = season.key[0..3].to_i
|
152
|
+
start_at = Date.new( year, 7, 1 )
|
153
|
+
end
|
154
|
+
|
155
|
+
attribs = {
|
156
|
+
league_id: league.id,
|
157
|
+
season_id: season.id,
|
158
|
+
start_at: start_at }
|
159
|
+
|
160
|
+
rec = SportDb::Model::Event.create!( attribs )
|
161
|
+
end
|
162
|
+
rec
|
163
|
+
end
|
164
|
+
end # class Event
|
165
|
+
|
166
|
+
class Round
|
167
|
+
def self.find_or_create( round, event: )
|
168
|
+
rec = SportDb::Model::Round.find_by( title: round.title, event_id: event.id )
|
169
|
+
if rec.nil?
|
170
|
+
attribs = { event_id: event.id,
|
171
|
+
title: round.title,
|
172
|
+
pos: round.pos,
|
173
|
+
start_at: event.start_at.to_date
|
174
|
+
}
|
175
|
+
rec = SportDb::Model::Round.create!( attribs )
|
176
|
+
end
|
177
|
+
rec
|
178
|
+
end
|
179
|
+
end # class Round
|
180
|
+
|
181
|
+
|
182
|
+
class Stage
|
183
|
+
def self.find( name, event: )
|
184
|
+
SportDb::Model::Stage.find_by( title: name, event_id: event.id )
|
185
|
+
end
|
186
|
+
def self.find!( name, event: )
|
187
|
+
rec = find( name, event: event )
|
188
|
+
if rec.nil?
|
189
|
+
puts "** !!!ERROR!!! db sync - no stage match found for:"
|
190
|
+
pp name
|
191
|
+
pp event
|
192
|
+
exit 1
|
193
|
+
end
|
194
|
+
rec
|
195
|
+
end
|
196
|
+
|
197
|
+
def self.find_or_create( name, event: )
|
198
|
+
rec = find( name, event: event )
|
199
|
+
if rec.nil?
|
200
|
+
## use title and not name - why? why not?
|
201
|
+
## quick fix: change name to title
|
202
|
+
attribs = { event_id: event.id,
|
203
|
+
title: name,
|
204
|
+
}
|
205
|
+
rec = SportDb::Model::Stage.create!( attribs )
|
206
|
+
end
|
207
|
+
rec
|
208
|
+
end
|
209
|
+
end # class Stage
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
class Match ## todo/check: add alias for Game class - why? why not?
|
214
|
+
def self.create_or_update( match, event: )
|
215
|
+
## note: MUST find round, thus, use bang (!)
|
216
|
+
round_rec = SportDb::Model::Round.find_by!( event_id: event.id,
|
217
|
+
title: match.round.title )
|
218
|
+
|
219
|
+
rec = SportDb::Model::Game.find_by( round_id: round_rec.id,
|
220
|
+
team1_id: match.team1.id,
|
221
|
+
team2_id: match.team2.id )
|
222
|
+
if rec.nil?
|
223
|
+
attribs = { round_id: round_rec.id,
|
224
|
+
team1_id: match.team1.id,
|
225
|
+
team2_id: match.team2.id,
|
226
|
+
pos: 999, ## make optional why? why not? - change to num?
|
227
|
+
play_at: match.date.to_date,
|
228
|
+
score1: match.score1,
|
229
|
+
score2: match.score2,
|
230
|
+
score1i: match.score1i,
|
231
|
+
score2i: match.score2i }
|
232
|
+
rec = SportDb::Model::Game.create!( attribs )
|
233
|
+
else
|
234
|
+
# update - todo
|
235
|
+
end
|
236
|
+
rec
|
237
|
+
end
|
238
|
+
end # class Match
|
239
|
+
|
240
|
+
end # module Sync
|
241
|
+
end # module SportDb
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
module SportDb
|
5
|
+
module Sync
|
6
|
+
|
7
|
+
MAJOR = 0 ## todo: namespace inside version or something - why? why not??
|
8
|
+
MINOR = 0
|
9
|
+
PATCH = 1
|
10
|
+
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
11
|
+
|
12
|
+
def self.version
|
13
|
+
VERSION
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.banner
|
17
|
+
"sportdb-sync/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.root
|
21
|
+
File.expand_path( File.dirname(File.dirname(File.dirname(File.dirname(__FILE__)))) )
|
22
|
+
end
|
23
|
+
|
24
|
+
end # module Sync
|
25
|
+
end # module SportDb
|
data/test/helper.rb
ADDED
data/test/test_sync.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_sync.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
class TestSync < MiniTest::Test
|
12
|
+
|
13
|
+
def test_sync
|
14
|
+
SportDb.connect( adapter: 'sqlite3', database: ':memory:' )
|
15
|
+
SportDb.create_all ## build schema
|
16
|
+
|
17
|
+
## turn on logging to console
|
18
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
19
|
+
|
20
|
+
at_rec = SportDb::Import::Country.new( 'at', 'Austria', fifa: 'AUT' )
|
21
|
+
eng_rec = SportDb::Import::Country.new( 'eng', 'England', fifa: 'ENG' )
|
22
|
+
|
23
|
+
at = SportDb::Sync::Country.find_or_create( at_rec )
|
24
|
+
at2 = SportDb::Sync::Country.find_or_create( at_rec )
|
25
|
+
|
26
|
+
eng = SportDb::Sync::Country.find_or_create( eng_rec )
|
27
|
+
eng2 = SportDb::Sync::Country.find_or_create( eng_rec )
|
28
|
+
end # method test_sync
|
29
|
+
end # class TestSync
|
metadata
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sportdb-sync
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gerald Bauer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-11-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sportdb-clubs
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.2.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.2.3
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sportdb-leagues
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.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: 0.2.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sportdb-models
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.18.2
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.18.2
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rdoc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '4.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '4.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: hoe
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.16'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.16'
|
83
|
+
description: sportdb-sync - sport.db sync helpers for leagues, seasons, clubs, match
|
84
|
+
schedules and results, and more
|
85
|
+
email: opensport@googlegroups.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files:
|
89
|
+
- CHANGELOG.md
|
90
|
+
- Manifest.txt
|
91
|
+
- README.md
|
92
|
+
files:
|
93
|
+
- CHANGELOG.md
|
94
|
+
- Manifest.txt
|
95
|
+
- README.md
|
96
|
+
- Rakefile
|
97
|
+
- lib/sportdb/sync.rb
|
98
|
+
- lib/sportdb/sync/sync.rb
|
99
|
+
- lib/sportdb/sync/version.rb
|
100
|
+
- test/helper.rb
|
101
|
+
- test/test_sync.rb
|
102
|
+
homepage: https://github.com/sportdb/sport.db
|
103
|
+
licenses:
|
104
|
+
- Public Domain
|
105
|
+
metadata: {}
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options:
|
108
|
+
- "--main"
|
109
|
+
- README.md
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 2.2.2
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
requirements: []
|
123
|
+
rubyforge_project:
|
124
|
+
rubygems_version: 2.5.2
|
125
|
+
signing_key:
|
126
|
+
specification_version: 4
|
127
|
+
summary: sportdb-sync - sport.db sync helpers for leagues, seasons, clubs, match schedules
|
128
|
+
and results, and more
|
129
|
+
test_files: []
|