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 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