sportdb 1.8.1 → 1.8.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|