configer 1.3.1 → 2.0.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 -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">>>>
|