diff --git a/judge/scripts/lib/configuration.rb b/judge/scripts/lib/configuration.rb new file mode 100644 --- /dev/null +++ b/judge/scripts/lib/configuration.rb @@ -0,0 +1,84 @@ +module Grader + + # This singleton class holds basic configurations for grader. When + # running in each mode, grader uses resources from different + # directories and outputs differently. Usually the attributes name + # are descriptive; below we explain more on each attributes. + class Configuration + # Rails' environment: "development", "production" + attr_accessor :rails_env + + # Grader looks for problem [prob] in problem_dir/[prob], and store + # execution results for submission [x] of user [u] in directory + # user_result_dir/[u]/[x] + attr_accessor :problems_dir + attr_accessor :user_result_dir + + # If report_grader=true, the grader would add a row in model + # GraderProcess. It would report itself with grader_hostname and + # process id. + attr_accessor :report_grader + attr_accessor :grader_hostname + + # If talkative=true, grader would report status to console. If + # logging=true, grader would report status to a log file located + # in log_dir, in a file name mode.options.pid. TODO: defined + # log file naming. + attr_accessor :talkative + attr_accessor :logging + attr_accessor :log_dir + + # These are directories related to the test interface. + attr_accessor :test_request_input_base_dir + attr_accessor :test_request_output_base_dir + attr_accessor :test_request_problem_templates_dir + + # Comment received from the grading script will be filtered + # through Configuration#report_comment. How this method behave + # depends on this option; right now only two formats, :short and + # :long + attr_accessor :comment_report_style + + def report_comment(comment) + case comment_report_style + when :short + if comment.chomp =~ /^[\[\]P]+$/ # all P's + 'passed' + elsif comment.chomp =~ /[Cc]ompil.*[Ee]rror/ + 'compilation error' + else + 'failed' + end + + when :full + comment.chomp + end + end + + # Codes for singleton + private_class_method :new + + @@instance = nil + + def self.get_instance + if @@instance==nil + @@instance = new + end + @@instance + end + + private + def initialize + @talkative = false + @log_file = nil + @report_grader = false + @grader_hostname = `hostname`.chomp + + @rails_env = 'development' + + @comment_report_style = :full + end + + end + +end