flipper 0.26.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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/ci.yml +61 -16
  4. data/.github/workflows/examples.yml +55 -18
  5. data/CLAUDE.md +74 -0
  6. data/Changelog.md +1 -486
  7. data/Gemfile +23 -11
  8. data/README.md +31 -27
  9. data/Rakefile +2 -2
  10. data/benchmark/enabled_ips.rb +10 -0
  11. data/benchmark/enabled_multiple_actors_ips.rb +20 -0
  12. data/benchmark/enabled_profile.rb +20 -0
  13. data/benchmark/instrumentation_ips.rb +21 -0
  14. data/benchmark/typecast_ips.rb +27 -0
  15. data/docs/images/banner.jpg +0 -0
  16. data/docs/images/flipper_cloud.png +0 -0
  17. data/examples/api/basic.ru +3 -4
  18. data/examples/api/custom_memoized.ru +3 -4
  19. data/examples/api/memoized.ru +3 -4
  20. data/examples/cloud/app.ru +12 -0
  21. data/examples/cloud/backoff_policy.rb +13 -0
  22. data/examples/cloud/basic.rb +22 -0
  23. data/examples/cloud/cloud_setup.rb +20 -0
  24. data/examples/cloud/forked.rb +36 -0
  25. data/examples/cloud/import.rb +17 -0
  26. data/examples/cloud/threaded.rb +33 -0
  27. data/examples/dsl.rb +1 -15
  28. data/examples/enabled_for_actor.rb +4 -2
  29. data/examples/expressions.rb +213 -0
  30. data/examples/mirroring.rb +59 -0
  31. data/examples/strict.rb +18 -0
  32. data/exe/flipper +5 -0
  33. data/flipper-cloud.gemspec +19 -0
  34. data/flipper.gemspec +8 -6
  35. data/lib/flipper/actor.rb +6 -3
  36. data/lib/flipper/adapter.rb +33 -7
  37. data/lib/flipper/adapter_builder.rb +44 -0
  38. data/lib/flipper/adapters/actor_limit.rb +28 -0
  39. data/lib/flipper/adapters/cache_base.rb +143 -0
  40. data/lib/flipper/adapters/dual_write.rb +1 -3
  41. data/lib/flipper/adapters/failover.rb +0 -4
  42. data/lib/flipper/adapters/failsafe.rb +0 -4
  43. data/lib/flipper/adapters/http/client.rb +40 -12
  44. data/lib/flipper/adapters/http/error.rb +2 -2
  45. data/lib/flipper/adapters/http.rb +30 -17
  46. data/lib/flipper/adapters/instrumented.rb +25 -6
  47. data/lib/flipper/adapters/memoizable.rb +33 -21
  48. data/lib/flipper/adapters/memory.rb +81 -46
  49. data/lib/flipper/adapters/operation_logger.rb +17 -78
  50. data/lib/flipper/adapters/poll/poller.rb +2 -125
  51. data/lib/flipper/adapters/poll.rb +20 -3
  52. data/lib/flipper/adapters/pstore.rb +17 -11
  53. data/lib/flipper/adapters/read_only.rb +8 -41
  54. data/lib/flipper/adapters/strict.rb +45 -0
  55. data/lib/flipper/adapters/sync/feature_synchronizer.rb +10 -1
  56. data/lib/flipper/adapters/sync.rb +0 -4
  57. data/lib/flipper/adapters/wrapper.rb +54 -0
  58. data/lib/flipper/cli.rb +263 -0
  59. data/lib/flipper/cloud/configuration.rb +266 -0
  60. data/lib/flipper/cloud/dsl.rb +27 -0
  61. data/lib/flipper/cloud/message_verifier.rb +95 -0
  62. data/lib/flipper/cloud/middleware.rb +63 -0
  63. data/lib/flipper/cloud/routes.rb +14 -0
  64. data/lib/flipper/cloud/telemetry/backoff_policy.rb +96 -0
  65. data/lib/flipper/cloud/telemetry/instrumenter.rb +22 -0
  66. data/lib/flipper/cloud/telemetry/metric.rb +39 -0
  67. data/lib/flipper/cloud/telemetry/metric_storage.rb +30 -0
  68. data/lib/flipper/cloud/telemetry/submitter.rb +100 -0
  69. data/lib/flipper/cloud/telemetry.rb +191 -0
  70. data/lib/flipper/cloud.rb +53 -0
  71. data/lib/flipper/configuration.rb +25 -4
  72. data/lib/flipper/dsl.rb +46 -45
  73. data/lib/flipper/engine.rb +102 -0
  74. data/lib/flipper/errors.rb +3 -3
  75. data/lib/flipper/export.rb +24 -0
  76. data/lib/flipper/exporter.rb +17 -0
  77. data/lib/flipper/exporters/json/export.rb +32 -0
  78. data/lib/flipper/exporters/json/v1.rb +33 -0
  79. data/lib/flipper/expression/builder.rb +73 -0
  80. data/lib/flipper/expression/constant.rb +25 -0
  81. data/lib/flipper/expression.rb +71 -0
  82. data/lib/flipper/expressions/all.rb +9 -0
  83. data/lib/flipper/expressions/any.rb +9 -0
  84. data/lib/flipper/expressions/boolean.rb +9 -0
  85. data/lib/flipper/expressions/comparable.rb +13 -0
  86. data/lib/flipper/expressions/duration.rb +28 -0
  87. data/lib/flipper/expressions/equal.rb +9 -0
  88. data/lib/flipper/expressions/greater_than.rb +9 -0
  89. data/lib/flipper/expressions/greater_than_or_equal_to.rb +9 -0
  90. data/lib/flipper/expressions/less_than.rb +9 -0
  91. data/lib/flipper/expressions/less_than_or_equal_to.rb +9 -0
  92. data/lib/flipper/expressions/not_equal.rb +9 -0
  93. data/lib/flipper/expressions/now.rb +9 -0
  94. data/lib/flipper/expressions/number.rb +9 -0
  95. data/lib/flipper/expressions/percentage.rb +9 -0
  96. data/lib/flipper/expressions/percentage_of_actors.rb +12 -0
  97. data/lib/flipper/expressions/property.rb +9 -0
  98. data/lib/flipper/expressions/random.rb +9 -0
  99. data/lib/flipper/expressions/string.rb +9 -0
  100. data/lib/flipper/expressions/time.rb +9 -0
  101. data/lib/flipper/feature.rb +94 -26
  102. data/lib/flipper/feature_check_context.rb +10 -6
  103. data/lib/flipper/gate.rb +13 -11
  104. data/lib/flipper/gate_values.rb +5 -18
  105. data/lib/flipper/gates/actor.rb +10 -17
  106. data/lib/flipper/gates/boolean.rb +1 -1
  107. data/lib/flipper/gates/expression.rb +75 -0
  108. data/lib/flipper/gates/group.rb +5 -7
  109. data/lib/flipper/gates/percentage_of_actors.rb +10 -13
  110. data/lib/flipper/gates/percentage_of_time.rb +1 -2
  111. data/lib/flipper/identifier.rb +2 -2
  112. data/lib/flipper/instrumentation/log_subscriber.rb +35 -8
  113. data/lib/flipper/instrumentation/statsd.rb +4 -2
  114. data/lib/flipper/instrumentation/statsd_subscriber.rb +2 -4
  115. data/lib/flipper/instrumentation/subscriber.rb +8 -5
  116. data/lib/flipper/metadata.rb +8 -1
  117. data/lib/flipper/middleware/memoizer.rb +30 -14
  118. data/lib/flipper/model/active_record.rb +23 -0
  119. data/lib/flipper/poller.rb +118 -0
  120. data/lib/flipper/serializers/gzip.rb +22 -0
  121. data/lib/flipper/serializers/json.rb +17 -0
  122. data/lib/flipper/spec/shared_adapter_specs.rb +105 -63
  123. data/lib/flipper/test/shared_adapter_test.rb +101 -58
  124. data/lib/flipper/test_help.rb +43 -0
  125. data/lib/flipper/typecast.rb +59 -18
  126. data/lib/flipper/types/actor.rb +13 -13
  127. data/lib/flipper/types/group.rb +4 -4
  128. data/lib/flipper/types/percentage.rb +1 -1
  129. data/lib/flipper/version.rb +11 -1
  130. data/lib/flipper.rb +50 -11
  131. data/lib/generators/flipper/setup_generator.rb +68 -0
  132. data/lib/generators/flipper/templates/initializer.rb +45 -0
  133. data/lib/generators/flipper/templates/update/migrations/01_create_flipper_tables.rb.erb +22 -0
  134. data/lib/generators/flipper/templates/update/migrations/02_change_flipper_gates_value_to_text.rb.erb +18 -0
  135. data/lib/generators/flipper/update_generator.rb +35 -0
  136. data/package-lock.json +41 -0
  137. data/package.json +10 -0
  138. data/spec/fixtures/environment.rb +1 -0
  139. data/spec/fixtures/flipper_pstore_1679087600.json +46 -0
  140. data/spec/flipper/adapter_builder_spec.rb +72 -0
  141. data/spec/flipper/adapter_spec.rb +30 -2
  142. data/spec/flipper/adapters/actor_limit_spec.rb +20 -0
  143. data/spec/flipper/adapters/dual_write_spec.rb +2 -2
  144. data/spec/flipper/adapters/http/client_spec.rb +61 -0
  145. data/spec/flipper/adapters/http_spec.rb +138 -55
  146. data/spec/flipper/adapters/instrumented_spec.rb +29 -11
  147. data/spec/flipper/adapters/memoizable_spec.rb +51 -31
  148. data/spec/flipper/adapters/memory_spec.rb +14 -3
  149. data/spec/flipper/adapters/operation_logger_spec.rb +31 -12
  150. data/spec/flipper/adapters/poll_spec.rb +41 -0
  151. data/spec/flipper/adapters/read_only_spec.rb +32 -17
  152. data/spec/flipper/adapters/strict_spec.rb +64 -0
  153. data/spec/flipper/adapters/sync/feature_synchronizer_spec.rb +27 -0
  154. data/spec/flipper/cli_spec.rb +166 -0
  155. data/spec/flipper/cloud/configuration_spec.rb +251 -0
  156. data/spec/flipper/cloud/dsl_spec.rb +82 -0
  157. data/spec/flipper/cloud/message_verifier_spec.rb +104 -0
  158. data/spec/flipper/cloud/middleware_spec.rb +289 -0
  159. data/spec/flipper/cloud/telemetry/backoff_policy_spec.rb +107 -0
  160. data/spec/flipper/cloud/telemetry/metric_spec.rb +87 -0
  161. data/spec/flipper/cloud/telemetry/metric_storage_spec.rb +58 -0
  162. data/spec/flipper/cloud/telemetry/submitter_spec.rb +145 -0
  163. data/spec/flipper/cloud/telemetry_spec.rb +208 -0
  164. data/spec/flipper/cloud_spec.rb +186 -0
  165. data/spec/flipper/configuration_spec.rb +17 -0
  166. data/spec/flipper/dsl_spec.rb +54 -76
  167. data/spec/flipper/engine_spec.rb +374 -0
  168. data/spec/flipper/export_spec.rb +13 -0
  169. data/spec/flipper/exporter_spec.rb +16 -0
  170. data/spec/flipper/exporters/json/export_spec.rb +60 -0
  171. data/spec/flipper/exporters/json/v1_spec.rb +33 -0
  172. data/spec/flipper/expression/builder_spec.rb +248 -0
  173. data/spec/flipper/expression_spec.rb +188 -0
  174. data/spec/flipper/expressions/all_spec.rb +15 -0
  175. data/spec/flipper/expressions/any_spec.rb +15 -0
  176. data/spec/flipper/expressions/boolean_spec.rb +15 -0
  177. data/spec/flipper/expressions/duration_spec.rb +43 -0
  178. data/spec/flipper/expressions/equal_spec.rb +24 -0
  179. data/spec/flipper/expressions/greater_than_or_equal_to_spec.rb +28 -0
  180. data/spec/flipper/expressions/greater_than_spec.rb +28 -0
  181. data/spec/flipper/expressions/less_than_or_equal_to_spec.rb +28 -0
  182. data/spec/flipper/expressions/less_than_spec.rb +32 -0
  183. data/spec/flipper/expressions/not_equal_spec.rb +15 -0
  184. data/spec/flipper/expressions/now_spec.rb +11 -0
  185. data/spec/flipper/expressions/number_spec.rb +21 -0
  186. data/spec/flipper/expressions/percentage_of_actors_spec.rb +20 -0
  187. data/spec/flipper/expressions/percentage_spec.rb +15 -0
  188. data/spec/flipper/expressions/property_spec.rb +13 -0
  189. data/spec/flipper/expressions/random_spec.rb +9 -0
  190. data/spec/flipper/expressions/string_spec.rb +11 -0
  191. data/spec/flipper/expressions/time_spec.rb +13 -0
  192. data/spec/flipper/feature_check_context_spec.rb +17 -17
  193. data/spec/flipper/feature_spec.rb +453 -39
  194. data/spec/flipper/gate_values_spec.rb +2 -33
  195. data/spec/flipper/gates/boolean_spec.rb +1 -1
  196. data/spec/flipper/gates/expression_spec.rb +108 -0
  197. data/spec/flipper/gates/group_spec.rb +2 -3
  198. data/spec/flipper/gates/percentage_of_actors_spec.rb +61 -5
  199. data/spec/flipper/gates/percentage_of_time_spec.rb +2 -2
  200. data/spec/flipper/identifier_spec.rb +4 -5
  201. data/spec/flipper/instrumentation/log_subscriber_spec.rb +24 -6
  202. data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +26 -2
  203. data/spec/flipper/middleware/memoizer_spec.rb +79 -10
  204. data/spec/flipper/model/active_record_spec.rb +72 -0
  205. data/spec/flipper/poller_spec.rb +47 -0
  206. data/spec/flipper/serializers/gzip_spec.rb +13 -0
  207. data/spec/flipper/serializers/json_spec.rb +13 -0
  208. data/spec/flipper/typecast_spec.rb +121 -6
  209. data/spec/flipper/types/actor_spec.rb +63 -46
  210. data/spec/flipper/types/group_spec.rb +2 -2
  211. data/spec/flipper_integration_spec.rb +168 -58
  212. data/spec/flipper_spec.rb +94 -30
  213. data/spec/spec_helper.rb +18 -18
  214. data/spec/support/actor_names.yml +1 -0
  215. data/spec/support/fail_on_output.rb +8 -0
  216. data/spec/support/fake_backoff_policy.rb +15 -0
  217. data/spec/support/skippable.rb +18 -0
  218. data/spec/support/spec_helpers.rb +34 -8
  219. data/test/adapters/actor_limit_test.rb +20 -0
  220. data/test_rails/generators/flipper/setup_generator_test.rb +69 -0
  221. data/test_rails/generators/flipper/update_generator_test.rb +96 -0
  222. data/test_rails/helper.rb +22 -2
  223. data/test_rails/system/test_help_test.rb +52 -0
  224. metadata +203 -20
  225. data/.github/workflows/release.yml +0 -44
  226. data/.tool-versions +0 -1
  227. data/lib/flipper/railtie.rb +0 -47
  228. data/spec/flipper/railtie_spec.rb +0 -109
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e5edb0409042f8d4d5905b8d526fd1d240a75dbee2d947b8ae4adae0c534af5f
4
- data.tar.gz: 6bc01d5f7c0ee5f3d64d30faaa599b155d6220e249006d2ead7168bc47938202
3
+ metadata.gz: 8f53e9dadf45ea1d00e7abd24358748347d516d761ea347c438057f62fdbc185
4
+ data.tar.gz: 8c2a73d793d41ce64ed26c559bf532127f73e17e20944930aa6bf14aff355a57
5
5
  SHA512:
