flipflop 2.2.1 → 2.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.
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: []