configure_me 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/.rspec +1 -1
  2. data/{README.md → README.rdoc} +7 -7
  3. data/Rakefile +1 -7
  4. data/configure_me.gemspec +3 -7
  5. data/lib/configure_me/attribute_methods.rb +88 -0
  6. data/lib/configure_me/base.rb +58 -62
  7. data/lib/configure_me/caching.rb +19 -14
  8. data/lib/configure_me/identity.rb +15 -0
  9. data/lib/configure_me/loading.rb +57 -0
  10. data/lib/configure_me/naming.rb +18 -0
  11. data/lib/configure_me/nesting.rb +30 -24
  12. data/lib/configure_me/persistence.rb +29 -0
  13. data/lib/configure_me/persisting.rb +33 -20
  14. data/lib/configure_me/setting.rb +61 -12
  15. data/lib/configure_me/validations.rb +33 -0
  16. data/lib/configure_me/version.rb +1 -1
  17. data/lib/configure_me.rb +25 -3
  18. data/lib/generators/configure_me/setup_generator.rb +21 -0
  19. data/lib/generators/configure_me/templates/initializer.rb +1 -0
  20. data/lib/generators/{templates → configure_me/templates}/migration.rb +0 -0
  21. data/lib/generators/{templates/model.rb → configure_me/templates/model.erb} +0 -0
  22. data/lib/generators/configure_me/templates/model.rb +2 -0
  23. data/spec/configure_me/attribute_methods_spec.rb +113 -0
  24. data/spec/configure_me/base_spec.rb +43 -88
  25. data/spec/configure_me/caching_spec.rb +75 -0
  26. data/spec/configure_me/identity_spec.rb +30 -0
  27. data/spec/configure_me/loading_spec.rb +84 -0
  28. data/spec/configure_me/naming_spec.rb +23 -0
  29. data/spec/configure_me/nesting_spec.rb +36 -0
  30. data/spec/configure_me/persistence_spec.rb +62 -0
  31. data/spec/configure_me/persisting_spec.rb +123 -0
  32. data/spec/configure_me/setting_spec.rb +180 -13
  33. data/spec/spec_helper.rb +6 -0
  34. data/spec/support/active_model_lint.rb +16 -0
  35. metadata +52 -81
  36. data/features/memory.feature +0 -16
  37. data/features/step_definitions/base_steps.rb +0 -33
  38. data/lib/configure_me/settings.rb +0 -101
  39. data/lib/generators/configure_me_generator.rb +0 -19
  40. data/lib/generators/templates/initializer.rb +0 -1
@@ -1,27 +1,76 @@
1
+ require 'active_support/core_ext/object/blank'
2
+
1
3
  module ConfigureMe
4
+ class InvalidDefault < StandardError; end
5
+ class UnsupportedType < StandardError; end
6
+ class InvalidConversion < StandardError; end
7
+ # == Setting
8
+ #
9
+ # There are two methods used to create a setting:
10
+ # 1. calling the class method <tt>setting</tt> from within an instance of ConfigureMe::Base
11
+ # 2. implicitly when a hash is fed to ConfigureMe::Base.load
2
12
  class Setting
3
13
  attr_reader :name, :type, :default
4
14
 
5
- def initialize(owner, name, type, *args)
15
+ VALID_TYPES = [:string, :integer, :float, :boolean, :unknown]
16
+ TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE']
17
+
18
+ def initialize(name, *args)
6
19
  options = args.extract_options!
7
20
 
8
- @owner, @name, @type = owner, name.to_s, type
21
+ @name = name.to_s
9
22
  @default = options.key?(:default) ? options[:default] : nil
10
- end
11
-
12
- def define_methods!
13
- @owner.define_attribute_methods(true)
23
+ @type = options.key?(:type) ? options[:type] : infer_type(@default)
24
+ raise UnsupportedType.new("Invalid type: #{@type}") unless VALID_TYPES.include?(@type)
14
25
  end
15
26
 
16
27
  def convert(value)
17
28
  case type
18
- when :string then value
19
- when :text then value
29
+ when :string then convert_to_string(value)
20
30
  when :integer then value.to_i rescue value ? 1 : 0
