Module: Flipper

Extended by:
Flipper, Forwardable
Included in:
Flipper
Defined in:
lib/flipper/actor.rb,
lib/flipper.rb,
lib/flipper/ui.rb,
lib/flipper/api.rb,
lib/flipper/dsl.rb,
lib/flipper/gate.rb,
lib/flipper/type.rb,
lib/flipper/cloud.rb,
lib/flipper/engine.rb,
lib/flipper/errors.rb,
lib/flipper/export.rb,
lib/flipper/poller.rb,
lib/flipper/adapter.rb,
lib/flipper/feature.rb,
lib/flipper/ui/util.rb,
lib/flipper/version.rb,
lib/flipper/exporter.rb,
lib/flipper/metadata.rb,
lib/flipper/registry.rb,
lib/flipper/typecast.rb,
lib/flipper/ui/error.rb,
lib/flipper/api/error.rb,
lib/flipper/cloud/dsl.rb,
lib/flipper/ui/action.rb,
lib/flipper/api/action.rb,
lib/flipper/expression.rb,
lib/flipper/identifier.rb,
lib/flipper/gate_values.rb,
lib/flipper/gates/actor.rb,
lib/flipper/gates/group.rb,
lib/flipper/types/actor.rb,
lib/flipper/types/group.rb,
lib/flipper/model/sequel.rb,
lib/flipper/adapters/http.rb,
lib/flipper/adapters/poll.rb,
lib/flipper/adapters/sync.rb,
lib/flipper/configuration.rb,
lib/flipper/gates/boolean.rb,
lib/flipper/types/boolean.rb,
lib/flipper/ui/middleware.rb,
lib/flipper/adapters/dalli.rb,
lib/flipper/adapters/mongo.rb,
lib/flipper/adapters/redis.rb,
lib/flipper/api/middleware.rb,
lib/flipper/adapters/memory.rb,
lib/flipper/adapters/moneta.rb,
lib/flipper/adapters/pstore.rb,
lib/flipper/adapters/sequel.rb,
lib/flipper/adapters/strict.rb,
lib/flipper/api/json_params.rb,
lib/flipper/expressions/all.rb,
lib/flipper/expressions/any.rb,
lib/flipper/expressions/now.rb,
lib/flipper/ui/actions/file.rb,
lib/flipper/ui/actions/home.rb,
lib/flipper/adapters/rollout.rb,
lib/flipper/cloud/middleware.rb,
lib/flipper/expressions/time.rb,
lib/flipper/gates/expression.rb,
lib/flipper/types/percentage.rb,
lib/flipper/ui/configuration.rb,
lib/flipper/adapters/failover.rb,
lib/flipper/adapters/failsafe.rb,
lib/flipper/exporters/json/v1.rb,
lib/flipper/expressions/equal.rb,
lib/flipper/ui/actions/export.rb,
lib/flipper/ui/actions/import.rb,
lib/flipper/adapters/read_only.rb,
lib/flipper/api/error_response.rb,
lib/flipper/cloud/instrumenter.rb,
lib/flipper/expression/builder.rb,
lib/flipper/expressions/number.rb,
lib/flipper/expressions/random.rb,
lib/flipper/expressions/string.rb,
lib/flipper/instrumenters/noop.rb,
lib/flipper/ui/actions/feature.rb,
lib/flipper/ui/decorators/gate.rb,
lib/flipper/adapters/dual_write.rb,
lib/flipper/adapters/http/error.rb,
lib/flipper/adapters/memoizable.rb,
lib/flipper/cloud/configuration.rb,
lib/flipper/expression/constant.rb,
lib/flipper/expressions/boolean.rb,
lib/flipper/middleware/memoizer.rb,
lib/flipper/model/active_record.rb,
lib/flipper/ui/actions/features.rb,
lib/flipper/ui/actions/settings.rb,
lib/flipper/adapters/http/client.rb,
lib/flipper/adapters/redis_cache.rb,
lib/flipper/expressions/duration.rb,
lib/flipper/expressions/property.rb,
lib/flipper/instrumenters/memory.rb,
lib/flipper/middleware/setup_env.rb,
lib/flipper/ui/action_collection.rb,
lib/flipper/adapters/instrumented.rb,
lib/flipper/api/action_collection.rb,
lib/flipper/api/v1/actions/actors.rb,
lib/flipper/api/v1/actions/import.rb,
lib/flipper/exporters/json/export.rb,
lib/flipper/expressions/less_than.rb,
lib/flipper/expressions/not_equal.rb,
lib/flipper/feature_check_context.rb,
lib/flipper/ui/decorators/feature.rb,
lib/flipper/adapters/active_record.rb,
lib/flipper/api/v1/actions/feature.rb,
lib/flipper/api/v1/decorators/gate.rb,
lib/flipper/cloud/message_verifier.rb,
lib/flipper/expressions/comparable.rb,
lib/flipper/expressions/percentage.rb,
lib/flipper/ui/actions/actors_gate.rb,
lib/flipper/ui/actions/add_feature.rb,
lib/flipper/ui/actions/groups_gate.rb,
lib/flipper/api/v1/actions/features.rb,
lib/flipper/api/v1/decorators/actor.rb,
lib/flipper/ui/actions/boolean_gate.rb,
lib/flipper/ui/configuration/option.rb,
lib/flipper/expressions/greater_than.rb,
lib/flipper/gates/percentage_of_time.rb,
lib/flipper/test/shared_adapter_test.rb,
lib/flipper/types/percentage_of_time.rb,
lib/flipper/adapters/operation_logger.rb,
lib/flipper/api/v1/decorators/feature.rb,
lib/flipper/adapters/sync/synchronizer.rb,
lib/flipper/api/v1/actions/actors_gate.rb,
lib/flipper/api/v1/actions/groups_gate.rb,
lib/flipper/gates/percentage_of_actors.rb,
lib/flipper/instrumentation/subscriber.rb,
lib/flipper/types/percentage_of_actors.rb,
lib/flipper/api/v1/actions/boolean_gate.rb,
lib/flipper/api/v1/actions/clear_feature.rb,
lib/flipper/api/v1/actions/expression_gate.rb,
lib/flipper/instrumentation/log_subscriber.rb,
lib/flipper/expressions/percentage_of_actors.rb,
lib/flipper/expressions/less_than_or_equal_to.rb,
lib/flipper/instrumentation/statsd_subscriber.rb,
lib/flipper/adapters/sync/feature_synchronizer.rb,
lib/flipper/ui/actions/percentage_of_time_gate.rb,
lib/generators/flipper/active_record_generator.rb,
lib/flipper/adapters/active_support_cache_store.rb,
lib/flipper/adapters/sync/interval_synchronizer.rb,
lib/flipper/expressions/greater_than_or_equal_to.rb,
lib/flipper/ui/actions/percentage_of_actors_gate.rb,
lib/flipper/api/v1/actions/percentage_of_time_gate.rb,
lib/flipper/api/v1/actions/percentage_of_actors_gate.rb

