configatron_plus 0.2.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.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +32 -0
- data/LICENSE.txt +20 -0
- data/README.textile +84 -0
- data/Rakefile +42 -0
- data/VERSION +1 -0
- data/config/config.rb +0 -0
- data/configatron_plus.gemspec +72 -0
- data/examples/config.rb +5 -0
- data/examples/first.rb +6 -0
- data/examples/second.rb +6 -0
- data/examples/use_two_files +10 -0
- data/examples/with_defaults +10 -0
- data/examples/with_env +4 -0
- data/lib/configatron_plus.rb +143 -0
- data/lib/configatron_plus/errors.rb +4 -0
- data/spec/config_files/testing_config.rb +6 -0
- data/spec/configatron_plus_spec.rb +212 -0
- data/spec/spec_helper.rb +12 -0
- metadata +127 -0
data/.document
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
configatron (2.8.2)
|
5
|
+
yamler (>= 0.1.0)
|
6
|
+
diff-lcs (1.1.2)
|
7
|
+
git (1.2.5)
|
8
|
+
jeweler (1.6.2)
|
9
|
+
bundler (~> 1.0)
|
10
|
+
git (>= 1.2.5)
|
11
|
+
rake
|
12
|
+
rake (0.8.7)
|
13
|
+
rspec (2.3.0)
|
14
|
+
rspec-core (~> 2.3.0)
|
15
|
+
rspec-expectations (~> 2.3.0)
|
16
|
+
rspec-mocks (~> 2.3.0)
|
17
|
+
rspec-core (2.3.1)
|
18
|
+
rspec-expectations (2.3.0)
|
19
|
+
diff-lcs (~> 1.1.2)
|
20
|
+
rspec-mocks (2.3.0)
|
21
|
+
yamler (0.1.0)
|
22
|
+
yard (0.6.8)
|
23
|
+
|
24
|
+
PLATFORMS
|
25
|
+
ruby
|
26
|
+
|
27
|
+
DEPENDENCIES
|
28
|
+
bundler (~> 1.0.0)
|
29
|
+
configatron
|
30
|
+
jeweler (~> 1.6.2)
|
31
|
+
rspec (~> 2.3.0)
|
32
|
+
yard (~> 0.6.0)
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Scott M Parrish
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.textile
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
h1. ConfigatronPlus
|
2
|
+
|
3
|
+
An addition to Configatron to make it easy to read configuration from default settings and multiple locations including environmental variables.
|
4
|
+
|
5
|
+
h2. Configatron
|
6
|
+
|
7
|
+
Find out more at "Configatron":https://github.com/markbates/configatron
|
8
|
+
|
9
|
+
h2. Installation
|
10
|
+
|
11
|
+
Installation of ConfigatronPlus is easy, as it is just a RubyGem:
|
12
|
+
|
13
|
+
TODO: finish wrapping things up as gem
|
14
|
+
|
15
|
+
<pre><code>
|
16
|
+
$ sudo gem install configatron-plus
|
17
|
+
</code></pre>
|
18
|
+
|
19
|
+
Once installed you just need to require it:
|
20
|
+
|
21
|
+
<pre><code>
|
22
|
+
require 'configatron-plus'
|
23
|
+
</code></pre>
|
24
|
+
|
25
|
+
h2. Usage
|
26
|
+
|
27
|
+
ConfigatronPlus stores all of its own configuration inside configatron. Use the following to see the current setup:
|
28
|
+
|
29
|
+
<pre><code>
|
30
|
+
puts configatron.to_hash #dump it as a straight ruby code.
|
31
|
+
puts configatron.inspect #show the code you'd need to recreate the current config
|
32
|
+
</code></pre>
|
33
|
+
|
34
|
+
h2. Config
|
35
|
+
|
36
|
+
There are 5 parameters that can be configured, all of which have defaults. All 5 are located at
|
37
|
+
<pre><code>
|
38
|
+
configatron.configatron_plus
|
39
|
+
</code></pre>
|
40
|
+
|
41
|
+
|_. Parameter |_. Use |_. Default |
|
42
|
+
| env_prefix | change this to change the prefix used in to look for values in the ENV | configatron_ |
|
43
|
+
| fail_when_missing | change this to true to raise an error when a file in #sources is not found on the filesystem | false |
|
44
|
+
| rc_name | the default name of the file to look for | config.rb |
|
45
|
+
| source_files | the actual file name used for a given symbol | <pre>:current => #{configatron.configatron_plus.rc_name}</pre> |
|
46
|
+
| sources | The list of files and symbols to load | <pre>[:current, :env]</pre> |
|
47
|
+
|
48
|
+
h3. default
|
49
|
+
|
50
|
+
The default config looks like this when #inspect
|
51
|
+
|
52
|
+
<pre><code>
|
53
|
+
configatron.configatron_plus.env_prefix = "configatron_"
|
54
|
+
configatron.configatron_plus.fail_when_missing = false
|
55
|
+
configatron.configatron_plus.rc_name = "config.rb"
|
56
|
+
configatron.configatron_plus.source_files = {:current=>"config.rb"}
|
57
|
+
configatron.configatron_plus.sources = [:current, :env]
|
58
|
+
</code></pre>
|
59
|
+
|
60
|
+
h2. Examples
|
61
|
+
|
62
|
+
h3. Default
|
63
|
+
|
64
|
+
By default, ConfigurationPlus looks for a config.rb file in the current directory, and reads any Environmental Variables with a name that starts with configatron_
|
65
|
+
|
66
|
+
<pre><code>
|
67
|
+
ConfigatronPlus.fetch_sources #Checks the current dir for config.rb and reads from environmental variables
|
68
|
+
</code></pre>
|
69
|
+
|
70
|
+
h3. Different default filename and prefix
|
71
|
+
|
72
|
+
To look for an alternate filename, set the rc_name parameter
|
73
|
+
|
74
|
+
<pre><code>
|
75
|
+
configatron.configatron_plus.rc_name = "my_app.rb"
|
76
|
+
configatron.configatron_plus.env_prefix = "my_app_
|
77
|
+
ConfigatronPlus.fetch_sources #Checks the current dir for my_app.rb and reads from environmental variables starting with my_app_
|
78
|
+
</code></pre>
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
h2. Contact
|
83
|
+
|
84
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "configatron_plus"
|
18
|
+
gem.homepage = "http://github.com/anithri/configatron-plus"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{A helper for the configatron library}
|
21
|
+
gem.description = %Q{Aids in using the configatron library by making it easy to read in multiple configuration files and environmental variables.}
|
22
|
+
gem.email = "anithri@gmail.com"
|
23
|
+
gem.authors = ["Scott M Parrish"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rspec/core'
|
29
|
+
require 'rspec/core/rake_task'
|
30
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
31
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
32
|
+
end
|
33
|
+
|
34
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
35
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
36
|
+
spec.rcov = true
|
37
|
+
end
|
38
|
+
|
39
|
+
task :default => :spec
|
40
|
+
|
41
|
+
require 'yard'
|
42
|
+
YARD::Rake::YardocTask.new
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.0
|
data/config/config.rb
ADDED
File without changes
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "configatron_plus"
|
8
|
+
s.version = "0.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Scott M Parrish"]
|
12
|
+
s.date = "2011-09-08"
|
13
|
+
s.description = "Aids in using the configatron library by making it easy to read in multiple configuration files and environmental variables."
|
14
|
+
s.email = "anithri@gmail.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.textile"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".rspec",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.textile",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"config/config.rb",
|
29
|
+
"configatron_plus.gemspec",
|
30
|
+
"examples/config.rb",
|
31
|
+
"examples/first.rb",
|
32
|
+
"examples/second.rb",
|
33
|
+
"examples/use_two_files",
|
34
|
+
"examples/with_defaults",
|
35
|
+
"examples/with_env",
|
36
|
+
"lib/configatron_plus.rb",
|
37
|
+
"lib/configatron_plus/errors.rb",
|
38
|
+
"spec/config_files/testing_config.rb",
|
39
|
+
"spec/configatron_plus_spec.rb",
|
40
|
+
"spec/spec_helper.rb"
|
41
|
+
]
|
42
|
+
s.homepage = "http://github.com/anithri/configatron-plus"
|
43
|
+
s.licenses = ["MIT"]
|
44
|
+
s.require_paths = ["lib"]
|
45
|
+
s.rubygems_version = "1.8.10"
|
46
|
+
s.summary = "A helper for the configatron library"
|
47
|
+
|
48
|
+
if s.respond_to? :specification_version then
|
49
|
+
s.specification_version = 3
|
50
|
+
|
51
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
52
|
+
s.add_runtime_dependency(%q<configatron>, [">= 0"])
|
53
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
54
|
+
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
|
55
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
56
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
|
57
|
+
else
|
58
|
+
s.add_dependency(%q<configatron>, [">= 0"])
|
59
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
60
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
61
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
62
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
|
63
|
+
end
|
64
|
+
else
|
65
|
+
s.add_dependency(%q<configatron>, [">= 0"])
|
66
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
67
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
68
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
69
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
data/examples/config.rb
ADDED
data/examples/first.rb
ADDED
data/examples/second.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
|
+
$LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
|
4
|
+
require 'configatron_plus'
|
5
|
+
|
6
|
+
ConfigatronPlus.sources =['first.rb','second.rb']
|
7
|
+
ConfigatronPlus.fetch_sources
|
8
|
+
|
9
|
+
puts "first.rb called first, second.rb called second"
|
10
|
+
puts configatron.inspect
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
|
+
$LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
|
4
|
+
require 'configatron_plus'
|
5
|
+
|
6
|
+
puts "Default Configuration before #fetch_sources"
|
7
|
+
puts configatron.inspect
|
8
|
+
ConfigatronPlus.fetch_sources
|
9
|
+
puts "\nDefault Configuration after #fetch_sources"
|
10
|
+
puts configatron.inspect
|
data/examples/with_env
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'configatron'
|
2
|
+
require 'configatron_plus/errors'
|
3
|
+
require 'pathname'
|
4
|
+
module ConfigatronPlus
|
5
|
+
|
6
|
+
DEFAULT_SOURCES = [:current, :env]
|
7
|
+
|
8
|
+
def self.config
|
9
|
+
configatron.configatron_plus
|
10
|
+
end
|
11
|
+
|
12
|
+
configatron.configatron_plus do |c|
|
13
|
+
c.set_default(:sources, DEFAULT_SOURCES.dup)
|
14
|
+
c.set_default(:rc_name, "config.rb")
|
15
|
+
c.set_default(:env_prefix, "configatron_")
|
16
|
+
c.set_default(:source_files, {:current => configatron.configatron_plus.rc_name})
|
17
|
+
c.set_default(:fail_when_missing, false)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.fail_when_missing
|
21
|
+
configatron.configatron_plus.fail_when_missing
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.fail_when_missing=(val)
|
25
|
+
configatron.configatron_plus.fail_when_missing = val
|
26
|
+
end
|
27
|
+
|
28
|
+
# Set the sources to use for configatron
|
29
|
+
# @param new_val [Array<String,Symbol>] new array of sources.
|
30
|
+
def self.sources=(new_val)
|
31
|
+
@@errors = nil
|
32
|
+
raise ArgumentError.new "value must be an Array." unless new_val.is_a?(Array)
|
33
|
+
unless self.valid_list?(new_val)
|
34
|
+
raise ArgumentError.new "Array members must be a symbol, string, or Pathname: #{self.errors}"
|
35
|
+
end
|
36
|
+
self.config.sources = new_val
|
37
|
+
end
|
38
|
+
|
39
|
+
# Get the current list of sources
|
40
|
+
# @return [Array<String,Symbol>] of sources to look for configurations in
|
41
|
+
def self.sources
|
42
|
+
self.config.sources
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Array] of symbols.
|
46
|
+
|
47
|
+
def self.errors
|
48
|
+
@@errors ||= []
|
49
|
+
end
|
50
|
+
|
51
|
+
#set @@sources = DEFAULT_SOURCES
|
52
|
+
def self.reset_sources
|
53
|
+
self.sources = DEFAULT_SOURCES.dup
|
54
|
+
end
|
55
|
+
|
56
|
+
#check each element of the list to see if it's a correct symbol or can be used a a filename.
|
57
|
+
# @return [Boolean]
|
58
|
+
def self.valid_list?(val)
|
59
|
+
val.each do |i|
|
60
|
+
errors << "Invalid entry: #{i}" unless self.can_use_as_filename?(i)
|
61
|
+
if i.is_a?(Symbol) && ! self.is_symbol_defined?(i)
|
62
|
+
errors << "Invalid symbol: #{i.to_s}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
errors.empty?
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.is_symbol_defined?(sym)
|
69
|
+
return true if sym == :env
|
70
|
+
self.config.source_files.keys.include?(sym)
|
71
|
+
end
|
72
|
+
|
73
|
+
# @param opts [Hash] the options for getting configuration
|
74
|
+
# @option opts [Boolean] :fail_on_missing (false) Raise an exception if a file in the @sources list is not present
|
75
|
+
def self.fetch_sources
|
76
|
+
self.sources.each do |s|
|
77
|
+
if s.is_a?(Symbol)
|
78
|
+
get_from_special(s)
|
79
|
+
else
|
80
|
+
get_from_file(s.is_a?(Pathname) ? s : Pathname(s))
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Checks to see if we can use this as a filename
|
86
|
+
# @param val [Object] Object to check
|
87
|
+
# @return [Boolean]]
|
88
|
+
def self.can_use_as_filename?(val)
|
89
|
+
return true if val.is_a?(String)
|
90
|
+
return true if val.is_a?(Pathname)
|
91
|
+
return true if val.is_a?(Symbol)
|
92
|
+
|
93
|
+
#if no other
|
94
|
+
false
|
95
|
+
end
|
96
|
+
|
97
|
+
# looks upo the file for a given symbol and calls get_from_file with it
|
98
|
+
# @param s [Symbol] use to look up and load a file
|
99
|
+
def self.get_from_special(s)
|
100
|
+
raise ArgumentError unless s.is_a?(Symbol)
|
101
|
+
return get_from_env if s == :env
|
102
|
+
file = config.source_files.fetch(s,nil)
|
103
|
+
raise ConfigatronPlus::ConfigError.new("Setting does not exist for: #{s}") if file.nil?
|
104
|
+
file = Pathname(file)
|
105
|
+
self.get_from_file(file)
|
106
|
+
end
|
107
|
+
|
108
|
+
# checks to see if file exists and loads it
|
109
|
+
# @param file [Pathname] file to attempt to load
|
110
|
+
def self.get_from_file(file)
|
111
|
+
raise ArgumentError.new("Not Pathname: #{file}") unless file.is_a?(Pathname)
|
112
|
+
if file.expand_path.file?
|
113
|
+
c = File.read(file.expand_path)
|
114
|
+
eval(c)
|
115
|
+
elsif self.fail_when_missing
|
116
|
+
raise ConfigatronPlus::ConfigError.new("Config file does not exist: #{file.to_s}")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
#scan ENV for any keys that start with alfred_
|
121
|
+
#check to see that they are valid names
|
122
|
+
#add them to configatron
|
123
|
+
def self.get_from_env
|
124
|
+
ENV.keys.find_all {|e| self.use_this_env?(e)}.each do |key|
|
125
|
+
setting = key[config.env_prefix.length .. -1]
|
126
|
+
setting.split('_').each do |e|
|
127
|
+
raise ConfigatronPlus::ConfigError.new("Env variable '#{key}' contains invalid characters") unless self.is_valid_key_name?(e)
|
128
|
+
end
|
129
|
+
eval("configatron." + setting.gsub('_','.') + " = \"#{ENV[key]}\"")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.use_this_env?(env)
|
134
|
+
env.length > config.env_prefix.length && env.start_with?(config.env_prefix)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Checks a string to make sure it is a valid identifier so we can eval it
|
138
|
+
# @param e [String] string to check for validity
|
139
|
+
# @return [Boolean] is valid?
|
140
|
+
def self.is_valid_key_name?(e)
|
141
|
+
/^[a-z][a-z0-9]*$/.match(e.downcase)
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
require "rspec"
|
4
|
+
|
5
|
+
describe "ConfigatronPlus" do
|
6
|
+
after :each do
|
7
|
+
ConfigatronPlus.reset_sources
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#can_use_as_filename?(val)" do
|
11
|
+
it "should be true for symbols, strings and Pathnames" do
|
12
|
+
ConfigatronPlus.can_use_as_filename?(:testme).should be_true
|
13
|
+
ConfigatronPlus.can_use_as_filename?("Hi").should be_true
|
14
|
+
ConfigatronPlus.can_use_as_filename?(Pathname("Hi")).should be_true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be false for anything else" do
|
18
|
+
ConfigatronPlus.can_use_as_filename?(123).should be_false
|
19
|
+
ConfigatronPlus.can_use_as_filename?({:error => 'yes'}).should be_false
|
20
|
+
ConfigatronPlus.can_use_as_filename?([1,2,3]).should be_false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#valid_list?" do
|
25
|
+
it "should be true and errors should be empty for valid @sources" do
|
26
|
+
ConfigatronPlus.valid_list?(ConfigatronPlus::DEFAULT_SOURCES).should be_true
|
27
|
+
ConfigatronPlus.errors.should == []
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should be false and have errors for invalid symbols" do
|
31
|
+
ConfigatronPlus.valid_list?([:error]).should be_false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#sources and #sources=" do
|
36
|
+
it "should initialize with defaults" do
|
37
|
+
ConfigatronPlus.sources.should == ConfigatronPlus::DEFAULT_SOURCES
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should accept a valid sources array" do
|
41
|
+
expect {
|
42
|
+
ConfigatronPlus.sources = [:current]
|
43
|
+
}.should_not raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should not accept an invalid array" do
|
47
|
+
expect {ConfigatronPlus.sources = "error"}.should raise_error(ArgumentError)
|
48
|
+
expect {ConfigatronPlus.sources = 123 }.should raise_error(ArgumentError)
|
49
|
+
expect {ConfigatronPlus.sources = Pathname("/")}.should raise_error(ArgumentError)
|
50
|
+
expect {ConfigatronPlus.sources = {:error => "yes indeed"}}.should raise_error(ArgumentError)
|
51
|
+
expect {ConfigatronPlus.sources = []}.should_not raise_error(ArgumentError)
|
52
|
+
expect {ConfigatronPlus.sources = ["error"]}.should_not raise_error(ArgumentError)
|
53
|
+
expect {ConfigatronPlus.sources = [:error]}.should raise_error(ArgumentError)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#fetch_sources" do
|
58
|
+
before :all do
|
59
|
+
ConfigatronPlus.stub(:get_from_special)
|
60
|
+
ConfigatronPlus.stub(:get_from_file)
|
61
|
+
end
|
62
|
+
|
63
|
+
context "default values and all symbols" do
|
64
|
+
it "should correctly call #get_from_special and #get_from_file" do
|
65
|
+
ConfigatronPlus.should_receive(:get_from_special).exactly(2).times
|
66
|
+
ConfigatronPlus.fetch_sources
|
67
|
+
end
|
68
|
+
end
|
69
|
+
context "all strings" do
|
70
|
+
it "should correctly call #get_from_special and #get_from_file" do
|
71
|
+
ConfigatronPlus.sources = %w(a b c d e)
|
72
|
+
ConfigatronPlus.should_receive(:get_from_file).exactly(5).times
|
73
|
+
ConfigatronPlus.fetch_sources
|
74
|
+
end
|
75
|
+
end
|
76
|
+
context "mixed strings and symbols" do
|
77
|
+
it "should correctly call #get_from_special and #get_from_file" do
|
78
|
+
ConfigatronPlus.sources = ['a', :current, 'b', 'c', 'd', 'e', :env]
|
79
|
+
ConfigatronPlus.should_receive(:get_from_special).exactly(2).times
|
80
|
+
ConfigatronPlus.should_receive(:get_from_file).exactly(5).times
|
81
|
+
ConfigatronPlus.fetch_sources
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#is_valid_key_name?(e)" do
|
87
|
+
it "should be true for good values" do
|
88
|
+
ConfigatronPlus.is_valid_key_name?("a").should be_true
|
89
|
+
ConfigatronPlus.is_valid_key_name?("abc").should be_true
|
90
|
+
ConfigatronPlus.is_valid_key_name?("ABC").should be_true
|
91
|
+
ConfigatronPlus.is_valid_key_name?("abC").should be_true
|
92
|
+
ConfigatronPlus.is_valid_key_name?("Cacd").should be_true
|
93
|
+
ConfigatronPlus.is_valid_key_name?("a124").should be_true
|
94
|
+
end
|
95
|
+
it "should be false for bad values" do
|
96
|
+
ConfigatronPlus.is_valid_key_name?("1").should be_false
|
97
|
+
ConfigatronPlus.is_valid_key_name?("a.1").should be_false
|
98
|
+
ConfigatronPlus.is_valid_key_name?("-e").should be_false
|
99
|
+
ConfigatronPlus.is_valid_key_name?("po^").should be_false
|
100
|
+
ConfigatronPlus.is_valid_key_name?("this is").should be_false
|
101
|
+
ConfigatronPlus.is_valid_key_name?("this_is").should be_false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "#use_this_env?(env)" do
|
106
|
+
it "should be true when passed a valid name" do
|
107
|
+
ConfigatronPlus.use_this_env?('configatron_test').should be_true
|
108
|
+
ConfigatronPlus.use_this_env?('configatron_foo_bar').should be_true
|
109
|
+
ConfigatronPlus.use_this_env?('configatron_foo_bar_baz').should be_true
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should be false when passed an invalid name" do
|
113
|
+
ConfigatronPlus.use_this_env?('testing_me').should be_false
|
114
|
+
ConfigatronPlus.use_this_env?('t').should be_false
|
115
|
+
ConfigatronPlus.use_this_env?('configatron').should be_false
|
116
|
+
ConfigatronPlus.use_this_env?('configatron_').should be_false
|
117
|
+
ConfigatronPlus.use_this_env?('configatro_foo').should be_false
|
118
|
+
ConfigatronPlus.use_this_env?('configatron-bar-baz').should be_false
|
119
|
+
end
|
120
|
+
end
|
121
|
+
describe "#is_symbol_defined?(sym)" do
|
122
|
+
it "should be true when passed an existing symbol" do
|
123
|
+
ConfigatronPlus.is_symbol_defined?(:env).should be_true
|
124
|
+
ConfigatronPlus.is_symbol_defined?(:current).should be_true
|
125
|
+
ConfigatronPlus.config.source_files[:testing] = "test"
|
126
|
+
ConfigatronPlus.is_symbol_defined?(:testing).should be_true
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should be false when passed any other symbol or object" do
|
130
|
+
ConfigatronPlus.is_symbol_defined?(:foo).should be_false
|
131
|
+
ConfigatronPlus.is_symbol_defined?('foo').should be_false
|
132
|
+
ConfigatronPlus.is_symbol_defined?(123).should be_false
|
133
|
+
ConfigatronPlus.is_symbol_defined?([1,2,3]).should be_false
|
134
|
+
end
|
135
|
+
end
|
136
|
+
describe "#get_from_env" do
|
137
|
+
it "should set configatron settings from environment" do
|
138
|
+
ENV['configatron_test_one'] = "123"
|
139
|
+
ENV['configatron_test_two'] = "abc"
|
140
|
+
ENV['configatron_another'] = "foo,bar,baz"
|
141
|
+
|
142
|
+
ConfigatronPlus.get_from_env
|
143
|
+
configatron.test.one.should == "123"
|
144
|
+
configatron.test.two.should == "abc"
|
145
|
+
configatron.another.should == "foo,bar,baz"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe "#get_from_special(s)" do
|
150
|
+
before :each do
|
151
|
+
ConfigatronPlus.stub(:get_from_file)
|
152
|
+
end
|
153
|
+
it "should not raise an error for the default settings (less env)" do
|
154
|
+
[:current, :env].each do |sym|
|
155
|
+
expect {
|
156
|
+
ConfigatronPlus.get_from_special(sym)
|
157
|
+
}.should_not raise_error ConfigatronPlus::ConfigError
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should raise an error if setting does not exist for symbol" do
|
162
|
+
expect {
|
163
|
+
ConfigatronPlus.get_from_special(:bad)
|
164
|
+
}.should raise_error ConfigatronPlus::ConfigError
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should call get_from_file when called correctly" do
|
168
|
+
ConfigatronPlus.should_receive(:get_from_file).once
|
169
|
+
ConfigatronPlus.get_from_special(:current)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
describe "#get_from_file(file)" do
|
174
|
+
after :each do
|
175
|
+
ConfigatronPlus.reset_sources
|
176
|
+
ConfigatronPlus.fail_when_missing = false
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should raise an error if not called with a pathname" do
|
180
|
+
expect {
|
181
|
+
ConfigatronPlus.get_from_file("failure")
|
182
|
+
}.should raise_error ArgumentError
|
183
|
+
end
|
184
|
+
|
185
|
+
context "fail_when_missing is true" do
|
186
|
+
it "should raise an error when the file doesn't exist" do
|
187
|
+
ConfigatronPlus.fail_when_missing = true
|
188
|
+
expect {
|
189
|
+
ConfigatronPlus.get_from_file(Pathname.new("/some/long/foo/bar/baz/path"))
|
190
|
+
}.should raise_error ConfigatronPlus::ConfigError
|
191
|
+
end
|
192
|
+
end
|
193
|
+
context "fail_when_missing is false" do
|
194
|
+
it "should not raise an error when the file doesn't exist" do
|
195
|
+
ConfigatronPlus.fail_when_missing = false
|
196
|
+
expect {
|
197
|
+
ConfigatronPlus.get_from_file(Pathname.new("/some/long/foo/bar/baz/path"))
|
198
|
+
}.should_not raise_error ConfigatronPlus::ConfigError
|
199
|
+
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should read a file into configatron when file is present" do
|
204
|
+
tmp = Pathname('spec/config_files/testing_config.rb')
|
205
|
+
ConfigatronPlus.get_from_file(tmp)
|
206
|
+
configatron.file.test.one.should == 123
|
207
|
+
configatron.file.test.two.should == "abc"
|
208
|
+
configatron.file.another.should == 'xyz'
|
209
|
+
configatron.file.foo.bar.baz.should == 'woot'
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'rspec'
|
4
|
+
require 'configatron_plus'
|
5
|
+
require 'tmpdir'
|
6
|
+
# Requires supporting files with custom matchers and macros, etc,
|
7
|
+
# in ./support/ and its subdirectories.
|
8
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: configatron_plus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Scott M Parrish
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-09-08 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: configatron
|
16
|
+
requirement: &19998860 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *19998860
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &19998340 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.3.0
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *19998340
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: yard
|
38
|
+
requirement: &19997820 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.6.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *19997820
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: &19997320 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.0
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *19997320
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: jeweler
|
60
|
+
requirement: &19996800 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 1.6.2
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *19996800
|
69
|
+
description: Aids in using the configatron library by making it easy to read in multiple
|
70
|
+
configuration files and environmental variables.
|
71
|
+
email: anithri@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files:
|
75
|
+
- LICENSE.txt
|
76
|
+
- README.textile
|
77
|
+
files:
|
78
|
+
- .document
|
79
|
+
- .rspec
|
80
|
+
- Gemfile
|
81
|
+
- Gemfile.lock
|
82
|
+
- LICENSE.txt
|
83
|
+
- README.textile
|
84
|
+
- Rakefile
|
85
|
+
- VERSION
|
86
|
+
- config/config.rb
|
87
|
+
- configatron_plus.gemspec
|
88
|
+
- examples/config.rb
|
89
|
+
- examples/first.rb
|
90
|
+
- examples/second.rb
|
91
|
+
- examples/use_two_files
|
92
|
+
- examples/with_defaults
|
93
|
+
- examples/with_env
|
94
|
+
- lib/configatron_plus.rb
|
95
|
+
- lib/configatron_plus/errors.rb
|
96
|
+
- spec/config_files/testing_config.rb
|
97
|
+
- spec/configatron_plus_spec.rb
|
98
|
+
- spec/spec_helper.rb
|
99
|
+
homepage: http://github.com/anithri/configatron-plus
|
100
|
+
licenses:
|
101
|
+
- MIT
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
segments:
|
113
|
+
- 0
|
114
|
+
hash: -1691687962721209573
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ! '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
requirements: []
|
122
|
+
rubyforge_project:
|
123
|
+
rubygems_version: 1.8.10
|
124
|
+
signing_key:
|
125
|
+
specification_version: 3
|
126
|
+
summary: A helper for the configatron library
|
127
|
+
test_files: []
|