sports-manager 0.0.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 +7 -0
- data/.rspec +1 -0
- data/.rubocop.yml +32 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/CONTRIBUTING.md +72 -0
- data/MIT-LICENSE +20 -0
- data/README.md +419 -0
- data/Rakefile +4 -0
- data/lib/sports-manager.rb +59 -0
- data/lib/sports_manager/algorithms/filtering/no_overlap.rb +52 -0
- data/lib/sports_manager/algorithms/ordering/multiple_matches_participant.rb +78 -0
- data/lib/sports_manager/bye_match.rb +62 -0
- data/lib/sports_manager/constraint_builder.rb +30 -0
- data/lib/sports_manager/constraints/all_different_constraint.rb +24 -0
- data/lib/sports_manager/constraints/match_constraint.rb +37 -0
- data/lib/sports_manager/constraints/multi_category_constraint.rb +49 -0
- data/lib/sports_manager/constraints/next_round_constraint.rb +48 -0
- data/lib/sports_manager/constraints/no_overlapping_constraint.rb +55 -0
- data/lib/sports_manager/double_team.rb +7 -0
- data/lib/sports_manager/group.rb +42 -0
- data/lib/sports_manager/group_builder.rb +72 -0
- data/lib/sports_manager/helper.rb +228 -0
- data/lib/sports_manager/json_helper.rb +129 -0
- data/lib/sports_manager/match.rb +91 -0
- data/lib/sports_manager/match_builder.rb +112 -0
- data/lib/sports_manager/matches/algorithms/single_elimination_algorithm.rb +94 -0
- data/lib/sports_manager/matches/next_round.rb +38 -0
- data/lib/sports_manager/matches_generator.rb +33 -0
- data/lib/sports_manager/nil_team.rb +24 -0
- data/lib/sports_manager/participant.rb +23 -0
- data/lib/sports_manager/single_team.rb +7 -0
- data/lib/sports_manager/solution_drawer/cli/solution_table.rb +38 -0
- data/lib/sports_manager/solution_drawer/cli/table.rb +94 -0
- data/lib/sports_manager/solution_drawer/cli.rb +75 -0
- data/lib/sports_manager/solution_drawer/mermaid/bye_node.rb +39 -0
- data/lib/sports_manager/solution_drawer/mermaid/gantt.rb +126 -0
- data/lib/sports_manager/solution_drawer/mermaid/graph.rb +111 -0
- data/lib/sports_manager/solution_drawer/mermaid/node.rb +55 -0
- data/lib/sports_manager/solution_drawer/mermaid/node_style.rb +89 -0
- data/lib/sports_manager/solution_drawer/mermaid/solution_gantt.rb +57 -0
- data/lib/sports_manager/solution_drawer/mermaid/solution_graph.rb +76 -0
- data/lib/sports_manager/solution_drawer/mermaid.rb +65 -0
- data/lib/sports_manager/solution_drawer.rb +23 -0
- data/lib/sports_manager/team.rb +47 -0
- data/lib/sports_manager/team_builder.rb +31 -0
- data/lib/sports_manager/timeslot.rb +37 -0
- data/lib/sports_manager/timeslot_builder.rb +50 -0
- data/lib/sports_manager/tournament/setting.rb +45 -0
- data/lib/sports_manager/tournament.rb +69 -0
- data/lib/sports_manager/tournament_builder.rb +123 -0
- data/lib/sports_manager/tournament_day/validator.rb +69 -0
- data/lib/sports_manager/tournament_day.rb +50 -0
- data/lib/sports_manager/tournament_generator.rb +183 -0
- data/lib/sports_manager/tournament_problem_builder.rb +106 -0
- data/lib/sports_manager/tournament_solution/bye_fixture.rb +21 -0
- data/lib/sports_manager/tournament_solution/fixture.rb +39 -0
- data/lib/sports_manager/tournament_solution/serializer.rb +107 -0
- data/lib/sports_manager/tournament_solution/solution.rb +85 -0
- data/lib/sports_manager/tournament_solution.rb +34 -0
- data/lib/sports_manager/version.rb +5 -0
- data/sports-manager.gemspec +35 -0
- metadata +120 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SportsManager
|
4
|
+
class TournamentSolution
|
5
|
+
# Public: A schedule for the participating teams.
|
6
|
+
class Solution
|
7
|
+
attr_reader :fixtures
|
8
|
+
|
9
|
+
CATEGORY_SEPARATOR = /[_-]/.freeze
|
10
|
+
|
11
|
+
def initialize(fixtures)
|
12
|
+
@fixtures = fixtures
|
13
|
+
end
|
14
|
+
|
15
|
+
def courts
|
16
|
+
fixtures.map(&:court).uniq
|
17
|
+
end
|
18
|
+
|
19
|
+
def categories
|
20
|
+
fixtures.map(&:category).uniq
|
21
|
+
end
|
22
|
+
|
23
|
+
def fixtures_dependencies_by_category
|
24
|
+
fixtures_dependencies.uniq.group_by(&:category)
|
25
|
+
end
|
26
|
+
|
27
|
+
def acronyms
|
28
|
+
categories.reduce({}) do |acronyms, category|
|
29
|
+
category_acronym = build_category_acronym(category, 2, acronyms)
|
30
|
+
|
31
|
+
acronyms.merge(category => category_acronym)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def fixtures_dependencies
|
38
|
+
(fixtures | bye_dependencies).flatten.uniq.sort_by(&:match_id)
|
39
|
+
end
|
40
|
+
|
41
|
+
def bye_dependencies
|
42
|
+
fixtures.flat_map(&:bye_dependencies)
|
43
|
+
end
|
44
|
+
|
45
|
+
def build_category_acronym(category, size = 2, reference = {})
|
46
|
+
parts = category.to_s.split(CATEGORY_SEPARATOR)
|
47
|
+
interval = (0..size)
|
48
|
+
|
49
|
+
build_acronym(parts, interval, reference)
|
50
|
+
end
|
51
|
+
|
52
|
+
def build_acronym(parts, interval, reference, acronym = [])
|
53
|
+
max_size = interval.max
|
54
|
+
|
55
|
+
interval.reduce(acronym) do |acronym_reduce, position|
|
56
|
+
result = update_acronym(acronym_reduce, parts, position, max_size)
|
57
|
+
|
58
|
+
acr = result.each_slice(parts.size).reduce(&:zip).join
|
59
|
+
|
60
|
+
next acr if acr.size < max_size
|
61
|
+
break acr unless reference.values.include?(acr)
|
62
|
+
|
63
|
+
new_interval = interval.minmax.map(&1.method(:+))
|
64
|
+
|
65
|
+
acr = build_acronym(parts, new_interval, reference, result)
|
66
|
+
|
67
|
+
break acr
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def update_acronym(acronym, parts, position, max_size)
|
72
|
+
remaining_size = max_size - acronym.size
|
73
|
+
letters = extract_acronym(parts, position, remaining_size)
|
74
|
+
acronym.push(*letters)
|
75
|
+
end
|
76
|
+
|
77
|
+
def extract_acronym(parts, position, remain_size)
|
78
|
+
parts
|
79
|
+
.map { |part| part[position] }
|
80
|
+
.compact
|
81
|
+
.yield_self { |mapped_letters| mapped_letters.map { |letter| letter[0..remain_size] } }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SportsManager
|
4
|
+
# Public: A tournament with its possible solutions containing the
|
5
|
+
# fixtures for each solution
|
6
|
+
#
|
7
|
+
# Note: Fixture is a schedule for the participating teams.
|
8
|
+
class TournamentSolution
|
9
|
+
attr_reader :tournament, :tournament_solutions
|
10
|
+
|
11
|
+
def initialize(tournament:, solutions:)
|
12
|
+
@tournament = tournament
|
13
|
+
@tournament_solutions = solutions
|
14
|
+
end
|
15
|
+
|
16
|
+
def solutions
|
17
|
+
@solutions ||= tournament_solutions
|
18
|
+
.map { |fixtures| Fixture.build_fixtures(fixtures) }
|
19
|
+
.map { |fixtures| Solution.new(fixtures) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def solved?
|
23
|
+
solutions && !solutions.empty?
|
24
|
+
end
|
25
|
+
|
26
|
+
def total_solutions
|
27
|
+
solutions.size
|
28
|
+
end
|
29
|
+
|
30
|
+
def as_json(options = nil)
|
31
|
+
Serializer.new(self).as_json(options)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/sports_manager/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'sports-manager'
|
7
|
+
spec.version = SportsManager::VERSION
|
8
|
+
spec.authors = ['André Benjamim', 'Gustavo Alberto']
|
9
|
+
spec.email = ['andre.benjamim@rebase.com.br', 'gustavo.costa@rebase.com.br']
|
10
|
+
|
11
|
+
spec.summary = 'A Ruby tournament schedule generator tool.'
|
12
|
+
spec.description = 'This gem generates a tournament schedule based on a list of variables.'
|
13
|
+
spec.homepage = 'https://github.com/Rebase-BR/sports-manager'
|
14
|
+
spec.required_ruby_version = '>= 2.5.8'
|
15
|
+
|
16
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
17
|
+
spec.metadata['source_code_uri'] = 'https://github.com/Rebase-BR/sports-manager'
|
18
|
+
|
19
|
+
# Specify which files should be added to the gem when it is released.
|
20
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
21
|
+
spec.files = Dir.chdir(__dir__) do
|
22
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
23
|
+
(File.expand_path(f) == __FILE__) ||
|
24
|
+
f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
spec.bindir = 'exe'
|
28
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
29
|
+
spec.require_paths = ['lib']
|
30
|
+
|
31
|
+
spec.add_dependency 'csp-resolver', '~> 0.0.1'
|
32
|
+
|
33
|
+
# For more information and examples about making a new gem, check out our
|
34
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sports-manager
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- André Benjamim
|
8
|
+
- Gustavo Alberto
|
9
|
+
autorequire:
|
10
|
+
bindir: exe
|
11
|
+
cert_chain: []
|
12
|
+
date: 2024-07-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: csp-resolver
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.0.1
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.0.1
|
28
|
+
description: This gem generates a tournament schedule based on a list of variables.
|
29
|
+
email:
|
30
|
+
- andre.benjamim@rebase.com.br
|
31
|
+
- gustavo.costa@rebase.com.br
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- ".rspec"
|
37
|
+
- ".rubocop.yml"
|
38
|
+
- CODE_OF_CONDUCT.md
|
39
|
+
- CONTRIBUTING.md
|
40
|
+
- MIT-LICENSE
|
41
|
+
- README.md
|
42
|
+
- Rakefile
|
43
|
+
- lib/sports-manager.rb
|
44
|
+
- lib/sports_manager/algorithms/filtering/no_overlap.rb
|
45
|
+
- lib/sports_manager/algorithms/ordering/multiple_matches_participant.rb
|
46
|
+
- lib/sports_manager/bye_match.rb
|
47
|
+
- lib/sports_manager/constraint_builder.rb
|
48
|
+
- lib/sports_manager/constraints/all_different_constraint.rb
|
49
|
+
- lib/sports_manager/constraints/match_constraint.rb
|
50
|
+
- lib/sports_manager/constraints/multi_category_constraint.rb
|
51
|
+
- lib/sports_manager/constraints/next_round_constraint.rb
|
52
|
+
- lib/sports_manager/constraints/no_overlapping_constraint.rb
|
53
|
+
- lib/sports_manager/double_team.rb
|
54
|
+
- lib/sports_manager/group.rb
|
55
|
+
- lib/sports_manager/group_builder.rb
|
56
|
+
- lib/sports_manager/helper.rb
|
57
|
+
- lib/sports_manager/json_helper.rb
|
58
|
+
- lib/sports_manager/match.rb
|
59
|
+
- lib/sports_manager/match_builder.rb
|
60
|
+
- lib/sports_manager/matches/algorithms/single_elimination_algorithm.rb
|
61
|
+
- lib/sports_manager/matches/next_round.rb
|
62
|
+
- lib/sports_manager/matches_generator.rb
|
63
|
+
- lib/sports_manager/nil_team.rb
|
64
|
+
- lib/sports_manager/participant.rb
|
65
|
+
- lib/sports_manager/single_team.rb
|
66
|
+
- lib/sports_manager/solution_drawer.rb
|
67
|
+
- lib/sports_manager/solution_drawer/cli.rb
|
68
|
+
- lib/sports_manager/solution_drawer/cli/solution_table.rb
|
69
|
+
- lib/sports_manager/solution_drawer/cli/table.rb
|
70
|
+
- lib/sports_manager/solution_drawer/mermaid.rb
|
71
|
+
- lib/sports_manager/solution_drawer/mermaid/bye_node.rb
|
72
|
+
- lib/sports_manager/solution_drawer/mermaid/gantt.rb
|
73
|
+
- lib/sports_manager/solution_drawer/mermaid/graph.rb
|
74
|
+
- lib/sports_manager/solution_drawer/mermaid/node.rb
|
75
|
+
- lib/sports_manager/solution_drawer/mermaid/node_style.rb
|
76
|
+
- lib/sports_manager/solution_drawer/mermaid/solution_gantt.rb
|
77
|
+
- lib/sports_manager/solution_drawer/mermaid/solution_graph.rb
|
78
|
+
- lib/sports_manager/team.rb
|
79
|
+
- lib/sports_manager/team_builder.rb
|
80
|
+
- lib/sports_manager/timeslot.rb
|
81
|
+
- lib/sports_manager/timeslot_builder.rb
|
82
|
+
- lib/sports_manager/tournament.rb
|
83
|
+
- lib/sports_manager/tournament/setting.rb
|
84
|
+
- lib/sports_manager/tournament_builder.rb
|
85
|
+
- lib/sports_manager/tournament_day.rb
|
86
|
+
- lib/sports_manager/tournament_day/validator.rb
|
87
|
+
- lib/sports_manager/tournament_generator.rb
|
88
|
+
- lib/sports_manager/tournament_problem_builder.rb
|
89
|
+
- lib/sports_manager/tournament_solution.rb
|
90
|
+
- lib/sports_manager/tournament_solution/bye_fixture.rb
|
91
|
+
- lib/sports_manager/tournament_solution/fixture.rb
|
92
|
+
- lib/sports_manager/tournament_solution/serializer.rb
|
93
|
+
- lib/sports_manager/tournament_solution/solution.rb
|
94
|
+
- lib/sports_manager/version.rb
|
95
|
+
- sports-manager.gemspec
|
96
|
+
homepage: https://github.com/Rebase-BR/sports-manager
|
97
|
+
licenses: []
|
98
|
+
metadata:
|
99
|
+
homepage_uri: https://github.com/Rebase-BR/sports-manager
|
100
|
+
source_code_uri: https://github.com/Rebase-BR/sports-manager
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 2.5.8
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubygems_version: 3.0.8
|
117
|
+
signing_key:
|
118
|
+
specification_version: 4
|
119
|
+
summary: A Ruby tournament schedule generator tool.
|
120
|
+
test_files: []
|