basketball 0.0.6 → 0.0.7

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: 262751c76037e2859937529aa23bdd456fd77779a090ed4e844830c428b09e75
4
- data.tar.gz: 1a904f317fc3c1becfc381155a089d2ed0b041b60d358c1325459a363e6ce0ec
3
+ metadata.gz: 00ac0278bb2e786c5a68b3cc7ac8fd5d49005f9f9a01fad32501c75a00880dce
4
+ data.tar.gz: 4b76f9d42a702a206c837346de20396c6948c9bcb071a4143610e8179ba93c64
5
5
  SHA512:
6
- metadata.gz: 913504954c8c053fac3147468433d12b02ad5d6a7badc563587668c4d3943b898c49c951d69c393affc5f5e07d54257a5a004184e55a73f435af01344afa6baf
7
- data.tar.gz: 791e48aa9711e33e29b994d0e811a735def017de757bc02c8f348b57f2ce0a42c1e5fbbd6737ed2525ddd9fbf3698c9fb77be991208a1b927e4b27063a2b9f04
6
+ metadata.gz: 806f800744de18f81e590cd712adf83592e372b8f1b19c3b8f9a6e702c7fbc04981380ba784b63436f2cc34d5f80238c0fce53366eed8a2a8a63eb9b64cb69c4
7
+ data.tar.gz: acffa65b0315e7d5ec6638cd92c217e9aa665787114935d0859a4b6b02cfb0c8afd6e66d7914de6b147d6878d83ca210b2d5f5bfbdeb748784f559300fe79d46
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ #### 0.0.7 - May 14th, 2023
2
+
3
+ * Added #to_hash and #from_hash serializer methods to allow larger consumer json constructions more directly.
4
+ * Opt for string keys during serialization/deserialization.
5
+
1
6
  #### 0.0.6 - May 11th, 2023
2
7
 
3
8
  * Added Scheduling module that can generate full schedules for entire league.
data/Gemfile CHANGED
@@ -3,3 +3,14 @@
3
3
  source 'https://rubygems.org'
4
4
 
5
5
  gemspec
6
+
7
+ gem 'bundler-audit', '~>0.9'
8
+ gem 'guard-rspec', '~>4.7'
9
+ gem 'pry', '~>0.14'
10
+ gem 'rake', '~>13.0'
11
+ gem 'rspec', '~>3.12'
12
+ gem 'rubocop', '~>1.49'
13
+ gem 'rubocop-rake', '~>0.6'
14
+ gem 'rubocop-rspec', '~>2.20'
15
+ gem 'simplecov', '~>0.22'
16
+ gem 'simplecov-console', '~>0.9'
data/README.md CHANGED
@@ -32,6 +32,10 @@ This library is broken down into several bounded contexts that can be consumed e
32
32
 
33
33
  ![Basketball Architecture - Overview](/docs/architecture/overview.png)
34
34
 
35
+ #### Command Line Interfaces
36
+
37
+ Each module is meant to be interfaced with using its Ruby API by consuming applications. Each module also ships with a CLI script (backed by a module service) which a user can interact with to emulate different portions of the league management process. Technically speaking, the CLI provides an example application built on top of the each individual core module. Each module section below should contain with it example CLI calls.
38
+
35
39
  ## Drafting Module
36
40
 
37
41
  The drafting module is responsible for providing a turn-based iterator allowing the consumer to either manually pick or simulate picks. Here is a cartoon showing the major components:
@@ -53,65 +57,65 @@ Element | Description
53
57
  **Sim Event** | Result event emitted when a player is automatically selected by a front office.
54
58
  **Skip Event** | Result event emitted when a front office decides to skip a round.
55
59
 
56
- ### The Drafting CLI
60
+ #### The Drafting CLI
57
61
 
58
- The drafting module is meant to be interfaced with using its Ruby API by consuming applications. It also ships with a CLI which a user can interact with to emulate "the draft process". Technically speaking, the CLI provides an example application built on top of the Drafting module. Each time a CLI command is executed, its results will be resaved, so the output file can then be used as the next command's input file to string together commands. The following sections are example CLI interactions:
62
+ The drafting module's main object: `Basketball::Drafting::Engine` is a stateful iterator. Each time a CLI command is executed, it's results will be re-saved to disk so the output file can then be used as the next command's input file to string together commands.
59
63
 
