feature 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 83131f6c0bc8a7fe056a4c621130a968fcb1ec5a
4
- data.tar.gz: 9772c00ec3dd58a84a259162591fe3f3983019f6
3
+ metadata.gz: 19c7e68f322b7bd8ecc077e38301ca81f0101b98
4
+ data.tar.gz: 6494be8fbf82513c8bc3584f5b79ee64db13dce8
5
5
  SHA512:
6
- metadata.gz: fcfa2c4877b32898c8f08dff2531eb22089b6bd38d63caa95bc6752ff396034d6aef6fba1c038f6a0b509471da8126a45a5b884ac2d267fa49a23668c2753317
7
- data.tar.gz: 7c5cc34fbbe4007030e5708d2db9c50105a6cda84445492f5a881bb567f15db2cabef41b971fdabcc57a4fd45c0a917adc2b719935b1aa81647058ab4641475e
6
+ metadata.gz: e2552d77a0338981f11f30520712345a6f0e1b45f827748004fcf1fe373e6f0304826fd433bdadf2e572812705d96c7b5bf9d4e9f254d57803016c182b5414dc
7
+ data.tar.gz: 0b0208a6710fd63b2fdecc397a16895ad52cfc814465bc42ef2d49292e7bd242035794c652f803b13914fd0ef1d72b31f57980b61facaad31154b4f03bc06b97
@@ -1,3 +1,9 @@
1
+ ## 1.3.0 (2015-06-12)
2
+
3
+ * Support testing with multiple features (stevenwilkin)
4
+ * Bugfix when using auto_refresh and testing support (javidjamae)
5
+ * Fixing an issue with Feature.run_with_activated if @active_features is nil (tommyh)
6
+
1
7
  ## 1.2.0 (2014-10-28)
2
8
 
3
9
  * add Support for auto-refresh of feature data (javidjamae)
data/README.md CHANGED
@@ -13,9 +13,11 @@ The feature toggle functionality has to be configured by feature repositories. A
13
13
 
14
14
  With this approach Feature is higly configurable and not bound to a specific kind of configuration.
15
15
 
16
- **NOTE:** Ruby 1.8 is only supported until version 0.7.0. Later Versions require at least Ruby 1.9.
16
+ **NOTE:** Ruby 1.9 is supported explicitly only until version 1.2.0. Later version may require 2+.
17
17
 
18
- **NOTE:** Using feature with ActiveRecord and Rails 3 MAY work. Use version 1.1.0 if you need support for Rails 3.
18
+ **NOTE:** Ruby 1.8 is only supported until version 0.7.0. Later Versions require Ruby 1.9+.
19
+
20
+ **NOTE:** Using feature with ActiveRecord and Rails 3 MAY work. Version 1.1.0 supports Rails 3.
19
21
 
20
22
  ## Installation
21
23
 
@@ -52,11 +54,11 @@ With this approach Feature is higly configurable and not bound to a specific kin
52
54
 
53
55
  require 'feature/testing'
54
56
 
55
- Feature.run_with_activated(:feature_name) do
57
+ Feature.run_with_activated(:feature) do
56
58
  # your test code
57
59
  end
58
60
 
59
- Feature.run_with_deactivated(:feature_name) do
61
+ Feature.run_with_deactivated(:feature, :another_feature) do
60
62
  # your test code
61
63
  end
62
64
 
data/Rakefile CHANGED
@@ -15,4 +15,4 @@ task :mutant do
15
15
  fail unless result == Mutant::CLI::EXIT_SUCCESS
16
16
  end
17
17
 
18
- task default: [:spec, :rubocop, :mutant]
18
+ task default: [:spec, :rubocop]
@@ -71,14 +71,23 @@ module Feature
71
71
 
72
72
  return [] unless data['features']
73
73
 
74
- invalid_value = data['features'].values.select { |value| ![true, false].include?(value) }
75
- unless invalid_value.empty?
76
- fail ArgumentError, "#{invalid_value.first} is not allowed value in config, use true/false"
77
- end
74
+ check_valid_feature_data(data['features'])
78
75
 
79
76
  data['features'].keys.select { |key| data['features'][key] }.map(&:to_sym)
80
77
  end
81
78
  private :get_active_features
79
+
80
+ # Checks for valid values in given feature hash
81
+ #
82
+ # @param features [Hash] feature hash
83
+ #
84
+ def check_valid_feature_data(features)
85
+ features.values.each do |value|
86
+ unless [true, false].include?(value)
87
+ fail ArgumentError, "#{value} is not allowed value in config, use true/false"
88
+ end
89
+ end
90
+ end
82
91
  end