6
- metadata.gz: 60fee2e4a0d97a26b7403736b4422c0e69a0e9e452469e3f29e7af684001c38f2c957acdfa3f8f0554315d021a7e7091bb40898247e45d4658b14b31bc1de22f
7
- data.tar.gz: bf45e695be511513be967bffd75c4e48d3af0f05b05264ee3b13a9df8bba8af929ccbf6b7a1f05c6c3a7d5476ceb757e3dda852f8e42b745bf7171f42538fb14
6
+ metadata.gz: af26df5e8c10540348e2b8dd31f11198dafdc8f3bcb6ef8e5361e3a764caa5a872734c64807746f1d077cfbc95df9143959e4c3446429dce1d5d871e46861fa7
7
+ data.tar.gz: 2005a736ea665c359154bf85f56495fcf9b326e9ecb740d2e1aca0c52a698367b44334a90ae2b1277c2a3c0dcdddcc478eab3126975f210fc796a454202913f4
@@ -0,0 +1 @@
1
+ github: flippercloud
@@ -7,56 +7,101 @@ jobs:
7
7
  services:
8
8
  redis:
9
9
  image: redis
10
- ports: ['6379:6379']
10
+ ports: ["6379:6379"]
11
11
  options: >-
12
12
  --health-cmd "redis-cli ping"
