defaultable 0.0.1
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 +17 -0
- data/.rspec +3 -0
- data/Gemfile +4 -0
- data/README.md +39 -0
- data/Rakefile +2 -0
- data/defaultable.gemspec +22 -0
- data/lib/defaultable.rb +87 -0
- data/lib/defaultable/version.rb +3 -0
- data/spec/defaultable_spec.rb +142 -0
- data/spec/env_test.yml +2 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/test.yml +4 -0
- metadata +95 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Defaultable
|
2
|
+
#### Defaultable allows you to create settings with defaults easily
|
3
|
+
|
4
|
+
```
|
5
|
+
setting = Defaultable::Settings.new
|
6
|
+
setting.site_name = 'Example'
|
7
|
+
setting.site_name # => Example
|
8
|
+
```
|
9
|
+
|
10
|
+
## Creating your own defaultable settings class
|
11
|
+
|
12
|
+
To create a settings class, just extend Defaultable::Settings
|
13
|
+
|
14
|
+
```
|
15
|
+
class MySetting < Defaultable::Settings
|
16
|
+
set_defaults :site_name => 'Example'
|
17
|
+
end
|
18
|
+
|
19
|
+
setting = MySetting.new
|
20
|
+
setting.site_name # => Example
|
21
|
+
|
22
|
+
setting.site_name = 'Different Name'
|
23
|
+
setting.site_name # => Different Name
|
24
|
+
```
|
25
|
+
|
26
|
+
## Creating your own defaultable settings from a YAML file
|
27
|
+
|
28
|
+
```
|
29
|
+
class MySetting < Defaultable::Settings
|
30
|
+
set_defaults "#{Rails.root}/config/settings.yml"
|
31
|
+
end
|
32
|
+
|
33
|
+
class MySetting < Defaultable::Settings
|
34
|
+
set_defaults "#{Rails.root}/config/settings.yml", Rails.env
|
35
|
+
end
|
36
|
+
|
37
|
+
```
|
38
|
+
|
39
|
+
The second parameter of ```set_defaults``` is the environment variable you'd like to use from the file.
|
data/Rakefile
ADDED
data/defaultable.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/defaultable/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Robert Ross"]
|
6
|
+
gem.email = ["robert@maintainedauto.com"]
|
7
|
+
gem.description = %q{Defaultable is an extendable class to allow easy method chaining for settings along with defaults.}
|
8
|
+
gem.summary = %q{Settings made easy.}
|
9
|
+
gem.homepage = "https://github.com/bobbytables/defaultable"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "defaultable"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Defaultable::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency("activesupport", "~> 3.1")
|
19
|
+
|
20
|
+
gem.add_development_dependency("rspec", "~> 2.7")
|
21
|
+
gem.add_development_dependency("pry")
|
22
|
+
end
|
data/lib/defaultable.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
require "defaultable/version"
|
2
|
+
require 'yaml'
|
3
|
+
require 'active_support/core_ext/class/attribute'
|
4
|
+
|
5
|
+
module Defaultable
|
6
|
+
class Settings
|
7
|
+
class_attribute :defaults
|
8
|
+
attr_accessor :root_key, :parent
|
9
|
+
|
10
|
+
def initialize(hash=nil, root_key=nil, parent=nil)
|
11
|
+
@table = {}
|
12
|
+
|
13
|
+
if root_key
|
14
|
+
self.root_key = root_key
|
15
|
+
end
|
16
|
+
|
17
|
+
if parent
|
18
|
+
self.parent = parent
|
19
|
+
end
|
20
|
+
|
21
|
+
if !hash.nil? && hash.kind_of?(Hash)
|
22
|
+
hash.each do |key, value|
|
23
|
+
if value.kind_of?(Hash)
|
24
|
+
send("#{key}=", Defaultable::Settings.new(value, key, self))
|
25
|
+
else
|
26
|
+
self.send("#{key}=", value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def method_missing(message, *args, &block)
|
33
|
+
# puts "Message: #{message}", "Args: #{args}", "\n"
|
34
|
+
|
35
|
+
if !(message.to_s =~ /^(.*)=$/) && @table.has_key?(message.to_s)
|
36
|
+
@table[message.to_s]
|
37
|
+
elsif message.to_s =~ /^(.*)=$/
|
38
|
+
@table[message.to_s.gsub(/=$/, '')] = args.first
|
39
|
+
elsif !(message.to_s =~ /^(.*)=$/)
|
40
|
+
# We're looking for a default
|
41
|
+
default_settings = self.class.defaults
|
42
|
+
|
43
|
+
# If we have a parent, we need to traverse to the top of all of the method calls (root_keys), then go back down them
|
44
|
+
if self.parent
|
45
|
+
root_keys = []
|
46
|
+
current_parent = self
|
47
|
+
while current_parent.has_parent? do
|
48
|
+
root_keys << current_parent.root_key
|
49
|
+
current_parent = current_parent.parent
|
50
|
+
end
|
51
|
+
|
52
|
+
root_keys.reverse.each do |key|
|
53
|
+
default_settings = default_settings.send(key)
|
54
|
+
end
|
55
|
+
|
56
|
+
return default_settings.send(message)
|
57
|
+
# If don't have a parent, just send the message to the defaults outright
|
58
|
+
else
|
59
|
+
default_settings.send(message)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def as_hash
|
65
|
+
@table
|
66
|
+
end
|
67
|
+
|
68
|
+
def has_parent?
|
69
|
+
!!self.parent
|
70
|
+
end
|
71
|
+
|
72
|
+
class << self
|
73
|
+
def set_defaults(settings, env=nil)
|
74
|
+
case settings
|
75
|
+
when Hash
|
76
|
+
self.defaults = Defaultable::Settings.new(settings)
|
77
|
+
when String
|
78
|
+
yaml = YAML.load_file(settings)
|
79
|
+
yaml = yaml[env] if env
|
80
|
+
self.defaults = Defaultable::Settings.new(yaml)
|
81
|
+
else
|
82
|
+
raise ArgumentError, "You must supply a hash or a file name for default settings"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Defaultable::Settings do
|
4
|
+
before :each do
|
5
|
+
Defaultable::Settings.set_defaults({})
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should not have a parent" do
|
9
|
+
setting = Defaultable::Settings.new
|
10
|
+
setting.has_parent?.should be_false
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should initialize with a hash" do
|
14
|
+
setting = Defaultable::Settings.new({:child => 'Bobert'})
|
15
|
+
setting.child.should eq('Bobert')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be able to set nonexsistent keys" do
|
19
|
+
setting = Defaultable::Settings.new
|
20
|
+
setting.child = 'Bri Bri'
|
21
|
+
setting.child.should eq('Bri Bri')
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should be able to set nonexsistent keys to another setting" do
|
25
|
+
setting = Defaultable::Settings.new
|
26
|
+
setting.child = Defaultable::Settings.new
|
27
|
+
setting.child.name = 'Mocha'
|
28
|
+
setting.child.name.should eq('Mocha')
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should accept nested hashes" do
|
32
|
+
setting = Defaultable::Settings.new({:parent => {:child => 'Rob'}})
|
33
|
+
setting.parent.child.should eq('Rob')
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should have default settings" do
|
37
|
+
Defaultable::Settings.set_defaults File.expand_path('../', __FILE__) + '/test.yml'
|
38
|
+
Defaultable::Settings.defaults.should be_kind_of(Defaultable::Settings)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should have a default setting for a key" do
|
42
|
+
Defaultable::Settings.set_defaults File.expand_path('../', __FILE__) + '/test.yml'
|
43
|
+
|
44
|
+
setting = Defaultable::Settings.new
|
45
|
+
setting.grandparent.should be_kind_of Defaultable::Settings
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should have another key for another setting" do
|
49
|
+
Defaultable::Settings.set_defaults File.expand_path('../', __FILE__) + '/test.yml'
|
50
|
+
|
51
|
+
setting = Defaultable::Settings.new
|
52
|
+
setting.grandparent.child.grandchild1.should eq('robert')
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should set a key but still have defaults" do
|
56
|
+
Defaultable::Settings.set_defaults File.expand_path('../', __FILE__) + '/test.yml'
|
57
|
+
|
58
|
+
setting = Defaultable::Settings.new({
|
59
|
+
:grandparent => {
|
60
|
+
:child => {
|
61
|
+
:grandchild3 => 'hurdur'
|
62
|
+
}
|
63
|
+
}
|
64
|
+
})
|
65
|
+
|
66
|
+
setting.grandparent.child.grandchild3.should eq('hurdur')
|
67
|
+
setting.grandparent.child.grandchild2.should eq('brian')
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should be able to overwrite a default" do
|
71
|
+
Defaultable::Settings.set_defaults File.expand_path('../', __FILE__) + '/test.yml'
|
72
|
+
|
73
|
+
setting = Defaultable::Settings.new({
|
74
|
+
:grandparent => {
|
75
|
+
:child => {
|
76
|
+
:grandchild3 => 'hurdur'
|
77
|
+
}
|
78
|
+
}
|
79
|
+
})
|
80
|
+
|
81
|
+
setting.grandparent.child.grandchild3.should eq('hurdur')
|
82
|
+
setting.grandparent.child.grandchild2 = 'drpepper'
|
83
|
+
setting.grandparent.child.grandchild2.should eq('drpepper')
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should be able to set a key in the middle of defaults" do
|
87
|
+
Defaultable::Settings.set_defaults File.expand_path('../', __FILE__) + '/test.yml'
|
88
|
+
|
89
|
+
setting = Defaultable::Settings.new({
|
90
|
+
:grandparent => {
|
91
|
+
:child => {
|
92
|
+
:grandchild3 => 'hurdur'
|
93
|
+
}
|
94
|
+
}
|
95
|
+
})
|
96
|
+
|
97
|
+
setting.grandparent.child.grandchild3.should eq('hurdur')
|
98
|
+
setting.grandparent.someotherkey = 'saweet'
|
99
|
+
setting.grandparent.someotherkey.should eq('saweet')
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should be able to set a hash for defaults" do
|
103
|
+
Defaultable::Settings.set_defaults :child => 'sxephil'
|
104
|
+
|
105
|
+
setting = Defaultable::Settings.new
|
106
|
+
setting.child.should eq('sxephil')
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should accept a filename with an environment" do
|
110
|
+
Defaultable::Settings.set_defaults File.expand_path('../', __FILE__) + '/env_test.yml', 'development'
|
111
|
+
|
112
|
+
setting = Defaultable::Settings.new
|
113
|
+
setting.setting_key.should eq('somevalue')
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should be extendable" do
|
117
|
+
class DummySetting < Defaultable::Settings
|
118
|
+
set_defaults :movie => 'Iron Man'
|
119
|
+
end
|
120
|
+
|
121
|
+
setting = DummySetting.new
|
122
|
+
setting.movie.should eq('Iron Man')
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "Hashes" do
|
126
|
+
it ".as_hash should return a hash" do
|
127
|
+
Defaultable::Settings.set_defaults :child => 'sxephil'
|
128
|
+
setting = Defaultable::Settings.new
|
129
|
+
|
130
|
+
setting.name = 'Robert'
|
131
|
+
setting.as_hash.should be_kind_of Hash
|
132
|
+
end
|
133
|
+
|
134
|
+
it ".as_hash should return a hash with the correct keys" do
|
135
|
+
Defaultable::Settings.set_defaults :child => 'sxephil'
|
136
|
+
setting = Defaultable::Settings.new
|
137
|
+
|
138
|
+
setting.name = 'Robert'
|
139
|
+
setting.as_hash['name'].should eq('Robert')
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/spec/env_test.yml
ADDED
data/spec/spec_helper.rb
ADDED
data/spec/test.yml
ADDED
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: defaultable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Robert Ross
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: &70195091793420 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.1'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70195091793420
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &70195091791660 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2.7'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70195091791660
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: pry
|
38
|
+
requirement: &70195091790800 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70195091790800
|
47
|
+
description: Defaultable is an extendable class to allow easy method chaining for
|
48
|
+
settings along with defaults.
|
49
|
+
email:
|
50
|
+
- robert@maintainedauto.com
|
51
|
+
executables: []
|
52
|
+
extensions: []
|
53
|
+
extra_rdoc_files: []
|
54
|
+
files:
|
55
|
+
- .gitignore
|
56
|
+
- .rspec
|
57
|
+
- Gemfile
|
58
|
+
- README.md
|
59
|
+
- Rakefile
|
60
|
+
- defaultable.gemspec
|
61
|
+
- lib/defaultable.rb
|
62
|
+
- lib/defaultable/version.rb
|
63
|
+
- spec/defaultable_spec.rb
|
64
|
+
- spec/env_test.yml
|
65
|
+
- spec/spec_helper.rb
|
66
|
+
- spec/test.yml
|
67
|
+
homepage: https://github.com/bobbytables/defaultable
|
68
|
+
licenses: []
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubyforge_project:
|
87
|
+
rubygems_version: 1.8.11
|
88
|
+
signing_key:
|
89
|
+
specification_version: 3
|
90
|
+
summary: Settings made easy.
|
91
|
+
test_files:
|
92
|
+
- spec/defaultable_spec.rb
|
93
|
+
- spec/env_test.yml
|
94
|
+
- spec/spec_helper.rb
|
95
|
+
- spec/test.yml
|