kung_figure 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,88 @@
1
+ = Simple Rest
2
+
3
+ * http://github.com/niquola/kung_figure
4
+
5
+ == DESCRIPTION
6
+
7
+ Simple RUBY configuration DSL
8
+
9
+ == INSTALL:
10
+
11
+ sudo gem install kung_figure
12
+
13
+ or for rails in config/environment.rb
14
+
15
+ config.gem 'kung_figure'
16
+
17
+ then
18
+
19
+ sudo rake gems:install
20
+
21
+ == USAGE
22
+
23
+ Example:
24
+
25
+ module MyModule
26
+ include KungFigure
27
+ class Config < KungFigure::Base
28
+ define_prop :prop1,'default1'
29
+ define_prop :prop2, 2
30
+
31
+ class NestedConfig < KungFigure::Base
32
+ define_prop :prop3,'prop3'
33
+
34
+ class NestedNestedConfig < KungFigure::Base
35
+ define_prop :prop4,'prop4'
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ This will add method configure,config,load_config into MyModule:
42
+
43
+ MyModule.configure do
44
+ prop1 'new value'
45
+ nested_config do
46
+ prop3 'new value'
47
+ end
48
+ end
49
+
50
+ and accessors for configs:
51
+
52
+ MyModule.config.prop1
53
+ MyModule.config.nested_config.prop1
54
+
55
+ You can also include KungFigure into nested in module classes and declare Config class (subclassing KungFigure::Base)
56
+ to get similar result:
57
+
58
+
59
+ module MyModule
60
+ include KungFigure
61
+ class Config < KungFigure::Base
62
+ define_prop :prop1,'default1'
63
+ end
64
+ #somewhere in another file
65
+ class WorkHorse
66
+ include KungFigure
67
+ class Config < KungFigure::Base
68
+ define_prop :my_config,'default'
69
+ end
70
+
71
+ def meth
72
+ config.my_config
73
+ end
74
+ end
75
+ end
76
+
77
+ Then your can access configuration with:
78
+
79
+ MyModule::WorkHorse.config or MyModule.config.work_horse
80
+
81
+ Or inside instances of WorkHorse as config method.
82
+
83
+
84
+ == CHANGE LOG
85
+
86
+ == MORE
87
+
88
+ For more info see tests and source code :)
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'rake/gempackagetask'
5
+
6
+ desc 'Default: run unit tests.'
7
+ task :default => :test
8
+
9
+ desc 'Test the pg_gnostic plugin.'
10
+ Rake::TestTask.new(:test) do |t|
11
+ t.libs << 'lib'
12
+ t.libs << 'test'
13
+ t.pattern = 'test/**/*_test.rb'
14
+ t.verbose = true
15
+ end
16
+
17
+ desc 'Generate documentation for the pg_gnostic plugin.'
18
+ Rake::RDocTask.new(:rdoc) do |rdoc|
19
+ rdoc.rdoc_dir = 'rdoc'
20
+ rdoc.title = 'kung_figure'
21
+ rdoc.options << '--line-numbers' << '--inline-source'
22
+ rdoc.rdoc_files.include('README.rdoc')
23
+ rdoc.rdoc_files.include('lib/**/*.rb')
24
+ end
25
+
26
+
27
+ PKG_FILES = FileList[ '[a-zA-Z]*', 'generators/**/*', 'lib/**/*', 'rails/**/*', 'tasks/**/*', 'test/**/*' ]
28
+
29
+ spec = Gem::Specification.new do |s|
30
+ s.name = "kung_figure"
31
+ s.version = "0.0.1"
32
+ s.author = "niquola"
33
+ s.email = "niquola@gmail.com"
34
+ s.homepage = "http://github.com/niquola/kung_figure"
35
+ s.platform = Gem::Platform::RUBY
36
+ s.summary = "Ruby configuration DSL base"
37
+ s.files = PKG_FILES.to_a
38
+ s.require_path = "lib"
39
+ s.has_rdoc = false
40
+ s.extra_rdoc_files = ["README.rdoc"]
41
+ end
42
+
43
+ desc 'Turn this plugin into a gem.'
44
+ Rake::GemPackageTask.new(spec) do |pkg|
45
+ pkg.gem_spec = spec
46
+ end
@@ -0,0 +1,79 @@
1
+ module KungFigure
2
+
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ def config
8
+ self.class.config
9
+ end
10
+
11
+ module ClassMethods
12
+ def set_root_config_class(klazz)
13
+ @root_config_class = klazz
14
+ end
15
+
16
+ def root_config_class
17
+ self.const_get(@root_config_class || :Config)
18
+ end
19
+
20
+ def config
21
+ @config ||= root_config_class.new
22
+ end
23
+
24
+ def configure(&block)
25
+ config.instance_eval &block
26
+ end
27
+
28
+ def load_config(path)
29
+ load path
30
+ end
31
+ end
32
+
33
+ class Base
34
+ class << self
35
+ def define_prop(name,default)
36
+ define_method(name) do |*args|
37
+ @props ||= {}
38
+ if args.length > 0
39
+ @props[name] = args[0]
40
+ else
41
+ @props[name] || default
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ def camelize(str)
48
+ str.split('_').map{|l| l.capitalize}.join('')
49
+ end
50
+
51
+ def get_from_enclosing_module(klazz_name)
52
+ config_klazz_path=self.class.name.to_s.split('::')[0..-2]
53
+ config_klazz_path<< klazz_name
54
+ config_klazz_path.inject(Object){|parent,nxt|
55
+ break unless parent.const_defined?(nxt.to_sym)
56
+ parent.const_get(nxt.to_sym)
57
+ }
58
+ end
59
+
60
+ def method_missing(key,&block)
61
+ @props ||= {}
62
+ klazz_name = camelize(key.to_s).to_sym
63
+ child_cfg_clazz = self.class.const_get(klazz_name) if self.class.const_defined?(klazz_name)
64
+ child_cfg_clazz ||= get_from_enclosing_module(klazz_name)
65
+
66
+ raise "No such configuration #{key}" unless child_cfg_clazz
67
+
68
+ unless @props.key?(key)
69
+ @props[key] = if child_cfg_clazz.ancestors.include?(KungFigure::Base)
70
+ child_cfg_clazz.new
71
+ elsif child_cfg_clazz.respond_to?(:config)
72
+ child_cfg_clazz.config
73
+ end
74
+ end
75
+ @props[key].instance_eval(&block) if block_given?
76
+ return @props[key]
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,60 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ module MyModule
4
+ include KungFigure
5
+ class Config < KungFigure::Base
6
+ define_prop :prop1,'default1'
7
+ define_prop :prop2, 2
8
+
9
+ class NestedConfig < KungFigure::Base
10
+ define_prop :prop3,'prop3'
11
+
12
+ class NestedNestedConfig < KungFigure::Base
13
+ define_prop :prop4,'prop4'
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+ module MyModule
21
+ class WorkHorse
22
+ include KungFigure
23
+ class Config < KungFigure::Base
24
+ define_prop :my_config,'default'
25
+ end
26
+ end
27
+ end
28
+
29
+ class TestKungFigure < Test::Unit::TestCase
30
+ def test_configuration
31
+ assert_equal('default1',MyModule.config.prop1)
32
+ assert_equal(2,MyModule.config.prop2)
33
+ assert_equal('prop3',MyModule.config.nested_config.prop3)
34
+ assert_equal('prop4',MyModule.config.nested_config.nested_nested_config.prop4)
35
+
36
+ MyModule.config.nested_config.nested_nested_config.prop4 'new value'
37
+ assert_equal('new value',MyModule.config.nested_config.nested_nested_config.prop4)
38
+
39
+ MyModule.configure do
40
+ nested_config do
41
+ prop3 'value3'
42
+ end
43
+ end
44
+
45
+ assert_equal('value3',MyModule.config.nested_config.prop3)
46
+ end
47
+
48
+ def test_nested_config_declaration
49
+ assert_equal('default',MyModule.config.work_horse.my_config)
50
+ assert_equal('default',MyModule::WorkHorse.config.my_config)
51
+ MyModule.configure do
52
+ work_horse do
53
+ my_config 'new value'
54
+ end
55
+ end
56
+ assert_equal('new value',MyModule.config.work_horse.my_config)
57
+ assert_equal('new value',MyModule::WorkHorse.config.my_config)
58
+ assert_equal(MyModule::WorkHorse.config,MyModule::WorkHorse.new.config)
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ def path(path)
2
+ File.join(File.dirname(__FILE__),path)
3
+ end
4
+
5
+ $:.unshift(path('../lib'))
6
+ require "kung_figure"
7
+ require "test/unit"
8
+
9
+
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kung_figure
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - niquola
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-03-10 00:00:00 +03:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: niquola@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ files:
25
+ - Rakefile
26
+ - README.rdoc
27
+ - lib/kung_figure.rb
28
+ - test/kung_figure_test.rb
29
+ - test/test_helper.rb
30
+ has_rdoc: true
31
+ homepage: http://github.com/niquola/kung_figure
32
+ licenses: []
33
+
34
+ post_install_message:
35
+ rdoc_options: []
36
+
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ requirements: []
52
+
53
+ rubyforge_project:
54
+ rubygems_version: 1.3.5
55
+ signing_key:
56
+ specification_version: 3
57
+ summary: Ruby configuration DSL base
58
+ test_files: []
59
+