flipper 1.3.5 → 1.4.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +8 -5
  3. data/.github/workflows/examples.yml +4 -3
  4. data/.github/workflows/release.yml +54 -0
  5. data/CLAUDE.md +87 -0
  6. data/README.md +4 -3
  7. data/examples/cloud/poll_interval/README.md +111 -0
  8. data/examples/cloud/poll_interval/client.rb +108 -0
  9. data/examples/cloud/poll_interval/server.rb +98 -0
  10. data/examples/expressions.rb +35 -11
  11. data/lib/flipper/adapter.rb +17 -1
  12. data/lib/flipper/adapters/actor_limit.rb +27 -1
  13. data/lib/flipper/adapters/cache_base.rb +21 -3
  14. data/lib/flipper/adapters/dual_write.rb +6 -2
  15. data/lib/flipper/adapters/failover.rb +9 -3
  16. data/lib/flipper/adapters/failsafe.rb +2 -2
  17. data/lib/flipper/adapters/http/client.rb +15 -4
  18. data/lib/flipper/adapters/http.rb +37 -2
  19. data/lib/flipper/adapters/instrumented.rb +2 -2
  20. data/lib/flipper/adapters/memoizable.rb +3 -3
  21. data/lib/flipper/adapters/memory.rb +1 -1
  22. data/lib/flipper/adapters/pstore.rb +1 -1
  23. data/lib/flipper/adapters/sync/feature_synchronizer.rb +5 -1
  24. data/lib/flipper/adapters/sync/synchronizer.rb +10 -5
  25. data/lib/flipper/adapters/sync.rb +7 -3
  26. data/lib/flipper/cli.rb +51 -0
  27. data/lib/flipper/cloud/configuration.rb +9 -4
  28. data/lib/flipper/cloud/dsl.rb +2 -2
  29. data/lib/flipper/cloud/middleware.rb +1 -1
  30. data/lib/flipper/cloud/migrate.rb +71 -0
  31. data/lib/flipper/cloud/telemetry.rb +1 -1
  32. data/lib/flipper/cloud.rb +1 -0
  33. data/lib/flipper/dsl.rb +1 -1
  34. data/lib/flipper/expressions/feature_enabled.rb +34 -0
  35. data/lib/flipper/expressions/time.rb +8 -1
  36. data/lib/flipper/gates/expression.rb +2 -2
  37. data/lib/flipper/poller.rb +47 -8
  38. data/lib/flipper/version.rb +1 -1
  39. data/lib/flipper.rb +17 -1
  40. data/spec/flipper/adapter_spec.rb +20 -0
  41. data/spec/flipper/adapters/actor_limit_spec.rb +55 -0
  42. data/spec/flipper/adapters/dual_write_spec.rb +13 -0
  43. data/spec/flipper/adapters/failover_spec.rb +12 -0
  44. data/spec/flipper/adapters/http_spec.rb +151 -0
  45. data/spec/flipper/adapters/sync/feature_synchronizer_spec.rb +12 -0
  46. data/spec/flipper/adapters/sync/synchronizer_spec.rb +87 -0
  47. data/spec/flipper/adapters/sync_spec.rb +13 -0
  48. data/spec/flipper/cli_spec.rb +51 -0
  49. data/spec/flipper/cloud/configuration_spec.rb +6 -0
  50. data/spec/flipper/cloud/dsl_spec.rb +10 -2
  51. data/spec/flipper/cloud/middleware_spec.rb +34 -16
  52. data/spec/flipper/cloud/migrate_spec.rb +160 -0
  53. data/spec/flipper/cloud/telemetry_spec.rb +1 -1
  54. data/spec/flipper/engine_spec.rb +2 -2
  55. data/spec/flipper/expressions/time_spec.rb +16 -0
  56. data/spec/flipper/gates/expression_spec.rb +82 -0
  57. data/spec/flipper/middleware/memoizer_spec.rb +37 -6
  58. data/spec/flipper/poller_spec.rb +347 -4
  59. data/spec/flipper_integration_spec.rb +133 -0
  60. data/spec/flipper_spec.rb +6 -1
  61. metadata +17 -112
  62. data/lib/flipper/expressions/duration.rb +0 -28
  63. data/spec/flipper/expressions/duration_spec.rb +0 -43
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.5
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
+ autorequire:
8
9
  bindir: exe
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-02-26 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: concurrent-ruby
@@ -23,6 +24,7 @@ dependencies:
23
24
  - - "<"