60
- ##### Generate a Fresh Draft
64
+ ###### Generate a Fresh Draft
61
65
 
62
66
  ```zsh
63
67
  basketball-draft -o tmp/draft.json
64
68
  ```
65
69
 
66
- ##### N Top Available Players
70
+ ###### N Top Available Players
67
71
 
68
72
  ```zsh
69
73
  basketball-draft -i tmp/draft.json -t 10
70
74
  ```
71
75
 
72
- ##### N Top Available Players for a Position
76
+ ###### N Top Available Players for a Position
73
77
 
74
78
  ```zsh
75
79
  basketball-draft -i tmp/draft.json -t 10 -q PG
76
80
  ```
77
81
 
78
- ##### Output Current Rosters
82
+ ###### Output Current Rosters
79
83
 
80
84
  ```zsh
81
85
  basketball-draft -i tmp/draft.json -r
82
86
  ```
83
87
 
84
- ##### Output Event Log
88
+ ###### Output Event Log
85
89
 
86
90
  ```zsh
87
91
  basketball-draft -i tmp/draft.json -l
88
92
  ```
89
93
 
90
- ##### Simulate N Picks
94
+ ###### Simulate N Picks
91
95
 
92
96
  ```zsh
93
97
  basketball-draft -i tmp/draft.json -s 10
94
98
  ```
95
99
 
96
- ##### Skip N Picks
100
+ ###### Skip N Picks
97
101
 
98
102
  ```zsh
99
103
  basketball-draft -i tmp/draft.json -x 10
100
104
  ```
101
105
 
102
- ##### Pick Players
106
+ ###### Pick Players
103
107
 
104
108
  ```zsh
105
109
  basketball-draft -i tmp/draft.json -p P-100,P-200,P-300
106
110
  ```
107
111
 
108
- ##### Simulate the Rest of the Draft
112
+ ###### Simulate the Rest of the Draft
109
113
 
110
114
  ```zsh
111
115
  basketball-draft -i tmp/draft.json -a
112
116
  ```
113
117
 
114
- ##### Help Menu
118
+ ###### Help Menu
115
119
 
116
120
  ```zsh
117
121
  basketball-draft -h
@@ -138,49 +142,51 @@ Element | Description
138
142
  **Scheduling** | Bounded context (sub-module) dealing with matchup and calendar generation.
139
143
  **Team** | Identified by an ID and described by a name: represents a basketball team that can be scheduled.
140
144
 
141
- ##### Generate League
145
+ #### The Scheduling CLI
146
+
147
+ ###### Generate League
142
148
 
143
149
  ```zsh
144
150
  basketball-schedule -o tmp/league.json
145
151
  ```
146
152
 
147
- ##### Generate Calendar From League
153
+ ###### Generate Calendar From League
148
154
 
149
155
  ```zsh
150
156
  basketball-schedule -i tmp/league.json -o tmp/calendar.json
151
157
  ```
152
158
 
153
- ##### Generate Calendar From League For a Specific Year
159
+ ###### Generate Calendar From League For a Specific Year
154
160
 
155
161
  ```zsh
156
162
  basketball-schedule -i tmp/league.json -o tmp/calendar.json -y 2005
157
163
  ```
158
164
 
159
- ##### Output a Generated Calendar's Matchups
165
+ ###### Output a Generated Calendar's Matchups
160
166
 
161
167
  ```zsh
162
168
  basketball-schedule -c tmp/calendar.json
163
169
  ```
164
170
 
165
- ##### Output a Generated Calendar's Matchups For a Specific Team
171
+ ###### Output a Generated Calendar's Matchups For a Specific Team
166
172
 
167
173
  ```zsh
168
174
  basketball-schedule -c tmp/calendar.json -t C0-D0-T0
169
175
  ```
170
176
 
171
- ##### Output a Generated Calendar's Matchups For a Specific Date
177
+ ###### Output a Generated Calendar's Matchups For a Specific Date
172
178
 
173
179
  ```zsh
174
180
  basketball-schedule -c tmp/calendar.json -d 2005-02-03
175
181
  ```
176
182
 
177
- ##### Output a Generated Calendar's Matchups For a Specific Team and Date
183
+ ###### Output a Generated Calendar's Matchups For a Specific Team and Date
178
184
 
179
185
  ```zsh