13
13
  --health-interval 10s
14
14
  --health-timeout 5s
15
15
  --health-retries 5
16
+ postgres:
17
+ image: postgres:13
18
+ ports:
19
+ - 5432:5432
20
+ env:
21
+ POSTGRES_USER: postgres
22
+ POSTGRES_PASSWORD: postgres
23
+ options: >-
24
+ --health-cmd pg_isready
25
+ --health-interval 10s
26
+ --health-timeout 5s
27
+ --health-retries 5
16
28
  strategy:
29
+ fail-fast: false
17
30
  matrix:
18
- ruby: ['2.6', '2.7', '3.0', '3.1']
19
- rails: ['5.2', '6.0.0', '6.1.0', '7.0.0']
31
+ ruby: ["2.6", "2.7", "3.0", "3.1", "3.2", "3.3"]
32
+ rails: ["5.2", "6.0.0", "6.1.0", "7.0.0", "7.1.0", "7.2.0", "8.0.0"]
20
33
  exclude:
34
+ - ruby: "2.6"
35
+ rails: "7.1.0"
21
36
  - ruby: "2.6"
22
37
  rails: "7.0.0"
38
+ - ruby: "2.6"
39
+ rails: "7.2.0"
40
+ - ruby: "2.6"
41
+ rails: "8.0.0"
42
+ - ruby: "2.7"
43
+ rails: "7.1.0"
44
+ - ruby: "2.7"
45
+ rails: "7.2.0"
46
+ - ruby: "2.7"
47
+ rails: "8.0.0"
23
48
  - ruby: "3.0"