21
- when :float then value.to_f
22
- when :date then ActiveRecord::ConnectionAdapters::Column.string_to_date(value)
23
- when :boolean then ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
24
- else value
31
+ when :float then value.to_f rescue value ? 1.0 : 0.0
32
+ when :boolean then convert_to_boolean(value)
33
+ when :unknown
34
+ @type = infer_type(value)
35
+ convert(value)
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def infer_type(value)
42
+ case value
43
+ when String
44
+ :string
45
+ when Fixnum
46
+ :integer
47
+ when Float
48
+ :float
49
+ when TrueClass, FalseClass
50
+ :boolean
51
+ when NilClass
52
+ :unknown
53
+ else
54
+ raise InvalidDefault.new("Unable to infer type from #{value.inspect}")
55
+ end
56
+ end
57
+
58
+ def convert_to_string(value)
59
+ case value
60
+ when String
61
+ value
62
+ when Fixnum, Float, TrueClass, FalseClass, NilClass
63
+ value.to_s
64
+ else
65
+ raise InvalidConversion.new("Unable to convert #{value.inspect} to string")
66
+ end
67
+ end
68
+
69
+ def convert_to_boolean(value)
70
+ if value.is_a?(String) && value.blank?
71
+ nil
72
+ else
73
+ TRUE_VALUES.include?(value)
25
74
  end
26
75
  end
27
76
  end
@@ -0,0 +1,33 @@
1
+ require 'active_model'
2
+
3
+ module ConfigureMe
4
+ class Base
5
+ include ActiveModel::Validations
6
+ define_model_callbacks :validation
7
+
8
+ def save(options={})
9
+ run_callbacks :validation do
10
+ perform_validations(options) ? super : false
11
+ end
12
+ end
13
+
14
+ def valid?(context = nil)
15
+ context ||= (persisted? ? :update : :create)
16
+ output = super(context)
17
+ errors.empty? && output
18
+ end
19
+
20
+ protected
21
+
22
+ def perform_validations(options={})
23
+ if options[:validate] != false
24
+ valid?(options[:context])
25
+ else
26
+ true
27
+ end
28
+ end
29
+ end
30
+
31
+ module Validations
32
+ end
33
+ end
@@ -1,3 +1,3 @@
1
1
  module ConfigureMe
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/configure_me.rb CHANGED
@@ -1,14 +1,36 @@
1
+ require 'active_model'
2
+ require 'singleton'
3
+
1
4
  module ConfigureMe
2
5
  class << self
3
- def persist_with(klass)
4
- @persistence_klass = klass
6
+ def init(options = {})
7
+ options = {:persist_with => nil, :cache_with => nil}.merge(options)
8
+ @persistence_klass = options[:persist_with]
9
+ @cache_object = options[:cache_with]
5
10
  end
6
11
 
7
12
  def persistence_klass
8
- @persistence_klass ||= ::Setting
13
+ @persistence_klass ||= nil
14
+ end
15
+
16
+ def cache_object
17
+ @cache_object
9
18
  end
10
19
  end
20
+
21
+ class Base
22
+ include Singleton
23
+ end
11
24
  end
12
25
 
26
+ require 'configure_me/attribute_methods'
27
+ require 'configure_me/caching'
28
+ require 'configure_me/identity'
29
+ require 'configure_me/loading'
30
+ require 'configure_me/naming'
31
+ require 'configure_me/nesting'
32
+ require 'configure_me/persistence'
33
+ require 'configure_me/persisting'
13
34
  require 'configure_me/setting'
35
+ require 'configure_me/validations'
14
36
  require 'configure_me/base'
