configer 1.3.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -52
- data/VERSION +1 -1
- data/configer.gemspec +12 -9
- data/lib/configer.rb +7 -6
- data/lib/configer/cache.rb +20 -0
- data/lib/configer/dsl.rb +1 -2
- data/lib/configer/{extension.rb → ext.rb} +2 -9
- data/lib/configer/instance.rb +14 -0
- data/lib/configer/logic.rb +165 -0
- data/lib/configer/mount.rb +18 -0
- data/lib/configer/object.rb +24 -60
- data/lib/configer/support.rb +28 -100
- data/test/sample_root/config/defaults.erb.yml +4 -0
- data/test/sample_root/config/environments/development.yml +1 -0
- data/test/sample_root/config/erb_test.yml.erb +1 -0
- data/test/sample_root/lib/meta/module_name.yml +2 -0
- data/test/sample_root/lib/sample/meta/config.yml +1 -0
- data/test/sample_root/lib/sample/meta/string.yml +2 -0
- data/test/test_all.rb +3 -0
- data/test/test_config_object.rb +47 -0
- data/test/test_helper.rb +4 -0
- data/test/test_instance.rb +48 -0
- metadata +33 -21
- data/config/sample.yml +0 -5
- data/example/lazy_load.rb +0 -7
- data/example/sample.rb +0 -8
- data/lib/configer/json.rb +0 -54
- data/lib/configer/meta/config.yml +0 -1
- data/lib/configer/yaml.rb +0 -59
- data/pmip/pmip.rb +0 -1
- data/sample/load_meta_files.rb +0 -11
- data/sample/meta/hello.json +0 -1
- data/sample/meta/test.yml +0 -1
- data/sample/mount_opts.rb +0 -12
- data/sandbox/sup.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6424137c1e704d889527669ee3a3ebab41e17e4a
|
4
|
+
data.tar.gz: 8ab963a91032799c5bcedc81bdb227fbe9d6effd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50f6e1ca2b408ff17e523365fa4836e33c5bb93d60814c925d1190b2210c5dd2fd9866862b2b06e1c80c5e08e8644d98779cc697448d47429676f2f9511b95cd
|
7
|
+
data.tar.gz: 4716dc327b3d12a2306457be19c63555a76a4f64abb404a0bf2bdd5ccf87beccdd50c4d10ac8e4589c137e17ac4fc929f178e49f0fef8248c81adf709ac11a48
|
data/README.md
CHANGED
@@ -1,75 +1,71 @@
|
|
1
1
|
configer
|
2
2
|
========
|
3
|
-
|
3
|
+
|
4
|
+
super easy to use configuration module for ruby apps.
|
4
5
|
|
5
6
|
### install
|
6
7
|
|
7
8
|
$ gem install configer
|
8
9
|
|
9
|
-
###
|
10
|
+
### Description
|
11
|
+
|
12
|
+
Configer is a support gem, to give the developer ability,
|
13
|
+
creating meta config files, that should be loaded into the application.
|
14
|
+
|
15
|
+
Configer follow the traditional ways in this field, and use the following Filesystem logic:
|
16
|
+
|
17
|
+
mounting configuration files as they are
|
18
|
+
|
19
|
+
./project_dir/config/*
|
20
|
+
|
21
|
+
mounting environment configuration file as they are based on the current envernioment stage (development,test,production,staging)
|
22
|
+
* envirnomens folder name can be also envs/env/environment
|
23
|
+
|
24
|
+
./project_dir/config/environments/*
|
25
|
+
|
26
|
+
mounting configuration files from lib/meta folder.
|
27
|
+
* Each config file name will be a "key" in the main config object
|
28
|
+
* same goes with the folders in the meta file
|
29
|
+
* the serialized object will be the value
|
30
|
+
|
31
|
+
./project_dir/lib/meta/**/*
|
32
|
+
|
33
|
+
mounting configuration files from lib/module_name/meta folder.
|
34
|
+
* Each config file name will be a "key" in the config object that is located under the module_name key in the main config object
|
35
|
+
* same goes with the folders in the meta file
|
36
|
+
* the serialized object will be the value
|
37
|
+
|
38
|
+
./project_dir/lib/module_name/meta/**/*
|
39
|
+
|
40
|
+
|
41
|
+
The meta folder name can be aliased with META
|
42
|
+
|
43
|
+
#### example
|
44
|
+
|
45
|
+
in the /test/sample_root you can see an example
|
10
46
|
|
11
47
|
#### Lazy Config object
|
12
48
|
|
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
49
|
The __config__ object will not be generated util it's being called.
|
39
50
|
|
40
|
-
####
|
51
|
+
#### Instance
|
41
52
|
|
42
|
-
|
43
|
-
This will make key paths based on FileSystem logic
|
53
|
+
config object can be made into simple instance, based on argument passed folder path
|
44
54
|
|
45
|
-
|
55
|
+
#### ERB support
|
46
56
|
|
47
|
-
|
57
|
+
config files support ERB parsing if the file contain .erb extension in the name
|
48
58
|
|
49
|
-
|
50
|
-
#
|
51
|
-
# root/r/folder/dir/directory
|
52
|
-
# - set the folder where the mount will begin
|
53
|
-
#
|
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
|
59
|
+
#### Supported Serializations
|
59
60
|
|
60
|
-
|
61
|
+
the current supported parsing logic are Yaml and JSON, that could be mixed with ERB
|
61
62
|
|
62
|
-
example
|
63
|
-
|
64
|
-
```ruby
|
63
|
+
### example
|
65
64
|
|
66
|
-
|
65
|
+
__config__.grape.defaults #> return the config object that is located under {"grape"=>{"defaults"=>{...}}}
|
67
66
|
|
68
|
-
|
67
|
+
### after words
|
69
68
|
|
70
|
-
|
71
|
-
Configer.mount_json out: asdf
|
69
|
+
I personally say, put everything into the lib/gem_name/meta/**/* so you can have auto separated configs for each gem/module
|
72
70
|
|
73
|
-
puts asdf
|
74
71
|
|
75
|
-
```
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0
|
data/configer.gemspec
CHANGED
@@ -2,19 +2,22 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
|
5
|
-
spec.name =
|
6
|
-
spec.version = File.open(File.join(File.dirname(__FILE__),
|
7
|
-
spec.authors = [
|
8
|
-
spec.email = [
|
9
|
-
spec.description = %q{ Easy to use config module. Based on FileSystem
|
10
|
-
spec.summary = %q{
|
5
|
+
spec.name = 'configer'
|
6
|
+
spec.version = File.open(File.join(File.dirname(__FILE__),'VERSION')).read.split("\n")[0].chomp.gsub(' ','')
|
7
|
+
spec.authors = ['Adam Luzsi']
|
8
|
+
spec.email = ['adamluzsi@gmail.com']
|
9
|
+
spec.description = %q{ Easy to use config module. Based on generally accepted FileSystem positions, check gitHub for more info }
|
10
|
+
spec.summary = %q{ Clean and easy to use config module for general use }
|
11
11
|
|
12
12
|
spec.files = `git ls-files`.split($/)
|
13
13
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
14
14
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
|
-
spec.require_paths = [
|
15
|
+
spec.require_paths = ['lib']
|
16
|
+
spec.homepage = "https://github.com/adamluzsi/#{__dir__.split(File::Separator).last.split('.').first}"
|
16
17
|
|
17
|
-
spec.
|
18
|
-
|
18
|
+
spec.required_ruby_version = '>= 2.0.0'
|
19
|
+
|
20
|
+
spec.add_development_dependency 'bundler'
|
21
|
+
spec.add_development_dependency 'rake'
|
19
22
|
|
20
23
|
end
|
data/lib/configer.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
require 'configer/
|
2
|
-
require 'configer/
|
1
|
+
require 'configer/ext'
|
2
|
+
require 'configer/logic'
|
3
3
|
require 'configer/support'
|
4
|
-
|
5
|
-
require 'configer/
|
6
|
-
require 'configer/
|
7
|
-
|
4
|
+
require 'configer/object'
|
5
|
+
require 'configer/cache'
|
6
|
+
require 'configer/mount'
|
8
7
|
require 'configer/dsl'
|
8
|
+
|
9
|
+
require 'configer/instance'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Configer
|
2
|
+
module Cache
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def object
|
6
|
+
|
7
|
+
@dir ||= Configer.pwd
|
8
|
+
if @dir == Configer.pwd
|
9
|
+
return @cache ||= Object.parse(Configer.mount_all)
|
10
|
+
else
|
11
|
+
@dir = Configer.pwd
|
12
|
+
return @cache = Object.parse(Configer.mount_all)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/configer/dsl.rb
CHANGED
@@ -3,22 +3,16 @@ module Configer
|
|
3
3
|
module HashExtension
|
4
4
|
|
5
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
|
-
|
6
|
+
return self.dup.deep_merge!(other_hash)
|
12
7
|
end
|
13
8
|
|
14
9
|
def deep_merge!(other_hash)
|
15
10
|
|
16
11
|
other_hash.each_pair do |k,v|
|
17
|
-
|
18
12
|
self[k] = if self[k].class <= ::Hash && v.class <= ::Hash
|
19
13
|
|
20
14
|
[self[k],v].each do |obj|
|
21
|
-
obj.__send__ :extend, HashExtension unless obj.respond_to?(:deep_merge
|
15
|
+
obj.__send__ :extend, HashExtension unless obj.respond_to?(:deep_merge)
|
22
16
|
end
|
23
17
|
|
24
18
|
self[k].deep_merge(v)
|
@@ -36,5 +30,4 @@ module Configer
|
|
36
30
|
end
|
37
31
|
|
38
32
|
|
39
|
-
|
40
33
|
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
module Configer
|
2
|
+
|
3
|
+
module Helpers
|
4
|
+
|
5
|
+
def supported_formats
|
6
|
+
@formats ||= %W[ erb json yaml yml ]
|
7
|
+
end
|
8
|
+
|
9
|
+
def parser(file_path)
|
10
|
+
|
11
|
+
file_string = if file_path.downcase =~ /\.erb\.?/
|
12
|
+
require 'erb'
|
13
|
+
ERB.new(File.read(file_path)).result
|
14
|
+
else
|
15
|
+
File.read(file_path)
|
16
|
+
end
|
17
|
+
|
18
|
+
object = if file_path =~ /\.ya?ml(\.erb)?$/
|
19
|
+
require 'yaml'
|
20
|
+
#> back compatibility for old yaml parse logic
|
21
|
+
if YAML.respond_to?(:save_load)
|
22
|
+
YAML.safe_load(file_string)
|
23
|
+
else
|
24
|
+
YAML.load(file_string)
|
25
|
+
end
|
26
|
+
|
27
|
+
elsif file_path =~ /\.json(\.erb)?$/
|
28
|
+
require 'json'
|
29
|
+
JSON.parse(file_string)
|
30
|
+
|
31
|
+
else
|
32
|
+
file_string
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
return Object.parse(object)
|
38
|
+
|
39
|
+
rescue;nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def name_parser(name_str)
|
43
|
+
name_str.gsub(/(\.json|\.yaml|\.yml|\.erb)/,'')
|
44
|
+
end
|
45
|
+
|
46
|
+
#> opts:
|
47
|
+
#
|
48
|
+
# category:
|
49
|
+
# namespace where the gathered meta file datas will be merged
|
50
|
+
#
|
51
|
+
# split_at:
|
52
|
+
# string or regexp where the meta folder located
|
53
|
+
def mount_process( *paths,break_if: -> e { e.size > 2 }, namespace_less: false )
|
54
|
+
return paths.reduce(Object.new) do |m,file_path|
|
55
|
+
|
56
|
+
if namespace_less
|
57
|
+
#> if some non matching type wanted to be merged
|
58
|
+
m.deep_merge!(parser(file_path)) rescue nil
|
59
|
+
else
|
60
|
+
|
61
|
+
#> keys will be downcase anyways
|
62
|
+
elements = []
|
63
|
+
file_path.split(File::Separator).reverse.each do |element|
|
64
|
+
next if element =~ /^(META|meta)$/
|
65
|
+
break if element =~ /^(config|libs?)$/
|
66
|
+
|
67
|
+
elements.unshift element
|
68
|
+
break if break_if.call(elements)
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
key_cains = []
|
73
|
+
m.deep_merge!(
|
74
|
+
elements.reduce(Object.new) do |mem,element|
|
75
|
+
|
76
|
+
target_obj = mem
|
77
|
+
key_cains.each{|k| target_obj = target_obj[k] }
|
78
|
+
key_cains.push(element)
|
79
|
+
|
80
|
+
if elements[-1] == element
|
81
|
+
target_obj[name_parser(element)] = parser(file_path)
|
82
|
+
|
83
|
+
else
|
84
|
+
target_obj[name_parser(element)] ||= Object.new
|
85
|
+
|
86
|
+
end;mem
|
87
|
+
|
88
|
+
end
|
89
|
+
)
|
90
|
+
|
91
|
+
end;m
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def mount_lib_meta(get_pwd=Configer.pwd)
|
97
|
+
|
98
|
+
mount_process(
|
99
|
+
*Dir.glob(
|
100
|
+
File.join(
|
101
|
+
get_pwd,
|
102
|
+
'{lib,libs}',
|
103
|
+
'{meta,META}',
|
104
|
+
'**',
|
105
|
+
"*.{#{supported_formats.join(',')}}"
|
106
|
+
)
|
107
|
+
)
|
108
|
+
)
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
def mount_lib_module_meta(get_pwd=Configer.pwd)
|
113
|
+
|
114
|
+
mount_process(
|
115
|
+
*Dir.glob(
|
116
|
+
File.join(
|
117
|
+
get_pwd,
|
118
|
+
'{lib,libs}',
|
119
|
+
'*',
|
120
|
+
'{meta,META}',
|
121
|
+
'**',
|
122
|
+
"*.{#{supported_formats.join(',')}}"
|
123
|
+
)
|
124
|
+
)
|
125
|
+
)
|
126
|
+
end
|
127
|
+
|
128
|
+
def mount_config(get_pwd=Configer.pwd)
|
129
|
+
|
130
|
+
mount_process(
|
131
|
+
*Dir.glob(
|
132
|
+
File.join(
|
133
|
+
get_pwd,
|
134
|
+
'config',
|
135
|
+
"*.{#{supported_formats.join(',')}}"
|
136
|
+
)
|
137
|
+
),
|
138
|
+
break_if: -> e { e.size == 1 },
|
139
|
+
namespace_less: true
|
140
|
+
)
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
def mount_config_environments(get_pwd=Configer.pwd)
|
145
|
+
|
146
|
+
mount_process(
|
147
|
+
*Dir.glob(
|
148
|
+
File.join(
|
149
|
+
get_pwd,
|
150
|
+
'config',
|
151
|
+
'{environments,environment,env,envs}',
|
152
|
+
"#{Configer.env}.{#{supported_formats.join(',')}}"
|
153
|
+
)
|
154
|
+
),
|
155
|
+
break_if: -> e { e.size >= 1 },
|
156
|
+
namespace_less: true
|
157
|
+
)
|
158
|
+
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
extend Helpers
|
164
|
+
|
165
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Configer
|
2
|
+
class << self
|
3
|
+
|
4
|
+
def mount_all(get_pwd=Configer.pwd)
|
5
|
+
return [
|
6
|
+
|
7
|
+
mount_lib_meta(get_pwd),
|
8
|
+
mount_lib_module_meta(get_pwd),
|
9
|
+
|
10
|
+
mount_config(get_pwd),
|
11
|
+
mount_config_environments(get_pwd)
|
12
|
+
|
13
|
+
].reduce(Object.new){|m,o| m.deep_merge!(o) rescue nil ;m}
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/lib/configer/object.rb
CHANGED
@@ -2,98 +2,62 @@ module Configer
|
|
2
2
|
|
3
3
|
class Object < Hash
|
4
4
|
|
5
|
+
include HashExtension
|
5
6
|
self.instance_methods.each do |sym|
|
6
|
-
|
7
|
+
protected sym
|
7
8
|
end
|
8
9
|
|
9
|
-
|
10
|
+
public :__send__,:public_send,:[],:[]=
|
11
|
+
def method_missing( method_name, *args, &block )
|
10
12
|
|
11
|
-
|
13
|
+
obj_methods = self.__send__(:methods)
|
14
|
+
if method_name[-1] == '=' && !obj_methods.include?(method_name)
|
12
15
|
self[method_name[0..-2]]= *args
|
13
16
|
return self[method_name[0..-2]]
|
14
17
|
|
15
|
-
|
16
|
-
#> respond to method only if no value present
|
17
|
-
if self[method_name.to_s].nil? && self.respond_to?(method_name)
|
18
|
-
return self.__send__(method_name)
|
18
|
+
elsif self[method_name.to_s].nil? && obj_methods.include?(method_name)
|
19
19
|
|
20
|
+
if block_given?
|
21
|
+
return self.__send__(method_name,*args,&block)
|
20
22
|
else
|
21
|
-
return self
|
22
|
-
|
23
|
+
return self.__send__(method_name,*args)
|
23
24
|
end
|
24
25
|
|
26
|
+
else
|
27
|
+
return self[method_name.to_s]
|
28
|
+
|
25
29
|
end
|
26
30
|
|
27
31
|
end
|
28
32
|
|
29
|
-
public :__send__,:public_send,:respond_to?
|
30
|
-
|
31
|
-
#> some allowed Hash methods
|
32
|
-
public :to_s,:inspect,:delete,:delete_if,
|
33
|
-
:merge!,:merge,:keys,:values,:freeze
|
34
|
-
|
35
|
-
#> allowed Enumerable methods
|
36
|
-
public :each,:each_pair,:map,:reduce,:group_by,
|
37
|
-
:select,:to_a,:grep,:count,:size
|
38
|
-
|
39
|
-
#> allowed object methods
|
40
|
-
public :class,:dup
|
41
|
-
|
42
|
-
#> allowed boolean methods
|
43
|
-
public :==,:===,:include?
|
44
|
-
|
45
33
|
public
|
46
34
|
|
47
|
-
def []
|
35
|
+
def [](key)
|
48
36
|
key = key.to_s if key.class <= Symbol
|
49
37
|
super || super(key.to_sym)
|
50
38
|
end
|
51
39
|
|
52
|
-
def []=
|
40
|
+
def []=(key,value)
|
53
41
|
key = key.to_s if key.class <= Symbol
|
54
42
|
super
|
55
43
|
end
|
56
44
|
|
57
45
|
#> parse object
|
58
46
|
def self.parse(obj)
|
47
|
+
case obj
|
59
48
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
obj.reduce(self.new){|m,h| m.merge!( (h[0].class <= Symbol ? h[0].to_s : h[0] ) => self.parse(h[1]) ) ;m}
|
49
|
+
when Hash
|
50
|
+
obj.reduce(self.new){|m,h|
|
51
|
+
m.deep_merge!( (h[0].class <= Symbol ? h[0].to_s : h[0] ) => self.parse(h[1]) ) ;m}
|
64
52
|
|
65
|
-
|
66
|
-
|
53
|
+
when Array
|
54
|
+
obj.map{|o| self.parse(o) }
|
67
55
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
module Data
|
78
|
-
|
79
|
-
#> i dont know why , but if i catch this ,
|
80
|
-
# than somethimes some object happens to not get parsed
|
81
|
-
def self.config_hash
|
82
|
-
return Object.parse(Support.mount_config_and_lib_meta)
|
83
|
-
end
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
class << self
|
88
|
-
|
89
|
-
def new *args
|
90
|
-
self::Object.new(*args)
|
91
|
-
end
|
56
|
+
else
|
57
|
+
obj
|
92
58
|
|
93
|
-
|
59
|
+
end
|
94
60
|
|
95
|
-
def parse(obj)
|
96
|
-
self::Object.parse(obj)
|
97
61
|
end
|
98
62
|
|
99
63
|
end
|
data/lib/configer/support.rb
CHANGED
@@ -1,126 +1,54 @@
|
|
1
1
|
module Configer
|
2
2
|
|
3
|
-
|
3
|
+
class << self
|
4
4
|
|
5
|
-
|
6
|
-
return Rails.root.to_s
|
7
|
-
else
|
8
|
-
return Dir.pwd.to_s
|
9
|
-
end
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
module Support
|
14
|
-
|
15
|
-
#> return mounted config objects
|
16
|
-
def self.mount_config_and_lib_meta
|
17
|
-
|
18
|
-
return_hash = {}
|
19
|
-
return_hash.__send__ :extend, HashExtension
|
20
|
-
|
21
|
-
config_yaml_paths= []
|
22
|
-
config_yaml_paths.instance_eval do
|
23
|
-
def push_path(*paths)
|
24
|
-
paths.each do |path|
|
25
|
-
case true
|
26
|
-
|
27
|
-
when path.downcase.include?('default')
|
28
|
-
self.insert 0, path
|
29
|
-
|
30
|
-
when path.downcase.include?('development')
|
31
|
-
self.insert 1, path
|
32
|
-
|
33
|
-
when path.downcase.include?('test')
|
34
|
-
self.insert 2, path
|
35
|
-
|
36
|
-
when path.downcase.include?('production')
|
37
|
-
self.insert 3, path
|
38
|
-
|
39
|
-
else
|
40
|
-
self.push path
|
5
|
+
def pwd
|
41
6
|
|
42
|
-
|
43
|
-
|
44
|
-
|
7
|
+
if defined?(Rails) && !Rails.root.nil?
|
8
|
+
return Rails.root.to_s
|
9
|
+
else
|
10
|
+
return Dir.pwd.to_s
|
45
11
|
end
|
46
12
|
|
47
|
-
|
48
|
-
if File.exist?(File.join(Configer.pwd,'lib'))
|
49
|
-
config_yaml_paths.push_paths *Dir.glob(File.join(Configer.pwd,'lib','**','{meta,META}','*.{yaml,yml,json}'))
|
50
|
-
config_yaml_paths.push_paths *Dir.glob(File.join(Configer.pwd,'lib','{meta,META}','**','*.{yaml,yml,json}'))
|
51
|
-
config_yaml_paths.compact!
|
52
|
-
end
|
53
|
-
|
54
|
-
#> load config folder
|
55
|
-
if File.exist?(File.join(Configer.pwd,'config'))
|
56
|
-
|
57
|
-
config_yaml_paths.push_paths *Dir.glob(File.join(Configer.pwd,'config','*.{yaml,yml,json}'))
|
58
|
-
if File.exist?(File.join(Configer.pwd,'config','environments'))
|
59
|
-
config_yaml_paths.push_paths *Dir.glob(File.join(Configer.pwd,'config','environments','*.{yaml,yml,json}'))
|
60
|
-
end
|
61
|
-
config_yaml_paths.compact!
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
config_yaml_paths.each do |path|
|
66
|
-
|
67
|
-
path_parts = path.split(File::Separator)
|
13
|
+
end
|
68
14
|
|
69
|
-
extension = path_parts.last.split('.')[-1]
|
70
15
|
|
71
|
-
|
16
|
+
def env
|
72
17
|
|
73
|
-
|
74
|
-
|
75
|
-
nil
|
18
|
+
if defined?(Rails) && !Rails.env.nil?
|
19
|
+
return Rails.env.to_s
|
76
20
|
|
77
|
-
|
78
|
-
|
79
|
-
path_parts[-2]
|
21
|
+
elsif !ENV['RAILS_ENV'].nil?
|
22
|
+
return ENV['RAILS_ENV'].to_s
|
80
23
|
|
81
|
-
|
82
|
-
|
83
|
-
path_parts[-3]
|
24
|
+
elsif !ENV['RACK_ENV'].nil?
|
25
|
+
return ENV['RACK_ENV'].to_s
|
84
26
|
|
85
|
-
|
86
|
-
|
27
|
+
elsif !ENV['STAGE'].nil?
|
28
|
+
case ENV['STAGE'].to_s.downcase
|
87
29
|
|
88
|
-
|
30
|
+
when /^dev/
|
31
|
+
return 'development'
|
89
32
|
|
90
|
-
|
91
|
-
|
33
|
+
when /^test/
|
34
|
+
return 'test'
|
92
35
|
|
93
|
-
|
94
|
-
|
95
|
-
else
|
96
|
-
YAML.load(File.read(path))
|
97
|
-
end
|
36
|
+
when /^prod/,/^stag/
|
37
|
+
return 'production'
|
98
38
|
|
99
|
-
|
100
|
-
|
101
|
-
JSON.parse(File.read(path))
|
102
|
-
else
|
103
|
-
{}
|
104
|
-
end
|
39
|
+
else
|
40
|
+
return ENV['STAGE']
|
105
41
|
|
106
|
-
if path.downcase.include?('meta')
|
107
|
-
object = {
|
108
|
-
( path_parts.last.split('.')[-2] || path ) => object
|
109
|
-
}
|
110
42
|
end
|
111
43
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
end
|
44
|
+
else
|
45
|
+
return ENV.find{|k,v|
|
46
|
+
%W[ production development ].include?(v.to_s)
|
47
|
+
} || 'development'
|
117
48
|
|
118
49
|
end
|
119
50
|
|
120
|
-
return return_hash
|
121
|
-
|
122
51
|
end
|
123
52
|
|
124
|
-
|
125
53
|
end
|
126
54
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
development_key: 'yep'
|
@@ -0,0 +1 @@
|
|
1
|
+
sub_key: <%= Random.rand %>
|
@@ -0,0 +1 @@
|
|
1
|
+
config_key: config_value
|
data/test/test_all.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
#> TEST dir root for fake the project root
|
4
|
+
Dir.chdir(File.realpath(File.join(__dir__,'sample_root')))
|
5
|
+
|
6
|
+
describe 'configer' do
|
7
|
+
|
8
|
+
it 'should be able to fetch values with different access' do
|
9
|
+
|
10
|
+
var = __config__ #> put into variable for check cache
|
11
|
+
|
12
|
+
#> test caching
|
13
|
+
__config__.__send__(:object_id).must_be :==,var.__send__(:object_id)
|
14
|
+
|
15
|
+
#> test accessing logic
|
16
|
+
__config__.default_key.must_be :==,__config__['default_key']
|
17
|
+
__config__.default_key.must_be :==,__config__[:default_key]
|
18
|
+
__config__.default_key.must_be :==,__config__.public_send(:default_key)
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should mount all the config files up!' do
|
23
|
+
|
24
|
+
#> config && erb
|
25
|
+
__config__.default_key.must_be :==,'default_value'
|
26
|
+
__config__.module_name.module_name_key.hello.must_be_instance_of Float
|
27
|
+
__config__.sub_key.must_be_instance_of Float
|
28
|
+
|
29
|
+
#> config/env
|
30
|
+
if Configer.env == 'development'
|
31
|
+
__config__.development_key.must_be :==, 'yep'
|
32
|
+
else
|
33
|
+
__config__.development_key.must_be :==, nil
|
34
|
+
end
|
35
|
+
|
36
|
+
#> lib/meta
|
37
|
+
__config__.module_name.module_name_key.module_name_value_hash_key.must_be :==, 'module_name_value_hash_value'
|
38
|
+
|
39
|
+
#> lib/module_name/meta
|
40
|
+
__config__.sample.config.config_key.must_be :==,'config_value'
|
41
|
+
|
42
|
+
#> string value in config object /as yaml format/
|
43
|
+
__config__.sample.string.must_be :==,'hello world!'
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
describe 'configer' do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@config = Configer.new(File.join(File.realpath(__dir__),'sample_root'))
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should be able to fetch values with different access' do
|
10
|
+
|
11
|
+
var = @config #> put into variable for check cache
|
12
|
+
|
13
|
+
#> test caching
|
14
|
+
@config.__send__(:object_id).must_be :==,var.__send__(:object_id)
|
15
|
+
|
16
|
+
#> test accessing logic
|
17
|
+
@config.default_key.must_be :==,@config['default_key']
|
18
|
+
@config.default_key.must_be :==,@config[:default_key]
|
19
|
+
@config.default_key.must_be :==,@config.public_send(:default_key)
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should mount all the config files up!' do
|
24
|
+
|
25
|
+
#> config && erb
|
26
|
+
@config.default_key.must_be :==,'default_value'
|
27
|
+
@config.module_name.module_name_key.hello.must_be_instance_of Float
|
28
|
+
@config.sub_key.must_be_instance_of Float
|
29
|
+
|
30
|
+
#> config/env
|
31
|
+
if Configer.env == 'development'
|
32
|
+
@config.development_key.must_be :==, 'yep'
|
33
|
+
else
|
34
|
+
@config.development_key.must_be :==, nil
|
35
|
+
end
|
36
|
+
|
37
|
+
#> lib/meta
|
38
|
+
@config.module_name.module_name_key.module_name_value_hash_key.must_be :==, 'module_name_value_hash_value'
|
39
|
+
|
40
|
+
#> lib/module_name/meta
|
41
|
+
@config.sample.config.config_key.must_be :==,'config_value'
|
42
|
+
|
43
|
+
#> string value in config object /as yaml format/
|
44
|
+
@config.sample.string.must_be :==,'hello world!'
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: configer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.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-10-
|
11
|
+
date: 2014-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,8 +38,8 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
description: " Easy to use config module. Based on FileSystem
|
42
|
-
for more info "
|
41
|
+
description: " Easy to use config module. Based on generally accepted FileSystem positions,
|
42
|
+
check gitHub for more info "
|
43
43
|
email:
|
44
44
|
- adamluzsi@gmail.com
|
45
45
|
executables: []
|
@@ -51,25 +51,27 @@ files:
|
|
51
51
|
- README.md
|
52
52
|
- Rakefile
|
53
53
|
- VERSION
|
54
|
-
- config/sample.yml
|
55
54
|
- configer.gemspec
|
56
|
-
- example/lazy_load.rb
|
57
|
-
- example/sample.rb
|
58
55
|
- lib/configer.rb
|
56
|
+
- lib/configer/cache.rb
|
59
57
|
- lib/configer/dsl.rb
|
60
|
-
- lib/configer/
|
61
|
-
- lib/configer/
|
62
|
-
- lib/configer/
|
58
|
+
- lib/configer/ext.rb
|
59
|
+
- lib/configer/instance.rb
|
60
|
+
- lib/configer/logic.rb
|
61
|
+
- lib/configer/mount.rb
|
63
62
|
- lib/configer/object.rb
|
64
63
|
- lib/configer/support.rb
|
65
|
-
-
|
66
|
-
-
|
67
|
-
-
|
68
|
-
-
|
69
|
-
- sample/meta/
|
70
|
-
- sample/
|
71
|
-
-
|
72
|
-
|
64
|
+
- test/sample_root/config/defaults.erb.yml
|
65
|
+
- test/sample_root/config/environments/development.yml
|
66
|
+
- test/sample_root/config/erb_test.yml.erb
|
67
|
+
- test/sample_root/lib/meta/module_name.yml
|
68
|
+
- test/sample_root/lib/sample/meta/config.yml
|
69
|
+
- test/sample_root/lib/sample/meta/string.yml
|
70
|
+
- test/test_all.rb
|
71
|
+
- test/test_config_object.rb
|
72
|
+
- test/test_helper.rb
|
73
|
+
- test/test_instance.rb
|
74
|
+
homepage: https://github.com/adamluzsi/configer
|
73
75
|
licenses: []
|
74
76
|
metadata: {}
|
75
77
|
post_install_message:
|
@@ -80,7 +82,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
80
82
|
requirements:
|
81
83
|
- - ">="
|
82
84
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
85
|
+
version: 2.0.0
|
84
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
87
|
requirements:
|
86
88
|
- - ">="
|
@@ -91,6 +93,16 @@ rubyforge_project:
|
|
91
93
|
rubygems_version: 2.2.2
|
92
94
|
signing_key:
|
93
95
|
specification_version: 4
|
94
|
-
summary:
|
95
|
-
test_files:
|
96
|
+
summary: Clean and easy to use config module for general use
|
97
|
+
test_files:
|
98
|
+
- test/sample_root/config/defaults.erb.yml
|
99
|
+
- test/sample_root/config/environments/development.yml
|
100
|
+
- test/sample_root/config/erb_test.yml.erb
|
101
|
+
- test/sample_root/lib/meta/module_name.yml
|
102
|
+
- test/sample_root/lib/sample/meta/config.yml
|
103
|
+
- test/sample_root/lib/sample/meta/string.yml
|
104
|
+
- test/test_all.rb
|
105
|
+
- test/test_config_object.rb
|
106
|
+
- test/test_helper.rb
|
107
|
+
- test/test_instance.rb
|
96
108
|
has_rdoc:
|
data/config/sample.yml
DELETED
data/example/lazy_load.rb
DELETED
data/example/sample.rb
DELETED
data/lib/configer/json.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
|
2
|
-
module Configer
|
3
|
-
|
4
|
-
module JSONFN
|
5
|
-
|
6
|
-
def mount_json_files opts= {}
|
7
|
-
raise(ArgumentError) unless opts.class <= Hash
|
8
|
-
require 'json'
|
9
|
-
|
10
|
-
[:r,:folder,:dir,:directory].each do |sym|
|
11
|
-
opts[:root] ||= opts.delete(sym)
|
12
|
-
end
|
13
|
-
opts[:root] ||= Configer.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!)
|
18
|
-
|
19
|
-
Dir.glob( File.join( File.absolute_path(opts[:root]), "**","*.{json}" ) ).each do |file_path|
|
20
|
-
|
21
|
-
var= file_path.sub(opts[:root],"").split('.')
|
22
|
-
var.pop
|
23
|
-
var= var.join('.')
|
24
|
-
|
25
|
-
path_elements= var.split(File::Separator)
|
26
|
-
path_elements.delete('')
|
27
|
-
|
28
|
-
tmp_hsh= {}
|
29
|
-
current_obj= nil
|
30
|
-
|
31
|
-
path_elements.count.times { |index|
|
32
|
-
|
33
|
-
key_str= path_elements[index]
|
34
|
-
(current_obj ||= tmp_hsh)
|
35
|
-
current_obj[key_str]= {}
|
36
|
-
current_obj= current_obj[key_str] unless index == (path_elements.count-1)
|
37
|
-
|
38
|
-
}
|
39
|
-
|
40
|
-
current_obj[ path_elements.last ]= JSON.parse File.read file_path
|
41
|
-
|
42
|
-
opts[:out].deep_merge!(tmp_hsh)
|
43
|
-
|
44
|
-
return nil
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
alias :mount_json :mount_json_files
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
extend JSONFN
|
53
|
-
|
54
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
test: this
|
data/lib/configer/yaml.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
|
2
|
-
module Configer
|
3
|
-
|
4
|
-
module YamlFN
|
5
|
-
|
6
|
-
def mount_yaml_files opts= {}
|
7
|
-
raise(ArgumentError) unless opts.class <= Hash
|
8
|
-
require 'yaml'
|
9
|
-
|
10
|
-
[:r,:folder,:dir,:directory].each do |sym|
|
11
|
-
opts[:root] ||= opts.delete(sym)
|
12
|
-
end
|
13
|
-
opts[:root] ||= Configer.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!)
|
18
|
-
|
19
|
-
Dir.glob( File.join( File.absolute_path(opts[:root]), "**","*.{yaml,yml}" ) ).each do |file_path|
|
20
|
-
|
21
|
-
var= file_path.sub(opts[:root],"").split('.')
|
22
|
-
var.pop
|
23
|
-
var= var.join('.')
|
24
|
-
|
25
|
-
path_elements= var.split(File::Separator)
|
26
|
-
path_elements.delete('')
|
27
|
-
|
28
|
-
tmp_hsh= {}
|
29
|
-
current_obj= nil
|
30
|
-
|
31
|
-
path_elements.count.times { |index|
|
32
|
-
|
33
|
-
key_str= path_elements[index]
|
34
|
-
(current_obj ||= tmp_hsh)
|
35
|
-
current_obj[key_str]= {}
|
36
|
-
current_obj= current_obj[key_str] unless index == (path_elements.count-1)
|
37
|
-
|
38
|
-
}
|
39
|
-
|
40
|
-
method_to_call = YAML.respond_to?(:safe_load) ? :safe_load : :load
|
41
|
-
current_obj[ path_elements.last ]= YAML.public_send(
|
42
|
-
method_to_call,
|
43
|
-
File.read(file_path)
|
44
|
-
)
|
45
|
-
|
46
|
-
opts[:out].deep_merge!(tmp_hsh)
|
47
|
-
|
48
|
-
return nil
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
alias :mount_yaml :mount_yaml_files
|
53
|
-
alias :mount_yml :mount_yaml_files
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
extend YamlFN
|
58
|
-
|
59
|
-
end
|
data/pmip/pmip.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
puts 'Hello PMIP 0.3.2! - Please see http://code.google.com/p/pmip/ for full instructions and plugin helper bundles.'
|
data/sample/load_meta_files.rb
DELETED
data/sample/meta/hello.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"hello":"world"}
|
data/sample/meta/test.yml
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
hello: world
|
data/sample/mount_opts.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require "configer"
|
2
|
-
|
3
|
-
asdf= Configer::ConfigObject.new( {hello: "world"} )
|
4
|
-
|
5
|
-
Configer.mount_yaml out: asdf
|
6
|
-
Configer.mount_json out: asdf
|
7
|
-
|
8
|
-
puts __config__
|
9
|
-
#<Configer::ConfigObject>
|
10
|
-
|
11
|
-
# puts asdf
|
12
|
-
#<Configer::ConfigObject hello="world" sample=#<Configer::ConfigObject meta=#<Configer::ConfigObject hello=#<Configer::ConfigObject hello="world"> test=#<Configer::ConfigObject hello="world">>>>
|