180
186
  basketball-schedule -c tmp/calendar.json -d 2005-02-03 -t C0-D0-T0
181
187
  ```
182
188
 
183
- ##### Help Menu
189
+ ###### Help Menu
184
190
 
185
191
  ```zsh
186
192
  basketball-schedule -h
data/basketball.gemspec CHANGED
@@ -33,15 +33,4 @@ Gem::Specification.new do |s|
33
33
 
34
34
  s.add_dependency('faker', '~>3.2')
35
35
  s.add_dependency('slop', '~>4.10')
36
-
37
- s.add_development_dependency('bundler-audit', '~>0.9')
38
- s.add_development_dependency('guard-rspec', '~>4.7')
39
- s.add_development_dependency('pry', '~>0.14')
40
- s.add_development_dependency('rake', '~>13.0')
41
- s.add_development_dependency('rspec', '~>3.12')
42
- s.add_development_dependency('rubocop', '~>1.49')
43
- s.add_development_dependency('rubocop-rake', '~>0.6')
44
- s.add_development_dependency('rubocop-rspec', '~>2.20')
45
- s.add_development_dependency('simplecov', '~>0.22')
46
- s.add_development_dependency('simplecov-console', '~>0.9')
47
36
  end
@@ -17,8 +17,15 @@ module Basketball
17
17
 
18
18
  private_constant :EVENT_CLASSES
19
19
 
20
- def deserialize(string)
21
- json = JSON.parse(string, symbolize_names: true)
20
+ def to_hash(engine)
21
+ {
22
+ 'info' => serialize_info(engine),
23
+ 'engine' => serialize_engine(engine),
24
+ 'league' => serialize_league(engine)
25
+ }
26
+ end
27
+
28
+ def from_hash(json)
22
29
  front_offices = deserialize_front_offices(json)
23
30
  players = deserialize_players(json)
24
31
  events = deserialize_events(json, players, front_offices)
@@ -29,39 +36,41 @@ module Basketball
29
36
  events:
30
37
  }
31
38
 
32
- engine_opts[:rounds] = json.dig(:engine, :rounds) if json.dig(:engine, :rounds)
39
+ engine_opts[:rounds] = json.dig('engine', 'rounds') if json.dig('engine', 'rounds')
33
40
 
34
41
  Engine.new(**engine_opts)
35
42
  end
36
43
 
44
+ def deserialize(string)
45
+ json = JSON.parse(string)
46
+
47
+ from_hash(json)
48
+ end
49
+
37
50
  def serialize(engine)
38
- {
39
- info: serialize_info(engine),
40
- engine: serialize_engine(engine),
41
- league: serialize_league(engine)
42
- }.to_json
51
+ to_hash(engine).to_json
43
52
  end
44
53
 
45
54
  private
46
55
 
47
56
  def serialize_engine(engine)
48
57
  {
49
- rounds: engine.rounds,
50
- front_offices: serialize_front_offices(engine),
51
- players: serialize_players(engine),
52
- events: serialize_events(engine.events)
58
+ 'rounds' => engine.rounds,
59
+ 'front_offices' => serialize_front_offices(engine),
60
+ 'players' => serialize_players(engine),
61
+ 'events' => serialize_events(engine.events)
53
62
  }
54
63
  end
55
64
 
56
65
  def serialize_info(engine)
57
66
  {
58
- total_picks: engine.total_picks,
59
- current_round: engine.current_round,
60
- current_round_pick: engine.current_round_pick,
61
- current_front_office: engine.current_front_office&.id,
62
- current_pick: engine.current_pick,
63
- remaining_picks: engine.remaining_picks,
64
- done: engine.done?
67
+ 'total_picks' => engine.total_picks,
68
+ 'current_round' => engine.current_round,
69
+ 'current_round_pick' => engine.current_round_pick,
70
+ 'current_front_office' => engine.current_front_office&.id,
71
+ 'current_pick' => engine.current_pick,
72
+ 'remaining_picks' => engine.remaining_picks,
73
+ 'done' => engine.done?
65
74
  }
66
75
  end
67
76
 
@@ -72,14 +81,14 @@ module Basketball
72
81
  [
73
82
  roster.id,
74
83
  {
75
- players: roster.players.map(&:id)
84
+ 'players' => roster.players.map(&:id)
76
85
  }
77
86
  ]
