ledermann-rails-settings 1.2.0 → 1.2.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/Changelog.md +10 -0
- data/README.md +0 -5
- data/lib/rails-settings.rb +0 -1
- data/lib/rails-settings/scoped_settings.rb +8 -2
- data/lib/rails-settings/settings.rb +15 -36
- data/lib/rails-settings/version.rb +1 -1
- data/rails-settings.gemspec +3 -4
- data/test/settings_test.rb +30 -24
- data/test/test_helper.rb +0 -4
- metadata +90 -98
- data/lib/rails-settings/null_store.rb +0 -48
data/Changelog.md
CHANGED
@@ -1,15 +1,25 @@
|
|
1
|
+
Version 1.2.1 (2013-02-09)
|
2
|
+
|
3
|
+
- Quick and dirty fix for design flaw in target scope implementation (thanks to Yves-Eric Martin)
|
4
|
+
- Use Thread.current instead of cattr_accessor to be threadsafe
|
5
|
+
- Code cleanup
|
6
|
+
|
7
|
+
|
1
8
|
Version 1.2.0 (2012-07-21)
|
2
9
|
|
3
10
|
- Added model-level settings (thanks to Jim Ryan)
|
4
11
|
|
12
|
+
|
5
13
|
Version 1.1.0 (2012-06-01)
|
6
14
|
|
7
15
|
- Added caching (thanks to Matthew McEachen)
|
8
16
|
|
17
|
+
|
9
18
|
Version 1.0.1 (2011-11-05)
|
10
19
|
|
11
20
|
- Gemspec: Fixed missing dependency
|
12
21
|
|
22
|
+
|
13
23
|
Version 1.0.0 (2011-11-05)
|
14
24
|
|
15
25
|
- Conversion from Plugin to Gem
|
data/README.md
CHANGED
@@ -150,9 +150,4 @@ I you want to find users having or not having some settings, there are named sco
|
|
150
150
|
User.without_settings('color')
|
151
151
|
# returns a scope of users having no 'color' setting (means user.settings.color == nil)
|
152
152
|
|
153
|
-
For better performance, you can enable caching, e.g.:
|
154
|
-
|
155
|
-
Settings.cache = ActiveSupport::Cache::MemoryStore.new
|
156
|
-
Settings.cache_options = { :expires_in => 5.minutes }
|
157
|
-
|
158
153
|
That's all there is to it! Enjoy!
|
data/lib/rails-settings.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
class ScopedSettings < Settings
|
2
|
+
|
3
|
+
@klasses = {}
|
4
|
+
|
2
5
|
def self.for_target(target)
|
3
|
-
@target
|
4
|
-
|
6
|
+
@klasses[target] ||= self.dup.instance_eval do
|
7
|
+
def name; "ScopedSettings"; end # Required by ActiveModel::Naming
|
8
|
+
@target = target
|
9
|
+
self
|
10
|
+
end
|
5
11
|
end
|
6
12
|
|
7
13
|
def self.target_id
|
@@ -1,26 +1,14 @@
|
|
1
1
|
class Settings < ActiveRecord::Base
|
2
2
|
class SettingNotFound < RuntimeError; end
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# cache must follow the contract of ActiveSupport::Cache. Defaults to no-op.
|
8
|
-
cattr_accessor :cache
|
9
|
-
self.cache = ActiveSupport::Cache::NullStore.new
|
10
|
-
|
11
|
-
# options passed to cache.fetch() and cache.write(). example: {:expires_in => 5.minutes}
|
12
|
-
cattr_accessor :cache_options
|
13
|
-
self.cache_options = {}
|
14
|
-
|
15
|
-
def self.cache_key(var_name)
|
16
|
-
[target_id, target_type, var_name].compact.join("::")
|
17
|
-
end
|
18
|
-
|
19
|
-
# Support old plugin
|
20
|
-
if defined?(SettingsDefaults::DEFAULTS)
|
21
|
-
self.defaults = SettingsDefaults::DEFAULTS.with_indifferent_access
|
4
|
+
def self.defaults
|
5
|
+
Thread.current[:rails_settings_defaults] ||= {}.with_indifferent_access
|
22
6
|
end
|
23
7
|
|
8
|
+
def self.defaults=(value)
|
9
|
+
Thread.current[:rails_settings_defaults] = value
|
10
|
+
end
|
11
|
+
|
24
12
|
#get or set a variable with the variable as the called method
|
25
13
|
def self.method_missing(method, *args)
|
26
14
|
if self.respond_to?(method)
|
@@ -47,18 +35,12 @@ class Settings < ActiveRecord::Base
|
|
47
35
|
var_name = var_name.to_s
|
48
36
|
begin
|
49
37
|
target(var_name).destroy
|
50
|
-
cache.delete(cache_key(var_name))
|
51
38
|
true
|
52
39
|
rescue NoMethodError
|
53
40
|
raise SettingNotFound, "Setting variable \"#{var_name}\" not found"
|
54
41
|
end
|
55
42
|
end
|
56
43
|
|
57
|
-
def self.delete_all(conditions = nil)
|
58
|
-
cache.clear
|
59
|
-
super
|
60
|
-
end
|
61
|
-
|
62
44
|
#retrieve all settings as a hash (optionally starting with a given namespace)
|
63
45
|
def self.all(starting_with=nil)
|
64
46
|
options = starting_with ? { :conditions => "var LIKE '#{starting_with}%'"} : {}
|
@@ -68,22 +50,20 @@ class Settings < ActiveRecord::Base
|
|
68
50
|
vars.each do |record|
|
69
51
|
result[record.var] = record.value
|
70
52
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
53
|
+
selected_defaults = defaults.select{ |k, v| k =~ /^#{starting_with}/ }
|
54
|
+
selected_defaults = Hash[selected_defaults] if selected_defaults.is_a?(Array)
|
55
|
+
selected_defaults.merge(result).with_indifferent_access
|
74
56
|
end
|
75
57
|
|
76
58
|
#get a setting value by [] notation
|
77
59
|
def self.[](var_name)
|
78
|
-
|
79
|
-
|
80
|
-
|
60
|
+
if var = target(var_name)
|
61
|
+
var.value
|
62
|
+
else
|
63
|
+
if target_id.nil?
|
64
|
+
defaults[var_name.to_s]
|
81
65
|
else
|
82
|
-
|
83
|
-
@@defaults[var_name.to_s]
|
84
|
-
else
|
85
|
-
target_type.constantize.settings[var_name.to_s]
|
86
|
-
end
|
66
|
+
target_type.constantize.settings[var_name.to_s]
|
87
67
|
end
|
88
68
|
end
|
89
69
|
end
|
@@ -93,7 +73,6 @@ class Settings < ActiveRecord::Base
|
|
93
73
|
record = target_scoped.find_or_initialize_by_var(var_name.to_s)
|
94
74
|
record.value = value
|
95
75
|
record.save!
|
96
|
-
cache.write(cache_key(var_name), value, cache_options)
|
97
76
|
value
|
98
77
|
end
|
99
78
|
|
data/rails-settings.gemspec
CHANGED
@@ -18,11 +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
|
-
# specify any dependencies here; for example:
|
22
|
-
s.add_development_dependency "rake"
|
23
|
-
s.add_development_dependency "sqlite3"
|
24
|
-
# s.add_runtime_dependency "rest-client"
|
25
21
|
s.add_dependency 'activerecord', '>= 2.3'
|
22
|
+
|
23
|
+
s.add_development_dependency 'rake'
|
24
|
+
s.add_development_dependency 'sqlite3'
|
26
25
|
s.add_development_dependency 'rake'
|
27
26
|
s.add_development_dependency 'sqlite3'
|
28
27
|
end
|
data/test/settings_test.rb
CHANGED
@@ -78,13 +78,25 @@ class SettingsTest < Test::Unit::TestCase
|
|
78
78
|
|
79
79
|
assert_setting nil, :two, user1
|
80
80
|
assert_setting nil, :one, user2
|
81
|
-
|
81
|
+
|
82
82
|
assert_equal({ "one" => 1}, user1.settings.all('one'))
|
83
83
|
assert_equal({ "two" => 2}, user2.settings.all('two'))
|
84
84
|
assert_equal({ "one" => 1}, user1.settings.all('o'))
|
85
85
|
assert_equal({}, user1.settings.all('non_existing_var'))
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
|
+
def test_target_scope_is_instance_safe
|
89
|
+
user1 = User.create! :name => 'First user'
|
90
|
+
user2 = User.create! :name => 'Second user'
|
91
|
+
|
92
|
+
assert_assign_setting 'Foo one', :foo, user1
|
93
|
+
assert_assign_setting 'Foo two', :foo, user2
|
94
|
+
|
95
|
+
settings_1 = user1.settings
|
96
|
+
settings_2 = user2.settings
|
97
|
+
assert_equal 'Foo one', settings_1.foo
|
98
|
+
end
|
99
|
+
|
88
100
|
def test_named_scope
|
89
101
|
user_without_settings = User.create! :name => 'User without settings'
|
90
102
|
user_with_settings = User.create! :name => 'User with settings'
|
@@ -141,6 +153,13 @@ class SettingsTest < Test::Unit::TestCase
|
|
141
153
|
assert_equal({ :two => 2 }, Settings[:empty_hash])
|
142
154
|
end
|
143
155
|
|
156
|
+
def test_association_merge
|
157
|
+
user = User.create! :name => 'Mr. Foo'
|
158
|
+
user.settings.merge! :foo, { :one => 1, :two => 2}
|
159
|
+
|
160
|
+
assert_equal({:one => 1, :two => 2}, user.settings.foo)
|
161
|
+
end
|
162
|
+
|
144
163
|
def test_destroy
|
145
164
|
Settings.destroy :test
|
146
165
|
assert_equal nil, Settings.test
|
@@ -193,6 +212,14 @@ class SettingsTest < Test::Unit::TestCase
|
|
193
212
|
user = User.create! :name => 'Mr. Foo'
|
194
213
|
assert_equal({ 'foo' => 'bar' }, user.settings.all)
|
195
214
|
end
|
215
|
+
|
216
|
+
def test_issue_18
|
217
|
+
Settings.one = 'value1'
|
218
|
+
User.settings.two = 'value2'
|
219
|
+
|
220
|
+
assert_equal({'two' => 'value2'}, User.settings.all)
|
221
|
+
end
|
222
|
+
|
196
223
|
|
197
224
|
private
|
198
225
|
def assert_setting(value, key, scope_target=nil)
|
@@ -228,25 +255,4 @@ class SettingsTest < Test::Unit::TestCase
|
|
228
255
|
assert_setting value, key
|
229
256
|
end
|
230
257
|
end
|
231
|
-
end
|
232
|
-
|
233
|
-
class CachedSettingsTest < SettingsTest
|
234
|
-
def setup
|
235
|
-
Settings.cache = ActiveSupport::Cache::MemoryStore.new
|
236
|
-
Settings.cache_options = { :expires_in => 5.minutes }
|
237
|
-
super
|
238
|
-
end
|
239
|
-
|
240
|
-
def test_caching_is_in_place
|
241
|
-
Settings.progress = "boing"
|
242
|
-
Settings.connection.execute("delete from settings")
|
243
|
-
assert_equal "boing", Settings.progress
|
244
|
-
Settings.cache.clear
|
245
|
-
assert_nil Settings.progress
|
246
|
-
end
|
247
|
-
|
248
|
-
def teardown
|
249
|
-
Settings.cache.clear
|
250
|
-
super
|
251
|
-
end
|
252
|
-
end
|
258
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,103 +1,105 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ledermann-rails-settings
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
hash: 31
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 1
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 1.2.0
|
5
|
+
version: 1.2.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Georg Ledermann
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
21
|
-
name: rake
|
12
|
+
date: 2013-02-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
prerelease: false
|
23
|
-
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ! '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '2.3'
|
21
|
+
none: false
|
22
|
+
type: :runtime
|
23
|
+
name: activerecord
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ! '>='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '2.3'
|
29
|
+
none: false
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
prerelease: false
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ! '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
24
37
|
none: false
|
25
|
-
requirements:
|
26
|
-
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 3
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
32
38
|
type: :development
|
33
|
-
|
34
|
-
|
35
|
-
|
39
|
+
name: rake
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
none: false
|
46
|
+
- !ruby/object:Gem::Dependency
|
36
47
|
prerelease: false
|
37
|
-
|
48
|
+
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
38
53
|
none: false
|
39
|
-
requirements:
|
40
|
-
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
hash: 3
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
46
54
|
type: :development
|
47
|
-
|
48
|
-
|
49
|
-
|
55
|
+
name: sqlite3
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
none: false
|
62
|
+
- !ruby/object:Gem::Dependency
|
50
63
|
prerelease: false
|
51
|
-
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
52
69
|
none: false
|
53
|
-
|
54
|
-
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
hash: 5
|
57
|
-
segments:
|
58
|
-
- 2
|
59
|
-
- 3
|
60
|
-
version: "2.3"
|
61
|
-
type: :runtime
|
62
|
-
version_requirements: *id003
|
63
|
-
- !ruby/object:Gem::Dependency
|
70
|
+
type: :development
|
64
71
|
name: rake
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
none: false
|
78
|
+
- !ruby/object:Gem::Dependency
|
65
79
|
prerelease: false
|
66
|
-
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
67
85
|
none: false
|
68
|
-
requirements:
|
69
|
-
- - ">="
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
hash: 3
|
72
|
-
segments:
|
73
|
-
- 0
|
74
|
-
version: "0"
|
75
86
|
type: :development
|
76
|
-
version_requirements: *id004
|
77
|
-
- !ruby/object:Gem::Dependency
|
78
87
|
name: sqlite3
|
79
|
-
|
80
|
-
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
81
93
|
none: false
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
segments:
|
87
|
-
- 0
|
88
|
-
version: "0"
|
89
|
-
type: :development
|
90
|
-
version_requirements: *id005
|
91
|
-
description: Ruby Gem that makes managing a table of key/value pairs easy. Think of it like a Hash stored in you database, that uses simple ActiveRecord like methods for manipulation.
|
92
|
-
email:
|
94
|
+
description: Ruby Gem that makes managing a table of key/value pairs easy. Think of
|
95
|
+
it like a Hash stored in you database, that uses simple ActiveRecord like methods
|
96
|
+
for manipulation.
|
97
|
+
email:
|
93
98
|
- mail@georg-ledermann.de
|
94
99
|
executables: []
|
95
|
-
|
96
100
|
extensions: []
|
97
|
-
|
98
101
|
extra_rdoc_files: []
|
99
|
-
|
100
|
-
files:
|
102
|
+
files:
|
101
103
|
- .gitignore
|
102
104
|
- .travis.yml
|
103
105
|
- Changelog.md
|
@@ -112,7 +114,6 @@ files:
|
|
112
114
|
- init.rb
|
113
115
|
- lib/rails-settings.rb
|
114
116
|
- lib/rails-settings/active_record.rb
|
115
|
-
- lib/rails-settings/null_store.rb
|
116
117
|
- lib/rails-settings/scoped_settings.rb
|
117
118
|
- lib/rails-settings/settings.rb
|
118
119
|
- lib/rails-settings/version.rb
|
@@ -121,37 +122,28 @@ files:
|
|
121
122
|
- test/test_helper.rb
|
122
123
|
homepage: https://github.com/ledermann/rails-settings
|
123
124
|
licenses: []
|
124
|
-
|
125
125
|
post_install_message:
|
126
126
|
rdoc_options: []
|
127
|
-
|
128
|
-
require_paths:
|
127
|
+
require_paths:
|
129
128
|
- lib
|
130
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
129
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
131
134
|
none: false
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
- 0
|
138
|
-
version: "0"
|
139
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ! '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
140
|
none: false
|
141
|
-
requirements:
|
142
|
-
- - ">="
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
hash: 3
|
145
|
-
segments:
|
146
|
-
- 0
|
147
|
-
version: "0"
|
148
141
|
requirements: []
|
149
|
-
|
150
142
|
rubyforge_project: ledermann-rails-settings
|
151
|
-
rubygems_version: 1.8.
|
143
|
+
rubygems_version: 1.8.25
|
152
144
|
signing_key:
|
153
145
|
specification_version: 3
|
154
146
|
summary: Settings management for ActiveRecord objects
|
155
|
-
test_files:
|
147
|
+
test_files:
|
156
148
|
- test/settings_test.rb
|
157
149
|
- test/test_helper.rb
|
@@ -1,48 +0,0 @@
|
|
1
|
-
unless defined?(ActiveSupport::Cache::NullStore)
|
2
|
-
# Copied from Rails 3
|
3
|
-
# https://github.com/rails/rails/blob/master/activesupport/lib/active_support/cache/null_store.rb
|
4
|
-
module ActiveSupport
|
5
|
-
module Cache
|
6
|
-
# A cache store implementation which doesn't actually store anything. Useful in
|
7
|
-
# development and test environments where you don't want caching turned on but
|
8
|
-
# need to go through the caching interface.
|
9
|
-
#
|
10
|
-
# This cache does implement the local cache strategy, so values will actually
|
11
|
-
# be cached inside blocks that utilize this strategy. See
|
12
|
-
# ActiveSupport::Cache::Strategy::LocalCache for more details.
|
13
|
-
class NullStore < Store
|
14
|
-
def initialize(options = nil)
|
15
|
-
super()
|
16
|
-
extend Strategy::LocalCache
|
17
|
-
end
|
18
|
-
|
19
|
-
def clear(options = nil)
|
20
|
-
end
|
21
|
-
|
22
|
-
def cleanup(options = nil)
|
23
|
-
end
|
24
|
-
|
25
|
-
def increment(name, amount = 1, options = nil)
|
26
|
-
end
|
27
|
-
|
28
|
-
def decrement(name, amount = 1, options = nil)
|
29
|
-
end
|
30
|
-
|
31
|
-
def delete_matched(matcher, options = nil)
|
32
|
-
end
|
33
|
-
|
34
|
-
protected
|
35
|
-
def read_entry(key, options) # :nodoc:
|
36
|
-
end
|
37
|
-
|
38
|
-
def write_entry(key, entry, options) # :nodoc:
|
39
|
-
true
|
40
|
-
end
|
41
|
-
|
42
|
-
def delete_entry(key, options) # :nodoc:
|
43
|
-
false
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|