From 4fa66526699007709065eb240dd36804235b1c93 Mon Sep 17 00:00:00 2001 From: Dag Odenhall Date: Thu, 17 Apr 2008 23:45:59 +0200 Subject: [PATCH] Common config API and drivers for DSL and YAML --- lib/amazing/config.rb | 66 ++++++++++++++++++++++++++++++++ lib/amazing/config/dsl.rb | 24 ++++++++++++ lib/amazing/config/dsl/awesome.rb | 26 +++++++++++++ lib/amazing/config/dsl/awesome/widget.rb | 27 +++++++++++++ lib/amazing/config/yaml.rb | 11 ++++++ 5 files changed, 154 insertions(+) create mode 100644 lib/amazing/config.rb create mode 100644 lib/amazing/config/dsl.rb create mode 100644 lib/amazing/config/dsl/awesome.rb create mode 100644 lib/amazing/config/dsl/awesome/widget.rb create mode 100644 lib/amazing/config/yaml.rb diff --git a/lib/amazing/config.rb b/lib/amazing/config.rb new file mode 100644 index 0000000..2287685 --- /dev/null +++ b/lib/amazing/config.rb @@ -0,0 +1,66 @@ +require 'amazing/string' +require 'amazing/config/dsl' +require 'amazing/config/yaml' + +module Amazing + class Config < Hash + def initialize(config) + @config = config + case File.extname(@config)[1..-1].to_sym + when :rb + from_dsl + when :yml, :yaml + from_yaml + end + end + + private + + def from_dsl + dsl = Dsl.new(@config) + self[:awesome] = [] + dsl.awesome_statusbars.each do |awesome| + self[:awesome] << {} + self[:awesome][-1][:screen] = awesome.options[:screen] || 0 + self[:awesome][-1][:statusbar] = awesome.options[:statusbar] || "mystatusbar" + self[:awesome][-1][:widgets] = [] + awesome.widgets.each do |widget| + self[:awesome][-1][:widgets] << {} + self[:awesome][-1][:widgets][-1][:identifier] = widget.identifier + self[:awesome][-1][:widgets][-1][:properties] = widget.properties + self[:awesome][-1][:widgets][-1].merge!(widget.options) + self[:awesome][-1][:widgets][-1][:module] ||= widget.identifier + self[:awesome][-1][:widgets][-1][:property] ||= "text" + self[:awesome][-1][:widgets][-1][:module] = self[:awesome][-1][:widgets][-1][:module].to_s.camel_case + end + end + end + + def from_yaml + yaml = Yaml.new(@config) + self[:awesome] = [] + yaml["awesome"].each do |awesome| + self[:awesome] << {} + self[:awesome][-1][:screen] = awesome["screen"] || 0 + self[:awesome][-1][:statusbar] = awesome["statusbar"] || "mystatusbar" + self[:awesome][-1][:widgets] = [] + awesome["widgets"].each do |widget| + self[:awesome][-1][:widgets] << {} + case widget + when Hash + self[:awesome][-1][:widgets][-1][:identifier] = widget.keys[0] + widget.values[0].each do |key, value| + self[:awesome][-1][:widgets][-1][key.to_sym] = value + end + self[:awesome][-1][:widgets][-1][:module] ||= widget.keys[0] + when String + self[:awesome][-1][:widgets][-1][:identifier] = widget + self[:awesome][-1][:widgets][-1][:module] = widget + end + self[:awesome][-1][:widgets][-1][:property] ||= "text" + self[:awesome][-1][:widgets][-1][:module] = self[:awesome][-1][:widgets][-1][:module].to_s.camel_case + end + end + end + end +end diff --git a/lib/amazing/config/dsl.rb b/lib/amazing/config/dsl.rb new file mode 100644 index 0000000..f0a9989 --- /dev/null +++ b/lib/amazing/config/dsl.rb @@ -0,0 +1,24 @@ +require 'amazing/config/dsl/awesome' + +module Amazing + class Config < Hash + class Dsl + attr_reader :awesome_statusbars + + def initialize(config=nil, &block) + @awesome_statusbars = [] + import(config) + import(&block) + end + + def import(config=nil, &block) + instance_eval(File.read(config)) if config + instance_eval(&block) if block + end + + def awesome(opts={}, &block) + @awesome_statusbars << Awesome.new(opts, &block) + end + end + end +end diff --git a/lib/amazing/config/dsl/awesome.rb b/lib/amazing/config/dsl/awesome.rb new file mode 100644 index 0000000..705a0f2 --- /dev/null +++ b/lib/amazing/config/dsl/awesome.rb @@ -0,0 +1,26 @@ +require 'amazing/config/dsl/awesome/widget' + +module Amazing + class Config < Hash + class Dsl + class Awesome + attr_reader :options + attr_reader :widgets + + def initialize(opts={}, &block) + @options = opts + @widgets = [] + instance_eval(&block) + end + + def set(opts) + @options.merge!(opts) + end + + def widget(identifier, opts={}, &block) + @widgets << Widget.new(identifier, opts, &block) + end + end + end + end +end diff --git a/lib/amazing/config/dsl/awesome/widget.rb b/lib/amazing/config/dsl/awesome/widget.rb new file mode 100644 index 0000000..4e8a726 --- /dev/null +++ b/lib/amazing/config/dsl/awesome/widget.rb @@ -0,0 +1,27 @@ +module Amazing + class Config < Hash + class Dsl + class Awesome + class Widget + attr_reader :options + attr_reader :identifier + attr_reader :properties + + def initialize(identifier, opts={}, &block) + @identifier, @options = identifier, opts + @properties = {} + instance_eval(&block) if block + end + + def set(opts) + @options.merge!(opts) + end + + def property(name, &block) + @properties[name] = block + end + end + end + end + end +end diff --git a/lib/amazing/config/yaml.rb b/lib/amazing/config/yaml.rb new file mode 100644 index 0000000..c059f3d --- /dev/null +++ b/lib/amazing/config/yaml.rb @@ -0,0 +1,11 @@ +require 'yaml' + +module Amazing + class Config < Hash + class Yaml < Hash + def initialize(config) + merge!(YAML.load_file(config)) + end + end + end +end -- 2.11.4.GIT