mose/configstruct

View on GitHub
lib/configstruct.rb

Summary

Maintainability
A
25 mins
Test Coverage
require 'ostruct'
require 'yaml'

# the Configstruct object
# inherits from OpenStruct and adds some features:
# - set default values
# - redirects output and input IO to custom streams
# - writes file on disk as yaml
class ConfigStruct < OpenStruct

  # creates new object
  def initialize(options = nil, input = STDIN, output = STDOUT, unless_set = false)
    super(options)
    @input = input
    @output = output
    @unless_set = unless_set
    set_defaults
    prepare_dirs
    addvalues
  end

  # sets defaults value for initializer
  def set_defaults
    default :basedir, '/tmp'
    default :basefile, File.join(self.basedir, 'config.yml')
  end

  # creates dir where to store config if it does not exist
  def prepare_dirs
    FileUtils.mkdir_p self.basedir unless Dir.exist? self.basedir
  end

  # adds value in the configuration hash
  def addvalues
    setup unless File.exist? self.basefile
    YAML.load_file(self.basefile).each do |k, v|
      unless @unless_set && defined? self[v]
        new_ostruct_member(k)
        send("#{k}=", v)
      end
    end
  end

  # creates a blank config file with empty values
  def setup
    write Hash.new
  end

  # attributes value if it is nil
  def default(var, value)
    send(var).nil? && send("#{var}=", value)
  end

  # writes config faile on disk as yaml
  def write(values)
    File.open(self.basefile, 'w') do |f|
      f.write YAML.dump(values)
    end
  end

  # redirect puts to the initialized output
  def puts(*string)
    @output.puts *string
  end

  # redirect print to the initialized output
  def print(*string)
    @output.print *string
  end

  # redirect printf to the initialized output
  def printf(string, *args)
    @output.printf string, *args
  end

  # redirect gets fromm the initialized input
  def gets(*args)
    @input.gets *args
  end

end