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.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +1 -0
  3. data/.rubocop.yml +32 -0
  4. data/CODE_OF_CONDUCT.md +132 -0
  5. data/CONTRIBUTING.md +72 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +419 -0
  8. data/Rakefile +4 -0
  9. data/lib/sports-manager.rb +59 -0
  10. data/lib/sports_manager/algorithms/filtering/no_overlap.rb +52 -0
  11. data/lib/sports_manager/algorithms/ordering/multiple_matches_participant.rb +78 -0
  12. data/lib/sports_manager/bye_match.rb +62 -0
  13. data/lib/sports_manager/constraint_builder.rb +30 -0
  14. data/lib/sports_manager/constraints/all_different_constraint.rb +24 -0
  15. data/lib/sports_manager/constraints/match_constraint.rb +37 -0
  16. data/lib/sports_manager/constraints/multi_category_constraint.rb +49 -0
  17. data/lib/sports_manager/constraints/next_round_constraint.rb +48 -0
  18. data/lib/sports_manager/constraints/no_overlapping_constraint.rb +55 -0
  19. data/lib/sports_manager/double_team.rb +7 -0
  20. data/lib/sports_manager/group.rb +42 -0
  21. data/lib/sports_manager/group_builder.rb +72 -0
  22. data/lib/sports_manager/helper.rb +228 -0
  23. data/lib/sports_manager/json_helper.rb +129 -0
  24. data/lib/sports_manager/match.rb +91 -0
  25. data/lib/sports_manager/match_builder.rb +112 -0
  26. data/lib/sports_manager/matches/algorithms/single_elimination_algorithm.rb +94 -0
  27. data/lib/sports_manager/matches/next_round.rb +38 -0
  28. data/lib/sports_manager/matches_generator.rb +33 -0
  29. data/lib/sports_manager/nil_team.rb +24 -0
  30. data/lib/sports_manager/participant.rb +23 -0
  31. data/lib/sports_manager/single_team.rb +7 -0
  32. data/lib/sports_manager/solution_drawer/cli/solution_table.rb +38 -0
  33. data/lib/sports_manager/solution_drawer/cli/table.rb +94 -0
  34. data/lib/sports_manager/solution_drawer/cli.rb +75 -0
  35. data/lib/sports_manager/solution_drawer/mermaid/bye_node.rb +39 -0
  36. data/lib/sports_manager/solution_drawer/mermaid/gantt.rb +126 -0
  37. data/lib/sports_manager/solution_drawer/mermaid/graph.rb +111 -0
  38. data/lib/sports_manager/solution_drawer/mermaid/node.rb +55 -0
  39. data/lib/sports_manager/solution_drawer/mermaid/node_style.rb +89 -0
  40. data/lib/sports_manager/solution_drawer/mermaid/solution_gantt.rb +57 -0
  41. data/lib/sports_manager/solution_drawer/mermaid/solution_graph.rb +76 -0
  42. data/lib/sports_manager/solution_drawer/mermaid.rb +65 -0
  43. data/lib/sports_manager/solution_drawer.rb +23 -0
  44. data/lib/sports_manager/team.rb +47 -0
  45. data/lib/sports_manager/team_builder.rb +31 -0
  46. data/lib/sports_manager/timeslot.rb +37 -0
  47. data/lib/sports_manager/timeslot_builder.rb +50 -0
  48. data/lib/sports_manager/tournament/setting.rb +45 -0
  49. data/lib/sports_manager/tournament.rb +69 -0
  50. data/lib/sports_manager/tournament_builder.rb +123 -0
  51. data/lib/sports_manager/tournament_day/validator.rb +69 -0
  52. data/lib/sports_manager/tournament_day.rb +50 -0
  53. data/lib/sports_manager/tournament_generator.rb +183 -0
  54. data/lib/sports_manager/tournament_problem_builder.rb +106 -0
  55. data/lib/sports_manager/tournament_solution/bye_fixture.rb +21 -0
  56. data/lib/sports_manager/tournament_solution/fixture.rb +39 -0
  57. data/lib/sports_manager/tournament_solution/serializer.rb +107 -0
  58. data/lib/sports_manager/tournament_solution/solution.rb +85 -0
  59. data/lib/sports_manager/tournament_solution.rb +34 -0
  60. data/lib/sports_manager/version.rb +5 -0
  61. data/sports-manager.gemspec +35 -0
  62. 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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SportsManager
4
+ VERSION = '0.0.1'
5
+ 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: []