@@ -0,0 +1,21 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module ConfigureMe
4
+ class SetupGenerator < ActiveRecord::Generators::Base
5
+ include Rails::Generators::Migration
6
+
7
+ source_root File.expand_path('../templates', __FILE__)
8
+
9
+ def generate_model
10
+ template 'model.rb', "app/models/#{singular_name}.rb"
11
+ end
12
+
13
+ def generate_migration
14
+ migration_template 'migration.rb', "db/migrate/create_#{plural_name}.rb"
15
+ end
16
+
17
+ def generate_initializer
18
+ template 'initializer.rb', 'config/initializers/init_configure_me.rb'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1 @@
1
+ ConfigureMe.init(:persist_with => <%= class_name %>, :cache_with => Rails.cache)
@@ -0,0 +1,2 @@
1
+ class <%= class_name %> < ActiveRecord::Base
2
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ describe ConfigureMe::AttributeMethods do
4
+ before {
5
+ @config_class = define_test_class('MyTestConfig', ConfigureMe::Base)
6
+ }
7
+ subject { @config_class.instance }
8
+ it 'make clean should clear the temp_attributes' do
9
+ subject.send(:temp_attributes).expects(:clear)
10
+ subject.send(:make_clean)
11
+ end
12
+ end
13
+
14
+ describe ConfigureMe::AttributeMethods, 'reading an attribute' do
15
+ before {
16
+ @config_class = define_test_class('MyTestConfig', ConfigureMe::Base)
17
+ @config_class.send(:setting, :testsetting, :default => 'foo')
18
+ @config = @config_class.instance
19
+ @config.stubs(:read_cache)
20
+ @config.stubs(:read_persist)
21
+ }
22
+ subject { @config }
23
+ it 'should call "read_attribute"' do
24
+ @config.expects(:read_attribute).with('testsetting')
25
+ subject.testsetting
26
+ end
27
+ context 'with a pristine instance' do
28
+ it 'should attempt to read from the cache' do
29
+ subject.expects(:read_cache)
30
+ subject.testsetting
31
+ end
32
+ it 'should attempt to read from the persistence store' do
33
+ subject.expects(:read_persist)
34
+ subject.testsetting
35
+ end
36
+ it 'should return the default value' do
37
+ subject.testsetting.should eql('foo')
38
+ end
39
+ end
40
+ context 'with a persisted value' do
41
+ context 'with a non-cached value' do
42
+ before { @config.stubs(:read_cache).returns(nil) }
43
+ it 'should attempt to read from the cache' do
44
+ subject.expects(:read_cache).returns(nil)
45
+ subject.testsetting
46
+ end
47
+ it 'should attempt to read from the persistence store' do
48
+ subject.expects(:read_persist)
49
+ subject.testsetting
50
+ end
51
+ it 'should write the value to the cache' do
52
+ subject.stubs(:read_persist).returns('persisted')
53
+ subject.expects(:write_cache).with(:testsetting, 'persisted')
54
+ subject.testsetting
55
+ end
56
+ it 'should return the persisted value' do
57
+ subject.stubs(:read_cache).returns('persisted')
58
+ subject.testsetting.should eql('persisted')
59
+ end
60
+ end
61
+
62
+ context 'with a cached value' do
63
+ before { @config.stubs(:read_cache).returns('cached') }
64
+ it 'should attempt to read from the cache' do
65
+ subject.expects(:read_cache).returns('cached')
66
+ subject.testsetting
67
+ end
68
+ it 'should not attempt to read from the persistence store' do
69
+ subject.expects(:read_persist).never
70
+ subject.testsetting
71
+ end
72
+ it 'should return the cached value' do
73
+ subject.testsetting.should eql('cached')
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'with a dirty value' do
79
+ before { @config.stubs(:testsetting_changed?).returns(true) }
80
+ it 'should not attempt to read from the cache' do
81
+ subject.expects(:read_cache).never
82
+ subject.testsetting
83
+ end
84
+ it 'should not attempt to read from the persistence store' do
85
+ subject.expects(:read_persist).never
86
+ subject.testsetting
87
+ end
88
+ it 'should return the value from the temp_attributes hash' do
89
+ subject.expects(:temp_attributes).returns(:testsetting => 'iamdirty')
90
+ subject.testsetting.should eql('iamdirty')
91
+ end
92
+ end
93
+ end
94
+
95
+ describe ConfigureMe::AttributeMethods, 'writing an attribute' do
96
+ before {
97
+ @config_class = define_test_class('MyTestConfig', ConfigureMe::Base)
98
+ @config_class.send(:setting, :testsetting, :default => 'foo')
99
+ @config = @config_class.instance
100
+ @config.stubs(:read_cache)
101
+ @config.stubs(:read_persist)
102
+ }
103
+ subject { @config }
104
+
105
+ it 'should set the attribute to dirty' do
106
+ subject.expects(:make_dirty).with(:testsetting)
107
+ subject.testsetting = 'newvalue'
108
+ end
109
+ it 'should write the value to the temp_attributes hash' do
110
+ subject.testsetting = 'newvalue'
111
+ subject.send(:temp_attributes)[:testsetting].should eql('newvalue')
112
+ end
113
+ end
@@ -1,103 +1,58 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ConfigureMe::Base do
4
- class TestConfig < ConfigureMe::Base
3
+ describe ConfigureMe do
4
+ it { should respond_to(:init) }
5
+ it { should respond_to(:persistence_klass) }
6
+ it { should respond_to(:cache_object) }
7
+ it 'should provide nil defaults for :init' do
8
+ ConfigureMe.init
9
+ ConfigureMe.persistence_klass.should be_nil
10
+ ConfigureMe.cache_object.should be_nil
5
11
  end