24
25
  - !ruby/object:Gem::Version
25
26
  version: '2'
27
+ description:
26
28
  email: support@flippercloud.io
27
29
  executables:
28
30
  - flipper
@@ -34,7 +36,9 @@ files:
34
36
  - ".github/dependabot.yml"
35
37
  - ".github/workflows/ci.yml"
36
38
  - ".github/workflows/examples.yml"
39
+ - ".github/workflows/release.yml"
37
40
  - ".rspec"
41
+ - CLAUDE.md
38
42
  - CODE_OF_CONDUCT.md
39
43
  - Changelog.md
40
44
  - Dockerfile
@@ -62,6 +66,9 @@ files:
62
66
  - examples/cloud/cloud_setup.rb
63
67
  - examples/cloud/forked.rb
64
68
  - examples/cloud/import.rb
69
+ - examples/cloud/poll_interval/README.md
70
+ - examples/cloud/poll_interval/client.rb
71
+ - examples/cloud/poll_interval/server.rb
65
72
  - examples/cloud/threaded.rb
66
73
  - examples/configuring_default.rb
67
74
  - examples/dsl.rb
@@ -116,6 +123,7 @@ files:
116
123
  - lib/flipper/cloud/dsl.rb
117
124
  - lib/flipper/cloud/message_verifier.rb
118
125
  - lib/flipper/cloud/middleware.rb
126
+ - lib/flipper/cloud/migrate.rb
119
127
  - lib/flipper/cloud/routes.rb
120
128
  - lib/flipper/cloud/telemetry.rb
121
129
  - lib/flipper/cloud/telemetry/backoff_policy.rb
@@ -138,8 +146,8 @@ files:
138
146
  - lib/flipper/expressions/any.rb
139
147
  - lib/flipper/expressions/boolean.rb
140
148
  - lib/flipper/expressions/comparable.rb
141
- - lib/flipper/expressions/duration.rb
142
149
  - lib/flipper/expressions/equal.rb
150
+ - lib/flipper/expressions/feature_enabled.rb
143
151
  - lib/flipper/expressions/greater_than.rb
144
152
  - lib/flipper/expressions/greater_than_or_equal_to.rb
145
153
  - lib/flipper/expressions/less_than.rb
@@ -226,6 +234,7 @@ files:
226
234
  - spec/flipper/cloud/dsl_spec.rb
227
235
  - spec/flipper/cloud/message_verifier_spec.rb
228
236
  - spec/flipper/cloud/middleware_spec.rb
237
+ - spec/flipper/cloud/migrate_spec.rb
229
238
  - spec/flipper/cloud/telemetry/backoff_policy_spec.rb
230
239
  - spec/flipper/cloud/telemetry/metric_spec.rb
231
240
  - spec/flipper/cloud/telemetry/metric_storage_spec.rb
@@ -244,7 +253,6 @@ files:
244
253
  - spec/flipper/expressions/all_spec.rb
245
254
  - spec/flipper/expressions/any_spec.rb
246
255
  - spec/flipper/expressions/boolean_spec.rb
247
- - spec/flipper/expressions/duration_spec.rb
248
256
  - spec/flipper/expressions/equal_spec.rb
249
257
  - spec/flipper/expressions/greater_than_or_equal_to_spec.rb
250
258
  - spec/flipper/expressions/greater_than_spec.rb
@@ -314,8 +322,9 @@ metadata:
314
322
  homepage_uri: https://www.flippercloud.io
315
323
  source_code_uri: https://github.com/flippercloud/flipper
316
324
  bug_tracker_uri: https://github.com/flippercloud/flipper/issues
317
- changelog_uri: https://github.com/flippercloud/flipper/releases/tag/v1.3.5
325
+ changelog_uri: https://github.com/flippercloud/flipper/releases/tag/v1.4.0
318
326
  funding_uri: https://github.com/sponsors/flippercloud
327
+ post_install_message:
319
328
  rdoc_options: []
320
329
  require_paths:
321
330
  - lib
@@ -330,112 +339,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
330
339
  - !ruby/object:Gem::Version
331
340
  version: '0'
332
341
  requirements: []
333
- rubygems_version: 3.6.9
342
+ rubygems_version: 3.5.22
343
+ signing_key:
334
344
  specification_version: 4
335
345
  summary: Beautiful, performant feature flags for Ruby and Rails.
