flipper 0.26.0 → 1.1.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 (199) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/ci.yml +19 -13
  4. data/.github/workflows/examples.yml +32 -15
  5. data/Changelog.md +294 -154
  6. data/Gemfile +15 -10
  7. data/README.md +13 -11
  8. data/benchmark/enabled_ips.rb +10 -0
  9. data/benchmark/enabled_multiple_actors_ips.rb +20 -0
  10. data/benchmark/enabled_profile.rb +20 -0
  11. data/benchmark/instrumentation_ips.rb +21 -0
  12. data/benchmark/typecast_ips.rb +27 -0
  13. data/docs/images/flipper_cloud.png +0 -0
  14. data/examples/api/basic.ru +3 -4
  15. data/examples/api/custom_memoized.ru +3 -4
  16. data/examples/api/memoized.ru +3 -4
  17. data/examples/cloud/app.ru +12 -0
  18. data/examples/cloud/backoff_policy.rb +13 -0
  19. data/examples/cloud/basic.rb +22 -0
  20. data/examples/cloud/cloud_setup.rb +20 -0
  21. data/examples/cloud/forked.rb +36 -0
  22. data/examples/cloud/import.rb +17 -0
  23. data/examples/cloud/threaded.rb +33 -0
  24. data/examples/dsl.rb +1 -15
  25. data/examples/enabled_for_actor.rb +4 -2
  26. data/examples/expressions.rb +213 -0
  27. data/examples/mirroring.rb +59 -0
  28. data/examples/strict.rb +18 -0
  29. data/flipper-cloud.gemspec +19 -0
  30. data/flipper.gemspec +3 -5
  31. data/lib/flipper/actor.rb +6 -3
  32. data/lib/flipper/adapter.rb +33 -7
  33. data/lib/flipper/adapter_builder.rb +44 -0
  34. data/lib/flipper/adapters/dual_write.rb +1 -3
  35. data/lib/flipper/adapters/failover.rb +0 -4
  36. data/lib/flipper/adapters/failsafe.rb +0 -4
  37. data/lib/flipper/adapters/http/client.rb +26 -7
  38. data/lib/flipper/adapters/http/error.rb +1 -1
  39. data/lib/flipper/adapters/http.rb +29 -16
  40. data/lib/flipper/adapters/instrumented.rb +25 -6
  41. data/lib/flipper/adapters/memoizable.rb +33 -21
  42. data/lib/flipper/adapters/memory.rb +81 -46
  43. data/lib/flipper/adapters/operation_logger.rb +16 -7
  44. data/lib/flipper/adapters/poll/poller.rb +2 -125
  45. data/lib/flipper/adapters/poll.rb +5 -3
  46. data/lib/flipper/adapters/pstore.rb +17 -11
  47. data/lib/flipper/adapters/read_only.rb +4 -4
  48. data/lib/flipper/adapters/strict.rb +47 -0
  49. data/lib/flipper/adapters/sync/feature_synchronizer.rb +10 -1
  50. data/lib/flipper/adapters/sync.rb +0 -4
  51. data/lib/flipper/cloud/configuration.rb +258 -0
  52. data/lib/flipper/cloud/dsl.rb +27 -0
  53. data/lib/flipper/cloud/message_verifier.rb +95 -0
  54. data/lib/flipper/cloud/middleware.rb +63 -0
  55. data/lib/flipper/cloud/routes.rb +14 -0
  56. data/lib/flipper/cloud/telemetry/backoff_policy.rb +93 -0
  57. data/lib/flipper/cloud/telemetry/instrumenter.rb +26 -0
  58. data/lib/flipper/cloud/telemetry/metric.rb +39 -0
  59. data/lib/flipper/cloud/telemetry/metric_storage.rb +30 -0
  60. data/lib/flipper/cloud/telemetry/submitter.rb +98 -0
  61. data/lib/flipper/cloud/telemetry.rb +183 -0
  62. data/lib/flipper/cloud.rb +53 -0
  63. data/lib/flipper/configuration.rb +25 -4
  64. data/lib/flipper/dsl.rb +46 -45
  65. data/lib/flipper/engine.rb +88 -0
  66. data/lib/flipper/errors.rb +3 -3
  67. data/lib/flipper/export.rb +26 -0
  68. data/lib/flipper/exporter.rb +17 -0
  69. data/lib/flipper/exporters/json/export.rb +32 -0
  70. data/lib/flipper/exporters/json/v1.rb +33 -0
  71. data/lib/flipper/expression/builder.rb +73 -0
  72. data/lib/flipper/expression/constant.rb +25 -0
  73. data/lib/flipper/expression.rb +71 -0
  74. data/lib/flipper/expressions/all.rb +11 -0
  75. data/lib/flipper/expressions/any.rb +9 -0
  76. data/lib/flipper/expressions/boolean.rb +9 -0
  77. data/lib/flipper/expressions/comparable.rb +13 -0
  78. data/lib/flipper/expressions/duration.rb +28 -0
  79. data/lib/flipper/expressions/equal.rb +9 -0
  80. data/lib/flipper/expressions/greater_than.rb +9 -0
  81. data/lib/flipper/expressions/greater_than_or_equal_to.rb +9 -0
  82. data/lib/flipper/expressions/less_than.rb +9 -0
  83. data/lib/flipper/expressions/less_than_or_equal_to.rb +9 -0
  84. data/lib/flipper/expressions/not_equal.rb +9 -0
  85. data/lib/flipper/expressions/now.rb +9 -0
  86. data/lib/flipper/expressions/number.rb +9 -0
  87. data/lib/flipper/expressions/percentage.rb +9 -0
  88. data/lib/flipper/expressions/percentage_of_actors.rb +12 -0
  89. data/lib/flipper/expressions/property.rb +9 -0
  90. data/lib/flipper/expressions/random.rb +9 -0
  91. data/lib/flipper/expressions/string.rb +9 -0
  92. data/lib/flipper/expressions/time.rb +9 -0
  93. data/lib/flipper/feature.rb +87 -26
  94. data/lib/flipper/feature_check_context.rb +10 -6
  95. data/lib/flipper/gate.rb +13 -11
  96. data/lib/flipper/gate_values.rb +5 -18
  97. data/lib/flipper/gates/actor.rb +10 -17
  98. data/lib/flipper/gates/boolean.rb +1 -1
  99. data/lib/flipper/gates/expression.rb +75 -0
  100. data/lib/flipper/gates/group.rb +5 -7
  101. data/lib/flipper/gates/percentage_of_actors.rb +10 -13
  102. data/lib/flipper/gates/percentage_of_time.rb +1 -2
  103. data/lib/flipper/identifier.rb +2 -2
  104. data/lib/flipper/instrumentation/log_subscriber.rb +24 -5
  105. data/lib/flipper/instrumentation/statsd_subscriber.rb +2 -4
  106. data/lib/flipper/instrumentation/subscriber.rb +8 -1
  107. data/lib/flipper/metadata.rb +5 -1
  108. data/lib/flipper/middleware/memoizer.rb +30 -14
  109. data/lib/flipper/poller.rb +117 -0
  110. data/lib/flipper/serializers/gzip.rb +24 -0
  111. data/lib/flipper/serializers/json.rb +19 -0
  112. data/lib/flipper/spec/shared_adapter_specs.rb +95 -54
  113. data/lib/flipper/test/shared_adapter_test.rb +91 -48
  114. data/lib/flipper/typecast.rb +56 -15
  115. data/lib/flipper/types/actor.rb +13 -13
  116. data/lib/flipper/types/group.rb +4 -4
  117. data/lib/flipper/types/percentage.rb +1 -1
  118. data/lib/flipper/version.rb +1 -1
  119. data/lib/flipper.rb +47 -10
  120. data/spec/fixtures/flipper_pstore_1679087600.json +46 -0
  121. data/spec/flipper/adapter_builder_spec.rb +73 -0
  122. data/spec/flipper/adapter_spec.rb +30 -2
  123. data/spec/flipper/adapters/dual_write_spec.rb +2 -2
  124. data/spec/flipper/adapters/http_spec.rb +64 -8
  125. data/spec/flipper/adapters/instrumented_spec.rb +29 -11
  126. data/spec/flipper/adapters/memoizable_spec.rb +51 -31
  127. data/spec/flipper/adapters/memory_spec.rb +14 -3
  128. data/spec/flipper/adapters/operation_logger_spec.rb +31 -12
  129. data/spec/flipper/adapters/read_only_spec.rb +32 -17
  130. data/spec/flipper/adapters/strict_spec.rb +62 -0
  131. data/spec/flipper/adapters/sync/feature_synchronizer_spec.rb +27 -0
  132. data/spec/flipper/cloud/configuration_spec.rb +252 -0
  133. data/spec/flipper/cloud/dsl_spec.rb +82 -0
  134. data/spec/flipper/cloud/message_verifier_spec.rb +104 -0
  135. data/spec/flipper/cloud/middleware_spec.rb +289 -0
  136. data/spec/flipper/cloud/telemetry/backoff_policy_spec.rb +108 -0
  137. data/spec/flipper/cloud/telemetry/metric_spec.rb +87 -0
  138. data/spec/flipper/cloud/telemetry/metric_storage_spec.rb +58 -0
  139. data/spec/flipper/cloud/telemetry/submitter_spec.rb +145 -0
  140. data/spec/flipper/cloud/telemetry_spec.rb +156 -0
  141. data/spec/flipper/cloud_spec.rb +180 -0
  142. data/spec/flipper/configuration_spec.rb +17 -0
  143. data/spec/flipper/dsl_spec.rb +54 -73
  144. data/spec/flipper/engine_spec.rb +291 -0
  145. data/spec/flipper/export_spec.rb +13 -0
  146. data/spec/flipper/exporter_spec.rb +16 -0
  147. data/spec/flipper/exporters/json/export_spec.rb +60 -0
  148. data/spec/flipper/exporters/json/v1_spec.rb +33 -0
  149. data/spec/flipper/expression/builder_spec.rb +248 -0
  150. data/spec/flipper/expression_spec.rb +188 -0
  151. data/spec/flipper/expressions/all_spec.rb +15 -0
  152. data/spec/flipper/expressions/any_spec.rb +15 -0
  153. data/spec/flipper/expressions/boolean_spec.rb +15 -0
  154. data/spec/flipper/expressions/duration_spec.rb +43 -0
  155. data/spec/flipper/expressions/equal_spec.rb +24 -0
  156. data/spec/flipper/expressions/greater_than_or_equal_to_spec.rb +28 -0
  157. data/spec/flipper/expressions/greater_than_spec.rb +28 -0
  158. data/spec/flipper/expressions/less_than_or_equal_to_spec.rb +28 -0
  159. data/spec/flipper/expressions/less_than_spec.rb +32 -0
  160. data/spec/flipper/expressions/not_equal_spec.rb +15 -0
  161. data/spec/flipper/expressions/now_spec.rb +11 -0
  162. data/spec/flipper/expressions/number_spec.rb +21 -0
  163. data/spec/flipper/expressions/percentage_of_actors_spec.rb +20 -0
  164. data/spec/flipper/expressions/percentage_spec.rb +15 -0
  165. data/spec/flipper/expressions/property_spec.rb +13 -0
  166. data/spec/flipper/expressions/random_spec.rb +9 -0
  167. data/spec/flipper/expressions/string_spec.rb +11 -0
  168. data/spec/flipper/expressions/time_spec.rb +13 -0
  169. data/spec/flipper/feature_check_context_spec.rb +17 -17
  170. data/spec/flipper/feature_spec.rb +436 -33
  171. data/spec/flipper/gate_values_spec.rb +2 -33
  172. data/spec/flipper/gates/boolean_spec.rb +1 -1
  173. data/spec/flipper/gates/expression_spec.rb +108 -0
  174. data/spec/flipper/gates/group_spec.rb +2 -3
  175. data/spec/flipper/gates/percentage_of_actors_spec.rb +61 -5
  176. data/spec/flipper/gates/percentage_of_time_spec.rb +2 -2
  177. data/spec/flipper/identifier_spec.rb +4 -5
  178. data/spec/flipper/instrumentation/log_subscriber_spec.rb +15 -5
  179. data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +25 -1
  180. data/spec/flipper/middleware/memoizer_spec.rb +67 -0
  181. data/spec/flipper/poller_spec.rb +47 -0
  182. data/spec/flipper/serializers/gzip_spec.rb +13 -0
  183. data/spec/flipper/serializers/json_spec.rb +13 -0
  184. data/spec/flipper/typecast_spec.rb +121 -6
  185. data/spec/flipper/types/actor_spec.rb +63 -46
  186. data/spec/flipper/types/group_spec.rb +2 -2
  187. data/spec/flipper_integration_spec.rb +168 -58
  188. data/spec/flipper_spec.rb +92 -28
  189. data/spec/spec_helper.rb +6 -13
  190. data/spec/support/actor_names.yml +1 -0
  191. data/spec/support/climate_control.rb +7 -0
  192. data/spec/support/fake_backoff_policy.rb +15 -0
  193. data/spec/support/skippable.rb +18 -0
  194. data/spec/support/spec_helpers.rb +11 -3
  195. metadata +166 -13
  196. data/.github/workflows/release.yml +0 -44
  197. data/.tool-versions +0 -1
  198. data/lib/flipper/railtie.rb +0 -47
  199. data/spec/flipper/railtie_spec.rb +0 -109
