flipper 0.28.0 → 1.3.6

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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/ci.yml +50 -7
  4. data/.github/workflows/examples.yml +52 -10
  5. data/CLAUDE.md +74 -0
  6. data/Changelog.md +1 -526
  7. data/Gemfile +17 -8
  8. data/README.md +31 -27
  9. data/Rakefile +2 -2
  10. data/benchmark/typecast_ips.rb +8 -0
  11. data/docs/images/banner.jpg +0 -0
  12. data/docs/images/flipper_cloud.png +0 -0
  13. data/examples/cloud/app.ru +12 -0
  14. data/examples/cloud/backoff_policy.rb +13 -0
  15. data/examples/cloud/basic.rb +22 -0
  16. data/examples/cloud/cloud_setup.rb +20 -0
  17. data/examples/cloud/forked.rb +36 -0
  18. data/examples/cloud/import.rb +17 -0
  19. data/examples/cloud/threaded.rb +33 -0
  20. data/examples/dsl.rb +0 -14
  21. data/examples/expressions.rb +213 -0
  22. data/examples/mirroring.rb +59 -0
  23. data/examples/strict.rb +18 -0
  24. data/exe/flipper +5 -0
  25. data/flipper-cloud.gemspec +19 -0
  26. data/flipper.gemspec +8 -4
  27. data/lib/flipper/actor.rb +6 -3
  28. data/lib/flipper/adapter.rb +10 -0
  29. data/lib/flipper/adapter_builder.rb +44 -0
  30. data/lib/flipper/adapters/actor_limit.rb +28 -0
  31. data/lib/flipper/adapters/cache_base.rb +143 -0
  32. data/lib/flipper/adapters/dual_write.rb +1 -3
  33. data/lib/flipper/adapters/failover.rb +0 -4
  34. data/lib/flipper/adapters/failsafe.rb +0 -4
  35. data/lib/flipper/adapters/http/client.rb +40 -12
  36. data/lib/flipper/adapters/http/error.rb +2 -2
  37. data/lib/flipper/adapters/http.rb +19 -14
  38. data/lib/flipper/adapters/instrumented.rb +0 -4
  39. data/lib/flipper/adapters/memoizable.rb +14 -19
  40. data/lib/flipper/adapters/memory.rb +37 -19
  41. data/lib/flipper/adapters/operation_logger.rb +18 -92
  42. data/lib/flipper/adapters/poll.rb +16 -3
  43. data/lib/flipper/adapters/pstore.rb +17 -11
  44. data/lib/flipper/adapters/read_only.rb +8 -41
  45. data/lib/flipper/adapters/strict.rb +45 -0
  46. data/lib/flipper/adapters/sync/feature_synchronizer.rb +10 -1
  47. data/lib/flipper/adapters/sync.rb +0 -4
  48. data/lib/flipper/adapters/wrapper.rb +54 -0
  49. data/lib/flipper/cli.rb +263 -0
  50. data/lib/flipper/cloud/configuration.rb +266 -0
  51. data/lib/flipper/cloud/dsl.rb +27 -0
  52. data/lib/flipper/cloud/message_verifier.rb +95 -0
  53. data/lib/flipper/cloud/middleware.rb +63 -0
  54. data/lib/flipper/cloud/routes.rb +14 -0
  55. data/lib/flipper/cloud/telemetry/backoff_policy.rb +96 -0
  56. data/lib/flipper/cloud/telemetry/instrumenter.rb +22 -0
  57. data/lib/flipper/cloud/telemetry/metric.rb +39 -0
  58. data/lib/flipper/cloud/telemetry/metric_storage.rb +30 -0
  59. data/lib/flipper/cloud/telemetry/submitter.rb +100 -0
  60. data/lib/flipper/cloud/telemetry.rb +191 -0
  61. data/lib/flipper/cloud.rb +53 -0
  62. data/lib/flipper/configuration.rb +25 -4
  63. data/lib/flipper/dsl.rb +47 -42
  64. data/lib/flipper/engine.rb +102 -0
  65. data/lib/flipper/export.rb +0 -2
  66. data/lib/flipper/exporters/json/export.rb +1 -1
  67. data/lib/flipper/exporters/json/v1.rb +1 -1
  68. data/lib/flipper/expression/builder.rb +73 -0
  69. data/lib/flipper/expression/constant.rb +25 -0
  70. data/lib/flipper/expression.rb +71 -0
  71. data/lib/flipper/expressions/all.rb +9 -0
  72. data/lib/flipper/expressions/any.rb +9 -0
  73. data/lib/flipper/expressions/boolean.rb +9 -0
  74. data/lib/flipper/expressions/comparable.rb +13 -0
  75. data/lib/flipper/expressions/duration.rb +28 -0
  76. data/lib/flipper/expressions/equal.rb +9 -0
  77. data/lib/flipper/expressions/greater_than.rb +9 -0
  78. data/lib/flipper/expressions/greater_than_or_equal_to.rb +9 -0
  79. data/lib/flipper/expressions/less_than.rb +9 -0
  80. data/lib/flipper/expressions/less_than_or_equal_to.rb +9 -0
  81. data/lib/flipper/expressions/not_equal.rb +9 -0
  82. data/lib/flipper/expressions/now.rb +9 -0
  83. data/lib/flipper/expressions/number.rb +9 -0
  84. data/lib/flipper/expressions/percentage.rb +9 -0
  85. data/lib/flipper/expressions/percentage_of_actors.rb +12 -0
  86. data/lib/flipper/expressions/property.rb +9 -0
  87. data/lib/flipper/expressions/random.rb +9 -0
  88. data/lib/flipper/expressions/string.rb +9 -0
  89. data/lib/flipper/expressions/time.rb +9 -0
  90. data/lib/flipper/feature.rb +63 -1
  91. data/lib/flipper/gate.rb +2 -1
  92. data/lib/flipper/gate_values.rb +5 -2
  93. data/lib/flipper/gates/expression.rb +75 -0
  94. data/lib/flipper/instrumentation/log_subscriber.rb +28 -5
  95. data/lib/flipper/instrumentation/statsd.rb +4 -2
  96. data/lib/flipper/instrumentation/statsd_subscriber.rb +2 -4
  97. data/lib/flipper/instrumentation/subscriber.rb +0 -4
  98. data/lib/flipper/metadata.rb +8 -1
  99. data/lib/flipper/middleware/memoizer.rb +30 -14
  100. data/lib/flipper/model/active_record.rb +23 -0
  101. data/lib/flipper/poller.rb +10 -9
  102. data/lib/flipper/serializers/gzip.rb +22 -0
  103. data/lib/flipper/serializers/json.rb +17 -0
  104. data/lib/flipper/spec/shared_adapter_specs.rb +82 -63
  105. data/lib/flipper/test/shared_adapter_test.rb +77 -58
  106. data/lib/flipper/test_help.rb +43 -0
  107. data/lib/flipper/typecast.rb +37 -9
  108. data/lib/flipper/types/percentage.rb +1 -1
  109. data/lib/flipper/version.rb +11 -1
  110. data/lib/flipper.rb +44 -7
  111. data/lib/generators/flipper/setup_generator.rb +68 -0
  112. data/lib/generators/flipper/templates/initializer.rb +45 -0
  113. data/lib/generators/flipper/templates/update/migrations/01_create_flipper_tables.rb.erb +22 -0
  114. data/lib/generators/flipper/templates/update/migrations/02_change_flipper_gates_value_to_text.rb.erb +18 -0
  115. data/lib/generators/flipper/update_generator.rb +35 -0
  116. data/package-lock.json +41 -0
  117. data/package.json +10 -0
  118. data/spec/fixtures/environment.rb +1 -0
  119. data/spec/flipper/adapter_builder_spec.rb +72 -0
  120. data/spec/flipper/adapter_spec.rb +1 -0
  121. data/spec/flipper/adapters/actor_limit_spec.rb +20 -0
  122. data/spec/flipper/adapters/dual_write_spec.rb +2 -2
  123. data/spec/flipper/adapters/http/client_spec.rb +61 -0
  124. data/spec/flipper/adapters/http_spec.rb +135 -74
  125. data/spec/flipper/adapters/instrumented_spec.rb +1 -1
  126. data/spec/flipper/adapters/memoizable_spec.rb +21 -21
  127. data/spec/flipper/adapters/memory_spec.rb +11 -2
  128. data/spec/flipper/adapters/operation_logger_spec.rb +2 -2
  129. data/spec/flipper/adapters/poll_spec.rb +41 -0
  130. data/spec/flipper/adapters/read_only_spec.rb +32 -17
  131. data/spec/flipper/adapters/strict_spec.rb +64 -0
  132. data/spec/flipper/adapters/sync/feature_synchronizer_spec.rb +27 -0
  133. data/spec/flipper/cli_spec.rb +166 -0
  134. data/spec/flipper/cloud/configuration_spec.rb +251 -0
  135. data/spec/flipper/cloud/dsl_spec.rb +82 -0
  136. data/spec/flipper/cloud/message_verifier_spec.rb +104 -0
  137. data/spec/flipper/cloud/middleware_spec.rb +289 -0
  138. data/spec/flipper/cloud/telemetry/backoff_policy_spec.rb +107 -0
  139. data/spec/flipper/cloud/telemetry/metric_spec.rb +87 -0
  140. data/spec/flipper/cloud/telemetry/metric_storage_spec.rb +58 -0
  141. data/spec/flipper/cloud/telemetry/submitter_spec.rb +145 -0
  142. data/spec/flipper/cloud/telemetry_spec.rb +208 -0
  143. data/spec/flipper/cloud_spec.rb +186 -0
  144. data/spec/flipper/configuration_spec.rb +17 -0
  145. data/spec/flipper/dsl_spec.rb +34 -73
  146. data/spec/flipper/engine_spec.rb +374 -0
  147. data/spec/flipper/exporters/json/v1_spec.rb +3 -3
  148. data/spec/flipper/expression/builder_spec.rb +248 -0
  149. data/spec/flipper/expression_spec.rb +188 -0
  150. data/spec/flipper/expressions/all_spec.rb +15 -0
  151. data/spec/flipper/expressions/any_spec.rb +15 -0
  152. data/spec/flipper/expressions/boolean_spec.rb +15 -0
  153. data/spec/flipper/expressions/duration_spec.rb +43 -0
  154. data/spec/flipper/expressions/equal_spec.rb +24 -0
  155. data/spec/flipper/expressions/greater_than_or_equal_to_spec.rb +28 -0
  156. data/spec/flipper/expressions/greater_than_spec.rb +28 -0
  157. data/spec/flipper/expressions/less_than_or_equal_to_spec.rb +28 -0
  158. data/spec/flipper/expressions/less_than_spec.rb +32 -0
  159. data/spec/flipper/expressions/not_equal_spec.rb +15 -0
  160. data/spec/flipper/expressions/now_spec.rb +11 -0
  161. data/spec/flipper/expressions/number_spec.rb +21 -0
  162. data/spec/flipper/expressions/percentage_of_actors_spec.rb +20 -0
  163. data/spec/flipper/expressions/percentage_spec.rb +15 -0
  164. data/spec/flipper/expressions/property_spec.rb +13 -0
  165. data/spec/flipper/expressions/random_spec.rb +9 -0
  166. data/spec/flipper/expressions/string_spec.rb +11 -0
  167. data/spec/flipper/expressions/time_spec.rb +13 -0
  168. data/spec/flipper/feature_spec.rb +380 -10
  169. data/spec/flipper/gate_values_spec.rb +2 -2
  170. data/spec/flipper/gates/expression_spec.rb +108 -0
  171. data/spec/flipper/identifier_spec.rb +4 -5
  172. data/spec/flipper/instrumentation/log_subscriber_spec.rb +10 -2
  173. data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +16 -2
  174. data/spec/flipper/middleware/memoizer_spec.rb +79 -10
  175. data/spec/flipper/model/active_record_spec.rb +72 -0
  176. data/spec/flipper/serializers/gzip_spec.rb +13 -0
  177. data/spec/flipper/serializers/json_spec.rb +13 -0
  178. data/spec/flipper/typecast_spec.rb +43 -7
  179. data/spec/flipper/types/actor_spec.rb +18 -1
  180. data/spec/flipper_integration_spec.rb +114 -16
  181. data/spec/flipper_spec.rb +87 -29
  182. data/spec/spec_helper.rb +17 -17
  183. data/spec/support/actor_names.yml +1 -0
  184. data/spec/support/fail_on_output.rb +8 -0
  185. data/spec/support/fake_backoff_policy.rb +15 -0
  186. data/spec/support/spec_helpers.rb +34 -8
  187. data/test/adapters/actor_limit_test.rb +20 -0
  188. data/test_rails/generators/flipper/setup_generator_test.rb +69 -0
  189. data/test_rails/generators/flipper/update_generator_test.rb +96 -0
  190. data/test_rails/helper.rb +22 -2
  191. data/test_rails/system/test_help_test.rb +52 -0
  192. metadata +179 -19
  193. data/.tool-versions +0 -1
  194. data/lib/flipper/railtie.rb +0 -47
  195. data/spec/flipper/railtie_spec.rb +0 -109
