flipflop 2.2.1 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +0 -1
  3. data/.travis.yml +23 -27
  4. data/CHANGES.md +7 -0
  5. data/Gemfile +14 -8
  6. data/README.md +27 -1
  7. data/Rakefile +20 -8
  8. data/app/controllers/flipflop/features_controller.rb +20 -10
  9. data/app/controllers/flipflop/strategies_controller.rb +4 -4
  10. data/app/views/flipflop/features/index.html.erb +64 -41
  11. data/app/views/flipflop/stylesheets/_flipflop.css +1 -0
  12. data/app/views/layouts/flipflop.html.erb +8 -1
  13. data/config/features.rb +7 -0
  14. data/config/locales/en.yml +34 -0
  15. data/flipflop.gemspec +0 -5
  16. data/lib/flipflop/configurable.rb +10 -0
  17. data/lib/flipflop/engine.rb +10 -15
  18. data/lib/flipflop/feature_definition.rb +5 -6
  19. data/lib/flipflop/feature_loader.rb +40 -0
  20. data/lib/flipflop/feature_set.rb +7 -9
  21. data/lib/flipflop/group_definition.rb +11 -0
  22. data/lib/flipflop/strategies/abstract_strategy.rb +2 -1
  23. data/lib/flipflop/version.rb +1 -1
  24. data/lib/flipflop.rb +2 -0
  25. data/lib/test_engine/config/features.rb +3 -0
  26. data/lib/test_engine/test_engine.rb +7 -0
  27. data/src/stylesheets/_flipflop.scss +160 -0
  28. data/test/integration/app_test.rb +50 -21
  29. data/test/integration/dashboard_test.rb +395 -52
  30. data/test/templates/nl.yml +30 -0
  31. data/test/templates/test_app_features.rb +7 -0
  32. data/test/templates/test_engine.rb +7 -0
  33. data/test/templates/test_engine_features.rb +3 -0
  34. data/test/test_helper.rb +83 -10
  35. data/test/unit/configurable_test.rb +1 -1
  36. data/test/unit/feature_definition_test.rb +27 -2
  37. data/test/unit/feature_set_test.rb +7 -19
  38. data/test/unit/flipflop_test.rb +16 -11
  39. data/test/unit/group_definition_test.rb +21 -0
  40. data/test/unit/strategies/abstract_strategy_test.rb +14 -25
  41. data/test/unit/strategies/active_record_strategy_test.rb +4 -0
  42. data/test/unit/strategies/cookie_strategy_test.rb +4 -0
  43. data/test/unit/strategies/default_strategy_test.rb +10 -4
  44. data/test/unit/strategies/lambda_strategy_test.rb +11 -27
  45. data/test/unit/strategies/query_string_strategy_test.rb +4 -0
  46. data/test/unit/strategies/redis_strategy_test.rb +4 -0
  47. data/test/unit/strategies/session_strategy_test.rb +4 -0
  48. data/test/unit/strategies/test_strategy_test.rb +4 -0
  49. metadata +22 -9
  50. data/app/assets/stylesheets/flipflop.css +0 -1
data/test/test_helper.rb CHANGED
@@ -5,6 +5,7 @@ gem "minitest"
5
5
  require "minitest/autorun"
6
6
 
7
7
  require "action_controller"
8
+ require "rails/generators"
8
9
 
9
10
  # Who is setting this to true? :o
10
11
  $VERBOSE = false
@@ -37,29 +38,67 @@ def reload_constant(name)
37
38
  Object.const_get(name)
38
39
  end
39
40
 
