From 5d02251cbbae2624e3b4ee410ffb175d916b7edd Mon Sep 17 00:00:00 2001 From: Sebastian Serth Date: Sun, 8 Jan 2023 14:10:14 +0100 Subject: [PATCH] Replace BooleanPresenceValidator with InclusionValidator The `BooleanPresenceValidator` is causing issues with Ruby 3.2+ YJIT irregularly. Fixes CODEOCEAN-GQ, fixes CODEOCEAN-GR --- app/models/code_ocean/file.rb | 5 ++--- app/models/community_solution_contribution.rb | 6 +++--- app/models/execution_environment.rb | 6 ++---- app/models/exercise.rb | 5 ++--- app/models/file_type.rb | 8 +++----- app/models/proxy_exercise.rb | 2 +- app/models/user.rb | 2 +- .../validations/boolean_presence_validator.rb | 16 ---------------- 8 files changed, 14 insertions(+), 36 deletions(-) delete mode 100644 lib/active_model/validations/boolean_presence_validator.rb diff --git a/app/models/code_ocean/file.rb b/app/models/code_ocean/file.rb index 81814c0e..9af290d0 100644 --- a/app/models/code_ocean/file.rb +++ b/app/models/code_ocean/file.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require File.expand_path('../../uploaders/file_uploader', __dir__) -require File.expand_path('../../../lib/active_model/validations/boolean_presence_validator', __dir__) module CodeOcean class File < ApplicationRecord @@ -49,9 +48,9 @@ module CodeOcean validates :feedback_message, if: :teacher_defined_assessment?, presence: true validates :feedback_message, absence: true, unless: :teacher_defined_assessment? validates :hashed_content, if: :content_present?, presence: true - validates :hidden, boolean_presence: true + validates :hidden, inclusion: [true, false] validates :name, presence: true - validates :read_only, boolean_presence: true + validates :read_only, inclusion: [true, false] validates :role, inclusion: {in: ROLES} validates :weight, if: :teacher_defined_assessment?, numericality: true, presence: true validates :weight, absence: true, unless: :teacher_defined_assessment? diff --git a/app/models/community_solution_contribution.rb b/app/models/community_solution_contribution.rb index e230456d..02b7da2f 100644 --- a/app/models/community_solution_contribution.rb +++ b/app/models/community_solution_contribution.rb @@ -7,8 +7,8 @@ class CommunitySolutionContribution < ApplicationRecord belongs_to :community_solution belongs_to :community_solution_lock - validates :proposed_changes, boolean_presence: true - validates :timely_contribution, boolean_presence: true - validates :autosave, boolean_presence: true + validates :proposed_changes, inclusion: [true, false] + validates :timely_contribution, inclusion: [true, false] + validates :autosave, inclusion: [true, false] validates :working_time, presence: true end diff --git a/app/models/execution_environment.rb b/app/models/execution_environment.rb index 5669d65e..7e5fa9ac 100644 --- a/app/models/execution_environment.rb +++ b/app/models/execution_environment.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require File.expand_path('../../lib/active_model/validations/boolean_presence_validator', __dir__) - class ExecutionEnvironment < ApplicationRecord include Creation include DefaultValues @@ -26,8 +24,8 @@ class ExecutionEnvironment < ApplicationRecord validates :docker_image, presence: true validates :memory_limit, numericality: {greater_than_or_equal_to: MINIMUM_MEMORY_LIMIT, only_integer: true}, presence: true - validates :network_enabled, boolean_presence: true - validates :privileged_execution, boolean_presence: true + validates :network_enabled, inclusion: [true, false] + validates :privileged_execution, inclusion: [true, false] validates :name, presence: true validates :permitted_execution_time, numericality: {only_integer: true}, presence: true validates :pool_size, numericality: {only_integer: true}, presence: true diff --git a/app/models/exercise.rb b/app/models/exercise.rb index 3bcedbdc..2359485e 100644 --- a/app/models/exercise.rb +++ b/app/models/exercise.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'nokogiri' -require File.expand_path('../../lib/active_model/validations/boolean_presence_validator', __dir__) class Exercise < ApplicationRecord include Context @@ -38,8 +37,8 @@ class Exercise < ApplicationRecord validate :valid_submission_deadlines? validates :description, presence: true validates :execution_environment, presence: true, if: -> { !unpublished? } - validates :public, boolean_presence: true - validates :unpublished, boolean_presence: true + validates :public, inclusion: [true, false] + validates :unpublished, inclusion: [true, false] validates :title, presence: true validates :token, presence: true, uniqueness: true validates :uuid, uniqueness: {if: -> { uuid.present? }} diff --git a/app/models/file_type.rb b/app/models/file_type.rb index db5690eb..6fd44048 100644 --- a/app/models/file_type.rb +++ b/app/models/file_type.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require File.expand_path('../../lib/active_model/validations/boolean_presence_validator', __dir__) - class FileType < ApplicationRecord include Creation include DefaultValues @@ -22,12 +20,12 @@ class FileType < ApplicationRecord has_many :files, class_name: 'CodeOcean::File' has_many :file_templates - validates :binary, boolean_presence: true + validates :binary, inclusion: [true, false] validates :editor_mode, presence: true, unless: :binary? - validates :executable, boolean_presence: true + validates :executable, inclusion: [true, false] validates :indent_size, presence: true, unless: :binary? validates :name, presence: true - validates :renderable, boolean_presence: true + validates :renderable, inclusion: [true, false] %i[audio compressed csv excel image pdf powerpoint video word].each do |type| define_method("#{type}?") do diff --git a/app/models/proxy_exercise.rb b/app/models/proxy_exercise.rb index 2e2216ed..d576d57c 100644 --- a/app/models/proxy_exercise.rb +++ b/app/models/proxy_exercise.rb @@ -11,7 +11,7 @@ class ProxyExercise < ApplicationRecord has_and_belongs_to_many :exercises has_many :user_proxy_exercise_exercises - validates :public, boolean_presence: true + validates :public, inclusion: [true, false] def count_files exercises.count diff --git a/app/models/user.rb b/app/models/user.rb index 36486384..1177f999 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -33,7 +33,7 @@ class User < ApplicationRecord end } - validates :platform_admin, boolean_presence: true + validates :platform_admin, inclusion: [true, false] def internal_user? is_a?(InternalUser) diff --git a/lib/active_model/validations/boolean_presence_validator.rb b/lib/active_model/validations/boolean_presence_validator.rb deleted file mode 100644 index 7a2e606f..00000000 --- a/lib/active_model/validations/boolean_presence_validator.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -module ActiveModel - module Validations - class BooleanPresenceValidator < EachValidator - BOOLEAN_VALUES = [false, true].freeze - - def validate(record) - [attributes].flatten.each do |attribute| - value = record.send(:read_attribute_for_validation, attribute) - record.errors.add(attribute, nil, **options) unless BOOLEAN_VALUES.include?(value) - end - end - end - end -end