@@ -4,11 +4,12 @@ RSpec.shared_examples_for 'a flipper adapter' do
4
4
  let(:flipper) { Flipper.new(subject) }
5
5
  let(:feature) { flipper[:stats] }
6
6
 
7
- let(:boolean_gate) { feature.gate(:boolean) }
8
- let(:group_gate) { feature.gate(:group) }
9
- let(:actor_gate) { feature.gate(:actor) }
10
- let(:actors_gate) { feature.gate(:percentage_of_actors) }
11
- let(:time_gate) { feature.gate(:percentage_of_time) }
7
+ let(:boolean_gate) { feature.gate(:boolean) }
8
+ let(:expression_gate) { feature.gate(:expression) }
9
+ let(:group_gate) { feature.gate(:group) }
10
+ let(:actor_gate) { feature.gate(:actor) }
11
+ let(:actors_gate) { feature.gate(:percentage_of_actors) }
12
+ let(:time_gate) { feature.gate(:percentage_of_time) }
12
13
 
13
14
  before do
14
15
  Flipper.register(:admins) do |actor|
@@ -46,12 +47,12 @@ RSpec.shared_examples_for 'a flipper adapter' do
46
47
  end
47
48
 
48
49
  it 'can enable, disable and get value for boolean gate' do
49
- expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
50
+ expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
50
51
 
