configer 1.1.5 → 1.2.0
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.
- checksums.yaml +4 -4
- data/README.md +48 -24
- data/VERSION +1 -1
- data/configer.gemspec +0 -2
- data/example/sample.rb +5 -14
- data/lib/configer.rb +6 -3
- data/lib/configer/dsl.rb +14 -0
- data/lib/configer/extension.rb +40 -0
- data/lib/configer/json.rb +9 -7
- data/lib/configer/object.rb +86 -0
- data/lib/configer/support.rb +110 -0
- data/lib/configer/yaml.rb +9 -7
- data/sandbox/sup.rb +5 -0
- metadata +7 -18
- data/lib/configer/data.rb +0 -23
- data/lib/configer/ext.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 202d00d5d27f01cfa525c1276d2f2f15f9c52337
|
4
|
+
data.tar.gz: f9981a345e25028fdf592597691240dcc555c47c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1da607c49dad2517dc7768667b7bf47c70fb73d69beff18406a5d960da6d64365b6845b1e360f44edd677fe3c7570b2d0ccd471cbc9ff019604617b1e59fac8
|
7
|
+
data.tar.gz: 9611db7e29d26b23c11f395d12d7ef4bd0b062d3c8989c42ac1fc8d7b8c51715afeab99a688fdebb3f73929520f9ead9508dc34bf3418ef59fb1aef4e9bd37ef
|
data/README.md
CHANGED
@@ -1,29 +1,61 @@
|
|
1
1
|
configer
|
2
2
|
========
|
3
|
-
|
4
3
|
super easy to use configuration module for ruby apps
|
5
4
|
|
5
|
+
### install
|
6
|
+
|
7
|
+
$ gem install configer
|
8
|
+
|
6
9
|
### example
|
7
10
|
|
11
|
+
#### Lazy Config object
|
12
|
+
|
13
|
+
The configers default behavior is , when you put a yaml or a json file into the following directories
|
14
|
+
* app_root/lib/meta/**/*
|
15
|
+
* app_root/lib/meta/*
|
16
|
+
* app_root/lib/custom_libary_name/meta/*
|
17
|
+
* app_root/config/*
|
18
|
+
* app_root/config/environments/*
|
19
|
+
|
20
|
+
The meta tag can be aliased with META
|
21
|
+
|
22
|
+
The logic is the following:
|
23
|
+
* in the lib/meta/*
|
24
|
+
* will be merged into the __config__ hash object under the key of the file name
|
25
|
+
* in the lib/meta/folder/*
|
26
|
+
* will be merged into the __config__ object with the folder as main key and under that file name as key for the content
|
27
|
+
* in the lib/folder/meta/*
|
28
|
+
* will be merged into the __config__ object with the folder as main key, and the file names as sub keys followed by the content
|
29
|
+
* in the config/* && config/environments/*
|
30
|
+
* will be merged into the __config__ object as is. Deep merge will used so already existing keys will only be override partially
|
31
|
+
* the following is the order if yaml/json files names as enviornments
|
32
|
+
* default
|
33
|
+
* development
|
34
|
+
* test
|
35
|
+
* production
|
36
|
+
|
37
|
+
I personally say, put everything into the lib/gem_name/meta/* so you can have auto separated configs for each gem/module
|
38
|
+
The __config__ object will not be generated util it's being called.
|
39
|
+
|
40
|
+
#### Loading up Yaml and Json files from the application directory
|
41
|
+
|
42
|
+
You can mount JSON and yaml files with manually.
|
43
|
+
This will make key paths based on FileSystem logic
|
44
|
+
|
8
45
|
```ruby
|
9
46
|
|
10
|
-
|
47
|
+
require "configer"
|
11
48
|
|
12
|
-
#>
|
13
|
-
# for set home directory
|
49
|
+
#> optons:
|
14
50
|
#
|
15
|
-
|
16
|
-
#
|
51
|
+
# root/r/folder/dir/directory
|
52
|
+
# - set the folder where the mount will begin
|
17
53
|
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
# for example we can call the dir.pwd folder's sample/meta/test.yml file parsed data as
|
25
|
-
puts __config__.sample.meta.test #> { hello: "world" }
|
26
|
-
puts __config__.sample.meta.test.hello #> "world"
|
54
|
+
# to/out/o
|
55
|
+
# - point to a hashlike object where you want the config objects to be merged
|
56
|
+
#
|
57
|
+
Configer.mount_yaml #> return Configer::Object that contain parsed yaml
|
58
|
+
Configer.mount_json #> return Configer::Object that contain parsed json
|
27
59
|
|
28
60
|
```
|
29
61
|
|
@@ -33,19 +65,11 @@ example for the mount options:
|
|
33
65
|
|
34
66
|
require "configer"
|
35
67
|
|
36
|
-
asdf=
|
68
|
+
asdf = {hello: "world"}
|
37
69
|
|
38
70
|
Configer.mount_yaml out: asdf
|
39
71
|
Configer.mount_json out: asdf
|
40
72
|
|
41
|
-
puts __config__
|
42
|
-
#<Configer::ConfigObject>
|
43
|
-
|
44
73
|
puts asdf
|
45
|
-
#<Configer::ConfigObject hello="world"
|
46
|
-
# sample=#<Configer::ConfigObject meta=#<Configer::ConfigObject
|
47
|
-
# hello=#<Configer::ConfigObject hello="world">
|
48
|
-
# test=#<Configer::ConfigObject hello="world">>>>
|
49
|
-
|
50
74
|
|
51
75
|
```
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/configer.gemspec
CHANGED
data/example/sample.rb
CHANGED
@@ -1,17 +1,8 @@
|
|
1
|
+
require "configer"
|
1
2
|
|
2
|
-
|
3
|
+
asdf = {hello: "world"}
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
end
|
5
|
+
Configer.mount_yaml out: asdf
|
6
|
+
Configer.mount_json out: asdf
|
7
7
|
|
8
|
-
|
9
|
-
{
|
10
|
-
capacity: {
|
11
|
-
max: 9000
|
12
|
-
}
|
13
|
-
}
|
14
|
-
)
|
15
|
-
|
16
|
-
puts var
|
17
|
-
# puts var.public_methods
|
8
|
+
puts asdf
|
data/lib/configer.rb
CHANGED
data/lib/configer/dsl.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module Configer
|
2
|
+
|
3
|
+
module HashExtension
|
4
|
+
|
5
|
+
def deep_merge(other_hash)
|
6
|
+
|
7
|
+
var = self.dup
|
8
|
+
var.__send__ :extend, HashExtension unless var.respond_to?(:deep_merge!)
|
9
|
+
|
10
|
+
return var.__send__ :deep_merge!, other_hash
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
def deep_merge!(other_hash)
|
15
|
+
|
16
|
+
other_hash.each_pair do |k,v|
|
17
|
+
|
18
|
+
self[k] = if self[k].class <= ::Hash && v.class <= ::Hash
|
19
|
+
|
20
|
+
[self[k],v].each do |obj|
|
21
|
+
obj.__send__ :extend, HashExtension unless obj.respond_to?(:deep_merge!)
|
22
|
+
end
|
23
|
+
|
24
|
+
self[k].deep_merge(v)
|
25
|
+
|
26
|
+
else
|
27
|
+
v
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
return self
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
end
|
data/lib/configer/json.rb
CHANGED
@@ -7,13 +7,14 @@ module Configer
|
|
7
7
|
raise(ArgumentError) unless opts.class <= Hash
|
8
8
|
require 'json'
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
raise unless opts[:out].class <= Hash
|
14
|
-
unless opts[:out].class == Configer::ConfigObject
|
15
|
-
opts[:out]= Configer::ConfigObject.new( opts[:out] )
|
10
|
+
[:r,:folder,:dir,:directory].each do |sym|
|
11
|
+
opts[:root] ||= opts.delete(sym)
|
16
12
|
end
|
13
|
+
opts[:root] ||= Dir.pwd
|
14
|
+
|
15
|
+
opts[:out] ||= opts.delete(:o) || opts.delete(:to) || Configer::Object
|
16
|
+
raise(ArgumentError,"out/to must point to hashlike object") unless opts[:out].class <= ::Hash
|
17
|
+
opts[:out].__send__ :extend, HashExtension unless opts[:out].respond_to?(:deep_merge!)
|
17
18
|
|
18
19
|
Dir.glob( File.join( File.absolute_path(opts[:root]), "**","*.{json}" ) ).each do |file_path|
|
19
20
|
|
@@ -31,12 +32,13 @@ module Configer
|
|
31
32
|
|
32
33
|
key_str= path_elements[index]
|
33
34
|
(current_obj ||= tmp_hsh)
|
34
|
-
current_obj[key_str]= {}
|
35
|
+
current_obj[key_str]= {}
|
35
36
|
current_obj= current_obj[key_str] unless index == (path_elements.count-1)
|
36
37
|
|
37
38
|
}
|
38
39
|
|
39
40
|
current_obj[ path_elements.last ]= JSON.parse File.read file_path
|
41
|
+
|
40
42
|
opts[:out].deep_merge!(tmp_hsh)
|
41
43
|
|
42
44
|
return nil
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Configer
|
2
|
+
|
3
|
+
class Object < ::Hash
|
4
|
+
|
5
|
+
self.instance_methods.each do |sym|
|
6
|
+
self.__send__ :protected, sym
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing( method_name, *args )
|
10
|
+
|
11
|
+
if method_name.to_s[-1] == '='
|
12
|
+
self[method_name.to_s[0..-2]]= *args
|
13
|
+
return self[method_name.to_s[0..-2]]
|
14
|
+
else
|
15
|
+
|
16
|
+
if self[method_name.to_s].nil? && self.respond_to?(method_name)
|
17
|
+
return self.__send__(method_name)
|
18
|
+
else
|
19
|
+
return self[method_name.to_s]
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
public :__send__,:respond_to?
|
27
|
+
|
28
|
+
#> allowed Hash methods
|
29
|
+
public :to_s,:inspect,:delete,:delete_if,
|
30
|
+
:merge!,:merge,:keys,:values,:freeze
|
31
|
+
|
32
|
+
#> allowed Enumerable methods
|
33
|
+
public :each,:each_pair,:map,:reduce,:group_by,
|
34
|
+
:select,:to_a,:grep,:count,:size
|
35
|
+
|
36
|
+
#> allowed object methods
|
37
|
+
public :class,:dup
|
38
|
+
|
39
|
+
#> allowed boolean methods
|
40
|
+
public :==,:===,:include?
|
41
|
+
|
42
|
+
public
|
43
|
+
|
44
|
+
def [] key
|
45
|
+
key = key.to_s
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
49
|
+
def []= key,value
|
50
|
+
key = key.to_s
|
51
|
+
super
|
52
|
+
end
|
53
|
+
|
54
|
+
#> parse object
|
55
|
+
def self.parse obj
|
56
|
+
raise(ArgumentError,"input must be Hash") unless obj.is_a? ::Hash
|
57
|
+
|
58
|
+
hash = self.new.merge!(obj)
|
59
|
+
hash.each_pair do |key,value|
|
60
|
+
if value.class <= ::Hash
|
61
|
+
hash[key]= self.parse(value)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
return hash
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
module Data
|
71
|
+
def self.config_hash
|
72
|
+
return @@config ||= Object.parse(Support.mount_config_and_lib_meta)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class << self
|
77
|
+
|
78
|
+
def new *args
|
79
|
+
self::Object.new(*args)
|
80
|
+
end
|
81
|
+
|
82
|
+
alias :init :new
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Configer
|
2
|
+
|
3
|
+
module Support
|
4
|
+
|
5
|
+
#> return mounted config objects
|
6
|
+
def self.mount_config_and_lib_meta
|
7
|
+
|
8
|
+
return_hash = {}
|
9
|
+
return_hash.__send__ :extend, HashExtension
|
10
|
+
|
11
|
+
config_yaml_paths= []
|
12
|
+
config_yaml_paths.instance_eval do
|
13
|
+
def push_path(*paths)
|
14
|
+
paths.each do |path|
|
15
|
+
case true
|
16
|
+
|
17
|
+
when path.downcase.include?('default')
|
18
|
+
self.insert 0, path
|
19
|
+
|
20
|
+
when path.downcase.include?('development')
|
21
|
+
self.insert 1, path
|
22
|
+
|
23
|
+
when path.downcase.include?('test')
|
24
|
+
self.insert 2, path
|
25
|
+
|
26
|
+
when path.downcase.include?('production')
|
27
|
+
self.insert 3, path
|
28
|
+
|
29
|
+
else
|
30
|
+
self.push path
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end;alias push_paths push_path
|
35
|
+
end
|
36
|
+
|
37
|
+
#> load lib meta folders files
|
38
|
+
if File.exist?(File.join(Dir.pwd,'lib'))
|
39
|
+
config_yaml_paths.push_paths *Dir.glob(File.join(Dir.pwd,'lib','**','{meta,META}','*.{yaml,yml,json}'))
|
40
|
+
config_yaml_paths.push_paths *Dir.glob(File.join(Dir.pwd,'lib','{meta,META}','**','*.{yaml,yml,json}'))
|
41
|
+
config_yaml_paths.compact!
|
42
|
+
end
|
43
|
+
|
44
|
+
#> load config folder
|
45
|
+
if File.exist?(File.join(Dir.pwd,'config'))
|
46
|
+
|
47
|
+
config_yaml_paths.push_paths *Dir.glob(File.join(Dir.pwd,'config','*.{yaml,yml,json}'))
|
48
|
+
if File.exist?(File.join(Dir.pwd,'config','environments'))
|
49
|
+
config_yaml_paths.push_paths *Dir.glob(File.join(Dir.pwd,'config','environments','*.{yaml,yml,json}'))
|
50
|
+
end
|
51
|
+
config_yaml_paths.compact!
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
config_yaml_paths.each do |path|
|
56
|
+
|
57
|
+
path_parts = path.split(File::Separator)
|
58
|
+
|
59
|
+
extension = path_parts.last.split('.')[-1]
|
60
|
+
|
61
|
+
category_key = case
|
62
|
+
|
63
|
+
#> lib/meta/*
|
64
|
+
when path_parts[-2].downcase == 'meta' && path_parts[-3] == 'lib'
|
65
|
+
nil
|
66
|
+
|
67
|
+
#> lib/meta/**/*
|
68
|
+
when path_parts[-3].downcase == 'meta' && path_parts[-4] == 'lib'
|
69
|
+
path_parts[-2]
|
70
|
+
|
71
|
+
#> lib/**/meta/*
|
72
|
+
when path_parts[-2].downcase == 'meta' && path_parts[-3] != 'lib' && path_parts[-4] == 'lib'
|
73
|
+
path_parts[-3]
|
74
|
+
|
75
|
+
else
|
76
|
+
nil
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
object = if %W[ yaml yml ].include?(extension)
|
81
|
+
require 'yaml'
|
82
|
+
YAML.safe_load(File.read(path))
|
83
|
+
elsif extension == 'json'
|
84
|
+
require 'json'
|
85
|
+
JSON.parse(File.read(path))
|
86
|
+
else
|
87
|
+
{}
|
88
|
+
end
|
89
|
+
|
90
|
+
if path.downcase.include?('meta')
|
91
|
+
object = {
|
92
|
+
( path_parts.last.split('.')[-2] || path ) => object
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
if category_key.nil?
|
97
|
+
return_hash.deep_merge!(object)
|
98
|
+
else
|
99
|
+
return_hash.deep_merge!(category_key => object)
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
return return_hash
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
data/lib/configer/yaml.rb
CHANGED
@@ -7,13 +7,14 @@ module Configer
|
|
7
7
|
raise(ArgumentError) unless opts.class <= Hash
|
8
8
|
require 'yaml'
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
raise unless opts[:out].class <= Hash
|
14
|
-
unless opts[:out].class == Configer::ConfigObject
|
15
|
-
opts[:out]= Configer::ConfigObject.new( opts[:out] )
|
10
|
+
[:r,:folder,:dir,:directory].each do |sym|
|
11
|
+
opts[:root] ||= opts.delete(sym)
|
16
12
|
end
|
13
|
+
opts[:root] ||= Dir.pwd
|
14
|
+
|
15
|
+
opts[:out] ||= opts.delete(:o) || opts.delete(:to) || Configer::Object
|
16
|
+
raise(ArgumentError,"out/to must point to hashlike object") unless opts[:out].class <= ::Hash
|
17
|
+
opts[:out].__send__ :extend, HashExtension unless opts[:out].respond_to?(:deep_merge!)
|
17
18
|
|
18
19
|
Dir.glob( File.join( File.absolute_path(opts[:root]), "**","*.{yaml,yml}" ) ).each do |file_path|
|
19
20
|
|
@@ -31,12 +32,13 @@ module Configer
|
|
31
32
|
|
32
33
|
key_str= path_elements[index]
|
33
34
|
(current_obj ||= tmp_hsh)
|
34
|
-
current_obj[key_str]= {}
|
35
|
+
current_obj[key_str]= {}
|
35
36
|
current_obj= current_obj[key_str] unless index == (path_elements.count-1)
|
36
37
|
|
37
38
|
}
|
38
39
|
|
39
40
|
current_obj[ path_elements.last ]= YAML.safe_load File.read file_path
|
41
|
+
|
40
42
|
opts[:out].deep_merge!(tmp_hsh)
|
41
43
|
|
42
44
|
return nil
|
data/sandbox/sup.rb
ADDED
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: configer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Luzsi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: hashie
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -68,14 +54,17 @@ files:
|
|
68
54
|
- configer.gemspec
|
69
55
|
- example/sample.rb
|
70
56
|
- lib/configer.rb
|
71
|
-
- lib/configer/
|
72
|
-
- lib/configer/
|
57
|
+
- lib/configer/dsl.rb
|
58
|
+
- lib/configer/extension.rb
|
73
59
|
- lib/configer/json.rb
|
60
|
+
- lib/configer/object.rb
|
61
|
+
- lib/configer/support.rb
|
74
62
|
- lib/configer/yaml.rb
|
75
63
|
- sample/load_meta_files.rb
|
76
64
|
- sample/meta/hello.json
|
77
65
|
- sample/meta/test.yml
|
78
66
|
- sample/mount_opts.rb
|
67
|
+
- sandbox/sup.rb
|
79
68
|
homepage:
|
80
69
|
licenses: []
|
81
70
|
metadata: {}
|
data/lib/configer/data.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
|
2
|
-
module Configer
|
3
|
-
|
4
|
-
class Object < ::Hashie::Mash
|
5
|
-
end
|
6
|
-
|
7
|
-
module Data
|
8
|
-
def self.config_hash
|
9
|
-
@@config ||= Object.new
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class << self
|
14
|
-
|
15
|
-
def new *args
|
16
|
-
self::Object.new(*args)
|
17
|
-
end
|
18
|
-
|
19
|
-
alias :init :new
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
data/lib/configer/ext.rb
DELETED