336
- test_files:
337
- - spec/fixtures/environment.rb
338
- - spec/fixtures/feature.json
339
- - spec/fixtures/flipper_pstore_1679087600.json
340
- - spec/flipper/actor_spec.rb
341
- - spec/flipper/adapter_builder_spec.rb
342
- - spec/flipper/adapter_spec.rb
343
- - spec/flipper/adapters/actor_limit_spec.rb
344
- - spec/flipper/adapters/dual_write_spec.rb
345
- - spec/flipper/adapters/failover_spec.rb
346
- - spec/flipper/adapters/failsafe_spec.rb
347
- - spec/flipper/adapters/http/client_spec.rb
348
- - spec/flipper/adapters/http_spec.rb
349
- - spec/flipper/adapters/instrumented_spec.rb
350
- - spec/flipper/adapters/memoizable_spec.rb
351
- - spec/flipper/adapters/memory_spec.rb
352
- - spec/flipper/adapters/operation_logger_spec.rb
353
- - spec/flipper/adapters/poll_spec.rb
354
- - spec/flipper/adapters/pstore_spec.rb
355
- - spec/flipper/adapters/read_only_spec.rb
356
- - spec/flipper/adapters/strict_spec.rb
357
- - spec/flipper/adapters/sync/feature_synchronizer_spec.rb
358
- - spec/flipper/adapters/sync/interval_synchronizer_spec.rb
359
- - spec/flipper/adapters/sync/synchronizer_spec.rb
360
- - spec/flipper/adapters/sync_spec.rb
361
- - spec/flipper/cli_spec.rb
362
- - spec/flipper/cloud/configuration_spec.rb
363
- - spec/flipper/cloud/dsl_spec.rb
364
- - spec/flipper/cloud/message_verifier_spec.rb
365
- - spec/flipper/cloud/middleware_spec.rb
366
- - spec/flipper/cloud/telemetry/backoff_policy_spec.rb
367
- - spec/flipper/cloud/telemetry/metric_spec.rb
368
- - spec/flipper/cloud/telemetry/metric_storage_spec.rb
369
- - spec/flipper/cloud/telemetry/submitter_spec.rb
370
- - spec/flipper/cloud/telemetry_spec.rb
371
- - spec/flipper/cloud_spec.rb
372
- - spec/flipper/configuration_spec.rb
373
- - spec/flipper/dsl_spec.rb
374
- - spec/flipper/engine_spec.rb
375
- - spec/flipper/export_spec.rb
376
- - spec/flipper/exporter_spec.rb
377
- - spec/flipper/exporters/json/export_spec.rb
378
- - spec/flipper/exporters/json/v1_spec.rb
379
- - spec/flipper/expression/builder_spec.rb
380
- - spec/flipper/expression_spec.rb
381
- - spec/flipper/expressions/all_spec.rb
382
- - spec/flipper/expressions/any_spec.rb
383
- - spec/flipper/expressions/boolean_spec.rb
384
- - spec/flipper/expressions/duration_spec.rb
385
- - spec/flipper/expressions/equal_spec.rb
386
- - spec/flipper/expressions/greater_than_or_equal_to_spec.rb
387
- - spec/flipper/expressions/greater_than_spec.rb
388
- - spec/flipper/expressions/less_than_or_equal_to_spec.rb
389
- - spec/flipper/expressions/less_than_spec.rb
390
- - spec/flipper/expressions/not_equal_spec.rb
391
- - spec/flipper/expressions/now_spec.rb
392
- - spec/flipper/expressions/number_spec.rb
393
- - spec/flipper/expressions/percentage_of_actors_spec.rb
394
- - spec/flipper/expressions/percentage_spec.rb
395
- - spec/flipper/expressions/property_spec.rb
396
- - spec/flipper/expressions/random_spec.rb
397
- - spec/flipper/expressions/string_spec.rb
398
- - spec/flipper/expressions/time_spec.rb
399
- - spec/flipper/feature_check_context_spec.rb
400
- - spec/flipper/feature_spec.rb
401
- - spec/flipper/gate_spec.rb
402
- - spec/flipper/gate_values_spec.rb
403
- - spec/flipper/gates/actor_spec.rb
404
- - spec/flipper/gates/boolean_spec.rb
405
- - spec/flipper/gates/expression_spec.rb
406
- - spec/flipper/gates/group_spec.rb
407
- - spec/flipper/gates/percentage_of_actors_spec.rb
408
- - spec/flipper/gates/percentage_of_time_spec.rb
409
- - spec/flipper/identifier_spec.rb
410
- - spec/flipper/instrumentation/log_subscriber_spec.rb
411
- - spec/flipper/instrumentation/statsd_subscriber_spec.rb
412
- - spec/flipper/instrumenters/memory_spec.rb
413
- - spec/flipper/instrumenters/noop_spec.rb
414
- - spec/flipper/middleware/memoizer_spec.rb
415
- - spec/flipper/middleware/setup_env_spec.rb
416
- - spec/flipper/model/active_record_spec.rb
417
- - spec/flipper/poller_spec.rb
418
- - spec/flipper/registry_spec.rb
419
- - spec/flipper/serializers/gzip_spec.rb
420
- - spec/flipper/serializers/json_spec.rb
421
- - spec/flipper/typecast_spec.rb
422
- - spec/flipper/types/actor_spec.rb
423
- - spec/flipper/types/boolean_spec.rb
424
- - spec/flipper/types/group_spec.rb
425
- - spec/flipper/types/percentage_of_actors_spec.rb
426
- - spec/flipper/types/percentage_of_time_spec.rb
427
- - spec/flipper/types/percentage_spec.rb
428
- - spec/flipper_integration_spec.rb
429
- - spec/flipper_spec.rb
430
- - spec/spec_helper.rb
431
- - spec/support/actor_names.yml
432
- - spec/support/descriptions.yml
433
- - spec/support/fail_on_output.rb
434
- - spec/support/fake_backoff_policy.rb
435
- - spec/support/fake_udp_socket.rb
436
- - spec/support/skippable.rb
437
- - spec/support/spec_helpers.rb
438
- - test/adapters/actor_limit_test.rb
439
- - test/adapters/memory_test.rb
440
- - test/adapters/pstore_test.rb
441
- - test/test_helper.rb
346
+ test_files: []
@@ -1,28 +0,0 @@
1
- module Flipper
2
- module Expressions
3
- class Duration
4
- SECONDS_PER = {
5
- "second" => 1,
6
- "minute" => 60,
7
- "hour" => 3600,
8
- "day" => 86400,
9
- "week" => 604_800,
10
- "month" => 2_629_746, # 1/12 of a gregorian year
11
- "year" => 31_556_952 # length of a gregorian year (365.2425 days)
12
- }.freeze
13
-
14
- def self.call(scalar, unit = 'second')
15
- unit = unit.to_s.downcase.chomp("s")
16
-
17
- unless scalar.is_a?(Numeric)
18
- raise ArgumentError.new("Duration value must be a number but was #{scalar.inspect}")
19
- end
20
- unless SECONDS_PER[unit]
21
- raise ArgumentError.new("Duration unit #{unit.inspect} must be one of: #{SECONDS_PER.keys.join(', ')}")
22
- end
23
-
24
- scalar * SECONDS_PER[unit]
25
- end
26
- end
27
- end
28
- end
@@ -1,43 +0,0 @@
1
- RSpec.describe Flipper::Expressions::Duration do
2
- describe "#call" do
3
- it "raises error with invalid value" do
4
- expect { described_class.call(false, 'minute') }.to raise_error(ArgumentError)
5
- end
6
-
7
- it "raises error with invalid unit" do
8
- expect { described_class.call(4, 'score') }.to raise_error(ArgumentError)
9
- end
10
-
11
- it 'defaults unit to seconds' do
12
- expect(described_class.call(10)).to eq(10)
13
- end
14
-
15
- it "evaluates seconds" do
16
- expect(described_class.call(10, 'seconds')).to eq(10)
17
- end
18
-
19
- it "evaluates minutes" do
20
- expect(described_class.call(2, 'minutes')).to eq(120)
21
- end
22
-
23
- it "evaluates hours" do
24
- expect(described_class.call(2, 'hours')).to eq(7200)
25
- end
26
-
27
- it "evaluates days" do
28
- expect(described_class.call(2, 'days')).to eq(172_800)
29
- end
30
-
31
- it "evaluates weeks" do
32
- expect(described_class.call(2, 'weeks')).to eq(1_209_600)
33
- end
34
-
35
- it "evaluates months" do
36
- expect(described_class.call(2, 'months')).to eq(5_259_492)
37
- end
38
-
39
- it "evaluates years" do
40
- expect(described_class.call(2, 'years')).to eq(63_113_904)
41
- end
42
- end
43
- end