Class: Judges::Judges
Overview
Collection of all judges to run.
In the directory dir the following structure must be maintained:
dir/
judge-one/
judge-one.rb
other files...
judge-two/
judge-two.rb
other files...
The name of a directory of a judge must be exactly the same as the name of the .rb script inside the directory.
- Author
-
Yegor Bugayenko (yegor256@gmail.com)
- Copyright
-
Copyright © 2024-2025 Yegor Bugayenko
- License
-
MIT
Instance Method Summary collapse
-
#each {|Judges::Judge| ... } ⇒ Enumerator
Iterates over all valid judges in the directory.
-
#each_with_index {|Judges::Judge, Integer| ... } ⇒ Integer
Iterates over all judges while tracking their index position.
-
#get(name) ⇒ Judges::Judge
Retrieves a specific judge by its name.
-
#initialize(dir, lib, loog, start: Time.now, shuffle: '', boost: []) ⇒ Judges
constructor
Initialize.
Constructor Details
#initialize(dir, lib, loog, start: Time.now, shuffle: '', boost: []) ⇒ Judges
Initialize.
36 37 38 39 40 41 42 43 |
# File 'lib/judges/judges.rb', line 36 def initialize(dir, lib, loog, start: Time.now, shuffle: '', boost: []) @dir = dir @lib = lib @loog = loog @start = start @shuffle = shuffle || '' @boost = boost end |
Instance Method Details
#each {|Judges::Judge| ... } ⇒ Enumerator
Iterates over all valid judges in the directory.
This method discovers all judge directories, validates them (ensuring they contain a corresponding .rb file), and yields them in a specific order. The order is determined by:
-
Judges whose names match the boost list are placed first
-
Judges whose names start with the shuffle prefix are randomly reordered
-
All other judges maintain their alphabetical order
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/judges/judges.rb', line 69 def each(&) return to_enum(__method__) unless block_given? list = Dir.glob(File.join(@dir, '*')).each.to_a.map do |d| next unless File.directory?(d) b = File.basename(d) next unless File.exist?(File.join(d, "#{b}.rb")) Judges::Judge.new(File.absolute_path(d), @lib, @loog) end list.compact! list.sort_by!(&:name) all = list.each_with_index.to_a good = all.dup mapping = all .map { |a| [a[0].name, a[1], a[1]] } .reject { |a| a[0].start_with?(@shuffle) } .to_h { |a| [a[1], a[2]] } positions = mapping.values.shuffle mapping.keys.zip(positions).to_h.each do |before, after| good[after] = all[before] end ret = [] good.map { |a| a[0] }.each do |j| if @boost&.include?(j.name) ret.prepend(j) else ret.append(j) end end ret.each(&) end |
#each_with_index {|Judges::Judge, Integer| ... } ⇒ Integer
Iterates over all judges while tracking their index position.
This method calls the #each method and additionally provides a zero-based index for each judge yielded. The judges are processed in the same order as determined by the #each method (with boost and shuffle rules applied).
109 110 111 112 113 114 115 116 |
# File 'lib/judges/judges.rb', line 109 def each_with_index idx = 0 each do |p| yield [p, idx] idx += 1 end idx end |
#get(name) ⇒ Judges::Judge
Retrieves a specific judge by its name.
The judge must exist as a directory within the judges directory with the given name.
52 53 54 55 56 |
# File 'lib/judges/judges.rb', line 52 def get(name) d = File.absolute_path(File.join(@dir, name)) raise "Judge #{name} doesn't exist in #{@dir}" unless File.exist?(d) Judges::Judge.new(d, @lib, @loog, start: @start) end |