setler 0.0.1 → 0.0.2
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 +2 -0
- data/README.rdoc +2 -2
- data/Rakefile +16 -0
- data/lib/setler/active_record.rb +22 -0
- data/lib/setler/exceptions.rb +4 -0
- data/lib/setler/scoped_settings.rb +13 -0
- data/lib/setler/settings.rb +38 -0
- data/lib/setler/version.rb +1 -1
- data/lib/setler.rb +8 -38
- data/setler.gemspec +5 -2
- data/test/settings_test.rb +33 -1
- data/test/test_helper.rb +9 -8
- metadata +37 -11
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -43,7 +43,7 @@ Set defaults in an initializer with something like:
|
|
43
43
|
Featureflags.defaults[:bacon_dispenser_enabled] = false
|
44
44
|
Settings.defaults[:allowed_meats] = ['itsnotbacon']
|
45
45
|
|
46
|
-
|
46
|
+
Add them to any ActiveRecord object:
|
47
47
|
|
48
48
|
class User < ActiveRecord::Base
|
49
49
|
has_setler as: :settings
|
@@ -56,6 +56,6 @@ Then you get:
|
|
56
56
|
user.settings.favorite_meat # :bacon
|
57
57
|
user.settings.all # { "favorite_meat" => :bacon }
|
58
58
|
|
59
|
-
And look em up:
|
59
|
+
TODO: And look em up:
|
60
60
|
|
61
61
|
User.with_settings_for('favorite_meat') # => scope of users with the favorite_meat setting
|
data/Rakefile
CHANGED
@@ -7,3 +7,19 @@ Rake::TestTask.new(:test) do |test|
|
|
7
7
|
end
|
8
8
|
|
9
9
|
task default: [:test]
|
10
|
+
|
11
|
+
namespace :cover_me do
|
12
|
+
desc "Generates and opens code coverage report."
|
13
|
+
task :report do
|
14
|
+
require 'cover_me'
|
15
|
+
CoverMe.complete!
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
task :test do
|
20
|
+
Rake::Task['cover_me:report'].invoke
|
21
|
+
end
|
22
|
+
|
23
|
+
task :spec do
|
24
|
+
Rake::Task['cover_me:report'].invoke
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Setler
|
2
|
+
module ActiveRecord
|
3
|
+
|
4
|
+
def has_setler(scopename = 'settings')
|
5
|
+
define_method scopename do
|
6
|
+
Setler::ScopedSettings.for_thing(self)
|
7
|
+
end
|
8
|
+
|
9
|
+
define_method "#{scopename}=" do |hash|
|
10
|
+
hash.each do |key,value|
|
11
|
+
Setler::Settings.find_or_create_by_thing_id_and_thing_type_and_var(
|
12
|
+
self.id,
|
13
|
+
self.class,
|
14
|
+
key,
|
15
|
+
value: value
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Setler
|
2
|
+
class Settings < ActiveRecord::Base
|
3
|
+
serialize :value
|
4
|
+
self.abstract_class = true
|
5
|
+
|
6
|
+
cattr_accessor :defaults
|
7
|
+
@@defaults = {}.with_indifferent_access
|
8
|
+
|
9
|
+
# Get and Set variables when the calling method is the variable name
|
10
|
+
def self.method_missing(method, *args, &block)
|
11
|
+
if respond_to?(method)
|
12
|
+
super(method, *args, &block)
|
13
|
+
else
|
14
|
+
method_name = method.to_s
|
15
|
+
if method_name.ends_with?("=")
|
16
|
+
self.find_or_create_by_var(method_name[0..-2]).update_attribute(:value, args.first)
|
17
|
+
else
|
18
|
+
self.find_by_var(method_name).try(:value) || @@defaults[method_name]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.destroy(var_name)
|
24
|
+
var_name = var_name.to_s
|
25
|
+
if setting = self.find_by_var(var_name)
|
26
|
+
setting.destroy
|
27
|
+
true
|
28
|
+
else
|
29
|
+
raise SettingNotFound, "Setting variable \"#{var_name}\" not found"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.all
|
34
|
+
Hash[super.collect{ |s| [s.var, s.value] }].merge(@@defaults)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/lib/setler/version.rb
CHANGED
data/lib/setler.rb
CHANGED
@@ -1,39 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require 'pp'
|
1
|
+
require 'active_record'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# Get and Set variables when the calling method is the variable name
|
13
|
-
def self.method_missing(method, *args)
|
14
|
-
method_name = method.to_s
|
15
|
-
super(method, *args)
|
16
|
-
|
17
|
-
rescue NoMethodError
|
18
|
-
if method_name =~ /=$/
|
19
|
-
self.find_or_create_by_var(method_name.gsub('=', '')).update_attribute(:value, args.first)
|
20
|
-
else
|
21
|
-
self.find_by_var(method_name).try(:value) || @@defaults[method_name]
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.destroy(var_name)
|
26
|
-
var_name = var_name.to_s
|
27
|
-
if setting = self.find_by_var(var_name)
|
28
|
-
setting.destroy
|
29
|
-
true
|
30
|
-
else
|
31
|
-
raise SettingNotFound, "Setting variable \"#{var_name}\" not found"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.all
|
36
|
-
Hash[super.collect{ |s| [s.var, s.value] }].merge(@@defaults)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
3
|
+
require_relative 'setler/version'
|
4
|
+
require_relative 'setler/exceptions'
|
5
|
+
require_relative 'setler/settings'
|
6
|
+
require_relative 'setler/scoped_settings'
|
7
|
+
require_relative 'setler/active_record'
|
8
|
+
|
9
|
+
::ActiveRecord::Base.extend Setler::ActiveRecord
|
data/setler.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Setler::VERSION
|
8
8
|
s.authors = ["Chris Kelly"]
|
9
9
|
s.email = ["ckdake@ckdake.com"]
|
10
|
-
s.homepage = ""
|
10
|
+
s.homepage = "https://github.com/ckdake/setler"
|
11
11
|
s.summary = %q{Settler lets you use the 'Feature Flags' pettern or add settings to models.}
|
12
12
|
s.description = %q{Setler is a Gem that lets one easily implement the "Feature Flags" pattern, or add settings to individual models. This is a cleanroom implementation of what the 'rails-settings' gem does. It's been forked all over the place, and my favorite version of it doesn't have any tests and doesn't work with settings associated with models.}
|
13
13
|
|
@@ -18,7 +18,10 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
|
+
s.add_dependency('activerecord', '>=3.0.0')
|
22
|
+
s.add_dependency('rails', '>=3.0.0')
|
23
|
+
|
21
24
|
s.add_development_dependency('sqlite3')
|
22
|
-
s.add_development_dependency('activerecord')
|
23
25
|
s.add_development_dependency('rake')
|
26
|
+
s.add_development_dependency('cover_me')
|
24
27
|
end
|
data/test/settings_test.rb
CHANGED
@@ -63,4 +63,36 @@ class Setler::SettingsTest < Test::Unit::TestCase
|
|
63
63
|
Setler::Settings.destroy :test
|
64
64
|
assert_nil Setler::Settings.test
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
|
+
def test_user_has_setler
|
68
|
+
user = User.create name: 'user 1'
|
69
|
+
assert_nil user.preferences.likes_bacon
|
70
|
+
user.preferences.likes_bacon = true
|
71
|
+
assert user.preferences.likes_bacon
|
72
|
+
user.preferences.destroy :likes_bacon
|
73
|
+
assert_nil user.preferences.likes_bacon
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_user_settings_all
|
77
|
+
user = User.create name: 'user 1'
|
78
|
+
assert_equal user.preferences.all, Setler::Settings.all
|
79
|
+
user.preferences.likes_bacon = true
|
80
|
+
user.preferences.really_likes_bacon = true
|
81
|
+
assert user.preferences.all['likes_bacon']
|
82
|
+
assert user.preferences.all['really_likes_bacon']
|
83
|
+
end
|
84
|
+
|
85
|
+
# def test_user_has_settings_for
|
86
|
+
# user1 = User.create name: 'awesome user'
|
87
|
+
# user2 = User.create name: 'bad user'
|
88
|
+
# user1.preferences.likes_bacon = true
|
89
|
+
# assert_equal 1, User.with_settings_for('likes_bacon').count
|
90
|
+
# assert_equal user1, User.with_settings_for('likes_bacon').first
|
91
|
+
# end
|
92
|
+
|
93
|
+
def test_destroy_when_setting_does_not_exist
|
94
|
+
assert_raise Setler::SettingNotFound do
|
95
|
+
Setler::Settings.destroy :not_a_setting
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'cover_me'
|
1
2
|
require 'rubygems'
|
2
3
|
|
3
4
|
require 'bundler'
|
@@ -12,13 +13,13 @@ end
|
|
12
13
|
require 'active_record'
|
13
14
|
require 'test/unit'
|
14
15
|
|
15
|
-
|
16
|
+
require_relative '../lib/setler'
|
16
17
|
|
17
18
|
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
class User < ActiveRecord::Base
|
21
|
+
has_setler :preferences
|
22
|
+
end
|
22
23
|
|
23
24
|
def setup_db
|
24
25
|
ActiveRecord::Schema.define(:version => 1) do
|
@@ -31,8 +32,8 @@ def setup_db
|
|
31
32
|
end
|
32
33
|
add_index :settings, [ :target_type, :target_id, :var ], :unique => true
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
create_table :users do |t|
|
36
|
+
t.string :name
|
37
|
+
end
|
37
38
|
end
|
38
|
-
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: setler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,33 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-08 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: &70243758967160 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70243758967160
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rails
|
27
|
+
requirement: &70243758966660 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.0.0
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70243758966660
|
14
36
|
- !ruby/object:Gem::Dependency
|
15
37
|
name: sqlite3
|
16
|
-
requirement: &
|
38
|
+
requirement: &70243758966280 !ruby/object:Gem::Requirement
|
17
39
|
none: false
|
18
40
|
requirements:
|
19
41
|
- - ! '>='
|
@@ -21,10 +43,10 @@ dependencies:
|
|
21
43
|
version: '0'
|
22
44
|
type: :development
|
23
45
|
prerelease: false
|
24
|
-
version_requirements: *
|
46
|
+
version_requirements: *70243758966280
|
25
47
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement: &
|
48
|
+
name: rake
|
49
|
+
requirement: &70243758965820 !ruby/object:Gem::Requirement
|
28
50
|
none: false
|
29
51
|
requirements:
|
30
52
|
- - ! '>='
|
@@ -32,10 +54,10 @@ dependencies:
|
|
32
54
|
version: '0'
|
33
55
|
type: :development
|
34
56
|
prerelease: false
|
35
|
-
version_requirements: *
|
57
|
+
version_requirements: *70243758965820
|
36
58
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement: &
|
59
|
+
name: cover_me
|
60
|
+
requirement: &70243758965400 !ruby/object:Gem::Requirement
|
39
61
|
none: false
|
40
62
|
requirements:
|
41
63
|
- - ! '>='
|
@@ -43,7 +65,7 @@ dependencies:
|
|
43
65
|
version: '0'
|
44
66
|
type: :development
|
45
67
|
prerelease: false
|
46
|
-
version_requirements: *
|
68
|
+
version_requirements: *70243758965400
|
47
69
|
description: Setler is a Gem that lets one easily implement the "Feature Flags" pattern,
|
48
70
|
or add settings to individual models. This is a cleanroom implementation of what
|
49
71
|
the 'rails-settings' gem does. It's been forked all over the place, and my favorite
|
@@ -65,11 +87,15 @@ files:
|
|
65
87
|
- lib/generators/setler/templates/migration.rb
|
66
88
|
- lib/generators/setler/templates/model.rb
|
67
89
|
- lib/setler.rb
|
90
|
+
- lib/setler/active_record.rb
|
91
|
+
- lib/setler/exceptions.rb
|
92
|
+
- lib/setler/scoped_settings.rb
|
93
|
+
- lib/setler/settings.rb
|
68
94
|
- lib/setler/version.rb
|
69
95
|
- setler.gemspec
|
70
96
|
- test/settings_test.rb
|
71
97
|
- test/test_helper.rb
|
72
|
-
homepage:
|
98
|
+
homepage: https://github.com/ckdake/setler
|
73
99
|
licenses: []
|
74
100
|
post_install_message:
|
75
101
|
rdoc_options: []
|