51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module GitlabSettings
 | 
						|
  class Settings
 | 
						|
    attr_reader :source
 | 
						|
 | 
						|
    def initialize(source, section)
 | 
						|
      raise(ArgumentError, 'config source is required') if source.blank?
 | 
						|
      raise(ArgumentError, 'config section is required') if section.blank?
 | 
						|
 | 
						|
      # Rails will set the default encoding to UTF-8
 | 
						|
      # (https://github.com/rails/rails/blob/v6.1.7.2/railties/lib/rails.rb#L21C1-L24),
 | 
						|
      # but it's possible this class is used before `require 'rails'` is
 | 
						|
      # called, as in the case of `sidekiq-cluster`. Ensure the
 | 
						|
      # configuration file is parsed as UTF-8, or
 | 
						|
      # ActiveSupport::ConfigurationFile.parse will blow up if the
 | 
						|
      # configuration file contains UTF-8 characters.
 | 
						|
      Encoding.default_external = Encoding::UTF_8
 | 
						|
      Encoding.default_internal = Encoding::UTF_8
 | 
						|
 | 
						|
      @source = source
 | 
						|
      @section = section
 | 
						|
      @loaded = false
 | 
						|
    end
 | 
						|
 | 
						|
    def reload!
 | 
						|
      yaml = ActiveSupport::ConfigurationFile.parse(source)
 | 
						|
      all_configs = yaml.deep_stringify_keys
 | 
						|
      configs = all_configs[section]
 | 
						|
 | 
						|
      @config = Options.build(configs).tap do
 | 
						|
        @loaded = true
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    def method_missing(name, *args)
 | 
						|
      reload! unless @loaded
 | 
						|
 | 
						|
      config.public_send(name, *args) # rubocop: disable GitlabSecurity/PublicSend
 | 
						|
    end
 | 
						|
 | 
						|
    def respond_to_missing?(name, include_all = false)
 | 
						|
      config.respond_to?(name, include_all)
 | 
						|
    end
 | 
						|
 | 
						|
    private
 | 
						|
 | 
						|
    attr_reader :config, :section
 | 
						|
  end
 | 
						|
end
 |