scoped_choices 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/README +0 -0
- data/README.md +53 -0
- data/Rakefile +2 -0
- data/lib/scoped_choices/rails.rb +55 -0
- data/lib/scoped_choices.rb +46 -0
- metadata +61 -0
data/README
ADDED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
The choice is yours
|
2
|
+
===================
|
3
|
+
|
4
|
+
Easy-peasy external settings for your Rails app.
|
5
|
+
|
6
|
+
# Gemfile
|
7
|
+
gem 'scoped_choices'
|
8
|
+
|
9
|
+
In your app initializer block:
|
10
|
+
|
11
|
+
config.from_file 'settings.yml'
|
12
|
+
|
13
|
+
#to scope out your settings
|
14
|
+
# Rails.configuration.my_engine...
|
15
|
+
config.from_file_with_scope 'settings.yml', "my_engine"
|
16
|
+
|
17
|
+
This will read configuration from "config/settings.yml" and, additionally, "settings.local.yml" if it exists. You should check the main file into version control, but not the ".local" file which is to be used for per-machine configuration: tweaks in development or private keys in production, for example.
|
18
|
+
|
19
|
+
# .gitignore
|
20
|
+
config/settings.local.yml
|
21
|
+
|
22
|
+
Configuration files can contain ERB; this is useful for reading in Heroku configuration. For example:
|
23
|
+
|
24
|
+
# settings.yml
|
25
|
+
defaults: &defaults
|
26
|
+
secret_token: <%= ENV['COOKIE_SECRET'] %>
|
27
|
+
heroku: <%= !!ENV['HEROKU_TYPE'] %>
|
28
|
+
mongodb:
|
29
|
+
uri: <%= ENV['MONGOHQ_URL'] %>
|
30
|
+
|
31
|
+
development:
|
32
|
+
<<: *defaults
|
33
|
+
|
34
|
+
test: &testing
|
35
|
+
<<: *defaults
|
36
|
+
secret_token: <%= "banana" * 5 %>
|
37
|
+
mongodb:
|
38
|
+
database: myapp_test
|
39
|
+
|
40
|
+
cucumber:
|
41
|
+
<<: *testing
|
42
|
+
|
43
|
+
The ".local" file can contain overrides for your development environment:
|
44
|
+
|
45
|
+
# settings.local.yml
|
46
|
+
development:
|
47
|
+
mongodb:
|
48
|
+
database: myapp_dev
|
49
|
+
|
50
|
+
Finally, the config keys can be read in your app as such:
|
51
|
+
|
52
|
+
Rails.configuration.heroku #=> false
|
53
|
+
Rails.configuration.mongodb.database #=> "myapp_dev"
|
data/Rakefile
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'scoped_choices'
|
2
|
+
|
3
|
+
module ScopedChoices::Rails
|
4
|
+
def self.included(base)
|
5
|
+
base.class_eval do
|
6
|
+
def initialize_with_scoped_choices(*args, &block)
|
7
|
+
initialize_without_scoped_choices(*args, &block)
|
8
|
+
@scoped_choices = Hashie::Mash.new
|
9
|
+
end
|
10
|
+
|
11
|
+
alias :initialize_without_scoped_choices :initialize
|
12
|
+
alias :initialize :initialize_with_scoped_choices
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def from_file_with_scope(name, scope)
|
17
|
+
root = self.respond_to?(:root) ? self.root : Rails.root
|
18
|
+
file = root + 'config' + name
|
19
|
+
|
20
|
+
settings = ScopedChoices.load_settings(file, Rails.respond_to?(:env) ? Rails.env : RAILS_ENV)
|
21
|
+
scoped_settings = Hashie::Mash.new
|
22
|
+
scoped_settings.send("#{scope}=", settings)
|
23
|
+
settings = scoped_settings
|
24
|
+
@scoped_choices.update settings
|
25
|
+
|
26
|
+
settings.each do |key, value|
|
27
|
+
self.send("#{key}=", value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
if defined? Rails::Application::Configuration
|
33
|
+
Rails::Application::Configuration.send(:include, ScopedChoices::Rails)
|
34
|
+
elsif defined? Rails::Configuration
|
35
|
+
Rails::Configuration.class_eval do
|
36
|
+
include ScopedChoices::Rails
|
37
|
+
include Module.new {
|
38
|
+
def respond_to?(method)
|
39
|
+
super or method.to_s =~ /=$/ or (method.to_s =~ /\?$/ and @scoped_choices.key?($`))
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def method_missing(method, *args, &block)
|
45
|
+
if method.to_s =~ /=$/ or (method.to_s =~ /\?$/ and @scoped_choices.key?($`))
|
46
|
+
@scoped_choices.send(method, *args)
|
47
|
+
elsif @scoped_choices.key?(method)
|
48
|
+
@scoped_choices[method]
|
49
|
+
else
|
50
|
+
super
|
51
|
+
end
|
52
|
+
end
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'hashie/mash'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module ScopedChoices
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def load_settings(filename, env)
|
8
|
+
mash = Hashie::Mash.new(load_settings_hash(filename, env))
|
9
|
+
|
10
|
+
with_local_settings(filename, env, '.local') do |local|
|
11
|
+
mash.update local
|
12
|
+
end
|
13
|
+
|
14
|
+
return mash
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_settings_hash(filename, env)
|
18
|
+
yaml_content = ERB.new(IO.read(filename)).result
|
19
|
+
yaml_load(yaml_content)[env]
|
20
|
+
end
|
21
|
+
|
22
|
+
def with_local_settings(filename, env, suffix)
|
23
|
+
local_filename = filename.sub(/(\.\w+)?$/, "#{suffix}\\1")
|
24
|
+
if File.exists? local_filename
|
25
|
+
hash = load_settings_hash(local_filename, env)
|
26
|
+
yield hash if hash
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def yaml_load(content)
|
31
|
+
if defined? YAML::ENGINE
|
32
|
+
# avoid using broken Psych in 1.9.2
|
33
|
+
old_yamler = YAML::ENGINE.yamler
|
34
|
+
YAML::ENGINE.yamler = 'syck'
|
35
|
+
end
|
36
|
+
begin
|
37
|
+
YAML::load(content)
|
38
|
+
ensure
|
39
|
+
YAML::ENGINE.yamler = old_yamler if defined? YAML::ENGINE
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if defined? Rails
|
45
|
+
require 'scoped_choices/rails'
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: scoped_choices
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Mislav Marohnić
|
9
|
+
- Samer Masry
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-03-02 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: hashie
|
17
|
+
requirement: &70248575343200 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.4.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *70248575343200
|
26
|
+
description: Based off Mislav's choices gem allows for scoping your configuration
|
27
|
+
email: samer@onekingslane.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- Rakefile
|
33
|
+
- lib/scoped_choices/rails.rb
|
34
|
+
- lib/scoped_choices.rb
|
35
|
+
- README
|
36
|
+
- README.md
|
37
|
+
homepage: http://github.com/okl/scoped_choices
|
38
|
+
licenses: []
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 1.8.17
|
58
|
+
signing_key:
|
59
|
+
specification_version: 3
|
60
|
+
summary: Easy settings for your app
|
61
|
+
test_files: []
|