6
12
 
7
- it { TestConfig.should respond_to(:setting) }
8
- it { TestConfig.instance.should respond_to(:read_setting) }
9
- it { TestConfig.instance.should respond_to(:write_setting) }
10
- it { TestConfig.send(:persisting?).should be_false }
11
-
12
- describe 'with a "color" setting with a default of "red"' do
13
- before(:each) do
14
- @klass = Class.new(ConfigureMe::Base)
15
- @klass.send :setting, :color, :string, :default => 'red'
16
- end
17
-
18
- describe 'an instance ' do
19
- it 'should respond to attribute_method?(:color) with true' do
20
- @obj = @klass.instance
21
- @obj.send(:attribute_method?, :color).should be_true
22
- end
23
-
24
- it 'should respond to attribute_method?(:size) with false' do
25
- @obj = @klass.instance
26
- @obj.send(:attribute_method?, :size).should be_false
27
- end
28
-
29
- it 'should respond to :color with "red"' do
30
- @obj = @klass.instance
31
- @obj.color.should eql('red')
32
- end
33
-
34
- it 'should store a new :color of "blue"' do
35
- @obj = @klass.instance
36
- @obj.color = 'blue'
37
- @obj.color.should eql('blue')
38
- end
39
-
40
- it 'should raise error when setting an unknown attribute' do
41
- @obj = @klass.instance
42
- lambda { @obj.write_setting('size', 'big') }.should raise_error(NoMethodError)
43
- end
44
-
45
- it 'should assign from a hash' do
46
- @obj = @klass.instance
47
- @obj.send :settings=, {:color => 'blue'}
48
- @obj.color.should eql('blue')
49
- end
50
- end
13
+ it 'should accept a hash of initialization arguments' do
14
+ ConfigureMe.init(:persist_with => 'foo', :cache_with => 'bar')
15
+ ConfigureMe.persistence_klass.should eql('foo')
16
+ ConfigureMe.cache_object.should eql('bar')
51
17
  end
18
+ end
52
19
 
53
- describe 'persisting' do
54
- before(:each) do
55
- @klass = TestConfig
56
- @persistence = mock('PersistenceClass')
57
- ConfigureMe.persist_with @persistence
58
- @klass.send :setting, :color, :string, :default => 'red'
59
- @klass.send :persist_me
60
- end
20
+ describe ConfigureMe::Base do
21
+ it 'should enforce the singleton pattern' do
22
+ lambda { ConfigureMe::Base.new }.should raise_error(NoMethodError)
23
+ end
61
24
 
62
- it { @klass.send(:persisting?).should be_true }
63
- it { @klass.should respond_to(:persistence_key) }
64
- it { @klass.persistence_key.should eql('test') }
25
+ class BaseConfig < ConfigureMe::Base
26
+ setting :setting1, :type => :integer, :default => 12
27
+ end
65
28
 
66
- describe 'with a non-persisted setting' do
67
- before(:each) do
68
- @obj = @klass.instance
69
- @unpersisted = mock('UnpersistedSetting') do
70
- stubs(:value=)
71
- end
72
- @persistence = mock('PersistenceClass')
73
- ConfigureMe.persist_with @persistence
74
- end
29
+ subject { BaseConfig.instance }
30
+ its(:persisted?) { should be_true }
31
+ its(:class) { should respond_to(:setting1) }
75
32
 
76
- it { @obj.send(:persistence_key, :color).should eql('test_color') }
33
+ describe 'ActiveModel compliance' do
34
+ before { @config = define_test_class('TestConfig', ConfigureMe::Base).instance }
35
+ subject { @config }
36
+ it_should_behave_like "ActiveModel"
37
+ end
77
38
 
78
- it 'should store updates to the database' do
79
- @unpersisted = mock('UnpersistedSetting') do
80
- expects(:value=)
81
- expects(:save!)
82
- end
83
- @persistence.stubs(:find_or_create_by_key).returns(@unpersisted)
84
- @obj.color = "blue"
85
- end
39
+ describe 'find_by_id' do
40
+ subject { ConfigureMe::Base }
41
+ before {
42
+ @mock_config = mock('Config') do
43
+ stubs(:config_key).returns('the-right-one')
44
+ stubs(:instance).returns('instance')
45
+ end
46
+ @configs = [@mock_config]
47
+ }
48
+ it 'should return nil for an invalid id' do
49
+ subject.stubs(:configs).returns([])
50
+ subject.find_by_id('something').should be_nil
86
51
  end
