rails_admin_settings 0.5.5 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +2 -1
  4. data/CHANGELOG.md +11 -0
  5. data/app/models/rails_admin_settings/setting.rb +27 -5
  6. data/app/views/rails_admin/main/_setting_value.html.haml +1 -1
  7. data/config/locales/{en.rails_admin_settings.yml → en.yml} +0 -0
  8. data/config/locales/{ru.rails_admin_settings.yml → ru.yml} +20 -20
  9. data/lib/rails_admin_settings/dumper.rb +12 -0
  10. data/lib/rails_admin_settings/engine.rb +3 -0
  11. data/lib/rails_admin_settings/fallback.rb +19 -0
  12. data/lib/rails_admin_settings/hex_color_validator.rb +1 -1
  13. data/lib/rails_admin_settings/namespaced.rb +201 -0
  14. data/lib/rails_admin_settings/rails_admin_config.rb +3 -6
  15. data/lib/rails_admin_settings/railtie.rb +7 -0
  16. data/lib/rails_admin_settings/settings.rb +63 -165
  17. data/lib/rails_admin_settings/tasks.rb +25 -0
  18. data/lib/rails_admin_settings/types.rb +15 -1
  19. data/lib/rails_admin_settings/validation.rb +2 -4
  20. data/lib/rails_admin_settings/version.rb +1 -1
  21. data/lib/rails_admin_settings.rb +4 -0
  22. data/rails_admin_settings.gemspec +8 -7
  23. data/spec/carrierwave_spec.rb +7 -2
  24. data/spec/database_trickery_spec.rb +5 -7
  25. data/spec/defaults_spec.rb +53 -0
  26. data/spec/enabling_spec.rb +29 -0
  27. data/spec/label_spec.rb +2 -2
  28. data/spec/namespaced_spec.rb +41 -0
  29. data/spec/paperclip_spec.rb +5 -0
  30. data/spec/settings_spec.rb +13 -4
  31. data/spec/spec_helper.rb +4 -0
  32. data/spec/support/defaults.yml +15 -0
  33. data/spec/support/defaults_w_file.yml +19 -0
  34. data/spec/support/mongoid.yml +1 -1
  35. data/spec/types_spec.rb +12 -9
  36. metadata +49 -19
@@ -1,208 +1,106 @@
1
1
  require 'thread'
2
2
 
3
- class Settings
4
- cattr_accessor :file_uploads_supported, :file_uploads_engine, :settings
3
+ # we are inheriting from BasicObject so we don't get a bunch of methods from
4
+ # Kernel or Object
5
+ class Settings < BasicObject
6
+ cattr_accessor :file_uploads_supported, :file_uploads_engine
5
7
  @@file_uploads_supported = false
6
8
  @@file_uploads_engine = false
7
- @@mutex = Mutex.new
9
+ @@namespaces = {}
10
+ @@mutex = ::Mutex.new
8
11
 
9
12
  class << self
10
- @@loaded = false
11
- @@settings = {}
12
-
13
- def load!
14
- @@mutex.synchronize do
15
- if @@loaded
16
- false
17
- else
18
- @@settings = {}
19
- RailsAdminSettings::Setting.all.each do |setting|
20
- @@settings[setting.key] = setting
21
- end
22
- @@loaded = true
23
- true
24
- end
25
- end
26
- end
27
-
28
- def unload!
29
- @@mutex.synchronize do
30
- if @@loaded
31
- @@settings = {}
32
- @@loaded = false
33
- true
34
- else
35
- false
36
- end
37
- end
38
- end
39
-
40
- # returns processed setting value
41
- def method_missing(key, *args)
42
- key = key.to_s
43
-
44
- if key[-1] == '='
45
- key = key[0..-2]
46
- options = args[1] || {}
47
- value = args.first
48
- set(key, value, options).val
49
- else
50
- get(key, args.first || {}).val
51
- end
52
- end
53
-
54
- def set(key, value = nil, options = {})
55
- load!
56
- key = key.to_s
13
+ def ns(name, options = {})
57
14
  options.symbolize_keys!
