shlima/click_house

View on GitHub
lib/click_house/config.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module ClickHouse
  class Config
    DEFAULTS = {
      adapter: Faraday.default_adapter,
      url: nil,
      scheme: 'http',
      host: 'localhost',
      port: '8123',
      logger: nil,
      database: nil,
      username: nil,
      password: nil,
      timeout: nil,
      open_timeout: nil,
      ssl_verify: false,
      headers: {},
      global_params: {},
      json_parser: ClickHouse::Middleware::ParseJson,
      json_serializer: ClickHouse::Serializer::JsonSerializer,
      oj_dump_options: {
        mode: :compat # to be able to dump improper JSON like {1 => 2}
      },
      oj_load_options: {
        mode: :custom,
        allow_blank: true,
        bigdecimal_as_decimal: false, # dump BigDecimal as a String
        bigdecimal_load: :bigdecimal, # convert all decimal numbers to BigDecimal
      },
      json_load_options: {
        decimal_class: BigDecimal,
      },
      # should be after json load options
      symbolize_keys: false,
    }.freeze

    attr_accessor :adapter
    attr_accessor :logger
    attr_accessor :scheme
    attr_accessor :host
    attr_accessor :port
    attr_accessor :database
    attr_accessor :url
    attr_accessor :username
    attr_accessor :password
    attr_accessor :timeout
    attr_accessor :open_timeout
    attr_accessor :ssl_verify
    attr_accessor :headers
    attr_accessor :global_params
    attr_accessor :oj_load_options
    attr_accessor :json_load_options
    attr_accessor :json_parser # response middleware
    attr_accessor :oj_dump_options
    attr_accessor :json_serializer # [ClickHouse::Serializer::Base]
    attr_accessor :symbolize_keys # [NilClass, Boolean]

    def initialize(params = {})
      assign(DEFAULTS.merge(params))
      yield(self) if block_given?
    end

    # @return [self]
    def assign(params = {})
      params.each { |k, v| public_send("#{k}=", v) }

      self
    end

    def auth?
      !username.nil? || !password.nil?
    end

    def logger!
      @logger || null_logger
    end

    def url!
      @url || "#{scheme}://#{host}:#{port}"
    end

    def null_logger
      @null_logger ||= Logger.new(IO::NULL)
    end

    # @param klass [ClickHouse::Serializer::Base]
    def json_serializer=(klass)
      @json_serializer = klass.new(self)
    end

    def symbolize_keys=(value)
      bool = value ? true : false

      # merge to be able to clone a config
      # prevent overriding default values
      self.oj_load_options = oj_load_options.merge(symbol_keys: bool)
      self.json_load_options = json_load_options.merge(symbolize_names: bool)
      @symbolize_keys = bool
    end

    # @param name [Symbol, String]
    def key(name)
      symbolize_keys ? name.to_sym : name.to_s
    end
  end
end