football-sources 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b068838936cfdba0eae277fe5f44c957f2281655
4
- data.tar.gz: da3b4be77ac9661aaaa469580d38d37e68f3ae08
2
+ SHA256:
3
+ metadata.gz: 42b02267a8c37a2b3a38662941d13ac8e61e622c8b45dc0c06a28453e272b2dc
4
+ data.tar.gz: e26f5cf47b6c0390b4f5d99b85919852eb46e7822201e4d6eba52315dc683e44
5
5
  SHA512:
6
- metadata.gz: 9179c04e869df95a9b473aeabe1397f19c29108a1eac6e6d3fe149f2cb3b5f6967002d459e4ba013bfae26a22748724030805ebc591c333a389e53eb5d05576a
7
- data.tar.gz: 31c7a7a673ea694996ddcf4ae550aa0904c2ba5391f5af3bfe09c9bf1f27f2af2ba0d8ddee0389da0b11a739b7bedb9e35055486a834a338072049d5a0f758e8
6
+ metadata.gz: 24038df8393a7ab1635cd6a5a9376e20c29ba077fbe3db63a917a5f59154aec50c1f6f99c68e1f51cbbd1c28ce07412e89387ae9576e8fc22c2bc872df689ae0
7
+ data.tar.gz: d27328142ffed18c30078e66c5a313a9df7a12be714401cba36cfa6752c08d0f1c158a796e87c50202ba08ae5ab2212061db494982656b378c3374c3e1cd23c5
data/CHANGELOG.md CHANGED
@@ -1,4 +1,6 @@
1
- ### 0.0.1 / 2020-11-09
2
-
3
- * Everything is new. First release.
4
-
1
+ ### 0.2.0
2
+
3
+ ### 0.0.1 / 2020-11-09
4
+
5
+ * Everything is new. First release.
6
+
data/Manifest.txt CHANGED
@@ -2,26 +2,8 @@ CHANGELOG.md
2
2
  Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
+ bin/fbgen
5
6
  lib/football-sources.rb
6
- lib/football-sources/apis.rb
7
- lib/football-sources/apis/config.rb
8
- lib/football-sources/apis/convert.rb
9
- lib/football-sources/apis/convert_cl.rb
10
- lib/football-sources/apis/mods.rb
11
- lib/football-sources/apis/stat.rb
12
- lib/football-sources/fbref.rb
13
- lib/football-sources/fbref/build.rb
14
- lib/football-sources/fbref/config.rb
15
- lib/football-sources/fbref/convert.rb
7
+ lib/football-sources/process.rb
16
8
  lib/football-sources/version.rb
17
- lib/football-sources/worldfootball.rb
18
- lib/football-sources/worldfootball/build.rb
19
- lib/football-sources/worldfootball/config.rb
20
- lib/football-sources/worldfootball/convert.rb
21
- lib/football-sources/worldfootball/convert_reports.rb
22
- lib/football-sources/worldfootball/jobs.rb
23
- lib/football-sources/worldfootball/mods.rb
24
- lib/football-sources/worldfootball/vacuum.rb
25
9
  lib/football/sources.rb
