has_setting 0.4.6 → 0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/help/001_create_settings.rb +1 -0
- data/lib/has_setting/ar_extensions.rb +28 -27
- data/lib/has_setting/version.rb +1 -1
- data/lib/has_setting.rb +4 -3
- data/test/test_helper.rb +1 -2
- data/test/unit/has_setting_test.rb +11 -1
- metadata +1 -1
data/help/001_create_settings.rb
CHANGED
@@ -1,26 +1,13 @@
|
|
1
1
|
module HasSetting
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
# find an existing setting or build a new one
|
6
|
-
setting = self.settings.detect() {|item| item.name == name }
|
7
|
-
setting = self.settings.build(:name => name) if setting.blank?
|
8
|
-
setting.value = value
|
9
|
-
end
|
10
|
-
|
11
|
-
def read_setting(name)
|
12
|
-
# use detect instead of SQL find. like this the 'cached' has_many-collection is inited
|
13
|
-
# only once
|
14
|
-
self.settings.detect() {|item| item.name == name }
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
2
|
+
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
18
5
|
module ClassMethods
|
19
6
|
# Setup of the getter/setter
|
20
7
|
def has_setting(name, options = {})
|
21
8
|
name = name.to_s
|
22
9
|
raise ArgumentError.new('Setting name must not be blank') if name.blank?
|
23
|
-
|
10
|
+
|
24
11
|
self.class_eval do
|
25
12
|
unless @has_setting_options # define only once
|
26
13
|
# AR association to settings
|
@@ -31,7 +18,7 @@ module HasSetting
|
|
31
18
|
def self.has_setting_options
|
32
19
|
@has_setting_options
|
33
20
|
end
|
34
|
-
|
21
|
+
|
35
22
|
private
|
36
23
|
# Callback to save settings
|
37
24
|
def save_has_setting_association
|
@@ -41,30 +28,44 @@ module HasSetting
|
|
41
28
|
end
|
42
29
|
end
|
43
30
|
end
|
44
|
-
|
45
|
-
|
31
|
+
|
46
32
|
raise ArgumentError.new("Setting #{name }is already defined on #{self.name}") if self.has_setting_options.has_key?(name)
|
47
|
-
|
33
|
+
|
48
34
|
# default options
|
49
|
-
options[:type]
|
35
|
+
type = options[:type] || :string # treat as string
|
50
36
|
# default could be false, thats why we use has_key?
|
51
|
-
options[:default]
|
37
|
+
default = options[:default] || (options.has_key?(:default) ? options[:default] : nil) # no default
|
52
38
|
self.has_setting_options[name] = options
|
53
|
-
|
39
|
+
|
54
40
|
# setter
|
55
41
|
define_method("#{name}=".intern) do |value|
|
56
|
-
formatter = HasSetting::Formatters.for_type(
|
42
|
+
formatter = HasSetting::Formatters.for_type(type)
|
57
43
|
write_setting(name, formatter.to_s(value))
|
58
44
|
end
|
59
|
-
|
45
|
+
|
60
46
|
# getter
|
61
47
|
define_method(name) do |*args|
|
62
48
|
setting = read_setting(name)
|
63
49
|
options = args.first || self.class.has_setting_options[name]
|
64
50
|
return options[:default] if setting.nil?
|
65
|
-
formatter = Formatters.for_type(options[:type])
|
51
|
+
formatter = Formatters.for_type(options[:type] || type)
|
66
52
|
formatter.to_type(setting.value)
|
67
53
|
end
|
68
54
|
end
|
69
55
|
end
|
56
|
+
|
57
|
+
def write_setting(name, value)
|
58
|
+
# find an existing setting or build a new one
|
59
|
+
setting = self.settings.detect() {|item| item.name == name and item.locale.to_s == I18n.locale.to_s }
|
60
|
+
setting = self.settings.build(:name => name, locale: I18n.locale.to_s) if setting.blank?
|
61
|
+
setting.value = value
|
62
|
+
end
|
63
|
+
|
64
|
+
def read_setting(name)
|
65
|
+
# use detect instead of SQL find. like this the 'cached' has_many-collection is inited
|
66
|
+
# only once
|
67
|
+
s = self.settings.detect() {|item| item.name == name and item.locale.to_s == I18n.locale.to_s} # first see if there is a setting with current locale
|
68
|
+
s ||= self.settings.detect() {|item| item.name == name} # then if not found, take the first setting with matching name (TODO: add locale fallbacks)
|
69
|
+
s
|
70
|
+
end
|
70
71
|
end
|
data/lib/has_setting/version.rb
CHANGED
data/lib/has_setting.rb
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
require File.dirname(__FILE__) + '/has_setting/ar_extensions'
|
3
3
|
require File.dirname(__FILE__) + '/has_setting/formatters'
|
4
4
|
require File.dirname(__FILE__) + '/has_setting/setting'
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
|
6
|
+
|
7
|
+
ActiveSupport.on_load(:active_record) do
|
8
|
+
include HasSetting
|
8
9
|
end
|
9
10
|
|
10
11
|
|
data/test/test_helper.rb
CHANGED
@@ -23,13 +23,12 @@ ActiveRecord::Base.connection.create_table(:settings) do |table|
|
|
23
23
|
table.string(:name, :limit => 64, :null => false)
|
24
24
|
table.string(:owner_type, :limit => 255, :null => false)
|
25
25
|
table.integer(:owner_id, :null => false)
|
26
|
+
table.string(:locale)
|
26
27
|
end
|
27
28
|
[:foos, :bars, :bazs].each do |table|
|
28
29
|
ActiveRecord::Base.connection.create_table(table) do |t|
|
29
30
|
end
|
30
31
|
end
|
31
|
-
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
32
|
-
ActiveRecord::Base.logger.level = Logger::DEBUG # change to DEBUG if you want to see something :-)
|
33
32
|
|
34
33
|
require File.join(File.dirname(__FILE__), 'foo')
|
35
34
|
require File.join(File.dirname(__FILE__), 'bar')
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../test_helper'
|
2
2
|
|
3
3
|
class HasSettingTest < Test::Unit::TestCase
|
4
|
-
def setup
|
4
|
+
def setup
|
5
5
|
@foo = Foo.create!
|
6
6
|
@bar = Bar.create!
|
7
7
|
@baz = Baz.create!
|
@@ -143,6 +143,16 @@ class HasSettingTest < Test::Unit::TestCase
|
|
143
143
|
@foo.setting_4 = false
|
144
144
|
assert_equal false, @foo.setting_4
|
145
145
|
end
|
146
|
+
|
147
|
+
def test_locale_awareness
|
148
|
+
I18n.locale = :de
|
149
|
+
@bar.setting_1 = 'setting de'
|
150
|
+
I18n.locale = 'de-CH'
|
151
|
+
@bar.setting_1 = 'setting ch'
|
152
|
+
assert_equal 'setting ch', @bar.setting_1
|
153
|
+
I18n.locale = :de
|
154
|
+
assert_equal 'setting de', @bar.setting_1
|
155
|
+
end
|
146
156
|
|
147
157
|
|
148
158
|
end
|