Fullscreen/squid

View on GitHub
lib/squid/configuration.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'ostruct'

module Squid
  # Provides an object to store global configuration settings.
  #
  # This class is typically not used directly, but by calling
  # {Squid::Config#configure Squid.configure}, which creates and updates a
  # single instance of {Squid::Configuration}.
  #
  # @example Set the default height for Squid graphs:
  #   Squid.configure do |config|
  #     config.height = 150
  #     config.steps = 4
  #   end
  #
  # @see Squid::Config for more examples.
  #
  # An alternative way to set global configuration settings is by storing
  # them in the following environment variables:
  #
  # * +SQUID_HEIGHT+ to store the default graph height
  #
  # In case both methods are used together,
  # {Squid::Config#configure Squid.configure} takes precedence.
  #
  # @example Set the default graph height:
  #   ENV['SQUID_HEIGHT'] =  '150'
  #   ENV['SQUID_GRIDLINES'] =  '4'
  #
  class Configuration < OpenStruct
    def self.boolean
      -> (value) { %w(1 t T true TRUE).include? value }
    end

    def self.integer
      -> (value) { value.to_i }
    end

    def self.symbol
      -> (value) { value.to_sym }
    end

    def self.float
      -> (value) { value.to_f }
    end

    def self.array(proc = nil)
      -> (values) { values.split.map{|value| proc ? proc.call(value) : value} }
    end

    ATTRIBUTES = {
      baseline:     {as: boolean,        default: 'true'},
      border:       {as: boolean,        default: 'false'},
      chart:        {as: boolean,        default: 'true'},
      colors:       {as: array},
      every:        {as: integer,        default: '1'},
      formats:      {as: array(symbol)},
      height:       {as: float,          default: '250'},
      labels:       {as: array(boolean)},
      legend:       {as: boolean,        default: 'true'},
      line_widths:  {as: array(float)},
      steps:        {as: integer,        default: '4'},
      ticks:        {as: boolean,        default: 'true'},
      type:         {as: symbol,         default: 'column'},
    }

    attr_accessor *ATTRIBUTES.keys

    # Initialize the global configuration settings.
    def initialize
      ATTRIBUTES.each do |key, options|
        var = "squid_#{key}".upcase
        value = ENV.fetch var, options.fetch(:default, '')
        public_send "#{key}=", options[:as].call(value)
      end
    end
  end
end