data/spec/flipper_spec.rb CHANGED
@@ -64,7 +64,12 @@ RSpec.describe Flipper do
64
64
 
65
65
  describe "delegation to instance" do
66
66
  let(:group) { Flipper::Types::Group.new(:admins) }
67
- let(:actor) { Flipper::Actor.new("1") }
67
+ let(:actor) {
68
+ Flipper::Actor.new("1", {
69
+ "plan" => "basic",
70
+ })
71
+ }
72
+ let(:expression) { Flipper.property(:plan).eq("basic") }
68
73
 
69
74
  before do
70
75
  described_class.configure do |config|
@@ -88,12 +93,35 @@ RSpec.describe Flipper do
88
93
  expect(described_class.instance.enabled?(:search)).to be(false)
89
94
  end
90
95
 
91
- it 'delegates bool to instance' do
92
- expect(described_class.bool).to eq(described_class.instance.bool)
96
+ it 'delegates expression to instance' do
97
+ expect(described_class.expression(:search)).to be(nil)
98
+
99
+ expression = Flipper.property(:plan).eq("basic")
100
+ Flipper.instance.enable_expression :search, expression
101
+
102
+ expect(described_class.expression(:search)).to eq(expression)
93
103
  end
94
104
 
95
- it 'delegates boolean to instance' do
96
- expect(described_class.boolean).to eq(described_class.instance.boolean)
105
+ it 'delegates enable_expression to instance' do
106
+ described_class.enable_expression(:search, expression)
107
+ expect(described_class.instance.enabled?(:search, actor)).to be(true)
108
+ end
109
+
110
+ it 'delegates disable_expression to instance' do
111
+ described_class.disable_expression(:search)
112
+ expect(described_class.instance.enabled?(:search, actor)).to be(false)
113
+ end
114
+
115
+ it 'delegates add_expression to instance' do
116
+ described_class.add_expression(:search, expression)
117
+ expect(described_class.instance.enabled?(:search, actor)).to be(true)
118
+ end
119
+
120
+ it 'delegates remove_expression to instance' do
121
+ described_class.enable_expression(:search, Flipper.any(expression))
122
+ expect(described_class.instance.enabled?(:search, actor)).to be(true)
123
+ described_class.remove_expression(:search, expression)
124
+ expect(described_class.instance.enabled?(:search, actor)).to be(false)
97
125
  end