41
+ class TestEngineGenerator < Rails::Generators::Base
42
+ source_root File.expand_path("../templates", __FILE__)
43
+
44
+ def copy_engine_file
45
+ copy_file "test_engine.rb", "lib/test_engine/test_engine.rb"
46
+ end
47
+
48
+ def copy_engine_features_file
49
+ copy_file "test_engine_features.rb", "lib/test_engine/config/features.rb"
50
+ end
51
+
52
+ def require_engine
53
+ environment "require 'test_engine/test_engine'"
54
+ end
55
+ end
56
+
57
+ class TestFeaturesGenerator < Rails::Generators::Base
58
+ source_root File.expand_path("../templates", __FILE__)
59
+
60
+ def copy_app_features_file
61
+ copy_file "test_app_features.rb", "config/features.rb"
62
+ end
63
+ end
64
+
65
+ class TestLocaleGenerator < Rails::Generators::Base
66
+ source_root File.expand_path("../templates", __FILE__)
67
+
68
+ def copy_locale_file
69
+ copy_file "nl.yml", "config/locales/nl.yml"
70
+ end
71
+ end
72
+
40
73
  class TestApp
41
74
  class << self
42
- def new
43
- ActiveSupport::Dependencies.remove_constant("App")
44
- super.tap do |current|
75
+ def new(generators = [])
76
+ name = "my_test_app"
77
+ super(name, generators).tap do |current|
45
78
  current.create!
46
79
  current.load!
47
80
  current.migrate!
48
- reload_constant("Flipflop::Feature")
49
81
  end
50
82
  end
51
83
  end
52
84
 
85
+ attr_reader :name, :generators
86
+
87
+ def initialize(name, generators = [])
88
+ @name = name
89
+ @generators = generators
90
+ end
91
+
53
92
  def create!
54
- require "rails/generators"
55
93
  require "rails/generators/rails/app/app_generator"
56
94
  require "generators/flipflop/install/install_generator"
57
95
 
58
- FileUtils.rm_rf(File.expand_path("../../tmp/app", __FILE__))
96
+ FileUtils.rm_rf(File.expand_path("../../" + path, __FILE__))
59
97
  Dir.chdir(File.expand_path("../..", __FILE__))
60
98
 
