configure_me 0.5.0 → 0.6.0

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.
Files changed (35) hide show
  1. data/.rvmrc +1 -1
  2. data/Guardfile +9 -0
  3. data/configure_me.gemspec +3 -0
  4. data/lib/configure_me/attribute_methods.rb +10 -7
  5. data/lib/configure_me/base.rb +32 -20
  6. data/lib/configure_me/caching.rb +4 -4
  7. data/lib/configure_me/loading.rb +2 -2
  8. data/lib/configure_me/naming.rb +8 -6
  9. data/lib/configure_me/nesting.rb +35 -29
  10. data/lib/configure_me/persistence.rb +5 -4
  11. data/lib/configure_me/persisting.rb +4 -5
  12. data/lib/configure_me/validations.rb +7 -6
  13. data/lib/configure_me/version.rb +1 -1
  14. data/lib/configure_me.rb +1 -6
  15. data/spec/lib/configure_me/attribute_methods_spec.rb +113 -0
  16. data/spec/lib/configure_me/base_spec.rb +81 -0
  17. data/spec/lib/configure_me/caching_spec.rb +75 -0
  18. data/spec/lib/configure_me/loading_spec.rb +97 -0
  19. data/spec/lib/configure_me/naming_spec.rb +22 -0
  20. data/spec/lib/configure_me/nesting_spec.rb +54 -0
  21. data/spec/lib/configure_me/persistence_spec.rb +65 -0
  22. data/spec/lib/configure_me/persisting_spec.rb +119 -0
  23. data/spec/{configure_me → lib/configure_me}/setting_spec.rb +0 -0
  24. data/spec/spec_helper.rb +3 -1
  25. metadata +62 -31
  26. data/lib/configure_me/identity.rb +0 -15
  27. data/spec/configure_me/attribute_methods_spec.rb +0 -113
  28. data/spec/configure_me/base_spec.rb +0 -58
  29. data/spec/configure_me/caching_spec.rb +0 -75
  30. data/spec/configure_me/identity_spec.rb +0 -30
  31. data/spec/configure_me/loading_spec.rb +0 -84
  32. data/spec/configure_me/naming_spec.rb +0 -23
  33. data/spec/configure_me/nesting_spec.rb +0 -36
  34. data/spec/configure_me/persistence_spec.rb +0 -62
  35. data/spec/configure_me/persisting_spec.rb +0 -123
