feature 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile +7 -3
- data/README.md +58 -7
- data/Rakefile +9 -1
- data/lib/feature.rb +20 -21
- data/lib/feature/generators/install_generator.rb +18 -27
- data/lib/feature/repository.rb +1 -0
- data/lib/feature/repository/active_record_repository.rb +4 -8
- data/lib/feature/repository/redis_repository.rb +59 -0
- data/lib/feature/repository/simple_repository.rb +5 -8
- data/lib/feature/repository/yaml_repository.rb +39 -21
- data/lib/feature/testing.rb +0 -1
- data/spec/feature/active_record_repository_spec.rb +19 -13
- data/spec/feature/feature_spec.rb +71 -39
- data/spec/feature/redis_repository_spec.rb +41 -0
- data/spec/feature/simple_repository_spec.rb +12 -6
- data/spec/feature/testing_spec.rb +3 -3
- data/spec/feature/yaml_repository_spec.rb +39 -25
- data/spec/integration/rails/test-against-several-rails-versions.sh +1 -1
- data/spec/integration/rails/test-against-specific-rails-version.sh +4 -1
- data/spec/spec_helper.rb +3 -0
- metadata +4 -7
- data/lib/feature/generators/templates/create_feature_toggles.rb +0 -10
- data/lib/feature/generators/templates/feature_toggle.rb +0 -6
- data/lib/feature/generators/templates/feature_toggle_without_attr_accessible.rb +0 -4
- data/spec/integration/rails/gemfiles/rails3.gemfile +0 -4
- data/spec/integration/rails/gemfiles/rails3.gemfile.lock +0 -86
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'feature/testing'
|
3
3
|
|
4
|
-
describe
|
4
|
+
describe 'Feature testing support' do
|
5
5
|
before(:each) do
|
6
6
|
repository = SimpleRepository.new
|
7
7
|
repository.add_active_feature(:active_feature)
|
8
8
|
Feature.set_repository(repository)
|
9
9
|
end
|
10
10
|
|
11
|
-
it
|
11
|
+
it 'should execute code block with an deactivated feature' do
|
12
12
|
expect(Feature.active?(:another_feature)).to be_falsey
|
13
13
|
|
14
14
|
Feature.run_with_activated(:another_feature) do
|
@@ -18,7 +18,7 @@ describe "Feature testing support" do
|
|
18
18
|
expect(Feature.active?(:another_feature)).to be_falsey
|
19
19
|
end
|
20
20
|
|
21
|
-
it
|
21
|
+
it 'should execute code block with an deactivated feature' do
|
22
22
|
expect(Feature.active?(:active_feature)).to be_truthy
|
23
23
|
|
24
24
|
Feature.run_with_deactivated(:active_feature) do
|
@@ -4,11 +4,11 @@ require 'tempfile'
|
|
4
4
|
include Feature::Repository
|
5
5
|
|
6
6
|
describe Feature::Repository::YamlRepository do
|
7
|
-
context
|
7
|
+
context 'proper config file' do
|
8
8
|
before(:each) do
|
9
9
|
@filename = Tempfile.new(['feature_config', '.yaml']).path
|
10
10
|
fp = File.new(@filename, 'w')
|
11
|
-
fp.write <<"EOF"
|
11
|
+
fp.write <<"EOF"
|
12
12
|
features:
|
13
13
|
feature_a_active: true
|
14
14
|
feature_b_active: true
|
@@ -24,14 +24,14 @@ EOF
|
|
24
24
|
File.delete(@filename)
|
25
25
|
end
|
26
26
|
|
27
|
-
it
|
27
|
+
it 'should read active features from a config file' do
|
28
28
|
expect(@repo.active_features).to eq([:feature_a_active, :feature_b_active])
|
29
29
|
end
|
30
30
|
|
31
|
-
context
|
31
|
+
context 're-read config file' do
|
32
32
|
before(:each) do
|
33
33
|
fp = File.new(@filename, 'w')
|
34
|
-
fp.write <<"EOF"
|
34
|
+
fp.write <<"EOF"
|
35
35
|
features:
|
36
36
|
feature_a_active: true
|
37
37
|
feature_c_inactive: false
|
@@ -39,30 +39,29 @@ EOF
|
|
39
39
|
fp.close
|
40
40
|
end
|
41
41
|
|
42
|
-
it
|
42
|
+
it 'should read active features new on each request' do
|
43
43
|
expect(@repo.active_features).to eq([:feature_a_active])
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
|
-
context "with no features" do
|
47
|
+
context 'with no features' do
|
49
48
|
before(:each) do
|
50
49
|
fp = File.new(@filename, 'w')
|
51
|
-
fp.write <<"EOF"
|
50
|
+
fp.write <<"EOF"
|
52
51
|
features:
|
53
52
|
EOF
|
54
53
|
fp.close
|
55
54
|
end
|
56
55
|
|
57
|
-
it
|
56
|
+
it 'should read active features new on each request' do
|
58
57
|
expect(@repo.active_features).to eq([])
|
59
58
|
end
|
60
59
|
end
|
61
60
|
|
62
|
-
context
|
61
|
+
context 'with optional environment name' do
|
63
62
|
before(:each) do
|
64
63
|
fp = File.new(@filename, 'w')
|
65
|
-
fp.write <<"EOF"
|
64
|
+
fp.write <<"EOF"
|
66
65
|
development:
|
67
66
|
features:
|
68
67
|
feature_a: true
|
@@ -75,12 +74,12 @@ EOF
|
|
75
74
|
fp.close
|
76
75
|
end
|
77
76
|
|
78
|
-
it
|
77
|
+
it 'has two active features for development environment' do
|
79
78
|
repo = YamlRepository.new(@filename, 'development')
|
80
79
|
expect(repo.active_features).to eq([:feature_a, :feature_b])
|
81
80
|
end
|
82
81
|
|
83
|
-
it
|
82
|
+
it 'has one active feature for production environment' do
|
84
83
|
repo = YamlRepository.new(@filename, 'production')
|
85
84
|
expect(repo.active_features).to eq([:feature_a])
|
86
85
|
end
|
@@ -88,11 +87,11 @@ EOF
|
|
88
87
|
|
89
88
|
# Sometimes needed when loading features from ENV variables or are time
|
90
89
|
# based rules Ex: Date.today > Date.strptime('1/2/2012', '%d/%m/%Y')
|
91
|
-
context
|
90
|
+
context 'a config file with embedded erb' do
|
92
91
|
before(:each) do
|
93
92
|
@filename = Tempfile.new(['feature_config', '.yaml']).path
|
94
93
|
fp = File.new(@filename, 'w')
|
95
|
-
fp.write <<"EOF"
|
94
|
+
fp.write <<"EOF"
|
96
95
|
features:
|
97
96
|
feature_a_active: <%= 'true' == 'true' %>
|
98
97
|
feature_b_active: true
|
@@ -104,35 +103,50 @@ EOF
|
|
104
103
|
@repo = YamlRepository.new(@filename)
|
105
104
|
end
|
106
105
|
|
107
|
-
it
|
106
|
+
it 'should read active features from the config file' do
|
108
107
|
expect(@repo.active_features).to eq([:feature_a_active, :feature_b_active])
|
109
108
|
end
|
110
109
|
end
|
111
110
|
end
|
112
111
|
|
113
|
-
it
|
114
|
-
repo = YamlRepository.new(
|
112
|
+
it 'should raise exception on no file found' do
|
113
|
+
repo = YamlRepository.new('/this/file/should/not/exist')
|
115
114
|
expect do
|
116
115
|
repo.active_features
|
117
116
|
end.to raise_error(Errno::ENOENT, /No such file or directory/)
|
118
117
|
end
|
119
118
|
|
120
|
-
it
|
119
|
+
it 'should raise exception on invalid yaml' do
|
121
120
|
@filename = Tempfile.new(['feature_config', '.yaml']).path
|
122
121
|
fp = File.new(@filename, 'w')
|
123
|
-
fp.write
|
122
|
+
fp.write 'this is not valid feature config'
|
124
123
|
fp.close
|
125
124
|
|
126
125
|
repo = YamlRepository.new(@filename)
|
127
126
|
expect do
|
128
127
|
repo.active_features
|
129
|
-
end.to raise_error(ArgumentError,
|
128
|
+
end.to raise_error(ArgumentError, 'yaml config does not contain proper config')
|
130
129
|
end
|
131
130
|
|
132
|
-
it
|
131
|
+
it 'should raise exception on yaml without features key' do
|
133
132
|
@filename = Tempfile.new(['feature_config', '.yaml']).path
|
134
133
|
fp = File.new(@filename, 'w')
|
135
|
-
fp.write <<"EOF"
|
134
|
+
fp.write <<"EOF"
|
135
|
+
fail:
|
136
|
+
feature: true
|
137
|
+
EOF
|
138
|
+
fp.close
|
139
|
+
|
140
|
+
repo = YamlRepository.new(@filename)
|
141
|
+
expect do
|
142
|
+
repo.active_features
|
143
|
+
end.to raise_error(ArgumentError, 'yaml config does not contain proper config')
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should raise exception on not true/false value in config' do
|
147
|
+
@filename = Tempfile.new(['feature_config', '.yaml']).path
|
148
|
+
fp = File.new(@filename, 'w')
|
149
|
+
fp.write <<"EOF"
|
136
150
|
features:
|
137
151
|
invalid_feature: neither_true_or_false
|
138
152
|
EOF
|
@@ -141,6 +155,6 @@ EOF
|
|
141
155
|
repo = YamlRepository.new(@filename)
|
142
156
|
expect do
|
143
157
|
repo.active_features
|
144
|
-
end.to raise_error(ArgumentError,
|
158
|
+
end.to raise_error(ArgumentError, 'neither_true_or_false is not allowed value in config, use true/false')
|
145
159
|
end
|
146
160
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
set -e
|
4
4
|
|
5
|
-
BUNDLE_GEMFILE=gemfiles/rails${RAILS_VERSION}.gemfile
|
5
|
+
export BUNDLE_GEMFILE=gemfiles/rails${RAILS_VERSION}.gemfile
|
6
6
|
|
7
7
|
TESTAPP_NAME=testapp
|
8
8
|
|
@@ -22,3 +22,6 @@ cd $TESTAPP_NAME
|
|
22
22
|
bundle install
|
23
23
|
bundle exec rails g feature:install
|
24
24
|
bundle exec rake db:migrate
|
25
|
+
|
26
|
+
cd ..
|
27
|
+
rm -Rf $TESTAPP_NAME
|
data/spec/spec_helper.rb
CHANGED
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.
|
4
|
+
version: 1.2.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-
|
11
|
+
date: 2014-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email: github@mgsnova.de
|
@@ -22,22 +22,19 @@ files:
|
|
22
22
|
- Rakefile
|
23
23
|
- lib/feature.rb
|
24
24
|
- lib/feature/generators/install_generator.rb
|
25
|
-
- lib/feature/generators/templates/create_feature_toggles.rb
|
26
25
|
- lib/feature/generators/templates/feature.rb
|
27
|
-
- lib/feature/generators/templates/feature_toggle.rb
|
28
|
-
- lib/feature/generators/templates/feature_toggle_without_attr_accessible.rb
|
29
26
|
- lib/feature/repository.rb
|
30
27
|
- lib/feature/repository/active_record_repository.rb
|
28
|
+
- lib/feature/repository/redis_repository.rb
|
31
29
|
- lib/feature/repository/simple_repository.rb
|
32
30
|
- lib/feature/repository/yaml_repository.rb
|
33
31
|
- lib/feature/testing.rb
|
34
32
|
- spec/feature/active_record_repository_spec.rb
|
35
33
|
- spec/feature/feature_spec.rb
|
34
|
+
- spec/feature/redis_repository_spec.rb
|
36
35
|
- spec/feature/simple_repository_spec.rb
|
37
36
|
- spec/feature/testing_spec.rb
|
38
37
|
- spec/feature/yaml_repository_spec.rb
|
39
|
-
- spec/integration/rails/gemfiles/rails3.gemfile
|
40
|
-
- spec/integration/rails/gemfiles/rails3.gemfile.lock
|
41
38
|
- spec/integration/rails/gemfiles/rails4.gemfile
|
42
39
|
- spec/integration/rails/gemfiles/rails4.gemfile.lock
|
43
40
|
- spec/integration/rails/test-against-several-rails-versions.sh
|
@@ -1,86 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: https://rubygems.org/
|
3
|
-
specs:
|
4
|
-
actionmailer (3.2.19)
|
5
|
-
actionpack (= 3.2.19)
|
6
|
-
mail (~> 2.5.4)
|
7
|
-
actionpack (3.2.19)
|
8
|
-
activemodel (= 3.2.19)
|
9
|
-
activesupport (= 3.2.19)
|
10
|
-
builder (~> 3.0.0)
|
11
|
-
erubis (~> 2.7.0)
|
12
|
-
journey (~> 1.0.4)
|
13
|
-
rack (~> 1.4.5)
|
14
|
-
rack-cache (~> 1.2)
|
15
|
-
rack-test (~> 0.6.1)
|
16
|
-
sprockets (~> 2.2.1)
|
17
|
-
activemodel (3.2.19)
|
18
|
-
activesupport (= 3.2.19)
|
19
|
-
builder (~> 3.0.0)
|
20
|
-
activerecord (3.2.19)
|
21
|
-
activemodel (= 3.2.19)
|
22
|
-
activesupport (= 3.2.19)
|
23
|
-
arel (~> 3.0.2)
|
24
|
-
tzinfo (~> 0.3.29)
|
25
|
-
activeresource (3.2.19)
|
26
|
-
activemodel (= 3.2.19)
|
27
|
-
activesupport (= 3.2.19)
|
28
|
-
activesupport (3.2.19)
|
29
|
-
i18n (~> 0.6, >= 0.6.4)
|
30
|
-
multi_json (~> 1.0)
|
31
|
-
arel (3.0.3)
|
32
|
-
builder (3.0.4)
|
33
|
-
erubis (2.7.0)
|
34
|
-
hike (1.2.3)
|
35
|
-
i18n (0.6.11)
|
36
|
-
journey (1.0.4)
|
37
|
-
json (1.8.1)
|
38
|
-
mail (2.5.4)
|
39
|
-
mime-types (~> 1.16)
|
40
|
-
treetop (~> 1.4.8)
|
41
|
-
mime-types (1.25.1)
|
42
|
-
multi_json (1.10.1)
|
43
|
-
polyglot (0.3.5)
|
44
|
-
rack (1.4.5)
|
45
|
-
rack-cache (1.2)
|
46
|
-
rack (>= 0.4)
|
47
|
-
rack-ssl (1.3.4)
|
48
|
-
rack
|
49
|
-
rack-test (0.6.2)
|
50
|
-
rack (>= 1.0)
|
51
|
-
rails (3.2.19)
|
52
|
-
actionmailer (= 3.2.19)
|
53
|
-
actionpack (= 3.2.19)
|
54
|
-
activerecord (= 3.2.19)
|
55
|
-
activeresource (= 3.2.19)
|
56
|
-
activesupport (= 3.2.19)
|
57
|
-
bundler (~> 1.0)
|
58
|
-
railties (= 3.2.19)
|
59
|
-
railties (3.2.19)
|
60
|
-
actionpack (= 3.2.19)
|
61
|
-
activesupport (= 3.2.19)
|
62
|
-
rack-ssl (~> 1.3.2)
|
63
|
-
rake (>= 0.8.7)
|
64
|
-
rdoc (~> 3.4)
|
65
|
-
thor (>= 0.14.6, < 2.0)
|
66
|
-
rake (10.3.2)
|
67
|
-
rdoc (3.12.2)
|
68
|
-
json (~> 1.4)
|
69
|
-
sprockets (2.2.2)
|
70
|
-
hike (~> 1.2)
|
71
|
-
multi_json (~> 1.0)
|
72
|
-
rack (~> 1.0)
|
73
|
-
tilt (~> 1.1, != 1.3.0)
|
74
|
-
thor (0.19.1)
|
75
|
-
tilt (1.4.1)
|
76
|
-
treetop (1.4.15)
|
77
|
-
polyglot
|
78
|
-
polyglot (>= 0.3.1)
|
79
|
-
tzinfo (0.3.40)
|
80
|
-
|
81
|
-
PLATFORMS
|
82
|
-
ruby
|
83
|
-
|
84
|
-
DEPENDENCIES
|
85
|
-
rails (~> 3.2.19)
|
86
|
-
railties
|