Overview

Simple class for turning a flipper_id into an actor that can be based to Flipper::Feature#enabled?.

Defined Under Namespace

Modules: Adapter, Adapters, Api, Cloud, Exporter, Exporters, Expressions, Gates, Generators, Identifier, Instrumentation, Instrumenters, Middleware, Model, Test, Typecast, Types, UI Classes: Actor, Configuration, DSL, DuplicateGroup, Engine, Error, Export, Expression, Feature, FeatureCheckContext, Gate, GateNotFound, GateValues, InvalidConfigurationValue, Poller, Registry, Type

Constant Summary collapse

InstrumentationNamespace =

Private: The namespace for all instrumented events.

:flipper
VERSION =
'1.0.0'.freeze
METADATA =
{
  "documentation_uri" => "https://www.flippercloud.io/docs",
  "homepage_uri"      => "https://www.flippercloud.io",
  "source_code_uri"   => "https://github.com/flippercloud/flipper",
  "bug_tracker_uri"   => "https://github.com/flippercloud/flipper/issues",
  "changelog_uri"     => "https://github.com/flippercloud/flipper/blob/main/Changelog.md",
}.freeze

Instance Method Summary collapse

Instance Method Details

#all(*args) ⇒ Object



75
76
77
# File 'lib/flipper.rb', line 75

def all(*args)
  Expression.build({ All: args.flatten })
end

#any(*args) ⇒ Object



71
72
73
# File 'lib/flipper.rb', line 71

def any(*args)
  Expression.build({ Any: args.flatten })
end

#boolean(value) ⇒ Object



95
96
97
# File 'lib/flipper.rb', line 95

def boolean(value)
  Expression.build({ Boolean: value })
end

#configurationObject

Public: Returns Flipper::Configuration instance.



28
29
30
# File 'lib/flipper.rb', line 28

