lib/coursemology/evaluator/client.rb in coursemology-evaluator-0.1.1 vs lib/coursemology/evaluator/client.rb in coursemology-evaluator-0.1.3

- old
+ new

@@ -1,75 +1,81 @@ -# frozen_string_literal: true -class Coursemology::Evaluator::Client - def self.initialize(host, api_user_email, api_token) - Coursemology::Evaluator::Models::Base.base_url = host - Coursemology::Evaluator::Models::Base.api_user_email = api_user_email - Coursemology::Evaluator::Models::Base.api_token = api_token - - Coursemology::Evaluator::Models::Base.initialize - end - - # @param [Boolean] one_shot If the client should only fire one request. - def initialize(one_shot = false) - @terminate = one_shot - end - - def run - Signal.trap('SIGTERM', method(:on_sig_term)) - - loop do - allocate_evaluations - break if @terminate - - # :nocov: - # This sleep might not be triggered in the specs, because interruptions to the thread is - # nondeterministically run by the OS scheduler. - sleep(1.minute) - # :nocov: - end - end - - private - - # Requests evaluations from the server. - def allocate_evaluations - evaluations = - ActiveSupport::Notifications.instrument('allocate.client.evaluator.coursemology') do - languages = Coursemology::Polyglot::Language.concrete_languages.map(&:display_name) - Coursemology::Evaluator::Models::ProgrammingEvaluation.allocate(language: languages) - end - - on_allocate(evaluations) - rescue Flexirest::HTTPUnauthorisedClientException => e - ActiveSupport::Notifications.publish('allocate_fail.client.evaluator.coursemology', e: e) - end - - # The callback for handling an array of allocated evaluations. - # - # @param [Array<Coursemology::Evaluator::Models::ProgrammingEvaluation>] evaluations The - # evaluations retrieved from the server. - def on_allocate(evaluations) - evaluations.each do |evaluation| - on_evaluation(evaluation) - end - end - - # The callback for handling an evaluation. - # - # @param [Coursemology::Evaluator::Models::ProgrammingEvaluation] evaluation The evaluation - # retrieved from the server. - def on_evaluation(evaluation) - ActiveSupport::Notifications.instrument('evaluate.client.evaluator.coursemology', - evaluation: evaluation) do - evaluation.evaluate - end - - ActiveSupport::Notifications.instrument('save.client.evaluator.coursemology') do - evaluation.save - end - end - - # The callback for handling SIGTERM sent to the process. - def on_sig_term - @terminate = true - end -end +# frozen_string_literal: true +class Coursemology::Evaluator::Client + def self.initialize(host, api_user_email, api_token) + Coursemology::Evaluator::Models::Base.base_url = host + Coursemology::Evaluator::Models::Base.api_user_email = api_user_email + Coursemology::Evaluator::Models::Base.api_token = api_token + + Coursemology::Evaluator::Models::Base.initialize + end + + # @param [Boolean] one_shot If the client should only fire one request. + def initialize(one_shot = false) + @terminate = one_shot + end + + def run + Signal.trap('SIGTERM', method(:on_sig_term)) + + loop do + evaluations = allocate_evaluations + + if evaluations && !evaluations.empty? + on_allocate(evaluations) + else + # :nocov: + # This sleep might not be triggered in the specs, because interruptions to the thread is + # nondeterministically run by the OS scheduler. + sleep(1.minute) + # :nocov: + end + + break if @terminate + end + end + + private + + # Requests evaluations from the server. + # + # @return [Array<Coursemology::Evaluator::Models::ProgrammingEvaluation>] The evaluations + # retrieved from the server. + def allocate_evaluations + ActiveSupport::Notifications.instrument('allocate.client.evaluator.coursemology') do + languages = Coursemology::Polyglot::Language.concrete_languages.map(&:display_name) + Coursemology::Evaluator::Models::ProgrammingEvaluation.allocate(language: languages) + end + rescue Flexirest::HTTPUnauthorisedClientException => e + ActiveSupport::Notifications.publish('allocate_fail.client.evaluator.coursemology', e: e) + nil + end + + # The callback for handling an array of allocated evaluations. + # + # @param [Array<Coursemology::Evaluator::Models::ProgrammingEvaluation>] evaluations The + # evaluations retrieved from the server. + def on_allocate(evaluations) + evaluations.each do |evaluation| + on_evaluation(evaluation) + end + end + + # The callback for handling an evaluation. + # + # @param [Coursemology::Evaluator::Models::ProgrammingEvaluation] evaluation The evaluation + # retrieved from the server. + def on_evaluation(evaluation) + ActiveSupport::Notifications.instrument('evaluate.client.evaluator.coursemology', + evaluation: evaluation) do + evaluation.evaluate + end + + ActiveSupport::Notifications.instrument('save.client.evaluator.coursemology') do + evaluation.save + end + end + + # The callback for handling SIGTERM sent to the process. + def on_sig_term + @terminate = true + end +end