sportdb-writers 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +6 -4
- data/Manifest.txt +2 -4
- data/README.md +26 -28
- data/Rakefile +32 -30
- data/lib/sportdb/leagues/leagues_at.rb +35 -39
- data/lib/sportdb/leagues/leagues_de.rb +21 -29
- data/lib/sportdb/leagues/leagues_eng.rb +58 -70
- data/lib/sportdb/leagues/leagues_es.rb +15 -19
- data/lib/sportdb/leagues/leagues_europe.rb +178 -213
- data/lib/sportdb/leagues/leagues_it.rb +16 -20
- data/lib/sportdb/leagues/leagues_mx.rb +23 -25
- data/lib/sportdb/leagues/leagues_south_america.rb +17 -21
- data/lib/sportdb/leagues/leagues_world.rb +14 -16
- data/lib/sportdb/writers/github.rb +195 -0
- data/lib/sportdb/writers/goals.rb +57 -0
- data/lib/sportdb/writers/txt_writer.rb +218 -407
- data/lib/sportdb/writers/version.rb +24 -24
- data/lib/sportdb/writers/write.rb +269 -367
- data/lib/sportdb/writers.rb +97 -31
- metadata +42 -17
- data/lib/sportdb/writers/config.rb +0 -18
- data/test/helper.rb +0 -19
- data/test/test_txt_writer.rb +0 -124
- data/test/test_version.rb +0 -16
@@ -0,0 +1,195 @@
|
|
1
|
+
|
2
|
+
module SportDb
|
3
|
+
|
4
|
+
###
|
5
|
+
## todo/fix:
|
6
|
+
## add -i/--interactive flag
|
7
|
+
## will prompt yes/no before git operations (with consequences)!!!
|
8
|
+
|
9
|
+
class GitHubSync
|
10
|
+
|
11
|
+
## map leagues to repo+path
|
12
|
+
## e.g. fr.1 => europe/france
|
13
|
+
## eng..1 => england
|
14
|
+
REPOS = {
|
15
|
+
'at.1' => 'austria',
|
16
|
+
'at.2' => 'austria',
|
17
|
+
'at.3.o' => 'austria',
|
18
|
+
'at.cup' => 'austria',
|
19
|
+
|
20
|
+
'de.1' => 'deutschland',
|
21
|
+
'de.2' => 'deutschland',
|
22
|
+
'de.3' => 'deutschland',
|
23
|
+
'de.cup' => 'deutschland',
|
24
|
+
|
25
|
+
'eng.1' => 'england',
|
26
|
+
'eng.2' => 'england',
|
27
|
+
'eng.3' => 'england',
|
28
|
+
'eng.4' => 'england',
|
29
|
+
'eng.5' => 'england',
|
30
|
+
'eng.cup' => 'england', # English FA Cup
|
31
|
+
|
32
|
+
'es.1' => 'espana',
|
33
|
+
'es.2' => 'espana',
|
34
|
+
|
35
|
+
'fr.1' => 'europe/france',
|
36
|
+
'fr.2' => 'europe/france',
|
37
|
+
|
38
|
+
'hu.1' => 'europe/hungary',
|
39
|
+
'gr.1' => 'europe/greece',
|
40
|
+
'pt.1' => 'europe/portugal',
|
41
|
+
'pt.2' => 'europe/portugal',
|
42
|
+
|
43
|
+
'ch.1' => 'europe/switzerland',
|
44
|
+
'ch.2' => 'europe/switzerland',
|
45
|
+
|
46
|
+
'tr.1' => 'europe/turkey',
|
47
|
+
'tr.2' => 'europe/turkey',
|
48
|
+
|
49
|
+
'is.1' => 'europe/iceland',
|
50
|
+
'sco.1' => 'europe/scotland',
|
51
|
+
'ie.1' => 'europe/ireland',
|
52
|
+
|
53
|
+
'fi.1' => 'europe/finland',
|
54
|
+
'se.1' => 'europe/sweden',
|
55
|
+
'se.2' => 'europe/sweden',
|
56
|
+
'no.1' => 'europe/norway',
|
57
|
+
'dk.1' => 'europe/denmark',
|
58
|
+
|
59
|
+
'lu.1' => 'europe/luxembourg',
|
60
|
+
'be.1' => 'europe/belgium',
|
61
|
+
'nl.1' => 'europe/netherlands',
|
62
|
+
'cz.1' => 'europe/czech-republic',
|
63
|
+
|
64
|
+
'sk.1' => 'europe/slovakia',
|
65
|
+
'hr.1' => 'europe/croatia',
|
66
|
+
'pl.1' => 'europe/poland',
|
67
|
+
|
68
|
+
'ro.1' => 'europe/romania',
|
69
|
+
|
70
|
+
'ua.1' => 'europe/ukraine',
|
71
|
+
|
72
|
+
'ru.1' => 'europe/russia',
|
73
|
+
'ru.2' => 'europe/russia',
|
74
|
+
|
75
|
+
'it.1' => 'italy',
|
76
|
+
'it.2' => 'italy',
|
77
|
+
|
78
|
+
'mx.1' => 'mexico',
|
79
|
+
|
80
|
+
'ar.1' => 'south-america/argentina',
|
81
|
+
'br.1' => 'south-america/brazil',
|
82
|
+
|
83
|
+
'cn.1' => 'world/asia/china',
|
84
|
+
'jp.1' => 'world/asia/japan',
|
85
|
+
}
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
########
|
90
|
+
## (auto)default to Writer.config.out_dir - why? why not?
|
91
|
+
##
|
92
|
+
## note - is root for org (NOT monotree for now - why?`why not?)
|
93
|
+
def self.root() @root || "/sports/openfootball"; end
|
94
|
+
def self.root=( dir ) @root = dir; end
|
95
|
+
## use root_dir (alias) - why? why not?
|
96
|
+
|
97
|
+
|
98
|
+
def initialize( datasets )
|
99
|
+
@repos = _find_repos( datasets )
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
def git_push_if_changes
|
104
|
+
_git_push_if_changes( @repos )
|
105
|
+
end
|
106
|
+
|
107
|
+
def git_fast_forward_if_clean
|
108
|
+
_git_fast_forward_if_clean( @repos )
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
## todo/fix: rename to something like
|
113
|
+
## git_(auto_)commit_and_push_if_changes/if_dirty()
|
114
|
+
|
115
|
+
def _git_push_if_changes( names ) ## optenfootball repo names e.g. world, england, etc.
|
116
|
+
message = "auto-update week #{Date.today.cweek}" ## add /#{Date.today.cday - why? why not?
|
117
|
+
puts message
|
118
|
+
|
119
|
+
names.each do |name|
|
120
|
+
path = "#{self.class.root}/#{name}"
|
121
|
+
|
122
|
+
Gitti::GitProject.open( path ) do |proj|
|
123
|
+
puts ''
|
124
|
+
puts "###########################################"
|
125
|
+
puts "## trying to commit & push repo in path >#{path}<"
|
126
|
+
puts "Dir.getwd: #{Dir.getwd}"
|
127
|
+
output = proj.changes
|
128
|
+
if output.empty?
|
129
|
+
puts "no changes found; skipping commit & push"
|
130
|
+
else
|
131
|
+
proj.add( '.' )
|
132
|
+
proj.commit( message )
|
133
|
+
proj.push
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
def _git_fast_forward_if_clean( names )
|
141
|
+
names.each do |name|
|
142
|
+
path = "#{self.class.root}/#{name}"
|
143
|
+
|
144
|
+
Gitti::GitProject.open( path ) do |proj|
|
145
|
+
output = proj.changes
|
146
|
+
unless output.empty?
|
147
|
+
puts "FAIL - cannot git pull (fast-forward) - working tree has changes:"
|
148
|
+
puts output
|
149
|
+
exit 1
|
150
|
+
end
|
151
|
+
|
152
|
+
proj.fast_forward
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
## todo/check: find a better name for helper?
|
159
|
+
## note: datasets of format
|
160
|
+
##
|
161
|
+
## DATASETS = [
|
162
|
+
## ['it.1', %w[2020/21 2019/20]],
|
163
|
+
## ['it.2', %w[2019/20]],
|
164
|
+
## ['es.1', %w[2019/20]],
|
165
|
+
## ['es.2', %w[2019/20]],
|
166
|
+
## ]
|
167
|
+
|
168
|
+
|
169
|
+
def _find_repos( datasets )
|
170
|
+
repos = []
|
171
|
+
datasets.each do |dataset|
|
172
|
+
league_key = dataset[0]
|
173
|
+
path = REPOS[ league_key ]
|
174
|
+
## pp path
|
175
|
+
if path.nil?
|
176
|
+
puts "!! ERROR - no repo path found for league >#{league_key}<; sorry"
|
177
|
+
exit 1
|
178
|
+
end
|
179
|
+
|
180
|
+
## auto-add
|
181
|
+
## openfootball/ org here
|
182
|
+
## and keep root "generic" to monoroot - why? why not?
|
183
|
+
|
184
|
+
## use only first part e.g. europe/belgium => europe
|
185
|
+
repos << path.split( '/' )[0]
|
186
|
+
end
|
187
|
+
pp repos
|
188
|
+
repos.uniq ## note: remove duplicates (e.g. europe or world or such)
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
|
194
|
+
end # class GitHub
|
195
|
+
end # module SportDb
|
@@ -0,0 +1,57 @@
|
|
1
|
+
######
|
2
|
+
# goals helper
|
3
|
+
# todo/check/fix: move upstream for (re)use - why? why not?
|
4
|
+
|
5
|
+
|
6
|
+
module Writer
|
7
|
+
|
8
|
+
|
9
|
+
def self.merge_goals( matches, goals )
|
10
|
+
goals_by_match = goals.group_by { |rec| rec.match_id }
|
11
|
+
puts "match goal reports - #{goals_by_match.size} records"
|
12
|
+
|
13
|
+
## lets group by date for easier lookup
|
14
|
+
matches_by_date = matches.group_by { |rec| rec.date }
|
15
|
+
|
16
|
+
|
17
|
+
## note: "shadow / reuse" matches and goals vars for now in loop
|
18
|
+
## find better names to avoid confusion!!
|
19
|
+
goals_by_match.each_with_index do |(match_id, goals),i|
|
20
|
+
## split match_id
|
21
|
+
team_str, more_str = match_id.split( '|' )
|
22
|
+
team1_str, team2_str = team_str.split( ' - ' )
|
23
|
+
|
24
|
+
more_str = more_str.strip
|
25
|
+
team1_str = team1_str.strip
|
26
|
+
team2_str = team2_str.strip
|
27
|
+
|
28
|
+
## for now assume date in more (and not round or something else)
|
29
|
+
date_str = more_str # e.g. in 2019-07-26 format
|
30
|
+
|
31
|
+
puts ">#{team1_str}< - >#{team2_str}< | #{date_str}, #{goals.size} goals"
|
32
|
+
|
33
|
+
## try a join - find matching match
|
34
|
+
matches = matches_by_date[ date_str ]
|
35
|
+
if matches.nil?
|
36
|
+
puts "!! ERROR: no match found for date >#{date_str}<"
|
37
|
+
exit 1
|
38
|
+
end
|
39
|
+
|
40
|
+
found_matches = matches.select {|match| match.team1 == team1_str &&
|
41
|
+
match.team2 == team2_str }
|
42
|
+
|
43
|
+
if found_matches.size == 1
|
44
|
+
match = found_matches[0]
|
45
|
+
match.goals = SportDb::Import::Goal.build( goals )
|
46
|
+
else
|
47
|
+
puts "!!! ERROR: found #{found_matches.size} in #{matches.size} matches for date >#{date_str}<:"
|
48
|
+
matches.each do |match|
|
49
|
+
puts " >#{match.team1}< - >#{match.team2}<"
|
50
|
+
end
|
51
|
+
exit 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
end # module Writer
|