51
52
  result = subject.get(feature)
52
53
  expect(result[:boolean]).to eq('true')
53
54
 
54
- expect(subject.disable(feature, boolean_gate, flipper.boolean(false))).to eq(true)
55
+ expect(subject.disable(feature, boolean_gate, Flipper::Types::Boolean.new(false))).to eq(true)
55
56
 
56
57
  result = subject.get(feature)
57
58
  expect(result[:boolean]).to eq(nil)
@@ -59,17 +60,34 @@ RSpec.shared_examples_for 'a flipper adapter' do
59
60
 
60
61
  it 'fully disables all enabled things when boolean gate disabled' do
61
62
  actor22 = Flipper::Actor.new('22')
62
- expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
63
+ expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
63
64
  expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
64
- expect(subject.enable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
65
- expect(subject.enable(feature, actors_gate, flipper.actors(25))).to eq(true)
66
- expect(subject.enable(feature, time_gate, flipper.time(45))).to eq(true)
67
-
68
- expect(subject.disable(feature, boolean_gate, flipper.boolean(false))).to eq(true)
65
+ expect(subject.enable(feature, actor_gate, Flipper::Types::Actor.new(actor22))).to eq(true)
66
+ expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
67
+ expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(45))).to eq(true)
69
68
 
69
+ expect(subject.disable(feature, boolean_gate, Flipper::Types::Boolean.new(false))).to eq(true)
70
70
  expect(subject.get(feature)).to eq(subject.default_config)
71
71
  end
72
72
 
73
+ it 'can enable, disable and get value for expression gate' do
74
+ basic_expression = Flipper.property(:plan).eq("basic")
75
+ age_expression = Flipper.property(:age).gte(21)
76
+ any_expression = Flipper.any(basic_expression, age_expression)
77
+
78
+ expect(subject.enable(feature, expression_gate, any_expression)).to eq(true)
79
+ result = subject.get(feature)
80
+ expect(result[:expression]).to eq(any_expression.value)
81
+
82
+ expect(subject.enable(feature, expression_gate, basic_expression)).to eq(true)
83
+ result = subject.get(feature)
84
+ expect(result[:expression]).to eq(basic_expression.value)
85
+
86
+ expect(subject.disable(feature, expression_gate, basic_expression)).to eq(true)
87
+ result = subject.get(feature)
88
+ expect(result[:expression]).to be(nil)
89
+ end
90
+
73
91
  it 'can enable, disable and get value for group gate' do
