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.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.github/workflows/ci.yml +61 -16
- data/.github/workflows/examples.yml +55 -18
- data/CLAUDE.md +74 -0
- data/Changelog.md +1 -486
- data/Gemfile +23 -11
- data/README.md +31 -27
- data/Rakefile +2 -2
- data/benchmark/enabled_ips.rb +10 -0
- data/benchmark/enabled_multiple_actors_ips.rb +20 -0
- data/benchmark/enabled_profile.rb +20 -0
- data/benchmark/instrumentation_ips.rb +21 -0
- data/benchmark/typecast_ips.rb +27 -0
- data/docs/images/banner.jpg +0 -0
- data/docs/images/flipper_cloud.png +0 -0
- data/examples/api/basic.ru +3 -4
- data/examples/api/custom_memoized.ru +3 -4
- data/examples/api/memoized.ru +3 -4
- data/examples/cloud/app.ru +12 -0
- data/examples/cloud/backoff_policy.rb +13 -0
- data/examples/cloud/basic.rb +22 -0
- data/examples/cloud/cloud_setup.rb +20 -0
- data/examples/cloud/forked.rb +36 -0
- data/examples/cloud/import.rb +17 -0
- data/examples/cloud/threaded.rb +33 -0
- data/examples/dsl.rb +1 -15
- data/examples/enabled_for_actor.rb +4 -2
- data/examples/expressions.rb +213 -0
- data/examples/mirroring.rb +59 -0
- data/examples/strict.rb +18 -0
- data/exe/flipper +5 -0
- data/flipper-cloud.gemspec +19 -0
- data/flipper.gemspec +8 -6
- data/lib/flipper/actor.rb +6 -3
- data/lib/flipper/adapter.rb +33 -7
- data/lib/flipper/adapter_builder.rb +44 -0
- data/lib/flipper/adapters/actor_limit.rb +28 -0
- data/lib/flipper/adapters/cache_base.rb +143 -0
- data/lib/flipper/adapters/dual_write.rb +1 -3
- data/lib/flipper/adapters/failover.rb +0 -4
- data/lib/flipper/adapters/failsafe.rb +0 -4
- data/lib/flipper/adapters/http/client.rb +40 -12
- data/lib/flipper/adapters/http/error.rb +2 -2
- data/lib/flipper/adapters/http.rb +30 -17
- data/lib/flipper/adapters/instrumented.rb +25 -6
- data/lib/flipper/adapters/memoizable.rb +33 -21
- data/lib/flipper/adapters/memory.rb +81 -46
- data/lib/flipper/adapters/operation_logger.rb +17 -78
- data/lib/flipper/adapters/poll/poller.rb +2 -125
- data/lib/flipper/adapters/poll.rb +20 -3
- data/lib/flipper/adapters/pstore.rb +17 -11
- data/lib/flipper/adapters/read_only.rb +8 -41
- data/lib/flipper/adapters/strict.rb +45 -0
- data/lib/flipper/adapters/sync/feature_synchronizer.rb +10 -1
- data/lib/flipper/adapters/sync.rb +0 -4
- data/lib/flipper/adapters/wrapper.rb +54 -0
- data/lib/flipper/cli.rb +263 -0
- data/lib/flipper/cloud/configuration.rb +266 -0
- data/lib/flipper/cloud/dsl.rb +27 -0
- data/lib/flipper/cloud/message_verifier.rb +95 -0
- data/lib/flipper/cloud/middleware.rb +63 -0
- data/lib/flipper/cloud/routes.rb +14 -0
- data/lib/flipper/cloud/telemetry/backoff_policy.rb +96 -0
- data/lib/flipper/cloud/telemetry/instrumenter.rb +22 -0
- data/lib/flipper/cloud/telemetry/metric.rb +39 -0
- data/lib/flipper/cloud/telemetry/metric_storage.rb +30 -0
- data/lib/flipper/cloud/telemetry/submitter.rb +100 -0
- data/lib/flipper/cloud/telemetry.rb +191 -0
- data/lib/flipper/cloud.rb +53 -0
- data/lib/flipper/configuration.rb +25 -4
- data/lib/flipper/dsl.rb +46 -45
- data/lib/flipper/engine.rb +102 -0
- data/lib/flipper/errors.rb +3 -3
- data/lib/flipper/export.rb +24 -0
- data/lib/flipper/exporter.rb +17 -0
- data/lib/flipper/exporters/json/export.rb +32 -0
- data/lib/flipper/exporters/json/v1.rb +33 -0
- data/lib/flipper/expression/builder.rb +73 -0
- data/lib/flipper/expression/constant.rb +25 -0
- data/lib/flipper/expression.rb +71 -0
- data/lib/flipper/expressions/all.rb +9 -0
- data/lib/flipper/expressions/any.rb +9 -0
- data/lib/flipper/expressions/boolean.rb +9 -0
- data/lib/flipper/expressions/comparable.rb +13 -0
- data/lib/flipper/expressions/duration.rb +28 -0
- data/lib/flipper/expressions/equal.rb +9 -0
- data/lib/flipper/expressions/greater_than.rb +9 -0
- data/lib/flipper/expressions/greater_than_or_equal_to.rb +9 -0
- data/lib/flipper/expressions/less_than.rb +9 -0
- data/lib/flipper/expressions/less_than_or_equal_to.rb +9 -0
- data/lib/flipper/expressions/not_equal.rb +9 -0
- data/lib/flipper/expressions/now.rb +9 -0
- data/lib/flipper/expressions/number.rb +9 -0
- data/lib/flipper/expressions/percentage.rb +9 -0
- data/lib/flipper/expressions/percentage_of_actors.rb +12 -0
- data/lib/flipper/expressions/property.rb +9 -0
- data/lib/flipper/expressions/random.rb +9 -0
- data/lib/flipper/expressions/string.rb +9 -0
- data/lib/flipper/expressions/time.rb +9 -0
- data/lib/flipper/feature.rb +94 -26
- data/lib/flipper/feature_check_context.rb +10 -6
- data/lib/flipper/gate.rb +13 -11
- data/lib/flipper/gate_values.rb +5 -18
- data/lib/flipper/gates/actor.rb +10 -17
- data/lib/flipper/gates/boolean.rb +1 -1
- data/lib/flipper/gates/expression.rb +75 -0
- data/lib/flipper/gates/group.rb +5 -7
- data/lib/flipper/gates/percentage_of_actors.rb +10 -13
- data/lib/flipper/gates/percentage_of_time.rb +1 -2
- data/lib/flipper/identifier.rb +2 -2
- data/lib/flipper/instrumentation/log_subscriber.rb +35 -8
- data/lib/flipper/instrumentation/statsd.rb +4 -2
- data/lib/flipper/instrumentation/statsd_subscriber.rb +2 -4
- data/lib/flipper/instrumentation/subscriber.rb +8 -5
- data/lib/flipper/metadata.rb +8 -1
- data/lib/flipper/middleware/memoizer.rb +30 -14
- data/lib/flipper/model/active_record.rb +23 -0
- data/lib/flipper/poller.rb +118 -0
- data/lib/flipper/serializers/gzip.rb +22 -0
- data/lib/flipper/serializers/json.rb +17 -0
- data/lib/flipper/spec/shared_adapter_specs.rb +105 -63
- data/lib/flipper/test/shared_adapter_test.rb +101 -58
- data/lib/flipper/test_help.rb +43 -0
- data/lib/flipper/typecast.rb +59 -18
- data/lib/flipper/types/actor.rb +13 -13
- data/lib/flipper/types/group.rb +4 -4
- data/lib/flipper/types/percentage.rb +1 -1
- data/lib/flipper/version.rb +11 -1
- data/lib/flipper.rb +50 -11
- data/lib/generators/flipper/setup_generator.rb +68 -0
- data/lib/generators/flipper/templates/initializer.rb +45 -0
- data/lib/generators/flipper/templates/update/migrations/01_create_flipper_tables.rb.erb +22 -0
- data/lib/generators/flipper/templates/update/migrations/02_change_flipper_gates_value_to_text.rb.erb +18 -0
- data/lib/generators/flipper/update_generator.rb +35 -0
- data/package-lock.json +41 -0
- data/package.json +10 -0
- data/spec/fixtures/environment.rb +1 -0
- data/spec/fixtures/flipper_pstore_1679087600.json +46 -0
- data/spec/flipper/adapter_builder_spec.rb +72 -0
- data/spec/flipper/adapter_spec.rb +30 -2
- data/spec/flipper/adapters/actor_limit_spec.rb +20 -0
- data/spec/flipper/adapters/dual_write_spec.rb +2 -2
- data/spec/flipper/adapters/http/client_spec.rb +61 -0
- data/spec/flipper/adapters/http_spec.rb +138 -55
- data/spec/flipper/adapters/instrumented_spec.rb +29 -11
- data/spec/flipper/adapters/memoizable_spec.rb +51 -31
- data/spec/flipper/adapters/memory_spec.rb +14 -3
- data/spec/flipper/adapters/operation_logger_spec.rb +31 -12
- data/spec/flipper/adapters/poll_spec.rb +41 -0
- data/spec/flipper/adapters/read_only_spec.rb +32 -17
- data/spec/flipper/adapters/strict_spec.rb +64 -0
- data/spec/flipper/adapters/sync/feature_synchronizer_spec.rb +27 -0
- data/spec/flipper/cli_spec.rb +166 -0
- data/spec/flipper/cloud/configuration_spec.rb +251 -0
- data/spec/flipper/cloud/dsl_spec.rb +82 -0
- data/spec/flipper/cloud/message_verifier_spec.rb +104 -0
- data/spec/flipper/cloud/middleware_spec.rb +289 -0
- data/spec/flipper/cloud/telemetry/backoff_policy_spec.rb +107 -0
- data/spec/flipper/cloud/telemetry/metric_spec.rb +87 -0
- data/spec/flipper/cloud/telemetry/metric_storage_spec.rb +58 -0
- data/spec/flipper/cloud/telemetry/submitter_spec.rb +145 -0
- data/spec/flipper/cloud/telemetry_spec.rb +208 -0
- data/spec/flipper/cloud_spec.rb +186 -0
- data/spec/flipper/configuration_spec.rb +17 -0
- data/spec/flipper/dsl_spec.rb +54 -76
- data/spec/flipper/engine_spec.rb +374 -0
- data/spec/flipper/export_spec.rb +13 -0
- data/spec/flipper/exporter_spec.rb +16 -0
- data/spec/flipper/exporters/json/export_spec.rb +60 -0
- data/spec/flipper/exporters/json/v1_spec.rb +33 -0
- data/spec/flipper/expression/builder_spec.rb +248 -0
- data/spec/flipper/expression_spec.rb +188 -0
- data/spec/flipper/expressions/all_spec.rb +15 -0
- data/spec/flipper/expressions/any_spec.rb +15 -0
- data/spec/flipper/expressions/boolean_spec.rb +15 -0
- data/spec/flipper/expressions/duration_spec.rb +43 -0
- data/spec/flipper/expressions/equal_spec.rb +24 -0
- data/spec/flipper/expressions/greater_than_or_equal_to_spec.rb +28 -0
- data/spec/flipper/expressions/greater_than_spec.rb +28 -0
- data/spec/flipper/expressions/less_than_or_equal_to_spec.rb +28 -0
- data/spec/flipper/expressions/less_than_spec.rb +32 -0
- data/spec/flipper/expressions/not_equal_spec.rb +15 -0
- data/spec/flipper/expressions/now_spec.rb +11 -0
- data/spec/flipper/expressions/number_spec.rb +21 -0
- data/spec/flipper/expressions/percentage_of_actors_spec.rb +20 -0
- data/spec/flipper/expressions/percentage_spec.rb +15 -0
- data/spec/flipper/expressions/property_spec.rb +13 -0
- data/spec/flipper/expressions/random_spec.rb +9 -0
- data/spec/flipper/expressions/string_spec.rb +11 -0
- data/spec/flipper/expressions/time_spec.rb +13 -0
- data/spec/flipper/feature_check_context_spec.rb +17 -17
- data/spec/flipper/feature_spec.rb +453 -39
- data/spec/flipper/gate_values_spec.rb +2 -33
- data/spec/flipper/gates/boolean_spec.rb +1 -1
- data/spec/flipper/gates/expression_spec.rb +108 -0
- data/spec/flipper/gates/group_spec.rb +2 -3
- data/spec/flipper/gates/percentage_of_actors_spec.rb +61 -5
- data/spec/flipper/gates/percentage_of_time_spec.rb +2 -2
- data/spec/flipper/identifier_spec.rb +4 -5
- data/spec/flipper/instrumentation/log_subscriber_spec.rb +24 -6
- data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +26 -2
- data/spec/flipper/middleware/memoizer_spec.rb +79 -10
- data/spec/flipper/model/active_record_spec.rb +72 -0
- data/spec/flipper/poller_spec.rb +47 -0
- data/spec/flipper/serializers/gzip_spec.rb +13 -0
- data/spec/flipper/serializers/json_spec.rb +13 -0
- data/spec/flipper/typecast_spec.rb +121 -6
- data/spec/flipper/types/actor_spec.rb +63 -46
- data/spec/flipper/types/group_spec.rb +2 -2
- data/spec/flipper_integration_spec.rb +168 -58
- data/spec/flipper_spec.rb +94 -30
- data/spec/spec_helper.rb +18 -18
- data/spec/support/actor_names.yml +1 -0
- data/spec/support/fail_on_output.rb +8 -0
- data/spec/support/fake_backoff_policy.rb +15 -0
- data/spec/support/skippable.rb +18 -0
- data/spec/support/spec_helpers.rb +34 -8
- data/test/adapters/actor_limit_test.rb +20 -0
- data/test_rails/generators/flipper/setup_generator_test.rb +69 -0
- data/test_rails/generators/flipper/update_generator_test.rb +96 -0
- data/test_rails/helper.rb +22 -2
- data/test_rails/system/test_help_test.rb +52 -0
- metadata +203 -20
- data/.github/workflows/release.yml +0 -44
- data/.tool-versions +0 -1
- data/lib/flipper/railtie.rb +0 -47
- data/spec/flipper/railtie_spec.rb +0 -109
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f53e9dadf45ea1d00e7abd24358748347d516d761ea347c438057f62fdbc185
|
4
|
+
data.tar.gz: 8c2a73d793d41ce64ed26c559bf532127f73e17e20944930aa6bf14aff355a57
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af26df5e8c10540348e2b8dd31f11198dafdc8f3bcb6ef8e5361e3a764caa5a872734c64807746f1d077cfbc95df9143959e4c3446429dce1d5d871e46861fa7
|
7
|
+
data.tar.gz: 2005a736ea665c359154bf85f56495fcf9b326e9ecb740d2e1aca0c52a698367b44334a90ae2b1277c2a3c0dcdddcc478eab3126975f210fc796a454202913f4
|
data/.github/FUNDING.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
github: flippercloud
|
data/.github/workflows/ci.yml
CHANGED
@@ -7,56 +7,101 @@ jobs:
|
|
7
7
|
services:
|
8
8
|
redis:
|
9
9
|
image: redis
|
10
|
-
ports: [
|
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: [
|
19
|
-
rails: [
|
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.
|
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@
|
91
|
+
uses: actions/checkout@v4
|
42
92
|
- name: Do some action caching
|
43
|
-
uses: actions/cache@
|
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
|
-
|
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
|
-
|
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 == '
|
6
|
-
name:
|
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: [
|
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: [
|
20
|
-
rails: [
|
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.
|
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@
|
73
|
+
uses: actions/checkout@v4
|
44
74
|
- name: Do some action caching
|
45
|
-
uses: actions/cache@
|
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
|
-
|
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).
|