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
data/Changelog.md CHANGED
@@ -1,488 +1,3 @@
1
1
  # Changelog
2
2
 
3
- All notable changes to this project will be documented in this file.
4
-
5
- ## 0.26.0
6
-
7
- * Cloud Background Polling (https://github.com/jnunemaker/flipper/pull/682)
8
- * Changed default branch from master to main
9
- * Allow configuring railtie via ENV vars (https://github.com/jnunemaker/flipper/pull/681)
10
- * flipper-ui: Fix issue preventing feature flags being enabled when confirm_fully_enable is on and feature_removal_enabled is off (https://github.com/jnunemaker/flipper/pull/680)
11
-
12
- ## 0.25.4
13
-
14
- * Added read_only UI config option (https://github.com/jnunemaker/flipper/pull/679)
15
-
16
- ## 0.25.3
17
-
18
- * Added configurable confirm warning for fully enabling a feature (https://github.com/jnunemaker/flipper/pull/665)
19
- * Update rack protection to < 4 (https://github.com/jnunemaker/flipper/pull/675)
20
- * Check sadd_returns_boolean on the actual client class rather than ::Redis (https://github.com/jnunemaker/flipper/pull/677)
21
-
22
- ## 0.25.2
23
-
24
- * Fix deprecation warnings for Redis >= 4.8.0 (https://github.com/jnunemaker/flipper/pull/660)
25
-
26
- ## 0.25.1
27
-
28
- ### Additions/Changes
29
-
30
- * ActiveRecord: use provided `gate_class` option when calling `#get_all` (https://github.com/jnunemaker/flipper/pull/647)
31
- * Relaxed the rack-protection version to support latest (https://github.com/jnunemaker/flipper/commit/f4a41c541ccf14c535a61c6bc6fe7eeabbfc7e71).
32
- * Configure ActiveRecord adapter immediately upon require of flipper-active_record (https://github.com/jnunemaker/flipper/pull/652)
33
-
34
- ## 0.25.0
35
-
36
- ### Additions/Changes
37
-
38
- * Added a prompt in Flipper UI for the 'Delete' button to prevent accidental delete of features (https://github.com/jnunemaker/flipper/pull/625)
39
- * Added failsafe adapter (https://github.com/jnunemaker/flipper/pull/626)
40
- * Removed previously deprecated options and settings. Those upgrading from `<0.21` should upgrade to `~>0.24` first and fix any deprecation warnings when initializing Flipper. (https://github.com/jnunemaker/flipper/pull/627)
41
- * ActiveRecord: base class for internal models (https://github.com/jnunemaker/flipper/pull/629)
42
- * Remove use of `Rack::BodyProxy` in the memoizer middleware (https://github.com/jnunemaker/flipper/pull/631)
43
-
44
- ## 0.24.1
45
-
46
- ### Additions/Changes
47
-
48
- * flipper-api: `exclude_gates` parameter to exclude gate data in GETs (https://github.com/jnunemaker/flipper/pull/572).
49
- * Make it possible to disable internal memoization (https://github.com/jnunemaker/flipper/pull/612).
50
- * Add Flipper::Actor#hash so actors can be hash keys (https://github.com/jnunemaker/flipper/pull/616).
51
- * Pretty Up `rails routes` again and make rack-protection dependency less strict (https://github.com/jnunemaker/flipper/pull/619).
52
- * Add kwargs for method_missing using ruby 3.0 (https://github.com/jnunemaker/flipper/pull/620).
53
- * Relax the rack-protection dependency (https://github.com/jnunemaker/flipper/commit/c1cb9cd78140c2b09123687642558101e6e5d37d).
54
-
55
- ## 0.24.0
56
-
57
- ### Additions/Changes
58
-
59
- * Add Ruby 3.0 and 3.1 to the CI matrix and fix groups block arity check for ruby 3 (https://github.com/jnunemaker/flipper/pull/601)
60
- * Removed support for Ruby 2.5 (which was end of line 9 months ago)
61
- * Add (alpha) client side instrumentation of events to cloud (https://github.com/jnunemaker/flipper/pull/602)
62
- * Fix deprecated uses of Redis#pipelined (https://github.com/jnunemaker/flipper/pull/603). redis-rb >= 3 now required.
63
- * Fix Flipper UI Rack application when `Rack::Session::Pool` is used to build it (https://github.com/jnunemaker/flipper/pull/606).
64
-
65
- ## 0.23.1
66
-
67
- ### Additions/Changes
68
-
69
- * Relax dalli version constraint (https://github.com/jnunemaker/flipper/pull/596)
70
-
71
- ### Bug Fixes
72
-
73
- * Fix railtie initialization to mount middleware after config/intializers/* (https://github.com/jnunemaker/flipper/pull/586)
74
-
75
- ## 0.23.0
76
-
77
- ### Additions/Changes
78
-
79
- * Allow some HTML in banner and descriptions (https://github.com/jnunemaker/flipper/pull/570).
80
- * Moved some cloud headers to http client (https://github.com/jnunemaker/flipper/pull/567).
81
- * Update flipper-ui jquery and bootstrap versions (https://github.com/jnunemaker/flipper/issues/565 and https://github.com/jnunemaker/flipper/pull/566).
82
- * Moved docs to www.flippercloud.io/docs (https://github.com/jnunemaker/flipper/pull/574).
83
- * PStore adapter now defaults to thread safe and no longer supports `.thread_safe` (https://github.com/jnunemaker/flipper/commit/4048704fefe41b716015294a19a0b94546637630).
84
- * Add failover adapter (https://github.com/jnunemaker/flipper/pull/584).
85
- * Improve http adapter error message (https://github.com/jnunemaker/flipper/pull/587).
86
- * Rails 7 support (mostly in https://github.com/jnunemaker/flipper/pull/592).
87
-
88
- ## 0.22.2
89
-
90
- ### Additions/Changes
91
-
92
- * Allow adding multiple actors at once in flipper-ui via comma separation (configurable via `Flipper::UI.configuration.actors_separator`) (https://github.com/jnunemaker/flipper/pull/556)
93
-
94
- ### Bug Fixes
95
-
96
- * Fix railtie initialization to avoid altering middleware order (https://github.com/jnunemaker/flipper/pull/563)
97
-
98
- ## 0.22.1
99
-
100
- ### Additions/Changes
101
-
102
- * Remove Octicons and replace with a pure CSS status circle (https://github.com/jnunemaker/flipper/pull/547)
103
- * Rescue unique errors in AR and Sequel when setting value (https://github.com/jnunemaker/flipper/commit/87f5a98bce7baad7a27b75b5bce3256967769f27)
104
- * Add a Content-Security-Policy to flipper-ui (https://github.com/jnunemaker/flipper/pull/552)
105
- * Fix Synchronizer issue that occurs for ActiveRecord adapter (https://github.com/jnunemaker/flipper/pull/554)
106
-
107
- ## 0.22.0
108
-
109
- ### Additions/Changes
110
-
111
- * Enable log subscriber by default in Rails (https://github.com/jnunemaker/flipper/pull/525)
112
- * Remove memoizer from API and UI (https://github.com/jnunemaker/flipper/pull/527). If you are using the UI or API without configuring the default instance of Flipper, you'll need to enable memoization if you want it. For examples, see the examples/ui and examples/api directories.
113
- * Fix SQL reserved word use in get_all for ActiveRecord and Sequel (https://github.com/jnunemaker/flipper/pull/536).
114
- * Handle spaces in names gracefully in UI (https://github.com/jnunemaker/flipper/pull/541).
115
-
116
- ## 0.21.0
117
-
118
- ### Additions/Changes
119
-
120
- * Default to using memory adapter (https://github.com/jnunemaker/flipper/pull/501)
121
- * Adapters now configured on require when possible (https://github.com/jnunemaker/flipper/pull/502)
122
- * Added cloud recommendation to flipper-ui. Can be disabled with `Flipper::UI.configure { |config| config.cloud_recommendation = false }`. Just want to raise awareness that more is available if people want it (https://github.com/jnunemaker/flipper/pull/504)
123
- * Added default `flipper_id` implementation via `Flipper::Identifier` and automatically included it in ActiveRecord and Sequel models (https://github.com/jnunemaker/flipper/pull/505)
124
- * Deprecate superflous sync_method setting (https://github.com/jnunemaker/flipper/pull/511)
125
- * Flipper is now pre-configured when used with Rails. By default, it will [memoize and preload all features for each request](https://flippercloud.io/docs/optimization#memoization). (https://github.com/jnunemaker/flipper/pull/506)
126
-
127
- ### Upgrading
128
-
129
- You should be able to upgrade to 0.21 without any breaking changes. However, if you want to simplify your setup, you can remove some configuration that is now handled automatically:
130
-
131
- 1. Adapters are configured when on require, so unless you are using caching or other customizations, you can remove adapter configuration.
132
-
133
- ```diff
134
- # config/initializers/flipper.rb
135
- - Flipper.configure do |config|
136
- - config.default { Flipper.new(Flipper::Adapters::ActiveRecord.new) }
137
- - end
138
- ```
139
-
140
- 2. `Flipper::Middleware::Memoizer` will be enabled by default -- including preloading. **Note**: You may want to disable preloading (see below) if you have > 100 features.
141
-
142
- ```diff
143
- # config/initializers/flipper.rb
144
- - Rails.configuration.middleware.use Flipper::Middleware::Memoizer,
145
- - preload: [:stats, :search, :some_feature]
146
- + Rails.application.configure do
147
- + # Uncomment to configure which features to preload on all requests
148
- + # config.flipper.preload = [:stats, :search, :some_feature]
149
- + #
150
- + # Or, you may want to disable preloading entirely:
151
- + # config.flipper.preload = false
152
- + end
153
- ```
154
-
155
- 3. `#flipper_id`, which is used to enable features for specific actors, is now defined by [Flipper::Identifier](lib/flipper/identifier.rb) on all ActiveRecord and Sequel models. You can remove your implementation if it is in the form of `ModelName;id`.
156
-
157
- 4. When using `flipper-cloud`, The `Flipper::Cloud.app` webhook receiver is now mounted at `/_flipper` by default.
158
-
159
- ```diff
160
- # config/routes.rb
161
- - mount Flipper::Cloud.app, at: "/_flipper"
162
- ```
163
-
164
- ## 0.20.4
165
-
166
- ### Additions/Changes
167
-
168
- * Allow actors and time gates to deal with decimal percentages (https://github.com/jnunemaker/flipper/pull/492)
169
- * Change Flipper::Cloud::Middleware to receive webhooks at / in addition to /webhooks.
170
- * Add `write_through` option to ActiveSupportCacheStore adapter to support write-through caching (https://github.com/jnunemaker/flipper/pull/512)
171
-
172
- ## 0.20.3
173
-
174
- ### Additions/Changes
175
-
176
- * Changed the internal structure of how the memory adapter stores things.
177
-
178
- ## 0.20.2
179
-
180
- ### Additions/Changes
181
-
182
- * Http adapter now raises error when enable/disable/add/remove/clear fail.
183
- * Cloud adapter sends some extra info like hostname, ruby version, etc. for debugging and decision making.
184
-
185
- ## 0.20.1
186
-
187
- ### Additions/Changes
188
-
189
- * Just a minor tweak to cloud webhook middleware to provide more debugging information about why a hook wasn't successful.
190
-
191
- ## 0.20.0
192
-
193
- ### Additions/Changes
194
-
195
- * Add support for webhooks to `Flipper::Cloud` (https://github.com/jnunemaker/flipper/pull/489).
196
-
197
- ## 0.19.1
198
-
199
- ### Additions/Changes
200
-
201
- * Bump rack-protection version to < 2.2 (https://github.com/jnunemaker/flipper/pull/487)
202
- * Add memoizer_options to Flipper::Api.app (https://github.com/jnunemaker/flipper/commit/174ad4bb94046a25c432d3c53fe1ff9f5a76d838)
203
-
204
- ## 0.19.0
205
-
206
- ### Additions/Changes
207
-
208
- * 100% of actors is now considered conditional. Feature#on?, Feature#conditional?, Feature#state would all be affected. See https://github.com/jnunemaker/flipper/issues/463 for more.
209
- * Several doc updates.
210
-
211
- ## 0.18.0
212
-
213
- ### Additions/Changes
214
-
215
- * Add support for feature descriptions to flipper-ui (https://github.com/jnunemaker/flipper/pull/461).
216
- * Remove rubocop (https://github.com/jnunemaker/flipper/pull/469).
217
- * flipper-ui redesign (https://github.com/jnunemaker/flipper/pull/470).
218
- * Removed support for ruby 2.4.
219
- * Added support for ruby 2.7.
220
- * Removed support for Rails 4.x.x.
221
- * Removed support for customizing actors, groups, % of actors and % of time text in flipper-ui in favor of automatic and more descriptive text.
222
-
223
- ## 0.17.2
224
-
225
- ### Additions/Changes
226
-
227
- * Avoid errors on import when there are no features and shared specs/tests for get all with no features (https://github.com/jnunemaker/flipper/pull/441 and https://github.com/jnunemaker/flipper/pull/442)
228
- * ::ActiveRecord::RecordNotUnique > ActiveRecord::RecordNotUnique (https://github.com/jnunemaker/flipper/pull/444)
229
- * Clear gate values on enable (https://github.com/jnunemaker/flipper/pull/454)
230
- * Remove use of multi from redis adapter (https://github.com/jnunemaker/flipper/pull/451)
231
-
232
- ## 0.17.1
233
-
234
- * Fix require in flipper-active_record (https://github.com/jnunemaker/flipper/pull/437)
235
-
236
- ## 0.17.0
237
-
238
- ### Additions/Changes
239
-
240
- * Allow shorthand block notation on group types (https://github.com/jnunemaker/flipper/pull/406)
241
- * Relax active record/support constraints to support Rails 6 (https://github.com/jnunemaker/flipper/pull/409)
242
- * Allow disabling fun (https://github.com/jnunemaker/flipper/pull/413)
243
- * Include thing_value in payload of Instrumented#enable and #disable (https://github.com/jnunemaker/flipper/pull/417)
244
- * Replace Erubis with Erubi (https://github.com/jnunemaker/flipper/pull/407)
245
- * Allow customizing Rack::Protection middleware list (https://github.com/jnunemaker/flipper/pull/385)
246
- * Allow setting write_timeout for ruby 2.6+ (https://github.com/jnunemaker/flipper/pull/433)
247
- * Drop support for Ruby 2.1, 2.2, and 2.3 (https://github.com/jnunemaker/flipper/commit/cf58982e70de5e6963b018ceced4f36a275f5b5d)
248
- * Add support for Ruby 2.6 (https://github.com/jnunemaker/flipper/commit/57888311449ec81184d3d47ba9ae5cb1ad4a2f45)
249
- * Remove support for Rails 3.2 (https://github.com/jnunemaker/flipper/commit/177c48c4edf51d4e411e7c673e30e06d1c66fb40)
250
- * Add write_timeout for flipper http adapter for ruby 2.6+ (https://github.com/jnunemaker/flipper/pull/433)
251
- * Relax moneta version to allow for < 1.2 (https://github.com/jnunemaker/flipper/pull/434).
252
- * Improve active record idempotency (https://github.com/jnunemaker/flipper/pull/436).
253
- * Allow customizing add actor placeholder text (https://github.com/jnunemaker/flipper/commit/5faa1e9cf66b68f8227d2f8408fb448a14676c45)
254
-
255
- ## 0.16.2
256
-
257
- ### Additions/Changes
258
-
259
- * Bump rollout redis dependency to < 5 (https://github.com/jnunemaker/flipper/pull/403)
260
- * Bump redis dependency to < 5 (https://github.com/jnunemaker/flipper/pull/401)
261
- * Bump sequel dependency to < 6 (https://github.com/jnunemaker/flipper/pull/399 and https://github.com/jnunemaker/flipper/commit/edc767e69b4ce8daead9801f38e0e8bf6b238765)
262
-
263
- ## 0.16.1
264
-
265
- ### Additions/Changes
266
-
267
- * Add actors API endpoint (https://github.com/jnunemaker/flipper/pull/372).
268
- * Fix rack body proxy require for those using flipper without rack (https://github.com/jnunemaker/flipper/pull/376).
269
- * Unescapes feature_name in FeatureNameFromRoute (https://github.com/jnunemaker/flipper/pull/377).
270
- * Replace delete_all with destroy_all in ActiveRecord adapter (https://github.com/jnunemaker/flipper/pull/395)
271
- * Target correct bootstrap breakpoints in flipper UI (https://github.com/jnunemaker/flipper/pull/396)
272
-
273
- ## 0.16.0
274
-
275
- ### Bug Fixes
276
-
277
- * Support slashes in feature names (https://github.com/jnunemaker/flipper/pull/362).
278
-
279
- ### Additions/Changes
280
-
281
- * Re-order gates for improved performance in some cases (https://github.com/jnunemaker/flipper/pull/370).
282
- * Add Feature#exist?, DSL#exist? and Flipper#exist? (https://github.com/jnunemaker/flipper/pull/371).
283
-
284
- ## 0.15.0
285
-
286
- * Move Flipper::UI configuration options to Flipper::UI::Configuration (https://github.com/jnunemaker/flipper/pull/345).
287
- * Bug fix in adapter synchronizing and switched DSL#import to use Synchronizer (https://github.com/jnunemaker/flipper/pull/347).
288
- * Fix AR adapter table name prefix/suffix bug (https://github.com/jnunemaker/flipper/pull/350).
289
- * Allow feature names to end with "features" in UI (https://github.com/jnunemaker/flipper/pull/353).
290
-
291
- ## 0.14.0
292
-
293
- * Changed sync_interval to be seconds instead of milliseconds.
294
-
295
- ## 0.13.0
296
-
297
- ### Additions/Changes
298
-
299
- * Update PStore adapter to allow setting thread_safe option (https://github.com/jnunemaker/flipper/pull/334).
300
- * Update Flipper::UI to Bootstrap 4 (https://github.com/jnunemaker/flipper/pull/336).
301
- * Add Flipper::UI configuration to add a banner with customizeable text and background color (https://github.com/jnunemaker/flipper/pull/337).
302
- * Add sync adapter (https://github.com/jnunemaker/flipper/pull/341).
303
- * Make cloud use sync adapter (https://github.com/jnunemaker/flipper/pull/342). This makes local flipper operations resilient to cloud failures.
304
-
305
- ## 0.12.2
306
-
307
- ### Additions/Changes
308
-
309
- * Improvements/fixes/examples for rollout adapter (https://github.com/jnunemaker/flipper/pull/332).
310
-
311
- ## 0.12.1
312
-
313
- ### Additions/Changes
314
-
315
- * Added rollout adapter documentation (https://github.com/jnunemaker/flipper/pull/328).
316
-
317
- ### Bug Fixes
318
-
319
- * Fixed ActiveRecord and Sequel adapters to include disabled features for `get_all` (https://github.com/jnunemaker/flipper/pull/327).
320
-
321
- ## 0.12
322
-
323
- ### Additions/Changes
324
-
325
- * Added Flipper.instance= writer method for explicitly setting the default instance (https://github.com/jnunemaker/flipper/pull/309).
326
- * Added Flipper::UI configuration instance for changing text and things (https://github.com/jnunemaker/flipper/pull/306).
327
- * Delegate memoize= and memoizing? for Flipper and Flipper::DSL (https://github.com/jnunemaker/flipper/pull/310).
328
- * Fixed error when enabling the same group or actor more than once (https://github.com/jnunemaker/flipper/pull/313).
329
- * Fixed redis cache adapter key (and thus cache misses) (https://github.com/jnunemaker/flipper/pull/325).
330
- * Added Rollout adapter to make it easy to import rollout data into Flipper (https://github.com/jnunemaker/flipper/pull/319).
331
- * Relaxed redis gem dependency constraint to allow redis-rb 4 (https://github.com/jnunemaker/flipper/pull/317).
332
- * Added configuration option for Flipper::UI to disable feature removal (https://github.com/jnunemaker/flipper/pull/322).
333
-
334
- ## 0.11
335
-
336
- ### Backwards Compatibility Breaks
337
-
338
- * Set flipper from env for API and UI (https://github.com/jnunemaker/flipper/pull/223 and https://github.com/jnunemaker/flipper/pull/229). It is documented, but now the memoizing middleware requires that the SetupEnv middleware is used first, unless you are configuring a Flipper default instance.
339
- * Drop support for Ruby 2.0 as it is end of lined (https://github.com/jnunemaker/flipper/commit/c2c81ed89938155ce91acb5173ac38580f630e3d).
340
- * Allow unregistered groups (https://github.com/jnunemaker/flipper/pull/244). Only break in compatibility is that previously unregistered groups could not be enabled and now they can be.
341
- * Removed support for metriks (https://github.com/jnunemaker/flipper/pull/291).
342
-
343
- ### Additions/Changes
344
-
345
- * Use primary keys with sequel adapter (https://github.com/jnunemaker/flipper/pull/210). Should be backwards compatible, but if you want it to work this way you will need to migrate your database to the new schema.
346
- * Add redis cache adapter (https://github.com/jnunemaker/flipper/pull/211).
347
- * Finish API and HTTP adapter that speaks to API.
348
- * Add flipper cloud adapter (https://github.com/jnunemaker/flipper/pull/249). Nothing to see here yet, but good stuff soon. ;)
349
- * Add importing (https://github.com/jnunemaker/flipper/pull/251).
350
- * Added Adapter#get_all to allow for more efficient preload_all (https://github.com/jnunemaker/flipper/pull/255).
351
- * Added :unless option to Flipper::Middleware::Memoizer to allow skipping memoization and preloading for certain requests.
352
- * Made it possible to instrument Flipper::Cloud (https://github.com/jnunemaker/flipper/commit/4b10e4d807772202f63881f5e2c00d11ac58481f).
353
- * Made it possible to wrap Http adapter when using Flipper::Cloud (https://github.com/jnunemaker/flipper/commit/4b10e4d807772202f63881f5e2c00d11ac58481f).
354
- * Instrument get_multi in instrumented adapter (https://github.com/jnunemaker/flipper/commit/951d25c5ce07d3b56b0b2337adf5f6bcbe4050e7).
355
- * Allow instrumenting Flipper::Cloud http adapter (https://github.com/jnunemaker/flipper/pull/253).
356
- * Add DSL#preload_all and Adapter#get_all to allow for making even more efficient loading of features (https://github.com/jnunemaker/flipper/pull/255).
357
- * Allow setting debug output of http adapter (https://github.com/jnunemaker/flipper/pull/256 and https://github.com/jnunemaker/flipper/pull/258).
358
- * Allow setting env key for middleware (https://github.com/jnunemaker/flipper/pull/259).
359
- * Added ActiveSupport cache store adapter for use with Rails.cache (https://github.com/jnunemaker/flipper/pull/265 and https://github.com/jnunemaker/flipper/pull/297).
360
- * Added support for up to 3 decimal places in percentage based rollouts (https://github.com/jnunemaker/flipper/pull/274).
361
- * Removed Flipper::GroupNotRegistered error as it is now unused (https://github.com/jnunemaker/flipper/pull/270).
362
- * Added get_all to all adapters (https://github.com/jnunemaker/flipper/pull/298).
363
- * Added support for Rails 5.1 (https://github.com/jnunemaker/flipper/pull/299).
364
- * Added Flipper default instance generation (https://github.com/jnunemaker/flipper/pull/279).
365
-
366
- ## 0.10.2
367
-
368
- * Add Adapter#get_multi to allow for efficient loading of more than one feature at a time (https://github.com/jnunemaker/flipper/pull/198)
369
- * Add DSL#preload for efficiently loading several features at once using get_mutli (https://github.com/jnunemaker/flipper/pull/198)
370
- * Add :preload and :preload_all options to memoizer as a way of efficiently loading several features for a request in one network call instead of N where N is the number of features checked (https://github.com/jnunemaker/flipper/pull/198)
371
- * Strip whitespace out of feature/actor/group values posted by UI (https://github.com/jnunemaker/flipper/pull/205)
372
- * Fix bug with dalli adapter where deleting a feature using the UI or API was not clearing the cache in the dalli adapter which meant the feature would continue to use whatever cached enabled state was present until the TTL was hit (1cd96f6)
373
- * Change cache keys for dalli adapter. Backwards compatible in that it will just repopulate new keys on first check with this version, but old keys are not expired, so if you used the default ttl of 0, you'll have to expire them on your own. The primary reason for the change was safer namespacing of the cache keys to avoid collisions.
374
-
375
- ## 0.10.1
376
-
377
- * Add docker compose support for contributing
378
- * Add sequel adapter
379
- * Show confirmation dialog when deleting a feature in flipper-ui
380
-
381
- ## 0.10.0
382
-
383
- * Added feature check context (https://github.com/jnunemaker/flipper/pull/158)
384
- * Do not use mass assignment for active record adapter (https://github.com/jnunemaker/flipper/pull/171)
385
- * Several documentation improvements
386
- * Make Flipper::UI.app.inspect return a String (https://github.com/jnunemaker/flipper/pull/176)
387
- * changes boolean gate route to api/v1/features/boolean (https://github.com/jnunemaker/flipper/pull/175)
388
- * add api v1 percentage_of_actors endpoint (https://github.com/jnunemaker/flipper/pull/179)
389
- * add api v1 percentage_of_time endpoint (https://github.com/jnunemaker/flipper/pull/180)
390
- * add api v1 actors gate endpoint (https://github.com/jnunemaker/flipper/pull/181)
391
- * wait for activesupport to tell us when active record is loaded for active record adapter (https://github.com/jnunemaker/flipper/pull/192)
392
-
393
- ## 0.9.2
394
-
395
- * GET /api/v1/features
396
- * POST /api/v1/features - add feature endpoint
397
- * rack-protection 2.0.0 support
398
- * pretty rake output
399
-
400
- ## 0.9.1
401
-
402
- * bump flipper-active_record to officially support rails 5
403
-
404
- ## 0.9.0
405
-
406
- * Moves SharedAdapterTests module to Flipper::Test::SharedAdapterTests to avoid clobbering anything top level in apps that use Flipper
407
- * Memoizable, Instrumented and OperationLogger now delegate any missing methods to the original adapter. This was lost with the removal of the official decorator in 0.8, but is actually useful functionality for these "wrapping" adapters.
408
- * Instrumenting adapters is now off by default. Use Flipper::Adapters::Instrumented.new(adapter) to instrument adapters and maintain the old functionality.
409
- * Added dalli cache adapter (https://github.com/jnunemaker/flipper/pull/132)
410
-
411
- ## 0.8
412
-
413
- * removed Flipper::Decorator and Flipper::Adapters::Decorator in favor of just calling methods on wrapped adapter
414
- * fix bug where certain versions of AR left off quotes for key column which caused issues with MySQL https://github.com/jnunemaker/flipper/issues/120
415
- * fix bug where AR would store multiple gate values for percentage gates for each enable/disable and then nondeterministically pick one on read (https://github.com/jnunemaker/flipper/pull/122 and https://github.com/jnunemaker/flipper/pull/124)
416
- * added readonly adapter (https://github.com/jnunemaker/flipper/pull/111)
417
- * flipper groups now match for truthy values rather than explicitly only true (https://github.com/jnunemaker/flipper/issues/110)
418
- * removed gate operation instrumentation (https://github.com/jnunemaker/flipper/commit/32f14ed1fb25c64961b23c6be3dc6773143a06c8); I don't think it was useful and never found myself instrumenting it in reality
419
- * initial implementation of flipper api - very limited functionality right now (get/delete feature, boolean gate for feature) but more is on the way
420
- * made it easy to remove a feature (https://github.com/jnunemaker/flipper/pull/126)
421
- * add minitest shared tests for adapters that work the same as the shared specs for rspec (https://github.com/jnunemaker/flipper/pull/127)
422
-
423
- ## 0.7.5
424
-
425
- * support for rails 5 beta/ rack 2 alpha
426
- * fix uninitialized constant in rails generators
427
- * fix adapter test for clear to ensure that feature is not deleted, only gates
428
-
429
- ## 0.7.4
430
-
431
- * Add missing migration file to gemspec for flipper-active_record
432
-
433
- ## 0.7.3
434
-
435
- * Add Flipper ActiveRecord adapter
436
-
437
- ## 0.7.2
438
-
439
- * Add Flipper::UI.application_breadcrumb_href for setting breadcrumb back to original app from Flipper UI
440
-
441
- ## 0.7.1
442
-
443
- * Fix bug where features with names that match static file routes were incorrectly routing to the file action (https://github.com/jnunemaker/flipper/issues/80)
444
-
445
- ## 0.7
446
-
447
- * Added Flipper.groups and Flipper.group_names
448
- * Changed percentage_of_random to percentage_of_time
449
- * Added enable/disable convenience methods for all gates (enable_group, enable_actor, enable_percentage_of_actors, enable_percentage_of_time)
450
- * Added value convenience methods (boolean_value, groups_value, actors_value, etc.)
451
- * Added Feature#gate_values for getting typecast adapter gate values
452
- * Added Feature#enabled_gates and #disabled_gates for getting the gates that are enabled/disabled for the feature
453
- * Remove Feature#description
454
- * Added Flipper::Adapters::PStore
455
- * Moved memoizable decorator to instance variable storage from class level thread local stuff. Now not thread safe, but we can make a thread safe version later.
456
-
457
- UI
458
-
459
- * Totally new. Works like a charm.
460
-
461
- Mongo
462
-
463
- * Updated to latest driver (~> 2.0)
464
-
465
- ## 0.6.3
466
-
467
- * Minor bug fixes
468
-
469
- ## 0.6.2
470
-
471
- * Added Flipper.group_exists?
472
-
473
- ## 0.6.1
474
-
475
- * Added statsd support for instrumentation.
476
-
477
- ## 0.4.0
478
-
479
- * No longer use #id for detecting actors. You must now define #flipper_id on
480
- anything that you would like to behave as an actor.
481
- * Strings are now used instead of Integers for Actor identifiers. More flexible
482
- and the only reason I used Integers was to do modulo for percentage of actors.
483
- Since percentage of actors now uses hashing, integer is no longer needed.
484
- * Easy integration of instrumentation with AS::Notifications or anything similar.
485
- * A bunch of stuff around inspecting and getting names/descriptions out of
486
- things to more easily figure out what is going on.
487
- * Percentage of actors hash is now also seeded with feature name so the same
488
- actors don't get all features instantly.
3
+ All notable [changes since 1.0 are documented in GitHub Releases](https://github.com/flippercloud/flipper/releases). View [0.x Changelog](https://github.com/flippercloud/flipper/blob/v0.28.3/Changelog.md).
data/Gemfile CHANGED
@@ -6,24 +6,36 @@ Dir['flipper-*.gemspec'].each do |gemspec|
6
6
  gemspec(name: "flipper-#{plugin}", development_group: plugin)
7
7
  end
8
8
 
9
+ gem 'concurrent-ruby', '1.3.4'
10
+ gem 'connection_pool'
9
11
  gem 'debug'
10
- gem 'rake', '~> 12.3.3'
11
- gem 'shotgun', '~> 0.9'
12
+ gem 'rake'
12
13
  gem 'statsd-ruby', '~> 1.2.1'
13
14
  gem 'rspec', '~> 3.0'
14
- gem 'rack-test', '~> 0.6.3'
15
- gem 'sqlite3', "~> #{ENV['SQLITE3_VERSION'] || '1.4.1'}"
16
- gem 'rails', "~> #{ENV['RAILS_VERSION'] || '7.0.0'}"
17
- gem 'minitest', '~> 5.8'
15
+ gem 'rack-test'
16
+ gem 'rackup', '= 1.0.0'
17
+ gem 'sqlite3', "~> #{ENV['SQLITE3_VERSION'] || '2.1.0'}"
18
+ gem 'rails', "~> #{ENV['RAILS_VERSION'] || '8.0'}"
19
+ gem 'minitest', '~> 5.18'
18
20
  gem 'minitest-documentation'
19
- gem 'webmock', '~> 3.0'
21
+ gem 'pstore'
22
+ gem 'webmock'
20
23
  gem 'ice_age'
21
24
  gem 'redis-namespace'
22
25
  gem 'webrick'
26
+ gem 'stackprof'
27
+ gem 'benchmark-ips'
28
+ gem 'stackprof-webnav'
29
+ gem 'flamegraph'
30
+ gem 'mysql2'
31
+ gem 'pg'
32
+ gem 'cuprite'
33
+ gem 'puma'
34
+ gem 'warning'
23
35
 
24
36
  group(:guard) do
25
- gem 'guard', '~> 2.15'
26
- gem 'guard-rspec', '~> 4.5'
27
- gem 'guard-bundler', '~> 2.2'
28
- gem 'rb-fsevent', '~> 0.9'
37
+ gem 'guard'
38
+ gem 'guard-rspec'
39
+ gem 'guard-bundler'
40
+ gem 'rb-fsevent'
29
41
  end
data/README.md CHANGED
@@ -1,17 +1,17 @@
1
1
  [![Flipper Mark](docs/images/banner.jpg)](https://www.flippercloud.io)
2
2
 
3
- [Website](https://flippercloud.io) | [Documentation](https://flippercloud.io/docs) | [Examples](examples) | [Twitter](https://twitter.com/flipper_cloud)
3
+ [Website](https://flippercloud.io?utm_source=oss&utm_medium=readme&utm_campaign=website_link) | [Documentation](https://flippercloud.io/docs?utm_source=oss&utm_medium=readme&utm_campaign=docs_link) | [Examples](examples) | [Chat](https://chat.flippercloud.io/join/xjHq-aJsA-BeZH) | [Twitter](https://twitter.com/flipper_cloud) | [Ruby.social](https://ruby.social/@flipper)
4
4
 
5
5
  # Flipper
6
6
 
7
- > Beautiful, performant feature flags for Ruby.
7
+ > Beautiful, performant feature flags for Ruby and Rails.
8
8
 
9
9
  Flipper gives you control over who has access to features in your app.
10
10
 
11
- * Enable or disable features for everyone, specific actors, groups of actors, a percentage of actors, or a percentage of time.
12
- * Configure your feature flags from the console or a web UI.
13
- * Regardless of what data store you are using, Flipper can performantly store your feature flags.
14
- * Use [Flipper Cloud](#flipper-cloud) to cascade features from multiple environments, share settings with your team, control permissions, keep an audit history, and rollback.
11
+ - Enable or disable features for everyone, specific actors, groups of actors, a percentage of actors, or a percentage of time.
12
+ - Configure your feature flags from the console or a web UI.
13
+ - Regardless of what data store you are using, Flipper can performantly store your feature flags.
14
+ - Use [Flipper Cloud](#flipper-cloud) to cascade features from multiple environments, share settings with your team, control permissions, keep an audit history, and rollback.
15
15
 
16
16
  Control your software &mdash; don't let it control you.
17
17
 
@@ -35,7 +35,7 @@ Or install it yourself with:
35
35
 
36
36
  ## Subscribe &amp; Ship
37
37
 
38
- [💌 &nbsp;Subscribe](https://buttondown.email/flipper) - I'll send you short and sweet emails when we release new versions.
38
+ [💌 &nbsp;Subscribe](https://blog.flippercloud.io/#/portal/signup) - we'll send you short and sweet emails when we release new versions ([examples](https://blog.flippercloud.io/tag/releases/)).
39
39
 
40
40
  ## Getting Started
41
41
 
@@ -43,7 +43,7 @@ Use `Flipper#enabled?` in your app to check if a feature is enabled.
43
43
 
44
44
  ```ruby
45
45
  # check if search is enabled
46
- if Flipper.enabled? :search, current_user
46
+ if Flipper.enabled?(:search, current_user)
47
47
  puts 'Search away!'
48
48
  else
49
49
  puts 'No search for you!'
@@ -66,24 +66,26 @@ Flipper.enable_group :search, :admin
66
66
  Flipper.enable_percentage_of_actors :search, 2
67
67
  ```
68
68
 
69
- Read more about [getting started with Flipper](https://flippercloud.io/docs) and [enabling features](https://flippercloud.io/docs/features).
69
+ Read more about [getting started with Flipper](https://flippercloud.io/docs?utm_source=oss&utm_medium=readme&utm_campaign=getting_started) and [enabling features](https://flippercloud.io/docs/features?utm_source=oss&utm_medium=readme&utm_campaign=enabling_features).
70
70
 
71
71
  ## Flipper Cloud
72
72
 
73
- Like Flipper and want more? Check out [Flipper Cloud](https://www.flippercloud.io), which comes with:
73
+ Like Flipper and want more? Check out [Flipper Cloud](https://www.flippercloud.io?utm_source=oss&utm_medium=readme&utm_campaign=check_out), which comes with:
74
74
 
75
- * **everything in one place** &mdash; no need to bounce around from different application UIs or IRB consoles.
76
- * **permissions** &mdash; grant access to everyone in your organization or lockdown each project to particular people.
77
- * **multiple environments** &mdash; production, staging, enterprise, by continent, whatever you need.
78
- * **personal environments** &mdash; no more rake scripts or manual enable/disable to get your laptop to look like production. Every developer gets a personal environment that inherits from production that they can override as they please ([read more](https://www.johnnunemaker.com/flipper-cloud-environments/)).
79
- * **no maintenance** &mdash; we'll keep the lights on for you. We also have handy webhooks for keeping your app in sync with Cloud, so **our availability won't affect yours**. All your feature flag reads are local to your app.
80
- * **audit history** &mdash; every feature change and who made it.
81
- * **rollbacks** &mdash; enable or disable a feature accidentally? No problem. You can roll back to any point in the audit history with a single click.
75
+ - **multiple environments** &mdash; production, staging, per continent, whatever you need. Every environment inherits from production by default and every project comes with a [project overview page](https://blog.flippercloud.io/project-overview/) that shows each feature and its status in each environment.
76
+ - **personal environments** &mdash; everyone on your team gets a personal environment (that inherits from production) which they can modify however they want without stepping on anyone else's toes.
77
+ - **permissions** &mdash; grant access to everyone in your organization or lockdown each project to particular people. You can even limit access to a particular environment (like production) to specific people.
78
+ - **audit history** &mdash; every feature change and who made it.
79
+ - **rollbacks** &mdash; enable or disable a feature accidentally? No problem. You can roll back to any point in the audit history with a single click.
80
+ - **maintenance** &mdash; we'll keep the lights on for you. We also have handy webhooks and background polling for keeping your app in sync with Cloud, so **our availability won't affect yours**. All your feature flag reads are local to your app.
81
+ - **everything in one place** &mdash; no need to bounce around from different application UIs or IRB consoles.
82
82
 
83
- [![Flipper Cloud Screenshot](docs/images/flipper_cloud.png)](https://www.flippercloud.io)
83
+ [![Flipper Cloud Screenshot](docs/images/flipper_cloud.png)](https://www.flippercloud.io?utm_source=oss&utm_medium=readme&utm_campaign=screenshot)
84
84
 
85
85
  Cloud is super simple to integrate with Rails ([demo app](https://github.com/fewerandfaster/flipper-rails-demo)), Sinatra or any other framework.
86
86
 
87
+ We also have a [free plan](https://www.flippercloud.io?utm_source=oss&utm_medium=readme&utm_campaign=free_plan) that you can use forever.
88
+
87
89
  ## Contributing
88
90
 
89
91
  1. Fork it
@@ -97,15 +99,17 @@ Cloud is super simple to integrate with Rails ([demo app](https://github.com/few
97
99
 
98
100
  1. Update the version to be whatever it should be and commit.
99
101
  2. `script/release`
100
- 3. Profit.
102
+ 3. Create a new [GitHub Release](https://github.com/flippercloud/flipper/releases/new)
101
103
 
102
104
  ## Brought To You By
103
105
 
104
- | pic | @mention | area |
105
- |---|---|---|
106
- | ![@jnunemaker](https://avatars3.githubusercontent.com/u/235?s=64) | [@jnunemaker](https://github.com/jnunemaker) | most things |
107
- | ![@bkeepers](https://avatars3.githubusercontent.com/u/173?s=64) | [@bkeepers](https://github.com/bkeepers) | most things |
108
- | ![@dpep](https://avatars3.githubusercontent.com/u/918804?s=64) | [@dpep](https://github.com/dpep) | tbd |
109
- | ![@alexwheeler](https://avatars3.githubusercontent.com/u/3260042?s=64) | [@alexwheeler](https://github.com/alexwheeler) | api |
110
- | ![@thetimbanks](https://avatars1.githubusercontent.com/u/471801?s=64) | [@thetimbanks](https://github.com/thetimbanks) | ui |
111
- | ![@lazebny](https://avatars1.githubusercontent.com/u/6276766?s=64) | [@lazebny](https://github.com/lazebny) | docker |
106
+ | pic | @mention | area |
107
+ | ---------------------------------------------------------------------- | ---------------------------------------------- | ----------- |
108
+ | ![@jnunemaker](https://avatars3.githubusercontent.com/u/235?s=64) | [@jnunemaker](https://github.com/jnunemaker) | most things |
109
+ | ![@bkeepers](https://avatars3.githubusercontent.com/u/173?s=64) | [@bkeepers](https://github.com/bkeepers) | most things |
110
+ | ![@dpep](https://avatars3.githubusercontent.com/u/918804?s=64) | [@dpep](https://github.com/dpep) | tbd |
111
+ | ![@alexwheeler](https://avatars3.githubusercontent.com/u/3260042?s=64) | [@alexwheeler](https://github.com/alexwheeler) | api |
112
+ | ![@thetimbanks](https://avatars1.githubusercontent.com/u/471801?s=64) | [@thetimbanks](https://github.com/thetimbanks) | ui |
113
+ | ![@lazebny](https://avatars1.githubusercontent.com/u/6276766?s=64) | [@lazebny](https://github.com/lazebny) | docker |
114
+ | ![@pagertree](https://avatars.githubusercontent.com/u/24941240?s=64) | [@pagertree](https://github.com/pagertree) | sponsor |
115
+ | ![@kdaigle](https://avatars.githubusercontent.com/u/2501?s=64) | [@kdaigle](https://github.com/kdaigle) | sponsor |