74
92
  expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
75
93
  expect(subject.enable(feature, group_gate, flipper.group(:early_access))).to eq(true)
@@ -90,34 +108,34 @@ RSpec.shared_examples_for 'a flipper adapter' do
90
108
  actor22 = Flipper::Actor.new('22')
91
109
  actor_asdf = Flipper::Actor.new('asdf')
92
110
 
93
- expect(subject.enable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
94
- expect(subject.enable(feature, actor_gate, flipper.actor(actor_asdf))).to eq(true)
111
+ expect(feature.enable(actor22)).to be(true)
112
+ expect(feature.enable(actor_asdf)).to be(true)
95
113
 
96
- result = subject.get(feature)
97
- expect(result[:actors]).to eq(Set['22', 'asdf'])
114
+ expect(feature).to be_enabled(actor22)
115
+ expect(feature).to be_enabled(actor_asdf)
98
116
 
99
- expect(subject.disable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
100
- result = subject.get(feature)
101
- expect(result[:actors]).to eq(Set['asdf'])
117
+ expect(feature.disable(actor22)).to be(true)
118
+ expect(feature).not_to be_enabled(actor22)
119
+ expect(feature).to be_enabled(actor_asdf)
102
120
 
103
- expect(subject.disable(feature, actor_gate, flipper.actor(actor_asdf))).to eq(true)
104
- result = subject.get(feature)
105
- expect(result[:actors]).to eq(Set.new)
121
+ expect(feature.disable(actor_asdf)).to eq(true)
122
+ expect(feature).not_to be_enabled(actor22)
123
+ expect(feature).not_to be_enabled(actor_asdf)
106
124
  end
107
125
 
108
126
  it 'can enable, disable and get value for percentage of actors gate' do
109
- expect(subject.enable(feature, actors_gate, flipper.actors(15))).to eq(true)
127
+ expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(15))).to eq(true)
110
128
  result = subject.get(feature)
111
129
  expect(result[:percentage_of_actors]).to eq('15')
112
130
 
113
- expect(subject.disable(feature, actors_gate, flipper.actors(0))).to eq(true)
131
+ expect(subject.disable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(0))).to eq(true)
114
132
  result = subject.get(feature)
115
133
  expect(result[:percentage_of_actors]).to eq('0')
116
134
  end
117
135
 
118
136
  it 'can enable percentage of actors gate many times and consistently return values' do
119
137
  (1..100).each do |percentage|
120
- expect(subject.enable(feature, actors_gate, flipper.actors(percentage))).to eq(true)
138
+ expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(percentage))).to eq(true)
121
139
  result = subject.get(feature)
122
140
  expect(result[:percentage_of_actors]).to eq(percentage.to_s)
123
141
  end
@@ -125,25 +143,25 @@ RSpec.shared_examples_for 'a flipper adapter' do
125
143
 
126
144
  it 'can disable percentage of actors gate many times and consistently return values' do
127
145
  (1..100).each do |percentage|
128
- expect(subject.disable(feature, actors_gate, flipper.actors(percentage))).to eq(true)
146
+ expect(subject.disable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(percentage))).to eq(true)
129
147
  result = subject.get(feature)
130
148
  expect(result[:percentage_of_actors]).to eq(percentage.to_s)
131
149
  end
132
150
  end
133
151
 
134
152
  it 'can enable, disable and get value for percentage of time gate' do
135
- expect(subject.enable(feature, time_gate, flipper.time(10))).to eq(true)
153
+ expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(10))).to eq(true)
136
154
  result = subject.get(feature)
137
155
  expect(result[:percentage_of_time]).to eq('10')
138
156
 
139
- expect(subject.disable(feature, time_gate, flipper.time(0))).to eq(true)
157
+ expect(subject.disable(feature, time_gate, Flipper::Types::PercentageOfTime.new(0))).to eq(true)
140
158
  result = subject.get(feature)
141
159
  expect(result[:percentage_of_time]).to eq('0')
142
160
  end
143
161
 
144
162
  it 'can enable percentage of time gate many times and consistently return values' do
145
163
  (1..100).each do |percentage|
146
- expect(subject.enable(feature, time_gate, flipper.time(percentage))).to eq(true)
164
+ expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(percentage))).to eq(true)
147
165
  result = subject.get(feature)
148
166
  expect(result[:percentage_of_time]).to eq(percentage.to_s)
149
167
  end
@@ -151,22 +169,23 @@ RSpec.shared_examples_for 'a flipper adapter' do
151
169
 
152
170
  it 'can disable percentage of time gate many times and consistently return values' do
153
171
  (1..100).each do |percentage|
154
- expect(subject.disable(feature, time_gate, flipper.time(percentage))).to eq(true)
172
+ expect(subject.disable(feature, time_gate, Flipper::Types::PercentageOfTime.new(percentage))).to eq(true)
155
173
  result = subject.get(feature)
156
174
  expect(result[:percentage_of_time]).to eq(percentage.to_s)
157
175
  end
158
176
  end
159
177
 
160
178
  it 'converts boolean value to a string' do
161
- expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
179
+ expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
162
180
  result = subject.get(feature)
