Refactor CodeOcean::Config class

The new architecture memorizes settings (which we mostly did after reading the config so far) and also exposes the resulting file path as well as further settings.

This change is a prerequisite to define a dependency with Sprockets.
This commit is contained in:
Sebastian Serth
2024-05-08 21:31:55 +03:00
committed by Sebastian Serth
parent dcaedfa9fe
commit 336519b21d
4 changed files with 11 additions and 7 deletions

View File

@ -27,7 +27,7 @@ var CodeOceanEditor = {
lastCopyText: null, lastCopyText: null,
<% @config ||= CodeOcean::Config.new(:code_ocean).read(erb: false) %> <% @config ||= CodeOcean::Config.new(:code_ocean, erb: false).read %>
// Important notice: Changing the config values requires any content-wise // Important notice: Changing the config values requires any content-wise
// modification for this file in the development environment. Lacking to do so // modification for this file in the development environment. Lacking to do so
// will result in the old, server-side cached serving of this file even across // will result in the old, server-side cached serving of this file even across

View File

@ -2,12 +2,16 @@
module CodeOcean module CodeOcean
class Config class Config
def initialize(filename) attr_reader :path, :read
@filename = filename
def initialize(filename, options = {})
@path = Rails.root.join('config', "#{filename}.yml#{options[:erb] ? '.erb' : ''}")
@read = parse(options)
end end
def read(options = {}) private
path = Rails.root.join('config', "#{@filename}.yml#{options[:erb] ? '.erb' : ''}")
def parse(options)
if ::File.exist?(path) if ::File.exist?(path)
yaml_content = ::File.new(path, 'r').read || '' yaml_content = ::File.new(path, 'r').read || ''
yaml_content = ERB.new(yaml_content).result if options[:erb] yaml_content = ERB.new(yaml_content).result if options[:erb]

View File

@ -146,7 +146,7 @@ class Runner::Strategy::DockerContainerPool < Runner::Strategy
def self.config def self.config
@config ||= begin @config ||= begin
# Since the docker configuration file contains code that must be executed, we use ERB templating. # Since the docker configuration file contains code that must be executed, we use ERB templating.
docker_config = CodeOcean::Config.new(:docker).read(erb: true) docker_config = CodeOcean::Config.new(:docker, erb: true).read
codeocean_config = CodeOcean::Config.new(:code_ocean).read[:runner_management] || {} codeocean_config = CodeOcean::Config.new(:code_ocean).read[:runner_management] || {}
# All keys in `docker_config` take precedence over those in `codeocean_config` # All keys in `docker_config` take precedence over those in `codeocean_config`
docker_config.merge codeocean_config docker_config.merge codeocean_config

View File

@ -30,7 +30,7 @@ RSpec.describe CodeOcean::Config do
context 'with a .yml.erb file' do context 'with a .yml.erb file' do
let(:path) { Rails.root.join('config', "#{filename}.yml.erb") } let(:path) { Rails.root.join('config', "#{filename}.yml.erb") }
let(:read) { described_class.new(filename).read(erb: true) } let(:read) { described_class.new(filename, erb: true).read }
context 'when the file is present' do context 'when the file is present' do
before { File.write(path, {Rails.env.to_s => content}.to_yaml) } before { File.write(path, {Rails.env.to_s => content}.to_yaml) }