78
87
  end
79
88
 
80
89
  {
81
- free_agents: league.free_agents.map(&:id),
82
- rosters:
90
+ 'free_agents' => league.free_agents.map(&:id),
91
+ 'rosters' => rosters
83
92
  }
84
93
  end
85
94
 
@@ -88,10 +97,10 @@ module Basketball
88
97
  [
89
98
  front_office.id,
90
99
  {
91
- name: front_office.name,
92
- fuzz: front_office.fuzz,
93
- depth: front_office.depth,
94
- prioritized_positions: front_office.prioritized_positions.map(&:code)
100
+ 'name' => front_office.name,
101
+ 'fuzz' => front_office.fuzz,
102
+ 'depth' => front_office.depth,
103
+ 'prioritized_positions' => front_office.prioritized_positions.map(&:code)
95
104
  }
96
105
  ]
97
106
  end
@@ -102,10 +111,10 @@ module Basketball
102
111
  [
103
112
  player.id,
104
113
  {
105
- first_name: player.first_name,
106
- last_name: player.last_name,
107
- overall: player.overall,
108
- position: player.position.code
114
+ 'first_name' => player.first_name,
115
+ 'last_name' => player.last_name,
116
+ 'overall' => player.overall,
117
+ 'position' => player.position.code
109
118
  }
110
119
  ]
111
120
  end
@@ -114,29 +123,29 @@ module Basketball
114
123
  def serialize_events(events)
115
124
  events.map do |event|
116
125
  {
117
- type: event.class.name.split('::').last,
118
- front_office: event.front_office.id,
119
- pick: event.pick,
120
- round: event.round,
121
- round_pick: event.round_pick
126
+ 'type' => event.class.name.split('::').last,
127
+ 'front_office' => event.front_office.id,
128
+ 'pick' => event.pick,
129
+ 'round' => event.round,
130
+ 'round_pick' => event.round_pick
122
131
  }.tap do |hash|
123
- hash[:player] = event.player.id if event.respond_to?(:player)
132
+ hash['player'] = event.player.id if event.respond_to?(:player)
124
133
  end
125
134
  end
126
135
  end
127
136
 
128
137
  def deserialize_front_offices(json)
129
- (json.dig(:engine, :front_offices) || []).map do |id, front_office_hash|
130
- prioritized_positions = (front_office_hash[:prioritized_positions] || []).map do |v|
138
+ (json.dig('engine', 'front_offices') || []).map do |id, front_office_hash|
139
+ prioritized_positions = (front_office_hash['prioritized_positions'] || []).map do |v|
131
140
  Position.new(v)
132
141
  end
133
142
 
134
143
  front_office_opts = {
135
144
  id:,
136
- name: front_office_hash[:name],
145
+ name: front_office_hash['name'],
137
146
  prioritized_positions:,
138
- fuzz: front_office_hash[:fuzz],
139
- depth: front_office_hash[:depth]
147
+ fuzz: front_office_hash['fuzz'],
148
+ depth: front_office_hash['depth']
140
149
  }
141
150
 
142
151
  FrontOffice.new(**front_office_opts)
@@ -144,26 +153,29 @@ module Basketball
144
153
  end
145
154
 
146
155
  def deserialize_players(json)
147
- (json.dig(:engine, :players) || []).map do |id, player_hash|
148
- player_opts = player_hash.merge(
156
+ (json.dig('engine', 'players') || []).map do |id, player_hash|
157
+ player_opts = {
149
158
  id:,
150
- position: Position.new(player_hash[:position])
151
- )
159
+ first_name: player_hash['first_name'],
160
+ last_name: player_hash['last_name'],
161
+ overall: player_hash['overall'],
162
+ position: Position.new(player_hash['position'])
163
+ }
152
164
 
153
165
  Player.new(**player_opts)
154
166
  end
155
167
  end
156
168
 
157
169
  def deserialize_events(json, players, front_offices)