98
126
 
99
127
  it 'delegates enable_actor to instance' do
@@ -106,10 +134,6 @@ RSpec.describe Flipper do
106
134
  expect(described_class.instance.enabled?(:search, actor)).to be(false)
107
135
  end
108
136
 
109
- it 'delegates actor to instance' do
110
- expect(described_class.actor(actor)).to eq(described_class.instance.actor(actor))
111
- end
112
-
113
137
  it 'delegates enable_group to instance' do
114
138
  described_class.enable_group(:search, group)
115
139
  expect(described_class.instance[:search].enabled_groups).to include(group)
@@ -130,15 +154,6 @@ RSpec.describe Flipper do
130
154
  expect(described_class.instance[:search].percentage_of_actors_value).to be(0)
131
155
  end
132
156
 
133
- it 'delegates actors to instance' do
134
- expect(described_class.actors(5)).to eq(described_class.instance.actors(5))
135
- end
136
-
137
- it 'delegates percentage_of_actors to instance' do
138
- expected = described_class.instance.percentage_of_actors(5)
139
- expect(described_class.percentage_of_actors(5)).to eq(expected)
140
- end
141
-
142
157
  it 'delegates enable_percentage_of_time to instance' do
143
158
  described_class.enable_percentage_of_time(:search, 5)
