ssoroka-app_settings 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/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +47 -0
- data/Rakefile +48 -0
- data/VERSION.yml +4 -0
- data/app_settings.gemspec +50 -0
- data/example_config/example_for_gem.yml +8 -0
- data/example_config/example_for_rails.yml +48 -0
- data/init.rb +1 -0
- data/lib/app_settings.rb +56 -0
- data/spec/app_settings_spec.rb +29 -0
- data/spec/spec_helper.rb +12 -0
- data/tasks/app_settings.rake +13 -0
- metadata +68 -0
data/.document
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Steven Soroka
|
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.rdoc
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
= app_settings
|
2
|
+
|
3
|
+
Simple wrapper for YAML config files for Rails apps and gems
|
4
|
+
|
5
|
+
== Install
|
6
|
+
|
7
|
+
sudo gem install ssoroka-app_settings
|
8
|
+
rake app_settings:install_config
|
9
|
+
|
10
|
+
== Usage
|
11
|
+
|
12
|
+
=== Usage with Rails
|
13
|
+
|
14
|
+
in an initializer, put:
|
15
|
+
|
16
|
+
$settings = AppSettings.new(File.join(Rails.root, 'config', 'app_settings.yml'))
|
17
|
+
|
18
|
+
Then anywhere in your app you can access the settings with:
|
19
|
+
|
20
|
+
$settings['users/tim/user_name']
|
21
|
+
$settings['users/tim/password']
|
22
|
+
|
23
|
+
Or whatever applies for your config file.
|
24
|
+
|
25
|
+
See example_config/example_for_rails.yml for an example yml file, here's some code examples to match:
|
26
|
+
|
27
|
+
$settings['google_maps_api_keys/localhost']
|
28
|
+
|
29
|
+
$settings['domains/legacy']
|
30
|
+
|
31
|
+
$settings['from_address']
|
32
|
+
|
33
|
+
$settings.from_address
|
34
|
+
|
35
|
+
=== Usage with Gems or Plugins
|
36
|
+
|
37
|
+
# if user_config_file_path doesn't exist, default_config_file_path will be used.
|
38
|
+
@settings = AppSettings.new(user_config_file_path, default_config_file_path)
|
39
|
+
@settings['hoptoad/auth_token']
|
40
|
+
|
41
|
+
=== ERB in config files
|
42
|
+
|
43
|
+
The config files support ERB: <%= %>
|
44
|
+
|
45
|
+
== Copyright
|
46
|
+
|
47
|
+
Copyright (c) 2009 Steven Soroka. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "app_settings"
|
8
|
+
gem.summary = %Q{Simple wrapper for YAML config files for Rails apps and gems}
|
9
|
+
gem.email = "ssoroka78@gmail.com"
|
10
|
+
gem.homepage = "http://github.com/ssoroka/app_settings"
|
11
|
+
gem.authors = ["Steven Soroka"]
|
12
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
13
|
+
end
|
14
|
+
|
15
|
+
rescue LoadError
|
16
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'spec/rake/spectask'
|
20
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
21
|
+
spec.libs << 'lib' << 'spec'
|
22
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
23
|
+
end
|
24
|
+
|
25
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
26
|
+
spec.libs << 'lib' << 'spec'
|
27
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
28
|
+
spec.rcov = true
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
task :default => :spec
|
33
|
+
|
34
|
+
require 'rake/rdoctask'
|
35
|
+
Rake::RDocTask.new do |rdoc|
|
36
|
+
if File.exist?('VERSION.yml')
|
37
|
+
config = YAML.load(File.read('VERSION.yml'))
|
38
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
39
|
+
else
|
40
|
+
version = ""
|
41
|
+
end
|
42
|
+
|
43
|
+
rdoc.rdoc_dir = 'rdoc'
|
44
|
+
rdoc.title = "app_settings #{version}"
|
45
|
+
rdoc.rdoc_files.include('README*')
|
46
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
47
|
+
end
|
48
|
+
|
data/VERSION.yml
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{app_settings}
|
5
|
+
s.version = "0.2.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Steven Soroka"]
|
9
|
+
s.date = %q{2009-07-22}
|
10
|
+
s.email = %q{ssoroka78@gmail.com}
|
11
|
+
s.extra_rdoc_files = [
|
12
|
+
"LICENSE",
|
13
|
+
"README.rdoc"
|
14
|
+
]
|
15
|
+
s.files = [
|
16
|
+
".document",
|
17
|
+
".gitignore",
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc",
|
20
|
+
"Rakefile",
|
21
|
+
"VERSION.yml",
|
22
|
+
"app_settings.gemspec",
|
23
|
+
"example_config/example_for_gem.yml",
|
24
|
+
"example_config/example_for_rails.yml",
|
25
|
+
"init.rb",
|
26
|
+
"lib/app_settings.rb",
|
27
|
+
"spec/app_settings_spec.rb",
|
28
|
+
"spec/spec_helper.rb",
|
29
|
+
"tasks/app_settings.rake"
|
30
|
+
]
|
31
|
+
s.homepage = %q{http://github.com/ssoroka/app_settings}
|
32
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
33
|
+
s.require_paths = ["lib"]
|
34
|
+
s.rubygems_version = %q{1.3.3}
|
35
|
+
s.summary = %q{Simple wrapper for YAML config files for Rails apps and gems}
|
36
|
+
s.test_files = [
|
37
|
+
"spec/app_settings_spec.rb",
|
38
|
+
"spec/spec_helper.rb"
|
39
|
+
]
|
40
|
+
|
41
|
+
if s.respond_to? :specification_version then
|
42
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
43
|
+
s.specification_version = 3
|
44
|
+
|
45
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
46
|
+
else
|
47
|
+
end
|
48
|
+
else
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Settings in defaults: affect all environments. settings in other environments override the
|
2
|
+
# defaults setting erb is allowed in this file. eg. test_value: <%= 3 * 12 %> Keep in mind, when
|
3
|
+
# using erb, it's only evaluated ONCE when the application loads! (at least, in production).
|
4
|
+
defaults: &defaults
|
5
|
+
domains:
|
6
|
+
www: <%= ENV['TMPDIR'].to_s.match(/passenger/) ? 'AppSettings.local' : '0.0.0.0:3000' %>
|
7
|
+
mail: localhost
|
8
|
+
legacy: www.AppSettings.com
|
9
|
+
images: images.AppSettings.com
|
10
|
+
|
11
|
+
# settings can reference other settings like so:
|
12
|
+
from_address: help@AppSettings.com
|
13
|
+
attachment_path: public/images
|
14
|
+
|
15
|
+
# This is at least until we have a dedicated exception sender. Or always; whatever.
|
16
|
+
exception_sender: rails@AppSettings.com
|
17
|
+
|
18
|
+
items_per_page: 50
|
19
|
+
|
20
|
+
# git commit number that HEAD currently points to. Only evaluated once on server start
|
21
|
+
git_head: <%= `git log --abbrev=8 -1 --pretty=format:"%h"` %>
|
22
|
+
|
23
|
+
google_maps_api_keys:
|
24
|
+
0.0.0.0: key here
|
25
|
+
localhost: key here
|
26
|
+
|
27
|
+
request_history_size: 4
|
28
|
+
|
29
|
+
development: &development
|
30
|
+
<<: *defaults
|
31
|
+
|
32
|
+
test:
|
33
|
+
<<: *defaults
|
34
|
+
domains:
|
35
|
+
www: 0.0.0.0:3001
|
36
|
+
mail: localhost
|
37
|
+
legacy: www.AppSettings.com
|
38
|
+
images: images.AppSettings.com
|
39
|
+
|
40
|
+
production: &production
|
41
|
+
<<: *defaults
|
42
|
+
google_maps_api_keys: # Each subdomain requires its own key, I do believe
|
43
|
+
www.AppSettings.com: key_here
|
44
|
+
domains:
|
45
|
+
www: www.AppSettings.com
|
46
|
+
mail: AppSettings.com
|
47
|
+
legacy: www1.AppSettings.com
|
48
|
+
images: images.AppSettings.com
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'app_settings'
|
data/lib/app_settings.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
# see README.rdoc
|
5
|
+
class AppSettings
|
6
|
+
class MissingConfigFileException < Exception
|
7
|
+
def initialize(file)
|
8
|
+
border = "\n" << ('*' * 60) << "\n"
|
9
|
+
super("#{border} Config file #{file} does not exist. Please create it. #{border}")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
attr_accessor :config_file, :stored_settings
|
13
|
+
|
14
|
+
# use the first config file passed in that exists. Nice for allowing users to override your default config
|
15
|
+
# defaults to "#{RAILS_ROOT}/config/app_settings.yml" in rails apps if no config filename is passed in
|
16
|
+
def initialize(*config_files)
|
17
|
+
@config_file = Array(config_files).detect{|f| File.exist?(f) }
|
18
|
+
@config_file ||= "#{RAILS_ROOT}/config/app_settings.yml" if defined?(RAILS_ROOT)
|
19
|
+
end
|
20
|
+
|
21
|
+
# allows $settings.key_name shortcut for simple structures.
|
22
|
+
def method_missing(m, *a, &b)
|
23
|
+
read_settings(m.to_s)
|
24
|
+
end
|
25
|
+
|
26
|
+
# supports $settings['twitter/api/keys/frank'] style settings. Wont blow up on nil keys
|
27
|
+
# if RAILS_ENV is defined, it'll look for the keys in the appropriate environment inside app_settings.yml
|
28
|
+
def [](k)
|
29
|
+
keys = k.to_s.split('/')
|
30
|
+
result = read_settings(keys.shift)
|
31
|
+
while result && keys.any?
|
32
|
+
result = result[keys.shift]
|
33
|
+
end
|
34
|
+
result
|
35
|
+
end
|
36
|
+
|
37
|
+
# immediately expires the settings caches
|
38
|
+
def reload!
|
39
|
+
@stored_settings &&= nil
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
def read_settings(k)
|
44
|
+
unless @stored_settings
|
45
|
+
die_if_file_missing
|
46
|
+
@stored_settings = YAML::load(ERB.new(File.read(config_file)).result)
|
47
|
+
@stored_settings = @stored_settings[RAILS_ENV] if defined?(RAILS_ENV)
|
48
|
+
end
|
49
|
+
|
50
|
+
@stored_settings[k.to_s]
|
51
|
+
end
|
52
|
+
|
53
|
+
def die_if_file_missing
|
54
|
+
raise MissingConfigFileException.new(@config_file) if !@config_file || !File.exist?(@config_file)
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "AppSettings" do
|
4
|
+
before(:each) do
|
5
|
+
@settings = AppSettings.new(File.join(File.dirname(__FILE__), %w(.. example_config/example_for_rails.yml)))
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '[]' do
|
9
|
+
it "should support single keys" do
|
10
|
+
@settings['domains/legacy'].should == 'www.AppSettings.com'
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should support nested keys" do
|
14
|
+
@settings[:items_per_page].should == 50
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should not die on keys that don't exist" do
|
18
|
+
lambda {
|
19
|
+
@settings['a/b/c/d/e/f/g'].should be_nil
|
20
|
+
}.should_not raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.value' do
|
25
|
+
it "should work" do
|
26
|
+
@settings.domains['legacy'].should == 'www.AppSettings.com'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
4
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
5
|
+
RAILS_ENV = 'test'
|
6
|
+
|
7
|
+
require 'app_settings'
|
8
|
+
|
9
|
+
Spec::Runner.configure do |config|
|
10
|
+
AppSettings::APP_SETTINGS_FILE = File.join(File.dirname(__FILE__), %w(.. example_config app_settings.yml))
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace :app_settings do
|
2
|
+
desc "Install the default config file"
|
3
|
+
task :install_config => [:environment] do
|
4
|
+
dest_file = File.join(Rails.root, 'config', 'app_settings.yml')
|
5
|
+
if File.exist?(dest_file)
|
6
|
+
puts "#{dest_file} already exists. Remove it first if you want to overwrite it."
|
7
|
+
else
|
8
|
+
puts "installing default config file to #{dest_file}"
|
9
|
+
FileUtils.mv(File.join(File.dirname(__FILE__), %w(.. example_config example_for_rails.yml)), dest_file)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ssoroka-app_settings
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Steven Soroka
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-07-22 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: ssoroka78@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- LICENSE
|
24
|
+
- README.rdoc
|
25
|
+
files:
|
26
|
+
- .document
|
27
|
+
- .gitignore
|
28
|
+
- LICENSE
|
29
|
+
- README.rdoc
|
30
|
+
- Rakefile
|
31
|
+
- VERSION.yml
|
32
|
+
- app_settings.gemspec
|
33
|
+
- example_config/example_for_gem.yml
|
34
|
+
- example_config/example_for_rails.yml
|
35
|
+
- init.rb
|
36
|
+
- lib/app_settings.rb
|
37
|
+
- spec/app_settings_spec.rb
|
38
|
+
- spec/spec_helper.rb
|
39
|
+
- tasks/app_settings.rake
|
40
|
+
has_rdoc: false
|
41
|
+
homepage: http://github.com/ssoroka/app_settings
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options:
|
44
|
+
- --charset=UTF-8
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: "0"
|
52
|
+
version:
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
version:
|
59
|
+
requirements: []
|
60
|
+
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 1.2.0
|
63
|
+
signing_key:
|
64
|
+
specification_version: 3
|
65
|
+
summary: Simple wrapper for YAML config files for Rails apps and gems
|
66
|
+
test_files:
|
67
|
+
- spec/app_settings_spec.rb
|
68
|
+
- spec/spec_helper.rb
|