158
- (json.dig(:engine, :events) || []).map do |event_hash|
159
- event_opts = event_hash.slice(:pick, :round, :round_pick).merge(
160
- front_office: front_offices.find { |t| t.id == event_hash[:front_office] }
170
+ (json.dig('engine', 'events') || []).map do |event_hash|
171
+ event_opts = event_hash.slice('pick', 'round', 'round_pick').merge(
172
+ front_office: front_offices.find { |t| t.id == event_hash['front_office'] }
161
173
  )
162
174
 
163
- class_constant = EVENT_CLASSES.fetch(event_hash[:type])
175
+ class_constant = EVENT_CLASSES.fetch(event_hash['type'])
164
176
 
165
177
  if [PickEvent, SimEvent].include?(class_constant)
166
- event_opts[:player] = players.find { |p| p.id == event_hash[:player] }
178
+ event_opts[:player] = players.find { |p| p.id == event_hash['player'] }
167
179
  end
168
180
 
169
181
  class_constant.new(**event_opts)
@@ -12,21 +12,31 @@ module Basketball
12
12
  'SeasonGame' => SeasonGame
13
13
  }.freeze
14
14
 
15
- def deserialize(string)
16
- json = JSON.parse(string, symbolize_names: true)
15
+ def to_hash(calendar)
16
+ teams = calendar.games.flat_map(&:teams).uniq
17
17
 
18
+ {
19
+ 'year' => calendar.preseason_start_date.year,
20
+ 'teams' => serialize_teams(teams),
21
+ 'games' => serialize_games(calendar.games)
22
+ }
23
+ end
24
+
25
+ def from_hash(json)
18
26
  Calendar.new(
19
- year: json[:year].to_i,
27
+ year: json['year'].to_i,
20
28
  games: deserialize_games(json)
21
29
  )
22
30
  end
23
31
 
32
+ def deserialize(string)
33
+ json = JSON.parse(string)
34
+
35
+ from_hash(json)
36
+ end
37
+
24
38
  def serialize(calendar)
25
- {
26
- year: calendar.preseason_start_date.year,
27
- teams: serialize_teams(calendar.games.flat_map(&:teams).uniq),
28
- games: serialize_games(calendar.games)
29
- }.to_json
39
+ to_hash(calendar).to_json
30
40
  end
31
41
 
32
42
  private
@@ -34,20 +44,20 @@ module Basketball
34
44
  ## Deserialization
35
45
 
36
46
  def deserialize_games(json)
37
- teams = deserialize_teams(json[:teams])
47
+ teams = deserialize_teams(json['teams'])
38
48
 