83
92
  end
84
93
  end
@@ -7,31 +7,47 @@ require 'feature'
7
7
  # To enable Feature testing capabilities do:
8
8
  # require 'feature/testing'
9
9
  module Feature
10
- # Execute the code block with the given feature active
10
+ # Execute the code block with the given features active
11
11
  #
12
12
  # Example usage:
13
- # Feature.run_with_activated(:feature) do
13
+ # Feature.run_with_activated(:feature, :another_feature) do
14
14
  # # your test code here
15
15
  # end
16
- def self.run_with_activated(feature)
17
- old_features = @active_features.dup
18
- @active_features.push(feature).uniq!
19
- yield
20
- ensure
21
- @active_features = old_features
16
+ def self.run_with_activated(*features, &blk)
17
+ with_stashed_config do
18
+ @active_features.concat(features).uniq!
19
+ @auto_refresh = false
20
+ @perform_initial_refresh = false
21
+ blk.call
22
+ end
22
23
  end
23
24
 
24
- # Execute the code block with the given feature deactive
25
+ # Execute the code block with the given features deactive
25
26
  #
26
27
  # Example usage:
27
- # Feature.run_with_deactivated(:feature) do
28
+ # Feature.run_with_deactivated(:feature, :another_feature) do
28
29
  # # your test code here
29
30
  # end
30
- def self.run_with_deactivated(feature)
31
+ def self.run_with_deactivated(*features, &blk)
32
+ with_stashed_config do
33
+ @active_features -= features
34
+ @auto_refresh = false
35
+ @perform_initial_refresh = false
36
+ blk.call
37
+ end
38
+ end
39
+
40
+ # Execute the given code block and store + restore the feature
41
+ # configuration before/after the execution
42
+ def self.with_stashed_config
43
+ @active_features = [] if @active_features.nil?
31
44
  old_features = @active_features.dup
32
- @active_features.delete(feature)
45
+ old_auto_refresh = @auto_refresh
46
+ old_perform_initial_refresh = @perform_initial_refresh
33
47
  yield
34
48
  ensure
35
49
  @active_features = old_features
50
+ @auto_refresh = old_auto_refresh
51
+ @perform_initial_refresh = old_perform_initial_refresh
36
52
  end
37
53
  end
@@ -58,8 +58,7 @@ describe Feature do
58
58
 
59
59
  it 'should reload active features on first call only' do
60
60
  @repository.add_active_feature(:feature_a)
61
- expect(@repository).to receive(:active_features).exactly(1).times
62
- .and_return(@repository.active_features)
61
+ expect(@repository).to receive(:active_features).once.and_return(@repository.active_features)
63
62
  Feature.active?(:feature_a)
64
63
  Feature.active?(:feature_a)
65
64
  end
@@ -71,8 +70,7 @@ describe Feature do
71
70
  end
72
71
  it 'should reload active features on every call' do
73
72
  @repository.add_active_feature(:feature_a)
74
- expect(@repository).to receive(:active_features).exactly(2).times
75
- .and_return(@repository.active_features)
73
+ expect(@repository).to receive(:active_features).twice.and_return(@repository.active_features)
76
74
  Feature.active?(:feature_a)
77
75
  Feature.active?(:feature_a)
78
76
  end
@@ -37,5 +37,4 @@ describe Feature::Repository::RedisRepository do
37
37
  @repository.add_active_feature :feature_a
38
38
  end.to raise_error(ArgumentError, 'feature :feature_a already added')
39
39
  end
40
-
41
40
  end
@@ -1,30 +1,107 @@
1
1
  require 'spec_helper'
2
2
  require 'feature/testing'
3
3
 
