Class: Judges::Judge
Overview
A single judge.
- Author
-
Yegor Bugayenko ([email protected])
- Copyright
-
Copyright © 2024-2025 Yegor Bugayenko
- License
-
MIT
Instance Attribute Summary collapse
-
#dir ⇒ Object
readonly
Returns the value of attribute dir.
Instance Method Summary collapse
-
#initialize(dir, lib, loog, epoch: Time.now) ⇒ Judge
constructor
Ctor.
-
#name ⇒ String
Returns the name of the judge.
-
#run(fb, global, local, options) ⇒ nil
Executes the judge script with the provided factbase and configuration.
-
#script ⇒ String
Returns the name of the main Ruby script file for this judge.
-
#tests ⇒ Array<String>
Returns all YAML test files in the judge directory.
-
#to_s ⇒ String
Returns the string representation of the judge.
-
#with_loog(loog) ⇒ Judges::Judge
A new judge, with a different log.
Constructor Details
#initialize(dir, lib, loog, epoch: Time.now) ⇒ Judge
Ctor.
24 25 26 27 28 29 |
# File 'lib/judges/judge.rb', line 24 def initialize(dir, lib, loog, epoch: Time.now) @dir = dir @lib = lib @loog = loog @epoch = epoch end |
Instance Attribute Details
#dir ⇒ Object (readonly)
Returns the value of attribute dir.
18 19 20 |
# File 'lib/judges/judge.rb', line 18 def dir @dir end |
Instance Method Details
#name ⇒ String
Returns the name of the judge.
The name is derived from the directory name containing the judge.
98 99 100 |
# File 'lib/judges/judge.rb', line 98 def name File.basename(@dir) end |
#run(fb, global, local, options) ⇒ nil
Executes the judge script with the provided factbase and configuration.
This method sets up the execution environment by creating global variables, loading library files, and running the judge script. It tracks execution time and captures any errors that occur during execution.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/judges/judge.rb', line 58 def run(fb, global, local, ) $fb = fb $judge = File.basename(@dir) = $loog = @loog $global = global $global.delete(:fb) # to make sure Tallied is always actual $local = local $epoch = @epoch $kickoff = Time.now .to_h.each { |k, v| ENV.store(k.to_s, v.to_s) } unless @lib.nil? raise "Lib dir #{@lib.to_rel} is absent" unless File.exist?(@lib) raise "Lib #{@lib.to_rel} is not a directory" unless File.directory?(@lib) Dir.glob(File.join(@lib, '*.rb')).each do |f| require_relative(File.absolute_path(f)) end end s = File.join(@dir, script) raise "Can't load '#{s}'" unless File.exist?(s) elapsed(@loog, good: "#{$judge} completed", level: Logger::INFO) do load(s, true) nil # rubocop:disable Lint/RescueException rescue Exception => e # rubocop:enable Lint/RescueException @loog.error(Backtrace.new(e)) raise e if e.is_a?(StandardError) raise e if e.is_a?(Timeout::ExitException) raise "#{e.message} (#{e.class.name})" ensure $fb = $judge = = $loog = $epoch = $kickoff = nil end end |
#script ⇒ String
Returns the name of the main Ruby script file for this judge.
The script file must have the same name as the judge directory with a .rb extension. For example, if the judge directory is “quality”, the script must be “quality.rb”.
109 110 111 112 113 114 |
# File 'lib/judges/judge.rb', line 109 def script b = "#{File.basename(@dir)}.rb" files = Dir.glob(File.join(@dir, '*.rb')).map { |f| File.basename(f) } raise "No #{b} script in #{@dir.to_rel} among #{files}" unless files.include?(b) b end |
#tests ⇒ Array<String>
Returns all YAML test files in the judge directory.
Test files are expected to have a .yml extension and contain test data used to validate the judge’s behavior.
122 123 124 |
# File 'lib/judges/judge.rb', line 122 def tests Dir.glob(File.join(@dir, '*.yml')) end |
#to_s ⇒ String
Returns the string representation of the judge.
34 35 36 |
# File 'lib/judges/judge.rb', line 34 def to_s name end |
#with_loog(loog) ⇒ Judges::Judge
A new judge, with a different log.
42 43 44 |
# File 'lib/judges/judge.rb', line 42 def with_loog(loog) Judges::Judge.new(@dir, @lib, loog, epoch: @epoch) end |