163
181
  expect(result[:boolean]).to eq('true')
164
182
  end
165
183
 
166
184
  it 'converts the actor value to a string' do
167
- expect(subject.enable(feature, actor_gate, flipper.actor(Flipper::Actor.new(22)))).to eq(true)
168
- result = subject.get(feature)
169
- expect(result[:actors]).to eq(Set['22'])
185
+ actor = Flipper::Actor.new(22)
186
+ expect(feature).not_to be_enabled(actor)
187
+ feature.enable_actor actor
188
+ expect(feature).to be_enabled(actor)
170
189
  end
171
190
 
172
191
  it 'converts group value to a string' do
@@ -176,13 +195,13 @@ RSpec.shared_examples_for 'a flipper adapter' do
176
195
  end
177
196
 
178
197
  it 'converts percentage of time integer value to a string' do
179
- expect(subject.enable(feature, time_gate, flipper.time(10))).to eq(true)
198
+ expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(10))).to eq(true)
180
199
  result = subject.get(feature)
181
200
  expect(result[:percentage_of_time]).to eq('10')
182
201
  end
183
202
 
184
203
  it 'converts percentage of actors integer value to a string' do
185
- expect(subject.enable(feature, actors_gate, flipper.actors(10))).to eq(true)
204
+ expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(10))).to eq(true)
186
205
  result = subject.get(feature)
187
206
  expect(result[:percentage_of_actors]).to eq('10')
188
207
  end
@@ -205,11 +224,11 @@ RSpec.shared_examples_for 'a flipper adapter' do
205
224
 
206
225
  it 'clears all the gate values for the feature on remove' do
207
226
  actor22 = Flipper::Actor.new('22')
208
- expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
227
+ expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
209
228
  expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
210
- expect(subject.enable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
211
- expect(subject.enable(feature, actors_gate, flipper.actors(25))).to eq(true)
212
- expect(subject.enable(feature, time_gate, flipper.time(45))).to eq(true)
229
+ expect(subject.enable(feature, actor_gate, Flipper::Types::Actor.new(actor22))).to eq(true)
230
+ expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
231
+ expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(45))).to eq(true)
213
232
 
214
233
  expect(subject.remove(feature)).to eq(true)
215
234
 
@@ -221,11 +240,11 @@ RSpec.shared_examples_for 'a flipper adapter' do
221
240
  subject.add(feature)
222
241
  expect(subject.features).to include(feature.key)
223
242
 
224
- expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
243
+ expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
225
244
  expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
226
- expect(subject.enable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
227
- expect(subject.enable(feature, actors_gate, flipper.actors(25))).to eq(true)
228
- expect(subject.enable(feature, time_gate, flipper.time(45))).to eq(true)
245
+ expect(subject.enable(feature, actor_gate, Flipper::Types::Actor.new(actor22))).to eq(true)
246
+ expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
247
+ expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(45))).to eq(true)
229
248
 
230
249
  expect(subject.clear(feature)).to eq(true)
231
250
  expect(subject.features).to include(feature.key)
@@ -238,7 +257,7 @@ RSpec.shared_examples_for 'a flipper adapter' do
238
257
 
239
258
  it 'can get multiple features' do
240
259
  expect(subject.add(flipper[:stats])).to eq(true)
241
- expect(subject.enable(flipper[:stats], boolean_gate, flipper.boolean)).to eq(true)
260
+ expect(subject.enable(flipper[:stats], boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
242
261
  expect(subject.add(flipper[:search])).to eq(true)
243
262
 
244
263
  result = subject.get_multi([flipper[:stats], flipper[:search], flipper[:other]])
@@ -254,16 +273,16 @@ RSpec.shared_examples_for 'a flipper adapter' do
254
273
 
255
274
  it 'can get all features' do
256
275
  expect(subject.add(flipper[:stats])).to eq(true)
257
- expect(subject.enable(flipper[:stats], boolean_gate, flipper.boolean)).to eq(true)
276
+ expect(subject.enable(flipper[:stats], boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
258
277
  expect(subject.add(flipper[:search])).to eq(true)
278
+ flipper.enable :analytics, Flipper.property(:plan).eq("pro")
259
279
 
260
280
  result = subject.get_all
261
- expect(result).to be_instance_of(Hash)
262
281
 
263
- stats = result["stats"]
264
- search = result["search"]
265
- expect(stats).to eq(subject.default_config.merge(boolean: 'true'))
266
- expect(search).to eq(subject.default_config)
282
+ expect(result).to be_instance_of(Hash)
283
+ expect(result["stats"]).to eq(subject.default_config.merge(boolean: 'true'))
284
+ expect(result["search"]).to eq(subject.default_config)
285
+ expect(result["analytics"]).to eq(subject.default_config.merge(expression: {"Equal"=>[{"Property"=>["plan"]}, "pro"]}))
267
286
  end
268
287
 
269
288
  it 'includes explicitly disabled features when getting all features' do
@@ -277,9 +296,9 @@ RSpec.shared_examples_for 'a flipper adapter' do
277
296
 
278
297
  it 'can double enable an actor without error' do
279
298
  actor = Flipper::Actor.new('Flipper::Actor;22')
280
- expect(subject.enable(feature, actor_gate, flipper.actor(actor))).to eq(true)
281
- expect(subject.enable(feature, actor_gate, flipper.actor(actor))).to eq(true)
282
- expect(subject.get(feature).fetch(:actors)).to eq(Set['Flipper::Actor;22'])
299
+ expect(feature.enable(actor)).to be(true)
300
+ expect(feature.enable(actor)).to be(true)
301
+ expect(feature).to be_enabled(actor)
283
302
  end
284
303
 
285
304
  it 'can double enable a group without error' do
@@ -289,13 +308,13 @@ RSpec.shared_examples_for 'a flipper adapter' do
289
308
  end
290
309
 
291
310
  it 'can double enable percentage without error' do
292
- expect(subject.enable(feature, actors_gate, flipper.actors(25))).to eq(true)
293
- expect(subject.enable(feature, actors_gate, flipper.actors(25))).to eq(true)
311
+ expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
312
+ expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
294
313
  end
295
314
 
296
315
  it 'can double enable without error' do
297
- expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
298
- expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
316
+ expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
317
+ expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
299
318
  end
300
319
 
301
320
  it 'can get_all features when there are none' do
@@ -305,11 +324,11 @@ RSpec.shared_examples_for 'a flipper adapter' do
305
324
 
306
325
  it 'clears other gate values on enable' do
307
326
  actor = Flipper::Actor.new('Flipper::Actor;22')
308
- subject.enable(feature, actors_gate, flipper.actors(25))
309
- subject.enable(feature, time_gate, flipper.time(25))
327
+ subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))
328
+ subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(25))
310
329
  subject.enable(feature, group_gate, flipper.group(:admins))
311
- subject.enable(feature, actor_gate, flipper.actor(actor))
312
- subject.enable(feature, boolean_gate, flipper.boolean(true))
330
+ subject.enable(feature, actor_gate, Flipper::Types::Actor.new(actor))
331
+ subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new(true))
313
332
  expect(subject.get(feature)).to eq(subject.default_config.merge(boolean: "true"))
