flipper 0.16.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.codeclimate.yml +1 -0
- data/.github/FUNDING.yml +1 -0
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/ci.yml +110 -0
- data/.github/workflows/examples.yml +105 -0
- data/.github/workflows/release.yml +54 -0
- data/.rspec +1 -0
- data/CLAUDE.md +87 -0
- data/Changelog.md +2 -215
- data/Dockerfile +1 -1
- data/Gemfile +28 -20
- data/README.md +72 -62
- data/Rakefile +13 -3
- 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/docker-compose.yml +37 -34
- data/docs/DockerCompose.md +0 -1
- data/docs/README.md +1 -0
- data/docs/images/banner.jpg +0 -0
- data/docs/images/flipper_cloud.png +0 -0
- data/examples/api/basic.ru +18 -0
- data/examples/api/custom_memoized.ru +36 -0
- data/examples/api/memoized.ru +42 -0
- data/examples/basic.rb +1 -12
- 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/poll_interval/README.md +111 -0
- data/examples/cloud/poll_interval/client.rb +108 -0
- data/examples/cloud/poll_interval/server.rb +98 -0
- data/examples/cloud/threaded.rb +33 -0
- data/examples/configuring_default.rb +2 -5
- data/examples/dsl.rb +10 -35
- data/examples/enabled_for_actor.rb +10 -15
- data/examples/expressions.rb +237 -0
- data/examples/group.rb +3 -6
- data/examples/group_dynamic_lookup.rb +5 -19
- data/examples/group_with_members.rb +4 -14
- data/examples/importing.rb +1 -1
- data/examples/individual_actor.rb +2 -5
- data/examples/instrumentation.rb +2 -2
- data/examples/instrumentation_last_accessed_at.rb +38 -0
- data/examples/memoizing.rb +35 -0
- data/examples/mirroring.rb +59 -0
- data/examples/percentage_of_actors.rb +6 -16
- data/examples/percentage_of_actors_enabled_check.rb +7 -10
- data/examples/percentage_of_actors_group.rb +5 -18
- data/examples/percentage_of_time.rb +3 -6
- data/examples/strict.rb +18 -0
- data/exe/flipper +5 -0
- data/flipper-cloud.gemspec +19 -0
- data/flipper.gemspec +10 -7
- data/lib/flipper/actor.rb +10 -3
- data/lib/flipper/adapter.rb +50 -8
- data/lib/flipper/adapter_builder.rb +44 -0
- data/lib/flipper/adapters/actor_limit.rb +54 -0
- data/lib/flipper/adapters/cache_base.rb +161 -0
- data/lib/flipper/adapters/dual_write.rb +63 -0
- data/lib/flipper/adapters/failover.rb +85 -0
- data/lib/flipper/adapters/failsafe.rb +72 -0
- data/lib/flipper/adapters/http/client.rb +64 -7
- data/lib/flipper/adapters/http/error.rb +19 -1
- data/lib/flipper/adapters/http.rb +97 -43
- data/lib/flipper/adapters/instrumented.rb +47 -26
- data/lib/flipper/adapters/memoizable.rb +44 -40
- data/lib/flipper/adapters/memory.rb +75 -111
- data/lib/flipper/adapters/operation_logger.rb +22 -78
- data/lib/flipper/adapters/poll/poller.rb +2 -0
- data/lib/flipper/adapters/poll.rb +52 -0
- data/lib/flipper/adapters/pstore.rb +27 -17
- 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 +14 -1
- data/lib/flipper/adapters/sync/interval_synchronizer.rb +2 -7
- data/lib/flipper/adapters/sync/synchronizer.rb +13 -6
- data/lib/flipper/adapters/sync.rb +23 -29
- data/lib/flipper/adapters/wrapper.rb +54 -0
- data/lib/flipper/cli.rb +314 -0
- data/lib/flipper/cloud/configuration.rb +271 -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/migrate.rb +71 -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 +54 -0
- data/lib/flipper/configuration.rb +54 -7
- data/lib/flipper/dsl.rb +58 -47
- data/lib/flipper/engine.rb +102 -0
- data/lib/flipper/errors.rb +3 -21
- 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/equal.rb +9 -0
- data/lib/flipper/expressions/feature_enabled.rb +34 -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 +16 -0
- data/lib/flipper/feature.rb +95 -28
- 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 +17 -0
- 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/instrumenters/memory.rb +6 -2
- data/lib/flipper/metadata.rb +8 -1
- data/lib/flipper/middleware/memoizer.rb +46 -27
- data/lib/flipper/middleware/setup_env.rb +13 -3
- data/lib/flipper/model/active_record.rb +23 -0
- data/lib/flipper/poller.rb +157 -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 +122 -56
- data/lib/flipper/test/shared_adapter_test.rb +120 -52
- data/lib/flipper/test_help.rb +43 -0
- data/lib/flipper/typecast.rb +59 -18
- data/lib/flipper/types/actor.rb +19 -13
- data/lib/flipper/types/group.rb +12 -5
- data/lib/flipper/types/percentage.rb +1 -1
- data/lib/flipper/version.rb +11 -1
- data/lib/flipper.rb +71 -12
- 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/actor_spec.rb +10 -2
- data/spec/flipper/adapter_builder_spec.rb +72 -0
- data/spec/flipper/adapter_spec.rb +52 -6
- data/spec/flipper/adapters/actor_limit_spec.rb +75 -0
- data/spec/flipper/adapters/dual_write_spec.rb +82 -0
- data/spec/flipper/adapters/failover_spec.rb +141 -0
- data/spec/flipper/adapters/failsafe_spec.rb +58 -0
- data/spec/flipper/adapters/http/client_spec.rb +61 -0
- data/spec/flipper/adapters/http_spec.rb +402 -65
- data/spec/flipper/adapters/instrumented_spec.rb +31 -13
- data/spec/flipper/adapters/memoizable_spec.rb +51 -33
- data/spec/flipper/adapters/memory_spec.rb +33 -5
- data/spec/flipper/adapters/operation_logger_spec.rb +38 -12
- data/spec/flipper/adapters/poll_spec.rb +41 -0
- data/spec/flipper/adapters/pstore_spec.rb +0 -2
- data/spec/flipper/adapters/read_only_spec.rb +32 -18
- data/spec/flipper/adapters/strict_spec.rb +64 -0
- data/spec/flipper/adapters/sync/feature_synchronizer_spec.rb +39 -1
- data/spec/flipper/adapters/sync/interval_synchronizer_spec.rb +4 -5
- data/spec/flipper/adapters/sync/synchronizer_spec.rb +87 -1
- data/spec/flipper/adapters/sync_spec.rb +17 -6
- data/spec/flipper/cli_spec.rb +217 -0
- data/spec/flipper/cloud/configuration_spec.rb +257 -0
- data/spec/flipper/cloud/dsl_spec.rb +90 -0
- data/spec/flipper/cloud/message_verifier_spec.rb +104 -0
- data/spec/flipper/cloud/middleware_spec.rb +307 -0
- data/spec/flipper/cloud/migrate_spec.rb +160 -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 +37 -3
- data/spec/flipper/dsl_spec.rb +67 -80
- 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/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 +29 -0
- data/spec/flipper/feature_check_context_spec.rb +18 -20
- data/spec/flipper/feature_spec.rb +461 -48
- data/spec/flipper/gate_spec.rb +0 -2
- data/spec/flipper/gate_values_spec.rb +2 -34
- data/spec/flipper/gates/actor_spec.rb +0 -2
- data/spec/flipper/gates/boolean_spec.rb +1 -3
- data/spec/flipper/gates/expression_spec.rb +190 -0
- data/spec/flipper/gates/group_spec.rb +2 -5
- data/spec/flipper/gates/percentage_of_actors_spec.rb +61 -7
- data/spec/flipper/gates/percentage_of_time_spec.rb +2 -4
- data/spec/flipper/identifier_spec.rb +12 -0
- data/spec/flipper/instrumentation/log_subscriber_spec.rb +24 -7
- data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +26 -3
- data/spec/flipper/instrumenters/memory_spec.rb +18 -1
- data/spec/flipper/instrumenters/noop_spec.rb +14 -8
- data/spec/flipper/middleware/memoizer_spec.rb +199 -62
- data/spec/flipper/middleware/setup_env_spec.rb +23 -5
- data/spec/flipper/model/active_record_spec.rb +72 -0
- data/spec/flipper/poller_spec.rb +390 -0
- data/spec/flipper/registry_spec.rb +0 -1
- 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 -7
- data/spec/flipper/types/actor_spec.rb +63 -47
- data/spec/flipper/types/boolean_spec.rb +0 -1
- data/spec/flipper/types/group_spec.rb +24 -3
- data/spec/flipper/types/percentage_of_actors_spec.rb +0 -1
- data/spec/flipper/types/percentage_of_time_spec.rb +0 -1
- data/spec/flipper/types/percentage_spec.rb +0 -1
- data/spec/{integration_spec.rb → flipper_integration_spec.rb} +301 -59
- data/spec/flipper_spec.rb +123 -29
- data/spec/{helper.rb → spec_helper.rb} +23 -21
- data/spec/support/actor_names.yml +1 -0
- data/spec/support/descriptions.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 +53 -6
- data/test/adapters/actor_limit_test.rb +20 -0
- data/test/test_helper.rb +2 -1
- 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 +31 -0
- data/test_rails/system/test_help_test.rb +52 -0
- metadata +200 -82
- data/.rubocop.yml +0 -54
- data/.rubocop_todo.yml +0 -199
- data/docs/Adapters.md +0 -124
- data/docs/Caveats.md +0 -4
- data/docs/Gates.md +0 -167
- data/docs/Instrumentation.md +0 -27
- data/docs/Optimization.md +0 -114
- data/docs/api/README.md +0 -849
- data/docs/http/README.md +0 -35
- data/docs/read-only/README.md +0 -21
- data/examples/example_setup.rb +0 -8
- data/test/helper.rb +0 -11
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
require 'bundler/setup'
|
|
2
|
+
require 'flipper'
|
|
3
|
+
|
|
4
|
+
def assert(value)
|
|
5
|
+
if value
|
|
6
|
+
p value
|
|
7
|
+
else
|
|
8
|
+
puts "Expected true but was #{value}. Please correct."
|
|
9
|
+
exit 1
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def refute(value)
|
|
14
|
+
if value
|
|
15
|
+
puts "Expected false but was #{value}. Please correct."
|
|
16
|
+
exit 1
|
|
17
|
+
else
|
|
18
|
+
p value
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def reset
|
|
23
|
+
Flipper.disable_expression :something
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class User < Struct.new(:id, :flipper_properties)
|
|
27
|
+
include Flipper::Identifier
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class Org < Struct.new(:id, :flipper_properties)
|
|
31
|
+
include Flipper::Identifier
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
org = Org.new(1, {
|
|
35
|
+
"type" => "Org",
|
|
36
|
+
"id" => 1,
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
user = User.new(1, {
|
|
40
|
+
"type" => "User",
|
|
41
|
+
"id" => 1,
|
|
42
|
+
"plan" => "basic",
|
|
43
|
+
"age" => 39,
|
|
44
|
+
"team_user" => true,
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
admin_user = User.new(2, {
|
|
48
|
+
"type" => "User",
|
|
49
|
+
"id" => 2,
|
|
50
|
+
"admin" => true,
|
|
51
|
+
"team_user" => true,
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
other_user = User.new(3, {
|
|
55
|
+
"type" => "User",
|
|
56
|
+
"id" => 3,
|
|
57
|
+
"plan" => "plus",
|
|
58
|
+
"age" => 18,
|
|
59
|
+
"org_admin" => true,
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
age_expression = Flipper.property(:age).gte(21)
|
|
63
|
+
plan_expression = Flipper.property(:plan).eq("basic")
|
|
64
|
+
admin_expression = Flipper.property(:admin).eq(true)
|
|
65
|
+
|
|
66
|
+
puts "Single Expression"
|
|
67
|
+
refute Flipper.enabled?(:something, user)
|
|
68
|
+
|
|
69
|
+
puts "Enabling single expression"
|
|
70
|
+
Flipper.enable :something, plan_expression
|
|
71
|
+
assert Flipper.enabled?(:something, user)
|
|
72
|
+
refute Flipper.enabled?(:something, admin_user)
|
|
73
|
+
refute Flipper.enabled?(:something, other_user)
|
|
74
|
+
|
|
75
|
+
puts "Disabling single expression"
|
|
76
|
+
reset
|
|
77
|
+
refute Flipper.enabled?(:something, user)
|
|
78
|
+
|
|
79
|
+
puts "\n\nAny Expression"
|
|
80
|
+
any_expression = Flipper.any(plan_expression, age_expression)
|
|
81
|
+
refute Flipper.enabled?(:something, user)
|
|
82
|
+
|
|
83
|
+
puts "Enabling any expression"
|
|
84
|
+
Flipper.enable :something, any_expression
|
|
85
|
+
assert Flipper.enabled?(:something, user)
|
|
86
|
+
refute Flipper.enabled?(:something, admin_user)
|
|
87
|
+
refute Flipper.enabled?(:something, other_user)
|
|
88
|
+
|
|
89
|
+
puts "Disabling any expression"
|
|
90
|
+
reset
|
|
91
|
+
refute Flipper.enabled?(:something, user)
|
|
92
|
+
|
|
93
|
+
puts "\n\nAll Expression"
|
|
94
|
+
all_expression = Flipper.all(plan_expression, age_expression)
|
|
95
|
+
refute Flipper.enabled?(:something, user)
|
|
96
|
+
|
|
97
|
+
puts "Enabling all expression"
|
|
98
|
+
Flipper.enable :something, all_expression
|
|
99
|
+
assert Flipper.enabled?(:something, user)
|
|
100
|
+
refute Flipper.enabled?(:something, admin_user)
|
|
101
|
+
refute Flipper.enabled?(:something, other_user)
|
|
102
|
+
|
|
103
|
+
puts "Disabling all expression"
|
|
104
|
+
reset
|
|
105
|
+
refute Flipper.enabled?(:something, user)
|
|
106
|
+
|
|
107
|
+
puts "\n\nNested Expression"
|
|
108
|
+
nested_expression = Flipper.any(admin_expression, all_expression)
|
|
109
|
+
refute Flipper.enabled?(:something, user)
|
|
110
|
+
refute Flipper.enabled?(:something, admin_user)
|
|
111
|
+
refute Flipper.enabled?(:something, other_user)
|
|
112
|
+
|
|
113
|
+
puts "Enabling nested expression"
|
|
114
|
+
Flipper.enable :something, nested_expression
|
|
115
|
+
assert Flipper.enabled?(:something, user)
|
|
116
|
+
assert Flipper.enabled?(:something, admin_user)
|
|
117
|
+
refute Flipper.enabled?(:something, other_user)
|
|
118
|
+
|
|
119
|
+
puts "Disabling nested expression"
|
|
120
|
+
reset
|
|
121
|
+
refute Flipper.enabled?(:something, user)
|
|
122
|
+
refute Flipper.enabled?(:something, admin_user)
|
|
123
|
+
refute Flipper.enabled?(:something, other_user)
|
|
124
|
+
|
|
125
|
+
puts "\n\nBoolean Expression"
|
|
126
|
+
boolean_expression = Flipper.boolean(true)
|
|
127
|
+
Flipper.enable :something, boolean_expression
|
|
128
|
+
assert Flipper.enabled?(:something)
|
|
129
|
+
assert Flipper.enabled?(:something, user)
|
|
130
|
+
reset
|
|
131
|
+
|
|
132
|
+
puts "\n\nSet of Actors Expression"
|
|
133
|
+
set_of_actors_expression = Flipper.any(
|
|
134
|
+
Flipper.property(:flipper_id).eq("User;1"),
|
|
135
|
+
Flipper.property(:flipper_id).eq("User;3"),
|
|
136
|
+
)
|
|
137
|
+
Flipper.enable :something, set_of_actors_expression
|
|
138
|
+
assert Flipper.enabled?(:something, user)
|
|
139
|
+
assert Flipper.enabled?(:something, other_user)
|
|
140
|
+
refute Flipper.enabled?(:something, admin_user)
|
|
141
|
+
reset
|
|
142
|
+
|
|
143
|
+
puts "\n\n% of Actors Expression"
|
|
144
|
+
percentage_of_actors = Flipper.property(:flipper_id).percentage_of_actors(30)
|
|
145
|
+
Flipper.enable :something, percentage_of_actors
|
|
146
|
+
refute Flipper.enabled?(:something, user)
|
|
147
|
+
refute Flipper.enabled?(:something, other_user)
|
|
148
|
+
assert Flipper.enabled?(:something, admin_user)
|
|
149
|
+
reset
|
|
150
|
+
|
|
151
|
+
puts "\n\n% of Actors Per Type Expression"
|
|
152
|
+
percentage_of_actors_per_type = Flipper.any(
|
|
153
|
+
Flipper.all(
|
|
154
|
+
Flipper.property(:type).eq("User"),
|
|
155
|
+
Flipper.property(:flipper_id).percentage_of_actors(40),
|
|
156
|
+
),
|
|
157
|
+
Flipper.all(
|
|
158
|
+
Flipper.property(:type).eq("Org"),
|
|
159
|
+
Flipper.property(:flipper_id).percentage_of_actors(10),
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
Flipper.enable :something, percentage_of_actors_per_type
|
|
163
|
+
refute Flipper.enabled?(:something, user) # not in the 40% enabled for Users
|
|
164
|
+
assert Flipper.enabled?(:something, other_user)
|
|
165
|
+
assert Flipper.enabled?(:something, admin_user)
|
|
166
|
+
refute Flipper.enabled?(:something, org) # not in the 10% of enabled for Orgs
|
|
167
|
+
reset
|
|
168
|
+
|
|
169
|
+
puts "\n\nPercentage of Time Expression"
|
|
170
|
+
percentage_of_time_expression = Flipper.random(100).lt(50)
|
|
171
|
+
Flipper.enable :something, percentage_of_time_expression
|
|
172
|
+
results = (1..10000).map { |n| Flipper.enabled?(:something, user) }
|
|
173
|
+
enabled, disabled = results.partition { |r| r }
|
|
174
|
+
p enabled: enabled.size
|
|
175
|
+
p disabled: disabled.size
|
|
176
|
+
assert (4_700..5_200).include?(enabled.size)
|
|
177
|
+
assert (4_700..5_200).include?(disabled.size)
|
|
178
|
+
reset
|
|
179
|
+
|
|
180
|
+
puts "\n\nChanging single expression to all expression"
|
|
181
|
+
Flipper.enable :something, plan_expression
|
|
182
|
+
Flipper.enable :something, Flipper.expression(:something).all.add(age_expression)
|
|
183
|
+
assert Flipper.enabled?(:something, user)
|
|
184
|
+
refute Flipper.enabled?(:something, admin_user)
|
|
185
|
+
refute Flipper.enabled?(:something, other_user)
|
|
186
|
+
|
|
187
|
+
puts "\n\nChanging single expression to any expression"
|
|
188
|
+
Flipper.enable :something, plan_expression
|
|
189
|
+
Flipper.enable :something, Flipper.expression(:something).any.add(age_expression, admin_expression)
|
|
190
|
+
assert Flipper.enabled?(:something, user)
|
|
191
|
+
assert Flipper.enabled?(:something, admin_user)
|
|
192
|
+
refute Flipper.enabled?(:something, other_user)
|
|
193
|
+
|
|
194
|
+
puts "\n\nChanging single expression to any expression by adding to condition"
|
|
195
|
+
Flipper.enable :something, plan_expression
|
|
196
|
+
Flipper.enable :something, Flipper.expression(:something).add(admin_expression)
|
|
197
|
+
assert Flipper.enabled?(:something, user)
|
|
198
|
+
assert Flipper.enabled?(:something, admin_user)
|
|
199
|
+
refute Flipper.enabled?(:something, other_user)
|
|
200
|
+
|
|
201
|
+
puts "\n\nEnabling based on time (epoch)"
|
|
202
|
+
scheduled_epoch = Flipper.now.gte(Flipper.time(Time.now.to_i - 86_400))
|
|
203
|
+
Flipper.enable :something, scheduled_epoch
|
|
204
|
+
assert Flipper.enabled?(:something, user)
|
|
205
|
+
assert Flipper.enabled?(:something, admin_user)
|
|
206
|
+
assert Flipper.enabled?(:something, other_user)
|
|
207
|
+
reset
|
|
208
|
+
|
|
209
|
+
puts "\n\nEnabling based on time (datetime)"
|
|
210
|
+
past_time = (Time.now.utc - 86_400).iso8601
|
|
211
|
+
scheduled_datetime = Flipper.now.gte(Flipper.time(past_time))
|
|
212
|
+
Flipper.enable :something, scheduled_datetime
|
|
213
|
+
assert Flipper.enabled?(:something, user)
|
|
214
|
+
assert Flipper.enabled?(:something, admin_user)
|
|
215
|
+
assert Flipper.enabled?(:something, other_user)
|
|
216
|
+
reset
|
|
217
|
+
|
|
218
|
+
puts "\n\nDisabling after a time (expiring feature)"
|
|
219
|
+
future_time = (Time.now.utc + 86_400).iso8601
|
|
220
|
+
expiring_expression = Flipper.now.lt(Flipper.time(future_time))
|
|
221
|
+
Flipper.enable :something, expiring_expression
|
|
222
|
+
assert Flipper.enabled?(:something, user)
|
|
223
|
+
assert Flipper.enabled?(:something, admin_user)
|
|
224
|
+
assert Flipper.enabled?(:something, other_user)
|
|
225
|
+
reset
|
|
226
|
+
|
|
227
|
+
puts "\n\nEnabling within a time window"
|
|
228
|
+
start_time = (Time.now.utc - 86_400).iso8601
|
|
229
|
+
end_time = (Time.now.utc + 86_400).iso8601
|
|
230
|
+
time_window = Flipper.all(
|
|
231
|
+
Flipper.now.gte(Flipper.time(start_time)),
|
|
232
|
+
Flipper.now.lt(Flipper.time(end_time))
|
|
233
|
+
)
|
|
234
|
+
Flipper.enable :something, time_window
|
|
235
|
+
assert Flipper.enabled?(:something, user)
|
|
236
|
+
assert Flipper.enabled?(:something, admin_user)
|
|
237
|
+
assert Flipper.enabled?(:something, other_user)
|
data/examples/group.rb
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
require
|
|
2
|
-
|
|
1
|
+
require 'bundler/setup'
|
|
3
2
|
require 'flipper'
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
flipper = Flipper.new(adapter)
|
|
7
|
-
stats = flipper[:stats]
|
|
4
|
+
stats = Flipper[:stats]
|
|
8
5
|
|
|
9
6
|
# Register group
|
|
10
7
|
Flipper.register(:admins) do |actor|
|
|
@@ -35,7 +32,7 @@ puts "Stats for admin: #{stats.enabled?(admin)}"
|
|
|
35
32
|
puts "Stats for non_admin: #{stats.enabled?(non_admin)}"
|
|
36
33
|
|
|
37
34
|
puts "\nEnabling Stats for admins...\n\n"
|
|
38
|
-
stats.
|
|
35
|
+
stats.enable_group :admins
|
|
39
36
|
|
|
40
37
|
puts "Stats for admin: #{stats.enabled?(admin)}"
|
|
41
38
|
puts "Stats for non_admin: #{stats.enabled?(non_admin)}"
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
require
|
|
2
|
-
|
|
1
|
+
require 'bundler/setup'
|
|
3
2
|
require 'flipper'
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
flipper = Flipper.new(adapter)
|
|
7
|
-
stats = flipper[:stats]
|
|
4
|
+
stats = Flipper[:stats]
|
|
8
5
|
|
|
9
6
|
# Register group
|
|
10
7
|
Flipper.register(:enabled_team_member) do |actor, context|
|
|
@@ -15,19 +12,12 @@ Flipper.register(:enabled_team_member) do |actor, context|
|
|
|
15
12
|
end
|
|
16
13
|
|
|
17
14
|
# Some class that represents actor that will be trying to do something
|
|
18
|
-
class User
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def initialize(id)
|
|
22
|
-
@id = id
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def flipper_id
|
|
26
|
-
"User;#{@id}"
|
|
27
|
-
end
|
|
15
|
+
class User < Struct.new(:id)
|
|
16
|
+
include Flipper::Identifier
|
|
28
17
|
end
|
|
29
18
|
|
|
30
19
|
class Team
|
|
20
|
+
include Flipper::Identifier
|
|
31
21
|
attr_reader :name
|
|
32
22
|
|
|
33
23
|
def self.all
|
|
@@ -51,10 +41,6 @@ class Team
|
|
|
51
41
|
def member?(actor)
|
|
52
42
|
@members.map(&:id).include?(actor.id)
|
|
53
43
|
end
|
|
54
|
-
|
|
55
|
-
def flipper_id
|
|
56
|
-
"Team:#{@name}"
|
|
57
|
-
end
|
|
58
44
|
end
|
|
59
45
|
|
|
60
46
|
jnunemaker = User.new("jnunemaker")
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
require
|
|
2
|
-
|
|
1
|
+
require 'bundler/setup'
|
|
3
2
|
require 'flipper'
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
flipper = Flipper.new(adapter)
|
|
7
|
-
stats = flipper[:stats]
|
|
4
|
+
stats = Flipper[:stats]
|
|
8
5
|
|
|
9
6
|
# Register group
|
|
10
7
|
Flipper.register(:team_actor) do |actor|
|
|
@@ -12,15 +9,8 @@ Flipper.register(:team_actor) do |actor|
|
|
|
12
9
|
end
|
|
13
10
|
|
|
14
11
|
# Some class that represents actor that will be trying to do something
|
|
15
|
-
class User
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def initialize(id)
|
|
19
|
-
@id = id
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Must respond to flipper_id
|
|
23
|
-
alias_method :flipper_id, :id
|
|
12
|
+
class User < Struct.new(:id)
|
|
13
|
+
include Flipper::Identifier
|
|
24
14
|
end
|
|
25
15
|
|
|
26
16
|
class Team
|
data/examples/importing.rb
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
require
|
|
2
|
-
|
|
1
|
+
require 'bundler/setup'
|
|
3
2
|
require 'flipper'
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
flipper = Flipper.new(adapter)
|
|
7
|
-
stats = flipper[:stats]
|
|
4
|
+
stats = Flipper[:stats]
|
|
8
5
|
|
|
9
6
|
# Some class that represents what will be trying to do something
|
|
10
7
|
class User
|
data/examples/instrumentation.rb
CHANGED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Quick example of how to keep track of when a feature was last checked.
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
require 'securerandom'
|
|
4
|
+
require 'active_support/isolated_execution_state'
|
|
5
|
+
require 'active_support/notifications'
|
|
6
|
+
require 'flipper'
|
|
7
|
+
|
|
8
|
+
class FlipperSubscriber
|
|
9
|
+
def self.stats
|
|
10
|
+
@stats ||= {}
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def call(name, start, finish, id, payload)
|
|
14
|
+
if payload[:operation] == :enabled?
|
|
15
|
+
feature_name = payload.fetch(:feature_name)
|
|
16
|
+
self.class.stats[feature_name] = Time.now
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
ActiveSupport::Notifications.subscribe(/feature_operation.flipper/, new)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Flipper.configure do |config|
|
|
24
|
+
config.default {
|
|
25
|
+
Flipper.new(config.adapter, instrumenter: ActiveSupport::Notifications)
|
|
26
|
+
}
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
Flipper.enabled?(:search)
|
|
30
|
+
Flipper.enabled?(:booyeah)
|
|
31
|
+
Flipper.enabled?(:hooray)
|
|
32
|
+
sleep 1
|
|
33
|
+
Flipper.enabled?(:booyeah)
|
|
34
|
+
Flipper.enabled?(:hooray)
|
|
35
|
+
sleep 1
|
|
36
|
+
Flipper.enabled?(:hooray)
|
|
37
|
+
|
|
38
|
+
pp FlipperSubscriber.stats
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'bundler/setup'
|
|
2
|
+
require 'flipper'
|
|
3
|
+
require 'flipper/adapters/operation_logger'
|
|
4
|
+
require 'flipper/instrumentation/log_subscriber'
|
|
5
|
+
|
|
6
|
+
Flipper.configure do |config|
|
|
7
|
+
config.adapter do
|
|
8
|
+
# pick an adapter, this uses memory, any will do
|
|
9
|
+
Flipper::Adapters::OperationLogger.new(Flipper::Adapters::Memory.new)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Flipper.enable(:foo)
|
|
14
|
+
Flipper.enable(:bar)
|
|
15
|
+
Flipper.disable(:baz)
|
|
16
|
+
Flipper.disable(:wick)
|
|
17
|
+
# reset the operation logging adapter to empty for clarity
|
|
18
|
+
Flipper.adapter.reset
|
|
19
|
+
|
|
20
|
+
# Turn on memoization (the memoizing middleware does this per request).
|
|
21
|
+
Flipper.memoize = true
|
|
22
|
+
|
|
23
|
+
# Preload all the features.
|
|
24
|
+
Flipper.preload_all
|
|
25
|
+
|
|
26
|
+
# Do as many feature checks as your heart desires.
|
|
27
|
+
%w[foo bar baz wick].each do |name|
|
|
28
|
+
Flipper.enabled?(name)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# See that only one operation exists, a get_all (which is the preload_all).
|
|
32
|
+
pp Flipper.adapter.operations
|
|
33
|
+
# [#<Flipper::Adapters::OperationLogger::Operation:0x00007fdcfe1100e8
|
|
34
|
+
# @args=[],
|
|
35
|
+
# @type=:get_all>]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'bundler/setup'
|
|
2
|
+
require_relative 'active_record/ar_setup'
|
|
3
|
+
require 'flipper'
|
|
4
|
+
require 'flipper/adapters/redis'
|
|
5
|
+
require 'flipper/adapters/active_record'
|
|
6
|
+
|
|
7
|
+
# Say you have production...
|
|
8
|
+
production_adapter = Flipper::Adapters::Memory.new
|
|
9
|
+
production = Flipper.new(production_adapter)
|
|
10
|
+
|
|
11
|
+
# And production has some stuff enabled...
|
|
12
|
+
production.enable(:search)
|
|
13
|
+
production.enable_percentage_of_time(:verbose_logging, 5)
|
|
14
|
+
production.enable_percentage_of_actors(:new_feature, 5)
|
|
15
|
+
production.enable_actor(:issues, Flipper::Actor.new('1'))
|
|
16
|
+
production.enable_actor(:issues, Flipper::Actor.new('2'))
|
|
17
|
+
production.enable_group(:request_tracing, :staff)
|
|
18
|
+
|
|
19
|
+
# And you would like to mirror production to staging...
|
|
20
|
+
staging_adapter = Flipper::Adapters::Memory.new
|
|
21
|
+
staging = Flipper.new(staging_adapter)
|
|
22
|
+
staging_export = staging.export
|
|
23
|
+
|
|
24
|
+
puts "Here is the state of the world for staging and production..."
|
|
25
|
+
puts "Staging"
|
|
26
|
+
staging.features.each do |feature|
|
|
27
|
+
pp feature: feature.key, values: feature.gate_values
|
|
28
|
+
end
|
|
29
|
+
puts "Production"
|
|
30
|
+
production.features.each do |feature|
|
|
31
|
+
pp feature: feature.key, values: feature.gate_values
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# NOTE: This wipes active record clean and copies features/gates from redis into active record.
|
|
35
|
+
puts "Mirroring production to staging..."
|
|
36
|
+
staging.import(production.export)
|
|
37
|
+
puts "Staging is now identical to Production."
|
|
38
|
+
|
|
39
|
+
puts "Staging"
|
|
40
|
+
staging.features.each do |feature|
|
|
41
|
+
pp feature: feature.key, values: feature.gate_values
|
|
42
|
+
end
|
|
43
|
+
puts "Production"
|
|
44
|
+
production.features.each do |feature|
|
|
45
|
+
pp feature: feature.key, values: feature.gate_values
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
puts "Restoring staging to original state..."
|
|
49
|
+
staging.import(staging_export)
|
|
50
|
+
puts "Staging restored."
|
|
51
|
+
|
|
52
|
+
puts "Staging"
|
|
53
|
+
staging.features.each do |feature|
|
|
54
|
+
pp feature: feature.key, values: feature.gate_values
|
|
55
|
+
end
|
|
56
|
+
puts "Production"
|
|
57
|
+
production.features.each do |feature|
|
|
58
|
+
pp feature: feature.key, values: feature.gate_values
|
|
59
|
+
end
|
|
@@ -1,21 +1,11 @@
|
|
|
1
|
-
require
|
|
2
|
-
|
|
1
|
+
require 'bundler/setup'
|
|
3
2
|
require 'flipper'
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
flipper = Flipper.new(adapter)
|
|
7
|
-
stats = flipper[:stats]
|
|
4
|
+
stats = Flipper[:stats]
|
|
8
5
|
|
|
9
6
|
# Some class that represents what will be trying to do something
|
|
10
|
-
class User
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def initialize(id)
|
|
14
|
-
@id = id
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# Must respond to flipper_id
|
|
18
|
-
alias_method :flipper_id, :id
|
|
7
|
+
class User < Struct.new(:id)
|
|
8
|
+
include Flipper::Identifier
|
|
19
9
|
end
|
|
20
10
|
|
|
21
11
|
total = 100_000
|
|
@@ -24,10 +14,10 @@ total = 100_000
|
|
|
24
14
|
users = (1..total).map { |n| User.new(n) }
|
|
25
15
|
|
|
26
16
|
perform_test = lambda { |number|
|
|
27
|
-
|
|
17
|
+
Flipper.enable_percentage_of_actors :stats, number
|
|
28
18
|
|
|
29
19
|
enabled = users.map { |user|
|
|
30
|
-
|
|
20
|
+
Flipper.enabled?(:stats, user) ? true : nil
|
|
31
21
|
}.compact
|
|
32
22
|
|
|
33
23
|
actual = (enabled.size / total.to_f * 100).round(3)
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
require
|
|
2
|
-
|
|
1
|
+
require 'bundler/setup'
|
|
3
2
|
require 'flipper'
|
|
4
3
|
|
|
5
|
-
adapter = Flipper::Adapters::Memory.new
|
|
6
|
-
flipper = Flipper.new(adapter)
|
|
7
|
-
|
|
8
4
|
# Some class that represents what will be trying to do something
|
|
9
5
|
class User
|
|
10
6
|
attr_reader :id
|
|
@@ -18,15 +14,16 @@ class User
|
|
|
18
14
|
end
|
|
19
15
|
|
|
20
16
|
# checking a bunch
|
|
21
|
-
gate = Flipper::Gates::PercentageOfActors.new
|
|
22
|
-
feature_name = "data_migration"
|
|
23
|
-
percentage_enabled = 10
|
|
24
17
|
total = 20_000
|
|
25
18
|
enabled = []
|
|
19
|
+
percentage_enabled = 10
|
|
20
|
+
|
|
21
|
+
feature = Flipper[:data_migration]
|
|
22
|
+
feature.enable_percentage_of_actors 10
|
|
26
23
|
|
|
27
24
|
(1..total).each do |id|
|
|
28
25
|
user = User.new(id)
|
|
29
|
-
if
|
|
26
|
+
if feature.enabled? user
|
|
30
27
|
enabled << user
|
|
31
28
|
end
|
|
32
29
|
end
|
|
@@ -35,4 +32,4 @@ p actual: enabled.size, expected: total * (percentage_enabled * 0.01)
|
|
|
35
32
|
|
|
36
33
|
# checking one
|
|
37
34
|
user = User.new(1)
|
|
38
|
-
p user_1_enabled:
|
|
35
|
+
p user_1_enabled: feature.enabled?(user)
|
|
@@ -3,25 +3,12 @@
|
|
|
3
3
|
# feature for actors in a particular location or on a particular plan, but only
|
|
4
4
|
# for a percentage of them. The percentage is a constant, but could easily be
|
|
5
5
|
# plucked from memcached, redis, mysql or whatever.
|
|
6
|
-
require
|
|
6
|
+
require 'bundler/setup'
|
|
7
7
|
require 'flipper'
|
|
8
8
|
|
|
9
|
-
adapter = Flipper::Adapters::Memory.new
|
|
10
|
-
flipper = Flipper.new(adapter)
|
|
11
|
-
stats = flipper[:stats]
|
|
12
|
-
|
|
13
9
|
# Some class that represents what will be trying to do something
|
|
14
|
-
class User
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def initialize(id)
|
|
18
|
-
@id = id
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Must respond to flipper_id
|
|
22
|
-
def flipper_id
|
|
23
|
-
"User;#{@id}"
|
|
24
|
-
end
|
|
10
|
+
class User < Struct.new(:id)
|
|
11
|
+
include Flipper::Identifier
|
|
25
12
|
end
|
|
26
13
|
|
|
27
14
|
PERCENTAGE = 50
|
|
@@ -34,13 +21,13 @@ Flipper.register(:experimental) do |actor|
|
|
|
34
21
|
end
|
|
35
22
|
|
|
36
23
|
# enable the experimental group
|
|
37
|
-
|
|
24
|
+
Flipper.enable_group :stats, :experimental
|
|
38
25
|
|
|
39
26
|
# create a bunch of fake users and see how many are enabled
|
|
40
27
|
total = 10_000
|
|
41
28
|
users = (1..total).map { |n| User.new(n) }
|
|
42
29
|
enabled = users.map { |user|
|
|
43
|
-
|
|
30
|
+
Flipper.enabled?(:stats, user) ? true : nil
|
|
44
31
|
}.compact
|
|
45
32
|
|
|
46
33
|
# show the results
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
require
|
|
2
|
-
|
|
1
|
+
require 'bundler/setup'
|
|
3
2
|
require 'flipper'
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
flipper = Flipper.new(adapter)
|
|
7
|
-
logging = flipper[:logging]
|
|
4
|
+
logging = Flipper[:logging]
|
|
8
5
|
|
|
9
6
|
perform_test = lambda do |number|
|
|
10
|
-
logging.
|
|
7
|
+
logging.enable_percentage_of_time number
|
|
11
8
|
|
|
12
9
|
total = 100_000
|
|
13
10
|
enabled = []
|
data/examples/strict.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'bundler/setup'
|
|
2
|
+
require 'flipper'
|
|
3
|
+
|
|
4
|
+
adapter = Flipper::Adapters::Strict.new(Flipper::Adapters::Memory.new)
|
|
5
|
+
flipper = Flipper.new(adapter)
|
|
6
|
+
|
|
7
|
+
begin
|
|
8
|
+
puts "Checking :unknown_feature, which should raise an error."
|
|
9
|
+
flipper.enabled?(:unknown_feature)
|
|
10
|
+
warn "An error was not raised, but should have been"
|
|
11
|
+
exit 1
|
|
12
|
+
rescue Flipper::Adapters::Strict::NotFound => exception
|
|
13
|
+
puts "Ok, the exepcted error was raised: #{exception.message}"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
puts "Flipper.add(:new_feature)"
|
|
17
|
+
flipper.add(:new_feature)
|
|
18
|
+
puts "Flipper.enabled?(:new_feature) => #{flipper.enabled?(:new_feature)}"
|
data/exe/flipper
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require File.expand_path('../lib/flipper/version', __FILE__)
|
|
3
|
+
require File.expand_path('../lib/flipper/metadata', __FILE__)
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |gem|
|
|
6
|
+
gem.authors = ['John Nunemaker']
|
|
7
|
+
gem.email = 'support@flippercloud.io'
|
|
8
|
+
gem.summary = '[DEPRECATED] This gem has been merged into the `flipper` gem'
|
|
9
|
+
gem.license = 'MIT'
|
|
10
|
+
gem.homepage = 'https://www.flippercloud.io'
|
|
11
|
+
|
|
12
|
+
gem.files = [ 'lib/flipper-cloud.rb', 'lib/flipper/version.rb' ]
|
|
13
|
+
gem.name = 'flipper-cloud'
|
|
14
|
+
gem.require_paths = ['lib']
|
|
15
|
+
gem.version = Flipper::VERSION
|
|
16
|
+
gem.metadata = Flipper::METADATA
|
|
17
|
+
|
|
18
|
+
gem.add_dependency 'flipper', "~> #{Flipper::VERSION}"
|
|
19
|
+
end
|