dynamic_configuration 0.1.1 → 0.1.2
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.
- data/VERSION +1 -1
- data/dynamic_configuration.gemspec +1 -1
- data/lib/dynamic_configuration.rb +15 -15
- data/spec/dynamic_configuration_spec.rb +27 -11
- metadata +1 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
@@ -7,12 +7,15 @@ module DynamicConfiguration
|
|
7
7
|
|
8
8
|
private
|
9
9
|
|
10
|
-
class ConfigFactory
|
10
|
+
class ConfigFactory
|
11
11
|
def create_config(const_name, config_file_name)
|
12
|
-
|
12
|
+
@rails_loaded = Object.const_defined?(:Rails)
|
13
|
+
|
14
|
+
config = setup_config(const_name, config_file_name)
|
13
15
|
load_main_configuration_files
|
14
|
-
load_per_environment_configuration_files if
|
16
|
+
load_per_environment_configuration_files if @rails_loaded
|
15
17
|
load_local_configuration_files
|
18
|
+
config.freeze
|
16
19
|
|
17
20
|
return @config
|
18
21
|
end
|
@@ -52,7 +55,7 @@ module DynamicConfiguration
|
|
52
55
|
|
53
56
|
def load_local_configuration_files
|
54
57
|
local_settings_exist = FileTest.directory?(@config_path.to_s + "/local")
|
55
|
-
rails_test_env =
|
58
|
+
rails_test_env = @rails_loaded && Rails.env == 'test'
|
56
59
|
return if !local_settings_exist || rails_test_env
|
57
60
|
|
58
61
|
local_mod_files_dir = @config_path + Pathname.new("local/")
|
@@ -65,7 +68,7 @@ module DynamicConfiguration
|
|
65
68
|
end
|
66
69
|
end
|
67
70
|
|
68
|
-
class Config < ::BlankSlate
|
71
|
+
class Config < ::BlankSlate
|
69
72
|
def initialize(const_name, config_path)
|
70
73
|
@const_name, @config_path = const_name, config_path
|
71
74
|
end
|
@@ -78,14 +81,7 @@ module DynamicConfiguration
|
|
78
81
|
@modules[mod_name.intern].instance_eval(::IO.read(file_pathname.to_s))
|
79
82
|
|
80
83
|
@settings ||= {}
|
81
|
-
@settings[mod_name.intern] ||= Settings.new(@modules[mod_name.intern].settings)
|
82
|
-
end
|
83
|
-
|
84
|
-
def finalize
|
85
|
-
::ActiveSupport::Dependencies.autoload_paths << @config_path.to_s
|
86
|
-
::ActiveSupport::Dependencies.explicitly_unloadable_constants << @const_name.to_s
|
87
|
-
|
88
|
-
self.freeze
|
84
|
+
@settings[mod_name.intern] ||= Settings.new(@const_name, mod_name, @modules[mod_name.intern].settings)
|
89
85
|
end
|
90
86
|
|
91
87
|
def method_missing(name, *args, &block)
|
@@ -106,18 +102,22 @@ module DynamicConfiguration
|
|
106
102
|
|
107
103
|
def method_missing(name, value)
|
108
104
|
@settings[name] = value
|
105
|
+
@settings[name].freeze
|
109
106
|
end
|
110
107
|
end
|
111
108
|
|
112
109
|
class Settings < ::BlankSlate
|
113
|
-
def initialize(settings)
|
110
|
+
def initialize(const_name, module_name, settings)
|
111
|
+
@const_name = const_name
|
112
|
+
@module_name = module_name
|
114
113
|
@settings = settings
|
115
114
|
end
|
116
115
|
|
117
116
|
def method_missing(name, *args)
|
118
|
-
@settings
|
117
|
+
@settings.fetch(name) { raise MissingSettingException.new("Setting '#{@const_name}.#{@module_name}.#{name}' is not defined") }
|
119
118
|
end
|
120
119
|
end
|
121
120
|
|
122
121
|
class MissingSubmoduleException < StandardError; end
|
122
|
+
class MissingSettingException < StandardError; end
|
123
123
|
end
|
@@ -1,33 +1,49 @@
|
|
1
1
|
require_relative '../spec_helper'
|
2
2
|
require_relative '../lib/dynamic_configuration'
|
3
3
|
|
4
|
-
describe DynamicConfiguration do
|
5
|
-
let(:path) { "#{File.dirname(__FILE__)}/options" }
|
6
|
-
|
4
|
+
describe DynamicConfiguration do
|
7
5
|
before(:each) do
|
8
|
-
Object.instance_eval { remove_const :Settings if const_defined?(:Settings) }
|
9
|
-
end
|
6
|
+
Object.instance_eval { remove_const :Settings if const_defined?(:Settings) }
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:path) { "#{File.dirname(__FILE__)}/options" }
|
10
10
|
|
11
11
|
it "should create valid configurations" do
|
12
12
|
DynamicConfiguration::create(:Settings, path)
|
13
|
-
|
14
13
|
Settings.main.setting_one.should == 'Some string'
|
15
14
|
Settings.main.setting_two.should == 123456
|
16
15
|
end
|
17
16
|
|
18
17
|
it "should make per-environment settings take precedence over main configuration" do
|
19
|
-
Rails = mock(:env => 'test')
|
20
|
-
|
18
|
+
Rails = mock(:env => 'test').as_null_object
|
21
19
|
DynamicConfiguration::create(:Settings, path)
|
22
|
-
|
23
20
|
Settings.main.setting_three.should == [3, 2, 1]
|
24
|
-
|
25
21
|
Object.instance_eval { remove_const :Rails }
|
26
22
|
end
|
27
23
|
|
28
24
|
it "should make local settings take precedence even over per-environment settings" do
|
29
25
|
DynamicConfiguration::create(:Settings, path)
|
30
|
-
|
31
26
|
Settings.main.setting_four.should == 'overwrite-again'
|
32
27
|
end
|
28
|
+
|
29
|
+
it "should freeze the created configuration" do
|
30
|
+
lambda {
|
31
|
+
DynamicConfiguration::create(:Settings, path)
|
32
|
+
Settings.main.setting_three << 4
|
33
|
+
}.should raise_error(RuntimeError)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should raise an exception if trying to use a submodule that is not defined" do
|
37
|
+
lambda {
|
38
|
+
DynamicConfiguration::create(:Settings, path)
|
39
|
+
Settings.xyz.setting_three
|
40
|
+
}.should raise_error(DynamicConfiguration::MissingSubmoduleException)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should raise an exception if trying to use a setting that is not defined" do
|
44
|
+
lambda {
|
45
|
+
DynamicConfiguration::create(:Settings, path)
|
46
|
+
Settings.main.xyz
|
47
|
+
}.should raise_error(DynamicConfiguration::MissingSettingException)
|
48
|
+
end
|
33
49
|
end
|