basketball 0.0.14 → 0.0.16

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
2
  SHA256:
3
- metadata.gz: f115c20b1dfbaf07e291b7419481f55e089f416963b6edfb6a8d7ceab3d760d1
4
- data.tar.gz: 821d8d53808e33a2ee8e47e022e4d6ff041dbd385350563e87ed365595419df5
3
+ metadata.gz: f5be10590a625ef061cb6f7a80379710013ec3625fe215fa65bfddeda35bb1f5
4
+ data.tar.gz: 5eff4fd535bddae0bf080f2fd0be83b4cdc8da7cc28c04667a1ec7cfd84f1f55
5
5
  SHA512:
6
- metadata.gz: cd80e53d23a2379e009c2a554ddc99a807cd0e7e4069b4e69123ca1fccba14bf96d2b422d5f9d347ccd9be90c1a5b5e6d59b9235603f4fe5b9ab4f25ea218846
7
- data.tar.gz: ad921f64b359ac4466c5a16cc69c3e989f75ebd0a2a477d81fd3dd5df6db8d8de713be2b56f281b912e5bc02a1b97e5e928b4e0c3cd53da27cb62b8999601282
6
+ metadata.gz: 41e8aac1b7270794a5557b9e94b3b23bd0f5f7169c5c38f87401eaf12e6865efd4a1b8293a8cf6b6a41813ecc476750f538abc511ae4554e94c3cc732c6a5872
7
+ data.tar.gz: fd0fcc3117888b9c475efce63e5947de6f66950b3af98af9f4c551403749ab34fc6f989d3b48964bc29180be19c3af55931e5bb4ef67377f05dd83994ab82284
data/.rubocop.yml CHANGED
@@ -18,6 +18,9 @@ RSpec/ExampleLength:
18
18
  RSpec/NestedGroups:
19
19
  Max: 5
20
20
 
21
+ RSpec/MultipleExpectations:
22
+ Max: 2
23
+
21
24
  Metrics/ParameterLists:
22
25
  Max: 6
23
26
 
data/README.md CHANGED
@@ -12,12 +12,9 @@ Element | Description
12
12
  :------------ | :-----------
13
13
  **Arena** | Determines exhibition and regular season game outcomes.
14
14
  **Assessment** | When the Room needs to know who a Front Office wants to select, the Room will send the Front Office an Assessment. The Assessment is a report of where the team currently stands: players picked, players available, and round information.
15
- **basketball-draft-room** | Command-line executable script showing an example of how to consume the draft room aggregate root.
16
- **basketball-season-coordinator** | Command-line executable script showing an example of how to consume the season coordinator aggregate root.
17
15
  **Calendar** | Stores important boundary dates (exhibition start, exhibition end, season start, and season end).
18
16
  **Conference** | A collection of Divisions.
19
- **Coordinator CLI** | Underlying Ruby class that powers the `basketball-season-coordinator` script. Basically a terminal wrapper over the Coordinator object.
20
- **Coordinator Repository** | Understands how to save and load Coordinator objects from JSON files on disk.
17
+ **Coordinator Repository** | Understands how to save and load Coordinator objects.
21
18
  **Coordinator** | Object which can take a League, Calendar, Games, and an Arena and provide an iterable interface to enumerate through days and simulate games as results.
22
19
  **Detail** | Re-representation of a Result object but from a specific team's perspective.
23
20
  **Division** | A collection of teams.
@@ -25,7 +22,7 @@ Element | Description
25
22
  **Exhibition** | Pre-season game which has no impact to team record.
26
23
  **External Dependency** | Some outside system which this library or portions of this library are dependent on.
27
24
  **File Store** | Implements a store that can interact with the underlying File System.
28
- **File System** | Local operating system that the CLI will use for persistence.
25
+ **File System** | Local operating system that repositories can use as their underlying persistence layer.
29
26
  **Front Office** | Identifiable as a team, contains logic for how to auto-pick draft selections. Meant to be subclassed and extended to include more intricate player selection logic as the base will simply randomly select a player.
30
27
  **Game** | Matches up a date with two teams (home and away) to represent a coordinatord match-up.
31
28
  **League Repository** | Understands how to save and load League objects from JSON files on disk.
@@ -37,14 +34,14 @@ Element | Description
37
34
  **Record** | Represents a team's overall record.
38
35
  **Regular** | Game that counts towards regular season record.
