footty 0.4.0 → 0.4.1
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/{HISTORY.md → CHANGELOG.md} +3 -3
- data/Manifest.txt +3 -2
- data/README.md +86 -80
- data/Rakefile +30 -30
- data/bin/footty +5 -5
- data/lib/footty.rb +160 -152
- data/lib/footty/client.rb +106 -103
- data/lib/footty/version.rb +14 -14
- data/test/test_client_euro.rb +103 -0
- data/test/{test_client.rb → test_client_worldcup.rb} +21 -20
- metadata +24 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 879022e67b5a32b7c48593dbe546a6fc3ceeba3a14bc2e64ecc6e6cea6004b0a
|
4
|
+
data.tar.gz: b9075358a339760d56d5ac282a71859d1154002100e20b142d4f1dab44562676
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12825097748d31665a168847c9aa0c017fbd21cc4353b7d9917ebaf0553ef1b0b7ab34995c7c8f5c8f0da2b7d740ce7c12ac3b7d113bdd85f58f07d480fa41d8
|
7
|
+
data.tar.gz: 8c7719e5dc9403397c4feaa10886acf04f5d2bc329f81f4a9069948ec4c17f379cab1c836f573099b9968b673b5b152b7e977e9885bf31c348e384e891a114a7
|
data/{HISTORY.md → CHANGELOG.md}
RENAMED
@@ -1,3 +1,3 @@
|
|
1
|
-
### 1.0.0 / 2018-06-09
|
2
|
-
|
3
|
-
* Everything is new (again). First release.
|
1
|
+
### 1.0.0 / 2018-06-09
|
2
|
+
|
3
|
+
* Everything is new (again). First release.
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -1,80 +1,86 @@
|
|
1
|
-
# footty - football.db command line client for
|
2
|
-
|
3
|
-
* home :: [github.com/sportdb/footty](https://github.com/sportdb/footty)
|
4
|
-
* bugs :: [github.com/sportdb/footty/issues](https://github.com/sportdb/footty/issues)
|
5
|
-
* gem :: [rubygems.org/gems/footty](https://rubygems.org/gems/footty)
|
6
|
-
* rdoc :: [rubydoc.info/gems/footty](http://rubydoc.info/gems/footty)
|
7
|
-
* forum :: [opensport](http://groups.google.com/group/opensport)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
## Usage - Who's playing today?
|
14
|
-
|
15
|
-
The footty command line tool lets you query the online football.db HTTP JSON API services
|
16
|
-
for upcoming or past matches. For example:
|
17
|
-
|
18
|
-
$ footty # Defaults to today's
|
19
|
-
|
20
|
-
prints on Jun/14
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
$ footty
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
$ footty
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
$ footty
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
$ footty
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
##
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
1
|
+
# footty - football.db command line client for european ("euro") championship 2020 (in 2021) and more
|
2
|
+
|
3
|
+
* home :: [github.com/sportdb/footty](https://github.com/sportdb/footty)
|
4
|
+
* bugs :: [github.com/sportdb/footty/issues](https://github.com/sportdb/footty/issues)
|
5
|
+
* gem :: [rubygems.org/gems/footty](https://rubygems.org/gems/footty)
|
6
|
+
* rdoc :: [rubydoc.info/gems/footty](http://rubydoc.info/gems/footty)
|
7
|
+
* forum :: [opensport](http://groups.google.com/group/opensport)
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
## Usage - Who's playing today?
|
14
|
+
|
15
|
+
The footty command line tool lets you query the online football.db HTTP JSON API services
|
16
|
+
for upcoming or past matches. For example:
|
17
|
+
|
18
|
+
$ footty # Defaults to today's euro 2020 (in 2021) matches
|
19
|
+
|
20
|
+
prints on Jun/14 2021:
|
21
|
+
|
22
|
+
#20 Mon Jun/14 Scotland (SCO) vs Czech Republic (CZE) Group D / Matchday 1
|
23
|
+
#25 Mon Jun/14 Poland (POL) vs Slovakia (SVK) Group E / Matchday 1
|
24
|
+
#26 Mon Jun/14 Spain (ESP) vs Sweden (SWE) Group E / Matchday 1
|
25
|
+
|
26
|
+
and the next day with `footty yesterday`:
|
27
|
+
|
28
|
+
#20 Mon Jun/14 Scotland (SCO) 0-2 (0-1) Czech Republic (CZE) Group D / Matchday 1
|
29
|
+
#25 Mon Jun/14 Poland (POL) 1-2 (0-1) Slovakia (SVK) Group E / Matchday 1
|
30
|
+
#26 Mon Jun/14 Spain (ESP) 0-0 Sweden (SWE) Group E / Matchday 1
|
31
|
+
|
32
|
+
prints on Jun/15 2021:
|
33
|
+
|
34
|
+
#31 Tue Jun/15 Hungary (HUN) vs Portugal (POR) Group F / Matchday 1
|
35
|
+
#32 Tue Jun/15 France (FRA) vs Germany (GER) Group F / Matchday 1
|
36
|
+
|
37
|
+
and so on.
|
38
|
+
Use `tomorrow` or `t` or `+1` to print tomorrow's matches e.g.:
|
39
|
+
|
40
|
+
$ footty tomorrow # -or-
|
41
|
+
$ footty t
|
42
|
+
|
43
|
+
Use `yesterday` or `y` or `-1` to print yesterday's matches e.g.:
|
44
|
+
|
45
|
+
$ footty yesterday # -or-
|
46
|
+
$ footty y
|
47
|
+
|
48
|
+
Use `upcoming` or `up` or `u` to print all upcoming matches e.g.:
|
49
|
+
|
50
|
+
$ footty upcoming # -or-
|
51
|
+
$ footty up
|
52
|
+
|
53
|
+
Use `past` or `p` to print all past matches e.g.:
|
54
|
+
|
55
|
+
$ footty past # -or-
|
56
|
+
$ footty p
|
57
|
+
|
58
|
+
|
59
|
+
That's it. Enjoy the beautiful game.
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
## Trivia
|
65
|
+
|
66
|
+
Why tty? tty stands for teletype (tty) writer and is the old traditional (short) name for the unix command line.
|
67
|
+
|
68
|
+
|
69
|
+
## Install
|
70
|
+
|
71
|
+
Just install the gem:
|
72
|
+
|
73
|
+
$ gem install footty
|
74
|
+
|
75
|
+
|
76
|
+
## License
|
77
|
+
|
78
|
+
The `footty` scripts are dedicated to the public domain.
|
79
|
+
Use it as you please with no restrictions whatsoever.
|
80
|
+
|
81
|
+
|
82
|
+
## Questions? Comments?
|
83
|
+
|
84
|
+
Send them along to the
|
85
|
+
[Open Sports & Friends Forum/Mailing List](http://groups.google.com/group/opensport).
|
86
|
+
Thanks!
|
data/Rakefile
CHANGED
@@ -1,30 +1,30 @@
|
|
1
|
-
require 'hoe'
|
2
|
-
require './lib/footty/version.rb'
|
3
|
-
|
4
|
-
Hoe.spec 'footty' do
|
5
|
-
|
6
|
-
self.version = Footty::VERSION
|
7
|
-
|
8
|
-
self.summary = 'footty - football.db command line client for
|
9
|
-
self.description = summary
|
10
|
-
|
11
|
-
self.urls =
|
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
|
18
|
-
self.history_file = '
|
19
|
-
|
20
|
-
self.extra_deps = [
|
21
|
-
['logutils' ],
|
22
|
-
['fetcher']
|
23
|
-
]
|
24
|
-
|
25
|
-
self.licenses = ['Public Domain']
|
26
|
-
|
27
|
-
self.spec_extras = {
|
28
|
-
:
|
29
|
-
}
|
30
|
-
end
|
1
|
+
require 'hoe'
|
2
|
+
require './lib/footty/version.rb'
|
3
|
+
|
4
|
+
Hoe.spec 'footty' do
|
5
|
+
|
6
|
+
self.version = Footty::VERSION
|
7
|
+
|
8
|
+
self.summary = 'footty - football.db command line client for european "euro" championship 2020 (in 2021) and more - who is playing today?'
|
9
|
+
self.description = summary
|
10
|
+
|
11
|
+
self.urls = { home: 'https://github.com/sportdb/footty' }
|
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
|
+
['logutils' ],
|
22
|
+
['fetcher']
|
23
|
+
]
|
24
|
+
|
25
|
+
self.licenses = ['Public Domain']
|
26
|
+
|
27
|
+
self.spec_extras = {
|
28
|
+
required_ruby_version: '>= 2.3'
|
29
|
+
}
|
30
|
+
end
|
data/bin/footty
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'footty'
|
4
|
-
|
5
|
-
Footty.main
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'footty'
|
4
|
+
|
5
|
+
Footty.main
|
data/lib/footty.rb
CHANGED
@@ -1,152 +1,160 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require '
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
matches
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
match['
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
print "
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
end
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
1
|
+
## stdlibs
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
require 'json'
|
6
|
+
require 'pp'
|
7
|
+
|
8
|
+
|
9
|
+
## 3rd party gems/libs
|
10
|
+
## require 'props'
|
11
|
+
|
12
|
+
require 'logutils'
|
13
|
+
require 'fetcher'
|
14
|
+
|
15
|
+
|
16
|
+
# our own code
|
17
|
+
require 'footty/version' # let it always go first
|
18
|
+
require 'footty/client'
|
19
|
+
|
20
|
+
|
21
|
+
module Footty
|
22
|
+
|
23
|
+
def self.client
|
24
|
+
## note: hard code tournament / league for now
|
25
|
+
@client ||= Client.new( league: 'euro', year: 2020 ) ## use "singelton" / shared client
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
def self.main
|
31
|
+
puts banner # say hello
|
32
|
+
|
33
|
+
what = ARGV[0] || 'today'
|
34
|
+
what = what.downcase
|
35
|
+
|
36
|
+
## in the future make today "configurable" as param - why? why not?
|
37
|
+
today = Date.today
|
38
|
+
|
39
|
+
if ['yesterday', 'y', '-1'].include?( what )
|
40
|
+
matches = client.yesterdays_matches
|
41
|
+
if matches.empty?
|
42
|
+
puts "** No matches played yesterday.\n"
|
43
|
+
end
|
44
|
+
elsif ['tomorrow', 't', '+1', '1'].include?( what )
|
45
|
+
matches = client.tomorrows_matches
|
46
|
+
if matches.empty?
|
47
|
+
puts "** No matches scheduled tomorrow.\n"
|
48
|
+
end
|
49
|
+
elsif ['past', 'p', 'prev'].include?( what )
|
50
|
+
matches = client.past_matches
|
51
|
+
if matches.empty?
|
52
|
+
puts "** No matches played yet.\n"
|
53
|
+
end
|
54
|
+
elsif ['upcoming', 'up', 'u', 'next', 'n'].include?( what )
|
55
|
+
matches = client.upcoming_matches
|
56
|
+
if matches.empty?
|
57
|
+
puts "** No more matches scheduled.\n"
|
58
|
+
end
|
59
|
+
else
|
60
|
+
matches = client.todays_matches
|
61
|
+
|
62
|
+
## no matches today
|
63
|
+
if matches.empty?
|
64
|
+
puts "** No matches scheduled today.\n"
|
65
|
+
|
66
|
+
## note: was world cup 2018 - end date -- Date.new( 2018, 7, 11 )
|
67
|
+
if Date.today > Date.new( 2021, 7, 11 ) ## tournament is over, look back
|
68
|
+
puts "Past matches:"
|
69
|
+
matches = client.past_matches
|
70
|
+
else ## world cup is upcoming /in-progress,look forward
|
71
|
+
puts "Upcoming matches:"
|
72
|
+
matches = client.upcoming_matches
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
print_matches( matches )
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
def self.print_matches( matches )
|
85
|
+
## print games
|
86
|
+
|
87
|
+
today = Date.today
|
88
|
+
|
89
|
+
matches.each do |match|
|
90
|
+
print " %5s" % "\##{match['num']} "
|
91
|
+
|
92
|
+
date = Date.parse( match['date'] )
|
93
|
+
print "#{date.strftime('%a %b/%d')} " ## e.g. Thu Jun/14
|
94
|
+
if date > today
|
95
|
+
diff = (date - today).to_i
|
96
|
+
print "%10s" % "(in #{diff}d) "
|
97
|
+
end
|
98
|
+
|
99
|
+
print "%22s" % "#{match['team1']['name']} (#{match['team1']['code']})"
|
100
|
+
|
101
|
+
## todo/fix: add support for knockout scores
|
102
|
+
## with score1et/score1p (extra time and penalty)
|
103
|
+
if match['score1'] && match['score2']
|
104
|
+
print " #{match['score1']}-#{match['score2']} "
|
105
|
+
print "(#{match['score1i']}-#{match['score2i']}) "
|
106
|
+
else
|
107
|
+
print " vs "
|
108
|
+
end
|
109
|
+
|
110
|
+
print "%-22s" % "#{match['team2']['name']} (#{match['team2']['code']})"
|
111
|
+
|
112
|
+
if match['group']
|
113
|
+
print " #{match['group']} /" ## group phase/stage
|
114
|
+
end
|
115
|
+
|
116
|
+
print " #{match['round']} " ## knock out (k.o.) phase/stage
|
117
|
+
|
118
|
+
if match['stadium']
|
119
|
+
print " @ #{match['stadium']['name']}, #{match['city']}"
|
120
|
+
end
|
121
|
+
|
122
|
+
print "\n"
|
123
|
+
|
124
|
+
|
125
|
+
if match['goals1'] && match['goals2']
|
126
|
+
print " ["
|
127
|
+
match['goals1'].each_with_index do |goal,i|
|
128
|
+
print " " if i > 0
|
129
|
+
print "#{goal['name']}"
|
130
|
+
print " #{goal['minute']}"
|
131
|
+
print "+#{goal['offset']}" if goal['offset']
|
132
|
+
print "'"
|
133
|
+
print " (o.g.)" if goal['owngoal']
|
134
|
+
print " (pen.)" if goal['penalty']
|
135
|
+
end
|
136
|
+
match['goals2'].each_with_index do |goal,i|
|
137
|
+
if i == 0
|
138
|
+
print "; "
|
139
|
+
else
|
140
|
+
print " "
|
141
|
+
end
|
142
|
+
print "#{goal['name']}"
|
143
|
+
print " #{goal['minute']}"
|
144
|
+
print "+#{goal['offset']}" if goal['offset']
|
145
|
+
print "'"
|
146
|
+
print " (o.g.)" if goal['owngoal']
|
147
|
+
print " (pen.)" if goal['penalty']
|
148
|
+
end
|
149
|
+
print "]\n"
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
end # module Footty
|
157
|
+
|
158
|
+
|
159
|
+
|
160
|
+
Footty.main if __FILE__ == $0
|
data/lib/footty/client.rb
CHANGED
@@ -1,103 +1,106 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@
|
13
|
-
@
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
hash =
|
50
|
-
matches = select_matches( hash[ 'rounds' ] ) { |match| date
|
51
|
-
matches
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
matches.
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
matches = []
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
##
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
1
|
+
module Footty
|
2
|
+
|
3
|
+
|
4
|
+
class Client
|
5
|
+
|
6
|
+
include LogUtils::Logging
|
7
|
+
|
8
|
+
|
9
|
+
def initialize( league:, year: )
|
10
|
+
@worker = Fetcher::Worker.new
|
11
|
+
|
12
|
+
@league = league
|
13
|
+
@year = year
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
APIS = {
|
18
|
+
worldcup: 'https://github.com/openfootball/worldcup.json/raw/master/$year$/worldcup.json',
|
19
|
+
euro: 'https://github.com/openfootball/euro.json/raw/master/$year$/euro.json'
|
20
|
+
}
|
21
|
+
|
22
|
+
### note:
|
23
|
+
## cache ALL methods - only do one web request for match schedule & results
|
24
|
+
def get_matches
|
25
|
+
@data ||= begin
|
26
|
+
str = APIS[ @league.downcase.to_sym ]
|
27
|
+
str = str.gsub( '$year$', @year.to_s )
|
28
|
+
|
29
|
+
get( str ) ## use "memoized" / cached result
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
## for testing lets you use /round/1 etc.
|
37
|
+
def round( num )
|
38
|
+
h = get_matches
|
39
|
+
matches = h[ 'rounds' ][ num-1 ] ## note: rounds hash starts with zero (not 1)
|
40
|
+
matches
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def todays_matches( date: Date.today ) matches_for( date ); end
|
45
|
+
def tomorrows_matches( date: Date.today ) matches_for( date+1 ); end
|
46
|
+
def yesterdays_matches( date: Date.today ) matches_for( date-1 ); end
|
47
|
+
|
48
|
+
def matches_for( date )
|
49
|
+
hash = get_matches
|
50
|
+
matches = select_matches( hash[ 'rounds' ] ) { |match| date == Date.parse( match['date'] ) }
|
51
|
+
matches
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def upcoming_matches( date: Date.today )
|
56
|
+
## note: includes todays matches for now
|
57
|
+
hash = get_matches
|
58
|
+
matches = select_matches( hash[ 'rounds' ] ) { |match| date <= Date.parse( match['date'] ) }
|
59
|
+
matches
|
60
|
+
end
|
61
|
+
|
62
|
+
def past_matches( date: Date.today )
|
63
|
+
hash = get_matches
|
64
|
+
matches = select_matches( hash[ 'rounds' ] ) { |match| date > Date.parse( match['date'] ) }
|
65
|
+
## note reveserve matches (chronological order/last first)
|
66
|
+
matches.reverse
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def select_matches( rounds )
|
72
|
+
matches = []
|
73
|
+
rounds.each do |round|
|
74
|
+
round['matches'].each do |match|
|
75
|
+
if yield( match )
|
76
|
+
## hack: add (outer) round to match
|
77
|
+
match['round'] = round['name']
|
78
|
+
matches << match
|
79
|
+
else
|
80
|
+
## puts " skipping game play_date #{play_date}"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
matches
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
def get( str )
|
89
|
+
response = @worker.get_response( str )
|
90
|
+
|
91
|
+
if response.code == '200'
|
92
|
+
##
|
93
|
+
## fix/fix/todo/check:
|
94
|
+
## do we need to force utf-8 encoding? yes!!!!
|
95
|
+
## check for teams w/ non-ascii names
|
96
|
+
hash = JSON.parse( response.body )
|
97
|
+
## pp hash
|
98
|
+
hash
|
99
|
+
else
|
100
|
+
logger.error "fetch HTTP - #{response.code} #{response.message}"
|
101
|
+
nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end # class Client
|
106
|
+
end # module Footty
|
data/lib/footty/version.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
1
|
+
|
2
|
+
module Footty
|
3
|
+
VERSION = '0.4.1'
|
4
|
+
|
5
|
+
def self.banner
|
6
|
+
"footty/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in (#{root})"
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.root
|
10
|
+
File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_client_euro.rb
|
4
|
+
|
5
|
+
require 'helper'
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
class TestClientEuro < MiniTest::Test
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@client = Footty::Client.new( league: 'euro', year: 2020 )
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def test_getters
|
17
|
+
today = Date.new( 2021, 6, 15 )
|
18
|
+
|
19
|
+
todays = @client.todays_matches( date: today )
|
20
|
+
pp todays
|
21
|
+
assert_equal 2, todays.size
|
22
|
+
|
23
|
+
yesterdays = @client.yesterdays_matches( date: today )
|
24
|
+
pp yesterdays
|
25
|
+
assert_equal 3, yesterdays.size
|
26
|
+
|
27
|
+
tomorrows = @client.tomorrows_matches( date: today )
|
28
|
+
pp tomorrows
|
29
|
+
assert_equal 3, tomorrows.size
|
30
|
+
|
31
|
+
past = @client.past_matches( date: today )
|
32
|
+
pp past
|
33
|
+
|
34
|
+
upcoming = @client.upcoming_matches( date: today )
|
35
|
+
pp upcoming
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def test_todays_matches_2021_6_15
|
40
|
+
today = Date.new( 2021, 6, 15 )
|
41
|
+
ary = @client.todays_matches( date: today )
|
42
|
+
pp ary
|
43
|
+
=begin
|
44
|
+
[{"num"=>31,
|
45
|
+
"date"=>"2021-06-15",
|
46
|
+
"team1"=>{"name"=>"Hungary", "code"=>"HUN"},
|
47
|
+
"team2"=>{"name"=>"Portugal", "code"=>"POR"},
|
48
|
+
"score1"=>nil,
|
49
|
+
"score2"=>nil,
|
50
|
+
"score1i"=>nil,
|
51
|
+
"score2i"=>nil,
|
52
|
+
"group"=>"Group F",
|
53
|
+
"round"=>"Matchday 1"},
|
54
|
+
...
|
55
|
+
=end
|
56
|
+
|
57
|
+
assert_equal Array, ary.class ## for now just check return type (e.g. assume Array for parsed JSON data)
|
58
|
+
assert_equal 2, ary.size
|
59
|
+
assert_equal 'HUN', ary[0]['team1']['code']
|
60
|
+
assert_equal 'POR', ary[0]['team2']['code']
|
61
|
+
assert_equal 'Matchday 1', ary[0]['round']
|
62
|
+
# assert_equal 5, ary[0]['score1']
|
63
|
+
# assert_equal 0, ary[0]['score2']
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def test_todays_matches_2021_6_10
|
68
|
+
today = Date.new( 2021, 6, 10 )
|
69
|
+
ary = @client.todays_matches( date: today )
|
70
|
+
## note: returns empty array if no matches scheduled/playing today
|
71
|
+
pp ary
|
72
|
+
|
73
|
+
assert_equal Array, ary.class ## for now just check return type (e.g. assume Array for parsed JSON data)
|
74
|
+
assert ary.empty?
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
def test_euro_round_1
|
79
|
+
h = @client.round( 1 )
|
80
|
+
|
81
|
+
pp h
|
82
|
+
=begin
|
83
|
+
{"name"=>"Matchday 1",
|
84
|
+
"matches"=>
|
85
|
+
[{"num"=>1,
|
86
|
+
"date"=>"2021-06-11",
|
87
|
+
"team1"=>{"name"=>"Turkey", "code"=>"TUR"},
|
88
|
+
"team2"=>{"name"=>"Italy", "code"=>"ITA"},
|
89
|
+
"score1"=>0,
|
90
|
+
"score2"=>3,
|
91
|
+
"score1i"=>0,
|
92
|
+
"score2i"=>0,
|
93
|
+
"group"=>"Group A"},
|
94
|
+
=end
|
95
|
+
|
96
|
+
assert_equal 'TUR', h['matches'][0]['team1']['code']
|
97
|
+
assert_equal 'ITA', h['matches'][0]['team2']['code']
|
98
|
+
assert_equal 0, h['matches'][0]['score1']
|
99
|
+
assert_equal 3, h['matches'][0]['score2']
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
end # class TestClientEuro
|
@@ -1,36 +1,37 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_client_worldcup.rb
|
3
4
|
|
4
5
|
require 'helper'
|
5
6
|
|
6
7
|
|
7
8
|
|
8
|
-
class
|
9
|
+
class TestClientWorldCup < MiniTest::Test
|
9
10
|
|
10
11
|
def setup
|
11
|
-
@client = Footty.
|
12
|
+
@client = Footty::Client.new( league: 'worldcup', year: 2018 )
|
12
13
|
end
|
13
14
|
|
14
15
|
|
15
16
|
def test_getters
|
16
17
|
today = Date.new( 2018, 6, 16 )
|
17
18
|
|
18
|
-
todays = @client.
|
19
|
+
todays = @client.todays_matches( date: today )
|
19
20
|
pp todays
|
20
21
|
assert_equal 4, todays.size
|
21
22
|
|
22
|
-
yesterdays = @client.
|
23
|
+
yesterdays = @client.yesterdays_matches( date: today )
|
23
24
|
pp yesterdays
|
24
25
|
assert_equal 3, yesterdays.size
|
25
26
|
|
26
|
-
tomorrows = @client.
|
27
|
+
tomorrows = @client.tomorrows_matches( date: today )
|
27
28
|
pp tomorrows
|
28
29
|
assert_equal 3, tomorrows.size
|
29
30
|
|
30
|
-
past = @client.
|
31
|
+
past = @client.past_matches( date: today )
|
31
32
|
pp past
|
32
33
|
|
33
|
-
upcoming = @client.
|
34
|
+
upcoming = @client.upcoming_matches( date: today )
|
34
35
|
pp upcoming
|
35
36
|
end
|
36
37
|
|
@@ -38,7 +39,7 @@ class TestClient < MiniTest::Test
|
|
38
39
|
|
39
40
|
def test_todays_matches_2018_6_14
|
40
41
|
today = Date.new( 2018, 6, 14 )
|
41
|
-
ary = @client.
|
42
|
+
ary = @client.todays_matches( date: today )
|
42
43
|
## pp ary
|
43
44
|
=begin
|
44
45
|
[{"num"=>1,
|
@@ -62,13 +63,13 @@ class TestClient < MiniTest::Test
|
|
62
63
|
assert_equal 'RUS', ary[0]['team1']['code']
|
63
64
|
assert_equal 'KSA', ary[0]['team2']['code']
|
64
65
|
assert_equal 'Matchday 1', ary[0]['round']
|
65
|
-
|
66
|
-
|
66
|
+
assert_equal 5, ary[0]['score1']
|
67
|
+
assert_equal 0, ary[0]['score2']
|
67
68
|
end
|
68
69
|
|
69
70
|
def test_todays_matches_2018_6_10
|
70
71
|
today = Date.new( 2018, 6, 10 )
|
71
|
-
ary = @client.
|
72
|
+
ary = @client.todays_matches( date: today )
|
72
73
|
## note: returns empty array if no matches scheduled/playing today
|
73
74
|
pp ary
|
74
75
|
|
@@ -77,7 +78,7 @@ class TestClient < MiniTest::Test
|
|
77
78
|
end
|
78
79
|
|
79
80
|
def test_world_2018_round_1
|
80
|
-
h = @client.
|
81
|
+
h = @client.round( 1 )
|
81
82
|
|
82
83
|
## pp h
|
83
84
|
=begin
|
@@ -100,13 +101,13 @@ class TestClient < MiniTest::Test
|
|
100
101
|
|
101
102
|
assert_equal 'RUS', h['matches'][0]['team1']['code']
|
102
103
|
assert_equal 'KSA', h['matches'][0]['team2']['code']
|
103
|
-
|
104
|
-
|
104
|
+
assert_equal 5, h['matches'][0]['score1']
|
105
|
+
assert_equal 0, h['matches'][0]['score2']
|
105
106
|
end
|
106
107
|
|
107
108
|
|
108
109
|
def test_world_2018_round_2
|
109
|
-
h = @client.
|
110
|
+
h = @client.round( 2 )
|
110
111
|
|
111
112
|
## pp h
|
112
113
|
=begin
|
@@ -155,9 +156,9 @@ class TestClient < MiniTest::Test
|
|
155
156
|
|
156
157
|
assert_equal 'EGY', h['matches'][0]['team1']['code']
|
157
158
|
assert_equal 'URU', h['matches'][0]['team2']['code']
|
158
|
-
|
159
|
-
|
159
|
+
assert_equal 0, h['matches'][0]['score1']
|
160
|
+
assert_equal 1, h['matches'][0]['score2']
|
160
161
|
end
|
161
162
|
|
162
163
|
|
163
|
-
end # class
|
164
|
+
end # class TestClientWorldCup
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: footty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logutils
|
@@ -42,42 +42,48 @@ dependencies:
|
|
42
42
|
name: rdoc
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '4.0'
|
48
|
+
- - "<"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '7'
|
48
51
|
type: :development
|
49
52
|
prerelease: false
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
51
54
|
requirements:
|
52
|
-
- - "
|
55
|
+
- - ">="
|
53
56
|
- !ruby/object:Gem::Version
|
54
57
|
version: '4.0'
|
58
|
+
- - "<"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '7'
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: hoe
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
58
64
|
requirements:
|
59
65
|
- - "~>"
|
60
66
|
- !ruby/object:Gem::Version
|
61
|
-
version: '3.
|
67
|
+
version: '3.22'
|
62
68
|
type: :development
|
63
69
|
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
72
|
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version: '3.
|
69
|
-
description: footty - football.db command line client for
|
70
|
-
and more - who is playing today?
|
74
|
+
version: '3.22'
|
75
|
+
description: footty - football.db command line client for european "euro" championship
|
76
|
+
2020 (in 2021) and more - who is playing today?
|
71
77
|
email: opensport@googlegroups.com
|
72
78
|
executables:
|
73
79
|
- footty
|
74
80
|
extensions: []
|
75
81
|
extra_rdoc_files:
|
76
|
-
-
|
82
|
+
- CHANGELOG.md
|
77
83
|
- Manifest.txt
|
78
84
|
- README.md
|
79
85
|
files:
|
80
|
-
-
|
86
|
+
- CHANGELOG.md
|
81
87
|
- Manifest.txt
|
82
88
|
- README.md
|
83
89
|
- Rakefile
|
@@ -86,12 +92,13 @@ files:
|
|
86
92
|
- lib/footty/client.rb
|
87
93
|
- lib/footty/version.rb
|
88
94
|
- test/helper.rb
|
89
|
-
- test/
|
95
|
+
- test/test_client_euro.rb
|
96
|
+
- test/test_client_worldcup.rb
|
90
97
|
homepage: https://github.com/sportdb/footty
|
91
98
|
licenses:
|
92
99
|
- Public Domain
|
93
100
|
metadata: {}
|
94
|
-
post_install_message:
|
101
|
+
post_install_message:
|
95
102
|
rdoc_options:
|
96
103
|
- "--main"
|
97
104
|
- README.md
|
@@ -108,10 +115,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
115
|
- !ruby/object:Gem::Version
|
109
116
|
version: '0'
|
110
117
|
requirements: []
|
111
|
-
|
112
|
-
|
113
|
-
signing_key:
|
118
|
+
rubygems_version: 3.1.4
|
119
|
+
signing_key:
|
114
120
|
specification_version: 4
|
115
|
-
summary: footty - football.db command line client for
|
116
|
-
more - who is playing today?
|
121
|
+
summary: footty - football.db command line client for european "euro" championship
|
122
|
+
2020 (in 2021) and more - who is playing today?
|
117
123
|
test_files: []
|