@@ -1,58 +0,0 @@
1
- require 'spec_helper'
2
-
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
11
- end
12
-
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')
17
- end
18
- end
19
-
20
- describe ConfigureMe::Base do
21
- it 'should enforce the singleton pattern' do
22
- lambda { ConfigureMe::Base.new }.should raise_error(NoMethodError)
23
- end
24
-
25
- class BaseConfig < ConfigureMe::Base
26
- setting :setting1, :type => :integer, :default => 12
27
- end
28
-
29
- subject { BaseConfig.instance }
30
- its(:persisted?) { should be_true }
31
- its(:class) { should respond_to(:setting1) }
32
-
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
38
-
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
51
- end
52
-
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')
56
- end
57
- end
58
- end
@@ -1,75 +0,0 @@
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
@@ -1,30 +0,0 @@
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
@@ -1,84 +0,0 @@
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
@@ -1,23 +0,0 @@
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
@@ -1,36 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ConfigureMe::Nesting, 'the class' do
4
- subject { ConfigureMe::Base }
5
- it { should respond_to(:nest_me) }
6
- end
7
-
8
- describe ConfigureMe::Nesting do
9
- before {
10
- @parent_class = define_test_class('ParentConfig', ConfigureMe::Base)
11
- @nested_class = define_test_class('NestedConfig', ConfigureMe::Base)
12
- @parent_config = @parent_class.instance
13
- @nested_config = @nested_class.instance
14
- @parent_class.stubs(:instance).returns(@parent_config)
15
- @nested_class.stubs(:instance).returns(@nested_config)
16
- @nested_class.send(:nest_me, @parent_class)
17
- }
18
-
19
- context 'a nested class' do
20
- subject { @nested_config }
21
- its(:children) { should be_empty }
22
- its(:all_configs) { should have(1).items }
23
- its(:parent_config) { should eql(@parent_config) }
24
- end
25
-
26
- context 'a parent class' do
27
- subject { @parent_config }
28
- its(:children) { should have(1).items }
29
- its(:children) { should eql(:nested => @nested_config) }
30
- its(:all_configs) { should have(2).items }
31
- its(:parent_config) { should be_nil }
32
- it { should respond_to(:nested) }
33
- its(:nested) { should eql(@nested_config) }
34
- its(:class) { should respond_to(:nested) }
35
- end
36
- end
@@ -1,62 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ConfigureMe::Persistence do
4
- before {
5
- @persistence_class = define_test_class('PersistenceConfig', ConfigureMe::Base)
6
- @config = @persistence_class.instance
7
- }
8
- subject { @config }
9
- describe 'saving' do
10
- before {
11
- @config.stubs(:write_persist)
12
- @config.stubs(:write_cache)
13
- @config.stubs(:make_clean)
14
- @temp_attrs = {:testsetting => 'newvalue'}
15
- @config.stubs(:temp_attributes).returns(@temp_attrs)
16
- @config.stubs(:persist_guard).yields
17
- }
18
- it 'should run callbacks' do
19
- @config.expects(:run_callbacks).at_least_once.yields
20
- @config.save
21
- end
22
- it 'should not run the validations if :validate => false is passed' do
23
- @config.expects(:valid?).never
24
- @config.save(:validate => false)
25
- end
26
- it 'should start a transaction' do
27
- @config.expects(:persist_guard)
28
- @config.save
29
- end
30
-
31
- it 'should persist the temp settings' do
32
- @config.expects(:write_persist).with(:testsetting, 'newvalue')
33
- @config.save
34
- end
35
-
36
- it 'should cache the temp settings' do
37
- @config.expects(:write_cache).with(:testsetting, 'newvalue')
38
- @config.save
39
- end
40
-
41
- it 'should clear the dirty status' do
42
- @config.expects(:make_clean)
43
- @config.save
44
- end
45
- end
46
-
47
- describe 'update_attributes' do
48
- before {
49
- @config.stubs(:write_attribute)
50
- }
51
- it 'should store the new attributes' do
52
- @config.stubs(:save)
53
- @config.expects(:write_attribute).with(:testsetting, 'updatedvalue')
54
- @config.update_attributes(:testsetting => 'updatedvalue')
55
- end
56
-
57
- it 'should attempt to save' do
58
- @config.expects(:save)
59
- @config.update_attributes(:testsetting => 'updatedvalue')
60
- end
61
- end
62
- end
@@ -1,123 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ConfigureMe::Persisting, 'the class' do
4
- subject { ConfigureMe::Base }
5
- it { should respond_to(:persist_me) }
6
- it { should respond_to(:persisting?) }
7
-
8
- context 'when the persistence_klass is nil' do
9
- before {
10
- @persisting_klass = define_test_class('PersistingConfig', ConfigureMe::Base)
11
- @persisting_klass.send(:persist_me)
12
- ConfigureMe.stubs(:persistence_klass).returns(nil)
13
- }
14
- subject { @persisting_klass }
15
- its(:persisting?) { should be_false }
16
- end
17
-
18
- describe 'persist_guard' do
19
- before {
20
- @persisting_klass = define_test_class('PersistingConfig', ConfigureMe::Base)
21
- }
22
- subject { @persisting_klass.instance }
23
- context 'when transactions are supported' do
24
- it 'should begin a transaction' do
25
- @transaction_class = mock('TransactionClass') do
26
- stubs(:transaction)
27
- end
28
- ConfigureMe.stubs(:persistence_klass).returns(@transaction_class)
29
- @transaction_class.expects(:transaction)
30
- subject.persist_guard
31
- end
32
- end
33
-
34
- context 'when persisting with something else' do
35
- it 'should just execute the block' do
36
- @non_transaction_class = mock('NonTransactionClass')
37
- ConfigureMe.stubs(:persistence_klass).returns(@non_transaction_class)
38
- @testvalue = 'default'
39
- subject.persist_guard do
40
- @testvalue = 'changed'
41
- end
42
- @testvalue.should eql('changed')
43
- end
44
- end
45
- end
46
- end
47
-
48
- describe ConfigureMe::Persisting, 'when persisting is enabled' do
49
- before {
50
- @persisting_class = define_test_class('PersistingConfig', ConfigureMe::Base)
51
- @persisted_setting = mock('PersistedSetting') do
52
- stubs(:value).returns('foo'.to_yaml)
53
- stubs(:value=)
54
- stubs(:save!)
55
- end
56
- @persistence_klass = mock('PersistenceKlass')
57
- @persistence_klass.stubs(:find_or_create_by_key).returns(@persisted_setting)
58
- @persistence_klass.stubs(:find_by_key).returns(@persisted_setting)
59
- ConfigureMe.stubs(:persistence_klass).returns(@persistence_klass)
60
- @persisting_class.send(:persist_me)
61
- }
62
- subject { @persisting_class.instance }
63
-
64
- describe 'read_persist' do
65
- it 'should read from the persistence store' do
66
- @persistence_klass.expects(:find_by_key).once.returns(@persisted_setting)
67
- subject.read_persist('persistedsetting')
68
- end
69
-
70
- context 'with a persisted value' do
71
- it 'should return the converted value' do
72
- subject.read_persist('persistedsetting').should eql('foo')
73
- end
74
- end
75
-
76
- context 'with a non-persisted value' do
77
- it 'should return nil' do
78
- @persistence_klass.stubs(:find_by_key).returns(nil)
79
- subject.read_persist('persistedsetting').should be_nil
80
- end
81
- end
82
- end
83
-
84
- describe 'write_persist' do
85
- it 'should retrieve or create the setting' do
86
- @persistence_klass.expects(:find_or_create_by_key).once.returns(@persisted_setting)
87
- subject.write_persist('persistedsetting', 'newvalue')
88
- end
89
- it 'should update the value' do
90
- @persisted_setting.expects(:value=).with('newvalue'.to_yaml)
91
- subject.write_persist('persistedsetting', 'newvalue')
92
- end
93
- it 'should save the record' do
94
- @persisted_setting.expects(:save!)
95
- subject.write_persist('persistedsetting', 'newvalue')
96
- end
97
- end
98
- end
99
-
100
- describe ConfigureMe::Persisting, 'when persisting is disabled' do
101
- before {
102
- @persisting_class = define_test_class('PersistingConfig', ConfigureMe::Base)
103
- @persisting_class.stubs(:persisting?).returns(false)
104
- }
105
- subject { @persisting_class.instance }
106
-
107
- describe 'read_persist' do
108
- it 'should not attempt to read from the persistence store' do
109
- ConfigureMe.expects(:persistence_klass).never
110
- subject.read_persist('persistedsetting')
111
- end
112
- it 'should return nil' do
113
- subject.read_persist('persistedsetting').should be_nil
114
- end
115
- end
116
-
117
- describe 'write_persist' do
118
- it 'should not attempt to write to the persistence store' do
119
- ConfigureMe.expects(:persistence_klass).never
120
- subject.write_persist('persistedsetting', 'newvalue')
121
- end
122
- end
123
- end