58
-
59
-
60
- if !options[:type].nil? && options[:type] == 'yaml' && !value.nil? && !valid_yaml?(value)
61
- value = value.to_yaml
62
- end
63
-
64
- is_file = !options[:type].nil? && (options[:type] == 'image' || options[:type] == 'file')
65
- if is_file
66
- options[:raw] = ''
15
+ if name.nil?
16
+ name = 'main'
67
17
  else
68
- options[:raw] = value
18
+ name = name.to_s
69
19
  end
70
-
71
- if @@settings[key].nil?
72
- write_to_database(key, options.merge(key: key))
73
- else
74
- @@mutex.synchronize do
75
- @@settings[key].update_attributes!(options)
76
- end
20
+ @@mutex.synchronize do
21
+ @@namespaces[name] ||= ::RailsAdminSettings::Namespaced.new(name.to_s)
77
22
  end
78
-
79
- if is_file
80
- @@mutex.synchronize do
81
- @@settings[key].file = value
82
- @@settings[key].save!
83
- end
23
+ if options[:fallback].nil?
24
+ @@namespaces[name]
25
+ else
26
+ ::RailsAdminSettings::Fallback.new(@@namespaces[name], options[:fallback])
84
27
  end
85
-
86
- @@settings[key]
87
28
  end
88
29
 
89
- def valid_yaml?(value)
90
- begin
91
- YAML.safe_load(value)
92
- rescue LoadError => e
93
- e.message << " [rails_admin_settings] Please add gem 'safe_yaml' to your Gemfile to use yaml settings"
94
- raise e
95
- rescue Psych::SyntaxError => e
96
- return false
30
+ def unload!
31
+ @@mutex.synchronize do
32
+ @@namespaces.values.map(&:unload!)
33
+ @@namespaces = {}
97
34
  end
98
35
  end
99
36
 
100
- def enabled?(key, options = {})
101
- get(key, options).enabled?
37
+ def destroy_all!
38
+ RailsAdminSettings::Setting.destroy_all
39
+ unload!
102
40
  end
103
41
 
104
- # returns setting object
105
- def get(key, options = {})
106
- load!
107
- key = key.to_s
108
- if @@settings[key].nil?
109
- create_setting(key, options)
42
+ def root_file_path
43
+ if Object.const_defined?('Rails')
44
+ Rails.root
110
45
  else
111
- @@settings[key]
46
+ Pathname.new(File.dirname(__FILE__)).join('../..')
112
47
  end
113
48
  end
114
49
 
115
- def []=(key, value)
116
- set(key, value)
117
- end
118
-
119
- def [](key)
120
- get(key)
121
- end
122
-
123
- def save_default(key, value, options = {})
124
- load!
125
- key = key.to_s
126
- options.merge!(default: value)
127
-
128
- if @@settings[key].nil?
129
- create_setting(key, options).val
130
- else
131
- if @@settings[key].blank?
132
- set(key, value).val
133
- else
134
- @@settings[key].val
50
+ def apply_defaults!(file)
51
+ if File.file?(file)
52
+ yaml = YAML.load(File.read(file), safe: true)
53
+ yaml.each_pair do |namespace, vals|
54
+ vals.symbolize_keys!
55
+ n = ns(namespace)
56
+ vals.each_pair do |key, val|
57
+ val.symbolize_keys!
58
+ if !val[:type].nil? && (val[:type] == 'file' || val[:type] == 'image')
59
+ unless @@file_uploads_supported
60
+ ::Kernel.raise ::RailsAdminSettings::PersistenceException, "Fatal: setting #{key} is #{val[:type]} but file upload engine is not detected"
61
+ end
62
+ value = File.open(root_file_path.join(val.delete(:value)))
63
+ else
64
+ value = val.delete(:value)
65
+ end
66
+ n.set(key, value, val.merge(overwrite: false))
67
+ end
68
+ n.unload!
135
69
  end