24
49
  rails: "5.2"
50
+ - ruby: "3.0"
51
+ rails: "7.2.0"
52
+ - ruby: "3.0"
53
+ rails: "8.0.0"
25
54
  - ruby: "3.1"
26
55
  rails: "5.2"
27
56
  - ruby: "3.1"
28
57
  rails: "6.0.0"
58
+ - ruby: "3.1"
59
+ rails: "8.0.0"
60
+ - ruby: "3.2"
61
+ rails: "5.2"
62
+ - ruby: "3.2"
63
+ rails: "6.0.0"
64
+ - ruby: "3.2"
65
+ rails: "6.1.0"
66
+ - ruby: "3.3"
67
+ rails: "5.2"
68
+ - ruby: "3.3"
69
+ rails: "6.0.0"
70
+ - ruby: "3.3"
71
+ rails: "6.1.0"
29
72
  env:
30
- SQLITE3_VERSION: 1.4.1
73
+ SQLITE3_VERSION: ${{ matrix.rails == '8.0.0' && '2.1.0' || '1.4.1' }}
31
74
  REDIS_URL: redis://localhost:6379/0
32
75
  CI: true
76
+ RAILS_VERSION: ${{ matrix.rails }}
77
+ MYSQL_USER: root
78
+ MYSQL_PASSWORD: root
79
+ POSTGRES_USER: postgres
80
+ POSTGRES_PASSWORD: postgres
33
81
  steps:
