Set secrets.secret_key_base refs #13996
[arvados.git] / services / api / lib / config_loader.rb
index 2d1ddd8b8672feb3fb8f0d7460667f9c5bf62002..90b6d9ddc7b4ab0f7ff38c74c42f70f751c3c69a 100644 (file)
@@ -76,7 +76,7 @@ class ConfigLoader
     remainders
   end
 
-  def coercion_and_check check_cfg
+  def coercion_and_check check_cfg, check_nonempty: true
     @config_types.each do |cfgkey, cfgtype|
       cfg = check_cfg
       k = cfgkey
@@ -114,7 +114,7 @@ class ConfigLoader
       end
 
       if cfgtype == NonemptyString
-        if (!cfg[k] || cfg[k] == "")
+        if (!cfg[k] || cfg[k] == "") && check_nonempty
           raise "#{cfgkey} cannot be empty"
         end
         if cfg[k].is_a? String
@@ -172,7 +172,33 @@ class ConfigLoader
 
   def self.copy_into_config src, dst
     src.each do |k, v|
-      dst.send "#{k}=", Marshal.load(Marshal.dump v)
+      dst.send "#{k}=", self.to_OrderedOptions(v)
+    end
+  end
+
+  def self.to_OrderedOptions confs
+    if confs.is_a? Hash
+      opts = ActiveSupport::OrderedOptions.new
+      confs.each do |k,v|
+        opts[k] = self.to_OrderedOptions(v)
+      end
+      opts
+    elsif confs.is_a? Array
+      confs.map { |v| self.to_OrderedOptions v }
+    else
+      confs
+    end
+  end
+
+  def self.load path, erb: false
+    if File.exist? path
+      yaml = IO.read path
+      if erb
+        yaml = ERB.new(yaml).result(binding)
+      end
+      YAML.load(yaml, deserialize_symbols: false)
+    else
+      {}
     end
   end