136
70
  end
137
71
  end
138
72
 
139
- def create_setting(key, options = {})
140
- load!
141
- key = key.to_s
73
+ def get(key, options = {})
142
74
  options.symbolize_keys!
143
- options[:raw] = options.delete(:default)
144
75
 
145
- if @@settings[key].nil?
146
- write_to_database(key, options.merge(key: key))
76
+ if options[:ns].nil? || options[:ns].to_s == 'main'
77
+ ns('main').get(key, options)
147
78
  else
148
- @@settings[key]
79
+ ns(options[:ns]).get(key, options)
149
80
  end
150
81
  end
151
82
 
152
- # to satisfy rspec
153
- def to_ary
154
- ['Settings']
155
- end
156
-
157
- def destroy(key)
158
- raise 'please call destroy! to delete setting'
159
- end
160
-
161
- def destroy_all
162
- raise 'please call destroy_all! to delete all settings'
163
- end
164
-
165
- def destroy!(key)
166
- load!
167
- key = key.to_s
83
+ def set(key, value = nil, options = {})
84
+ options.symbolize_keys!
168
85
 
169
- @@mutex.synchronize do
170
- unless @@settings[key].nil?
171
- @@settings[key].destroy
172
- @@settings.delete(key)
173
- end
86
+ if options[:ns].nil? || options[:ns].to_s == 'main'
87
+ ns('main').set(key, value, options)
88
+ else
89
+ ns(options[:ns]).set(key, value, options)
174
90
  end
175
91
  end
176
92
 
177
- def destroy_all!
178
- RailsAdminSettings::Setting.destroy_all
179
- unload!
93
+ def save_default(key, value, options = {})
94
+ set(key, value, options.merge(overwrite: false))
180
95
  end
181
96
 
182
-
183
- def write_to_database(key, options)
184
- key = key.to_s
185
-
186
- @@mutex.synchronize do
187
- @@settings[key] = RailsAdminSettings::Setting.create(options)
188
- unless @@settings[key].persisted?
189
- if @@settings[key].errors[:key].any?
190
- @@settings[key] = RailsAdminSettings::Setting.where(key: key).first
191
- if options[:raw].blank? && !@@settings[key].blank?
192
- # do not update setting if it's not blank in DB and we want to make it blank
193
- else
194
- unless @@settings[key].update_attributes(options)
195
- raise RailsAdminSettings::PersistenceException
196
- end
197
- end
198
- end
199
- end
200
- @@settings[key]
201
- end
97
+ def create_setting(key, value, options = {})
98
+ set(key, nil, options.merge(overwrite: false))
202
99
  end
203
100
 
204
- def label key
205
- get(key).label
101
+ def method_missing(*args)
102
+ ns('main').__send__(*args)
206
103
  end
207
104
  end
208
105
  end
106
+
@@ -0,0 +1,25 @@
1
+ # require this file to load the tasks
2
+ require 'rake'
3
+
4
+ # Require sitemap_generator at runtime. If we don't do this the ActionView helpers are included
5
+ # before the Rails environment can be loaded by other Rake tasks, which causes problems
6
+ # for those tasks when rendering using ActionView.
7
+ namespace :settings do
8
+ # Require sitemap_generator only. When installed as a plugin the require will fail, so in
9
+ # that case, load the environment first.
10
+ task :require do
11
+ Rake::Task['environment'].invoke
12
+ end
13
+
14
+ desc "Dump settings to config/settings.yml"
15
+ task :dump => ['settings:require'] do
16
+ path = Settings.root_file_path.join('config/settings.yml')
17
+ RailsAdminSettings::Dumper.dump(path)
18
+ puts "dumped settings to #{path}"
19
+ end
20
+
21
+ desc "Delete all settings"
22
+ task :delete => ['settings:require'] do
23
+ Settings.destroy_all!
24
+ end
25
+ end
@@ -1,5 +1,19 @@
1
1
  module RailsAdminSettings
2
2
  def self.types
