stacked_config 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7ef0fb993dbab5cbf83f2a1007c488bbce22cd2d
4
- data.tar.gz: 9c106a74c466771c8d9f1513f2821e9c0c1f222a
3
+ metadata.gz: da24388d057ab98233e3002bb7adcc961b2b5bb9
4
+ data.tar.gz: cb324ce96a7a17fdd7ffdbd89d9e94eaefc08a1f
5
5
  SHA512:
6
- metadata.gz: 5243d90765dd73895db3c018f3912fd244ed4bff8b0ffab16a528f3b0b5dc7fda34178a3106a89a49c598cf21757ad0cbdf99dd5f0997a1cd7e61bc758ae60f5
7
- data.tar.gz: dfcddb44b6cc7116001e5d0c1d11ab7c10afb9f844b17614cf2bbfdf8479923b1fb34833d14ec070fe341878a1c930bc226e14b5fbe6b1b79824d3e8dda360c0
6
+ metadata.gz: 3a4b2fcf9749d4a2002f6a2004ab14caaf522b04bd622f71112673654b934c37c1fd55ed1fd8974cef1413599508b4fb2e6b85984ab3f9ce3a136a9ac080a7f2
7
+ data.tar.gz: ce7df61eaeb80659d44b0b3e4b7aacaef1454fa9c1391b74242fb32ee5c27cc1460368ffc91be5ae132b9d0913aae05eb794ce2f5468849b822f42259d2c4a8e
data/README.md CHANGED
@@ -15,6 +15,8 @@ script. By default, it will handle already few config layers:
15
15
  * The __global layer__, which is the layer to declare options for all users that use the ruby script using this gem.
16
16
  * The __user layer__, which is the layer, where a user can set options for the ruby script using this gem.
17
17
  * The __extra layer__, which provides the possibility to specify another config file from the config itself.