26
- test/helper.rb
27
- test/test_version.rb
data/README.md CHANGED
@@ -1,169 +1,30 @@
1
- # football-sources - get football data via web pages or web api (json) calls
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/football-sources](https://rubygems.org/gems/football-sources)
7
- * rdoc :: [rubydoc.info/gems/football-sources](http://rubydoc.info/gems/football-sources)
8
- * forum :: [groups.google.com/group/opensport](https://groups.google.com/group/opensport)
9
-
10
-
11
-
12
- ## Usage
13
-
14
-
15
- ### Source #1 - `football-data.org` - ur src for machine readable football data
16
-
17
- [Daniel Freitag](https://www.football-data.org/about)'s dev-friendly football API
18
- offers a free to use plan
19
- for 12 leagues (API key sign-up and use required).
20
- See [`football-data.org` »](https://www.football-data.org)
21
-
22
-
23
- **Step 0 - Setup Secrets**
24
-
25
- Set the API key / token in the env(ironement).
26
- Example:
27
-
28
- ```
29
- set FOOTBALLDATA=1234567890abcdef1234567890abcdef
30
- ```
31
-
32
-
33
- **Step 1 - Download Match Schedules**
34
-
35
- Download the match schedules (in json) via api calls
36
- to your (local) web cache (in `~/.cache`).
37
- Note: The free trier has a 10 request/minute limit,
38
- thus, sleep/wait 10 secs after every request
39
- (should result in ~6 requests/minute).
40
-
41
-
42
- ``` ruby
43
- require 'football/sources'
44
-
45
-
46
- # download up (ongoing) 2020 or 2020/21 seasons
47
- Webget.config.sleep = 10
48
-
49
- Footballdata.schedule( league: 'eng.1', season: '2020/21' )
50
- Footballdata.schedule( league: 'eng.2', season: '2020/21' )
51
-
52
- Footballdata.schedule( league: 'de.1', season: '2020/21' )
53
- Footballdata.schedule( league: 'es.1', season: '2020/21' )
54
-
55
- Footballdata.schedule( league: 'fr.1', season: '2020/21' )
56
- Footballdata.schedule( league: 'it.1', season: '2020/21' )
57
-
58
- Footballdata.schedule( league: 'nl.1', season: '2020/21' )
59
- Footballdata.schedule( league: 'pt.1', season: '2020/21' )
60
-
61
- Footballdata.schedule( league: 'cl', season: '2020/21' )
62
-
63
- # note: Brasileirão - season is a calendar year (NOT an academic year)
64
- Footballdata.schedule( league: 'br.1', season: '2020' )
65
- ```
66
-
67
- Note: You can find all downloaded match schedules
68
- in your (local) web cache (in `~/.cache/api.football-data.org`) as pretty printed json documents.
69
-
70
-
71
-
72
-
73
- **Step 2 - Convert (Cached) Match Schedules to Records**
74
-
75
- Convert the (cached) match schedules
76
- in JSON to the one-line, one-match & one-file, one-season
77
- "standard" [Football.CSV format](https://github.com/footballcsv). Example:
78
-
79
- ``` ruby
80
- require 'football/sources'
81
-
82
- ['eng.1', 'eng.2',
83
- 'de.1',
84
- 'es.1',
85
- 'fr.1',
86
- 'it.1',
87
- 'nl.1',
88
- 'pt.1',
89
- 'cl',
90
- ].each do |league|
91
- Footballdata.convert( league: league, season: '2020/21' )
92
- end
93
-
94
- Footballdata.convert( league: 'br.1', season: '2020' )
95
- ```
96
-
97
- Note: By default all datasets get written into the `./o`
98
- directory. Use `Footballdata.config.convert.out_dir`
99
- to change the output directory.
100
-
101
- The English Premier League (`eng.1`) results in `./o/2020-21/eng.1.csv`:
102
-
103
- ```
104
- Matchday,Date,Team 1,FT,HT,Team 2,Comments
105
- 1,Sun Sep 13 2020,Manchester City FC,(*),,Aston Villa FC,postponed
106
- 1,Sun Sep 13 2020,Burnley FC,(*),,Manchester United FC,postponed
107
- 1,Sat Sep 12 2020,Fulham FC,0-3,0-1,Arsenal FC,
108
- 1,Sat Sep 12 2020,Crystal Palace FC,1-0,1-0,Southampton FC,
109
- 1,Sat Sep 12 2020,Liverpool FC,4-3,3-2,Leeds United FC,
110
- 1,Sat Sep 12 2020,West Ham United FC,0-2,0-0,Newcastle United FC,
111
- 1,Sun Sep 13 2020,West Bromwich Albion FC,0-3,0-0,Leicester City FC,
112
- 1,Sun Sep 13 2020,Tottenham Hotspur FC,0-1,0-0,Everton FC,
113
- 1,Mon Sep 14 2020,Sheffield United FC,0-2,0-2,Wolverhampton Wanderers FC,
114
- 1,Mon Sep 14 2020,Brighton & Hove Albion FC,1-3,0-1,Chelsea FC,
115
- 2,Sat Sep 19 2020,Everton FC,5-2,2-1,West Bromwich Albion FC,
116
- 2,Sat Sep 19 2020,Leeds United FC,4-3,2-1,Fulham FC,
117
- 2,Sat Sep 19 2020,Manchester United FC,1-3,0-1,Crystal Palace FC,
118
- 2,Sat Sep 19 2020,Arsenal FC,2-1,1-1,West Ham United FC,
119
- 2,Sun Sep 20 2020,Southampton FC,2-5,1-1,Tottenham Hotspur FC,
120
- 2,Sun Sep 20 2020,Newcastle United FC,0-3,0-2,Brighton & Hove Albion FC,
121
- 2,Sun Sep 20 2020,Chelsea FC,0-2,0-0,Liverpool FC,
122
- 2,Sun Sep 20 2020,Leicester City FC,4-2,1-1,Burnley FC,
123
- 2,Mon Sep 21 2020,Aston Villa FC,1-0,0-0,Sheffield United FC,
124
- 2,Mon Sep 21 2020,Wolverhampton Wanderers FC,1-3,0-2,Manchester City FC,
125
- ...
126
- ```
127
-
128
- Or the Brasileirão (`br.1`) in `./o/2020/br.1.csv`:
129
-
130
- ```
131
- Matchday,Date,Team 1,FT,HT,Team 2,Comments
132
- 1,Sat Aug 8 2020,Fortaleza EC,0-2,0-2,CA Paranaense,
133
- 1,Sat Aug 8 2020,Coritiba FBC,0-1,0-0,SC Internacional,
134
- 1,Sun Aug 9 2020,SC Recife,3-2,3-1,Ceará SC,
135
- 1,Sun Aug 9 2020,Santos FC,1-1,0-0,RB Bragantino,
136
- 1,Sun Aug 9 2020,CR Flamengo,0-1,0-1,CA Mineiro,
137
- 1,Sun Aug 9 2020,Goiás EC,(*),,São Paulo FC,postponed
138
- 1,Sun Aug 9 2020,Grêmio FBPA,1-0,1-0,Fluminense FC,
139
- 1,Sun Aug 9 2020,SE Palmeiras,(*),,CR Vasco da Gama,postponed
140
- 2,Wed Aug 12 2020,CA Mineiro,3-2,0-2,SC Corinthians Paulista,
141
- 2,Wed Aug 12 2020,CA Paranaense,2-1,1-1,Goiás EC,
142
- 2,Wed Aug 12 2020,RB Bragantino,1-1,1-0,Botafogo FR,
143
- 2,Wed Aug 12 2020,AC Goianiense,3-0,2-0,CR Flamengo,
144
- 2,Wed Aug 12 2020,EC Bahia,1-0,1-0,Coritiba FBC,
145
- 2,Thu Aug 13 2020,Fluminense FC,1-1,1-1,SE Palmeiras,
146
- 2,Thu Aug 13 2020,Ceará SC,1-1,1-0,Grêmio FBPA,
147
- 2,Thu Aug 13 2020,São Paulo FC,1-0,1-0,Fortaleza EC,
148
- 2,Thu Aug 13 2020,SC Internacional,2-0,0-0,Santos FC,
149
- 2,Thu Aug 13 2020,CR Vasco da Gama,2-0,2-0,SC Recife,
150
- ...
151
- ```
152
-
153
-
154
-
155
- That's it for now. More sources upcoming.
156
-
157
- ## License
158
-
159
- ![](https://publicdomainworks.github.io/buttons/zero88x31.png)
160
-
161
- The `football-sources` scripts are dedicated to the public domain.
162
- Use it as you please with no restrictions whatsoever.
163
-
164
-
165
- ## Questions? Comments?
166
-
167
- Send them along to the
168
- [Open Sports & Friends Forum/Mailing List](http://groups.google.com/group/opensport).
169
- Thanks!
1
+ # football-sources - get football match data (leagues, cups & more) via web pages or web api (json) calls
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/football-sources](https://rubygems.org/gems/football-sources)
7
+ * rdoc :: [rubydoc.info/gems/football-sources](http://rubydoc.info/gems/football-sources)
8
+ * forum :: [groups.google.com/group/opensport](https://groups.google.com/group/opensport)
9
+
10
+
11
+
12
+ ## Usage
13
+
14
+
15
+ To be done.
16
+
17
+
18
+
19
+ ## License
20
+
21
+
22
+ The `football-sources` scripts are dedicated to the public domain.
23
+ Use it as you please with no restrictions whatsoever.
24
+
25
+
26
+
27
+ ## Questions? Comments?
28
+
29
+ Yes, you can. More than welcome.
30
+ See [Help & Support »](https://github.com/openfootball/help)
data/Rakefile CHANGED
@@ -1,31 +1,36 @@
1
- require 'hoe'
2
- require './lib/football-sources/version.rb'
3
-
4
- Hoe.spec 'football-sources' do
5
-
6
- self.version = FootballSources::VERSION
7
-
8
- self.summary = 'football-sources - get football data via web pages or web api (json) calls'
9
- self.description = summary
10
-
11
- self.urls = { home: '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.extra_deps = [
21
- ['webget-football', '>= 0.1.1'],
22
- ['sportdb-catalogs', '>= 1.0.0'],
23
- ]
24
-
25
- self.licenses = ['Public Domain']
26
-
27
- self.spec_extras = {
28
- required_ruby_version: '>= 2.2.2'
29
- }
30
-
31
- end
1
+ require 'hoe'
2
+ require './lib/football-sources/version.rb'
3
+
4
+ Hoe.spec 'football-sources' do
5
+
6
+ self.version = FootballSources::VERSION
7
+
8
+ self.summary = 'football-sources - get football match data (leagues, cups & more) via web pages or web api (json) calls'
9
+ self.description = summary
10
+
11
+
12
+
13
+ self.urls = { home: 'https://github.com/sportdb/sport.db' }
14
+
15
+ self.author = 'Gerald Bauer'
16
+ self.email = 'gerald.bauer@gmail.com'
17
+
18
+ # switch extension to .markdown for gihub formatting
19
+ self.readme_file = 'README.md'
20
+ self.history_file = 'CHANGELOG.md'
21
+
22
+ self.extra_deps = [
23
+ ['sportdb-catalogs'], #, '>= 1.0.0'],
24
+ ['sportdb-writers'],
25
+ ## footballdata sources
26
+ ['footballdata-api'],
27
+ ['worldfootball'],
28
+ ]
29
+
30
+ self.licenses = ['Public Domain']
31
+
32
+ self.spec_extras = {
33
+ required_ruby_version: '>= 2.2.2'
34
+ }
35
+
36
+ end
data/bin/fbgen ADDED
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ## tip: to test run:
4
+ ## ruby -I ./lib bin/fbgen
5
+
6
+ require 'football/sources'
7
+
8
+
9
+ load_env ## use dotenv (.env)
10
+
11
+
12
+ Webcache.root = if File.exist?( '/sports/cache' )
13
+ puts " setting web cache to >/sports/cache<"
14
+ '/sports/cache'
15
+ else
16
+ './cache'
17
+ end
18
+
19
+
20
+
21
+ ## set openfootball github org root - note - NOT monorepo (github) root dirc
22
+ SportDb::GitHubSync.root = '/sports/openfootball'
23
+
24
+
25
+ ## add convenience shortcuts
26
+ Country = Sports::Country
27
+ League = Sports::League
28
+ Club = Sports::Club
29
+
30
+ # Worldfootball.config.convert.out_dir = './o/aug29'
31
+ # Worldfootball.config.convert.out_dir = './o'
32
+ # Worldfootball.config.convert.out_dir = './o'
33
+ Worldfootball.config.convert.out_dir = if File.exist?( '/sports/cache.wfb' )
34
+ puts " setting wfb stage/cache to >/sports/cache.wfb<"
35
+ '/sports/cache.wfb'
36
+ else
37
+ './stage/wfb'
38
+ end
39
+ #########
40
+ ## staging cache settings
41
+ Footballdata.config.convert.out_dir = if File.exist?( '/sports/cache.api.fbdat' )
42
+ puts " setting fbdat stage/cache to >/sports/cache.api.fbdat<"
43
+ '/sports/cache.api.fbdat'
44
+ else
45
+ './stage/fbdat'
46
+ end
47
+
48
+ pp File.expand_path( Footballdata.config.convert.out_dir )
49
+
50
+
51
+ ## note - free tier (tier one) plan - 10 requests/minute
52
+ ## (one request every 6 seconds 6*10=60 secs)
53
+ ## 10 API calls per minute max.
54
+ ## note - default sleep (delay in secs) is 3 sec(s)
55
+ Webget.config.sleep = 10
56
+
57
+
58
+
59
+
60
+ require 'optparse'
61
+
62
+
63
+
64
+ args=ARGV
65
+
66
+
67
+ opts = {
68
+ type: 'fbdat',
69
+ download: false,
70
+ push: false,
71
+ }
72
+
73
+ parser = OptionParser.new do |parser|
74
+ parser.banner = "Usage: #{$PROGRAM_NAME} [options]"
75
+
76
+ # parser.on( "--cache", "--cached", "--offline",
77
+ # "use cached data in #{Webcache.root}" ) do |cached|
78
+ # opts[:cached] = cached
79
+ # end
80
+
81
+ parser.on( "-t NAME", "--type=NAME",
82
+ "use source type - default is (#{opts[:type]})" ) do |type|
83
+ opts[:type] = type
84
+ end
85
+ # end
86
+
87
+
88
+ # add download and push ???
89
+
90
+ end
91
+ parser.parse!( args )
92
+
93
+ puts "OPTS:"
94
+ p opts
95
+ puts "ARGV:"
96
+ p args
97
+
98
+
99
+
100
+ source = if ['fbdat'].include?( opts[:type] )
101
+ Footballdata
102
+ elsif ['wfb'].include?( opts[:type] )
103
+ Worldfootball
104
+ else
105
+ raise ArgumentError, "unknown source type - expected fbdata|wfb; got #{opts[:type]}"
106
+ end
107
+
108
+ puts "source:"
109
+ pp source
110
+
111
+
112
+ league = (args[0] || 'eng.1' ).downcase
113
+ season = (args[1] || '2024/25')
114
+
115
+ datasets = [
116
+ [league, [season]]
117
+ ]
118
+
119
+ puts "datasets:"
120
+ pp datasets
121
+
122
+
123
+
124
+ Fbgen.process( datasets,
125
+ source: source,
126
+ download: opts[:download],
127
+ push: opts[:push] )
128
+
129
+
130
+ puts "bye"
131
+
@@ -1,6 +1,6 @@
1
- # note: allow require 'football/sources' too
2
- # (in addition to require 'football-sources')
3
-
4
- require_relative '../football-sources'
5
-
6
-
1
+ # note: allow require 'football/sources' too
2
+ # (in addition to require 'football-sources')
3
+
4
+ require_relative '../football-sources'
5
+
6
+
@@ -0,0 +1,68 @@
1
+
2
+
3
+ module Fbgen
4
+
5
+
6
+ class Job ## todo/check: use a module (NOT a class) - why? why not?
7
+ ## note - source expected module/class e.g. Footballdata/Worldfootball e.g.
8
+ def self.download( datasets, source: )
9
+ datasets.each_with_index do |dataset,i|
10
+ league = dataset[0]
11
+ seasons = dataset[1]
12
+
13
+ puts "downloading [#{i+1}/#{datasets.size}] #{league}..."
14
+ seasons.each_with_index do |season,j|
15
+ puts " season [#{j+1}/#{season.size}] #{league} #{season}..."
16
+ source.schedule( league: league,
17
+ season: season )
18
+ end
19
+ end
20
+ end
21
+
22
+ def self.convert( datasets, source: )
23
+ datasets.each_with_index do |dataset,i|
24
+ league = dataset[0]
25
+ seasons = dataset[1]
26
+
27
+ puts "converting [#{i+1}/#{datasets.size}] #{league}..."
28
+ seasons.each_with_index do |season,j|
29
+ puts " season [#{j+1}/#{season.size}] #{league} #{season}..."
30
+ source.convert( league: league,
31
+ season: season )
32
+ end
33
+ end
34
+ end
35
+ end # class Job
36
+
37
+
38
+ ## change download? to cache - true/false - why? why not?
39
+ ## change push: to sync - true/false - why? why not?
40
+ def self.process( datasets,
41
+ source:,
42
+ download: false,
43
+ push: false )
44
+
45
+ Job.download( datasets, source: source ) if download
46
+
47
+ ## always pull before push!! (use fast_forward)
48
+ gh = SportDb::GitHubSync.new( datasets )
49
+ gh.git_fast_forward_if_clean if push
50
+
51
+
52
+ Job.convert( datasets, source: source )
53
+
54
+ if push
55
+ Writer.config.out_dir = SportDb::GitHubSync.root # e.g. "/sports/openfootball"
56
+ else
57
+ ## fix/fix - use default - do not (re)set here - why? why not?
58
+ Writer.config.out_dir = './tmp'
59
+ end
60
+
61
+ Writer::Job.write( datasets,
62
+ source: source.config.convert.out_dir )
63
+
64
+ ## todo/fix: add a getch or something to hit return before commiting pushing - why? why not?
65
+ gh.git_push_if_changes if push
66
+ end
67
+
68
+ end # module Fbgen
@@ -1,19 +1,19 @@
1
-
2
- module FootballSources
3
- MAJOR = 0 ## todo: namespace inside version or something - why? why not??
4
- MINOR = 1
5
- PATCH = 0
6
- VERSION = [MAJOR,MINOR,PATCH].join('.')
7
-
8
- def self.version
9
- VERSION
10
- end
11
-
12
- def self.banner
13
- "football-sources/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
14
- end
15
-
16
- def self.root
17
- File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
18
- end
19
- end # module FootballSources
1
+
2
+ module FootballSources
3
+ MAJOR = 0 ## todo: namespace inside version or something - why? why not??
4
+ MINOR = 2
5
+ PATCH = 0
6
+ VERSION = [MAJOR,MINOR,PATCH].join('.')
7
+
8
+ def self.version
9
+ VERSION
10
+ end
11
+
12
+ def self.banner
13
+ "football-sources/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in (#{root})"
14
+ end
15
+
16
+ def self.root
17
+ File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
18
+ end
19
+ end # module FootballSources
@@ -1,57 +1,21 @@
1
- require 'webget/football'
2
-
3
-
4
- # require 'sportdb/formats' ## for Season etc.
5
- require 'sportdb/catalogs' ## note: incl. deps csvreader etc.
6
-
7
-
8
-
9
- #############
10
- ## todo/fix: reuse a "original" CsvMatchWriter
11
- ## how? why? why not?
12
- ###############
13
- module Cache
14
- class CsvMatchWriter
15
-
16
- def self.csv_encode( values )
17
- ## quote values that incl. a comma
18
- values.map do |value|
19
- if value.index(',')
20
- puts "** rec with field with comma >#{value}< in:"
21
- pp values
22
- %Q{"#{value}"}
23
- else
24
- value
25
- end
26
- end.join( ',' )
27
- end
28
-
29
- def self.write( path, recs, headers: )
30
- ## for convenience - make sure parent folders/directories exist
31
- FileUtils.mkdir_p( File.dirname( path )) unless Dir.exist?( File.dirname( path ))
32
-
33
- File.open( path, 'w:utf-8' ) do |f|
34
- f.write( headers.join(',')) ## e.g. Date,Team 1,FT,HT,Team 2
35
- f.write( "\n" )
36
- recs.each do |values|
37
- f.write( csv_encode( values ))
38
- f.write( "\n" )
39
- end
40
- end
41
- end
42
- end # class CsvMatchWriter
43
- end # module Cache
44
-
45
-
46
-
47
-
48
- ###
49
- # our own code
50
- require 'football-sources/version' # let version always go first
51
-
52
- require 'football-sources/apis'
53
- require 'football-sources/worldfootball'
54
- require 'football-sources/fbref'
55
-
56
-
57
- puts FootballSources.banner # say hello
1
+
2
+
3
+ # require 'sportdb/formats' ## for Season etc.
4
+ require 'sportdb/catalogs' ## note: incl. deps csvreader etc.
5
+ require 'sportdb/writers'
6
+
7
+
8
+ require 'footballdata' # e.g. football-data.org (api)
9
+ require 'worldfootball' # e.g. weltfussball.de (web)
10
+
11
+
12
+
13
+ ###
14
+ # our own code
15
+ require_relative 'football-sources/version' # let version always go first
16
+ require_relative 'football-sources/process'
17
+
18
+
19
+
20
+
21
+ puts FootballSources.banner # say hello