3
- ['string', 'integer', 'html', 'sanitized', 'yaml', 'phone', 'email', 'address', 'file', 'image', 'url', 'domain', 'color']
3
+ [
4
+ 'string',
5
+ 'integer',
6
+ 'html',
7
+ 'sanitized',
8
+ 'yaml',
9
+ 'phone',
10
+ 'email',
11
+ 'address',
12
+ 'file',
13
+ 'image',
14
+ 'url',
15
+ 'domain',
16
+ 'color'
17
+ ]
4
18
  end
5
19
  end
@@ -5,7 +5,7 @@ module RailsAdminSettings
5
5
  self.raw = default_value if raw.blank?
6
6
  end
7
7
  base.before_validation :sanitize_value, if: :sanitized_type?
8
- base.validates_uniqueness_of :key
8
+ base.validates_uniqueness_of :key, scope: :ns
9
9
  base.validates_inclusion_of :type, in: RailsAdminSettings.types
10
10
  base.validates_numericality_of :raw, if: :integer_type?
11
11
 
@@ -52,9 +52,7 @@ module RailsAdminSettings
52
52
  base.after_validation(:geocode, if: :address_type?)
53
53
  end
54
54
 
55
- base.validate if: :color_type? do
56
- base.validates_with(RailsAdminSettings::HexColorValidator, attributes: :raw)
57
- end
55
+ base.validates_with(RailsAdminSettings::HexColorValidator, attributes: :raw, if: :color_type?)
58
56
 
59
57
  base.validate if: :yaml_type? do
60
58
  require_safe_yaml do
@@ -1,3 +1,3 @@
1
1
  module RailsAdminSettings
2
- VERSION = "0.5.5"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -4,18 +4,22 @@ module RailsAdminSettings
4
4
  class PersistenceException < Exception
5
5
  end
6
6
 
7
+ autoload :Fallback, "rails_admin_settings/fallback"
8
+ autoload :Namespaced, "rails_admin_settings/namespaced"
7
9
  autoload :Processing, "rails_admin_settings/processing"
8
10
  autoload :Validation, "rails_admin_settings/validation"
9
11
  autoload :RequireHelpers, "rails_admin_settings/require_helpers"
10
12
  autoload :RailsAdminConfig, "rails_admin_settings/rails_admin_config"
11
13
  autoload :Uploads, "rails_admin_settings/uploads"
12
14
  autoload :HexColorValidator, "rails_admin_settings/hex_color_validator"
15
+ autoload :Dumper, "rails_admin_settings/dumper"
13
16
  end
14
17
 
15
18
  require "rails_admin_settings/types"
16
19
  require "rails_admin_settings/settings"
17
20
 
18
21
  if Object.const_defined?('Rails')
22
+ require "rails_admin_settings/railtie"
19
23
  require "rails_admin_settings/engine"
20
24
  else
21
25
  require File.dirname(__FILE__) + '/../app/models/rails_admin_settings/setting.rb'
@@ -21,14 +21,14 @@ Gem::Specification.new do |spec|
21
21
  spec.add_runtime_dependency "mongoid", ">= 3.1"
22
22
 
23
23
  spec.add_development_dependency "bundler"
24
- spec.add_development_dependency "rake", "~> 10.0.3"
25
- spec.add_development_dependency "rspec", "~> 2.13.0"
26
- spec.add_development_dependency "mongoid-rspec", "~> 1.7.0"
27
- spec.add_development_dependency "simplecov", "~> 0.7.1"
28
- spec.add_development_dependency "database_cleaner", "~> 0.9.1"
29
- spec.add_development_dependency "factory_girl", "~> 4.2.0"
24
+ spec.add_development_dependency "rake", "~> 10.1.1"
25
+ spec.add_development_dependency "rspec", "~> 2.14.1"
26
+ spec.add_development_dependency "mongoid-rspec", "~> 1.10.0"
27
+ spec.add_development_dependency "simplecov", "~> 0.8.2"
28
+ spec.add_development_dependency "database_cleaner", "~> 1.2.0"
29
+ spec.add_development_dependency "factory_girl", "~> 4.3.0"
30
30
 