39
- (json[:games] || []).map do |game_hash|
40
- GAME_CLASSES.fetch(game_hash[:type]).new(
41
- date: Date.parse(game_hash[:date]),
42
- home_team: teams.fetch(game_hash[:home_team]),
43
- away_team: teams.fetch(game_hash[:away_team])
49
+ (json['games'] || []).map do |game_hash|
50
+ GAME_CLASSES.fetch(game_hash['type']).new(
51
+ date: Date.parse(game_hash['date']),
52
+ home_team: teams.fetch(game_hash['home_team']),
53
+ away_team: teams.fetch(game_hash['away_team'])
44
54
  )
45
55
  end
46
56
  end
47
57
 
48
58
  def deserialize_teams(teams)
49
59
  (teams || []).to_h do |id, team_hash|
50
- team = Team.new(id:, name: team_hash[:name])
60
+ team = Team.new(id:, name: team_hash['name'])
51
61
 
52
62
  [
53
63
  team.id,
@@ -63,7 +73,7 @@ module Basketball
63
73
  [
64
74
  team.id,
65
75
  {
66
- name: team.name
76
+ 'name' => team.name
67
77
  }
68
78
  ]
69
79
  end
@@ -72,10 +82,10 @@ module Basketball
72
82
  def serialize_games(games)
73
83
  games.sort_by(&:date).map do |game|
74
84
  {
75
- type: game.class.name.split('::').last,
76
- date: game.date,
77
- home_team: game.home_team.id,
78
- away_team: game.away_team.id
85
+ 'type' => game.class.name.split('::').last,
86
+ 'date' => game.date.to_s,
87
+ 'home_team' => game.home_team.id,
88
+ 'away_team' => game.away_team.id
79
89
  }
80
90
  end
81
91
  end
@@ -3,17 +3,26 @@
3
3
  module Basketball
4
4
  module Scheduling
5
5
  class LeagueSerializer
6
- def deserialize(string)
7
- json = JSON.parse(string, symbolize_names: true)
8
- conferences = deserialize_conferences(json[:conferences])
6
+ def to_hash(league)
7
+ {
8
+ 'conferences' => serialize_conferences(league.conferences)
9
+ }
10
+ end
11
+
12
+ def from_hash(json)
13
+ conferences = deserialize_conferences(json['conferences'])
9
14
 
10
15
  League.new(conferences:)
11
16
  end
12
17
 
18
+ def deserialize(string)
19
+ json = JSON.parse(string)
20
+
21
+ from_hash(json)
22
+ end
23
+
13
24
  def serialize(league)
14
- {
15
- conferences: serialize_conferences(league.conferences)
16
- }.to_json
25
+ to_hash(league).to_json
17
26
  end
18
27
 
19
28
  private
@@ -24,8 +33,8 @@ module Basketball
24
33
  (conferences || []).map do |conference_id, conference_hash|
25
34
  Conference.new(
26
35
  id: conference_id,
27
- name: conference_hash[:name],
28
- divisions: deserialize_divisions(conference_hash[:divisions])
36
+ name: conference_hash['name'],
37
+ divisions: deserialize_divisions(conference_hash['divisions'])
29
38
  )
30
39
  end
31
40
  end
@@ -34,8 +43,8 @@ module Basketball
34
43
  (divisions || []).map do |division_id, division_hash|
35
44
  Division.new(
36
45
  id: division_id,
37
- name: division_hash[:name],
38
- teams: deserialize_teams(division_hash[:teams])
46
+ name: division_hash['name'],
47
+ teams: deserialize_teams(division_hash['teams'])
39
48
  )
40
49
  end
41
50
  end
@@ -44,7 +53,7 @@ module Basketball
44
53
  (teams || []).map do |team_id, team_hash|
45
54
  Team.new(
46
55
  id: team_id,
47
- name: team_hash[:name]
56
+ name: team_hash['name']
48
57
  )
49
58
  end
50
59
  end
@@ -56,8 +65,8 @@ module Basketball
56
65
  [
57
66
  conference.id,
58
67
  {
59
- name: conference.name,
60
- divisions: serialize_divisions(conference.divisions)
68
+ 'name' => conference.name,
69
+ 'divisions' => serialize_divisions(conference.divisions)
61
70
  }
62
71
  ]
63
72
  end
@@ -68,8 +77,8 @@ module Basketball
68
77
  [
69
78
  division.id,
70
79
  {
71
- name: division.name,
72
- teams: serialize_teams(division.teams)
80
+ 'name' => division.name,
81
+ 'teams' => serialize_teams(division.teams)
73
82
  }
74
83
  ]
75
84
  end
@@ -80,7 +89,7 @@ module Basketball
80
89
  [
81
90
  team.id,
82
91
  {
83
- name: team.name
92
+ 'name' => team.name
84
93
  }
85
94
  ]
86
95
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Basketball
4
- VERSION = '0.0.6'
4
+ VERSION = '0.0.7'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: basketball
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Ruggio
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-12 00:00:00.000000000 Z
11
+ date: 2023-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faker
@@ -38,146 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.10'
41
- - !ruby/object:Gem::Dependency
42
- name: bundler-audit
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0.9'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.9'
55
- - !ruby/object:Gem::Dependency
56
- name: guard-rspec
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '4.7'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '4.7'
69
- - !ruby/object:Gem::Dependency
70
- name: pry
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '0.14'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '0.14'
83
- - !ruby/object:Gem::Dependency
84
- name: rake
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '13.0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '13.0'
97
- - !ruby/object:Gem::Dependency
98
- name: rspec
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '3.12'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '3.12'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '1.49'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '1.49'
125
- - !ruby/object:Gem::Dependency
126
- name: rubocop-rake
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '0.6'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '0.6'
139
- - !ruby/object:Gem::Dependency
140
- name: rubocop-rspec
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '2.20'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '2.20'
153
- - !ruby/object:Gem::Dependency
154
- name: simplecov
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: '0.22'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: '0.22'
167
- - !ruby/object:Gem::Dependency
168
- name: simplecov-console
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: '0.9'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - "~>"
179
- - !ruby/object:Gem::Version
180
- version: '0.9'
181
41
  description: |2
182
42
  This library is meant to serve as the domain for a basketball league/season simulator/turn-based game.
183
43
  It models core ideas such as: players, general managers, draft strategy, drafting, season generation, season simultation,