flip2 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +2 -0
  6. data/README.md +180 -0
  7. data/Rakefile +11 -0
  8. data/TODO +3 -0
  9. data/app/assets/stylesheets/flip.css +70 -0
  10. data/app/controllers/flip/features_controller.rb +47 -0
  11. data/app/controllers/flip/strategies_controller.rb +31 -0
  12. data/app/helpers/flip_helper.rb +9 -0
  13. data/app/views/flip/features/index.html.erb +62 -0
  14. data/config/routes.rb +14 -0
  15. data/flip.gemspec +27 -0
  16. data/lib/flip/abstract_strategy.rb +26 -0
  17. data/lib/flip/cacheable.rb +25 -0
  18. data/lib/flip/controller_filters.rb +25 -0
  19. data/lib/flip/cookie_strategy.rb +67 -0
  20. data/lib/flip/database_strategy.rb +46 -0
  21. data/lib/flip/declarable.rb +24 -0
  22. data/lib/flip/declaration_strategy.rb +20 -0
  23. data/lib/flip/definition.rb +21 -0
  24. data/lib/flip/engine.rb +9 -0
  25. data/lib/flip/facade.rb +18 -0
  26. data/lib/flip/feature_set.rb +57 -0
  27. data/lib/flip/forbidden.rb +7 -0
  28. data/lib/flip/version.rb +3 -0
  29. data/lib/flip2.rb +28 -0
  30. data/lib/generators/flip/install/install_generator.rb +9 -0
  31. data/lib/generators/flip/migration/USAGE +5 -0
  32. data/lib/generators/flip/migration/migration_generator.rb +22 -0
  33. data/lib/generators/flip/migration/templates/create_features.rb +11 -0
  34. data/lib/generators/flip/model/USAGE +8 -0
  35. data/lib/generators/flip/model/model_generator.rb +8 -0
  36. data/lib/generators/flip/model/templates/feature.rb +15 -0
  37. data/lib/generators/flip/routes/USAGE +7 -0
  38. data/lib/generators/flip/routes/routes_generator.rb +7 -0
  39. data/lib/generators/flip/views/USAGE +8 -0
  40. data/lib/generators/flip/views/templates/index.html.erb +54 -0
  41. data/lib/generators/flip/views/views_generator.rb +8 -0
  42. data/spec/abstract_strategy_spec.rb +11 -0
  43. data/spec/cacheable_spec.rb +49 -0
  44. data/spec/controller_filters_spec.rb +27 -0
  45. data/spec/cookie_strategy_spec.rb +112 -0
  46. data/spec/database_strategy_spec.rb +110 -0
  47. data/spec/declarable_spec.rb +32 -0
  48. data/spec/declaration_strategy_spec.rb +39 -0
  49. data/spec/definition_spec.rb +19 -0
  50. data/spec/feature_set_spec.rb +67 -0
  51. data/spec/flip_spec.rb +33 -0
  52. data/spec/spec_helper.rb +2 -0
  53. metadata +172 -0