31
- spec.add_development_dependency "safe_yaml", "~> 0.8.6"
31
+ spec.add_development_dependency "safe_yaml", "~> 1.0.0"
32
32
  spec.add_development_dependency "russian_phone", "~> 0.3.2"
33
33
  spec.add_development_dependency "sanitize", "~> 2.0.3"
34
34
  spec.add_development_dependency "validates_email_format_of", "~> 1.5.3"
@@ -37,4 +37,5 @@ Gem::Specification.new do |spec|
37
37
 
38
38
  spec.add_development_dependency "glebtv-carrierwave-mongoid"
39
39
  spec.add_development_dependency "glebtv-mongoid-paperclip"
40
+ spec.add_development_dependency "pry"
40
41
  end
@@ -18,7 +18,7 @@ describe "Uploads" do
18
18
 
19
19
  Settings.get(:file).file.file.file.should eq "#{File.dirname(__FILE__).gsub('/spec', '/')}uploads/1024x768.gif"
20
20
 
21
- File.exists?("#{File.dirname(__FILE__)}/../uploads/1024x768.gif").should be_true
21
+ File.exists?(Settings.root_file_path.join("uploads/1024x768.gif")).should be_true
22
22
  end
23
23
 
24
24
  it 'supports image type' do
@@ -29,7 +29,12 @@ describe "Uploads" do
29
29
 
30
30
  Settings.get(:file).file.file.file.should eq "#{File.dirname(__FILE__).gsub('/spec', '/')}uploads/1024x768.gif"
31
31
 
32
- File.exists?("#{File.dirname(__FILE__)}/../uploads/1024x768.gif").should be_true
32
+ File.exists?(Settings.root_file_path.join("uploads/1024x768.gif")).should be_true
33
+ end
34
+
35
+ it 'supports defaults' do
36
+ Settings.apply_defaults!(File.join(File.dirname(__FILE__), 'support/defaults_w_file.yml'))
37
+ File.exists?(Settings.root_file_path.join("uploads/1024x768.gif")).should be_true
33
38
  end
34
39
  end
35
40
  end
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
 
5
5
  # this tests check how well rails_admin_settings handles settings disappearing from DB during execution
6
6
  # real usage: app specs with database_cleaner enabled
7
- describe Settings do
7
+ describe 'Database trickery' do
8
8
 
9
9
  it "should handle settings disappearing from DB" do
10
10
  email = "my@mail.ru"
@@ -19,30 +19,28 @@ describe Settings do
19
19
  Settings.email.should == email2
20
20
  end
21
21
 
22
- it "should handle settings appearing from DB" do
22
+ it "should handle settings appearing in DB when settings are loaded" do
23
23
  Settings.tst2.should == ''
24
- RailsAdminSettings::Setting.create(key: 'tst', raw: 'tst')
24
+ RailsAdminSettings::Setting.create!(key: 'tst', raw: 'tst')
25
25
  # settings are still cached, but when we try to create a setting it sees updated value in DB
26
26
  Settings.tst.should == 'tst'
27
27
  end
28
28
 
29
- it "should handle settings appearing in DB" do
29
+ it "should handle settings appearing in DB when settings are not loaded" do
30
30
  RailsAdminSettings::Setting.create(key: 'tst', raw: 'tst')
31
-
32
31
  Settings.tst = 'str'
33
32
  Settings.tst.should == 'str'
34
33
  end
35
34
 
36
35
  it "#destroy_all!" do
37
36
  Settings.tst = 'str'
38
- expect { Settings.destroy_all }.to raise_exception
39
37
  Settings.destroy_all!
40
38
  Settings.tst.should == ''
41
39
  end
40
+
42
41
  it "#destroy!" do
43
42
  Settings.tst = 'str'
44
43
  Settings.tst2 = 'str2'