82
+ - name: Set up MySQL
83
+ run: sudo /etc/init.d/mysql start
34
84
  - name: Setup memcached
35
85
  uses: KeisukeYamashita/memcached-actions@v1
36
86
  - name: Start MongoDB
37
- uses: supercharge/mongodb-github-action@1.8.0
87
+ uses: supercharge/mongodb-github-action@1.12.0
38
88
  with:
39
89
  mongodb-version: 4.0
40
90
  - name: Check out repository code
41
- uses: actions/checkout@v3
91
+ uses: actions/checkout@v4
42
92
  - name: Do some action caching
43
- uses: actions/cache@v3
93
+ uses: actions/cache@v4
44
94
  with:
45
95
  path: vendor/bundle
46
96
  key: ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-${{ hashFiles('**/Gemfile.lock') }}
47
97
  restore-keys: |
48
98
  ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-
99
+ - name: Install libpq-dev
100
+ run: sudo apt-get -yqq install libpq-dev
49
101
  - name: Set up Ruby ${{ matrix.ruby }}
50
102
  uses: ruby/setup-ruby@v1
51
103
  with:
52
104
  ruby-version: ${{ matrix.ruby }}
53
- - name: Install libpq-dev
54
- run: sudo apt-get -yqq install libpq-dev
55
- - name: Install bundler
56
- run: gem install bundler
105
+ bundler-cache: true # 'bundle install' and cache gems
57
106
  - name: Run Rake with Rails ${{ matrix.rails }}
