sportdb-structs 0.2.1 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9431034364f7a840395b78fcf67ceb649ee9ca0066cb7431004013cec474d01
4
- data.tar.gz: 31df641c63e132a6c957768341e3b42417ca9f6b6837bb5bde541bd3143b2d68
3
+ metadata.gz: a3fbeabfa958e34c5c809d3b923d528818f6fac42b7e72165e49d5d77d60314c
4
+ data.tar.gz: 746d77f86ac8f8e1b5f8c8a928ee43a34714707c3dc026627e7322d9db3752df
5
5
  SHA512:
6
- metadata.gz: bbe06e842890afab3ff027151ccf0f8cf23fa225aa7b7b4b9acc8462db689a5d03e1931f1ac0489dfd250875f5e751ef17007c36261b36ae6c3ee76ee70a6b74
7
- data.tar.gz: 467780063aeb3926f338cd10e7e0977e5c60aaef69c999f942ef3b594963433851cbfe3a671da57167ab0b822c8a3cf61f0f8fed100c429798eee48f8acbb3e6
6
+ metadata.gz: 0fa12c96f27937106ac161ff8377f7a9a3a1b9ed100d756b87e3cbac82c4f1574a14eb1149a54328368485932d18bb73aa98738a82a59e720c56ec47f5fb3087
7
+ data.tar.gz: 5271fbd2f5a510c44cf13520681397b541afa47481f33f475fe14ea910b5cc21bead7705838d4c0240ad2debab6fb489ae33e7b26e5c4c463e5120f009825203
data/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ### 0.2.1
1
+ ### 0.3.1
2
2
 
3
3
  ### 0.0.1 / 2020-08-24
4
4
 
data/Manifest.txt CHANGED
@@ -3,20 +3,17 @@ Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
5
  lib/sportdb/structs.rb
6
- lib/sportdb/structs/config.rb
7
- lib/sportdb/structs/goal_parser_csv.rb
8
- lib/sportdb/structs/match_parser_csv.rb
9
- lib/sportdb/structs/match_status_parser.rb
6
+ lib/sportdb/structs/country.rb
7
+ lib/sportdb/structs/event_info.rb
8
+ lib/sportdb/structs/goal.rb
9
+ lib/sportdb/structs/ground.rb
10
+ lib/sportdb/structs/group.rb
11
+ lib/sportdb/structs/league.rb
12
+ lib/sportdb/structs/match.rb
13
+ lib/sportdb/structs/matchlist.rb
10
14
  lib/sportdb/structs/name_helper.rb
11
- lib/sportdb/structs/structs/country.rb
12
- lib/sportdb/structs/structs/goal.rb
13
- lib/sportdb/structs/structs/ground.rb
14
- lib/sportdb/structs/structs/group.rb
15
- lib/sportdb/structs/structs/league.rb
16
- lib/sportdb/structs/structs/match.rb
17
- lib/sportdb/structs/structs/matchlist.rb
18
- lib/sportdb/structs/structs/round.rb
19
- lib/sportdb/structs/structs/standings.rb
20
- lib/sportdb/structs/structs/team.rb
21
- lib/sportdb/structs/structs/team_usage.rb
15
+ lib/sportdb/structs/round.rb
16
+ lib/sportdb/structs/standings.rb
17
+ lib/sportdb/structs/team.rb
18
+ lib/sportdb/structs/team_usage.rb
22
19
  lib/sportdb/structs/version.rb
