mc-settings 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +67 -38
- data/VERSION +1 -1
- data/lib/mc-settings.rb +1 -1
- data/lib/setting.rb +117 -42
- data/mc-settings.gemspec +71 -0
- data/spec/fixtures/sample.yml +16 -0
- data/spec/mc_settings_spec.rb +39 -2
- metadata +26 -24
data/README.rdoc
CHANGED
@@ -1,53 +1,82 @@
|
|
1
|
-
= Settings
|
1
|
+
= Application Settings Manager
|
2
2
|
|
3
|
-
|
3
|
+
This gem provides an easy and capistrano-friendly way to manage application configuration across
|
4
|
+
multiple environments, such as development, QA, staging, production, etc.
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
default: value
|
9
|
-
key_name: value
|
10
|
-
multiples_values:
|
11
|
-
default: default
|
12
|
-
another_value: another_default
|
6
|
+
Applications typically rely on configuration settings, such as host names, URLs, usernames and many
|
7
|
+
more. Some change between environemnts, some do not. This gem makes managing this hierarchy of
|
8
|
+
settings values easy and provides convenient and compact syntax to access the settings.
|
13
9
|
|
10
|
+
Configuration is stored in YAML files, in the following format, with it's top level structure being a hash with keys being the names of individual settings. For example:
|
14
11
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
tax:
|
13
|
+
default: 0.0
|
14
|
+
california: 7.5
|
15
|
+
states:
|
16
|
+
default:
|
17
|
+
- 'CA'
|
18
|
+
- 'WA'
|
19
|
+
- 'NY'
|
20
|
+
ship_to:
|
21
|
+
- 'CA'
|
22
|
+
- 'NY'
|
23
|
+
math_pi: 3.14159526
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
|
25
|
+
etc.
|
26
|
+
|
27
|
+
== Usage
|
28
|
+
|
29
|
+
Once settings are initialized (see below), they can be used in code in the following way:
|
30
|
+
|
31
|
+
* Setting.key_name is optimized to return default value if available.
|
32
|
+
* Setting.key_name(:sub_key_name) returns value from the 2nd level hash if available.
|
33
|
+
* Setting[:key_name] & Setting['key_name'] return entire 2nd-level hash without any regard for whether default value exists.
|
34
|
+
|
35
|
+
For example, given the above YAML file:
|
36
|
+
|
37
|
+
Setting.tax => 0.0
|
38
|
+
Setting.tax(:california) => 7.5
|
39
|
+
Setting[:tax] => { 'default' => 0.0, 'california' => 7.5 }
|
40
|
+
Setting.states => [ 'CA', 'WA', 'NY' ]
|
41
|
+
Setting.states['ship_to'] => [ 'CA', 'NY' ]
|
42
|
+
|
43
|
+
The following usage is supported for backwards compatibility, but is deprecated and should
|
44
|
+
not be used for new projects:
|
24
45
|
|
25
|
-
Setting.key_name
|
26
46
|
Setting.available_settings['key_name']
|
27
|
-
Setting.available_settings['key_name']['
|
28
|
-
Setting['key_name']
|
29
|
-
Setting[:key_name]
|
30
|
-
Setting['multiples_values']['another_value']
|
47
|
+
Setting.available_settings['key_name']['sub_key_name']
|
31
48
|
|
49
|
+
== Settings Loading
|
32
50
|
|
33
|
-
This
|
34
|
-
|
35
|
-
* Override specific keys depending on rails environment
|
36
|
-
* Apply all #{path}/local/*.yml files to Settings, overriding common keys
|
51
|
+
This gem should be initialized in your environment.rb (if using Rails), or in any other
|
52
|
+
application initialization block.
|
37
53
|
|
54
|
+
Consider an example:
|
38
55
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
56
|
+
Setting.load(:files => ["default.yml", "environments/#{Rails.env}.yml"],
|
57
|
+
:path => "#{Rails.root}/config/settings",
|
58
|
+
:local => true)
|
59
|
+
|
60
|
+
This parameter hash tells Setting to load settings hashes, in order, from the following
|
61
|
+
files under "development" (assuming you have two files "custom.yml" and "secret.yml" under your
|
62
|
+
RAILS_ROOT/config/settings/local folder):
|
63
|
+
|
64
|
+
config/settings/default.yml
|
65
|
+
config/settings/environments/development.yml
|
66
|
+
config/settings/local/custom.yml
|
67
|
+
config/settings/local/secret.yml
|
68
|
+
|
69
|
+
The following is the sequence of loading explained:
|
70
|
+
|
71
|
+
* Read all files in :files list in order, and load their settings.
|
72
|
+
* Last file loaded overrides previous value (if already exist).
|
73
|
+
* Load all #{path}/local/*.yml files to Settings, overriding common keys. Files are loaded in order sorted by name.
|
48
74
|
|
49
75
|
== Copyright
|
50
76
|
|
51
|
-
Copyright (c)
|
52
|
-
|
77
|
+
Copyright 2010 (c) ModCloth Inc.
|
78
|
+
|
79
|
+
Authors: 2010 Edwin Cruz & Konstantin Gredeskoul
|
80
|
+
|
81
|
+
See LICENSE.txt for further details.
|
53
82
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/mc-settings.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require 'setting'
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/setting'
|
data/lib/setting.rb
CHANGED
@@ -1,84 +1,159 @@
|
|
1
1
|
require 'singleton'
|
2
|
+
require 'yaml'
|
2
3
|
class Setting
|
3
|
-
class
|
4
|
-
class
|
4
|
+
class NotFound < RuntimeError; end
|
5
|
+
class FileError < RuntimeError; end
|
6
|
+
class AlreadyLoaded < RuntimeError; end
|
5
7
|
|
6
8
|
include Singleton
|
7
9
|
|
8
|
-
|
9
|
-
@available_settings = {}
|
10
|
-
self.load params
|
11
|
-
end
|
10
|
+
attr_reader :available_settings
|
12
11
|
|
13
|
-
|
14
|
-
|
12
|
+
# This method can be called only once.
|
13
|
+
#
|
14
|
+
# Parameter hash looks like this:
|
15
|
+
#
|
16
|
+
# { :files => [ "file1.yml", "file2.yml", ...],
|
17
|
+
# :path => "/var/www/apps/my-app/current/config/settings",
|
18
|
+
# :local => true }
|
19
|
+
#
|
20
|
+
# If :local => true is set, we will load all *.yml files under :path/local directory
|
21
|
+
# after all files in :files have been loaded. "Local" settings thus take precedence
|
22
|
+
# by design. See README for more details.
|
23
|
+
#
|
24
|
+
def self.load(args = {})
|
25
|
+
raise AlreadyLoaded.new('Settings already loaded') if self.instance.loaded?
|
26
|
+
self.instance.load(args)
|
15
27
|
end
|
16
28
|
|
17
|
-
|
18
|
-
|
19
|
-
self.check_value(name.to_s)
|
20
|
-
self.value_for(name.to_s)
|
29
|
+
def self.reload(args = {})
|
30
|
+
self.instance.load(args)
|
21
31
|
end
|
22
32
|
|
33
|
+
# In Method invocation syntax we collapse Hash values
|
34
|
+
# and return a single value if 'default' is found among keys
|
35
|
+
# or Hash has only one key/value pair.
|
36
|
+
#
|
37
|
+
# For example, if the YML data is:
|
38
|
+
# tax:
|
39
|
+
# default: 0.0
|
40
|
+
# california: 7.5
|
41
|
+
#
|
42
|
+
# Then calling Setting.tax returns "0.0""
|
43
|
+
#
|
44
|
+
# This is the preferred method of using settings class.
|
45
|
+
#
|
23
46
|
def self.method_missing(method, *args, &block)
|
24
|
-
|
25
|
-
|
26
|
-
rescue
|
27
|
-
name = method.to_s
|
28
|
-
if name[-1, 1] == "?"
|
29
|
-
name.chomp!('?')
|
30
|
-
self[name]['default'].to_i > 0
|
31
|
-
else
|
32
|
-
self[name]
|
47
|
+
self.instance.value_for(method, args) do |v, args|
|
48
|
+
self.instance.collapse_hashes(v, args)
|
33
49
|
end
|
34
50
|
end
|
35
51
|
|
52
|
+
# In [] invocation syntax, we return settings value 'as is' without
|
53
|
+
# Hash conversions.
|
54
|
+
#
|
55
|
+
# For example, if the YML data is:
|
56
|
+
# tax:
|
57
|
+
# default: 0.0
|
58
|
+
# california: 7.5
|
59
|
+
#
|
60
|
+
# Then calling Setting['tax'] returns
|
61
|
+
# { 'default' => "0.0", 'california' => "7.5"}
|
62
|
+
|
63
|
+
def self.[](value)
|
64
|
+
self.instance.value_for(value)
|
65
|
+
end
|
66
|
+
|
67
|
+
# <b>DEPRECATED:</b> Please use <tt>method accessors</tt> instead.
|
68
|
+
def self.available_settings
|
69
|
+
self.instance.available_settings
|
70
|
+
end
|
71
|
+
|
72
|
+
#=================================================================
|
73
|
+
# Instance Methods
|
74
|
+
#=================================================================
|
75
|
+
|
36
76
|
def initialize
|
37
77
|
@available_settings ||= {}
|
38
78
|
end
|
39
79
|
|
40
|
-
|
41
|
-
|
42
|
-
@available_settings.has_key?(key)
|
80
|
+
def has_key?(key)
|
81
|
+
@available_settings.has_key?(key) ||
|
82
|
+
(key[-1,1] == '?' && @available_settings.has_key?(key.chop))
|
83
|
+
end
|
84
|
+
|
85
|
+
def value_for(key, args = [])
|
86
|
+
name = key.to_s
|
87
|
+
raise NotFound.new("#{name} was not found") unless has_key?(name)
|
88
|
+
bool = false
|
89
|
+
if name[-1,1] == '?'
|
90
|
+
name.chop!
|
91
|
+
bool = true
|
92
|
+
end
|
93
|
+
|
94
|
+
v = @available_settings[name]
|
95
|
+
if block_given?
|
96
|
+
v = yield(v, args)
|
97
|
+
end
|
98
|
+
|
99
|
+
if v.is_a?(Fixnum) && bool
|
100
|
+
v.to_i > 0
|
101
|
+
else
|
102
|
+
v
|
43
103
|
end
|
104
|
+
end
|
44
105
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
106
|
+
# This method performs collapsing of the Hash settings values if the Hash
|
107
|
+
# contains 'default' value, or just 1 element.
|
108
|
+
|
109
|
+
def collapse_hashes(v, args)
|
110
|
+
if v.is_a?(Hash)
|
111
|
+
if args.empty?
|
112
|
+
if v.has_key?("default")
|
113
|
+
v['default'].nil? ? "" : v['default']
|
114
|
+
elsif v.keys.size == 1
|
115
|
+
v.values.first
|
116
|
+
else
|
117
|
+
v
|
118
|
+
end
|
51
119
|
else
|
52
|
-
v
|
120
|
+
v[args[0].to_s]
|
53
121
|
end
|
122
|
+
else
|
123
|
+
v
|
54
124
|
end
|
55
125
|
end
|
126
|
+
|
127
|
+
def loaded?
|
128
|
+
@loaded
|
129
|
+
end
|
130
|
+
|
131
|
+
def load(params)
|
132
|
+
# reset settings hash
|
133
|
+
@available_settings = {}
|
134
|
+
@loaded = false
|
56
135
|
|
57
|
-
def self.load(params)
|
58
136
|
files = []
|
59
|
-
path = params[:path]
|
137
|
+
path = params[:path] || Dir.pwd
|
60
138
|
params[:files].each do |file|
|
61
139
|
files << File.join(path, file)
|
62
140
|
end
|
141
|
+
|
63
142
|
if params[:local]
|
64
143
|
files << Dir.glob(File.join(path, 'local', '*.yml'))
|
65
144
|
end
|
66
|
-
|
145
|
+
|
67
146
|
files.flatten.each do |file|
|
68
147
|
begin
|
69
148
|
@available_settings.merge!(YAML::load(File.open(file)) || {}) if File.exists?(file)
|
70
149
|
rescue Exception => e
|
71
|
-
raise
|
150
|
+
raise FileError.new("Error parsing file #{file}, with: #{e.message}")
|
72
151
|
end
|
73
152
|
end
|
153
|
+
|
154
|
+
@loaded = true
|
74
155
|
@available_settings
|
75
156
|
end
|
76
157
|
|
77
|
-
private
|
78
|
-
|
79
|
-
def self.check_value(name)
|
80
|
-
raise RuntimeError.new("settings are not yet initialized") unless self.instance
|
81
|
-
raise SettingNotFound.new("#{name} not found") unless self.has_key?(name)
|
82
|
-
end
|
83
158
|
|
84
|
-
end
|
159
|
+
end
|
data/mc-settings.gemspec
ADDED
@@ -0,0 +1,71 @@
|
|
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 = %q{mc-settings}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Edwin Cruz", "Colin Shield"]
|
12
|
+
s.date = %q{2010-12-28}
|
13
|
+
s.description = %q{implement custom keys indenendently of environment}
|
14
|
+
s.email = %q{rubydev@modcloth.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
"Gemfile",
|
22
|
+
"Gemfile.lock",
|
23
|
+
"LICENSE.txt",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"lib/mc-settings.rb",
|
28
|
+
"lib/setting.rb",
|
29
|
+
"mc-settings.gemspec",
|
30
|
+
"spec/fixtures/sample.yml",
|
31
|
+
"spec/mc_settings_spec.rb",
|
32
|
+
"spec/spec_helper.rb",
|
33
|
+
"spec/support/settings_helper.rb"
|
34
|
+
]
|
35
|
+
s.homepage = %q{http://github.com/modcloth/mc-settings}
|
36
|
+
s.licenses = ["MIT"]
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
s.rubygems_version = %q{1.3.7}
|
39
|
+
s.summary = %q{Manage settings per environment}
|
40
|
+
s.test_files = [
|
41
|
+
"spec/mc_settings_spec.rb",
|
42
|
+
"spec/spec_helper.rb",
|
43
|
+
"spec/support/settings_helper.rb"
|
44
|
+
]
|
45
|
+
|
46
|
+
if s.respond_to? :specification_version then
|
47
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
48
|
+
s.specification_version = 3
|
49
|
+
|
50
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
51
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
52
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
53
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
|
54
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
55
|
+
s.add_development_dependency(%q<ruby-debug>, [">= 0"])
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
58
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
59
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
60
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
61
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
62
|
+
end
|
63
|
+
else
|
64
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
65
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
66
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
67
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
68
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
data/spec/mc_settings_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
describe Setting do
|
3
3
|
subject { Setting }
|
4
4
|
|
5
|
-
context "Test
|
5
|
+
context "Test with stubs" do
|
6
6
|
before :each do
|
7
7
|
stub_setting_files
|
8
8
|
Setting.reload(
|
@@ -10,6 +10,7 @@ describe Setting do
|
|
10
10
|
:path => "config/settings",
|
11
11
|
:local => true)
|
12
12
|
end
|
13
|
+
|
13
14
|
it 'should return test specific values' do
|
14
15
|
Setting.available_settings['one'].should == "test"
|
15
16
|
Setting.one.should == "test"
|
@@ -30,9 +31,10 @@ describe Setting do
|
|
30
31
|
it "should support symbols as keys" do
|
31
32
|
Setting[:six].should == {"default"=>"default value", "extra"=>"extra"}
|
32
33
|
end
|
34
|
+
|
33
35
|
it "handles default key" do
|
34
36
|
Setting.default_setting.should == 1
|
35
|
-
Setting['seven'].should == "seven from custom"
|
37
|
+
Setting['seven']['default'].should == "seven from custom"
|
36
38
|
end
|
37
39
|
|
38
40
|
it "should handle empty strings" do
|
@@ -47,4 +49,39 @@ describe Setting do
|
|
47
49
|
Setting.flag_false.should be(false)
|
48
50
|
end
|
49
51
|
end
|
52
|
+
|
53
|
+
context "Test from file" do
|
54
|
+
before :each do
|
55
|
+
Setting.reload(
|
56
|
+
:files => ['sample.yml'],
|
57
|
+
:path => File.join(File.dirname(__FILE__)) + '/fixtures'
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should support [] syntax' do
|
62
|
+
Setting['tax']['default'].should == 0.0
|
63
|
+
Setting['tax'].should == { 'default' => 0.0, 'california' => 7.5 }
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should support method invocation syntax' do
|
67
|
+
Setting.tax.should == 0.0
|
68
|
+
|
69
|
+
Setting.tax(:default).should == Setting.tax
|
70
|
+
Setting.tax('default').should == Setting.tax
|
71
|
+
Setting.tax(:california).should == 7.5
|
72
|
+
|
73
|
+
Setting.states.should == ['CA', 'WA', 'NY']
|
74
|
+
Setting.states(:default).should == Setting.states
|
75
|
+
Setting.states(:ship_to).should == ['CA', 'NY']
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should correctly process Boolean values' do
|
79
|
+
Setting.boolean_true?.should be(true)
|
80
|
+
Setting.boolean_true.should == 4
|
81
|
+
Setting.boolean_false?.should be(false)
|
82
|
+
Setting.boolean_false?(:default).should be(false)
|
83
|
+
Setting.boolean_false?(:negated).should be(true)
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
50
87
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mc-settings
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Edwin Cruz
|
@@ -16,13 +16,14 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-12-
|
19
|
+
date: 2010-12-28 00:00:00 -08:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
|
-
name: rspec
|
24
23
|
prerelease: false
|
25
|
-
|
24
|
+
type: :development
|
25
|
+
name: rspec
|
26
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
27
|
none: false
|
27
28
|
requirements:
|
28
29
|
- - ">="
|
@@ -31,12 +32,12 @@ dependencies:
|
|
31
32
|
segments:
|
32
33
|
- 0
|
33
34
|
version: "0"
|
34
|
-
|
35
|
-
version_requirements: *id001
|
35
|
+
requirement: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name: bundler
|
38
37
|
prerelease: false
|
39
|
-
|
38
|
+
type: :development
|
39
|
+
name: bundler
|
40
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
41
|
none: false
|
41
42
|
requirements:
|
42
43
|
- - ~>
|
@@ -47,12 +48,12 @@ dependencies:
|
|
47
48
|
- 0
|
48
49
|
- 0
|
49
50
|
version: 1.0.0
|
50
|
-
|
51
|
-
version_requirements: *id002
|
51
|
+
requirement: *id002
|
52
52
|
- !ruby/object:Gem::Dependency
|
53
|
-
name: jeweler
|
54
53
|
prerelease: false
|
55
|
-
|
54
|
+
type: :development
|
55
|
+
name: jeweler
|
56
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
56
57
|
none: false
|
57
58
|
requirements:
|
58
59
|
- - ~>
|
@@ -63,12 +64,12 @@ dependencies:
|
|
63
64
|
- 5
|
64
65
|
- 1
|
65
66
|
version: 1.5.1
|
66
|
-
|
67
|
-
version_requirements: *id003
|
67
|
+
requirement: *id003
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
|
-
name: rcov
|
70
69
|
prerelease: false
|
71
|
-
|
70
|
+
type: :development
|
71
|
+
name: rcov
|
72
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
72
73
|
none: false
|
73
74
|
requirements:
|
74
75
|
- - ">="
|
@@ -77,12 +78,12 @@ dependencies:
|
|
77
78
|
segments:
|
78
79
|
- 0
|
79
80
|
version: "0"
|
80
|
-
|
81
|
-
version_requirements: *id004
|
81
|
+
requirement: *id004
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
|
-
name: ruby-debug
|
84
83
|
prerelease: false
|
85
|
-
|
84
|
+
type: :development
|
85
|
+
name: ruby-debug
|
86
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
86
87
|
none: false
|
87
88
|
requirements:
|
88
89
|
- - ">="
|
@@ -91,8 +92,7 @@ dependencies:
|
|
91
92
|
segments:
|
92
93
|
- 0
|
93
94
|
version: "0"
|
94
|
-
|
95
|
-
version_requirements: *id005
|
95
|
+
requirement: *id005
|
96
96
|
description: implement custom keys indenendently of environment
|
97
97
|
email: rubydev@modcloth.com
|
98
98
|
executables: []
|
@@ -112,6 +112,8 @@ files:
|
|
112
112
|
- VERSION
|
113
113
|
- lib/mc-settings.rb
|
114
114
|
- lib/setting.rb
|
115
|
+
- mc-settings.gemspec
|
116
|
+
- spec/fixtures/sample.yml
|
115
117
|
- spec/mc_settings_spec.rb
|
116
118
|
- spec/spec_helper.rb
|
117
119
|
- spec/support/settings_helper.rb
|