39
36
  **Result** | The outcome of a game (typically with a home and away score).
40
- **Room CLI** | Underlying Ruby class that powers the `basketball-draft-room` script. Basically a terminal wrapper for the Room object.
41
- **Room Repository** | Understands how to save and load Room objects from JSON files on disk.
37
+ **Room Repository** | Understands how to save and load Room objects.
42
38
  **Room** | Main object responsible for providing an iterable interface capable of executing a draft, pick by pick.
43
39
  **Scheduler** | Knows how to take a League and a year and generate a game-populated calendar.
44
40
  **Scout** | Knows how to stack rank lists of players.
45
41
  **Season** | Bounded context (sub-module) dealing with calendar and matchup generation.
46
42
  **Skip** | Result event emitted when a front office decides to skip a round.
47
43
  **Standings** | Synthesizes teams and results into team standings with win/loss records and more.
44
+ **Standings Repository** | Understands how to save and load Standings objects.
48
45
  **Store** | Interface for the underlying Repository persistence layer. While a Document Repository is mainly responsible for serialization/de-serialization, the store actually knows how to read/write the data.
49
46
  **Team Group** | Set of rosters that together form a cohesive league.
50
47
  **Team** | Member of a league and signs players. Has games assigned and played.
@@ -72,70 +69,6 @@ The input for the main object `Basketball::Draft::Room` is an array of teams (`B
72
69
  * **Basketball::Draft::Room#pick!(player)**: Pick an exact player for the current front office.
73
70
  * **Basketball::Draft::Room#sim_rest!**: Simulate the rest of the picks.
74
71
 
75
- #### Command Line Interface
76
-
77
- This library ships with an example of how the Draft module could be used implemented as a command-line executable script. The script is file-based and will de-serialize into a Room object, execute operations, then serialize and write it back to disk.
78
-
79
- ###### Generate a Fresh Draft
80
-
81
- ```zsh
82
- basketball-draft-room -o tmp/draft.json
83
- ```
84
-
85
- ###### N Top Available Players
86
-
87
- ```zsh
88
- basketball-draft-room -i tmp/draft.json -t 10
89
- ```
90
-
91
- ###### N Top Available Players for a Position
92
-
93
- ```zsh
94
- basketball-draft-room -i tmp/draft.json -t 10 -q PG
95
- ```
96
-
97
- ###### Output League
98
-
99
- ```zsh
100
- basketball-draft-room -i tmp/draft.json -l
101
- ```
102
-
103
- ###### Output Event Log
104
-
105
- ```zsh
106
- basketball-draft-room -i tmp/draft.json -e
107
- ```
108
-
109
- ###### Simulate N Picks
110
-
111
- ```zsh
112
- basketball-draft-room -i tmp/draft.json -s 10
113
- ```
114
-
115
- ###### Skip N Picks
116
-
117
- ```zsh
118
- basketball-draft-room -i tmp/draft.json -x 10
119
- ```
120
-
121
- ###### Pick Players
122
-
123
- ```zsh
124
- basketball-draft-room -i tmp/draft.json -p P-100,P-200,P-300
125
- ```
126
-
127
- ###### Simulate the Rest of the Draft
128
-
129
- ```zsh
130
- basketball-draft-room -i tmp/draft.json -a
131
- ```
132
-
133
- ###### Help Menu
134
-
135
- ```zsh
136
- basketball-draft-room -h
137
- ```
138
-
139
72
  ### Season Module
140
73
 
141
74
  The Season module knows how to execute a calendar of games for a League and generate results. The main object is the `Basketball::Season::Coordinator` class. Once instantiated there are four main methods:
@@ -143,46 +76,6 @@ The Season module knows how to execute a calendar of games for a League and gene
143
76
  * **Basketball::Season::Coordinator#sim!**: Simulate the next day of games.
144
77
  * **Basketball::Season::Coordinator#sim_rest!**: Simulate the rest of the games.
145
78
 
146
- #### Command Line Interface
147
-
148
- This library ships with an example of how the Season module could be used implemented as a command-line executable script. The script is file-based and will de-serialize into a Coordinator object, execute operations, then serialize and write it back to disk.
149
-
150
- ###### Generate Random coordinator
151
-
152
- ```zsh
153
- exe/basketball-season-coordinator -o tmp/coordinator.json
154
- ```
155
-
156
- ###### Sim One Day and Save to New File
157
-
158
- ```zsh
159
- exe/basketball-season-coordinator -i tmp/coordinator.json -o tmp/coordinator2.json -d 1
160
- ```
161
-
162
- ###### Output Event Log
163
-
164
- ```zsh
165
- exe/basketball-season-coordinator -i tmp/coordinator.json -e
166
- ```
167
-
168
- ###### Sim Two Days and Save To Input File
169
-
170
- ```zsh
171
- exe/basketball-season-coordinator -i tmp/coordinator.json -d 2
172
- ```
173
-
174
- ###### Sim Rest of Calendar
175
-
176
- ```zsh
177
- exe/basketball-season-coordinator -i tmp/coordinator.json -a
178
- ```
179
-
180
- ###### Help Menu
181
-
182
- ```zsh
183
- basketball-season-coordinator -h
184
- ```
185
-
186
79
  ## Contributing
187
80
 
188
81
  ### Development Environment Configuration
data/basketball.gemspec CHANGED
@@ -15,13 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.email = ['mattruggio@icloud.com']
16
16
  s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(.github|bin|docs|spec)/}) }
17
17
  s.bindir = 'exe'
18
-
19
- s.executables = %w[
20
- basketball
21
- basketball-season-coordinator
22
- basketball-draft-room
23
- ]
24
-
18
+ s.executables = %w[]
25
19
  s.homepage = 'https://github.com/mattruggio/basketball'
26
20
  s.license = 'MIT'
27
21
  s.metadata = {
@@ -34,6 +28,4 @@ Gem::Specification.new do |s|
34
28
  }
35
29
 
36
30
  s.required_ruby_version = '>= 3.2.1'
37
-
38
- s.add_dependency('slop', '~>4.10')
39
31
  end
@@ -4,8 +4,6 @@ module Basketball
4
4
  module App
5
5
  # Knows how to flatten a Coordinator instance and rehydrate one from JSON and/or a Ruby hash.
6
6
  class CoordinatorRepository < DocumentRepository
7
- include LeagueSerializable
8
-
9
7
  GAME_CLASSES = {
10
8
  'Exhibition' => Season::Exhibition,
11
9
  'Regular' => Season::Regular
@@ -19,8 +17,7 @@ module Basketball
19
17
  Season::Coordinator.new(
20
18
  calendar: deserialize_calendar(hash[:calendar]),
21
19
  current_date: Date.parse(hash[:current_date]),
22
- results: deserialize_results(hash[:results]),
23
- league: deserialize_league(hash[:league])
20
+ results: deserialize_results(hash[:results])
24
21
  )
25
22
  end
26
23
 
@@ -29,8 +26,7 @@ module Basketball
29
26
  id: coordinator.id,
30
27
  calendar: serialize_calendar(coordinator.calendar),
31
28
  current_date: coordinator.current_date.to_s,
32
- results: serialize_results(coordinator.results),
33
- league: serialize_league(coordinator.league)
29
+ results: serialize_results(coordinator.results)
34
30
  }
35
31
  end
36
32
 
@@ -2,10 +2,8 @@
2
2
 
3
3
  module Basketball
4
4
  module App
5
- # Knows how to flatten a League instance and rehydrate one from JSON and/or a Ruby hash.
5
+ # Knows how to flatten a League instances and rehydrate one from JSON and/or a Ruby hash.
6
6
  class LeagueRepository < DocumentRepository
7
- include LeagueSerializable
8
-
9
7
  private
10
8
 
11
9
  def from_h(hash)
@@ -15,6 +13,97 @@ module Basketball
15
13
  def to_h(league)
16
14
  serialize_league(league)
17
15
  end
16
+
17
+ # Serialization
18
+
19
+ def serialize_league(league)
20
+ {
21
+ id: league.id,
22
+ conferences: serialize_conferences(league.conferences)
23
+ }
24
+ end
25
+
26
+ def serialize_conferences(conferences)
27
+ conferences.map do |conference|
28
+ {
29
+ id: conference.id,
30
+ divisions: serialize_divisions(conference.divisions)
31
+ }
32
+ end
33
+ end
34
+
35
+ def serialize_divisions(divisions)
36
+ divisions.map do |division|
37
+ {
38
+ id: division.id,
39
+ teams: serialize_teams(division.teams)
40
+ }
41
+ end
42
+ end
43
+
44
+ def serialize_teams(teams)
45
+ teams.map do |team|
46
+ {
47
+ id: team.id,
48
+ players: serialize_players(team.players)
49
+ }
50
+ end
51
+ end
52
+
53
+ def serialize_players(players)
54
+ players.map do |player|
55
+ {
56
+ id: player.id,
57
+ overall: player.overall,
58
+ position: player.position&.code
59
+ }
60
+ end
61
+ end
62
+
63
+ # Deserialization
64
+
65
+ def deserialize_league(league_hash)
66
+ Org::League.new(
67
+ conferences: deserialize_conferences(league_hash[:conferences])
68
+ )
69
+ end
70
+
71
+ def deserialize_conferences(conference_hashes)
72
+ (conference_hashes || []).map do |conference_hash|
73
+ Org::Conference.new(
74
+ id: conference_hash[:id],
75
+ divisions: deserialize_divisions(conference_hash[:divisions])
76
+ )
77
+ end
78
+ end
79
+
80
+ def deserialize_divisions(division_hashes)
81
+ (division_hashes || []).map do |division_hash|
82
+ Org::Division.new(
83
+ id: division_hash[:id],
84
+ teams: deserialize_teams(division_hash[:teams])
85
+ )
86
+ end
87
+ end
88
+
89
+ def deserialize_teams(team_hashes)
90
+ (team_hashes || []).map do |team_hash|
91
+ Org::Team.new(
92
+ id: team_hash[:id],
93
+ players: deserialize_players(team_hash[:players])
94
+ )
95
+ end
96
+ end
97
+
98
+ def deserialize_players(player_hashes)
99
+ (player_hashes || []).map do |player_hash|
100
+ Org::Player.new(
101
+ id: player_hash[:id],
102
+ overall: player_hash[:overall],
103
+ position: Org::Position.new(player_hash[:position])
104
+ )
105
+ end
106
+ end
18
107
  end
19
108
  end
20
109
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Basketball
4
4
  module App
5
- # Can load and save Room objects to JSON files.
5
+ # Can load and save Room objects as JSON Documents.
6
6
  class RoomRepository < DocumentRepository
7
7
  PICK_EVENT = 'Pick'
8
8
  SKIP_EVENT = 'Skip'
@@ -26,6 +26,7 @@ module Basketball
26
26
 
27
27
  def to_h(room)
28
28
  {
29
+ id: room.id,
29
30
  rounds: room.rounds,
30
31
  front_offices: room.front_offices.map { |fo| serialize_front_office(fo) },
31
32
  players: room.players.map { |p| serialize_player(p) },
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Basketball
4
+ module App
5
+ # Can load and save Standings objects as JSON Documents.
6
+ class StandingsRepository < DocumentRepository
7
+ private
8
+
9
+ def from_h(hash)
10
+ Season::Standings.new(
11
+ records: deserialize_records(hash[:records])
12
+ )
13
+ end
14
+
15
+ def to_h(standings)
16
+ {
17
+ id: standings.id,
18
+ records: serialize_records(standings.records)
19
+ }
20
+ end
21
+
22
+ # Serialization
23
+
24
+ def serialize_records(records)
25
+ (records || []).map do |record|
26
+ {
27
+ id: record.id,
28
+ details: serialize_details(record.details)
29
+ }
30
+ end
31
+ end
32
+
33
+ def serialize_details(details)
34
+ (details || []).map do |detail|
35
+ {
36
+ date: detail.date.to_s,
37
+ home: detail.home,
38
+ opponent: detail.opponent.id,
39
+ opponent_score: detail.opponent_score,
40
+ score: detail.score
41
+ }
42
+ end
43
+ end
44
+
45
+ # Deserialization
46
+
47
+ def deserialize_records(record_hashes)
48
+ (record_hashes || []).map do |record_hash|
49
+ Season::Record.new(
50
+ id: record_hash[:id],
51
+ details: deserialize_details(record_hash[:details])
52
+ )
53
+ end
54
+ end
55
+
56
+ def deserialize_details(detail_hashes)
57
+ (detail_hashes || []).map do |detail_hash|
58
+ Season::Detail.new(
59
+ date: Date.parse(detail_hash[:date]),
60
+ home: detail_hash[:home],
61
+ opponent: Season::Opponent.new(id: detail_hash[:opponent]),
62
+ opponent_score: detail_hash[:opponent_score].to_i,
63
+ score: detail_hash[:score].to_i
64
+ )
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -4,9 +4,6 @@
4
4
  require_relative 'app/file_store'
5
5
  require_relative 'app/in_memory_store'
6
6
 
7
- # Serialization
8
- require_relative 'app/league_serializable'
9
-
10
7
  # Repositories / Common
11
8
  require_relative 'app/document_repository'
12
9
 
@@ -14,7 +11,4 @@ require_relative 'app/document_repository'
14
11
  require_relative 'app/coordinator_repository'
15
12
  require_relative 'app/league_repository'
16
13
  require_relative 'app/room_repository'
17
-
18
- # Controllers
19
- require_relative 'app/coordinator_cli'
20
- require_relative 'app/room_cli'
14
+ require_relative 'app/standings_repository'
@@ -90,8 +90,6 @@ module Basketball
90
90
  other_divisions.flat_map(&:teams)
91
91
  end
92
92
 
93
- private
94
-
95
93
  def team_for(id)
96
94
  teams.find { |team| team.id == id }
97
95
  end
@@ -11,14 +11,12 @@ module Basketball
11
11
  class OutOfBoundsError < StandardError; end
12
12
  class PlayedGamesError < StandardError; end
13
13
  class UnknownGameError < StandardError; end
14
- class UnknownTeamError < StandardError; end
15
14
  class UnplayedGamesError < StandardError; end
16
15
 
17
16
  attr_reader :calendar,
18
17
  :current_date,
19
18
  :arena,
20
- :results,
21
- :league
19
+ :results
22
20
 
23
21
  def_delegators :calendar,
24
22
  :exhibition_start_date,
@@ -30,37 +28,29 @@ module Basketball
30
28
  :regulars_for,
31
29
  :games_for
32
30
 
33
- def initialize(
34
- calendar:,
35
- current_date:,
36
- results: [],
37
- league: Org::League.new
38
- )
31
+ def initialize(calendar:, current_date:, results: [])
39
32
  super()
40
33
 
41
34
  raise ArgumentError, 'calendar is required' unless calendar
42
35
  raise ArgumentError, 'current_date is required' if current_date.to_s.empty?
43
- raise ArgumentError, 'league is required' unless league
44
36
 
45
37
  @calendar = calendar
46
38
  @current_date = current_date
47
39
  @arena = Arena.new
48
40
  @results = []
49
- @league = league
50
41
 
51
42
  results.each { |result| replay!(result) }
52
43
 
53
44
  assert_current_date
54
45
  assert_all_past_dates_are_played
55
46
  assert_all_future_dates_arent_played
56
- assert_all_known_teams
57
47
  end
58
48
 
59
- def sim_rest!(&)
49
+ def sim_rest!(league, &)
60
50
  events = []
61
51
 
62
52
  while not_done?
63
- new_events = sim!(&)
53
+ new_events = sim!(league, &)
64
54
 
65
55
  events += new_events
66
56
  end
@@ -78,15 +68,17 @@ module Basketball
78
68
  raise OutOfBoundsError, "current date #{current_date} should be on or after #{exhibition_start_date}"
79
69
  end
80
70
 
81
- def sim!
71
+ def sim!(league)
72
+ raise ArgumentError, 'league is required' unless league
73
+
82
74
  return [] if done?
83
75
 
84
76
  events = []
85
77
  games = games_for(date: current_date)
86
78
 
87
79
  games.each do |game|
88
- home_players = opponent_team(game.home_opponent).players
89
- away_players = opponent_team(game.away_opponent).players
80
+ home_players = opponent_team(league, game.home_opponent).players
81
+ away_players = opponent_team(league, game.away_opponent).players
90
82
  matchup = Matchup.new(game:, home_players:, away_players:)
91
83
  event = arena.play(matchup)
92
84
 
@@ -140,7 +132,6 @@ module Basketball
140
132
 
141
133
  def add!(game)
142
134
  assert_today_or_in_future(game)
143
- assert_known_teams(game)
144
135
 
145
136
  calendar.add!(game)
146
137
 
@@ -165,7 +156,7 @@ module Basketball
165
156
 
166
157
  attr_writer :arena
167
158
 
168
- def opponent_team(opponent)
159
+ def opponent_team(league, opponent)
169
160
  league.teams.find { |t| t == opponent }
170
161
  end
171
162
 
@@ -191,14 +182,6 @@ module Basketball
191
182
  raise OutOfBoundsError, "#{game.date} is on or before the current date (#{current_date})"
192
183
  end
193
184
 
194
- def assert_known_teams(game)
195
- raise UnknownTeamError, "unknown opponent: #{game.home_opponent}" unless league.team?(game.home_opponent)
196
-
197
- return if league.team?(game.away_opponent)
198
-
199
- raise UnknownTeamError, "unknown opponent: #{game.away_opponent}"
200
- end
201
-
202
185
  def assert_all_past_dates_are_played
203
186
  games_that_should_be_played = games.select { |game| game.date < current_date }
204
187
 
@@ -237,10 +220,6 @@ module Basketball
237
220
 
238
221
  result
239
222
  end
240
-
241
- def assert_all_known_teams
242
- calendar.games.each { |game| assert_known_teams(game) }
243
- end
244
223
  end
245
224
  end
246
225
  end
@@ -8,7 +8,7 @@ module Basketball
8
8
  class DetailAlreadyAddedError < StandardError; end
9
9
  class OpponentNotFoundError < StandardError; end
10
10
 
11
- def initialize(id:)
11
+ def initialize(id:, details: [])
12
12
  super(id)
13
13
 
14
14
  @details_by_date = {}
@@ -53,9 +53,15 @@ module Basketball
53
53
  end
54
54
 
55
55
  def win_percentage
56
+ return 0 unless game_count.positive?
57
+
56
58
  (win_count.to_f / game_count).round(3)
57
59
  end
58
60
 
61
+ def win_percentage_display
62
+ format('%.3f', win_percentage)
63
+ end
64
+
59
65
  def game_count
60
66
  details.length
61
67
  end
@@ -69,17 +75,13 @@ module Basketball
69
75
  end
70
76
 
71
77
  def to_s
72
- "[#{super}] #{win_count}-#{loss_count} (#{win_percentage})"
78
+ "[#{super}] #{win_count}-#{loss_count} (#{win_percentage_display})"
73
79
  end
74
80
 
75
81
  def <=>(other)
76
82
  [win_count, win_percentage] <=> [other.win_count, other.win_percentage]
77
83
  end
78
84
 
79
- private
80
-
81
- attr_reader :details_by_date
82
-
83
85
  def add!(detail)
84
86
  raise DetailAlreadyAddedError, "#{detail} already added for date" if detail_for(detail.date)
85
87
 
@@ -87,6 +89,10 @@ module Basketball
87
89
 
88
90
  self
89
91
  end
92
+
93
+ private
94
+
95
+ attr_reader :details_by_date
90
96
  end
91
97
  end
92
98
  end
@@ -3,18 +3,29 @@
3
3
  module Basketball
4
4
  module Season
5
5
  # Represents a League with each team's win/loss details.
6
- class Standings
6
+ class Standings < Entity
7
7
  class TeamAlreadyRegisteredError < StandardError; end
8
8
  class TeamNotRegisteredError < StandardError; end
9
9
 
10
- def initialize
10
+ def initialize(records: [])
11
+ super()
12
+
11
13
  @records_by_id = {}
14
+
15
+ records.each { |record| add!(record) }
12
16
  end
13
17
 
14
- def register!(team)
15
- raise TeamAlreadyRegisteredError, "#{team} already registered!" if team?(team)
18
+ def add!(record)
19
+ raise ArgumentError, 'record is required' unless record
20
+ raise TeamAlreadyRegisteredError, "#{team} already registered!" if team?(record)
21
+
22
+ records_by_id[record.id] = record
16
23
 
17
- records_by_id[team.id] = Record.new(id: team.id)
24
+ self
25
+ end
26
+
27
+ def register!(team)
28
+ add!(Record.new(id: team.id))
18
29
 
19
30
  self
20
31
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Basketball
4
- VERSION = '0.0.14'
4
+ VERSION = '0.0.16'
5
5
  end
data/lib/basketball.rb CHANGED
@@ -4,7 +4,6 @@ require 'date'
4
4
  require 'fileutils'
5
5
  require 'forwardable'
6
6
  require 'json'
7
- require 'slop'
8
7
 
9
8
  # Generic
10
9
  require_relative 'basketball/entity'