314
333
  end
315
334
 
@@ -7,6 +7,7 @@ module Flipper
7
7
  @feature = @flipper[:stats]
8
8
  @boolean_gate = @feature.gate(:boolean)
9
9
  @group_gate = @feature.gate(:group)
10
+ @expression_gate = @feature.gate(:expression)
10
11
  @actor_gate = @feature.gate(:actor)
11
12
  @actors_gate = @feature.gate(:percentage_of_actors)
12
13
  @time_gate = @feature.gate(:percentage_of_time)
@@ -48,23 +49,41 @@ module Flipper
48
49
  end
49
50
 
50
51
  def test_can_enable_disable_and_get_value_for_boolean_gate
51
- assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
52
+ assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
52
53
  assert_equal 'true', @adapter.get(@feature)[:boolean]
53
- assert_equal true, @adapter.disable(@feature, @boolean_gate, @flipper.boolean(false))
54
+ assert_equal true, @adapter.disable(@feature, @boolean_gate, Flipper::Types::Boolean.new(false))
54
55
  assert_nil @adapter.get(@feature)[:boolean]
55
56
  end
56
57
 
57
58
  def test_fully_disables_all_enabled_things_when_boolean_gate_disabled
58
59
  actor22 = Flipper::Actor.new('22')
59
- assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
60
+ assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
60
61
  assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
61
- assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor22))
62
- assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(25))
63
- assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(45))
64
- assert_equal true, @adapter.disable(@feature, @boolean_gate, @flipper.boolean(false))
62
+ assert_equal true, @adapter.enable(@feature, @actor_gate, Flipper::Types::Actor.new(actor22))
63
+ assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
64
+ assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(45))
65
+ assert_equal true, @adapter.disable(@feature, @boolean_gate, Flipper::Types::Boolean.new(false))
65
66
  assert_equal @adapter.default_config, @adapter.get(@feature)
66
67
  end
67
68
 
69
+ def test_can_enable_disable_and_get_value_for_expression_gate
70
+ basic_expression = Flipper.property(:plan).eq("basic")
71
+ age_expression = Flipper.property(:age).gte(21)
72
+ any_expression = Flipper.any(basic_expression, age_expression)
73
+
74
+ assert_equal true, @adapter.enable(@feature, @expression_gate, any_expression)
75
+ result = @adapter.get(@feature)
76
+ assert_equal any_expression.value, result[:expression]
77
+
78
+ assert_equal true, @adapter.enable(@feature, @expression_gate, basic_expression)
79
+ result = @adapter.get(@feature)
80
+ assert_equal basic_expression.value, result[:expression]
81
+
82
+ assert_equal true, @adapter.disable(@feature, @expression_gate, basic_expression)
83
+ result = @adapter.get(@feature)
84
+ assert_nil result[:expression]
85
+ end
86
+
68
87
  def test_can_enable_disable_get_value_for_group_gate
69
88
  assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
70
89
  assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:early_access))
@@ -85,34 +104,34 @@ module Flipper
85
104
  actor22 = Flipper::Actor.new('22')
86
105
  actor_asdf = Flipper::Actor.new('asdf')
87
106
 
88
- assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor22))
89
- assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor_asdf))
107
+ assert_equal true, @feature.enable(actor22)
108
+ assert_equal true, @feature.enable(actor_asdf)
90
109
 
91
- result = @adapter.get(@feature)
92
- assert_equal Set['22', 'asdf'], result[:actors]
110
+ assert @feature.enabled?(actor22)
111
+ assert @feature.enabled?(actor_asdf)
93
112
 
94
- assert true, @adapter.disable(@feature, @actor_gate, @flipper.actor(actor22))
95
- result = @adapter.get(@feature)
96
- assert_equal Set['asdf'], result[:actors]
113
+ assert_equal true, @feature.disable(actor22)
114
+ refute @feature.enabled?(actor22)
115
+ assert @feature.enabled?(actor_asdf)
97
116
 
