constantinople 0.0.3
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/.gitignore +5 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/Guardfile +14 -0
- data/README.md +66 -0
- data/Rakefile +24 -0
- data/constantinople.gemspec +28 -0
- data/lib/constantinople.rb +67 -0
- data/lib/constantinople/deep_merge_map.rb +13 -0
- data/lib/constantinople/version.rb +3 -0
- data/spec/config/spec.yml +9 -0
- data/spec/config/spec.yml.default +3 -0
- data/spec/config/spec.yml.override +1 -0
- data/spec/lib/constantinople_spec.rb +18 -0
- data/spec/spec_helper.rb +7 -0
- metadata +206 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use ruby-1.8.7@constantinople
|
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'bundler' do
|
5
|
+
watch('Gemfile')
|
6
|
+
watch(/^.+\.gemspec/)
|
7
|
+
end
|
8
|
+
|
9
|
+
guard 'rspec', :cli => '-c --format documentation -r ./spec/spec_helper.rb',
|
10
|
+
:version => 2 do
|
11
|
+
watch(%r{^spec/.+_spec\.rb})
|
12
|
+
watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
13
|
+
watch('spec/spec_helper.rb') { "spec" }
|
14
|
+
end
|
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
Constantinople
|
2
|
+
==============
|
3
|
+
|
4
|
+
Usage
|
5
|
+
=====
|
6
|
+
Place all your configuration parameters in YAML files within a config/
|
7
|
+
directory under the top level of your project. For example, you might have a
|
8
|
+
config/database.yml file.
|
9
|
+
|
10
|
+
In an initializer at the top level of your project,
|
11
|
+
or within your config/ directory, do this:
|
12
|
+
|
13
|
+
require 'constantinople'
|
14
|
+
|
15
|
+
You may then use CONSTANTINOPLE from anywhere in your app:
|
16
|
+
|
17
|
+
CONSTANTINOPLE.database.username
|
18
|
+
|
19
|
+
|
20
|
+
Defaults and Overrides
|
21
|
+
======================
|
22
|
+
You can create default and over-ride versions of config files. Constantinople
|
23
|
+
will look for and load config files in the following order:
|
24
|
+
|
25
|
+
config/*.yml.default
|
26
|
+
config/*.yml
|
27
|
+
config/*.yml.override
|
28
|
+
|
29
|
+
The results are merged together. We recommended you gitignore config/*.yml.
|
30
|
+
|
31
|
+
Environments
|
32
|
+
============
|
33
|
+
If there is a non-empty ENV['RAILS_ENV'], ENV['RACK_ENV'] or ENV['APP_ENV'] the
|
34
|
+
first such environment will be used as a key whose values will be merged into
|
35
|
+
the level above. So for example, if your database.yml file has
|
36
|
+
|
37
|
+
username: root
|
38
|
+
password:
|
39
|
+
production:
|
40
|
+
password: d87gfds09ds8a
|
41
|
+
|
42
|
+
Then in your development environment:
|
43
|
+
|
44
|
+
CONSTANTINOPLE.database.username # root
|
45
|
+
CONSTANTINOPLE.database.password # nil
|
46
|
+
|
47
|
+
And in your production environment:
|
48
|
+
|
49
|
+
CONSTANTINOPLE.database.username # root
|
50
|
+
CONSTANTINOPLE.database.password # d87gfds09ds8a
|
51
|
+
|
52
|
+
|
53
|
+
Working on the Gem
|
54
|
+
==================
|
55
|
+
Install rvm, including ruby 1.9.2
|
56
|
+
Clone the git repo, then...
|
57
|
+
|
58
|
+
cd constantinople
|
59
|
+
gem install bundler
|
60
|
+
bundle install
|
61
|
+
rake coverage
|
62
|
+
|
63
|
+
|
64
|
+
Forking
|
65
|
+
=======
|
66
|
+
Yeah, fine. But please rename to Istanbul.
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
desc "Run all specs"
|
5
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
6
|
+
t.rspec_opts = [
|
7
|
+
'-c',
|
8
|
+
'--format documentation',
|
9
|
+
'-r ./spec/spec_helper.rb'
|
10
|
+
]
|
11
|
+
t.pattern = 'spec/**/*_spec.rb'
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "open coverage report"
|
15
|
+
task :coverage do
|
16
|
+
system 'rake spec'
|
17
|
+
system 'open coverage/index.html'
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Open development console"
|
21
|
+
task :console do
|
22
|
+
puts "Loading development console..."
|
23
|
+
system "irb -I #{File.join('.', 'lib')} -r #{File.join('.', 'lib', 'constantinople')}"
|
24
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "constantinople/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "constantinople"
|
7
|
+
s.version = Constantinople::VERSION
|
8
|
+
s.authors = ["Chris Johnson"]
|
9
|
+
s.email = ["chris@kindkid.com"]
|
10
|
+
s.homepage = "https://github.com/kindkid/constantinople"
|
11
|
+
s.summary = "Load all your config/*.yml files"
|
12
|
+
s.description = "Supports defaults, over-rides, and environments"
|
13
|
+
|
14
|
+
s.rubyforge_project = "constantinople"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.add_dependency "map", "~> 4.2"
|
21
|
+
s.add_dependency "deep_merge", "0.2.0"
|
22
|
+
s.add_development_dependency "rspec", "~> 2.6"
|
23
|
+
s.add_development_dependency "simplecov", "~> 0.4"
|
24
|
+
s.add_development_dependency("rb-fsevent", "~> 0.4") if RUBY_PLATFORM =~ /darwin/i
|
25
|
+
s.add_development_dependency "guard", "~> 0.5"
|
26
|
+
s.add_development_dependency "guard-bundler", "~> 0.1"
|
27
|
+
s.add_development_dependency "guard-rspec", "~> 0.4"
|
28
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "map"
|
2
|
+
require "yaml"
|
3
|
+
require "deep_merge/core"
|
4
|
+
require "constantinople/deep_merge_map"
|
5
|
+
require "constantinople/version"
|
6
|
+
|
7
|
+
module Constantinople
|
8
|
+
|
9
|
+
def self.reload!
|
10
|
+
result = Map.new
|
11
|
+
caller_config_directories do |dir|
|
12
|
+
result.deeper_merge!(load_from_directory(dir))
|
13
|
+
end
|
14
|
+
env = environment
|
15
|
+
result.each do |key, value|
|
16
|
+
value.deeper_merge!(value[env]) if value.include?(env)
|
17
|
+
end
|
18
|
+
result # I'm the map, I'm the map, I'm the map, I'm the map...
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def self.load_from_directory(dir)
|
24
|
+
result = Map.new
|
25
|
+
['.yml.default', '.yml', '.yml.override'].each do |ext|
|
26
|
+
Dir.glob(File.join(dir,"*#{ext}")) do |path|
|
27
|
+
filename = File.basename(path,ext)
|
28
|
+
result.deeper_merge!(filename => YAML.load_file(path))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
result
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.environment
|
35
|
+
['RAILS_ENV', 'RACK_ENV', 'APP_ENV'].each do |env|
|
36
|
+
environment = ENV[env]
|
37
|
+
return environment unless environment.nil? || environment.empty?
|
38
|
+
end
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.caller_config_directories
|
43
|
+
possible_caller_config_directories do |dir|
|
44
|
+
yield dir if File.directory?(dir)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.possible_caller_config_directories
|
49
|
+
caller_directories do |d|
|
50
|
+
yield File.join(d,'config')
|
51
|
+
yield File.join(File.dirname(d),'config')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.caller_directories
|
56
|
+
results = []
|
57
|
+
regex = /^(.*)\:\d+\:in .*$/
|
58
|
+
caller.each do |trace|
|
59
|
+
dir = File.dirname(trace)
|
60
|
+
yield dir unless results.include?(dir) || !File.directory?(dir)
|
61
|
+
results << dir
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
CONSTANTINOPLE = Constantinople.reload!
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Constantinople
|
2
|
+
module DeepMergeMap
|
3
|
+
# deep_merge! will merge and overwrite any unmergeables in destination hash
|
4
|
+
def deeper_merge!(source, options = {})
|
5
|
+
default_opts = {:preserve_unmergeables => false}
|
6
|
+
::DeepMerge::deep_merge!(source, self, default_opts.merge(options))
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Map
|
12
|
+
include ::Constantinople::DeepMergeMap
|
13
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
c: override
|
@@ -0,0 +1,18 @@
|
|
1
|
+
describe Constantinople do
|
2
|
+
|
3
|
+
before(:all) do
|
4
|
+
CONSTANTINOPLE.spec.a.should == 'default' # just showing we do auto-load
|
5
|
+
|
6
|
+
ENV['RAILS_ENV'] ||= 'test'
|
7
|
+
CONFIG = Constantinople.reload!
|
8
|
+
end
|
9
|
+
|
10
|
+
it "just works" do
|
11
|
+
CONFIG.should_not be_nil
|
12
|
+
CONFIG.spec.should_not be_nil
|
13
|
+
CONFIG.spec.a.should == 'default'
|
14
|
+
CONFIG.spec.b.should == 'standard'
|
15
|
+
CONFIG.spec.c.should == 'override'
|
16
|
+
CONFIG.spec.animal.should == 'turtle' # from test environment
|
17
|
+
end
|
18
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: constantinople
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Chris Johnson
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-07-29 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: map
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 31
|
30
|
+
segments:
|
31
|
+
- 4
|
32
|
+
- 2
|
33
|
+
version: "4.2"
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: deep_merge
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - "="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 23
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 2
|
48
|
+
- 0
|
49
|
+
version: 0.2.0
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: rspec
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 15
|
61
|
+
segments:
|
62
|
+
- 2
|
63
|
+
- 6
|
64
|
+
version: "2.6"
|
65
|
+
type: :development
|
66
|
+
version_requirements: *id003
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: simplecov
|
69
|
+
prerelease: false
|
70
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
hash: 3
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
- 4
|
79
|
+
version: "0.4"
|
80
|
+
type: :development
|
81
|
+
version_requirements: *id004
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: rb-fsevent
|
84
|
+
prerelease: false
|
85
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ~>
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
hash: 3
|
91
|
+
segments:
|
92
|
+
- 0
|
93
|
+
- 4
|
94
|
+
version: "0.4"
|
95
|
+
type: :development
|
96
|
+
version_requirements: *id005
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: guard
|
99
|
+
prerelease: false
|
100
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ~>
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 1
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
- 5
|
109
|
+
version: "0.5"
|
110
|
+
type: :development
|
111
|
+
version_requirements: *id006
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: guard-bundler
|
114
|
+
prerelease: false
|
115
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ~>
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
hash: 9
|
121
|
+
segments:
|
122
|
+
- 0
|
123
|
+
- 1
|
124
|
+
version: "0.1"
|
125
|
+
type: :development
|
126
|
+
version_requirements: *id007
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: guard-rspec
|
129
|
+
prerelease: false
|
130
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ~>
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
hash: 3
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
- 4
|
139
|
+
version: "0.4"
|
140
|
+
type: :development
|
141
|
+
version_requirements: *id008
|
142
|
+
description: Supports defaults, over-rides, and environments
|
143
|
+
email:
|
144
|
+
- chris@kindkid.com
|
145
|
+
executables: []
|
146
|
+
|
147
|
+
extensions: []
|
148
|
+
|
149
|
+
extra_rdoc_files: []
|
150
|
+
|
151
|
+
files:
|
152
|
+
- .gitignore
|
153
|
+
- .rvmrc
|
154
|
+
- Gemfile
|
155
|
+
- Guardfile
|
156
|
+
- README.md
|
157
|
+
- Rakefile
|
158
|
+
- constantinople.gemspec
|
159
|
+
- lib/constantinople.rb
|
160
|
+
- lib/constantinople/deep_merge_map.rb
|
161
|
+
- lib/constantinople/version.rb
|
162
|
+
- spec/config/spec.yml
|
163
|
+
- spec/config/spec.yml.default
|
164
|
+
- spec/config/spec.yml.override
|
165
|
+
- spec/lib/constantinople_spec.rb
|
166
|
+
- spec/spec_helper.rb
|
167
|
+
has_rdoc: true
|
168
|
+
homepage: https://github.com/kindkid/constantinople
|
169
|
+
licenses: []
|
170
|
+
|
171
|
+
post_install_message:
|
172
|
+
rdoc_options: []
|
173
|
+
|
174
|
+
require_paths:
|
175
|
+
- lib
|
176
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
178
|
+
requirements:
|
179
|
+
- - ">="
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
hash: 3
|
182
|
+
segments:
|
183
|
+
- 0
|
184
|
+
version: "0"
|
185
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
|
+
none: false
|
187
|
+
requirements:
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
hash: 3
|
191
|
+
segments:
|
192
|
+
- 0
|
193
|
+
version: "0"
|
194
|
+
requirements: []
|
195
|
+
|
196
|
+
rubyforge_project: constantinople
|
197
|
+
rubygems_version: 1.6.2
|
198
|
+
signing_key:
|
199
|
+
specification_version: 3
|
200
|
+
summary: Load all your config/*.yml files
|
201
|
+
test_files:
|
202
|
+
- spec/config/spec.yml
|
203
|
+
- spec/config/spec.yml.default
|
204
|
+
- spec/config/spec.yml.override
|
205
|
+
- spec/lib/constantinople_spec.rb
|
206
|
+
- spec/spec_helper.rb
|