45
- expect { Settings.destroy(:tst) }.to raise_exception
46
44
  Settings.destroy!(:tst)
47
45
  Settings.tst.should == ''
48
46
  Settings.tst2.should == 'str2'
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'Settings loading defaults' do
6
+ before :each do
7
+ Settings.apply_defaults!(File.join(File.dirname(__FILE__), 'support/defaults.yml'))
8
+ end
9
+
10
+ it 'loads twice ok' do
11
+ Settings.apply_defaults!(File.join(File.dirname(__FILE__), 'support/defaults.yml'))
12
+ Settings.apply_defaults!(File.join(File.dirname(__FILE__), 'support/defaults.yml'))
13
+ end
14
+
15
+ it 'sets value' do
16
+ Settings.footer.should eq 'test <b></b>'
17
+ Settings.get(:footer).type.should eq 'html'
18
+ end
19
+
20
+ it 'sets type' do
21
+ Settings.get(:phone).phone_type?.should be_true
22
+ Settings.get(:phone).val.city.should eq '906'
23
+ Settings.get(:phone).val.formatted_subscriber.should eq '111-11-11'
24
+ end
25
+
26
+ it 'sets enabled' do
27
+ Settings.phone_enabled?.should eq true
28
+ Settings.disabled_enabled?.should eq false
29
+ Settings.enabled?(:disabled).should eq false
30
+ end
31
+
32
+ it 'works with namespace' do
33
+ Settings.ns(:main).phone.should eq '906 1111111'
34
+ Settings.ns(:other).footer.should eq 'zzz'
35
+ Settings.footer.should eq 'test <b></b>'
36
+ Settings.ns(:main).footer.should eq 'test <b></b>'
37
+ end
38
+
39
+ it 'works with fallback' do
40
+ Settings.ns(:etc, fallback: :main).phone.should eq '906 1111111'
41
+ Settings.ns(:etc, fallback: :main).footer.should eq 'test <b></b>'
42
+ Settings.ns(:other, fallback: :main).footer.should eq 'zzz'
43
+ Settings.ns(:etc, fallback: :other).footer.should eq 'zzz'
44
+ end
45
+
46
+ it "doesn't overwrite" do
47
+ Settings.ns(:main).phone = '906 2222222'
48
+ Settings.ns(:other).footer = 'xxx'
49
+ Settings.apply_defaults!(File.join(File.dirname(__FILE__), 'support/defaults.yml'))
50
+ Settings.ns(:main).phone.should eq '906 2222222'
51
+ Settings.ns(:other).footer.should eq 'xxx'
52
+ end
53
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'Settings enabling and disabling' do
6
+ it 'works for name_enabled? and name_enabled =' do
7
+ Settings.zzz = '123'
8
+ Settings.zzz.should eq '123'
9
+ Settings.get(:zzz).enabled.should eq true
10
+ Settings.enabled?(:zzz).should eq true
11
+ Settings.zzz_enabled?.should eq true
12
+
13
+ Settings.zzz.should eq '123'
14
+ Settings.zzz_enabled = false
15
+ Settings.zzz_enabled?.should eq false
16
+ Settings.get(:zzz).enabled.should eq false
17
+ Settings.enabled?(:zzz).should eq false
18
+ Settings.zzz.should eq ''
19
+ Settings.unload!
20
+ Settings.zzz.should eq ''
21
+ Settings.get(:zzz).raw.should eq '123'
22
+
23
+ Settings.zzz_enabled = true
24
+ Settings.zzz.should eq '123'
25
+ Settings.zzz_enabled?.should eq true
26
+ Settings.get(:zzz).enabled.should eq true
27
+ Settings.enabled?(:zzz).should eq true
28
+ end
29
+ end
data/spec/label_spec.rb CHANGED
@@ -7,12 +7,12 @@ describe 'Settings label' do
7
7
  it "should have label" do
8
8
  label = "E-Mail"
9
9
  Settings.email(label: label, default: "my@mail.ru")
