sportdb 1.8.1 → 1.8.2
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.
- data/Manifest.txt +2 -0
- data/lib/sportdb.rb +3 -0
- data/lib/sportdb/deleter.rb +3 -0
- data/lib/sportdb/models/event.rb +8 -4
- data/lib/sportdb/models/event_ground.rb +12 -0
- data/lib/sportdb/models/forward.rb +2 -0
- data/lib/sportdb/models/game.rb +6 -2
- data/lib/sportdb/models/ground.rb +91 -0
- data/lib/sportdb/models/world/city.rb +3 -1
- data/lib/sportdb/models/world/continent.rb +1 -0
- data/lib/sportdb/models/world/country.rb +1 -0
- data/lib/sportdb/models/world/region.rb +2 -1
- data/lib/sportdb/reader.rb +43 -4
- data/lib/sportdb/schema.rb +104 -68
- data/lib/sportdb/stats.rb +2 -0
- data/lib/sportdb/utils.rb +11 -0
- data/lib/sportdb/version.rb +1 -1
- metadata +14 -12
data/Manifest.txt
CHANGED
|
@@ -19,10 +19,12 @@ lib/sportdb/deleter.rb
|
|
|
19
19
|
lib/sportdb/lang.rb
|
|
20
20
|
lib/sportdb/models/badge.rb
|
|
21
21
|
lib/sportdb/models/event.rb
|
|
22
|
+
lib/sportdb/models/event_ground.rb
|
|
22
23
|
lib/sportdb/models/event_team.rb
|
|
23
24
|
lib/sportdb/models/forward.rb
|
|
24
25
|
lib/sportdb/models/game.rb
|
|
25
26
|
lib/sportdb/models/goal.rb
|
|
27
|
+
lib/sportdb/models/ground.rb
|
|
26
28
|
lib/sportdb/models/group.rb
|
|
27
29
|
lib/sportdb/models/group_team.rb
|
|
28
30
|
lib/sportdb/models/league.rb
|
data/lib/sportdb.rb
CHANGED
|
@@ -37,9 +37,11 @@ require 'sportdb/models/world/continent'
|
|
|
37
37
|
require 'sportdb/models/world/region'
|
|
38
38
|
require 'sportdb/models/badge'
|
|
39
39
|
require 'sportdb/models/event'
|
|
40
|
+
require 'sportdb/models/event_ground'
|
|
40
41
|
require 'sportdb/models/event_team'
|
|
41
42
|
require 'sportdb/models/game'
|
|
42
43
|
require 'sportdb/models/goal'
|
|
44
|
+
require 'sportdb/models/ground'
|
|
43
45
|
require 'sportdb/models/group'
|
|
44
46
|
require 'sportdb/models/group_team'
|
|
45
47
|
require 'sportdb/models/league'
|
|
@@ -52,6 +54,7 @@ require 'sportdb/models/run'
|
|
|
52
54
|
require 'sportdb/models/season'
|
|
53
55
|
require 'sportdb/models/team'
|
|
54
56
|
require 'sportdb/models/track'
|
|
57
|
+
|
|
55
58
|
require 'sportdb/models/utils' # e.g. GameCursor
|
|
56
59
|
|
|
57
60
|
## add backwards compatible namespace (delete later!)
|
data/lib/sportdb/deleter.rb
CHANGED
|
@@ -16,6 +16,7 @@ module SportDb
|
|
|
16
16
|
Game.delete_all
|
|
17
17
|
Event.delete_all
|
|
18
18
|
EventTeam.delete_all
|
|
19
|
+
EventGround.delete_all
|
|
19
20
|
Group.delete_all
|
|
20
21
|
GroupTeam.delete_all
|
|
21
22
|
Round.delete_all
|
|
@@ -31,6 +32,8 @@ module SportDb
|
|
|
31
32
|
|
|
32
33
|
League.delete_all
|
|
33
34
|
Season.delete_all
|
|
35
|
+
|
|
36
|
+
Ground.delete_all # stadiums
|
|
34
37
|
end
|
|
35
38
|
|
|
36
39
|
end # class Deleter
|
data/lib/sportdb/models/event.rb
CHANGED
|
@@ -6,15 +6,19 @@ class Event < ActiveRecord::Base
|
|
|
6
6
|
|
|
7
7
|
belongs_to :league
|
|
8
8
|
belongs_to :season
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
has_many :rounds, :order => 'pos' # all (fix and flex) rounds
|
|
11
11
|
has_many :games, :through => :rounds
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
has_many :groups, :order => 'pos'
|
|
14
|
-
|
|
15
|
-
has_many :event_teams,
|
|
14
|
+
|
|
15
|
+
has_many :event_teams, :class_name => 'EventTeam'
|
|
16
16
|
has_many :teams, :through => :event_teams
|
|
17
17
|
|
|
18
|
+
has_many :event_grounds, :class_name => 'EventGround'
|
|
19
|
+
has_many :grounds, :through => :event_grounds
|
|
20
|
+
|
|
21
|
+
|
|
18
22
|
before_save :on_before_save
|
|
19
23
|
|
|
20
24
|
def add_teams_from_ary!( team_keys )
|
|
@@ -17,6 +17,7 @@ module SportDb::Model
|
|
|
17
17
|
|
|
18
18
|
class Team < ActiveRecord::Base ; end
|
|
19
19
|
class League < ActiveRecord::Base ; end
|
|
20
|
+
class Ground < ActiveRecord::Base ; end
|
|
20
21
|
|
|
21
22
|
end
|
|
22
23
|
|
|
@@ -28,5 +29,6 @@ module WorldDb::Model
|
|
|
28
29
|
# - just include once in loader??
|
|
29
30
|
Team = SportDb::Model::Team
|
|
30
31
|
League = SportDb::Model::League
|
|
32
|
+
Ground = SportDb::Model::Ground
|
|
31
33
|
|
|
32
34
|
end
|
data/lib/sportdb/models/game.rb
CHANGED
|
@@ -3,14 +3,18 @@ module SportDb::Model
|
|
|
3
3
|
|
|
4
4
|
class Game < ActiveRecord::Base
|
|
5
5
|
|
|
6
|
-
belongs_to :team1, :
|
|
7
|
-
belongs_to :team2, :
|
|
6
|
+
belongs_to :team1, class_name: 'Team', foreign_key: 'team1_id'
|
|
7
|
+
belongs_to :team2, class_name: 'Team', foreign_key: 'team2_id'
|
|
8
8
|
|
|
9
9
|
belongs_to :round
|
|
10
10
|
belongs_to :group # group is optional
|
|
11
11
|
|
|
12
|
+
belongs_to :ground # ground is optional
|
|
13
|
+
belongs_to :city, class_name: 'WorldDb::Model::City', foreign_key: 'city_id' # city is optioanl (remove?? redundant?? use ground ??)
|
|
14
|
+
|
|
12
15
|
has_many :goals
|
|
13
16
|
|
|
17
|
+
|
|
14
18
|
before_save :calc_winner
|
|
15
19
|
|
|
16
20
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module SportDb::Model
|
|
2
|
+
|
|
3
|
+
class Ground < ActiveRecord::Base
|
|
4
|
+
|
|
5
|
+
belongs_to :country, class_name: 'WorldDb::Model::Country', foreign_key: 'country_id'
|
|
6
|
+
belongs_to :city, class_name: 'WorldDb::Model::City', foreign_key: 'city_id'
|
|
7
|
+
|
|
8
|
+
has_many :games
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def self.create_or_update_from_values( new_attributes, values )
|
|
12
|
+
|
|
13
|
+
## fix: add/configure logger for ActiveRecord!!!
|
|
14
|
+
logger = LogKernel::Logger.root
|
|
15
|
+
|
|
16
|
+
## check optional values
|
|
17
|
+
logger.debug " [Ground] values >#{values.join('<>')}<"
|
|
18
|
+
|
|
19
|
+
city_title = ''
|
|
20
|
+
|
|
21
|
+
values.each_with_index do |value, index|
|
|
22
|
+
if value =~ /^[12][0-9]{3}$/ ## assume founding year
|
|
23
|
+
# skip founding/opening year fow now
|
|
24
|
+
logger.info " found year #{value}; skipping for now"
|
|
25
|
+
elsif value =~ /^[1-9][0-9_]+[0-9]$/ # number; assume capacity e.g. 12_541 or similar
|
|
26
|
+
# todo/fix: check how to differentiate between founding year and capacity if capcity islike year
|
|
27
|
+
# - by position ?? year is first entry, capacity is second ??? -add/fix
|
|
28
|
+
|
|
29
|
+
# skip capacity
|
|
30
|
+
logger.info " found capacity #{value}; skipping for now"
|
|
31
|
+
elsif value =~ /^[A-Z]{1,3}$/ # assume; state/region code e-g B | TX etc.
|
|
32
|
+
# skip region/state code
|
|
33
|
+
logger.info " found region/state code #{value}; skipping for now"
|
|
34
|
+
elsif value =~ /\/{2}/ # assume it's an address line e.g. xx // xx
|
|
35
|
+
logger.info " found address line #{value}; skipping for now"
|
|
36
|
+
elsif value =~ /^clubs:/ # assume it's clubs line e.g. clubs: Santos
|
|
37
|
+
logger.info " found clubs line #{value}; skipping for now"
|
|
38
|
+
elsif value =~ /^(?:[a-z]{2}\.)?wikipedia:/ # assume it's wikipedia e.g. [es.]wikipedia:
|
|
39
|
+
logger.info " found wikipedia line #{value}; skipping for now"
|
|
40
|
+
else
|
|
41
|
+
logger.info " found city >#{value}< for ground >#{new_attributes[ :key ]}<"
|
|
42
|
+
|
|
43
|
+
city_title = value.dup # remember for auto-add city
|
|
44
|
+
|
|
45
|
+
## todo: assume title2 ??
|
|
46
|
+
## assume title2 if title2 is empty (not already in use)
|
|
47
|
+
## and if it title2 contains at least two letter e.g. [a-zA-Z].*[a-zA-Z]
|
|
48
|
+
# issue warning: unknown type for value
|
|
49
|
+
# logger.warn "unknown type for value >#{value}< - key #{new_attributes[:key]}"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
logger.debug " find ground key: #{new_attributes[ :key ]}"
|
|
54
|
+
|
|
55
|
+
rec = Ground.find_by_key( new_attributes[ :key ] )
|
|
56
|
+
if rec.present?
|
|
57
|
+
logger.debug "update Ground #{rec.id}-#{rec.key}:"
|
|
58
|
+
else
|
|
59
|
+
logger.debug "create Ground:"
|
|
60
|
+
rec = Ground.new
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
logger.debug new_attributes.to_json
|
|
64
|
+
|
|
65
|
+
rec.update_attributes!( new_attributes )
|
|
66
|
+
|
|
67
|
+
#### try to auto-add city
|
|
68
|
+
|
|
69
|
+
if city_title.present?
|
|
70
|
+
city_values = [city_title]
|
|
71
|
+
city_attributes = {
|
|
72
|
+
country_id: rec.country_id,
|
|
73
|
+
# region_id: rec.region_id ### todo/fix: add region if present
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# todo: add convenience helper create_or_update_from_title
|
|
77
|
+
city = City.create_or_update_from_values( city_values, city_attributes )
|
|
78
|
+
|
|
79
|
+
### fix/todo: set new autoadd flag too?
|
|
80
|
+
## e.g. check if updated? e.g. timestamp created <> updated otherwise assume created?
|
|
81
|
+
|
|
82
|
+
## now at last add city_id to brewery!
|
|
83
|
+
rec.city_id = city.id
|
|
84
|
+
rec.save!
|
|
85
|
+
end
|
|
86
|
+
end # create_or_update_from_values
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
end # class Ground
|
|
90
|
+
|
|
91
|
+
end # module SportDb::Model
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
module WorldDb::Model
|
|
6
6
|
|
|
7
7
|
class City
|
|
8
|
-
has_many :teams,
|
|
8
|
+
has_many :teams, class_name: 'SportDb::Model::Team', foreign_key: 'city_id'
|
|
9
|
+
has_many :grounds, class_name: 'SportDb::Model::Ground', foreign_key: 'city_id'
|
|
10
|
+
has_many :games, :through => :grounds
|
|
9
11
|
end
|
|
10
12
|
|
|
11
13
|
end # module WorldDb::Model
|
|
@@ -7,6 +7,7 @@ module WorldDb::Model
|
|
|
7
7
|
class Country
|
|
8
8
|
has_many :teams, class_name: 'SportDb::Model::Team', foreign_key: 'country_id'
|
|
9
9
|
has_many :leagues, class_name: 'SportDb::Model::League', foreign_key: 'country_id'
|
|
10
|
+
has_many :grounds, class_name: 'SportDb::Model::Ground', foreign_key: 'country_id'
|
|
10
11
|
end # class Country
|
|
11
12
|
|
|
12
13
|
end # module WorldDb::Model
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
module WorldDb::Model
|
|
6
6
|
|
|
7
7
|
class Region
|
|
8
|
-
has_many :teams,
|
|
8
|
+
has_many :teams, class_name: 'SportDb::Model::Team', :through => :cities
|
|
9
|
+
has_many :grounds, class_name: 'SportDb::Model::Ground', :through => :cities
|
|
9
10
|
end # class Region
|
|
10
11
|
|
|
11
12
|
end # module WorldDb::Model
|
data/lib/sportdb/reader.rb
CHANGED
|
@@ -22,6 +22,10 @@ module Matcher
|
|
|
22
22
|
match_xxx_for_country( name, 'skiers', &blk )
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
+
def match_stadiums_for_country( name, &blk )
|
|
26
|
+
match_xxx_for_country( name, 'stadiums', &blk )
|
|
27
|
+
end
|
|
28
|
+
|
|
25
29
|
end # module Matcher
|
|
26
30
|
|
|
27
31
|
|
|
@@ -92,6 +96,10 @@ class Reader
|
|
|
92
96
|
load_records( name, race_id: race.id ) # e.g. 2013/04-gp-monaco.txt in formula1.db
|
|
93
97
|
elsif name =~ /(?:^|\/)seasons/ # NB: ^seasons or also possible at-austria!/seasons
|
|
94
98
|
load_seasons( name )
|
|
99
|
+
elsif match_stadiums_for_country( name ) do |country_key|
|
|
100
|
+
country = Country.find_by_key!( country_key )
|
|
101
|
+
load_stadiums( name, country_id: country.id )
|
|
102
|
+
end
|
|
95
103
|
elsif match_leagues_for_country( name ) do |country_key| # name =~ /^([a-z]{2})\/leagues/
|
|
96
104
|
# auto-add country code (from folder structure) for country-specific leagues
|
|
97
105
|
# e.g. at/leagues
|
|
@@ -137,6 +145,15 @@ class Reader
|
|
|
137
145
|
end
|
|
138
146
|
end # method load
|
|
139
147
|
|
|
148
|
+
|
|
149
|
+
def load_stadiums( name, more_attribs={} )
|
|
150
|
+
reader = ValuesReaderV2.new( name, include_path, more_attribs )
|
|
151
|
+
|
|
152
|
+
reader.each_line do |new_attributes, values|
|
|
153
|
+
Ground.create_or_update_from_values( new_attributes, values )
|
|
154
|
+
end # each lines
|
|
155
|
+
end
|
|
156
|
+
|
|
140
157
|
|
|
141
158
|
def load_leagues( name, more_attribs={} )
|
|
142
159
|
|
|
@@ -351,8 +368,18 @@ class Reader
|
|
|
351
368
|
|
|
352
369
|
event_attribs['end_at'] = end_at
|
|
353
370
|
|
|
354
|
-
elsif key == '
|
|
371
|
+
elsif key == 'grounds' || key == 'stadiums' || key == 'venues'
|
|
372
|
+
## assume grounds value is an array
|
|
355
373
|
|
|
374
|
+
ground_ids = []
|
|
375
|
+
value.each do |item|
|
|
376
|
+
ground_key = item.to_s.strip
|
|
377
|
+
ground = Ground.find_by_key!( ground_key )
|
|
378
|
+
ground_ids << ground.id
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
event_attribs['ground_ids'] = ground_ids
|
|
382
|
+
elsif key == 'teams'
|
|
356
383
|
## assume teams value is an array
|
|
357
384
|
|
|
358
385
|
team_ids = []
|
|
@@ -684,9 +711,13 @@ private
|
|
|
684
711
|
@event = Event.find_by_key!( event_key )
|
|
685
712
|
|
|
686
713
|
logger.debug "Event #{@event.key} >#{@event.title}<"
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
714
|
+
|
|
715
|
+
### fix: use build_title_table_for ??? why? why not??
|
|
716
|
+
@known_teams = @event.known_teams_table
|
|
717
|
+
|
|
718
|
+
@known_grounds = TextUtils.build_title_table_for( @event.grounds )
|
|
719
|
+
|
|
720
|
+
|
|
690
721
|
parse_fixtures( reader )
|
|
691
722
|
|
|
692
723
|
end # method load_fixtures
|
|
@@ -812,6 +843,12 @@ private
|
|
|
812
843
|
|
|
813
844
|
scores = find_scores!( line )
|
|
814
845
|
|
|
846
|
+
|
|
847
|
+
map_ground!( line )
|
|
848
|
+
ground_key = find_ground!( line )
|
|
849
|
+
ground = ground_key.nil? ? nil : Ground.find_by_key!( ground_key )
|
|
850
|
+
|
|
851
|
+
|
|
815
852
|
logger.debug " line: >#{line}<"
|
|
816
853
|
|
|
817
854
|
|
|
@@ -820,6 +857,7 @@ private
|
|
|
820
857
|
team1 = Team.find_by_key!( team1_key )
|
|
821
858
|
team2 = Team.find_by_key!( team2_key )
|
|
822
859
|
|
|
860
|
+
|
|
823
861
|
### check if games exists
|
|
824
862
|
## with this teams in this round if yes only update
|
|
825
863
|
game = Game.find_by_round_id_and_team1_id_and_team2_id(
|
|
@@ -837,6 +875,7 @@ private
|
|
|
837
875
|
play_at_v2: date_v2,
|
|
838
876
|
postponed: postponed,
|
|
839
877
|
knockout: @knockout_flag,
|
|
878
|
+
ground_id: ground.present? ? ground.id : nil,
|
|
840
879
|
group_id: @group.present? ? @group.id : nil
|
|
841
880
|
}
|
|
842
881
|
|
data/lib/sportdb/schema.rb
CHANGED
|
@@ -6,26 +6,46 @@ class CreateDb < ActiveRecord::Migration
|
|
|
6
6
|
def up
|
|
7
7
|
|
|
8
8
|
create_table :teams do |t|
|
|
9
|
-
t.string :key, :
|
|
10
|
-
t.string :title, :
|
|
9
|
+
t.string :key, null: false # import/export key
|
|
10
|
+
t.string :title, null: false
|
|
11
11
|
t.string :title2
|
|
12
12
|
t.string :code # make it not null? - three letter code (short title)
|
|
13
13
|
t.string :synonyms # comma separated list of synonyms
|
|
14
|
-
t.references :country, :
|
|
14
|
+
t.references :country, null: false
|
|
15
15
|
t.references :city # NB: city is optional (should be required for clubs e.g. non-national teams)
|
|
16
|
-
t.boolean :club, :
|
|
17
|
-
|
|
16
|
+
t.boolean :club, null: false, default: false # is it a club (not a national team)?
|
|
17
|
+
|
|
18
18
|
### fix: remove and add virtual attribute in model instead
|
|
19
|
-
t.boolean :national, :
|
|
19
|
+
t.boolean :national, null: false, default: false # is it a national selection team (not a club)?
|
|
20
|
+
t.timestamps
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
add_index :teams, :key, unique: true
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
create_table :grounds do |t|
|
|
27
|
+
t.string :key, null: false # import/export key
|
|
28
|
+
t.string :title, null: false
|
|
29
|
+
t.string :synonyms # comma separated list of synonyms
|
|
30
|
+
|
|
31
|
+
t.references :country, null: false
|
|
32
|
+
t.references :city # todo: make city required ???
|
|
33
|
+
|
|
34
|
+
### fix/todo: add since/founded/opened/build attrib eg. 2011 or 1987
|
|
35
|
+
## - add capacity e.g. 40_000
|
|
36
|
+
## fix: add address !!!! etc
|
|
37
|
+
|
|
38
|
+
## add region ??? or just use region from city ??
|
|
39
|
+
|
|
20
40
|
t.timestamps
|
|
21
41
|
end
|
|
22
42
|
|
|
23
|
-
add_index :
|
|
43
|
+
add_index :grounds, :key, unique: true
|
|
24
44
|
|
|
25
45
|
|
|
26
46
|
create_table :persons do |t| # use people ? instead of persons (person/persons makes it easier?)
|
|
27
|
-
t.string :key, :
|
|
28
|
-
t.string :name, :
|
|
47
|
+
t.string :key, null: false # import/export key
|
|
48
|
+
t.string :name, null: false
|
|
29
49
|
t.string :synonyms # comma separated list of synonyms
|
|
30
50
|
t.string :code # three letter code (short title)
|
|
31
51
|
|
|
@@ -35,48 +55,48 @@ create_table :persons do |t| # use people ? instead of persons (person/person
|
|
|
35
55
|
|
|
36
56
|
t.references :city
|
|
37
57
|
t.references :region
|
|
38
|
-
t.references :country, :
|
|
58
|
+
t.references :country, null: false
|
|
39
59
|
|
|
40
|
-
t.references :nationality, :
|
|
60
|
+
t.references :nationality, null: false # by default assume same as country of birth (see above)
|
|
41
61
|
|
|
42
62
|
t.timestamps
|
|
43
63
|
end
|
|
44
64
|
|
|
45
65
|
# join table: person+game(team1+team2+event(season+league))
|
|
46
66
|
create_table :goals do |t|
|
|
47
|
-
t.references :person, :
|
|
48
|
-
t.references :game, :
|
|
67
|
+
t.references :person, null: false
|
|
68
|
+
t.references :game, null: false
|
|
49
69
|
t.integer :minute
|
|
50
70
|
t.integer :offset # e.g. 45' +3 or 90' +2
|
|
51
71
|
t.integer :score1
|
|
52
72
|
t.integer :score2
|
|
53
73
|
|
|
54
74
|
## type of goal (penalty, owngoal)
|
|
55
|
-
t.boolean :penalty, :
|
|
56
|
-
t.boolean :owngoal, :
|
|
75
|
+
t.boolean :penalty, null: false, default: false
|
|
76
|
+
t.boolean :owngoal, null: false, default: false # de: Eigentor -> # todo: find better name?
|
|
57
77
|
|
|
58
78
|
t.timestamps
|
|
59
79
|
end
|
|
60
80
|
|
|
61
81
|
|
|
62
82
|
create_table :tracks do |t| # e.g. Formula 1 circuits or Apline Ski resorts/slops/pistes
|
|
63
|
-
t.string :key,
|
|
64
|
-
t.string :title, :
|
|
83
|
+
t.string :key, null: false # import/export key
|
|
84
|
+
t.string :title, null: false
|
|
65
85
|
t.string :synonyms # comma separated list of synonyms
|
|
66
86
|
t.string :code # three letter code (short title)
|
|
67
87
|
|
|
68
88
|
t.references :city
|
|
69
89
|
t.references :region
|
|
70
|
-
t.references :country, :
|
|
90
|
+
t.references :country, null: false
|
|
71
91
|
t.timestamps
|
|
72
92
|
end
|
|
73
93
|
|
|
74
94
|
|
|
75
95
|
# join table -> event(season+league)+track
|
|
76
96
|
create_table :races do |t| # e.g. Formula 1 race (Grand Prix Monaco) or Alpine Ski race (Downhill Lake Louise)
|
|
77
|
-
t.references :track, :
|
|
78
|
-
t.references :event, :
|
|
79
|
-
t.integer :pos, :
|
|
97
|
+
t.references :track, null: false
|
|
98
|
+
t.references :event, null: false
|
|
99
|
+
t.integer :pos, null: false # Race #1,#2,#3,#4 etc.
|
|
80
100
|
|
|
81
101
|
## todo: add auto-created key (for import/export) e.g.
|
|
82
102
|
|
|
@@ -85,8 +105,8 @@ create_table :races do |t| # e.g. Formula 1 race (Grand Prix Monaco) or Alpi
|
|
|
85
105
|
end
|
|
86
106
|
|
|
87
107
|
create_table :runs do |t|
|
|
88
|
-
t.references :race, :
|
|
89
|
-
t.integer :pos, :
|
|
108
|
+
t.references :race, null: false
|
|
109
|
+
t.integer :pos, null: false
|
|
90
110
|
|
|
91
111
|
t.datetime :start_at
|
|
92
112
|
t.timestamps
|
|
@@ -96,9 +116,9 @@ end
|
|
|
96
116
|
create_table :records do |t| # use TimeRecord? instead of simple record
|
|
97
117
|
t.references :race # optional either race or run references
|
|
98
118
|
t.references :run
|
|
99
|
-
t.references :person, :
|
|
119
|
+
t.references :person, null: false
|
|
100
120
|
t.integer :pos # 1,2,3, etc or 0
|
|
101
|
-
t.boolean :completed, :
|
|
121
|
+
t.boolean :completed, null: false, default: true # completed race - find better name?
|
|
102
122
|
t.string :state # find a better name? e.g. retired, e.g.
|
|
103
123
|
t.string :comment # find a better name ? e.g. collision damage (if ret) for formula 1
|
|
104
124
|
t.time :time
|
|
@@ -111,22 +131,22 @@ end
|
|
|
111
131
|
|
|
112
132
|
# join table -> person+team+event(season+league)
|
|
113
133
|
create_table :rosters do |t| # use squads as an alternative name? why? why not??
|
|
114
|
-
t.references :person, :
|
|
115
|
-
t.references :team, :
|
|
134
|
+
t.references :person, null: false
|
|
135
|
+
t.references :team, null: false
|
|
116
136
|
t.references :event # make required?
|
|
117
|
-
t.integer :pos, :
|
|
137
|
+
t.integer :pos, null: false
|
|
118
138
|
|
|
119
139
|
t.timestamps
|
|
120
140
|
end
|
|
121
141
|
|
|
122
142
|
|
|
123
143
|
create_table :events do |t|
|
|
124
|
-
t.string :key, :
|
|
125
|
-
t.references :league, :
|
|
126
|
-
t.references :season, :
|
|
127
|
-
t.date :start_at, :
|
|
144
|
+
t.string :key, null: false # import/export key
|
|
145
|
+
t.references :league, null: false
|
|
146
|
+
t.references :season, null: false
|
|
147
|
+
t.date :start_at, null: false # NB: only use date (w/o time)
|
|
128
148
|
t.date :end_at # make it required??? # NB: only use date (w/o time)
|
|
129
|
-
t.boolean :team3, :
|
|
149
|
+
t.boolean :team3, null: false, default: true ## e.g. Champions League has no 3rd place (only 1st and 2nd/final)
|
|
130
150
|
|
|
131
151
|
#### track 1-n sources (from repos) - # todo move to its own table later
|
|
132
152
|
## NB: relative to event.yml - use mapper to "resolve" to full path w/ repo; use league+season keys
|
|
@@ -137,18 +157,18 @@ create_table :events do |t|
|
|
|
137
157
|
t.timestamps
|
|
138
158
|
end
|
|
139
159
|
|
|
140
|
-
add_index :events, :key, :
|
|
160
|
+
add_index :events, :key, unique: true
|
|
141
161
|
|
|
142
162
|
|
|
143
163
|
create_table :rounds do |t|
|
|
144
|
-
t.references :event, :
|
|
145
|
-
t.string :title, :
|
|
164
|
+
t.references :event, null: false
|
|
165
|
+
t.string :title, null: false
|
|
146
166
|
t.string :title2
|
|
147
|
-
t.integer :pos, :
|
|
167
|
+
t.integer :pos, null: false
|
|
148
168
|
## add new table stage/stages for grouping rounds in group rounds and playoff rounds, for example???
|
|
149
169
|
## # "regular" season (group) games or post-season (playoff) knockouts (k.o's)
|
|
150
|
-
t.boolean :knockout, :
|
|
151
|
-
t.date :start_at, :
|
|
170
|
+
t.boolean :knockout, null: false, default: false
|
|
171
|
+
t.date :start_at, null: false # NB: only use date (w/o time)
|
|
152
172
|
t.date :end_at # todo: make it required e.g. :null => false # NB: only use date (w/o time)
|
|
153
173
|
|
|
154
174
|
t.timestamps
|
|
@@ -158,9 +178,9 @@ add_index :rounds, :event_id # fk event_id index
|
|
|
158
178
|
|
|
159
179
|
|
|
160
180
|
create_table :groups do |t| # Teamgruppe (zB Gruppe A, Gruppe B, etc.)
|
|
161
|
-
t.references :event, :
|
|
162
|
-
t.string :title, :
|
|
163
|
-
t.integer :pos, :
|
|
181
|
+
t.references :event, null: false
|
|
182
|
+
t.string :title, null: false
|
|
183
|
+
t.integer :pos, null: false
|
|
164
184
|
t.timestamps
|
|
165
185
|
end
|
|
166
186
|
|
|
@@ -169,19 +189,23 @@ add_index :groups, :event_id # fk event_id index
|
|
|
169
189
|
|
|
170
190
|
create_table :games do |t|
|
|
171
191
|
t.string :key # import/export key
|
|
172
|
-
t.references :round, :
|
|
173
|
-
t.integer :pos, :
|
|
192
|
+
t.references :round, null: false
|
|
193
|
+
t.integer :pos, null: false
|
|
174
194
|
t.references :group # note: group is optional
|
|
175
|
-
t.references :team1, :
|
|
176
|
-
t.references :team2, :
|
|
195
|
+
t.references :team1, null: false
|
|
196
|
+
t.references :team2, null: false
|
|
177
197
|
|
|
178
|
-
t.datetime :play_at, :
|
|
179
|
-
t.boolean :postponed, :
|
|
198
|
+
t.datetime :play_at, null: false
|
|
199
|
+
t.boolean :postponed, null: false, default: false
|
|
180
200
|
t.datetime :play_at_v2 # optional old date (when postponed)
|
|
181
201
|
t.datetime :play_at_v3 # optional odl date (when postponed twice)
|
|
182
202
|
|
|
183
|
-
t.
|
|
184
|
-
t.
|
|
203
|
+
t.references :ground # optional - stadium (lets you get city,region,country,etc)
|
|
204
|
+
t.references :city # optional - convenience for ground.city_id ???
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
t.boolean :knockout, null: false, default: false
|
|
208
|
+
t.boolean :home, null: false, default: true # is team1 play at home (that is, at its home stadium)
|
|
185
209
|
t.integer :score1
|
|
186
210
|
t.integer :score2
|
|
187
211
|
t.integer :score1et # extratime - team 1 (opt)
|
|
@@ -201,7 +225,7 @@ create_table :games do |t|
|
|
|
201
225
|
t.timestamps
|
|
202
226
|
end
|
|
203
227
|
|
|
204
|
-
add_index :games, :key,
|
|
228
|
+
add_index :games, :key, unique: true
|
|
205
229
|
add_index :games, :round_id # fk round_id index
|
|
206
230
|
add_index :games, :group_id # fk group_id index
|
|
207
231
|
add_index :games, :next_game_id # fk next_game_id index
|
|
@@ -211,40 +235,52 @@ add_index :games, :prev_game_id # fk next_game_id index
|
|
|
211
235
|
|
|
212
236
|
# todo: remove id from join table (without extra fields)? why?? why not??
|
|
213
237
|
create_table :events_teams do |t|
|
|
214
|
-
t.references :event, :
|
|
215
|
-
t.references :team, :
|
|
238
|
+
t.references :event, null: false
|
|
239
|
+
t.references :team, null: false
|
|
216
240
|
t.timestamps
|
|
217
241
|
end
|
|
218
242
|
|
|
219
|
-
add_index :events_teams, [:event_id,:team_id], :
|
|
243
|
+
add_index :events_teams, [:event_id,:team_id], unique: true
|
|
220
244
|
add_index :events_teams, :event_id
|
|
221
245
|
|
|
222
246
|
|
|
247
|
+
# todo: remove id from join table (without extra fields)? why?? why not??
|
|
248
|
+
create_table :events_grounds do |t|
|
|
249
|
+
t.references :event, null: false
|
|
250
|
+
t.references :ground, null: false
|
|
251
|
+
t.timestamps
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
add_index :events_grounds, [:event_id,:ground_id], unique: true
|
|
255
|
+
add_index :events_grounds, :event_id
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
|
|
223
259
|
create_table :groups_teams do |t|
|
|
224
|
-
t.references :group, :
|
|
225
|
-
t.references :team, :
|
|
260
|
+
t.references :group, null: false
|
|
261
|
+
t.references :team, null: false
|
|
226
262
|
t.timestamps
|
|
227
263
|
end
|
|
228
264
|
|
|
229
|
-
add_index :groups_teams, [:group_id,:team_id], :
|
|
265
|
+
add_index :groups_teams, [:group_id,:team_id], unique: true
|
|
230
266
|
add_index :groups_teams, :group_id
|
|
231
|
-
|
|
232
|
-
|
|
267
|
+
|
|
268
|
+
|
|
233
269
|
### todo: add models and some seed data
|
|
234
270
|
|
|
235
271
|
create_table :seasons do |t| ## also used for years
|
|
236
|
-
t.string :key, :
|
|
237
|
-
t.string :title, :
|
|
272
|
+
t.string :key, null: false
|
|
273
|
+
t.string :title, null: false # e.g. 2011/12, 2012/13 ### what to do w/ 2012? for world cup etc?
|
|
238
274
|
t.timestamps
|
|
239
275
|
end
|
|
240
276
|
|
|
241
277
|
create_table :leagues do |t| ## also for cups/conferences/tournaments/world series/etc.
|
|
242
|
-
t.string :key, :
|
|
243
|
-
t.string :title, :
|
|
278
|
+
t.string :key, null: false
|
|
279
|
+
t.string :title, null: false # e.g. Premier League, Deutsche Bundesliga, World Cup, Champions League, etc.
|
|
244
280
|
t.references :country ## optional for now , :null => false ### todo: create "virtual" country for international leagues e.g. use int? or world (ww?)/europe (eu)/etc. similar? already taken??
|
|
245
281
|
|
|
246
282
|
## fix: rename to :clubs from :club
|
|
247
|
-
t.boolean :club, :
|
|
283
|
+
t.boolean :club, null: false, default: false # club teams or national teams?
|
|
248
284
|
## todo: add t.boolean :national flag? for national teams?
|
|
249
285
|
## t.boolean :international, :null => false, :default => false # national league or international?
|
|
250
286
|
## t.boolean :cup ## or regular season league??
|
|
@@ -252,12 +288,12 @@ create_table :leagues do |t| ## also for cups/conferences/tournaments/world ser
|
|
|
252
288
|
end
|
|
253
289
|
|
|
254
290
|
create_table :badges do |t|
|
|
255
|
-
t.references :team, :
|
|
291
|
+
t.references :team, null: false
|
|
256
292
|
## todo/fix: use event insead of league+season ??
|
|
257
293
|
## t.references :event, :null => false # event => league+season
|
|
258
|
-
t.references :league, :
|
|
259
|
-
t.references :season, :
|
|
260
|
-
t.string :title,
|
|
294
|
+
t.references :league, null: false
|
|
295
|
+
t.references :season, null: false
|
|
296
|
+
t.string :title, null: false # Meister, Weltmeister, Europameister, Cupsieger, Vize-Meister, Aufsteiger, Absteiger, etc.
|
|
261
297
|
t.timestamps
|
|
262
298
|
end
|
|
263
299
|
|
data/lib/sportdb/stats.rb
CHANGED
|
@@ -17,6 +17,8 @@ module SportDb
|
|
|
17
17
|
puts " #{Person.count} persons / #{Roster.count} rosters (person+team+event recs)"
|
|
18
18
|
puts " #{Goal.count} goals (person+game recs)"
|
|
19
19
|
|
|
20
|
+
puts " #{Ground.count} grounds|stadiums"
|
|
21
|
+
|
|
20
22
|
puts " #{Country.count} countries / #{Region.count} regions / #{City.count} cities"
|
|
21
23
|
|
|
22
24
|
## todo: add tags / taggings from worlddb
|
data/lib/sportdb/utils.rb
CHANGED
|
@@ -528,6 +528,17 @@ module SportDb::FixtureHelpers
|
|
|
528
528
|
map_teams!( line )
|
|
529
529
|
end
|
|
530
530
|
|
|
531
|
+
|
|
532
|
+
def find_ground!( line )
|
|
533
|
+
TextUtils.find_key_for!( 'ground', line )
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
## todo/fix: pass in known_grounds as a parameter? why? why not?
|
|
537
|
+
def map_ground!( line )
|
|
538
|
+
TextUtils.map_titles_for!( 'ground', line, @known_grounds )
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
|
|
531
542
|
def find_track!( line )
|
|
532
543
|
TextUtils.find_key_for!( 'track', line )
|
|
533
544
|
end
|
data/lib/sportdb/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sportdb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.8.
|
|
4
|
+
version: 1.8.2
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,11 +9,11 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2014-02-
|
|
12
|
+
date: 2014-02-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: worlddb
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &5976588 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ! '>='
|
|
@@ -21,10 +21,10 @@ dependencies:
|
|
|
21
21
|
version: '1.7'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *5976588
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: fetcher
|
|
27
|
-
requirement: &
|
|
27
|
+
requirement: &5974812 !ruby/object:Gem::Requirement
|
|
28
28
|
none: false
|
|
29
29
|
requirements:
|
|
30
30
|
- - ! '>='
|
|
@@ -32,10 +32,10 @@ dependencies:
|
|
|
32
32
|
version: '0.3'
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
|
-
version_requirements: *
|
|
35
|
+
version_requirements: *5974812
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
37
|
name: gli
|
|
38
|
-
requirement: &
|
|
38
|
+
requirement: &5973264 !ruby/object:Gem::Requirement
|
|
39
39
|
none: false
|
|
40
40
|
requirements:
|
|
41
41
|
- - ! '>='
|
|
@@ -43,10 +43,10 @@ dependencies:
|
|
|
43
43
|
version: 2.5.6
|
|
44
44
|
type: :runtime
|
|
45
45
|
prerelease: false
|
|
46
|
-
version_requirements: *
|
|
46
|
+
version_requirements: *5973264
|
|
47
47
|
- !ruby/object:Gem::Dependency
|
|
48
48
|
name: rdoc
|
|
49
|
-
requirement: &
|
|
49
|
+
requirement: &5987700 !ruby/object:Gem::Requirement
|
|
50
50
|
none: false
|
|
51
51
|
requirements:
|
|
52
52
|
- - ~>
|
|
@@ -54,10 +54,10 @@ dependencies:
|
|
|
54
54
|
version: '4.0'
|
|
55
55
|
type: :development
|
|
56
56
|
prerelease: false
|
|
57
|
-
version_requirements: *
|
|
57
|
+
version_requirements: *5987700
|
|
58
58
|
- !ruby/object:Gem::Dependency
|
|
59
59
|
name: hoe
|
|
60
|
-
requirement: &
|
|
60
|
+
requirement: &5981688 !ruby/object:Gem::Requirement
|
|
61
61
|
none: false
|
|
62
62
|
requirements:
|
|
63
63
|
- - ~>
|
|
@@ -65,7 +65,7 @@ dependencies:
|
|
|
65
65
|
version: '3.7'
|
|
66
66
|
type: :development
|
|
67
67
|
prerelease: false
|
|
68
|
-
version_requirements: *
|
|
68
|
+
version_requirements: *5981688
|
|
69
69
|
description: sportdb - sport.db command line tool
|
|
70
70
|
email: opensport@googlegroups.com
|
|
71
71
|
executables:
|
|
@@ -97,10 +97,12 @@ files:
|
|
|
97
97
|
- lib/sportdb/lang.rb
|
|
98
98
|
- lib/sportdb/models/badge.rb
|
|
99
99
|
- lib/sportdb/models/event.rb
|
|
100
|
+
- lib/sportdb/models/event_ground.rb
|
|
100
101
|
- lib/sportdb/models/event_team.rb
|
|
101
102
|
- lib/sportdb/models/forward.rb
|
|
102
103
|
- lib/sportdb/models/game.rb
|
|
103
104
|
- lib/sportdb/models/goal.rb
|
|
105
|
+
- lib/sportdb/models/ground.rb
|
|
104
106
|
- lib/sportdb/models/group.rb
|
|
105
107
|
- lib/sportdb/models/group_team.rb
|
|
106
108
|
- lib/sportdb/models/league.rb
|