Skip to content

Instantly share code, notes, and snippets.

@servel333
Created July 8, 2014 18:14
Show Gist options
  • Save servel333/c592bb636226db4c8935 to your computer and use it in GitHub Desktop.
Save servel333/c592bb636226db4c8935 to your computer and use it in GitHub Desktop.
Dynamic builder config
require 'docile'
require 'linguistics'
Linguistics.use :en
class BuilderConfig
def initialize
@paths = @@paths
@versions = @@versions
end
def self.defaults(&block) Docile.dsl_eval(self, &block) end
def eval(&block) Docile.dsl_eval(self, &block) end
@@paths = {}
def self.set_path(k,v) @@paths[k] = v end
def set_path(k,v) @paths[k] = v end
def path(k, *append_paths) File.join( @paths[k], *append_paths ) end
attr_accessor :paths
@@versions = {}
def self.set_version(k,v) @@versions[k] = v end
def set_version(k,v) @versions[k] = v end
def version(k) @versions[k] end
attr_accessor :versions
def self.set_value(name, value)
class_variable_set "@@#{name}", value
define_method(name) { value }
end
def set_value(name, value)
instance_variable_set "@#{name}", value
define_singleton_method(name) { value }
end
end
BuilderConfig.defaults do
set_version :component1, '1.1'
set_version :component2, '2.2'
set_path :global, 'Global'
set_value :global_value, "global default value"
end
config = BuilderConfig.new.eval do
set_version :component3, '3.3'
set_path :local, 'Local'
set_value :local_value, "Some value for this instance only."
end
config.eval do
puts path :global, 'sub', 'two'
#=> Global/sub/two
puts path :local, 'sub', 'two'
#=> Local/sub/two
puts global_value
#=> global default value
puts local_value
#=> Some value for this instance only.
puts version :component1
#=> 1.1
puts version :component2
#=> 2.2
puts version :component3
#=> 3.3
puts inspect
#=> #<BuilderConfig:0x007fd41392e2c8
# @paths={:global=>"Global", :local=>"Local"},
# @versions={:component1=>"1.1", :component2=>"2.2", :component3=>"3.3"},
# @local_value="Some value for this instance only."
# >
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment