config_files 0.0.4 → 0.1.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/.gitignore +3 -0
- data/Gemfile +3 -0
- data/LICENCE.txt +21 -0
- data/README.md +38 -0
- data/Rakefile +8 -0
- data/config_files.gemspec +24 -0
- data/lib/config_files/file_factory.rb +15 -0
- data/lib/config_files/loader_factory.rb +52 -0
- data/lib/config_files/loaders/default.rb +1 -0
- data/lib/config_files/loaders/json.rb +13 -0
- data/lib/config_files/loaders/yaml.rb +11 -0
- data/lib/config_files/loaders.rb +3 -0
- data/lib/config_files/version.rb +3 -0
- data/lib/config_files.rb +25 -9
- data/test/config_files_test.rb +47 -0
- data/test/etc/dummy.conf +2 -0
- data/test/etc/dummy.yml +2 -0
- data/test/loader_factory_test.rb +40 -0
- metadata +47 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69666324c397bf59a18efef190d2660ce376143b246bda3752409af21fe1b51b
|
4
|
+
data.tar.gz: 79c42d11ba5617e182e6b6cdb56074036c99f7bcd32fe0f5f0d0022b971f3194
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e53a814869eaebf6ed6b6ecc55425dedbaca918434168720e96eed9812a84bce6b64f0818c5b751343b20ce4adc42d7d23ab3b01b857542443fb8da68a5a7eca
|
7
|
+
data.tar.gz: 72ea7cc041cf8405429244a42c96a5a2f275de969b9fd183b62bca9423271847d38a43ae3970b23b64679643a3acdc26ff594c82a75456509c9a7a94cb76e830
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENCE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) [2012] [Paul McKibbin]
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
*Description*
|
2
|
+
|
3
|
+
Since it no longer just deals with yaml files as an input, *blackrat_yaml_config* has been renamed to *config_files*
|
4
|
+
Configuration file manager.
|
5
|
+
|
6
|
+
*Features*
|
7
|
+
|
8
|
+
Searches for first match in multiple directories for configuration file
|
9
|
+
Allows for dynamically updated or static config files
|
10
|
+
|
11
|
+
*Example*
|
12
|
+
|
13
|
+
require 'config_files'
|
14
|
+
|
15
|
+
class Dummy
|
16
|
+
include ConfigFiles #mixin the config_directories and config_files generators
|
17
|
+
|
18
|
+
#search directories (in order). The system will search for the file in the following directories
|
19
|
+
config_directories :etc=>['~/.dummy','/opt/dummy/config','/etc/default/dummy','/etc']
|
20
|
+
|
21
|
+
#The dummy.yml and another_yaml_file.yml will be pre-loaded.
|
22
|
+
static_config_files :dummy, :another_yaml_file
|
23
|
+
|
24
|
+
#yet_another_yaml_file.yml will be read every time the .yet_another_yaml_file method is accessed.
|
25
|
+
dynamic_config_files :yet_another_yaml_file
|
26
|
+
|
27
|
+
def use_config
|
28
|
+
some_method(Dummy.dummy[:key]) #extract the constant values from the :key in dummy.yml
|
29
|
+
another_method(Dummy.yet_another_yaml_file[:another_key]) #extract the constant value from the :another_key in yet_another_yaml_file.yml
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
*Todo*
|
37
|
+
|
38
|
+
Allow for different keys to be stored in files in different subdirectories to allow for overridable defaults
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'config_files/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.authors = ['Paul McKibbin']
|
7
|
+
spec.email = ['pmckibbin@gmail.com']
|
8
|
+
spec.description = 'A configuration tool for using multiple configuration files with multiple formats by presenting them as a hash.'
|
9
|
+
spec.summary = <<-SUMMARY
|
10
|
+
ConfigFiles is a configuration file access tool. It parses multiple configuration files in multiple formats and
|
11
|
+
presents a consistent block to the application with options to cache or use the files dynamically
|
12
|
+
SUMMARY
|
13
|
+
|
14
|
+
spec.homepage = 'https://github.com/blackrat/config_files'
|
15
|
+
spec.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.name = 'config_files'
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
spec.version = ConfigFiles::VERSION
|
20
|
+
spec.license = 'MIT'
|
21
|
+
spec.date = '2012-11-11'
|
22
|
+
|
23
|
+
spec.add_dependency 'activesupport'
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ConfigFiles
|
2
|
+
class FileFactory
|
3
|
+
class << self
|
4
|
+
private
|
5
|
+
def loader(file_name, options)
|
6
|
+
LoaderFactory.(file_name, options)
|
7
|
+
end
|
8
|
+
|
9
|
+
public
|
10
|
+
def call(file_name, options={})
|
11
|
+
loader(file_name, options).(file_name, object_class: ::Hash)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ConfigFiles
|
2
|
+
class LoaderFactory
|
3
|
+
class << self
|
4
|
+
public
|
5
|
+
def call(file_name, options={include_default: true})
|
6
|
+
new(options).call(file_name)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
attr_reader :options
|
12
|
+
|
13
|
+
def default_loaders
|
14
|
+
{
|
15
|
+
Loaders::Yaml => ['yaml', 'yml'],
|
16
|
+
Loaders::Json => ['json']
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def default_loader
|
21
|
+
options[:default_loader]
|
22
|
+
end
|
23
|
+
|
24
|
+
def default_options
|
25
|
+
{
|
26
|
+
include_default: true,
|
27
|
+
default_loader: Loaders::Yaml,
|
28
|
+
loaders: default_loaders
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def include_default_loaders?
|
33
|
+
options[:include_default]
|
34
|
+
end
|
35
|
+
|
36
|
+
def loaders
|
37
|
+
options[:loaders]
|
38
|
+
end
|
39
|
+
|
40
|
+
def initialize(options) #Note the check below is necessary, because we only want to do it if it is explicity set
|
41
|
+
@options=default_options.merge(options)
|
42
|
+
if include_default_loaders?
|
43
|
+
@options[:loaders]=default_loaders.merge(loaders)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
public
|
48
|
+
def call(file_name)
|
49
|
+
loaders.detect{|_, extensions| extensions.include?(::File.extname(file_name).strip.downcase[1..-1])}&.first || default_loader
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
ConfigFiles::Loaders::Default=ConfigFiles::Loaders::Yaml
|
data/lib/config_files.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
require 'config_files/file_factory'
|
2
|
+
require 'config_files/loader_factory'
|
3
|
+
require 'config_files/loaders'
|
4
|
+
require 'config_files/version'
|
5
|
+
require 'active_support/core_ext/hash/deep_merge'
|
6
|
+
|
1
7
|
require 'meta'
|
2
8
|
require 'yaml'
|
3
9
|
module ConfigFiles
|
@@ -14,8 +20,8 @@ module ConfigFiles
|
|
14
20
|
include Meta
|
15
21
|
attr_accessor :directories
|
16
22
|
|
17
|
-
def
|
18
|
-
'
|
23
|
+
def any_extension
|
24
|
+
'*'
|
19
25
|
end
|
20
26
|
|
21
27
|
def config_key
|
@@ -32,16 +38,24 @@ module ConfigFiles
|
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|
41
|
+
def merged_hash(file)
|
42
|
+
config_files(file).inject({}) { |master, file| master.deep_merge(FileFactory.(file)) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def build_combined(file)
|
46
|
+
JSON.parse(merged_hash(file).to_json, object_class: OpenStruct)
|
47
|
+
end
|
48
|
+
|
35
49
|
def static_config_files(*arr)
|
36
50
|
arr.each do |file|
|
37
|
-
content=
|
51
|
+
content=build_combined(file)
|
38
52
|
meta_def(file) { content }
|
39
53
|
end
|
40
54
|
end
|
41
55
|
|
42
56
|
def dynamic_config_files(*arr)
|
43
57
|
arr.each do |file|
|
44
|
-
meta_def(file) {
|
58
|
+
meta_def(file) { build_combined(file) }
|
45
59
|
end
|
46
60
|
end
|
47
61
|
|
@@ -49,13 +63,15 @@ module ConfigFiles
|
|
49
63
|
|
50
64
|
private
|
51
65
|
def first_directory(file, key=config_key)
|
52
|
-
self.directories[key]
|
53
|
-
|
54
|
-
|
66
|
+
self.directories[key]&.detect { |directory| Dir.glob(File.join(directory, "#{file}.*")) } || (raise Errno::ENOENT, "No #{file}.* in #{self.directories[key]}")
|
67
|
+
end
|
68
|
+
|
69
|
+
def files(file, key=config_key)
|
70
|
+
Dir.glob(File.join(first_directory(file, key), "#{file}.*"))
|
55
71
|
end
|
56
72
|
|
57
|
-
def
|
58
|
-
|
73
|
+
def config_files(file, key=config_key)
|
74
|
+
files(file, key)
|
59
75
|
end
|
60
76
|
end
|
61
77
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
$:.push(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'config_files'
|
4
|
+
class Dummy
|
5
|
+
include ConfigFiles
|
6
|
+
config_directories :etc => ['etc', 'nofiles/etc']
|
7
|
+
static_config_files :dummy, :broken
|
8
|
+
end
|
9
|
+
|
10
|
+
class Dummy2 < Dummy
|
11
|
+
config_directories 'config' => ['etc', 'nofiles/etc']
|
12
|
+
class << self
|
13
|
+
def config_key
|
14
|
+
"config"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class ConfigFilesTest < MiniTest::Test
|
20
|
+
def test_config_key
|
21
|
+
assert_equal(:etc, Dummy.config_key)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_directory_is_initialized
|
25
|
+
assert(Dummy.directories)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_has_created_methods
|
29
|
+
assert(Dummy.etc_dir)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_created_paths_for_directories
|
33
|
+
assert_equal([File.join(__dir__, 'etc'), File.join(__dir__, 'nofiles/etc')], Dummy.etc_dir)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_created_variables
|
37
|
+
assert_equal('test', Dummy.dummy[:config_test])
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_empty_for_missing_files
|
41
|
+
assert_equal({}, Dummy.broken.to_h)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_yaml_and_config_override
|
45
|
+
assert_equal('test', Dummy2.dummy[:config_test])
|
46
|
+
end
|
47
|
+
end
|
data/test/etc/dummy.conf
ADDED
data/test/etc/dummy.yml
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
$:.push(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'config_files'
|
4
|
+
class LoaderFactoryDummy
|
5
|
+
class << self
|
6
|
+
def call(file_name, options={})
|
7
|
+
nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class LoaderFactoryTest < MiniTest::Test
|
13
|
+
def file_locations
|
14
|
+
File.join(__dir__, 'etc')
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_detect_yaml_file_type
|
18
|
+
assert_equal(::ConfigFiles::Loaders::Yaml, ::ConfigFiles::LoaderFactory.(File.join(file_locations,'dummy.yml')))
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_detect_json_file_type
|
22
|
+
assert_equal(::ConfigFiles::Loaders::Json, ::ConfigFiles::LoaderFactory.(File.join(file_locations,'dummy.json')))
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_detect_unknown_file_type
|
26
|
+
assert_nil(::ConfigFiles::LoaderFactory.(File.join(file_locations,'dummy.wibble'), default_loader: nil))
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_allow_addition_of_file_types_does_not_break_existing
|
30
|
+
assert_equal(::ConfigFiles::Loaders::Yaml, ::ConfigFiles::LoaderFactory.(File.join(file_locations,'dummy.yml'), loaders: {LoaderFactoryDummy=>['wibble']}))
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_allow_addition_of_file_types_breaks_existing_if_specified
|
34
|
+
assert_nil(::ConfigFiles::LoaderFactory.(File.join(file_locations,'dummy.yml'), loaders: {LoaderFactoryDummy=>['wibble']}, include_default: false, default_loader: nil))
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_addition_of_new_loaders
|
38
|
+
assert_equal(LoaderFactoryDummy, ::ConfigFiles::LoaderFactory.(File.join(file_locations,'dummy.wibble'), loaders: {LoaderFactoryDummy=>['wibble']}, include_default: false))
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,26 +1,59 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: config_files
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul McKibbin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2012-11-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
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'
|
13
27
|
description: A configuration tool for using multiple configuration files with multiple
|
14
28
|
formats by presenting them as a hash.
|
15
|
-
email:
|
29
|
+
email:
|
30
|
+
- pmckibbin@gmail.com
|
16
31
|
executables: []
|
17
32
|
extensions: []
|
18
33
|
extra_rdoc_files: []
|
19
34
|
files:
|
35
|
+
- ".gitignore"
|
36
|
+
- Gemfile
|
37
|
+
- LICENCE.txt
|
38
|
+
- README.md
|
39
|
+
- Rakefile
|
40
|
+
- config_files.gemspec
|
20
41
|
- lib/config_files.rb
|
42
|
+
- lib/config_files/file_factory.rb
|
43
|
+
- lib/config_files/loader_factory.rb
|
44
|
+
- lib/config_files/loaders.rb
|
45
|
+
- lib/config_files/loaders/default.rb
|
46
|
+
- lib/config_files/loaders/json.rb
|
47
|
+
- lib/config_files/loaders/yaml.rb
|
48
|
+
- lib/config_files/version.rb
|
21
49
|
- lib/meta.rb
|
50
|
+
- test/config_files_test.rb
|
51
|
+
- test/etc/dummy.conf
|
52
|
+
- test/etc/dummy.yml
|
53
|
+
- test/loader_factory_test.rb
|
22
54
|
homepage: https://github.com/blackrat/config_files
|
23
|
-
licenses:
|
55
|
+
licenses:
|
56
|
+
- MIT
|
24
57
|
metadata: {}
|
25
58
|
post_install_message:
|
26
59
|
rdoc_options: []
|
@@ -38,8 +71,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
38
71
|
version: '0'
|
39
72
|
requirements: []
|
40
73
|
rubyforge_project:
|
41
|
-
rubygems_version: 2.6
|
74
|
+
rubygems_version: 2.7.6
|
42
75
|
signing_key:
|
43
76
|
specification_version: 4
|
44
|
-
summary:
|
45
|
-
|
77
|
+
summary: ConfigFiles is a configuration file access tool. It parses multiple configuration
|
78
|
+
files in multiple formats and presents a consistent block to the application with
|
79
|
+
options to cache or use the files dynamically
|
80
|
+
test_files:
|
81
|
+
- test/config_files_test.rb
|
82
|
+
- test/etc/dummy.conf
|
83
|
+
- test/etc/dummy.yml
|
84
|
+
- test/loader_factory_test.rb
|