def configuration
  @configuration ||= Configuration.new
end

#configuration=(configuration) ⇒ Object

Public: Sets Flipper::Configuration instance.



33
34
35
36
37
# File 'lib/flipper.rb', line 33

def configuration=(configuration)
  # need to reset flipper instance if configuration changes
  self.instance = nil
  @configuration = configuration
end

#configure {|configuration| ... } ⇒ Object

Public: Configure flipper.

Flipper.configure do |config|
  config.adapter { ... }
end

Yields Flipper::Configuration instance.

Yields:



23
24
25
# File 'lib/flipper.rb', line 23

def configure
  yield configuration if block_given?
end

#constant(value) ⇒ Object



79
80
81
# File 'lib/flipper.rb', line 79

def constant(value)
  Expression.build(value)
end

#group(name) ⇒ Object

Public: Fetches a group by name.

name - The Symbol name of the group.

Examples

Flipper.group(:admins)

Returns Flipper::Group.



160
161
162
# File 'lib/flipper.rb', line 160

def group(name)
  groups_registry.get(name) || Types::Group.new(name)
end

#group_exists?(name) ⇒ Boolean

Public: Check if a group exists

Returns boolean

Returns:

  • (Boolean)


147
148
149
# File 'lib/flipper.rb', line 147

def group_exists?(name)
  groups_registry.key?(name)
end

#group_namesObject

Public: Returns a Set of symbols where each symbol is a registered group name. If you just want the names, this is more efficient than doing ‘Flipper.groups.map(&:name)`.



133
134
135
# File 'lib/flipper.rb', line 133

def group_names
  groups_registry.keys.to_set
end

#groupsObject

Public: Returns a Set of registered Types::Group instances.



126
127
128
# File 'lib/flipper.rb', line 126

def groups
  groups_registry.values.to_set
end

#groups_registryObject

Internal: Registry of all groups_registry.



165
166
167
# File 'lib/flipper.rb', line 165

def groups_registry
  @groups_registry ||= Registry.new
end

#groups_registry=(registry) ⇒ Object

Internal: Change the groups_registry registry.



170
171
172
# File 'lib/flipper.rb', line 170

def groups_registry=(registry)
  @groups_registry = registry
end

#instanceObject

Public: Default per thread flipper instance if configured. You should not need to use this directly as most of the Flipper::DSL methods are delegated from Flipper module itself. Instead of doing Flipper.instance.enabled?(:search), you can use Flipper.enabled?(:search) for the same result.

Returns Flipper::DSL instance.



45
46
47
# File 'lib/flipper.rb', line 45

def instance
  Thread.current[:flipper_instance] ||= configuration.default
end

#instance=(flipper) ⇒ Object

Public: Set the flipper instance. It is most common to use the Configuration#default to set this instance, but for things like the test environment, this writer is actually useful.



52
53
54
# File 'lib/flipper.rb', line 52

def instance=(flipper)
  Thread.current[:flipper_instance] = flipper
end

#number(value) ⇒ Object



91
92
93
# File 'lib/flipper.rb', line 91

def number(value)
  Expression.build({ Number: value })
end

#property(name) ⇒ Object



83
84
85
# File 'lib/flipper.rb', line 83

def property(name)
  Expression.build({ Property: name })
end

#random(max) ⇒ Object



99
100
101
# File 'lib/flipper.rb', line 99

def random(max)
  Expression.build({ Random: max })
end

#register(name, &block) ⇒ Object

Public: Use this to register a group by name.

name - The Symbol name of the group. block - The block that should be used to determine if the group matches a

given actor.

Examples

Flipper.register(:admins) { |actor|
  actor.respond_to?(:admin?) && actor.admin?
}

Returns a Flipper::Group. Raises Flipper::DuplicateGroup if the group is already registered.



117
118
119
120
121
122
123
# File 'lib/flipper.rb', line 117

def register(name, &block)
  group = Types::Group.new(name, &block)
  groups_registry.add(group.name, group)
  group
rescue Registry::DuplicateKey
  raise DuplicateGroup, "Group #{name.inspect} has already been registered"
end

#string(value) ⇒ Object



87
88
89
# File 'lib/flipper.rb', line 87

def string(value)
  Expression.build({ String: value })
end

#unregister_groupsObject

Public: Clears the group registry.

Returns nothing.



140
141
142
# File 'lib/flipper.rb', line 140

def unregister_groups
  groups_registry.clear
end