98
- assert_equal true, @adapter.disable(@feature, @actor_gate, @flipper.actor(actor_asdf))
99
- result = @adapter.get(@feature)
100
- assert_equal Set.new, result[:actors]
117
+ assert_equal true, @feature.disable(actor_asdf)
118
+ refute @feature.enabled?(actor22)
119
+ refute @feature.enabled?(actor_asdf)
101
120
  end
102
121
 
103
122
  def test_can_enable_disable_get_value_for_percentage_of_actors_gate
104
- assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(15))
123
+ assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(15))
105
124
  result = @adapter.get(@feature)
106
125
  assert_equal '15', result[:percentage_of_actors]
107
126
 
108
- assert_equal true, @adapter.disable(@feature, @actors_gate, @flipper.actors(0))
127
+ assert_equal true, @adapter.disable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(0))
109
128
  result = @adapter.get(@feature)
110
129
  assert_equal '0', result[:percentage_of_actors]
111
130
  end
112
131
 
113
132
  def test_can_enable_percentage_of_actors_gate_many_times_and_consistently_return_values
114
133
  (1..100).each do |percentage|
115
- assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(percentage))
134
+ assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(percentage))
116
135
  result = @adapter.get(@feature)
117
136
  assert_equal percentage.to_s, result[:percentage_of_actors]
118
137
  end
@@ -120,25 +139,25 @@ module Flipper
120
139
 
121
140
  def test_can_disable_percentage_of_actors_gate_many_times_and_consistently_return_values
122
141
  (1..100).each do |percentage|
123
- assert_equal true, @adapter.disable(@feature, @actors_gate, @flipper.actors(percentage))
142
+ assert_equal true, @adapter.disable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(percentage))
124
143
  result = @adapter.get(@feature)
125
144
  assert_equal percentage.to_s, result[:percentage_of_actors]
126
145
  end
127
146
  end
128
147
 
129
148
  def test_can_enable_disable_and_get_value_for_percentage_of_time_gate
130
- assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(10))
149
+ assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(10))
131
150
  result = @adapter.get(@feature)
132
151
  assert_equal '10', result[:percentage_of_time]
133
152
 
134
- assert_equal true, @adapter.disable(@feature, @time_gate, @flipper.time(0))
153
+ assert_equal true, @adapter.disable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(0))
135
154
  result = @adapter.get(@feature)
136
155
  assert_equal '0', result[:percentage_of_time]
137
156
  end
138
157
 
139
158
  def test_can_enable_percentage_of_time_gate_many_times_and_consistently_return_values
140
159
  (1..100).each do |percentage|
141
- assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(percentage))
160
+ assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(percentage))
142
161
  result = @adapter.get(@feature)
143
162
  assert_equal percentage.to_s, result[:percentage_of_time]
144
163
  end
@@ -146,23 +165,23 @@ module Flipper
146
165
 
147
166
  def test_can_disable_percentage_of_time_gate_many_times_and_consistently_return_values
148
167
  (1..100).each do |percentage|
149
- assert_equal true, @adapter.disable(@feature, @time_gate, @flipper.time(percentage))
168
+ assert_equal true, @adapter.disable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(percentage))
150
169
  result = @adapter.get(@feature)
151
170
  assert_equal percentage.to_s, result[:percentage_of_time]
152
171
  end
153
172
  end
154
173
 
155
174
  def test_converts_boolean_value_to_a_string
156
- assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
175
+ assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
157
176
  result = @adapter.get(@feature)
158
177
  assert_equal 'true', result[:boolean]
159
178
  end
160
179
 
161
180
  def test_converts_the_actor_value_to_a_string
162
- assert_equal true,
163
- @adapter.enable(@feature, @actor_gate, @flipper.actor(Flipper::Actor.new(22)))
164
- result = @adapter.get(@feature)
165
- assert_equal Set['22'], result[:actors]
181
+ actor = Flipper::Actor.new(22)
182
+ refute @feature.enabled?(actor)
183
+ @feature.enable_actor actor
184
+ assert @feature.enabled?(actor)
166
185
  end
167
186
 
168
187
  def test_converts_group_value_to_a_string
@@ -172,13 +191,13 @@ module Flipper
172
191
  end
173
192
 
174
193
  def test_converts_percentage_of_time_integer_value_to_a_string
175
- assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(10))
194
+ assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(10))
176
195
  result = @adapter.get(@feature)
177
196
  assert_equal '10', result[:percentage_of_time]
178
197
  end
179
198
 
180
199
  def test_converts_percentage_of_actors_integer_value_to_a_string
181
- assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(10))
200
+ assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(10))
182
201
  result = @adapter.get(@feature)
183
202
  assert_equal '10', result[:percentage_of_actors]
184
203
  end
@@ -201,11 +220,11 @@ module Flipper
201
220
 
202
221
  def test_clears_all_the_gate_values_for_the_feature_on_remove
203
222
  actor22 = Flipper::Actor.new('22')
204
- assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
223
+ assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
205
224
  assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
206
- assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor22))
207
- assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(25))
208
- assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(45))
225
+ assert_equal true, @adapter.enable(@feature, @actor_gate, Flipper::Types::Actor.new(actor22))
226
+ assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
227
+ assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(45))
209
228
 
210
229
  assert_equal true, @adapter.remove(@feature)
211
230
 
@@ -217,11 +236,11 @@ module Flipper
217
236
  @adapter.add(@feature)
218
237
  assert_includes @adapter.features, @feature.key