18
+ * The __enviroment variables layer__, which provides the possibility to include in the config variables coming from
19
+ the shell variables. See [below](#environment-variables) for more info.
18
20
  * The __command-line layer__, which provides the ability to specify options from the command line.
19
21
  * The __override layer__, which will contain all modifications done to the config at run time.
20
22
 
@@ -81,6 +83,7 @@ Every layer is accessible through the following orchestrator properties:
81
83
  * `global_layer`
82
84
  * `user_layer`
83
85
  * `provided_config_file_layer`
86
+ * `env_layer`
84
87
  * `command_line_layer`
85
88
  * `write_layer`
86
89
 
@@ -103,7 +106,8 @@ As you can see in the sources, paths are expressed using kind of 'templates', wh
103
106
  currently executing script.
104
107
  * `##PROGRAM_NAME##` is by default the name of the script you are running (with no extension). You can if you want
105
108
  change this name at runtime. __Changing it (using the `config_file_base_name` orchestrator property ) will trigger a
106
- re-search and reload of all the config files__.
109
+ re-search and reload of all the config files__. `config_file_base_name` defines the base name to search for config
110
+ files accross the system. by default the name of the gem will be used.
107
111
  * `##EXTENSION##` is one of the following extensions : `conf CONF cfg CFG yml YML yaml YAML`.
108
112
 
109
113
  The search of the config files for a layer is done according to the order defined in sources just above and then
@@ -118,6 +122,41 @@ user config level, only the first is taken in account:
118
122
  * `~/.config/my_script.conf`
119
123
 
120
124
 
125
+ ### Environment variables
126
+
127
+ `stacked_config` can read information from your ENV variables thanks to the dedicated `env_layer`. __This layer is not
128
+ created by default__, it is up to you to add it to your application, due to the fact that you will use it mostly
129
+ with an optional filter and that you may want to add it with different priorities regarding your use case:
130
+
131
+ ```ruby
132
+ require 'stacked_config'
133
+
134
+ config = StackedConfig::Orchestrator.new
135
+ env_layer = StackedConfig::Layers::EnvLayer.new(optional_filter)
136
+ config.add_layer(envLayer)
137
+ env_layer.name = 'Environment variables level'
138
+ env_layer.priority = 60
139
+ ```
140
+
141
+ Or the exactly same using the convenience method of the orchestrator:
142
+
143
+ ```ruby
144
+ require 'stacked_config'
145
+
146
+ config = StackedConfig::Orchestrator.new
147
+ config.include_env_layer(optional_filter, optional_priority)
148
+ ```
149
+
150
+ Which does not prevent you changing afterwards its priority using the config's `env_layer` accessor.
151
+
152
+ The constructor parameter `optional_filter` parameter aims at filtering the ENV variables:
153
+
154
+ * if nil, all the ENV[] content will be added to the `env_layer`
155
+ * it can be a single string if you want only one variable
156
+ * it can be an array of accepted names of variables. ex: `StackedConfig::Layers::EnvLayer.new 'VAR_NAME_1'`
157
+ `StackedConfig::Layers::EnvLayer.new ['VAR_NAME_1', 'VAR_NAME_2']`
158
+ * it can be a regexp that variables names have to match. ex: `StackedConfig::Layers::EnvLayer.new /somePattern/`
159
+
121
160
  ### Script command line options
122
161
 
123
162
  `stacked_config` uses internally the fantastic [Slop] gem to manage options coming from the command line within the
@@ -0,0 +1,41 @@
1
+ module StackedConfig
2
+ module Layers
3
+
4
+ class EnvLayer < SuperStack::Layer
5
+
6
+ attr_reader :filter
7
+
8
+ def initialize(filter=nil)
9
+ self.filter = filter
10
+ end
11
+
12
+ def filter=(filter)
13
+ raise 'Invalid filter' unless [NilClass, String, Array, Regexp].include? filter.class
14
+ @filter = filter
15
+ reload
16
+ end
17
+
18
+ def load(*args)
19
+ self.replace read_filtered_environment
20
+ @file_name = :none
21
+ self
22
+ end
23
+
24
+ private
25
+
26
+ def read_filtered_environment
27
+ return ENV.to_hash if filter.nil?
28
+
29
+ if filter.is_a? Array
30
+ ENV.to_hash.select {|k, v| filter.include?(k) }
31
+ elsif filter.is_a? Regexp
32
+ ENV.to_hash.select {|k, v| k =~ filter }
33
+ elsif filter.is_a? String
34
+ ENV.to_hash.select {|k, v| k == filter }
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
@@ -3,7 +3,7 @@ module StackedConfig
3
3
 
4
4
  include StackedConfig::ProgramDescriptionHelper
5
5
 
6
- attr_reader :system_layer, :global_layer, :gem_layer, :user_layer,
6
+ attr_reader :system_layer, :global_layer, :gem_layer, :user_layer, :env_layer,
7
7
  :command_line_layer, :provided_config_file_layer
8
8
 
9
9
  def initialize
@@ -19,6 +19,14 @@ module StackedConfig
19
19
  File.basename($PROGRAM_NAME).gsub /\.[^\.]+$/, ''
20
20
  end
21
21
 
22
+ def include_env_layer(filter = nil, priority = 60)
23
+ @env_layer = StackedConfig::Layers::EnvLayer.new filter
24
+ env_layer.name = 'Environment variables level'
25
+ env_layer.priority = priority
26
+ env_layer.load
27
+ self << env_layer
28
+ end
29
+
22
30
  private
23
31
 
24
32
  def setup_layers
@@ -12,11 +12,6 @@ module StackedConfig
12
12
  unix: '/etc'
13
13
  }
14
14
 
15
- USER_CONFIG_ROOT = {
16
- windows: ENV['APPDATA'],
17
- unix: ENV['HOME']
18
- }
19
-
20
15
  EXTENSIONS = %w(conf CONF cfg CFG yml YML yaml YAML)
21
16
 
22
17
  def self.os_flavour
@@ -32,7 +27,7 @@ module StackedConfig
32
27
  end
33
28
 
34
29
  def self.user_config_root
35
- USER_CONFIG_ROOT[os_flavour]
30
+ Dir.home
36
31
  end
37
32
 
38
33
  def self.gem_config_root
@@ -1,3 +1,3 @@
1
1
  module StackedConfig
2
- VERSION = '0.3.1'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -9,6 +9,7 @@ require 'stacked_config/layers/system_layer'
9
9
  require 'stacked_config/layers/gem_layer'
10
10
  require 'stacked_config/layers/global_layer'
11
11
  require 'stacked_config/layers/user_layer'
12
+ require 'stacked_config/layers/env_layer'
12
13
  require 'stacked_config/layers/command_line_layer'
13
14
  require 'stacked_config/layers/provided_config_file_layer'