58
- env:
59
- RAILS_VERSION: ${{ matrix.rails }}
60
- run: |
61
- bundle install --jobs 4 --retry 3
62
- bundle exec rake
107
+ run: bundle exec rake
@@ -2,13 +2,13 @@ name: Examples
2
2
  on: [push, pull_request]
3
3
  jobs:
4
4
  test:
5
- if: github.repository_owner == 'jnunemaker'
6
- name: Test on ruby ${{ matrix.ruby }} and rails ${{ matrix.rails }}
5
+ if: github.repository_owner == 'flippercloud'
6
+ name: Example on ruby ${{ matrix.ruby }} and rails ${{ matrix.rails }}
7
7
  runs-on: ubuntu-latest
8
8
  services:
9
9
  redis:
10
10
  image: redis
11
- ports: ['6379:6379']
11
+ ports: ["6379:6379"]
12
12
  options: >-
13
13
  --health-cmd "redis-cli ping"
14
14
  --health-interval 10s
@@ -16,52 +16,89 @@ jobs:
16
16
  --health-retries 5
17
17
  strategy:
18
18
  matrix:
19
- ruby: ['2.6', '2.7', '3.0', '3.1']
20
- rails: ['5.2', '6.0.0', '6.1.0', '7.0.0']
19
+ ruby: ["2.6", "2.7", "3.0", "3.1", "3.2", "3.3"]
20
+ rails: ["5.2", "6.0.0", "6.1.0", "7.0.0", "7.1.0", "7.2.0", "8.0.0"]
21
21
  exclude:
22
+ - ruby: "2.6"
23
+ rails: "7.1.0"
22
24
  - ruby: "2.6"
23
25
  rails: "7.0.0"
26
+ - ruby: "2.6"
27
+ rails: "7.2.0"
28
+ - ruby: "2.6"
29
+ rails: "8.0.0"
30
+ - ruby: "2.7"
31
+ rails: "7.1.0"
32
+ - ruby: "2.7"
33
+ rails: "7.2.0"
34
+ - ruby: "2.7"
35
+ rails: "8.0.0"
24
36
  - ruby: "3.0"
25
37
  rails: "5.2"
38
+ - ruby: "3.0"
39
+ rails: "7.2.0"
40
+ - ruby: "3.0"
41
+ rails: "8.0.0"
26
42
  - ruby: "3.1"
27
43
  rails: "5.2"