61
- Rails::Generators::AppGenerator.new(["tmp/app"],
99
+ Rails::Generators::AppGenerator.new([path],
62
100
  quiet: true,
101
+ api: ENV["RAILS_API_ONLY"].to_i.nonzero?,
63
102
  skip_active_job: true,
64
103
  skip_bundle: true,
65
104
  skip_gemfile: true,
@@ -74,15 +113,26 @@ class TestApp
74
113
  Flipflop::InstallGenerator.new([],
75
114
  quiet: true,
76
115
  ).invoke_all
116
+
117
+ generators.each do |generator|
118
+ generator.new([], quiet: true, force: true).invoke_all
119
+ end
77
120
  end
78
121
 
79
122
  def load!
80
123
  ENV["RAILS_ENV"] = "test"
81
124
  require "rails"
82
125
  require "flipflop/engine"
83
- require File.expand_path("../../tmp/app/config/environment", __FILE__)
84
- ActiveSupport::Dependencies.mechanism = :load
85
- load(Rails.application.paths["config/features.rb"].existent.first)
126
+
127
+ load File.expand_path("../../#{path}/config/application.rb", __FILE__)
128
+ load File.expand_path("../../#{path}/config/environments/test.rb", __FILE__)
129
+ Rails.application.config.cache_classes = false
130
+ Rails.application.config.action_view.raise_on_missing_translations = true
131
+ Rails.application.config.i18n.enforce_available_locales = false
132
+ Rails.application.initialize!
133
+
134
+ I18n.locale = :en
135
+
86
136
  require "capybara/rails"
87
137
  end
88
138
 
@@ -94,9 +144,32 @@ class TestApp
94
144
  ActiveRecord::Migrator.migrate(Rails.application.paths["db/migrate"].to_a)
95
145
  end
96
146
 
147
+ def unload!
148
+ Flipflop::Strategies::AbstractStrategy::RequestInterceptor.request = nil
149
+ Flipflop::FeatureLoader.instance_variable_set(:@current, nil)
150
+
151
+ match = -> (path) { path.include?(File.expand_path("../..", __FILE__)) }
152
+ Rails.application.config.i18n.railties_load_path.reject!(&match)
153
+ Rails.application.config.i18n.load_path.reject!(&match)
154
+ I18n.load_path.reject!(&match)
155
+
156
+ Rails.app_class.instance_variable_set(:@instance, nil) if defined?(Rails.app_class)
157
+ Rails.instance_variable_set(:@application, nil)
158
+ I18n::Railtie.instance_variable_set(:@i18n_inited, false)
159
+
160
+ ActiveSupport::Dependencies.remove_constant(name.camelize)
161
+ ActiveSupport::Dependencies.remove_constant("Flipflop::Feature")
162
+ end
163
+
164
+ private
165
+
97
166
  def silence_stdout
98
167
  stdout, $stdout = $stdout, StringIO.new
99
168
  yield rescue nil
100
169
  $stdout = stdout
101
170
  end
171
+
172
+ def path
173
+ "tmp/" + name
174
+ end
102
175
  end
@@ -2,7 +2,7 @@ require File.expand_path("../../test_helper", __FILE__)
2
2
 
3
3
  describe Flipflop::Configurable do
4
4
  subject do
5
- Flipflop::FeatureSet.current.reset!
5
+ Flipflop::FeatureSet.current.send(:initialize)
6
6
  Module.new do
7
7
  extend Flipflop::Configurable
8
8
  end
@@ -10,13 +10,25 @@ describe Flipflop::FeatureDefinition do
10
10
  assert_equal :my_key, subject.key
11
11
  end
12
12
 
13
- it "should have humanized description" do
14
- assert_equal "My key.", subject.description
13
+ it "should have name derived from key" do
14
+ assert_equal "my_key", subject.name
15
+ end
16
+
17
+ it "should have title derived from key" do
18
+ assert_equal "My key", subject.title
19
+ end
20
+
21
+ it "should have no description" do
22
+ assert_nil subject.description
15
23
  end
16
24
 
17
25
  it "should default to false" do
18
26
  assert_equal false, subject.default
19
27
  end
28
+
29
+ it "should have no group" do
30
+ assert_nil subject.group
31
+ end
20
32
  end
21
33
 
22
34
  describe "with options" do
@@ -24,6 +36,7 @@ describe Flipflop::FeatureDefinition do
24
36
  Flipflop::FeatureDefinition.new(:my_key,
25
37
  default: true,
26
38
  description: "Awesome feature",
39
+ group: Flipflop::GroupDefinition.new(:my_group),
27
40
  )
28
41
  end
29
42
 
@@ -31,6 +44,14 @@ describe Flipflop::FeatureDefinition do
31
44
  assert_equal :my_key, subject.key
32
45
  end
33
46
 
47
+ it "should have name derived from key" do
48
+ assert_equal "my_key", subject.name
49
+ end
50
+
51
+ it "should have title derived from key" do
52
+ assert_equal "My key", subject.title
53
+ end
54
+
34
55
  it "should have specified description" do
35
56
  assert_equal "Awesome feature", subject.description
36
57
  end
@@ -38,5 +59,9 @@ describe Flipflop::FeatureDefinition do
38
59
  it "should have specified default" do
39
60
  assert_equal true, subject.default
40
61
  end
62
+
63
+ it "should have specified group" do
64
+ assert_equal :my_group, subject.group.key
65
+ end
41
66
  end
42
67
  end
@@ -19,7 +19,7 @@ end
19
19
 
20
20
  describe Flipflop::FeatureSet do
21
21
  subject do
22
- Flipflop::FeatureSet.current.reset!
22
+ Flipflop::FeatureSet.current.send(:initialize)
23
23
  Flipflop::FeatureSet.current.tap do |set|
24
24
  set.add(Flipflop::FeatureDefinition.new(:one))
25
25
  end
@@ -105,18 +105,12 @@ describe Flipflop::FeatureSet do
105
105
  assert subject.feature(feature.key).frozen?
106
106
  end
107
107
 
108
- it "should raise if feature with same key is added" do
108
+ it "should raise error with message if feature with same key is added" do
109
109
  subject.add(Flipflop::FeatureDefinition.new(:feature))
110
- assert_raises Flipflop::FeatureError do
111
- subject.add(Flipflop::FeatureDefinition.new(:feature))
112
- end
113
- end
114
-
115
- it "should raise with message if feature with same key is added" do
116
- subject.add(Flipflop::FeatureDefinition.new(:feature))
117
- assert_raises Flipflop::FeatureError do
110
+ error = assert_raises Flipflop::FeatureError do
118
111
  subject.add(Flipflop::FeatureDefinition.new(:feature))
119
112
  end
113
+ assert_equal "Feature 'feature' already defined.", error.message
120
114
  end
121
115
  end
122
116
 
@@ -131,18 +125,12 @@ describe Flipflop::FeatureSet do
131
125
  assert subject.strategy(strategy.key).frozen?
132
126
  end
133
127
 
134
- it "should raise if strategy with same key is added" do
128
+ it "should raise error with message if strategy with same key is added" do
135
129
  subject.use(NullStrategy.new)
136
- assert_raises Flipflop::StrategyError do
137
- subject.use(NullStrategy.new)
138
- end
139
- end
140
-
141
- it "should raise with message if strategy with same key is added" do
142
- subject.use(NullStrategy.new)
143
- assert_raises Flipflop::StrategyError do
130
+ error = assert_raises Flipflop::StrategyError do
144
131
  subject.use(NullStrategy.new)
145
132
  end
133
+ assert_equal "Strategy 'null' (NullStrategy) already defined with identical options.", error.message
146
134
  end
147
135
  end
148
136
 
@@ -2,22 +2,25 @@ require File.expand_path("../../test_helper", __FILE__)
2
2
 
3
3
  describe Flipflop do
4
4
  before do
5
- Flipflop.configure do
6
- feature :one, default: true
7
- feature :two, default: false
5
+ Flipflop::FeatureSet.current.replace do
6
+ Flipflop.configure do
7
+ feature :one, default: true
8
+ feature :two, default: false
9
+ end
8
10
  end
9
11
  end
10
12
 
11
- describe "configure" do
13
+ describe "replace" do
12
14
  before do
13
- Flipflop.configure do
14
- feature :config_feature, default: true
15
+ Flipflop::FeatureSet.current.replace do
16
+ Flipflop.configure do
17
+ feature :config_feature, default: true
18
+ end
15
19
  end
16
20
  end
17
21
 
18
22
  it "should reset feature set" do
19
- Flipflop.configure do
20
- end
23
+ Flipflop::FeatureSet.current.replace
21
24
  assert_equal [], Flipflop::FeatureSet.current.features
22
25
  end
23
26
 
@@ -57,9 +60,11 @@ describe Flipflop do
57
60
  end
58
61
  end
59
62
 
60
- Flipflop.configure do
61
- strategy counter
62
- feature :one, default: true
63
+ Flipflop::FeatureSet.current.replace do
64
+ Flipflop.configure do
65
+ strategy counter
66
+ feature :one, default: true
67
+ end
63
68
  end
64
69
 
65
70
  begin
@@ -0,0 +1,21 @@
1
+ require File.expand_path("../../test_helper", __FILE__)
2
+
3
+ describe Flipflop::GroupDefinition do
4
+ describe "with defaults" do
5
+ subject do
6
+ Flipflop::GroupDefinition.new(:my_key)
7
+ end
8
+
9
+ it "should have specified key" do
10
+ assert_equal :my_key, subject.key
11
+ end
12
+
13
+ it "should have name derived from key" do
14
+ assert_equal "my_key", subject.name
15
+ end
16
+
17
+ it "should have title derived from key" do
18
+ assert_equal "My key", subject.title
19
+ end
20
+ end
21
+ end
@@ -14,6 +14,10 @@ describe Flipflop::Strategies::AbstractStrategy do
14
14
  assert_equal "abstract", subject.name
15
15
  end
16
16
 
17
+ it "should have title derived from name" do
18
+ assert_equal "Abstract", subject.title
19
+ end
20
+
17
21
  it "should have no default description" do
18
22
  assert_nil subject.description
19
23
  end
@@ -36,22 +40,12 @@ describe Flipflop::Strategies::AbstractStrategy do
36
40
  assert_equal 3, subject.send(:request)
37
41
  end
38
42
 
39
- it "should raise if request is missing" do
40
- Flipflop::Strategies::AbstractStrategy::RequestInterceptor.request = nil
41
- assert_raises Flipflop::StrategyError do
42
- subject.send(:request)
43
- end
44
- end
45
-
46
- it "should raise with message if request is missing" do
43
+ it "should raise error with message if request is missing" do
47
44
  Flipflop::Strategies::AbstractStrategy::RequestInterceptor.request = nil
48
- message = nil
49
- begin
45
+ error = assert_raises Flipflop::StrategyError do
50
46
  subject.send(:request)
51
- rescue => err
52
- message = err.message
53
47
  end
54
- assert_equal "Strategy 'abstract' required request, but was used outside request context.", message
48
+ assert_equal "Strategy 'abstract' required request, but was used outside request context.", error.message
55
49
  end
56
50
 
57
51
  it "should raise if request is missing in thread" do
@@ -88,6 +82,10 @@ describe Flipflop::Strategies::AbstractStrategy do
88
82
  assert_equal "strategy", subject.name
89
83
  end
90
84
 
85
+ it "should have title derived from name" do
86
+ assert_equal "Strategy", subject.title
87
+ end
88
+
91
89
  it "should have specified description" do
92
90
  assert_equal "my strategy", subject.description
93
91
  end
@@ -105,20 +103,11 @@ describe Flipflop::Strategies::AbstractStrategy do
105
103
  ).freeze
106
104
  end
107
105
 
108
- it "should raise error" do
109
- assert_raises Flipflop::StrategyError do
110
- subject
111
- end
112
- end
113
-
114
- it "should raise with message" do
115
- message = nil
116
- begin
106
+ it "should raise error with message" do
107
+ error = assert_raises Flipflop::StrategyError do
117
108
  subject
118
- rescue => err
119
- message = err.message
120
109
  end
121
- assert_equal "Strategy 'abstract' did not understand option :unknown, :other.", message
110
+ assert_equal "Strategy 'abstract' did not understand option :unknown, :other.", error.message
122
111
  end
123
112
  end
124
113
  end
@@ -46,6 +46,10 @@ describe Flipflop::Strategies::ActiveRecordStrategy do
46
46
  assert_equal "active_record", subject.name
47
47
  end
48
48
 
49
+ it "should have title derived from name" do
50
+ assert_equal "Active record", subject.title
51
+ end
52
+
49
53
  it "should have default description" do
50
54
  assert_equal "Stores features in database. Applies to all users.",
51
55
  subject.description
@@ -18,6 +18,10 @@ describe Flipflop::Strategies::CookieStrategy do
18
18
  assert_equal "cookie", subject.name
19
19
  end
20
20
 
21
+ it "should have title derived from name" do
22
+ assert_equal "Cookie", subject.title
23
+ end
24
+
21
25
  it "should have default description" do
22
26
  assert_equal "Stores features in a browser cookie. Applies to current user.",
23
27
  subject.description
@@ -2,12 +2,14 @@ require File.expand_path("../../../test_helper", __FILE__)
2
2
 
3
3
  describe Flipflop::Strategies::DefaultStrategy do
4
4
  before do
5
- Flipflop.configure do
6
- feature :one, default: true
7
- feature :two
5
+ Flipflop::FeatureSet.current.replace do
6
+ Flipflop.configure do
7
+ feature :one, default: true
8
+ feature :two
9
+ end
8
10
  end
9
11
  end
10
-
12
+
11
13
  describe "with defaults" do
12
14
  subject do
13
15
  Flipflop::Strategies::DefaultStrategy.new.freeze
@@ -17,6 +19,10 @@ describe Flipflop::Strategies::DefaultStrategy do
17
19
  assert_equal "default", subject.name
18
20
  end
19
21
 
22
+ it "should have title derived from name" do
23
+ assert_equal "Default", subject.title
24
+ end
25
+
20
26
  it "should have no default description" do
21
27
  assert_equal "Uses feature default status.", subject.description
22
28
  end
@@ -10,6 +10,10 @@ describe Flipflop::Strategies::LambdaStrategy do
10
10
  assert_equal "lambda", subject.name
11
11
  end
12
12
 
13
+ it "should have title derived from name" do
14
+ assert_equal "Lambda", subject.title
15
+ end
16
+
13
17
  it "should not have default description" do
14
18
  assert_equal "Resolves feature settings with custom code.",
15
19
  subject.description
@@ -94,44 +98,24 @@ describe Flipflop::Strategies::LambdaStrategy do
94
98
  Flipflop::Strategies::LambdaStrategy.new(lambda: ->() { }).freeze
95
99
  end
96
100
 
97
- it "should raise error" do
98
- assert_raises Flipflop::StrategyError do
99
- subject
100
- end
101
- end
102
-
103
- it "should raise with message" do
104
- message = nil
105
- begin
101
+ it "should raise error with message" do
102
+ error = assert_raises Flipflop::StrategyError do
106
103
  subject
107
- rescue => err
108
- message = err.message
109
104
  end
110
- assert_equal "Strategy 'lambda' has lambda with arity 0, expected 1 or -1.", message
105
+ assert_equal "Strategy 'lambda' has lambda with arity 0, expected 1 or -1.", error.message
111
106
  end
112
107
  end
113
108
 
114
109
  describe "with non conforming return value" do
115
110
  subject do
116
- Flipflop::Strategies::LambdaStrategy.new(lambda: ->(feature) {
117
- return feature
118
- }).freeze
119
- end
120
-
121
- it "should raise error" do
122
- assert_raises Flipflop::StrategyError do
123
- subject.enabled?(:one)
124
- end
111
+ Flipflop::Strategies::LambdaStrategy.new(lambda: -> (feature) {feature}).freeze
125
112
  end
126
113
 
127
- it "should raise with message" do
128
- message = nil
129
- begin
114
+ it "should raise error with message" do
115
+ error = assert_raises Flipflop::StrategyError do
130
116
  subject.enabled?(:one)
131
- rescue => err
132
- message = err.message
133
117
  end
134
- assert_equal "Strategy 'lambda' returned invalid result :one for feature 'one'.", message
118
+ assert_equal "Strategy 'lambda' returned invalid result :one for feature 'one'.", error.message
135
119
  end
136
120
  end
137
121
  end
@@ -18,6 +18,10 @@ describe Flipflop::Strategies::QueryStringStrategy do
18
18
  assert_equal "query_string", subject.name
19
19
  end
20
20
 
21
+ it "should have title derived from name" do
22
+ assert_equal "Query string", subject.title
23
+ end
24
+
21
25
  it "should not have default description" do
22
26
  assert_equal "Interprets query string parameters as features.",
23
27
  subject.description
@@ -16,6 +16,10 @@ describe Flipflop::Strategies::RedisStrategy do
16
16
  assert_equal "redis", subject.name
17
17
  end
18
18
 
19
+ it "should have title derived from name" do
20
+ assert_equal "Redis", subject.title
21
+ end
22
+
19
23
  it "should have default description" do
20
24
  assert_equal "Stores features in Redis. Applies to all users.",
21
25
  subject.description
@@ -18,6 +18,10 @@ describe Flipflop::Strategies::SessionStrategy do
18
18
  assert_equal "session", subject.name
19
19
  end
20
20
 
21
+ it "should have title derived from name" do
22
+ assert_equal "Session", subject.title
23
+ end
24
+
21
25
  it "should have default description" do
22
26
  assert_equal "Stores features in the user session. Applies to current user.",
23
27
  subject.description
@@ -10,6 +10,10 @@ describe Flipflop::Strategies::TestStrategy do
10
10
  assert_equal "test", subject.name
11
11
  end
12
12
 
13
+ it "should have title derived from name" do
14
+ assert_equal "Test", subject.title
15
+ end
16
+
13
17
  it "should not have default description" do
14
18
  assert_nil subject.description
15
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipflop
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Annesley
@@ -10,20 +10,20 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-05-04 00:00:00.000000000 Z
13
+ date: 2017-02-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - ! '>='
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
21
  version: '4.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - ! '>='
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '4.0'
29
29
  description: Declarative API for specifying features, switchable in declaration, database
@@ -36,18 +36,21 @@ executables: []
36
36
  extensions: []
37
37
  extra_rdoc_files: []
38
38
  files:
39
- - .gitignore
40
- - .travis.yml
39
+ - ".gitignore"
40
+ - ".travis.yml"
41
+ - CHANGES.md
41
42
  - Gemfile
42
43
  - LICENSE
43
44
  - README.md
44
45
  - Rakefile
45
- - app/assets/stylesheets/flipflop.css
46
46
  - app/controllers/flipflop/features_controller.rb
47
47
  - app/controllers/flipflop/strategies_controller.rb
48
48
  - app/models/flipflop/feature.rb
49
49
  - app/views/flipflop/features/index.html.erb
50
+ - app/views/flipflop/stylesheets/_flipflop.css
50
51
  - app/views/layouts/flipflop.html.erb
52
+ - config/features.rb
53
+ - config/locales/en.yml
51
54
  - config/routes.rb
52
55
  - flipflop.gemspec
53
56
  - lib/flipflop.rb
@@ -56,7 +59,9 @@ files:
56
59
  - lib/flipflop/facade.rb
57
60
  - lib/flipflop/feature_cache.rb
58
61
  - lib/flipflop/feature_definition.rb
62
+ - lib/flipflop/feature_loader.rb
59
63
  - lib/flipflop/feature_set.rb
64
+ - lib/flipflop/group_definition.rb
60
65
  - lib/flipflop/strategies/abstract_strategy.rb
61
66
  - lib/flipflop/strategies/active_record_strategy.rb
62
67
  - lib/flipflop/strategies/cookie_strategy.rb
@@ -77,14 +82,22 @@ files:
77
82
  - lib/generators/flipflop/migration/templates/create_features.rb
78
83
  - lib/generators/flipflop/routes/USAGE
79
84
  - lib/generators/flipflop/routes/routes_generator.rb
85
+ - lib/test_engine/config/features.rb
86
+ - lib/test_engine/test_engine.rb
87
+ - src/stylesheets/_flipflop.scss
80
88
  - test/integration/app_test.rb
81
89
  - test/integration/dashboard_test.rb
90
+ - test/templates/nl.yml
91
+ - test/templates/test_app_features.rb
92
+ - test/templates/test_engine.rb
93
+ - test/templates/test_engine_features.rb
82
94
  - test/test_helper.rb
83
95
  - test/unit/configurable_test.rb
84
96
  - test/unit/feature_cache_test.rb
85
97
  - test/unit/feature_definition_test.rb
86
98
  - test/unit/feature_set_test.rb
87
99
  - test/unit/flipflop_test.rb
100
+ - test/unit/group_definition_test.rb
88
101
  - test/unit/strategies/abstract_strategy_request_test.rb
89
102
  - test/unit/strategies/abstract_strategy_test.rb
90
103
  - test/unit/strategies/active_record_strategy_test.rb
@@ -106,12 +119,12 @@ require_paths:
106
119
  - lib
107
120
  required_ruby_version: !ruby/object:Gem::Requirement
108
121
  requirements:
109
- - - ! '>='
122
+ - - ">="
110
123
  - !ruby/object:Gem::Version
111
124
  version: '0'
112
125
  required_rubygems_version: !ruby/object:Gem::Requirement
113
126
  requirements:
114
- - - ! '>='
127
+ - - ">="
115
128
  - !ruby/object:Gem::Version
116
129
  version: '0'
117
130
  requirements: []