10
- Settings.label(:email).should == label
10
+ Settings.get(:email).name.should == label
11
11
  end
12
12
 
13
13
  it "should properly set label as key if blank" do
14
14
  Settings.email(default: "my@mail.ru")
15
- Settings.label(:email).should == 'email'
15
+ Settings.get(:email).name.should == 'email'
16
16
  end
17
17
 
18
18
  end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'Namespaced settings' do
6
+ it 'sets namespaced' do
7
+ Settings.ns(:other).test = 'test'
8
+ end
9
+
10
+ it 'reads namespaced from cache' do
11
+ ns = Settings.ns(:other)
12
+ ns.test = 'test'
13
+ ns.test.should eq 'test'
14
+ end
15
+
16
+ it 'reads namespaced from db' do
17
+ Settings.ns(:other).test = 'test'
18
+ Settings.ns(:other).test.should eq 'test'
19
+ end
20
+
21
+ it 'destroys' do
22
+ Settings.ns(:other).test = 'test'
23
+ Settings.ns(:other).destroy_all!
24
+ Settings.ns(:other).test.should eq ''
25
+ end
26
+
27
+ it 'sets type' do
28
+ expect {
29
+ Settings.ns(:other).set(:phone, 'test', type: 'phone')
30
+ }.to raise_error
31
+ Settings.ns(:other).set(:phone, '906 111 11 11', type: 'phone')
32
+ Settings.get(:phone, ns: 'other').phone_type?.should be_true
33
+ Settings.get(:phone, ns: 'other').val.city.should eq '906'
34
+ Settings.get(:phone, ns: 'other').val.formatted_subscriber.should eq '111-11-11'
35
+
36
+ ns = Settings.ns(:other)
37
+ ns.get(:phone).phone_type?.should be_true
38
+ ns.get(:phone).val.city.should eq '906'
39
+ ns.get(:phone).val.formatted_subscriber.should eq '111-11-11'
40
+ end
41
+ end
@@ -29,6 +29,11 @@ describe "Uploads" do
29
29
 
30
30
  File.exists?("#{File.dirname(__FILE__)}/../uploads/1024x768.gif").should be_true
31
31
  end
32
+
33
+ it 'supports defaults' do
34
+ Settings.apply_defaults!(File.join(File.dirname(__FILE__), 'support/defaults_w_file.yml'))
35
+ File.exists?(Settings.root_file_path.join("uploads/1024x768.gif")).should be_true
36
+ end
32
37
  end
33
38
  end
34
39
 
@@ -2,8 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe Settings do
6
-
5
+ describe 'Settings' do
7
6
  it "should works as RailsSettings" do
8
7
  Settings.destroy_all!
9
8
 
@@ -12,6 +11,18 @@ describe Settings do
12
11
  Settings.email.should == email
13
12
  end
14
13
 
14
+ it '#get should return new setting when setting does not exist' do
15
+ t = Settings.get(:test)
16
+ t.class.name.should eq 'RailsAdminSettings::Setting'
17
+ t.persisted?.should eq true
18
+ t.value.should eq ''
19
+ end
20
+
21
+ it '#name should return empty string when setting does not exist' do
22
+ Settings.test.should eq ''
23
+ Settings['test'].value.should eq ''
24
+ end
25
+
15
26
  it "should save default" do
16
27
  Settings.destroy_all!
17
28
 
@@ -26,7 +37,6 @@ describe Settings do
26
37
  end
27
38
 
28
39
  it 'should properly unload' do
29
- Settings.class_eval { cattr_accessor :loaded }
30
40
  Settings.load!
31
41
  Settings.loaded.should eq true
32
42
  Settings.unload!
@@ -34,7 +44,6 @@ describe Settings do
34
44
  end
35
45
 
36
46
  it 'should properly store settings to DB' do
37
- Settings.class_eval { cattr_accessor :loaded }
38
47
  Settings.unload!
39
48
  Settings.loaded.should eq false
40
49
  Settings.temp = '123'