rails_config 0.0.5 → 0.0.6
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/TODO +10 -0
- data/VERSION +1 -1
- data/lib/rails_config/railtie.rb +4 -2
- data/lib/rails_config.rb +62 -2
- data/spec/rails_config_spec.rb +107 -0
- metadata +8 -7
- data/lib/rails_config/setting_builder.rb +0 -61
- data/spec/rails_config/setting_builder_spec.rb +0 -109
data/TODO
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
- Add a Rails before_filter that triggers Settings.reload! for each development request
|
2
|
+
- Allow user to customize the name of the global setting object (Settings)
|
3
|
+
- Add generator `rails_config:install` to create the default setting files
|
4
|
+
- config/settings.yml
|
5
|
+
- config/settings/development.yml
|
6
|
+
- config/settings/test.yml
|
7
|
+
- config/settings/production.yml
|
8
|
+
|
9
|
+
- Remove OStruct and create a custom implementation (return proxy obj)
|
10
|
+
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
data/lib/rails_config/railtie.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
if defined?(Rails::Railtie)
|
2
2
|
module RailsConfig
|
3
3
|
class Railtie < Rails::Railtie
|
4
|
-
|
5
|
-
|
4
|
+
|
5
|
+
ActiveSupport.on_load :before_initialize, :yield => true do
|
6
|
+
::Settings = RailsConfig.load_files(
|
6
7
|
Rails.root.join("config", "settings.yml").to_s,
|
7
8
|
Rails.root.join("config", "settings", "#{Rails.env}.yml").to_s,
|
8
9
|
Rails.root.join("config", "environments", "#{Rails.env}.yml").to_s
|
9
10
|
)
|
10
11
|
end
|
12
|
+
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
data/lib/rails_config.rb
CHANGED
@@ -1,5 +1,65 @@
|
|
1
|
-
require 'rails_config/vendor/deep_merge' unless defined?(DeepMerge)
|
2
1
|
require 'pathname'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'yaml'
|
4
|
+
require 'erb'
|
5
|
+
|
6
|
+
require 'rails_config/vendor/deep_merge' unless defined?(DeepMerge)
|
7
|
+
|
8
|
+
module RailsConfig
|
9
|
+
|
10
|
+
@@load_paths = []
|
11
|
+
def self.load_paths
|
12
|
+
@@load_paths
|
13
|
+
end
|
14
|
+
|
15
|
+
# Create a config object (OpenStruct) from a yaml file. If a second yaml file is given, then the sections of that file will overwrite the sections
|
16
|
+
# if the first file if they exist in the first file.
|
17
|
+
def self.load_files(*files)
|
18
|
+
config = OpenStruct.new
|
19
|
+
|
20
|
+
@@load_paths = [files].flatten.compact.uniq
|
21
|
+
# add singleton method to our Settings that reloads its settings from the load_paths
|
22
|
+
def config.reload!
|
23
|
+
|
24
|
+
conf = {}
|
25
|
+
RailsConfig.load_paths.to_a.each do |path|
|
26
|
+
file_conf = YAML.load(ERB.new(IO.read(path.to_s)).result) if path and File.exists?(path.to_s)
|
27
|
+
next unless file_conf
|
28
|
+
|
29
|
+
if conf.size > 0
|
30
|
+
DeepMerge.deep_merge!(file_conf, conf, :preserve_unmergeables => false)
|
31
|
+
else
|
32
|
+
conf = file_conf
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# load all the new values into the openstruct
|
37
|
+
marshal_load(RailsConfig.convert(conf).marshal_dump)
|
38
|
+
|
39
|
+
return self
|
40
|
+
end
|
41
|
+
|
42
|
+
config.reload!
|
43
|
+
return config
|
44
|
+
end
|
45
|
+
|
46
|
+
# Recursively converts Hashes to OpenStructs (including Hashes inside Arrays)
|
47
|
+
def self.convert(h) #:nodoc:
|
48
|
+
s = OpenStruct.new
|
49
|
+
h.each do |k, v|
|
50
|
+
s.new_ostruct_member(k)
|
51
|
+
if v.is_a?(Hash)
|
52
|
+
s.send( (k+'=').to_sym, convert(v))
|
53
|
+
elsif v.is_a?(Array)
|
54
|
+
converted_array = v.collect { |e| e.instance_of?(Hash) ? convert(e) : e }
|
55
|
+
s.send("#{k}=".to_sym, converted_array)
|
56
|
+
else
|
57
|
+
s.send("#{k}=".to_sym, v)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
s
|
61
|
+
end
|
62
|
+
end
|
3
63
|
|
4
|
-
|
64
|
+
# add railtie
|
5
65
|
require 'rails_config/railtie'
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RailsConfig do
|
4
|
+
|
5
|
+
it "should load a basic config file" do
|
6
|
+
config = RailsConfig.load_files(setting_path("settings.yml"))
|
7
|
+
config.size.should == 1
|
8
|
+
config.server.should == "google.com"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should load 2 basic config files" do
|
12
|
+
config = RailsConfig.load_files(setting_path("settings.yml"), setting_path("settings2.yml"))
|
13
|
+
config.size.should == 1
|
14
|
+
config.server.should == "google.com"
|
15
|
+
config.another.should == "something"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should load empty config for a missing file path" do
|
19
|
+
config = RailsConfig.load_files(setting_path("some_file_that_doesnt_exist.yml"))
|
20
|
+
config.should == OpenStruct.new
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should load an empty config for multiple missing file paths" do
|
24
|
+
files = [setting_path("doesnt_exist1.yml"), setting_path("doesnt_exist2.yml")]
|
25
|
+
config = RailsConfig.load_files(files)
|
26
|
+
config.should == OpenStruct.new
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should load empty config for an empty setting file" do
|
30
|
+
config = RailsConfig.load_files(setting_path("empty1.yml"))
|
31
|
+
config.should == OpenStruct.new
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should load an empty config for multiple missing file paths" do
|
35
|
+
files = [setting_path("empty1.yml"), setting_path("empty2.yml")]
|
36
|
+
config = RailsConfig.load_files(files)
|
37
|
+
config.should == OpenStruct.new
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should allow overrides" do
|
41
|
+
files = [setting_path("settings.yml"), setting_path("development.yml")]
|
42
|
+
config = RailsConfig.load_files(files)
|
43
|
+
config.server.should == "google.com"
|
44
|
+
config.size.should == 2
|
45
|
+
end
|
46
|
+
|
47
|
+
context "Nested Settings" do
|
48
|
+
let(:config) do
|
49
|
+
RailsConfig.load_files(setting_path("development.yml"))
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should allow nested sections" do
|
53
|
+
config.section.size.should == 3
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should allow configuration collections (arrays)" do
|
57
|
+
config.section.servers[0].name.should == "yahoo.com"
|
58
|
+
config.section.servers[1].name.should == "amazon.com"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "Settings with ERB tags" do
|
63
|
+
let(:config) do
|
64
|
+
RailsConfig.load_files(setting_path("with_erb.yml"))
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should evaluate ERB tags" do
|
68
|
+
config.computed.should == 6
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should evaluated nested ERB tags" do
|
72
|
+
config.section.computed1.should == 1
|
73
|
+
config.section.computed2.should == 2
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "Deep Merging" do
|
78
|
+
let(:config) do
|
79
|
+
files = [setting_path("deep_merge/config1.yml"), setting_path("deep_merge/config2.yml")]
|
80
|
+
RailsConfig.load_files(files)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should merge hashes from multiple configs" do
|
84
|
+
config.inner.marshal_dump.keys.size.should == 3
|
85
|
+
config.inner2.inner2_inner.marshal_dump.keys.size.should == 3
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should merge arrays from multiple configs" do
|
89
|
+
config.arraylist1.size.should == 6
|
90
|
+
config.arraylist2.inner.size.should == 6
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "Boolean Overrides" do
|
95
|
+
let(:config) do
|
96
|
+
files = [setting_path("bool_override/config1.yml"), setting_path("bool_override/config2.yml")]
|
97
|
+
RailsConfig.load_files(files)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should allow overriding of bool settings" do
|
101
|
+
config.override_bool.should == false
|
102
|
+
config.override_bool_opposite.should == true
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jacques Crocker
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-10 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -45,16 +45,17 @@ extensions: []
|
|
45
45
|
extra_rdoc_files:
|
46
46
|
- LICENSE
|
47
47
|
- README
|
48
|
+
- TODO
|
48
49
|
files:
|
49
50
|
- Gemfile
|
50
51
|
- Gemfile.lock
|
51
52
|
- LICENSE
|
52
53
|
- README
|
53
54
|
- Rakefile
|
55
|
+
- TODO
|
54
56
|
- VERSION
|
55
57
|
- lib/rails_config.rb
|
56
58
|
- lib/rails_config/railtie.rb
|
57
|
-
- lib/rails_config/setting_builder.rb
|
58
59
|
- lib/rails_config/vendor/deep_merge.rb
|
59
60
|
- spec/fixtures/bool_override/config1.yml
|
60
61
|
- spec/fixtures/bool_override/config2.yml
|
@@ -68,7 +69,7 @@ files:
|
|
68
69
|
- spec/fixtures/settings.yml
|
69
70
|
- spec/fixtures/settings2.yml
|
70
71
|
- spec/fixtures/with_erb.yml
|
71
|
-
- spec/
|
72
|
+
- spec/rails_config_spec.rb
|
72
73
|
- spec/spec_helper.rb
|
73
74
|
has_rdoc: true
|
74
75
|
homepage: http://github.com/railsjedi/rails_config
|
@@ -105,5 +106,5 @@ signing_key:
|
|
105
106
|
specification_version: 3
|
106
107
|
summary: provides an Settings for rails3 that reads config/settings.yml
|
107
108
|
test_files:
|
108
|
-
- spec/
|
109
|
+
- spec/rails_config_spec.rb
|
109
110
|
- spec/spec_helper.rb
|
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
require 'yaml'
|
3
|
-
require 'erb'
|
4
|
-
|
5
|
-
module RailsConfig
|
6
|
-
module SettingBuilder
|
7
|
-
@@load_paths = []
|
8
|
-
|
9
|
-
# Create a config object (OpenStruct) from a yaml file. If a second yaml file is given, then the sections of that file will overwrite the sections
|
10
|
-
# if the first file if they exist in the first file.
|
11
|
-
def self.load_files(*files)
|
12
|
-
config = OpenStruct.new
|
13
|
-
|
14
|
-
@@load_paths = [files].flatten.compact.uniq
|
15
|
-
# add singleton method to our Settings that reloads its settings from the load_paths
|
16
|
-
def config.reload!
|
17
|
-
|
18
|
-
conf = {}
|
19
|
-
SettingBuilder.load_paths.to_a.each do |path|
|
20
|
-
file_conf = YAML.load(ERB.new(IO.read(path.to_s)).result) if path and File.exists?(path.to_s)
|
21
|
-
next unless file_conf
|
22
|
-
|
23
|
-
if conf.size > 0
|
24
|
-
DeepMerge.deep_merge!(file_conf, conf, :preserve_unmergeables => false)
|
25
|
-
else
|
26
|
-
conf = file_conf
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# load all the new values into the openstruct
|
31
|
-
marshal_load(RailsConfig::SettingBuilder.convert(conf).marshal_dump)
|
32
|
-
|
33
|
-
return self
|
34
|
-
end
|
35
|
-
|
36
|
-
config.reload!
|
37
|
-
return config
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.load_paths
|
41
|
-
@@load_paths
|
42
|
-
end
|
43
|
-
|
44
|
-
# Recursively converts Hashes to OpenStructs (including Hashes inside Arrays)
|
45
|
-
def self.convert(h) #:nodoc:
|
46
|
-
s = OpenStruct.new
|
47
|
-
h.each do |k, v|
|
48
|
-
s.new_ostruct_member(k)
|
49
|
-
if v.is_a?(Hash)
|
50
|
-
s.send( (k+'=').to_sym, convert(v))
|
51
|
-
elsif v.is_a?(Array)
|
52
|
-
converted_array = v.collect { |e| e.instance_of?(Hash) ? convert(e) : e }
|
53
|
-
s.send("#{k}=".to_sym, converted_array)
|
54
|
-
else
|
55
|
-
s.send("#{k}=".to_sym, v)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
s
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,109 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module RailsConfig
|
4
|
-
describe SettingBuilder do
|
5
|
-
|
6
|
-
it "should load a basic config file" do
|
7
|
-
config = SettingBuilder.load_files(setting_path("settings.yml"))
|
8
|
-
config.size.should == 1
|
9
|
-
config.server.should == "google.com"
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should load 2 basic config files" do
|
13
|
-
config = SettingBuilder.load_files(setting_path("settings.yml"), setting_path("settings2.yml"))
|
14
|
-
config.size.should == 1
|
15
|
-
config.server.should == "google.com"
|
16
|
-
config.another.should == "something"
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should load empty config for a missing file path" do
|
20
|
-
config = SettingBuilder.load_files(setting_path("some_file_that_doesnt_exist.yml"))
|
21
|
-
config.should == OpenStruct.new
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should load an empty config for multiple missing file paths" do
|
25
|
-
files = [setting_path("doesnt_exist1.yml"), setting_path("doesnt_exist2.yml")]
|
26
|
-
config = SettingBuilder.load_files(files)
|
27
|
-
config.should == OpenStruct.new
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should load empty config for an empty setting file" do
|
31
|
-
config = SettingBuilder.load_files(setting_path("empty1.yml"))
|
32
|
-
config.should == OpenStruct.new
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should load an empty config for multiple missing file paths" do
|
36
|
-
files = [setting_path("empty1.yml"), setting_path("empty2.yml")]
|
37
|
-
config = SettingBuilder.load_files(files)
|
38
|
-
config.should == OpenStruct.new
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should allow overrides" do
|
42
|
-
files = [setting_path("settings.yml"), setting_path("development.yml")]
|
43
|
-
config = SettingBuilder.load_files(files)
|
44
|
-
config.server.should == "google.com"
|
45
|
-
config.size.should == 2
|
46
|
-
end
|
47
|
-
|
48
|
-
context "Nested Settings" do
|
49
|
-
let(:config) do
|
50
|
-
SettingBuilder.load_files(setting_path("development.yml"))
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should allow nested sections" do
|
54
|
-
config.section.size.should == 3
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should allow configuration collections (arrays)" do
|
58
|
-
config.section.servers[0].name.should == "yahoo.com"
|
59
|
-
config.section.servers[1].name.should == "amazon.com"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context "Settings with ERB tags" do
|
64
|
-
let(:config) do
|
65
|
-
SettingBuilder.load_files(setting_path("with_erb.yml"))
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should evaluate ERB tags" do
|
69
|
-
config.computed.should == 6
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should evaluated nested ERB tags" do
|
73
|
-
config.section.computed1.should == 1
|
74
|
-
config.section.computed2.should == 2
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context "Deep Merging" do
|
79
|
-
let(:config) do
|
80
|
-
files = [setting_path("deep_merge/config1.yml"), setting_path("deep_merge/config2.yml")]
|
81
|
-
SettingBuilder.load_files(files)
|
82
|
-
end
|
83
|
-
|
84
|
-
it "should merge hashes from multiple configs" do
|
85
|
-
config.inner.marshal_dump.keys.size.should == 3
|
86
|
-
config.inner2.inner2_inner.marshal_dump.keys.size.should == 3
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should merge arrays from multiple configs" do
|
90
|
-
config.arraylist1.size.should == 6
|
91
|
-
config.arraylist2.inner.size.should == 6
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context "Boolean Overrides" do
|
96
|
-
let(:config) do
|
97
|
-
files = [setting_path("bool_override/config1.yml"), setting_path("bool_override/config2.yml")]
|
98
|
-
SettingBuilder.load_files(files)
|
99
|
-
end
|
100
|
-
|
101
|
-
it "should allow overriding of bool settings" do
|
102
|
-
config.override_bool.should == false
|
103
|
-
config.override_bool_opposite.should == true
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
|
108
|
-
end
|
109
|
-
end
|