144
159
  expect(described_class.instance[:search].percentage_of_time_value).to be(5)
@@ -149,15 +164,6 @@ RSpec.describe Flipper do
149
164
  expect(described_class.instance[:search].percentage_of_time_value).to be(0)
150
165
  end
151
166
 
152
- it 'delegates time to instance' do
153
- expect(described_class.time(56)).to eq(described_class.instance.time(56))
154
- end
155
-
156
- it 'delegates percentage_of_time to instance' do
157
- expected = described_class.instance.percentage_of_time(56)
158
- expect(described_class.percentage_of_time(56)).to eq(expected)
159
- end
160
-
161
167
  it 'delegates features to instance' do
162
168
  described_class.instance.add(:search)
163
169
  expect(described_class.features).to eq(described_class.instance.features)
@@ -202,6 +208,12 @@ RSpec.describe Flipper do
202
208
  expect(described_class.enabled?(:search)).to be(true)
203
209
  end
204
210
 
211
+ it 'delegates export to instance' do
212
+ described_class.enable(:search)
213
+ expect(described_class.export).to eq(described_class.adapter.export)
214
+ expect(described_class.export(format: :json)).to eq(described_class.adapter.export(format: :json))
215
+ end
216
+
205
217
  it 'delegates adapter to instance' do
206
218
  expect(described_class.adapter).to eq(described_class.instance.adapter)
207
219
  end
@@ -216,13 +228,17 @@ RSpec.describe Flipper do
216
228
  expect(described_class.memoizing?).to eq(described_class.adapter.memoizing?)
217
229
  end
218
230
 
231
+ it 'delegates read_only? to instance' do
232
+ expect(described_class.read_only?).to eq(described_class.adapter.read_only?)
233
+ end
234
+
219
235
  it 'delegates sync stuff to instance and does nothing' do
220
236
  expect(described_class.sync).to be(nil)
221
237
  expect(described_class.sync_secret).to be(nil)
222
238
  end
223
239
 
224
240
  it 'delegates sync stuff to instance for Flipper::Cloud' do
