basketball 0.0.8 → 0.0.10
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 +4 -4
- data/.rubocop.yml +9 -19
- data/CHANGELOG.md +1 -39
- data/README.md +75 -93
- data/basketball.gemspec +3 -6
- data/exe/{basketball-season-scheduling → basketball-coordinator} +1 -1
- data/exe/{basketball-draft → basketball-room} +1 -1
- data/lib/basketball/app/coordinator_cli.rb +250 -0
- data/lib/basketball/app/coordinator_repository.rb +114 -0
- data/lib/basketball/app/document_repository.rb +67 -0
- data/lib/basketball/app/file_store.rb +38 -0
- data/lib/basketball/app/in_memory_store.rb +42 -0
- data/lib/basketball/app/league_repository.rb +20 -0
- data/lib/basketball/app/league_serializable.rb +54 -0
- data/lib/basketball/{draft/cli.rb → app/room_cli.rb} +74 -80
- data/lib/basketball/app/room_repository.rb +149 -0
- data/lib/basketball/app.rb +20 -0
- data/lib/basketball/draft/assessment.rb +31 -0
- data/lib/basketball/draft/event.rb +3 -2
- data/lib/basketball/draft/front_office.rb +35 -28
- data/lib/basketball/draft/{pick_event.rb → pick.rb} +13 -6
- data/lib/basketball/draft/room.rb +119 -119
- data/lib/basketball/draft/{player_search.rb → scout.rb} +4 -9
- data/lib/basketball/draft/skip.rb +12 -0
- data/lib/basketball/draft.rb +13 -6
- data/lib/basketball/entity.rb +19 -10
- data/lib/basketball/org/league.rb +68 -0
- data/lib/basketball/org/player.rb +26 -0
- data/lib/basketball/{draft → org}/position.rb +3 -2
- data/lib/basketball/org/team.rb +38 -0
- data/lib/basketball/org.rb +12 -0
- data/lib/basketball/season/arena.rb +113 -0
- data/lib/basketball/season/calendar.rb +41 -72
- data/lib/basketball/season/coordinator.rb +186 -128
- data/lib/basketball/season/{preseason_game.rb → exhibition.rb} +2 -1
- data/lib/basketball/season/game.rb +15 -10
- data/lib/basketball/season/matchup.rb +27 -0
- data/lib/basketball/season/opponent.rb +15 -0
- data/lib/basketball/season/{season_game.rb → regular.rb} +2 -1
- data/lib/basketball/season/result.rb +37 -0
- data/lib/basketball/season.rb +12 -13
- data/lib/basketball/value_object.rb +8 -27
- data/lib/basketball/value_object_dsl.rb +30 -0
- data/lib/basketball/version.rb +1 -1
- data/lib/basketball.rb +9 -4
- metadata +37 -44
- data/lib/basketball/draft/league.rb +0 -70
- data/lib/basketball/draft/player.rb +0 -43
- data/lib/basketball/draft/room_serializer.rb +0 -186
- data/lib/basketball/draft/roster.rb +0 -37
- data/lib/basketball/draft/sim_event.rb +0 -23
- data/lib/basketball/draft/skip_event.rb +0 -13
- data/lib/basketball/season/calendar_serializer.rb +0 -94
- data/lib/basketball/season/conference.rb +0 -57
- data/lib/basketball/season/division.rb +0 -43
- data/lib/basketball/season/league.rb +0 -114
- data/lib/basketball/season/league_serializer.rb +0 -99
- data/lib/basketball/season/scheduling_cli.rb +0 -198
- data/lib/basketball/season/team.rb +0 -21
@@ -1,198 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'calendar_serializer'
|
4
|
-
require_relative 'conference'
|
5
|
-
require_relative 'coordinator'
|
6
|
-
require_relative 'division'
|
7
|
-
require_relative 'league'
|
8
|
-
require_relative 'league_serializer'
|
9
|
-
require_relative 'team'
|
10
|
-
|
11
|
-
module Basketball
|
12
|
-
module Season
|
13
|
-
# Examples:
|
14
|
-
# exe/basketball-season-scheduling -o tmp/league.json
|
15
|
-
# exe/basketball-season-scheduling -i tmp/league.json -o tmp/calendar.json
|
16
|
-
# exe/basketball-season-scheduling -i tmp/league.json -o tmp/calendar.json -y 2005
|
17
|
-
# exe/basketball-season-scheduling -c tmp/calendar.json
|
18
|
-
# exe/basketball-season-scheduling -c tmp/calendar.json -t C0-D0-T0
|
19
|
-
# exe/basketball-season-scheduling -c tmp/calendar.json -d 2005-02-03
|
20
|
-
# exe/basketball-season-scheduling -c tmp/calendar.json -d 2005-02-03 -t C0-D0-T0
|
21
|
-
class SchedulingCLI
|
22
|
-
attr_reader :opts,
|
23
|
-
:league_serializer,
|
24
|
-
:calendar_serializer,
|
25
|
-
:io,
|
26
|
-
:coordinator
|
27
|
-
|
28
|
-
def initialize(args:, io: $stdout)
|
29
|
-
@io = io
|
30
|
-
@opts = slop_parse(args)
|
31
|
-
@league_serializer = LeagueSerializer.new
|
32
|
-
@calendar_serializer = CalendarSerializer.new
|
33
|
-
@coordinator = Coordinator.new
|
34
|
-
|
35
|
-
freeze
|
36
|
-
end
|
37
|
-
|
38
|
-
def invoke!
|
39
|
-
if output?
|
40
|
-
out_dir = File.dirname(output)
|
41
|
-
FileUtils.mkdir_p(out_dir)
|
42
|
-
end
|
43
|
-
|
44
|
-
if output? && no_input?
|
45
|
-
execute_with_no_input
|
46
|
-
elsif output?
|
47
|
-
execute_with_input
|
48
|
-
end
|
49
|
-
|
50
|
-
output_cal_query if cal
|
51
|
-
|
52
|
-
self
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def output_cal_query
|
58
|
-
contents = File.read(cal)
|
59
|
-
calendar = calendar_serializer.deserialize(contents)
|
60
|
-
team_instance = team ? calendar.team(team) : nil
|
61
|
-
games = calendar.games_for(date:, team: team_instance).sort_by(&:date)
|
62
|
-
pre_counter = 1
|
63
|
-
counter = 1
|
64
|
-
|
65
|
-
io.puts("Games for [team: #{team}, date: #{date}]")
|
66
|
-
games.each do |game|
|
67
|
-
if game.is_a?(PreseasonGame)
|
68
|
-
io.puts("##{pre_counter} - #{game}")
|
69
|
-
pre_counter += 1
|
70
|
-
else
|
71
|
-
io.puts("##{counter} - #{game}")
|
72
|
-
counter += 1
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def execute_with_input
|
78
|
-
io.puts("Loading league from: #{input}")
|
79
|
-
|
80
|
-
contents = File.read(input)
|
81
|
-
league = league_serializer.deserialize(contents)
|
82
|
-
|
83
|
-
io.puts("Generating calendar for the year #{year}...")
|
84
|
-
|
85
|
-
calendar = coordinator.schedule(league:, year:)
|
86
|
-
contents = calendar_serializer.serialize(calendar)
|
87
|
-
|
88
|
-
File.write(output, contents)
|
89
|
-
|
90
|
-
io.puts("Calendar written to: #{output}")
|
91
|
-
end
|
92
|
-
|
93
|
-
def execute_with_no_input
|
94
|
-
league = generate_league
|
95
|
-
contents = league_serializer.serialize(league)
|
96
|
-
|
97
|
-
File.write(output, contents)
|
98
|
-
|
99
|
-
io.puts("League written to: #{output}")
|
100
|
-
end
|
101
|
-
|
102
|
-
def cal
|
103
|
-
opts[:cal].to_s.empty? ? nil : opts[:cal]
|
104
|
-
end
|
105
|
-
|
106
|
-
def team
|
107
|
-
opts[:team].to_s.empty? ? nil : opts[:team]
|
108
|
-
end
|
109
|
-
|
110
|
-
def date
|
111
|
-
opts[:date].to_s.empty? ? nil : Date.parse(opts[:date])
|
112
|
-
end
|
113
|
-
|
114
|
-
def year
|
115
|
-
opts[:year].to_s.empty? ? Date.today.year : opts[:year]
|
116
|
-
end
|
117
|
-
|
118
|
-
def no_input?
|
119
|
-
input.to_s.empty?
|
120
|
-
end
|
121
|
-
|
122
|
-
def input
|
123
|
-
opts[:input]
|
124
|
-
end
|
125
|
-
|
126
|
-
def output?
|
127
|
-
!output.to_s.empty?
|
128
|
-
end
|
129
|
-
|
130
|
-
def output
|
131
|
-
opts[:output]
|
132
|
-
end
|
133
|
-
|
134
|
-
def generate_conferences
|
135
|
-
2.times.map do |i|
|
136
|
-
id = "C#{i}"
|
137
|
-
|
138
|
-
Conference.new(
|
139
|
-
id:,
|
140
|
-
name: Faker::Esport.league,
|
141
|
-
divisions: generate_divisions("#{id}-")
|
142
|
-
)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
def generate_divisions(id_prefix)
|
147
|
-
3.times.map do |j|
|
148
|
-
id = "#{id_prefix}D#{j}"
|
149
|
-
|
150
|
-
Division.new(
|
151
|
-
id:,
|
152
|
-
name: Faker::Address.community,
|
153
|
-
teams: generate_teams("#{id}-")
|
154
|
-
)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def generate_teams(id_prefix)
|
159
|
-
5.times.map do |k|
|
160
|
-
Team.new(
|
161
|
-
id: "#{id_prefix}T#{k}",
|
162
|
-
name: Faker::Team.name
|
163
|
-
)
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def generate_league
|
168
|
-
League.new(conferences: generate_conferences)
|
169
|
-
end
|
170
|
-
|
171
|
-
def slop_parse(args)
|
172
|
-
Slop.parse(args) do |o|
|
173
|
-
o.banner = 'Usage: basketball-schedule [options] ...'
|
174
|
-
|
175
|
-
output_description = <<~DESC
|
176
|
-
If input path is omitted then a new league will be written to this path.
|
177
|
-
If an input path is specified then a Calendar will be written to the output path.
|
178
|
-
DESC
|
179
|
-
|
180
|
-
# League and Calendar Generation Interface
|
181
|
-
o.string '-i', '--input', 'Path to load the League from. If omitted then a new league will be generated.'
|
182
|
-
o.string '-o', '--output', output_description
|
183
|
-
o.integer '-y', '--year', 'Year to use to generate a calendar for (defaults to current year).'
|
184
|
-
|
185
|
-
# Calendar Query Interface
|
186
|
-
o.string '-c', '--cal', 'Path to load a Calendar from. If omitted then no matchups will be outputted.'
|
187
|
-
o.string '-d', '--date', 'Filter matchups to just the date specified (requires --cal option).'
|
188
|
-
o.string '-t', '--team', 'Filter matchups to just the team ID specified (requires --cal option).'
|
189
|
-
|
190
|
-
o.on '-h', '--help', 'Print out help, like this is doing right now.' do
|
191
|
-
io.puts(o)
|
192
|
-
exit
|
193
|
-
end
|
194
|
-
end.to_h
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Basketball
|
4
|
-
module Season
|
5
|
-
class Team < Entity
|
6
|
-
attr_reader :name
|
7
|
-
|
8
|
-
def initialize(id:, name: '')
|
9
|
-
super(id)
|
10
|
-
|
11
|
-
@name = name.to_s
|
12
|
-
|
13
|
-
freeze
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_s
|
17
|
-
"[#{super}] #{name}"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|