diff --git a/lib/flipper.rb b/lib/flipper.rb index e902b0d8b..87fe8f443 100644 --- a/lib/flipper.rb +++ b/lib/flipper.rb @@ -63,7 +63,7 @@ def instance=(flipper) :enable_group, :disable_group, :enable_percentage_of_actors, :disable_percentage_of_actors, :enable_percentage_of_time, :disable_percentage_of_time, - :features, :feature, :[], :preload, :preload_all, + :features, :feature, :features_for_actor, :[], :preload, :preload_all, :adapter, :add, :exist?, :remove, :import, :export, :memoize=, :memoizing?, :read_only?, :sync, :sync_secret # For Flipper::Cloud. Will error for OSS Flipper. diff --git a/lib/flipper/dsl.rb b/lib/flipper/dsl.rb index 6f7c3d11a..4da8e1ac1 100644 --- a/lib/flipper/dsl.rb +++ b/lib/flipper/dsl.rb @@ -76,6 +76,16 @@ def enable_actor(name, actor) feature(name).enable_actor(actor) end + # Public: All Enabled features for an actor. + # + # actor - a Flipper::Types::Actor instance or an object that responds + # to flipper_id. + # + # Returns Set of Flipper::Feature instances. + def features_for_actor(actor) + adapter.features.keep_if { |feature_name| enabled?(feature_name, actor) }.to_set { |name| feature(name) } + end + # Public: Enable a feature for a group. # # name - The String or Symbol name of the feature. @@ -269,7 +279,7 @@ def expression(name) # # Returns Set of Flipper::Feature instances. def features - adapter.features.map { |name| feature(name) }.to_set + adapter.features.to_set { |name| feature(name) } end # Public: Does this adapter support writes or not. diff --git a/spec/flipper/dsl_spec.rb b/spec/flipper/dsl_spec.rb index cfc35dc12..65beb31ac 100644 --- a/spec/flipper/dsl_spec.rb +++ b/spec/flipper/dsl_spec.rb @@ -172,6 +172,31 @@ end end + describe '#features_for_actor' do + actor = Flipper::Actor.new(5) + context 'with no features' do + it 'defaults to empty set' do + expect(subject.features_for_actor(actor)).to eq(Set.new) + end + end + + context 'with features enabled and disabled' do + before do + subject.enable_actor(:stats, actor) + subject.enable_actor(:cache, actor) + subject[:search].disable + end + + it 'returns set of feature instances' do + expect(subject.features_for_actor(actor)).to be_instance_of(Set) + subject.features_for_actor(actor).each do |feature| + expect(feature).to be_instance_of(Flipper::Feature) + end + expect(subject.features_for_actor(actor).map(&:name).map(&:to_s).sort).to eq(%w(cache stats)) + end + end + end + describe '#enable/disable' do it 'enables and disables the feature' do expect(subject[:stats].boolean_value).to eq(false)