data/README.md CHANGED
@@ -5,7 +5,6 @@
5
5
  * bugs :: [github.com/sportdb/sport.db/issues](https://github.com/sportdb/sport.db/issues)
6
6
  * gem :: [rubygems.org/gems/sportdb-structs](https://rubygems.org/gems/sportdb-structs)
7
7
  * rdoc :: [rubydoc.info/gems/sportdb-structs](http://rubydoc.info/gems/sportdb-structs)
8
- * forum :: [opensport](http://groups.google.com/group/opensport)
9
8
 
10
9
 
11
10
 
data/Rakefile CHANGED
@@ -20,15 +20,12 @@ Hoe.spec 'sportdb-structs' do
20
20
  self.licenses = ['Public Domain']
21
21
 
22
22
  self.extra_deps = [
23
- ['alphabets', '>= 1.0.0'],
24
- ['date-formats', '>= 1.0.2'],
23
+ ['alphabets', '>= 1.0.2'],
25
24
  ['score-formats', '>= 0.1.1'],
26
25
  ['season-formats', '>= 0.0.1'],
27
- ['csvreader', '>= 1.2.4'],
28
- ['sportdb-langs', '>= 0.1.1'],
29
26
  ]
30
27
 
31
28
  self.spec_extras = {
32
- required_ruby_version: '>= 2.2.2'
29
+ required_ruby_version: '>= 3.1.0'
33
30
  }
34
31
  end
@@ -47,6 +47,15 @@ class Country
47
47
  @tags = tags
48
48
  end
49
49
 
50
+ def pretty_print( printer )
51
+ buf = String.new
52
+ buf << "<Country: #{@key} - #{@name} (#{@code})"
53
+ buf << "|#{@alt_names.join('|')}" if @alt_names && !@alt_names.empty?
54
+ buf << ", #{@tags.join('|')})" if @tags && !@tags.empty?
55
+ buf << ">"
56
+
57
+ printer.text( buf )
58
+ end
50
59
  end # class Country
51
60
 
52
61
  end # module Sports
@@ -0,0 +1,65 @@
1
+ module Sports
2
+
3
+ class EventInfo
4
+ ## "high level" info (summary) about event
5
+ ## (like a "wikipedia infobox")
6
+ ## use for checking dataset imports; lets you check e.g.
7
+ ## - dates within range
8
+ ## - number of teams e.g. 20
9
+ ## - matches played e.g. 380
10
+ ## - goals scored e.g. 937
11
+ ## etc.
12
+
13
+ attr_reader :league,
14
+ :season,
15
+ :teams,
16
+ :matches,
17
+ :goals,
18
+ :start_date,
19
+ :end_date
20
+
21
+ def initialize( league:, season:,
22
+ start_date: nil, end_date: nil,
23
+ teams: nil,
24
+ matches: nil,
25
+ goals: nil )
26
+
27
+ @league = league
28
+ @season = season
29
+
30
+ @start_date = start_date
31
+ @end_date = end_date
32
+
33
+ @teams = teams ## todo/check: rename/use teams_count ??
34
+ @matches = matches ## todo/check: rename/use match_count ??
35
+ @goals = goals
36
+ end
37
+
38
+ def include?( date )
39
+ ## todo/fix: add options e.g.
40
+ ## - add delta/off_by_one or such?
41
+ ## - add strict (for) only return true if date range (really) defined (no generic auto-rules)
42
+
43
+ ### note: for now allow off by one error (via timezone/local time errors)
44
+ ## todo/fix: issue warning if off by one!!!!
45
+ if @start_date && @end_date
46
+ date >= (@start_date-1) &&
47
+ date <= (@end_date+1)
48
+ else
49
+ if @season.year?
50
+ # assume generic rule
51
+ ## same year e.g. Jan 1 - Dec 31; always true for now
52
+ date.year == @season.start_year
53
+ else
54
+ # assume generic rule
55
+ ## July 1 - June 30 (Y+1)
56
+ ## - todo/check -start for some countries/leagues in June 1 or August 1 ????
57
+ date >= Date.new( @season.start_year, 7, 1 ) &&
58
+ date <= Date.new( @season.end_year, 6, 30 )
59
+ end
60
+ end
61
+ end # method include?
62
+ alias_method :between?, :include?
63
+ end # class EventInfo
64
+
65
+ end # module Sports
@@ -0,0 +1,78 @@
1
+
2
+ module Sports
3
+
4
+ class Goal ### nested (non-freestanding) inside match (match is parent)
5
+ attr_reader :score1,
6
+ :score2,
7
+ :team,
8
+ :player,
9
+ :minute,
10
+ :offset,
11
+ :owngoal,
12
+ :penalty,
13
+ :notes
14
+
15
+ ## add alias for player => name - why? why not?
16
+ alias_method :name, :player
17
+
18
+
19
+ def owngoal?() @owngoal==true; end
20
+ def penalty?() @penalty==true; end
21
+ def team1?() @team == 1; end
22
+ def team2?() @team == 2; end
23
+
24
+
25
+ ## note: make score1,score2 optional for now !!!!
26
+ def initialize( team:,
27
+ player:,
28
+ minute:,
29
+ offset: nil,
30
+ owngoal: false,
31
+ penalty: false,
32
+ score1: nil,
33
+ score2: nil,
34
+ notes: nil
35
+ )
36
+ @score1 = score1
37
+ @score2 = score2
38
+
39
+ @team = team # 1 or 2
40
+ @player = player
41
+ @minute = minute
42
+ @offset = offset
43
+ @owngoal = owngoal
44
+ @penalty = penalty
45
+ @notes = notes
46
+ end
47
+
48
+ def state
49
+ [@score1, @score2,
50
+ @team,
51
+ @player, @minute, @offset, @owngoal, @penalty,
52
+ @notes
53
+ ]
54
+ end
55
+
56
+ def ==(o)
57
+ o.class == self.class && o.state == state
58
+ end
59
+
60
+ def pretty_print( printer )
61
+ buf = String.new
62
+ buf << "<Goal: #{@score1 ? @score1 : '?'}-#{@score2 ? @score2 : '?'}"
63
+ buf << " #{@player} #{@minute}"
64
+ buf << "+#{@offset}" if @offset && @offset > 0
65
+ buf << "'"
66
+ buf << " (o.g.)" if @owngoal
67
+ buf << " (pen.)" if @penalty
68
+ buf << " for #{@team}" ### team 1 or 2 - use home/away
69
+ buf << " -- #{@notes}" if @notes
70
+ buf << ">"
71
+
72
+ printer.text( buf )
73
+ end
74
+ end # class Goal
75
+
76
+
77
+ end # module Sports
78
+
@@ -11,14 +11,14 @@ class Group
11
11
  @teams = teams
12
12
  end
13
13
 
14
- def pretty_print( printer )
15
- ## todo/check - how to display/format key - use () or not - why? why not?
14
+ def pretty_print( printer )
15
+ ## todo/check - how to display/format key - use () or not - why? why not?
16
16
  buf = String.new
17
17
  buf << "<Group: #{@key ? @key : '?'} - #{@name} "
18
18
  buf << @teams.pretty_print_inspect
19
19
  buf << ">"
20
-
21
- printer.text( buf )
20
+
21
+ printer.text( buf )
22
22
  end
23
23
  end # class Group
24
24
  end # module Sports
@@ -27,6 +27,35 @@ class League
27
27
  alias_method :club?, :clubs?
28
28
  alias_method :national_team?, :national_teams?
29
29
 
30
+ =begin
31
+ @alt_names=[],
32
+ @clubs=true,
33
+ @country=<Country: at - Austria (AUT)|Österreich [de], fifa|uefa)>,
34
+ @intl=false,
35
+ @key="at.1",
36
+ @name="Bundesliga">,
37
+ =end
38
+
39
+ def pretty_print( printer )
40
+ buf = String.new
41
+ buf << "<League"
42
+ buf << " INTL" if @intl
43
+ buf << if @clubs
44
+ " CLUBS"
45
+ else
46
+ " NATIONAL TEAMS"
47
+ end
48
+ buf << ": #{@key} - #{@name}"
49
+ buf << "|#{@alt_names.join('|')}" if @alt_names && !@alt_names.empty?
50
+ buf << ", #{@country.name} (#{@country.code})" if @country
51
+ buf << ">"
52
+
53
+ printer.text( buf )
54
+ end
55
+
56
+
57
+
58
+
30
59
  end # class League
31
60
 
32
61
  end # module Sports
@@ -3,7 +3,7 @@ module SportDb
3
3
  module Module
4
4
  module Structs
5
5
  MAJOR = 0 ## todo: namespace inside version or something - why? why not??
6
- MINOR = 2
6
+ MINOR = 3
7
7
  PATCH = 1
8
8
  VERSION = [MAJOR,MINOR,PATCH].join('.')
9
9
 
@@ -1,85 +1,38 @@
1
1
  ## 3rd party gems
2
- require 'alphabets' # downcase_i18n, unaccent, variants, ...
3
- require 'date/formats' # DateFormats.parse, find!, ...
2
+ require 'alphabets' # unaccent, downcase_i18n, variants, ...
4
3
  require 'season/formats' # Season.parse, ...
5
4
  require 'score/formats'
6
- require 'csvreader'
7
-
8
-
9
- def read_csv( path, sep: nil,
10
- symbolize_names: nil )
11
- opts = {}
12
- opts[:sep] = sep if sep
13
- opts[:header_converters] = :symbol if symbolize_names
14
-
15
- CsvHash.read( path, **opts )
16
- end
17
-
18
- def parse_csv( txt, sep: nil,
19
- symbolize_names: nil )
20
- opts = {}
21
- opts[:sep] = sep if sep
22
- opts[:header_converters] = :symbol if symbolize_names
23
-
24
- CsvHash.parse( txt, **opts )
25
- end
26
-
27
-
28
-
29
- ## more sportdb libs/gems
30
- require 'sportdb/langs'
31
-
32
-
33
- ## todo/fix: move shortcut up to sportdb/langs!!!
34
- module SportDb
35
- Logging = LogUtils::Logging ## logging machinery shortcut; use LogUtils for now
36
- end
37
-
38
- ## let's put test configuration in its own namespace / module
39
- module SportDb
40
- class Test ## todo/check: works with module too? use a module - why? why not?
41
-
42
- ####
43
- # todo/fix: find a better way to configure shared test datasets - why? why not?
44
- # note: use one-up (..) directory for now as default - why? why not?
45
- def self.data_dir() @data_dir ||= '../test'; end
46
- def self.data_dir=( path ) @data_dir = path; end
47
- end
48
- end # module SportDb
49
-
50
-
51
- ## todo/check: move up config to langs too - why? why not?
52
-
53
-
54
5
 
55
6
 
56
7
  ###
57
8
  # our own code
58
- require 'sportdb/structs/version' # let version always go first
59
- require 'sportdb/structs/config' # let "global" config "framework" go next - why? why not?
9
+ require_relative 'structs/version' # let version always go first
10
+
11
+ require_relative 'structs/country'
12
+ require_relative 'structs/league'
13
+ require_relative 'structs/team'
14
+ require_relative 'structs/ground'
15
+ require_relative 'structs/round'
16
+ require_relative 'structs/group'
17
+ require_relative 'structs/goal'
18
+ require_relative 'structs/match'
60
19
 
20
+ require_relative 'structs/matchlist'
21
+ require_relative 'structs/standings'
22
+ require_relative 'structs/team_usage'
61
23
 
62
- require 'sportdb/structs/name_helper'
24
+ require_relative 'structs/event_info'
63
25
 
64
- require 'sportdb/structs/structs/country'
65
- require 'sportdb/structs/structs/league'
66
- require 'sportdb/structs/structs/team'
67
- require 'sportdb/structs/structs/round'
68
- require 'sportdb/structs/structs/group'
69
- require 'sportdb/structs/structs/goal'
70
- require 'sportdb/structs/structs/match'
71
- require 'sportdb/structs/structs/matchlist'
72
- require 'sportdb/structs/structs/standings'
73
- require 'sportdb/structs/structs/team_usage'
74
26
 
75
- require 'sportdb/structs/structs/ground'
27
+ ## shared support helpers/machinery
28
+ require_relative 'structs/name_helper'
76
29
 
77
30
 
78
31
  ##
79
32
  ## todo/fix - move "inline" player to structs/player file !!!!
80
33
 
81
34
  module Sports
82
- ### note - own classes for National(Squad)Player and
35
+ ### note - own classes for National(Squad)Player and
83
36
  ## Club(Squad)Player and such in use
84
37
 
85
38
  class Player
@@ -94,7 +47,7 @@ class Player
94
47
 
95
48
  def initialize( name:,
96
49
  pos: nil,
97
- nat: nil,
50
+ nat: nil,
98
51
  height: nil,
99
52
  birthdate: nil,
100
53
  birthplace: nil )
@@ -112,51 +65,6 @@ end # module Sports
112
65
 
113
66
 
114
67
 
115
- require 'sportdb/structs/match_status_parser'
116
- require 'sportdb/structs/match_parser_csv'
117
- require 'sportdb/structs/goal_parser_csv'
118
-
119
-
120
-
121
-
122
- ### add convenience shortcut helpers
123
- module Sports
124
- class Match
125
- def self.read_csv( path, headers: nil, filters: nil, converters: nil, sep: nil )
126
- SportDb::CsvMatchParser.read( path,
127
- headers: headers,
128
- filters: filters,
129
- converters: converters,
130
- sep: sep )
131
- end
132
-
133
- def self.parse_csv( txt, headers: nil, filters: nil, converters: nil, sep: nil )
134
- SportDb::CsvMatchParser.parse( txt,
135
- headers: headers,
136
- filters: filters,
137
- converters: converters,
138
- sep: sep )
139
- end
140
- end # class Match
141
- end # module Sports
142
-
143
-
144
-
145
- module Sports
146
- ## lets you use
147
- ## Sports.configure do |config|
148
- ## config.lang = 'it'
149
- ## end
150
-
151
- ## note: just forward to SportDb::Import configuration!!!!!
152
- ## keep Sports module / namespace "clean"
153
- ## that is, only include data structures (e.g. Match,League,etc) for now - why? why not?
154
- def self.configure() yield( config ); end
155
- def self.config() SportDb::Import.config; end
156
- end # module Sports
157
-
158
-
159
-
160
68
  #####
161
69
  # note: add Sport and Football convenience alias - why? why not?
162
70
  Sport = Sports
@@ -165,7 +73,5 @@ Football = Sports
165
73
 
166
74
 
167
75
 
168
-
169
76
  puts SportDb::Module::Structs.banner # say hello
170
77
 
171
-
metadata CHANGED
@@ -1,31 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sportdb-structs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-27 00:00:00.000000000 Z
11
+ date: 2024-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: alphabets
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 1.0.0
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 1.0.0
27
- - !ruby/object:Gem::Dependency
28
- name: date-formats
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - ">="
@@ -66,34 +52,6 @@ dependencies:
66
52
  - - ">="
67
53
  - !ruby/object:Gem::Version
68
54
  version: 0.0.1
69
- - !ruby/object:Gem::Dependency
70
- name: csvreader
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: 1.2.4
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: 1.2.4
83
- - !ruby/object:Gem::Dependency
84
- name: sportdb-langs
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: 0.1.1
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: 0.1.1
97
55
  - !ruby/object:Gem::Dependency
98
56
  name: rdoc
99
57
  requirement: !ruby/object:Gem::Requirement
@@ -143,22 +101,19 @@ files:
143
101
  - README.md
144
102
  - Rakefile
145
103
  - lib/sportdb/structs.rb
146
- - lib/sportdb/structs/config.rb
147
- - lib/sportdb/structs/goal_parser_csv.rb
148
- - lib/sportdb/structs/match_parser_csv.rb
149
- - lib/sportdb/structs/match_status_parser.rb
104
+ - lib/sportdb/structs/country.rb
105
+ - lib/sportdb/structs/event_info.rb
106
+ - lib/sportdb/structs/goal.rb
107
+ - lib/sportdb/structs/ground.rb
108
+ - lib/sportdb/structs/group.rb
109
+ - lib/sportdb/structs/league.rb
110
+ - lib/sportdb/structs/match.rb
111
+ - lib/sportdb/structs/matchlist.rb
150
112
  - lib/sportdb/structs/name_helper.rb
151
- - lib/sportdb/structs/structs/country.rb
152
- - lib/sportdb/structs/structs/goal.rb
153
- - lib/sportdb/structs/structs/ground.rb
154
- - lib/sportdb/structs/structs/group.rb
155
- - lib/sportdb/structs/structs/league.rb
156
- - lib/sportdb/structs/structs/match.rb
157
- - lib/sportdb/structs/structs/matchlist.rb
158
- - lib/sportdb/structs/structs/round.rb
159
- - lib/sportdb/structs/structs/standings.rb
160
- - lib/sportdb/structs/structs/team.rb
161
- - lib/sportdb/structs/structs/team_usage.rb
113
+ - lib/sportdb/structs/round.rb
114
+ - lib/sportdb/structs/standings.rb
115
+ - lib/sportdb/structs/team.rb
116
+ - lib/sportdb/structs/team_usage.rb
162
117
  - lib/sportdb/structs/version.rb
163
118
  homepage: https://github.com/sportdb/sport.db
164
119
  licenses:
@@ -174,7 +129,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
174
129
  requirements:
175
130
  - - ">="
176
131
  - !ruby/object:Gem::Version
177
- version: 2.2.2
132
+ version: 3.1.0
178
133
  required_rubygems_version: !ruby/object:Gem::Requirement
179
134
  requirements:
180
135
  - - ">="
@@ -1,39 +0,0 @@
1
- module SportDb
2
- module Import
3
-
4
- class Configuration
5
- ##
6
- ## todo: allow configure of countries_dir like clubs_dir
7
- ## "fallback" and use a default built-in world/countries.txt
8
-
9
- ## note: catalog defined/added in sports-catalogs gem!!!
10
- ## attr_accessor :catalog
11
-
12
- attr_reader :lang
13
- def lang=(value)
14
- ## check/todo: always use to_sym - why? needed?
15
- DateFormats.lang = value
16
- ScoreFormats.lang = value
17
- SportDb.lang.lang = value
18
-
19
- ## todo/fix: change SportDb.lang to SportDb.parser.lang
20
- ## or lang_parser or utils or someting !!!!
21
- ## use Sport.lang only as a read-only shortcut
22
- # a la catalog for config.lang!!!!
23
- end
24
-
25
- end # class Configuration
26
-
27
-
28
- ## lets you use
29
- ## SportDb::Import.configure do |config|
30
- ## config.lang = 'it'
31
- ## end
32
- def self.configure() yield( config ); end
33
-
34
- def self.config() @config ||= Configuration.new; end
35
-
36
-
37
- end # module Import
38
- end # module SportDb
39
-
@@ -1,28 +0,0 @@
1
-
2
- module SportDb
3
- class CsvGoalParser
4
-
5
-
6
- def self.read( path )
7
- txt = File.open( path, 'r:utf-8' ) {|f| f.read } ## note: make sure to use (assume) utf-8
8
- parse( txt )
9
- end
10
-
11
- def self.parse( txt )
12
- new( txt ).parse
13
- end
14
-
15
-
16
- def initialize( txt )
17
- @txt = txt
18
- end
19
-
20
- def parse
21
- rows = parse_csv( @txt )
22
- recs = rows.map { |row| Sports::GoalEvent.build( row ) }
23
- ## pp recs[0]
24
- recs
25
- end
26
-
27
- end # class CsvGoalParser
28
- end # module Sports