ledermann-rails-settings 1.0.1 → 1.1.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/.travis.yml +3 -3
- data/Changelog.md +13 -0
- data/MIT-LICENSE +1 -1
- data/README.md +7 -2
- data/ci/Gemfile.rails-3.0.x +1 -1
- data/ci/Gemfile.rails-3.1.x +1 -1
- data/ci/Gemfile.rails-3.2.x +5 -0
- data/lib/rails-settings.rb +4 -3
- data/lib/rails-settings/null_store.rb +48 -0
- data/lib/rails-settings/settings.rb +29 -9
- data/lib/rails-settings/version.rb +1 -1
- data/rails-settings.gemspec +2 -0
- data/test/settings_test.rb +28 -1
- metadata +36 -7
data/.travis.yml
CHANGED
data/Changelog.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Version 1.1.0 (2012-06-01)
|
2
|
+
|
3
|
+
- Added caching (thanks to Matthew McEachen)
|
4
|
+
|
5
|
+
Version 1.0.1 (2011-11-05)
|
6
|
+
|
7
|
+
- Gemspec: Fixed missing dependency
|
8
|
+
|
9
|
+
Version 1.0.0 (2011-11-05)
|
10
|
+
|
11
|
+
- Conversion from Plugin to Gem
|
12
|
+
- Destroying false values (thanks to @Pavling)
|
13
|
+
- Testing with Travis
|
data/MIT-LICENSE
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
Copyright (c) 2006 Alex Wayne
|
2
|
-
Some additional features added 2009-
|
2
|
+
Some additional features added 2009-2012 by Georg Ledermann
|
3
3
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
a copy of this software and associated documentation files (the
|
data/README.md
CHANGED
@@ -7,9 +7,9 @@ Settings is a gem/plugin that makes managing a table of key/value pairs easy. Th
|
|
7
7
|
|
8
8
|
## Requirements
|
9
9
|
|
10
|
-
|
10
|
+
Rails 2.3.x, 3.1.x or 3.2.x (due to an [issue with Rails caching](https://github.com/rails/rails/pull/2010) it does not work properly with Rails 3.0.x)
|
11
11
|
|
12
|
-
Tested with Ruby 1.8.7
|
12
|
+
Tested with Ruby 1.8.7 and 1.9.3
|
13
13
|
|
14
14
|
|
15
15
|
## Installation
|
@@ -132,4 +132,9 @@ I you want to find users having or not having some settings, there are named sco
|
|
132
132
|
User.without_settings('color')
|
133
133
|
# returns a scope of users having no 'color' setting (means user.settings.color == nil)
|
134
134
|
|
135
|
+
For better performance, you can enable caching, e.g.:
|
136
|
+
|
137
|
+
Settings.cache = ActiveSupport::Cache::MemoryStore.new
|
138
|
+
Settings.cache_options = { :expires_in => 5.minutes }
|
139
|
+
|
135
140
|
That's all there is to it! Enjoy!
|
data/ci/Gemfile.rails-3.0.x
CHANGED
data/ci/Gemfile.rails-3.1.x
CHANGED
data/lib/rails-settings.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require 'rails-settings/version'
|
2
|
-
require 'rails-settings/
|
3
|
-
require 'rails-settings/
|
1
|
+
require 'rails-settings/version'
|
2
|
+
require 'rails-settings/null_store'
|
3
|
+
require 'rails-settings/active_record'
|
4
|
+
require 'rails-settings/settings'
|
4
5
|
require 'rails-settings/scoped_settings'
|
@@ -0,0 +1,48 @@
|
|
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
|
@@ -2,11 +2,23 @@ class Settings < ActiveRecord::Base
|
|
2
2
|
class SettingNotFound < RuntimeError; end
|
3
3
|
|
4
4
|
cattr_accessor :defaults
|
5
|
-
|
6
|
-
|
5
|
+
self.defaults = {}.with_indifferent_access
|
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
|
+
|
7
19
|
# Support old plugin
|
8
20
|
if defined?(SettingsDefaults::DEFAULTS)
|
9
|
-
|
21
|
+
self.defaults = SettingsDefaults::DEFAULTS.with_indifferent_access
|
10
22
|
end
|
11
23
|
|
12
24
|
#get or set a variable with the variable as the called method
|
@@ -35,12 +47,18 @@ class Settings < ActiveRecord::Base
|
|
35
47
|
var_name = var_name.to_s
|
36
48
|
begin
|
37
49
|
target(var_name).destroy
|
50
|
+
cache.delete(cache_key(var_name))
|
38
51
|
true
|
39
52
|
rescue NoMethodError
|
40
53
|
raise SettingNotFound, "Setting variable \"#{var_name}\" not found"
|
41
54
|
end
|
42
55
|
end
|
43
56
|
|
57
|
+
def self.delete_all(conditions = nil)
|
58
|
+
cache.clear
|
59
|
+
super
|
60
|
+
end
|
61
|
+
|
44
62
|
#retrieve all settings as a hash (optionally starting with a given namespace)
|
45
63
|
def self.all(starting_with=nil)
|
46
64
|
options = starting_with ? { :conditions => "var LIKE '#{starting_with}%'"} : {}
|
@@ -55,10 +73,12 @@ class Settings < ActiveRecord::Base
|
|
55
73
|
|
56
74
|
#get a setting value by [] notation
|
57
75
|
def self.[](var_name)
|
58
|
-
|
59
|
-
var.
|
60
|
-
|
61
|
-
|
76
|
+
cache.fetch(cache_key(var_name), cache_options) do
|
77
|
+
if (var = target(var_name)).present?
|
78
|
+
var.value
|
79
|
+
else
|
80
|
+
defaults[var_name.to_s]
|
81
|
+
end
|
62
82
|
end
|
63
83
|
end
|
64
84
|
|
@@ -67,7 +87,7 @@ class Settings < ActiveRecord::Base
|
|
67
87
|
record = target_scoped.find_or_initialize_by_var(var_name.to_s)
|
68
88
|
record.value = value
|
69
89
|
record.save!
|
70
|
-
|
90
|
+
cache.write(cache_key(var_name), value, cache_options)
|
71
91
|
value
|
72
92
|
end
|
73
93
|
|
@@ -113,4 +133,4 @@ class Settings < ActiveRecord::Base
|
|
113
133
|
def self.target_type
|
114
134
|
nil
|
115
135
|
end
|
116
|
-
end
|
136
|
+
end
|
data/rails-settings.gemspec
CHANGED
data/test/settings_test.rb
CHANGED
@@ -9,6 +9,7 @@ class SettingsTest < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def teardown
|
12
|
+
User.delete_all
|
12
13
|
Settings.delete_all
|
13
14
|
end
|
14
15
|
|
@@ -23,6 +24,11 @@ class SettingsTest < Test::Unit::TestCase
|
|
23
24
|
assert_not_nil Settings.target(:foo)
|
24
25
|
end
|
25
26
|
|
27
|
+
def tests_defaults_true
|
28
|
+
Settings.defaults[:foo] = true
|
29
|
+
assert_equal true, Settings.foo
|
30
|
+
end
|
31
|
+
|
26
32
|
def tests_defaults_false
|
27
33
|
Settings.defaults[:foo] = false
|
28
34
|
assert_equal false, Settings.foo
|
@@ -183,4 +189,25 @@ class SettingsTest < Test::Unit::TestCase
|
|
183
189
|
assert_setting value, key
|
184
190
|
end
|
185
191
|
end
|
186
|
-
end
|
192
|
+
end
|
193
|
+
|
194
|
+
class CachedSettingsTest < SettingsTest
|
195
|
+
def setup
|
196
|
+
Settings.cache = ActiveSupport::Cache::MemoryStore.new
|
197
|
+
Settings.cache_options = { :expires_in => 5.minutes }
|
198
|
+
super
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_caching_is_in_place
|
202
|
+
Settings.progress = "boing"
|
203
|
+
Settings.connection.execute("delete from settings")
|
204
|
+
assert_equal "boing", Settings.progress
|
205
|
+
Settings.cache.clear
|
206
|
+
assert_nil Settings.progress
|
207
|
+
end
|
208
|
+
|
209
|
+
def teardown
|
210
|
+
Settings.cache.clear
|
211
|
+
super
|
212
|
+
end
|
213
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ledermann-rails-settings
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Georg Ledermann
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
19
|
-
default_executable:
|
18
|
+
date: 2012-06-01 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: activerecord
|
@@ -33,6 +32,34 @@ dependencies:
|
|
33
32
|
version: "2.3"
|
34
33
|
type: :runtime
|
35
34
|
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rake
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: sqlite3
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
36
63
|
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.
|
37
64
|
email:
|
38
65
|
- mail@georg-ledermann.de
|
@@ -45,6 +72,7 @@ extra_rdoc_files: []
|
|
45
72
|
files:
|
46
73
|
- .gitignore
|
47
74
|
- .travis.yml
|
75
|
+
- Changelog.md
|
48
76
|
- Gemfile
|
49
77
|
- MIT-LICENSE
|
50
78
|
- README.md
|
@@ -52,16 +80,17 @@ files:
|
|
52
80
|
- ci/Gemfile.rails-2.3.x
|
53
81
|
- ci/Gemfile.rails-3.0.x
|
54
82
|
- ci/Gemfile.rails-3.1.x
|
83
|
+
- ci/Gemfile.rails-3.2.x
|
55
84
|
- init.rb
|
56
85
|
- lib/rails-settings.rb
|
57
86
|
- lib/rails-settings/active_record.rb
|
87
|
+
- lib/rails-settings/null_store.rb
|
58
88
|
- lib/rails-settings/scoped_settings.rb
|
59
89
|
- lib/rails-settings/settings.rb
|
60
90
|
- lib/rails-settings/version.rb
|
61
91
|
- rails-settings.gemspec
|
62
92
|
- test/settings_test.rb
|
63
93
|
- test/test_helper.rb
|
64
|
-
has_rdoc: true
|
65
94
|
homepage: https://github.com/ledermann/rails-settings
|
66
95
|
licenses: []
|
67
96
|
|
@@ -91,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
120
|
requirements: []
|
92
121
|
|
93
122
|
rubyforge_project: ledermann-rails-settings
|
94
|
-
rubygems_version: 1.
|
123
|
+
rubygems_version: 1.8.24
|
95
124
|
signing_key:
|
96
125
|
specification_version: 3
|
97
126
|
summary: Settings management for ActiveRecord objects
|