87
52
 
88
- describe 'with a persisted setting' do
89
- before(:each) do
90
- @obj = @klass.instance
91
- @persisted = mock('PersistedSetting') do
92
- stubs(:value).returns("blue".to_yaml)
93
- end
94
- @persistence.stubs(:find_by_key).returns(@persisted)
95
- ConfigureMe.persist_with @persistence
96
- end
97
-
98
- it 'should return a valid value' do
99
- @obj.color.should eql("blue")
100
- end
53
+ it 'should return a matching config' do
54
+ subject.stubs(:configs).returns(@configs)
55
+ subject.find_by_id('the-right-one').should eql('instance')
101
56
  end
102
57
  end
103
58
  end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe ConfigureMe::Caching, 'the class' do
4
+ subject { ConfigureMe::Base }
5
+ it { should respond_to(:cache_me) }
6
+ it { should respond_to(:caching?) }
7
+ end
8
+
9
+ describe ConfigureMe::Caching, 'caching?' do
10
+ before {
11
+ @caching_class = define_test_class('CachingConfig', ConfigureMe::Base)
12
+ @caching_class.send(:cache_me)
13
+ }
14
+ subject { @caching_class }
15
+
16
+ context 'when cache_object is available' do
17
+ before { ConfigureMe.stubs(:cache_object).returns({}) }
18
+ specify { subject.caching?.should be_true }
19
+ end
20
+
21
+ context 'when cache_object is unavailable' do
22
+ before { ConfigureMe.stubs(:cache_object).returns(nil) }
23
+ specify { subject.caching?.should be_false }
24
+ end
25
+
26
+ end
27
+
28
+ describe ConfigureMe::Caching, 'when caching is enabled' do
29
+ before {
30
+ @caching_class = define_test_class('CachingConfig', ConfigureMe::Base)
31
+ @caching_class.stubs(:caching?).returns(true)
32
+ @cache_object = mock('CacheObject') do
33
+ stubs(:read).returns('cached_value')
34
+ stubs(:write)
35
+ end
36
+ ConfigureMe.stubs(:cache_object).returns(@cache_object)
37
+ }
38
+ subject { @caching_class.instance }
39
+
40
+ it 'should attempt to read from the cache' do
41
+ ConfigureMe.expects(:cache_object).once.returns(@cache_object)
42
+ subject.read_cache('cachedsetting')
43
+ end
44
+
45
+ it 'should return the value from the cache' do
46
+ subject.read_cache('cachedsetting').should eql('cached_value')
47
+ end
48
+
49
+ it 'should attempt to write to the cache' do
50
+ @cache_object.expects(:write).once
51
+ subject.write_cache('cachedsetting', 'newvalue')
52
+ end
53
+ end
54
+
55
+ describe ConfigureMe::Caching, 'when caching is disabled' do
56
+ before {
57
+ @caching_class = define_test_class('CachingConfig', ConfigureMe::Base)
58
+ @caching_class.stubs(:caching?).returns(false)
59
+ }
60
+ subject { @caching_class.instance }
61
+
62
+ it 'should not attempt to read from the cache' do
63
+ ConfigureMe.expects(:cache_object).never
64
+ subject.read_cache('cachedsetting')
65
+ end
66
+
67
+ it 'should return nil when read_cache is called' do
68
+ subject.read_cache('cachedsetting').should be_nil
69
+ end
70
+
71
+ it 'should not attempt to write to the cache' do
72
+ ConfigureMe.expects(:cache_object).never
73
+ subject.write_cache('cachedsetting', 'newvalue')
74
+ end
75
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe ConfigureMe::Identity do
4
+ before {
5
+ @parent_class = define_test_class('ParentConfig', ConfigureMe::Base)
6
+ @nested_class = define_test_class('NestedConfig', ConfigureMe::Base)
7
+ }
8
+
9
+ context 'a root class' do
10
+ subject { @parent_class.instance }
11
+ it { should respond_to(:config_key) }
12
+ it { should respond_to(:config_name) }
13
+ it { should respond_to(:storage_key) }
14
+ its(:config_name) { should eql('parent') }
15
+ its(:config_key) { should eql('parent') }
16
+ it 'should generate a valid storage key' do
17
+ subject.storage_key('foo').should eql('parent-foo')
18
+ end
19
+ end
20
+
21
+ context 'a nested class' do
22
+ before { @nested_class.send(:nest_me, @parent_class) }
23
+ subject { @nested_class.instance }
24
+ its(:config_name) { should eql('nested') }
25
+ its(:config_key) { should eql('parent-nested') }
26
+ it 'should generate a valid storage key' do
27
+ subject.storage_key('foo').should eql('parent-nested-foo')
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe ConfigureMe::Loading, 'a filename' do
4
+ subject { ConfigureMe::Base }
5
+ it 'should raise an error for a non-existent file' do
6
+ lambda { subject.load('foo') }.should raise_error(ArgumentError)
7
+ end
8
+
9
+ it 'should load an existing file' do
10
+ File.stubs(:exists?).returns(true)
11
+ File.stubs(:open).returns({:foo => 'bar'}.to_yaml)
12
+ subject.expects(:from_hash)
13
+ subject.load('avalidfile')
14
+ end
15
+ end
16
+
17
+ describe ConfigureMe::Loading, 'a hash' do
18
+ subject { ConfigureMe::Base }
19
+
20
+ context 'with :app => {:setting1 => \'foo\', :setting2 => 845}' do
21
+ before { @config = ConfigureMe::Base.load(:app => {:setting1 => 'foo', :setting2 => 845}) }
22
+ subject { @config.instance }
23
+ its(:config_name) { should eql('app') }
24
+
25
+ it { should respond_to(:setting1) }
26
+ it { should respond_to(:setting2) }
27
+ it { should_not respond_to(:setting3) }
28
+ its(:setting1) { should eql('foo') }
29
+ its(:setting2) { should eql(845) }
30
+ its(:parent_config) { should be_nil }
31
+ end
32
+
33
+ context 'with :group1 => {:setting1 => 6, :setting2 => \'foo\'}, :group2 => {:setting3 => 8, :setting4 => \'bar\'}' do
34
+ describe 'the instance' do
35
+ before {
36
+ @config = ConfigureMe::Base.load(
37
+ :group1 => {
38
+ :setting1 => 6,
39
+ :setting2 => 'foo'
40
+ },
41
+ :group2 => {
42
+ :setting3 => 8,
43
+ :setting4 => 'bar'
44
+ }
45
+ )
46
+ }
47
+
48
+ subject { @config.instance }
49
+ its(:config_name) { should eql('root') }
50
+ it { should respond_to(:group1) }
51
+ it { should respond_to(:group2) }
52
+ it { should_not respond_to(:group3) }
53
+
54
+ describe 'group1' do
55
+ subject { @config.group1 }
56
+ it { should_not be_nil }
57
+ it { should respond_to(:setting1) }
58
+ it { should respond_to(:setting2) }
59
+ it { should_not respond_to(:setting3) }
60
+ its(:setting1) { should eql(6) }
61
+ its(:setting2) { should eql('foo') }
62
+ its(:parent_config) { should eql(@config.instance) }
63
+ end
64
+
65
+ describe 'group2' do
66
+ subject { @config.instance.group2 }
67
+ it { should_not be_nil }
68
+ it { should respond_to(:setting3) }
69
+ it { should respond_to(:setting4) }
70
+ it { should_not respond_to(:setting1) }
71
+ its(:setting3) { should eql(8) }
72
+ its(:setting4) { should eql('bar') }
73
+ its(:parent_config) { should eql(@config.instance) }
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ describe ConfigureMe::Loading, 'something unsupported' do
80
+ subject { ConfigureMe::Base }
81
+ it 'should raise an exception' do
82
+ lambda { subject.load(123) }.should raise_error(ArgumentError)
83
+ end
84
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe ConfigureMe::Naming do
4
+ class NamingConfig < ConfigureMe::Base
5
+ end
6
+
7
+ before {
8
+ @persistence_klass = mock('PersistenceKlass') do
9
+ stubs(:model_name).returns('persistence')
10
+ end
11
+ ConfigureMe.stubs(:persistence_klass).returns(@persistence_klass)
12
+ }
13
+ subject { NamingConfig }
14
+ context 'when persisting' do
15
+ before { NamingConfig.stubs(:persisting?).returns(true) }
16
+ its(:model_name) { should eql('persistence') }
17
+ end
18
+
19
+ context 'when not persisting' do
20
+ before { NamingConfig.stubs(:persisting?).returns(false) }
21
+ its(:model_name) { should_not eql('persistence') }
22
+ end
23
+ end