lib/abak-flow/configuration.rb
# coding: utf-8
module Abak::Flow
class Configuration
# TODO: Add old oauth_login and oauth_token
AVAILABLE_OPTIONS = %w{login password locale http_proxy}.map(&:freeze)
GITCONFIG_PATTERN = /abak\-flow\.([\w\d\-\_]+)/.freeze
def initialize(options = nil)
@_errors = Hash.new
@options = {
login: nil,
password: nil,
locale: "en",
http_proxy: ENV["http_proxy"] || ENV["HTTP_PROXY"]
}
options.nil? ? define_options_from_gitconfig
: define_options_from_hash(options)
create_public_instance_methods
end
def rewrite(options)
define_options_from_hash(options)
write_to_gitconfig!
end
def valid?
@_errors = Hash.new
@_errors["login"] = ['blank'] if @options[:login].to_s.empty?
@_errors["password"] = ['blank'] if @options[:password].to_s.empty?
@_errors.empty?
end
def errors
ErrorsPresenter.new(self, @_errors)
end
private
def create_public_instance_methods
AVAILABLE_OPTIONS.each do |name|
self.class.send(:define_method, name, -> { @options[name.to_sym] })
end
end
def write_to_gitconfig!
AVAILABLE_OPTIONS.each do |name|
value = @options[name.to_sym]
next if value.nil? || value.empty?
Manager.git.lib.global_config_set("abak-flow.#{name}", value)
end
end
def define_options_from_hash(hash)
hash.each do|name, value|
name = underscore(name.to_s)
next unless AVAILABLE_OPTIONS.include?(name)
@options[name.to_sym] = value
end
end
def define_options_from_gitconfig
read_git_config do |name, value|
name = underscore(name)
next unless AVAILABLE_OPTIONS.include?(name)
@options[name.to_sym] = value
end
end
def read_git_config(&block)
Manager.git.config.each do |option, value|
matches = option.match(GITCONFIG_PATTERN)
block.call(underscore(matches[1]), value) if matches && matches[1]
end
end
def underscore(name)
name.tr("-", "_")
end
def dasherize(name)
name.tr("_", "-")
end
end # class Configuration
end # module Abak::Flow