config_man 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 +17 -0
- data/Gemfile +4 -0
- data/README.md +32 -0
- data/Rakefile +2 -0
- data/config_man.gemspec +17 -0
- data/lib/config_man.rb +41 -0
- data/lib/config_man/version.rb +3 -0
- data/test/config_man_test.rb +38 -0
- metadata +54 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# ConfigMan
|
2
|
+
|
3
|
+
ConfigMan is a simple library, without external dependencies, to load config files and expose an interface on top of them.
|
4
|
+
|
5
|
+
## How to Use
|
6
|
+
|
7
|
+
Let's say for example we have this yaml config file:
|
8
|
+
|
9
|
+
```yaml
|
10
|
+
foo:
|
11
|
+
bar:
|
12
|
+
baz: qux
|
13
|
+
barbar: [1,2,3]
|
14
|
+
bazbaz:
|
15
|
+
foofoo:
|
16
|
+
barbar: qux
|
17
|
+
```
|
18
|
+
|
19
|
+
We can load it like this:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
config = ConfigMan::Loader.new('config/config.yml')
|
23
|
+
config.foo.bar.baz # "qux"
|
24
|
+
config.foo.barbar # [1,2,3]
|
25
|
+
config.foo.bazbaz.foofoo.barbar # "qux"
|
26
|
+
```
|
27
|
+
|
28
|
+
Instead of acessing it directly, we can also export as a hash:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
config.foo.to_hash # {bar: {baz: "qux"}, barbar: [1,2,3], ...}
|
32
|
+
```
|
data/Rakefile
ADDED
data/config_man.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/config_man/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Cainã Costa"]
|
6
|
+
gem.email = ["cainan.costa@gmail.com"]
|
7
|
+
gem.description = %q{Simplifies repetitive work of parsing configuration files}
|
8
|
+
gem.summary = %q{Simplifies repetitive work of parsing configuration files}
|
9
|
+
gem.homepage = "https://github.com/sryche/config_man"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "config_man"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = ConfigMan::VERSION
|
17
|
+
end
|
data/lib/config_man.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'delegate'
|
4
|
+
require "config_man/version"
|
5
|
+
|
6
|
+
module ConfigMan
|
7
|
+
class Item < OpenStruct
|
8
|
+
def initialize(attributes)
|
9
|
+
@attributes = attributes
|
10
|
+
|
11
|
+
attributes = attributes.map do |k,v|
|
12
|
+
v = self.class.new(v) if v.is_a? Hash
|
13
|
+
[k,v]
|
14
|
+
end
|
15
|
+
|
16
|
+
super(attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_hash
|
20
|
+
@attributes
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Loader < SimpleDelegator
|
25
|
+
def initialize(contents)
|
26
|
+
struct = YAML.load(contents).map do |k,v|
|
27
|
+
v = Item.new(symbolize_keys(v)) if v.is_a? Hash
|
28
|
+
[k,v]
|
29
|
+
end
|
30
|
+
|
31
|
+
super(Item.new(Hash[struct]))
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
# Borrowed from ActiveSupport
|
36
|
+
def symbolize_keys(hash)
|
37
|
+
map = hash.map { |(k,v)| [(k.to_sym rescue k), v] }
|
38
|
+
Hash[map]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
$:.unshift File.expand_path('../lib', File.dirname(__FILE__))
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'config_man'
|
4
|
+
|
5
|
+
class ConfigLoaderTest < MiniTest::Unit::TestCase
|
6
|
+
def sample
|
7
|
+
@sample ||= { 'foo' => 'bar',
|
8
|
+
'baz' => {'foo' => 'bar'},
|
9
|
+
'qux' => {'foo' => {'bar' => 'baz'}}
|
10
|
+
}.to_yaml
|
11
|
+
end
|
12
|
+
|
13
|
+
def subject
|
14
|
+
@subject ||= ConfigMan::Loader.new(sample)
|
15
|
+
end
|
16
|
+
|
17
|
+
def assert_is_a(target, klass, msg = nil)
|
18
|
+
msg ||= "Expected #{target} to be a #{klass}"
|
19
|
+
assert target.is_a?(klass), msg
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_generates_methods_for_top_level_configurations
|
23
|
+
assert_equal 'bar', subject.foo
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_generates_methods_recursively
|
27
|
+
assert_is_a subject.baz, ConfigMan::Item
|
28
|
+
assert_is_a subject.qux, ConfigMan::Item
|
29
|
+
assert_is_a subject.qux.foo, ConfigMan::Item
|
30
|
+
|
31
|
+
assert_equal 'bar', subject.baz.foo
|
32
|
+
assert_equal 'baz', subject.qux.foo.bar
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_export_keys_to_hashes
|
36
|
+
assert_equal({foo: 'bar'}, subject.baz.to_hash)
|
37
|
+
end
|
38
|
+
end
|
metadata
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: config_man
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Cainã Costa
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-14 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Simplifies repetitive work of parsing configuration files
|
15
|
+
email:
|
16
|
+
- cainan.costa@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- README.md
|
24
|
+
- Rakefile
|
25
|
+
- config_man.gemspec
|
26
|
+
- lib/config_man.rb
|
27
|
+
- lib/config_man/version.rb
|
28
|
+
- test/config_man_test.rb
|
29
|
+
homepage: https://github.com/sryche/config_man
|
30
|
+
licenses: []
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubyforge_project:
|
49
|
+
rubygems_version: 1.8.10
|
50
|
+
signing_key:
|
51
|
+
specification_version: 3
|
52
|
+
summary: Simplifies repetitive work of parsing configuration files
|
53
|
+
test_files:
|
54
|
+
- test/config_man_test.rb
|