4
+ shared_examples 'a testable repository' do
5
+ before do
6
+ expect(Feature.active?(:active_feature)).to be_truthy
7
+ expect(Feature.active?(:another_active_feature)).to be_truthy
8
+ expect(Feature.active?(:deactive_feature)).to be_falsey
9
+ expect(Feature.active?(:another_deactive_feature)).to be_falsey
10
+ end
11
+
12
+ after do
13
+ expect(Feature.active?(:active_feature)).to be_truthy
14
+ expect(Feature.active?(:another_active_feature)).to be_truthy
15
+ expect(Feature.active?(:deactive_feature)).to be_falsey
16
+ expect(Feature.active?(:another_deactive_feature)).to be_falsey
17
+ end
18
+
19
+ describe '.run_with_activated' do
20
+ it 'activates a deactivated feature' do
21
+ Feature.run_with_activated(:deactive_feature) do
22
+ expect(Feature.active?(:deactive_feature)).to be_truthy
23
+ end
24
+ end
25
+
26
+ it 'activates multiple deactivated features' do
27
+ Feature.run_with_activated(:deactive_feature, :another_deactive_feature) do
28
+ expect(Feature.active?(:deactive_feature)).to be_truthy
29
+ expect(Feature.active?(:another_deactive_feature)).to be_truthy
30
+ end
31
+ end
32
+ end
33
+
34
+ describe '.run_with_deactivated' do
35
+ it 'deactivates an activated feature' do
36
+ Feature.run_with_deactivated(:active_feature) do
37
+ expect(Feature.active?(:active_feature)).to be_falsey
38
+ end
39
+ end
40
+
41
+ it 'deactivates multiple activated features' do
42
+ Feature.run_with_deactivated(:active_feature, :another_active_feature) do
43
+ expect(Feature.active?(:active_feature)).to be_falsey
44
+ expect(Feature.active?(:another_active_feature)).to be_falsey
45
+ end
46
+ end
47
+ end
48
+ end
49
+
4
50
  describe 'Feature testing support' do
5
- before(:each) do
6
- repository = SimpleRepository.new
7
- repository.add_active_feature(:active_feature)
8
- Feature.set_repository(repository)
51
+ context 'without auto_refresh' do
52
+ before(:all) do
53
+ repository = Feature::Repository::SimpleRepository.new
54
+ repository.add_active_feature(:active_feature)
55
+ repository.add_active_feature(:another_active_feature)
56
+ Feature.set_repository(repository)
57
+ end
58
+
59
+ it_behaves_like 'a testable repository'
9
60
  end
10
61
 
11
- it 'should execute code block with an deactivated feature' do
12
- expect(Feature.active?(:another_feature)).to be_falsey
62
+ context 'with auto_refresh' do
63
+ before(:all) do
64
+ repository = Feature::Repository::SimpleRepository.new
65
+ repository.add_active_feature(:active_feature)
66
+ repository.add_active_feature(:another_active_feature)
67
+ Feature.set_repository(repository, true)
68
+ end
13
69
 
14
- Feature.run_with_activated(:another_feature) do
15
- expect(Feature.active?(:another_feature)).to be_truthy
70
+ it_behaves_like 'a testable repository'
71
+
72
+ describe '.run_with_deactivated' do
73
+ it 'should disable perform_initial_refresh for the first call to Feature.active?' do
74
+ Feature.run_with_activated(:deactive_feature) do
75
+ expect(Feature.active?(:deactive_feature)).to be_truthy
76
+ end
77
+ end
16
78
  end
17
79
 
18
- expect(Feature.active?(:another_feature)).to be_falsey
80
+ describe '.run_with_deactivated' do
81
+ it 'should disable perform_initial_refresh for the first call to Feature.active?' do
82
+ Feature.run_with_deactivated(:active_feature) do
83
+ expect(Feature.active?(:active_feature)).to be_falsey
84
+ end
85
+ end
86
+ end
19
87
  end
20
88
 
21
- it 'should execute code block with an deactivated feature' do
22
- expect(Feature.active?(:active_feature)).to be_truthy
89
+ context 'with no features activated' do
90
+ before(:all) do
91
+ repository = Feature::Repository::SimpleRepository.new
92
+ Feature.set_repository(repository)
93
+ end
23
94
 
24
- Feature.run_with_deactivated(:active_feature) do
25
- expect(Feature.active?(:active_feature)).to be_falsey
95
+ describe '.run_with_activated' do
96
+ it 'should not raise an error' do
97
+ expect { Feature.run_with_activated(:foo) {} }.to_not raise_error
98
+ end
26
99
  end
27
100
 
28
- expect(Feature.active?(:active_feature)).to be_truthy
101
+ describe '.run_with_deactivated' do
102
+ it 'should not raise an error' do
103
+ expect { Feature.run_with_deactivated(:foo) {} }.to_not raise_error
104
+ end
105
+ end
29
106
  end
30
107
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feature
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Markus Gerdes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-28 00:00:00.000000000 Z
11
+ date: 2015-06-12 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: github@mgsnova.de
@@ -60,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
60
  version: '0'
61
61
  requirements: []
62
62
  rubyforge_project:
63
- rubygems_version: 2.2.2
63
+ rubygems_version: 2.4.8
64
64
  signing_key:
65
65
  specification_version: 4
66
66
  summary: Feature Toggle library for ruby