14
15
  require 'stacked_config/orchestrator'
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe StackedConfig::Layers::EnvLayer do
4
+
5
+ NIL_FILTER = nil
6
+ STRING_FILTER ='StackedConfig::Layers::EnvLayer::VAR1'
7
+ ARRAY_FILTER = %w(StackedConfig::Layers::EnvLayer::VAR1 StackedConfig::Layers::EnvLayer::VAR3)
8
+ REGEXP_FILTER = /StackedConfig::Layers::EnvLayer::VAR[13]/
9
+
10
+ before(:all) do
11
+ (1..3).each { |i| ENV["StackedConfig::Layers::EnvLayer::VAR#{i}"] = "VALUE#{i}" }
12
+ end
13
+
14
+ after(:all) do
15
+ (1..3).each { |i| ENV.delete("StackedConfig::Layers::EnvLayer::VAR#{i}") }
16
+ end
17
+
18
+ context 'when no filter is provided' do
19
+
20
+ it 'should contain all ENV values' do
21
+ layer = StackedConfig::Layers::EnvLayer.new
22
+ layer.load
23
+ expect(layer.to_a).to eq(ENV.to_hash.to_a)
24
+ layer = StackedConfig::Layers::EnvLayer.new NIL_FILTER
25
+ layer.load
26
+ expect(layer.to_a).to eq(ENV.to_hash.to_a)
27
+ end
28
+
29
+ end
30
+
31
+ context 'when a filter is provided' do
32
+
33
+ [ARRAY_FILTER, REGEXP_FILTER].each do |filter|
34
+
35
+ it "should contain filtered ENV variables according to the #{filter.class} filter" do
36
+ layer = StackedConfig::Layers::EnvLayer.new(filter)
37
+ layer.load
38
+ [1,3].each { |i|
39
+ expect(layer["StackedConfig::Layers::EnvLayer::VAR#{i}"]).to eql("VALUE#{i}")
40
+ }
41
+ expect(layer.keys.length == 2).to be_truthy
42
+ end
43
+
44
+ end
45
+
46
+ it 'should filter according a String if only value is requested' do
47
+ layer = StackedConfig::Layers::EnvLayer.new(STRING_FILTER)
48
+ layer.load
49
+ expect(layer['StackedConfig::Layers::EnvLayer::VAR1']).to eql 'VALUE1'
50
+ expect(layer.keys.length == 1).to be_truthy
51
+ end
52
+
53
+ end
54
+
55
+ end
@@ -116,5 +116,19 @@ describe StackedConfig::Orchestrator do
116
116
 
117
117
  end
118
118
 
119
+ it 'should not have environment variables by defaut' do
120
+ expect(subject.env_layer).to be_nil
121
+ end
122
+
123
+ context 'when including environment variables in the config' do
124
+
125
+ it 'should be accessible through the #env_layer accessor' do
126
+ expect {subject.include_env_layer}.not_to raise_error
127
+ expect(subject.env_layer).not_to be_nil
128
+ expect(subject.env_layer).to be_a StackedConfig::Layers::EnvLayer
129
+ end
130
+
131
+ end
132
+
119
133
 
120
134
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stacked_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laurent B.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-10 00:00:00.000000000 Z
11
+ date: 2015-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -116,6 +116,7 @@ files:
116
116
  - Rakefile
117
117
  - lib/stacked_config.rb
118
118
  - lib/stacked_config/layers/command_line_layer.rb
119
+ - lib/stacked_config/layers/env_layer.rb
119
120
  - lib/stacked_config/layers/gem_layer.rb
120
121
  - lib/stacked_config/layers/generic_layer.rb
121
122
  - lib/stacked_config/layers/global_layer.rb
@@ -127,6 +128,7 @@ files:
127
128
  - lib/stacked_config/source_helper.rb
128
129
  - lib/stacked_config/version.rb
129
130
  - spec/command_line_layer_spec.rb
131
+ - spec/env_layer_spec.rb
130
132
  - spec/gem_layer_spec.rb
131
133
  - spec/global_layer_spec.rb
132
134
  - spec/orchestrator_spec.rb
@@ -178,6 +180,7 @@ specification_version: 4
178
180
  summary: Manages config files according to standard policy.
179
181
  test_files:
180
182
  - spec/command_line_layer_spec.rb
183
+ - spec/env_layer_spec.rb
181
184
  - spec/gem_layer_spec.rb
182
185
  - spec/global_layer_spec.rb
183
186
  - spec/orchestrator_spec.rb