225
- stub = stub_request(:get, "https://www.flippercloud.io/adapter/features").
241
+ stub = stub_request(:get, "https://www.flippercloud.io/adapter/features?exclude_gate_names=true").
226
242
  with({
227
243
  headers: {
228
244
  'Flipper-Cloud-Token'=>'asdf',
@@ -350,4 +366,52 @@ RSpec.describe Flipper do
350
366
  expect(described_class.instance_variable_get('@groups_registry')).to eq(registry)
351
367
  end
352
368
  end
369
+
370
+ describe ".constant" do
371
+ it "returns Flipper::Expression::Constant instance" do
372
+ expect(described_class.constant(false)).to eq(Flipper::Expression::Constant.new(false))
373
+ expect(described_class.constant("string")).to eq(Flipper::Expression::Constant.new("string"))
374
+ end
375
+ end
376
+
377
+ describe ".property" do
378
+ it "returns Flipper::Expressions::Property expression" do
379
+ expect(Flipper.property("name")).to eq(Flipper::Expression.build(Property: "name"))
380
+ end
381
+ end
382
+
383
+ describe ".boolean" do
384
+ it "returns Flipper::Expressions::Boolean expression" do
385
+ expect(described_class.boolean(true)).to eq(Flipper::Expression.build(Boolean: true))
386
+ expect(described_class.boolean(false)).to eq(Flipper::Expression.build(Boolean: false))
387
+ end
388
+ end
389
+
390
+ describe ".random" do
391
+ it "returns Flipper::Expressions::Random expression" do
392
+ expect(Flipper.random(100)).to eq(Flipper::Expression.build(Random: 100))
393
+ end
394
+ end
395
+
396
+ describe ".any" do
397
+ let(:age_expression) { Flipper.property(:age).gte(21) }
398
+ let(:plan_expression) { Flipper.property(:plan).eq("basic") }
399
+
400
+ it "returns Flipper::Expressions::Any instance" do
401
+ expect(Flipper.any(age_expression, plan_expression)).to eq(
402
+ Flipper::Expression.build({Any: [age_expression, plan_expression]})
403
+ )
404
+ end
405
+ end
406
+
407
+ describe ".all" do
408
+ let(:age_expression) { Flipper.property(:age).gte(21) }
409
+ let(:plan_expression) { Flipper.property(:plan).eq("basic") }
410
+
411
+ it "returns Flipper::Expressions::All instance" do
412
+ expect(Flipper.all(age_expression, plan_expression)).to eq(
413
+ Flipper::Expression.build({All: [age_expression, plan_expression]})
414
+ )
415
+ end
416
+ end
353
417
  end
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,7 @@ require 'bundler'
10
10
  Bundler.setup(:default)
11
11
 
12
12
  require 'debug'
13
+ require 'statsd'
13
14
  require 'webmock/rspec'
14
15
  WebMock.disable_net_connect!(allow_localhost: true)
15
16
 
@@ -20,9 +21,13 @@ require 'flipper/ui'
20
21
 
21
22
  Dir[FlipperRoot.join('spec/support/**/*.rb')].sort.each { |f| require f }
22
23
 
24
+ # Disable telemetry logging in specs.
25
+ ENV["FLIPPER_CLOUD_LOGGING_ENABLED"] = "false"
26
+
23
27
  RSpec.configure do |config|
24
28
  config.before(:example) do
25
- Flipper::Adapters::Poll::Poller.reset if defined?(Flipper::Adapters::Poll::Poller)
29
+ Flipper::Cloud::Telemetry.reset if defined?(Flipper::Cloud::Telemetry) && Flipper::Cloud::Telemetry.respond_to?(:reset)
30
+ Flipper::Poller.reset if defined?(Flipper::Poller)
26
31
  Flipper.unregister_groups
27
32
  Flipper.configuration = nil
28
33
  end
@@ -91,15 +96,3 @@ RSpec.shared_examples_for 'a DSL feature' do
91
96
  end.to raise_error(ArgumentError, /must be a String or Symbol/)
92
97
  end
93
98
  end
94
-
95
- RSpec.shared_examples_for 'a DSL boolean method' do
96
- it 'returns boolean with value set' do
97
- result = subject.send(method_name, true)
98
- expect(result).to be_instance_of(Flipper::Types::Boolean)
99
- expect(result.value).to be(true)
100
-
101
- result = subject.send(method_name, false)
102
- expect(result).to be_instance_of(Flipper::Types::Boolean)
103
- expect(result.value).to be(false)
104
- end
105
- end
@@ -0,0 +1 @@
1
+ actor_name_1: 'Actor #1'
@@ -0,0 +1,7 @@
1
+ require 'climate_control'
2
+
3
+ RSpec.configure do |config|
4
+ def with_env(options = {}, &block)
5
+ ClimateControl.modify(options, &block)
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ class FakeBackoffPolicy
2
+ def initialize
3
+ @retries = 0
4
+ end
5
+
6
+ attr_reader :retries
7
+
8
+ def next_interval
9
+ @retries += 1
10
+ 0
11
+ end
12
+
13
+ def reset
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ RSpec.configure do |config|
2
+ config.before(:all) do
3
+ $skip = false
4
+ end
5
+
6
+ def skip_on_error(error, message, &block)
7
+ # Premptively skip if we've already skipped
8
+ skip(message) if $skip
9
+ block.call
10
+ rescue error
11
+ if ENV["CI"]
12
+ raise
13
+ else
14
+ $skip = true
15
+ skip(message)
16
+ end
17
+ end
18
+ end
@@ -42,6 +42,14 @@ module SpecHelpers
42
42
  }
43
43
  end
44
44
 
45
+ def api_positive_percentage_error_response
46
+ {
47
+ 'code' => 3,
48
+ 'message' => 'Percentage must be a positive number less than or equal to 100.',
49
+ 'more_info' => api_error_code_reference_url,
50
+ }
51
+ end
52
+
45
53
  def api_flipper_id_is_missing_response
46
54
  {
47
55
  'code' => 4,
@@ -50,10 +58,10 @@ module SpecHelpers
50
58
  }
51
59
  end
52
60
 
53
- def api_positive_percentage_error_response
61
+ def api_expression_invalid_response
54
62
  {
55
- 'code' => 3,
56
- 'message' => 'Percentage must be a positive number less than or equal to 100.',
63
+ 'code' => 7,
64
+ 'message' => 'The provided expression was not valid.',
57
65
  'more_info' => api_error_code_reference_url,
58
66
  }
59
67
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-05 00:00:00.000000000 Z
11
+ date: 2023-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -25,19 +25,17 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2'
27
27
  description:
28
- email:
29
- - nunemaker@gmail.com
28
+ email: support@flippercloud.io
30
29
  executables: []
31
30
  extensions: []
32
31
  extra_rdoc_files: []
33
32
  files:
34
33
  - ".codeclimate.yml"
34
+ - ".github/FUNDING.yml"
35
35
  - ".github/dependabot.yml"
36
36
  - ".github/workflows/ci.yml"
37
37
  - ".github/workflows/examples.yml"
38
- - ".github/workflows/release.yml"
39
38
  - ".rspec"
40
- - ".tool-versions"
41
39
  - CODE_OF_CONDUCT.md
42
40
  - Changelog.md
43
41
  - Dockerfile
@@ -45,17 +43,31 @@ files:
45
43
  - LICENSE
46
44
  - README.md
47
45
  - Rakefile
46
+ - benchmark/enabled_ips.rb
47
+ - benchmark/enabled_multiple_actors_ips.rb
48
+ - benchmark/enabled_profile.rb
49
+ - benchmark/instrumentation_ips.rb
50
+ - benchmark/typecast_ips.rb
48
51
  - docker-compose.yml
49
52
  - docs/DockerCompose.md
50
53
  - docs/README.md
51
54
  - docs/images/banner.jpg
55
+ - docs/images/flipper_cloud.png
52
56
  - examples/api/basic.ru
53
57
  - examples/api/custom_memoized.ru
54
58
  - examples/api/memoized.ru
55
59
  - examples/basic.rb
60
+ - examples/cloud/app.ru
61
+ - examples/cloud/backoff_policy.rb
62
+ - examples/cloud/basic.rb
63
+ - examples/cloud/cloud_setup.rb
64
+ - examples/cloud/forked.rb
65
+ - examples/cloud/import.rb
66
+ - examples/cloud/threaded.rb
56
67
  - examples/configuring_default.rb
57
68
  - examples/dsl.rb
58
69
  - examples/enabled_for_actor.rb
70
+ - examples/expressions.rb
59
71
  - examples/group.rb
60
72
  - examples/group_dynamic_lookup.rb
61
73
  - examples/group_with_members.rb
@@ -64,14 +76,18 @@ files:
64
76
  - examples/instrumentation.rb
65
77
  - examples/instrumentation_last_accessed_at.rb
66
78
  - examples/memoizing.rb
79
+ - examples/mirroring.rb
67
80
  - examples/percentage_of_actors.rb
68
81
  - examples/percentage_of_actors_enabled_check.rb
69
82
  - examples/percentage_of_actors_group.rb
70
83
  - examples/percentage_of_time.rb
84
+ - examples/strict.rb
85
+ - flipper-cloud.gemspec
71
86
  - flipper.gemspec
72
87
  - lib/flipper.rb
73
88
  - lib/flipper/actor.rb
74
89
  - lib/flipper/adapter.rb
90
+ - lib/flipper/adapter_builder.rb
75
91
  - lib/flipper/adapters/dual_write.rb
76
92
  - lib/flipper/adapters/failover.rb
77
93
  - lib/flipper/adapters/failsafe.rb
@@ -86,19 +102,60 @@ files:
86
102
  - lib/flipper/adapters/poll/poller.rb
87
103
  - lib/flipper/adapters/pstore.rb
88
104
  - lib/flipper/adapters/read_only.rb
105
+ - lib/flipper/adapters/strict.rb
89
106
  - lib/flipper/adapters/sync.rb
90
107
  - lib/flipper/adapters/sync/feature_synchronizer.rb
91
108
  - lib/flipper/adapters/sync/interval_synchronizer.rb
92
109
  - lib/flipper/adapters/sync/synchronizer.rb
110
+ - lib/flipper/cloud.rb
111
+ - lib/flipper/cloud/configuration.rb
112
+ - lib/flipper/cloud/dsl.rb
113
+ - lib/flipper/cloud/message_verifier.rb
114
+ - lib/flipper/cloud/middleware.rb
115
+ - lib/flipper/cloud/routes.rb
116
+ - lib/flipper/cloud/telemetry.rb
117
+ - lib/flipper/cloud/telemetry/backoff_policy.rb
118
+ - lib/flipper/cloud/telemetry/instrumenter.rb
119
+ - lib/flipper/cloud/telemetry/metric.rb
120
+ - lib/flipper/cloud/telemetry/metric_storage.rb
121
+ - lib/flipper/cloud/telemetry/submitter.rb
93
122
  - lib/flipper/configuration.rb
94
123
  - lib/flipper/dsl.rb
124
+ - lib/flipper/engine.rb
95
125
  - lib/flipper/errors.rb
126
+ - lib/flipper/export.rb
127
+ - lib/flipper/exporter.rb
128
+ - lib/flipper/exporters/json/export.rb
129
+ - lib/flipper/exporters/json/v1.rb
130
+ - lib/flipper/expression.rb
131
+ - lib/flipper/expression/builder.rb
132
+ - lib/flipper/expression/constant.rb
133
+ - lib/flipper/expressions/all.rb
134
+ - lib/flipper/expressions/any.rb
135
+ - lib/flipper/expressions/boolean.rb
136
+ - lib/flipper/expressions/comparable.rb
137
+ - lib/flipper/expressions/duration.rb
138
+ - lib/flipper/expressions/equal.rb
139
+ - lib/flipper/expressions/greater_than.rb
140
+ - lib/flipper/expressions/greater_than_or_equal_to.rb
141
+ - lib/flipper/expressions/less_than.rb
142
+ - lib/flipper/expressions/less_than_or_equal_to.rb
143
+ - lib/flipper/expressions/not_equal.rb
144
+ - lib/flipper/expressions/now.rb
145
+ - lib/flipper/expressions/number.rb
146
+ - lib/flipper/expressions/percentage.rb
147
+ - lib/flipper/expressions/percentage_of_actors.rb
148
+ - lib/flipper/expressions/property.rb
149
+ - lib/flipper/expressions/random.rb
150
+ - lib/flipper/expressions/string.rb
151
+ - lib/flipper/expressions/time.rb
96
152
  - lib/flipper/feature.rb
97
153
  - lib/flipper/feature_check_context.rb
98
154
  - lib/flipper/gate.rb
99
155
  - lib/flipper/gate_values.rb
100
156
  - lib/flipper/gates/actor.rb
101
157
  - lib/flipper/gates/boolean.rb
158
+ - lib/flipper/gates/expression.rb
102
159
  - lib/flipper/gates/group.rb
103
160
  - lib/flipper/gates/percentage_of_actors.rb
104
161
  - lib/flipper/gates/percentage_of_time.rb
@@ -112,8 +169,10 @@ files:
112
169
  - lib/flipper/metadata.rb
113
170
  - lib/flipper/middleware/memoizer.rb
114
171
  - lib/flipper/middleware/setup_env.rb
115
- - lib/flipper/railtie.rb
172
+ - lib/flipper/poller.rb
116
173
  - lib/flipper/registry.rb
174
+ - lib/flipper/serializers/gzip.rb
175
+ - lib/flipper/serializers/json.rb
117
176
  - lib/flipper/spec/shared_adapter_specs.rb
118
177
  - lib/flipper/test/shared_adapter_test.rb
119
178
  - lib/flipper/type.rb
@@ -126,7 +185,9 @@ files:
126
185
  - lib/flipper/types/percentage_of_time.rb
127
186
  - lib/flipper/version.rb
128
187
  - spec/fixtures/feature.json
188
+ - spec/fixtures/flipper_pstore_1679087600.json
129
189
  - spec/flipper/actor_spec.rb
190
+ - spec/flipper/adapter_builder_spec.rb
130
191
  - spec/flipper/adapter_spec.rb
131
192
  - spec/flipper/adapters/dual_write_spec.rb
132
193
  - spec/flipper/adapters/failover_spec.rb
@@ -138,18 +199,55 @@ files:
138
199
  - spec/flipper/adapters/operation_logger_spec.rb
139
200
  - spec/flipper/adapters/pstore_spec.rb
140
201
  - spec/flipper/adapters/read_only_spec.rb
202
+ - spec/flipper/adapters/strict_spec.rb
141
203
  - spec/flipper/adapters/sync/feature_synchronizer_spec.rb
142
204
  - spec/flipper/adapters/sync/interval_synchronizer_spec.rb
143
205
  - spec/flipper/adapters/sync/synchronizer_spec.rb
144
206
  - spec/flipper/adapters/sync_spec.rb
207
+ - spec/flipper/cloud/configuration_spec.rb
208
+ - spec/flipper/cloud/dsl_spec.rb
209
+ - spec/flipper/cloud/message_verifier_spec.rb
210
+ - spec/flipper/cloud/middleware_spec.rb
211
+ - spec/flipper/cloud/telemetry/backoff_policy_spec.rb
212
+ - spec/flipper/cloud/telemetry/metric_spec.rb
213
+ - spec/flipper/cloud/telemetry/metric_storage_spec.rb
214
+ - spec/flipper/cloud/telemetry/submitter_spec.rb
215
+ - spec/flipper/cloud/telemetry_spec.rb
216
+ - spec/flipper/cloud_spec.rb
145
217
  - spec/flipper/configuration_spec.rb
146
218
  - spec/flipper/dsl_spec.rb
219
+ - spec/flipper/engine_spec.rb
220
+ - spec/flipper/export_spec.rb
221
+ - spec/flipper/exporter_spec.rb
222
+ - spec/flipper/exporters/json/export_spec.rb
223
+ - spec/flipper/exporters/json/v1_spec.rb
224
+ - spec/flipper/expression/builder_spec.rb
225
+ - spec/flipper/expression_spec.rb
226
+ - spec/flipper/expressions/all_spec.rb
227
+ - spec/flipper/expressions/any_spec.rb
228
+ - spec/flipper/expressions/boolean_spec.rb
229
+ - spec/flipper/expressions/duration_spec.rb
230
+ - spec/flipper/expressions/equal_spec.rb
231
+ - spec/flipper/expressions/greater_than_or_equal_to_spec.rb
232
+ - spec/flipper/expressions/greater_than_spec.rb
233
+ - spec/flipper/expressions/less_than_or_equal_to_spec.rb
234
+ - spec/flipper/expressions/less_than_spec.rb
235
+ - spec/flipper/expressions/not_equal_spec.rb
236
+ - spec/flipper/expressions/now_spec.rb
237
+ - spec/flipper/expressions/number_spec.rb
238
+ - spec/flipper/expressions/percentage_of_actors_spec.rb
239
+ - spec/flipper/expressions/percentage_spec.rb
240
+ - spec/flipper/expressions/property_spec.rb
241
+ - spec/flipper/expressions/random_spec.rb
242
+ - spec/flipper/expressions/string_spec.rb
243
+ - spec/flipper/expressions/time_spec.rb
147
244
  - spec/flipper/feature_check_context_spec.rb
148
245
  - spec/flipper/feature_spec.rb
149
246
  - spec/flipper/gate_spec.rb
150
247
  - spec/flipper/gate_values_spec.rb
151
248
  - spec/flipper/gates/actor_spec.rb
152
249
  - spec/flipper/gates/boolean_spec.rb
250
+ - spec/flipper/gates/expression_spec.rb
153
251
  - spec/flipper/gates/group_spec.rb
154
252
  - spec/flipper/gates/percentage_of_actors_spec.rb
155
253
  - spec/flipper/gates/percentage_of_time_spec.rb
@@ -160,8 +258,10 @@ files:
160
258
  - spec/flipper/instrumenters/noop_spec.rb
161
259
  - spec/flipper/middleware/memoizer_spec.rb
162
260
  - spec/flipper/middleware/setup_env_spec.rb
163
- - spec/flipper/railtie_spec.rb
261
+ - spec/flipper/poller_spec.rb
164
262
  - spec/flipper/registry_spec.rb
263
+ - spec/flipper/serializers/gzip_spec.rb
264
+ - spec/flipper/serializers/json_spec.rb
165
265
  - spec/flipper/typecast_spec.rb
166
266
  - spec/flipper/types/actor_spec.rb
167
267
  - spec/flipper/types/boolean_spec.rb
@@ -172,18 +272,26 @@ files:
172
272
  - spec/flipper_integration_spec.rb
173
273
  - spec/flipper_spec.rb
174
274
  - spec/spec_helper.rb
275
+ - spec/support/actor_names.yml
276
+ - spec/support/climate_control.rb
175
277
  - spec/support/descriptions.yml
278
+ - spec/support/fake_backoff_policy.rb
176
279
  - spec/support/fake_udp_socket.rb
280
+ - spec/support/skippable.rb
177
281
  - spec/support/spec_helpers.rb
178
282
  - test/adapters/memory_test.rb
179
283
  - test/adapters/pstore_test.rb
180
284
  - test/test_helper.rb
181
285
  - test_rails/helper.rb
182
- homepage: https://github.com/jnunemaker/flipper
286
+ homepage: https://www.flippercloud.io/docs
183
287
  licenses:
184
288
  - MIT
185
289
  metadata:
186
- changelog_uri: https://github.com/jnunemaker/flipper/blob/main/Changelog.md
290
+ documentation_uri: https://www.flippercloud.io/docs
291
+ homepage_uri: https://www.flippercloud.io
292
+ source_code_uri: https://github.com/flippercloud/flipper
293
+ bug_tracker_uri: https://github.com/flippercloud/flipper/issues
294
+ changelog_uri: https://github.com/flippercloud/flipper/blob/main/Changelog.md
187
295
  post_install_message:
188
296
  rdoc_options: []
189
297
  require_paths:
@@ -199,13 +307,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
307
  - !ruby/object:Gem::Version
200
308
  version: '0'
201
309
  requirements: []
202
- rubygems_version: 3.3.7
310
+ rubygems_version: 3.4.10
203
311
  signing_key:
204
312
  specification_version: 4
205
- summary: Feature flipper for ANYTHING
313
+ summary: Beautiful, performant feature flags for Ruby.
206
314
  test_files:
207
315
  - spec/fixtures/feature.json
316
+ - spec/fixtures/flipper_pstore_1679087600.json
208
317
  - spec/flipper/actor_spec.rb
318
+ - spec/flipper/adapter_builder_spec.rb
209
319
  - spec/flipper/adapter_spec.rb
210
320
  - spec/flipper/adapters/dual_write_spec.rb
211
321
  - spec/flipper/adapters/failover_spec.rb
@@ -217,18 +327,55 @@ test_files:
217
327
  - spec/flipper/adapters/operation_logger_spec.rb
218
328
  - spec/flipper/adapters/pstore_spec.rb
219
329
  - spec/flipper/adapters/read_only_spec.rb
330
+ - spec/flipper/adapters/strict_spec.rb
220
331
  - spec/flipper/adapters/sync/feature_synchronizer_spec.rb
221
332
  - spec/flipper/adapters/sync/interval_synchronizer_spec.rb
222
333
  - spec/flipper/adapters/sync/synchronizer_spec.rb
223
334
  - spec/flipper/adapters/sync_spec.rb
335
+ - spec/flipper/cloud/configuration_spec.rb
336
+ - spec/flipper/cloud/dsl_spec.rb
337
+ - spec/flipper/cloud/message_verifier_spec.rb
338
+ - spec/flipper/cloud/middleware_spec.rb
339
+ - spec/flipper/cloud/telemetry/backoff_policy_spec.rb
340
+ - spec/flipper/cloud/telemetry/metric_spec.rb
341
+ - spec/flipper/cloud/telemetry/metric_storage_spec.rb
342
+ - spec/flipper/cloud/telemetry/submitter_spec.rb
343
+ - spec/flipper/cloud/telemetry_spec.rb
344
+ - spec/flipper/cloud_spec.rb
224
345
  - spec/flipper/configuration_spec.rb
225
346
  - spec/flipper/dsl_spec.rb
347
+ - spec/flipper/engine_spec.rb
348
+ - spec/flipper/export_spec.rb
349
+ - spec/flipper/exporter_spec.rb
350
+ - spec/flipper/exporters/json/export_spec.rb
351
+ - spec/flipper/exporters/json/v1_spec.rb
352
+ - spec/flipper/expression/builder_spec.rb
353
+ - spec/flipper/expression_spec.rb
354
+ - spec/flipper/expressions/all_spec.rb
355
+ - spec/flipper/expressions/any_spec.rb
356
+ - spec/flipper/expressions/boolean_spec.rb
357
+ - spec/flipper/expressions/duration_spec.rb
358
+ - spec/flipper/expressions/equal_spec.rb
359
+ - spec/flipper/expressions/greater_than_or_equal_to_spec.rb
360
+ - spec/flipper/expressions/greater_than_spec.rb
361
+ - spec/flipper/expressions/less_than_or_equal_to_spec.rb
362
+ - spec/flipper/expressions/less_than_spec.rb
363
+ - spec/flipper/expressions/not_equal_spec.rb
364
+ - spec/flipper/expressions/now_spec.rb
365
+ - spec/flipper/expressions/number_spec.rb
366
+ - spec/flipper/expressions/percentage_of_actors_spec.rb
367
+ - spec/flipper/expressions/percentage_spec.rb
368
+ - spec/flipper/expressions/property_spec.rb
369
+ - spec/flipper/expressions/random_spec.rb
370
+ - spec/flipper/expressions/string_spec.rb
371
+ - spec/flipper/expressions/time_spec.rb
226
372
  - spec/flipper/feature_check_context_spec.rb
227
373
  - spec/flipper/feature_spec.rb
228
374
  - spec/flipper/gate_spec.rb
229
375
  - spec/flipper/gate_values_spec.rb
230
376
  - spec/flipper/gates/actor_spec.rb
231
377
  - spec/flipper/gates/boolean_spec.rb
378
+ - spec/flipper/gates/expression_spec.rb
232
379
  - spec/flipper/gates/group_spec.rb
233
380
  - spec/flipper/gates/percentage_of_actors_spec.rb
234
381
  - spec/flipper/gates/percentage_of_time_spec.rb
@@ -239,8 +386,10 @@ test_files:
239
386
  - spec/flipper/instrumenters/noop_spec.rb
240
387
  - spec/flipper/middleware/memoizer_spec.rb
241
388
  - spec/flipper/middleware/setup_env_spec.rb
242
- - spec/flipper/railtie_spec.rb
389
+ - spec/flipper/poller_spec.rb
243
390
  - spec/flipper/registry_spec.rb
391
+ - spec/flipper/serializers/gzip_spec.rb
392
+ - spec/flipper/serializers/json_spec.rb
244
393
  - spec/flipper/typecast_spec.rb
245
394
  - spec/flipper/types/actor_spec.rb
246
395
  - spec/flipper/types/boolean_spec.rb
@@ -251,8 +400,12 @@ test_files:
251
400
  - spec/flipper_integration_spec.rb
252
401
  - spec/flipper_spec.rb
253
402
  - spec/spec_helper.rb
403
+ - spec/support/actor_names.yml
404
+ - spec/support/climate_control.rb
254
405
  - spec/support/descriptions.yml
406
+ - spec/support/fake_backoff_policy.rb
255
407
  - spec/support/fake_udp_socket.rb
408
+ - spec/support/skippable.rb
256
409
  - spec/support/spec_helpers.rb
257
410
  - test/adapters/memory_test.rb
258
411
  - test/adapters/pstore_test.rb