ledermann-rails-settings 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
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!
@@ -1,5 +1,4 @@
1
1
  require 'rails-settings/version'
2
- require 'rails-settings/null_store'
3
2
  require 'rails-settings/active_record'
4
3
  require 'rails-settings/settings'
5
4
  require 'rails-settings/scoped_settings'
@@ -1,7 +1,13 @@
1
1
  class ScopedSettings < Settings
2
+
3
+ @klasses = {}
4
+
2
5
  def self.for_target(target)
3
- @target = target
4
- self
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
- cattr_accessor :defaults
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
-
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
- defaults = @@defaults.select{ |k, v| k =~ /^#{starting_with}/ }
72
- defaults = Hash[defaults] if defaults.is_a?(Array)
73
- defaults.merge(result).with_indifferent_access
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
- cache.fetch(cache_key(var_name), cache_options) do
79
- if var = target(var_name)
80
- var.value
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
- if target_id.nil?
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
 
@@ -1,3 +1,3 @@
1
1
  module RailsSettings
2
- VERSION = '1.2.0'
2
+ VERSION = '1.2.1'
3
3
  end
@@ -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
@@ -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
@@ -1,7 +1,3 @@
1
- require 'rubygems'
2
-
3
- require 'active_support'
4
- require 'active_support/test_case'
5
1
  require 'active_record'
6
2
  require 'test/unit'
7
3
 
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
- segments:
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
- date: 2012-07-21 00:00:00 Z
19
- dependencies:
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
- requirement: &id001 !ruby/object:Gem::Requirement
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
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: sqlite3
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: activerecord
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
- requirement: &id003 !ruby/object:Gem::Requirement
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
52
69
  none: false
53
- requirements:
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
- requirement: &id004 !ruby/object:Gem::Requirement
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
- prerelease: false
80
- requirement: &id005 !ruby/object:Gem::Requirement
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
81
93
  none: false
82
- requirements:
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- hash: 3
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
- requirements:
133
- - - ">="
134
- - !ruby/object:Gem::Version
135
- hash: 3
136
- segments:
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.24
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