219
238
 
220
- assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
239
+ assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
221
240
  assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
222
- assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor22))
223
- assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(25))
224
- assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(45))
241
+ assert_equal true, @adapter.enable(@feature, @actor_gate, Flipper::Types::Actor.new(actor22))
242
+ assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
243
+ assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(45))
225
244
 
226
245
  assert_equal true, @adapter.clear(@feature)
227
246
  assert_includes @adapter.features, @feature.key
@@ -234,7 +253,7 @@ module Flipper
234
253
 
235
254
  def test_can_get_multiple_features
236
255
  assert @adapter.add(@flipper[:stats])
237
- assert @adapter.enable(@flipper[:stats], @boolean_gate, @flipper.boolean)
256
+ assert @adapter.enable(@flipper[:stats], @boolean_gate, Flipper::Types::Boolean.new)
238
257
  assert @adapter.add(@flipper[:search])
239
258
 
240
259
  result = @adapter.get_multi([@flipper[:stats], @flipper[:search], @flipper[:other]])
@@ -250,16 +269,16 @@ module Flipper
250
269
 
251
270
  def test_can_get_all_features
252
271
  assert @adapter.add(@flipper[:stats])
253
- assert @adapter.enable(@flipper[:stats], @boolean_gate, @flipper.boolean)
272
+ assert @adapter.enable(@flipper[:stats], @boolean_gate, Flipper::Types::Boolean.new)
254
273
  assert @adapter.add(@flipper[:search])
274
+ @flipper.enable :analytics, Flipper.property(:plan).eq("pro")
255
275
 
256
276
  result = @adapter.get_all
257
- assert_instance_of Hash, result
258
277
 
259
- stats = result["stats"]
260
- search = result["search"]
261
- assert_equal @adapter.default_config.merge(boolean: 'true'), stats
262
- assert_equal @adapter.default_config, search
278
+ assert_instance_of Hash, result
279
+ assert_equal @adapter.default_config.merge(boolean: 'true'), result["stats"]
280
+ assert_equal @adapter.default_config, result["search"]
281
+ assert_equal @adapter.default_config.merge(expression: {"Equal"=>[{"Property"=>["plan"]}, "pro"]}), result["analytics"]
263
282
  end
264
283
 
265
284
  def test_includes_explicitly_disabled_features_when_getting_all_features
@@ -273,9 +292,9 @@ module Flipper
273
292
 
274
293
  def test_can_double_enable_an_actor_without_error
275
294
  actor = Flipper::Actor.new('Flipper::Actor;22')
276
- assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor))
277
- assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor))
278
- assert_equal Set['Flipper::Actor;22'], @adapter.get(@feature).fetch(:actors)
295
+ assert_equal true, @feature.enable(actor)
296
+ assert_equal true, @feature.enable(actor)
297
+ assert @feature.enabled?(actor)
279
298
  end
280
299
 
281
300
  def test_can_double_enable_a_group_without_error
@@ -285,13 +304,13 @@ module Flipper
285
304
  end
286
305
 
287
306
  def test_can_double_enable_percentage_without_error
288
- assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(25))
289
- assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(25))
307
+ assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
308
+ assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
290
309
  end
291
310
 
292
311
  def test_can_double_enable_without_error
293
- assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
294
- assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
312
+ assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
313
+ assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
295
314
  end
296
315
 
297
316
  def test_can_get_all_features_when_there_are_none
@@ -302,11 +321,11 @@ module Flipper
302
321
 
303
322
  def test_clears_other_gate_values_on_enable
304
323
  actor = Flipper::Actor.new('Flipper::Actor;22')
305
- assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(25))
306
- assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(25))
324
+ assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
325
+ assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(25))
307
326
  assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
308
- assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor))
309
- assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean(true))
327
+ assert_equal true, @adapter.enable(@feature, @actor_gate, Flipper::Types::Actor.new(actor))
328
+ assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new(true))
310
329
  assert_equal @adapter.default_config.merge(boolean: "true"), @adapter.get(@feature)
311
330
  end
312
331
 
@@ -0,0 +1,43 @@
1
+ module Flipper
2
+ module TestHelp
3
+ extend self
4
+
5
+ def flipper_configure
6
+ # Use a shared Memory adapter for all tests. This is instantiated outside of the
7
+ # `configure` block so the same instance is returned in new threads.
8
+ adapter = Flipper::Adapters::Memory.new
9
+
10
+ Flipper.configure do |config|
11
+ config.adapter { adapter }
12
+ config.default { Flipper.new(config.adapter) }
13
+ end
14
+ end
15
+
16
+ def flipper_reset
17
+ # Remove all features
18
+ Flipper.features.each(&:remove) rescue nil
19
+
20
+ # Reset previous DSL instance
21
+ Flipper.instance = nil
22
+ end
23
+ end
24
+ end
25
+
26
+ if defined?(RSpec) && RSpec.respond_to?(:configure)
27
+ RSpec.configure do |config|
28
+ config.include Flipper::TestHelp
29
+ config.before(:suite) { Flipper::TestHelp.flipper_configure }
30
+ config.before(:each) { flipper_reset }
31
+ end
32
+ end
33
+ if defined?(ActiveSupport)
34
+ ActiveSupport.on_load(:active_support_test_case) do
35
+ Flipper::TestHelp.flipper_configure
36
+
37
+ ActiveSupport::TestCase.class_eval do
38
+ include Flipper::TestHelp
39
+
40
+ setup :flipper_reset
41
+ end
42
+ end
43
+ end