feature 1.2.0 → 1.3.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.
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