@@ -0,0 +1,32 @@
1
+ require "spec_helper"
2
+
3
+ describe Flip::Declarable do
4
+
5
+ let!(:model_class) do
6
+ Class.new do
7
+ extend Flip::Declarable
8
+
9
+ strategy Flip::DeclarationStrategy
10
+ default false
11
+
12
+ feature :one
13
+ feature :two, description: "Second one."
14
+ feature :three, default: true
15
+ end
16
+ end
17
+
18
+ subject { Flip::FeatureSet.instance }
19
+
20
+ describe "the .on? class method" do
21
+ context "with default set to false" do
22
+ it { should_not be_on(:one) }
23
+ it { should be_on(:three) }
24
+ end
25
+ context "with default set to true" do
26
+ before { model_class.send(:default, true) }
27
+ it { should be_on(:one) }
28
+ it { should be_on(:three) }
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Flip::DeclarationStrategy do
4
+
5
+ def definition(default)
6
+ Flip::Definition.new :feature, default: default
7
+ end
8
+
9
+ describe "#knows?" do
10
+ it "does not know definition with no default specified" do
11
+ subject.knows?(Flip::Definition.new :feature).should be false
12
+ end
13
+ it "does not know definition with default of nil" do
14
+ subject.knows?(definition(nil)).should be false
15
+ end
16
+ it "knows definition with default set to true" do
17
+ subject.knows?(definition(true)).should be true
18
+ end
19
+ it "knows definition with default set to false" do
20
+ subject.knows?(definition(false)).should be true
21
+ end
22
+ end
23
+
24
+ describe "#on? for Flip::Definition" do
25
+ subject { Flip::DeclarationStrategy.new.on? definition(default) }
26
+ [
27
+ { default: true, result: true },
28
+ { default: false, result: false },
29
+ { default: proc { true }, result: true, name: "proc returning true" },
30
+ { default: proc { false }, result: false, name: "proc returning false" },
31
+ ].each do |parameters|
32
+ context "with default of #{parameters[:name] || parameters[:default]}" do
33
+ let(:default) { parameters[:default] }
34
+ it { should == parameters[:result] }
35
+ end
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ describe Flip::Definition do
4
+
5
+ subject { Flip::Definition.new :the_key, description: "The description" }
6
+
7
+ [:key, :name, :to_s].each do |method|
8
+ its(method) { should == :the_key }
9
+ end
10
+
11
+ its(:description) { should == "The description" }
12
+ its(:options) { should == { description: "The description" } }
13
+
14
+ context "without description specified" do
15
+ subject { Flip::Definition.new :the_key }
16
+ its(:description) { should == "The key." }
17
+ end
18
+
19
+ end
@@ -0,0 +1,67 @@
1
+ require "spec_helper"
2
+
3
+ class NullStrategy < Flip::AbstractStrategy
4
+ def knows?(d); false; end
5
+ end
6
+
7
+ class TrueStrategy < Flip::AbstractStrategy
8
+ def knows?(d); true; end
9
+ def on?(d); true; end
10
+ end
11
+
12
+ describe Flip::FeatureSet do
13
+
14
+ let :feature_set_with_null_strategy do
15
+ Flip::FeatureSet.new.tap do |s|
16
+ s << Flip::Definition.new(:feature)
17
+ s.add_strategy NullStrategy
18
+ end
19
+ end
20
+
21
+ let :feature_set_with_null_then_true_strategies do
22
+ feature_set_with_null_strategy.tap do |s|
23
+ s.add_strategy TrueStrategy
24
+ end
25
+ end
26
+
27
+ describe ".instance" do
28
+ it "returns a singleton instance" do
29
+ Flip::FeatureSet.instance.should equal(Flip::FeatureSet.instance)
30
+ end
31
+ it "can be reset" do
32
+ instance_before_reset = Flip::FeatureSet.instance
33
+ Flip::FeatureSet.reset
34
+ Flip::FeatureSet.instance.should_not equal(instance_before_reset)
35
+ end
36
+ it "can be reset multiple times without error" do
37
+ 2.times { Flip::FeatureSet.reset }
38
+ end
39
+ end
40
+
41
+ describe "#default= and #on? with null strategy" do
42
+ subject { feature_set_with_null_strategy }
43
+ it "defaults to false" do
44
+ subject.on?(:feature).should be false
45
+ end
46
+ it "can default to true" do
47
+ subject.default = true
48
+ subject.on?(:feature).should be true
49
+ end
50
+ it "accepts a proc returning true" do
51
+ subject.default = proc { true }
52
+ subject.on?(:feature).should be true
53
+ end
54
+ it "accepts a proc returning false" do
55
+ subject.default = proc { false }
56
+ subject.on?(:feature).should be false
57
+ end
58
+ end
59
+
60
+ describe "feature set with null strategy then always-true strategy" do
61
+ subject { feature_set_with_null_then_true_strategies }
62
+ it "returns true due to second strategy" do
63
+ subject.on?(:feature).should be true
64
+ end
65
+ end
66
+
67
+ end
data/spec/flip_spec.rb ADDED
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Flip do
4
+
5
+ before(:all) do
6
+ Class.new do
7
+ extend Flip::Declarable
8
+ strategy Flip::DeclarationStrategy
9
+ default false
10
+ feature :one, default: true
11
+ feature :two, default: false
12
+ end
13
+ end
14
+
15
+ after(:all) do
16
+ Flip.reset
17
+ end
18
+
19
+ describe ".on?" do
20
+ it "returns true for enabled features" do
21
+ Flip.on?(:one).should be true
22
+ end
23
+ it "returns false for disabled features" do
24
+ Flip.on?(:two).should be false
25
+ end
26
+ end
27
+
28
+ describe "dynamic predicate methods" do
29
+ its(:one?) { should be true }
30
+ its(:two?) { should be false }
31
+ end
32
+
33
+ end
@@ -0,0 +1,2 @@
1
+ require 'flip'
2
+ require 'rspec/its'
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flip2
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.1
5
+ platform: ruby
6
+ authors:
7
+ - ''
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-12-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5.1'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.1'
33
+ - !ruby/object:Gem::Dependency
34
+ name: i18n
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.5'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.5'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec-its
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rake
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ description: Declarative API for specifying features, switchable in declaration, database
90
+ and cookies.
91
+ email:
92
+ - ''
93
+ executables: []
94
+ extensions: []
95
+ extra_rdoc_files: []
96
+ files:
97
+ - ".gitignore"
98
+ - ".rspec"
99
+ - ".travis.yml"
100
+ - Gemfile
101
+ - README.md
102
+ - Rakefile
103
+ - TODO
104
+ - app/assets/stylesheets/flip.css
105
+ - app/controllers/flip/features_controller.rb
106
+ - app/controllers/flip/strategies_controller.rb
107
+ - app/helpers/flip_helper.rb
108
+ - app/views/flip/features/index.html.erb
109
+ - config/routes.rb
110
+ - flip.gemspec
111
+ - lib/flip/abstract_strategy.rb
112
+ - lib/flip/cacheable.rb
113
+ - lib/flip/controller_filters.rb
114
+ - lib/flip/cookie_strategy.rb
115
+ - lib/flip/database_strategy.rb
116
+ - lib/flip/declarable.rb
117
+ - lib/flip/declaration_strategy.rb
118
+ - lib/flip/definition.rb
119
+ - lib/flip/engine.rb
120
+ - lib/flip/facade.rb
121
+ - lib/flip/feature_set.rb
122
+ - lib/flip/forbidden.rb
123
+ - lib/flip/version.rb
124
+ - lib/flip2.rb
125
+ - lib/generators/flip/install/install_generator.rb
126
+ - lib/generators/flip/migration/USAGE
127
+ - lib/generators/flip/migration/migration_generator.rb
128
+ - lib/generators/flip/migration/templates/create_features.rb
129
+ - lib/generators/flip/model/USAGE
130
+ - lib/generators/flip/model/model_generator.rb
131
+ - lib/generators/flip/model/templates/feature.rb
132
+ - lib/generators/flip/routes/USAGE
133
+ - lib/generators/flip/routes/routes_generator.rb
134
+ - lib/generators/flip/views/USAGE
135
+ - lib/generators/flip/views/templates/index.html.erb
136
+ - lib/generators/flip/views/views_generator.rb
137
+ - spec/abstract_strategy_spec.rb
138
+ - spec/cacheable_spec.rb
139
+ - spec/controller_filters_spec.rb
140
+ - spec/cookie_strategy_spec.rb
141
+ - spec/database_strategy_spec.rb
142
+ - spec/declarable_spec.rb
143
+ - spec/declaration_strategy_spec.rb
144
+ - spec/definition_spec.rb
145
+ - spec/feature_set_spec.rb
146
+ - spec/flip_spec.rb
147
+ - spec/spec_helper.rb
148
+ homepage: ''
149
+ licenses:
150
+ - MIT
151
+ metadata: {}
152
+ post_install_message:
153
+ rdoc_options: []
154
+ require_paths:
155
+ - lib
156
+ required_ruby_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ requirements: []
167
+ rubyforge_project:
168
+ rubygems_version: 2.5.1
169
+ signing_key:
170
+ specification_version: 4
171
+ summary: A feature flipper for Rails web applications.
172
+ test_files: []