28
44
  - ruby: "3.1"
29
45
  rails: "6.0.0"
30
-
46
+ - ruby: "3.1"
47
+ rails: "8.0.0"
48
+ - ruby: "3.2"
49
+ rails: "5.2"
50
+ - ruby: "3.2"
51
+ rails: "6.0.0"
52
+ - ruby: "3.2"
53
+ rails: "6.1.0"
54
+ - ruby: "3.3"
55
+ rails: "5.2"
56
+ - ruby: "3.3"
57
+ rails: "6.0.0"
58
+ - ruby: "3.3"
59
+ rails: "6.1.0"
31
60
  env:
32
- SQLITE3_VERSION: 1.4.1
61
+ SQLITE3_VERSION: ${{ matrix.rails == '8.0.0' && '2.1.0' || '1.4.1' }}
33
62
  REDIS_URL: redis://localhost:6379/0
34
63
  CI: true
64
+ RAILS_VERSION: ${{ matrix.rails }}
35
65
  steps:
36
66
  - name: Setup memcached
37
67
  uses: KeisukeYamashita/memcached-actions@v1
38
68
  - name: Start MongoDB
39
- uses: supercharge/mongodb-github-action@1.8.0
69
+ uses: supercharge/mongodb-github-action@1.12.0
40
70
  with:
41
71
  mongodb-version: 4.0
42
72
  - name: Check out repository code
43
- uses: actions/checkout@v3
73
+ uses: actions/checkout@v4
44
74
  - name: Do some action caching
45
- uses: actions/cache@v3
75
+ uses: actions/cache@v4
46
76
  with:
47
77
  path: vendor/bundle
48
78
  key: ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-${{ hashFiles('**/Gemfile.lock') }}
49
79
  restore-keys: |
50
80
  ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-
81
+ - name: Install libpq-dev
82
+ run: sudo apt-get -yqq install libpq-dev
51
83
  - name: Set up Ruby ${{ matrix.ruby }}
52
84
  uses: ruby/setup-ruby@v1
53
85
  with:
54
86
  ruby-version: ${{ matrix.ruby }}
55
- - name: Install libpq-dev
56
- run: sudo apt-get -yqq install libpq-dev
57
- - name: Install bundler
58
- run: gem install bundler
59
- - name: Bundle install with Rails ${{ matrix.rails }}
60
- env:
61
- RAILS_VERSION: ${{ matrix.rails }}
62
- run: bundle install --jobs 4 --retry 3
87
+ bundler-cache: true # 'bundle install' and cache gems
63
88
  - name: Run Examples with Rails ${{ matrix.rails }}
64
89
  env:
65
90
  FLIPPER_CLOUD_TOKEN: ${{ secrets.FLIPPER_CLOUD_TOKEN }}
91
+ FLIPPER_CLOUD_TOKEN_26_52: ${{ secrets.FLIPPER_CLOUD_TOKEN_26_52 }}
92
+ FLIPPER_CLOUD_TOKEN_26_60: ${{ secrets.FLIPPER_CLOUD_TOKEN_26_60 }}
93
+ FLIPPER_CLOUD_TOKEN_26_61: ${{ secrets.FLIPPER_CLOUD_TOKEN_26_61 }}
94
+ FLIPPER_CLOUD_TOKEN_27_52: ${{ secrets.FLIPPER_CLOUD_TOKEN_27_52 }}
95
+ FLIPPER_CLOUD_TOKEN_27_60: ${{ secrets.FLIPPER_CLOUD_TOKEN_27_60 }}
96
+ FLIPPER_CLOUD_TOKEN_27_61: ${{ secrets.FLIPPER_CLOUD_TOKEN_27_61 }}
97
+ FLIPPER_CLOUD_TOKEN_27_70: ${{ secrets.FLIPPER_CLOUD_TOKEN_27_70 }}
98
+ FLIPPER_CLOUD_TOKEN_30_60: ${{ secrets.FLIPPER_CLOUD_TOKEN_30_60 }}
99
+ FLIPPER_CLOUD_TOKEN_30_61: ${{ secrets.FLIPPER_CLOUD_TOKEN_30_61 }}
100
+ FLIPPER_CLOUD_TOKEN_30_70: ${{ secrets.FLIPPER_CLOUD_TOKEN_30_70 }}
101
+ FLIPPER_CLOUD_TOKEN_31_61: ${{ secrets.FLIPPER_CLOUD_TOKEN_31_61 }}
102
+ FLIPPER_CLOUD_TOKEN_31_70: ${{ secrets.FLIPPER_CLOUD_TOKEN_31_70 }}
66
103
  RAILS_VERSION: ${{ matrix.rails }}
