saveconf 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/Gemfile +5 -0
- data/README.md +24 -0
- data/Rakefile +2 -0
- data/lib/saveconf.rb +11 -0
- data/lib/saveconf/config.rb +109 -0
- data/lib/saveconf/version.rb +3 -0
- data/saveconf.gemspec +21 -0
- data/test/unit.rb +37 -0
- metadata +57 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
Lets you specify configuration schemes and configurations in a manner, that they can be ckecked at compile time.
|
2
|
+
|
3
|
+
`
|
4
|
+
class ConfigSchema < Saveconf::Base
|
5
|
+
schema(
|
6
|
+
host: 'some important server',
|
7
|
+
web_app: {
|
8
|
+
host: 'another important server',
|
9
|
+
user: 'user for basic auth',
|
10
|
+
password: 'basic auth pw'
|
11
|
+
}
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
class Production < ConfigSchema
|
16
|
+
host! "http://localhost:8080"
|
17
|
+
|
18
|
+
web_app! do
|
19
|
+
host! "http://testing.local/"
|
20
|
+
user! "matt"
|
21
|
+
password! "xxx"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
`
|
data/Rakefile
ADDED
data/lib/saveconf.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
module Saveconf
|
2
|
+
|
3
|
+
# the object that is capable of giving me the children
|
4
|
+
# of complex attributes
|
5
|
+
class Accessor
|
6
|
+
def initialize(hash, prefix)
|
7
|
+
@hash = hash
|
8
|
+
@prefix = prefix
|
9
|
+
end
|
10
|
+
|
11
|
+
def get(name)
|
12
|
+
@hash[(@prefix.dup << name).join('.')]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Base class for all config. Subclass this to be able to define your own
|
17
|
+
# schema.
|
18
|
+
class Base
|
19
|
+
|
20
|
+
@@CURRENT_PATH = []
|
21
|
+
@@GETTER = Object.new()
|
22
|
+
@@VALUES = {}
|
23
|
+
|
24
|
+
def self.get(path)
|
25
|
+
@@VALUES[path]
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.schema schema_hash
|
29
|
+
@@SCHEMA = schema_hash
|
30
|
+
setter = hash_keys(schema_hash)
|
31
|
+
setter.each do |setter_name|
|
32
|
+
puts "call def_setter for #{setter_name}"
|
33
|
+
def_setter(setter_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
schema_hash.each_pair do |k,v|
|
37
|
+
if v.is_a?(Hash)
|
38
|
+
child_accessor = mk_child_accessor([k], v)
|
39
|
+
send :define_singleton_method, k do
|
40
|
+
child_accessor
|
41
|
+
end
|
42
|
+
else
|
43
|
+
send :define_singleton_method, k do
|
44
|
+
@@VALUES[k.to_s]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.mk_child_accessor(prefix, hash)
|
51
|
+
accessor = Accessor.new(@@VALUES, prefix)
|
52
|
+
hash.each_pair do |child_name,child|
|
53
|
+
if child.is_a?(Hash)
|
54
|
+
child_accessor = mk_child_accessor(prefix.dup << child_name, child)
|
55
|
+
accessor.instance_eval do
|
56
|
+
def child_name
|
57
|
+
child_accessor
|
58
|
+
end
|
59
|
+
end
|
60
|
+
else
|
61
|
+
accessor.instance_eval <<-"end_eval"
|
62
|
+
def #{child_name} *args
|
63
|
+
self.get("#{child_name}")
|
64
|
+
end
|
65
|
+
end_eval
|
66
|
+
end
|
67
|
+
end
|
68
|
+
accessor
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
def self.def_setter(name)
|
73
|
+
send :define_singleton_method, name.to_s + '!' do |value = @@GETTER, &blk|
|
74
|
+
if blk != nil
|
75
|
+
@@CURRENT_PATH << name
|
76
|
+
blk.call
|
77
|
+
@@CURRENT_PATH.pop()
|
78
|
+
else
|
79
|
+
@@CURRENT_PATH << name
|
80
|
+
set_value(@@CURRENT_PATH, value)
|
81
|
+
@@CURRENT_PATH.pop()
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.set_value(keys, value)
|
87
|
+
@@VALUES[keys.join('.')] = value
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.hash_keys hash
|
91
|
+
res = []
|
92
|
+
hash.each_pair do |k,v|
|
93
|
+
res << k
|
94
|
+
if v.is_a?(Hash)
|
95
|
+
res += hash_keys(v)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
res
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.print
|
102
|
+
@@VALUES.each_pair do |k,v|
|
103
|
+
puts "#{k}: #{v}"
|
104
|
+
end
|
105
|
+
nil
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
data/saveconf.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "saveconf/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "saveconf"
|
7
|
+
s.version = Saveconf::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Axel Tetzlaff"]
|
10
|
+
s.email = ["axel.tetzlaff@fortytools.com"]
|
11
|
+
s.homepage = "http://www.fortytools.com"
|
12
|
+
s.summary = %q{A configuration DSL}
|
13
|
+
s.description = %q{Lets you specify configuration schemes and configurations in a manner, that they can be ckecked at compile time}
|
14
|
+
|
15
|
+
s.rubyforge_project = "saveconf"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
data/test/unit.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'saveconf'
|
3
|
+
|
4
|
+
class ConfigSchema < Saveconf::Base
|
5
|
+
schema(
|
6
|
+
host: 'some important server',
|
7
|
+
web_app: {
|
8
|
+
host: 'another important server',
|
9
|
+
user: 'user for basic auth',
|
10
|
+
password: 'basic auth pw'
|
11
|
+
}
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
class Production < ConfigSchema
|
16
|
+
host! "http://localhost:8080"
|
17
|
+
|
18
|
+
web_app! do
|
19
|
+
host! "http://testing.local/"
|
20
|
+
user! "matt"
|
21
|
+
password! "xxx"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class UnitTests < Test::Unit::TestCase
|
27
|
+
def test_flat_attribut
|
28
|
+
Production.print
|
29
|
+
assert_equal "http://localhost:8080", Production.host
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_complex_attribut
|
33
|
+
assert_equal "xxx", Production.web_app.password
|
34
|
+
assert_equal "http://testing.local/", Production.web_app.host
|
35
|
+
assert_equal "matt", Production.web_app.user
|
36
|
+
end
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: saveconf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Axel Tetzlaff
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-20 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Lets you specify configuration schemes and configurations in a manner,
|
15
|
+
that they can be ckecked at compile time
|
16
|
+
email:
|
17
|
+
- axel.tetzlaff@fortytools.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- .gitignore
|
23
|
+
- Gemfile
|
24
|
+
- README.md
|
25
|
+
- Rakefile
|
26
|
+
- lib/saveconf.rb
|
27
|
+
- lib/saveconf/config.rb
|
28
|
+
- lib/saveconf/version.rb
|
29
|
+
- saveconf.gemspec
|
30
|
+
- test/.unit.rb.swp
|
31
|
+
- test/unit.rb
|
32
|
+
homepage: http://www.fortytools.com
|
33
|
+
licenses: []
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
36
|
+
require_paths:
|
37
|
+
- lib
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
requirements: []
|
51
|
+
rubyforge_project: saveconf
|
52
|
+
rubygems_version: 1.8.10
|
53
|
+
signing_key:
|
54
|
+
specification_version: 3
|
55
|
+
summary: A configuration DSL
|
56
|
+
test_files:
|
57
|
+
- test/unit.rb
|