67
104
  run: script/examples
data/CLAUDE.md ADDED
@@ -0,0 +1,74 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Development Commands
6
+
7
+ ### Testing
8
+ - `bundle exec rake` - Run all tests (RSpec, Minitest, and Rails tests)
9
+ - `bundle exec rspec` - Run RSpec tests only
10
+ - `bundle exec rake spec:ui` - Run UI-specific specs
11
+ - `bundle exec rake test` - Run Minitest tests only
12
+ - `bundle exec rake test_rails` - Run Rails generator tests
13
+ - `script/test` - Bootstrap and run tests across multiple Rails versions (5.0-8.0)
14
+
15
+ ### Development Setup
16
+ - `script/bootstrap` - Bundle install dependencies and setup binstubs
17
+ - `script/console` - Start interactive console with Flipper loaded (uses Pry)
18
+ - `script/server` - Start local UI server on port 9999 for testing web interface
19
+
20
+ ### Building and Releasing
21
+ - `bundle exec rake build` - Build all gems into pkg/ directory
22
+ - `bundle exec rake release` - Tag version, push to remote, and push gems (requires OTP)
23
+
24
+ ## Architecture Overview
25
+
26
+ Flipper is a feature flag library for Ruby with a modular adapter-based architecture:
27
+
28
+ ### Core Components
29
+
30
+ **DSL Layer** (`lib/flipper/dsl.rb`):
31
+ - Main interface for feature flag operations
32
+ - Delegates to Feature instances
33
+ - Handles memoization and instrumentation
34
+ - Thread-safe instance management
35
+
36
+ **Feature** (`lib/flipper/feature.rb`):
37
+ - Represents individual feature flags
38
+ - Manages enable/disable operations through gates
39
+ - Handles instrumentation events
40
+ - Works with adapters for persistence
41
+
42
+ **Adapters** (`lib/flipper/adapters/`):
43
+ - Pluggable storage backends (Redis, ActiveRecord, Memory, etc.)
44
+ - Common interface for all storage implementations
45
+ - Support for caching, failover, and synchronization patterns
46
+
47
+ **Gates** (`lib/flipper/gates/`):
48
+ - Different targeting mechanisms:
49
+ - Boolean (on/off for everyone)
50
+ - Actor (specific users/entities)
51
+ - Group (predefined user groups)
52
+ - Percentage of Actors (rollout to X% of users)
53
+ - Percentage of Time (probabilistic enabling)
54
+ - Expression (complex conditional logic)
55
+
56
+ ### Multi-Gem Structure
57
+
58
+ The project is structured as multiple gems:
59
+ - `flipper` - Core library
60
+ - `flipper-ui` - Web interface
61
+ - `flipper-api` - REST API
62
+ - `flipper-cloud` - Cloud service integration
63
+ - `flipper-*` - Various adapter gems (redis, active_record, mongo, etc.)
64
+
65
+ ### Key Patterns
66
+
67
+ **Configuration**: Global configuration through `Flipper.configure` with per-thread instances
68
+ **Instrumentation**: Built-in event system for monitoring and debugging
69
+ **Memoization**: Automatic caching of feature checks within request/thread scope
70
+ **Type Safety**: Strong typing system for actors, percentages, and other values
71
+
72
+ ### Testing
73
+
74
+ Uses both RSpec (currently preferred for new tests) and Minitest. Shared adapter specs ensure consistency across all storage backends. Extensive testing across multiple Rails versions (5.0-8.0).