From 4accbbce728d2dc4b26f69ac21e1d7d86b69bcf7 Mon Sep 17 00:00:00 2001 From: Mateo Avantaggiato Date: Thu, 7 Dec 2023 16:16:37 +0100 Subject: [PATCH 1/2] Added a new method on DSL to return all enabeld features for a given actor --- lib/flipper.rb | 2 +- lib/flipper/dsl.rb | 12 +++++++++++- spec/flipper/dsl_spec.rb | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) 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..260136fd5 100644 --- a/spec/flipper/dsl_spec.rb +++ b/spec/flipper/dsl_spec.rb @@ -171,6 +171,30 @@ end 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 From 7c2799fac4c4170e5dc4e44a773c3d43b5852c8b Mon Sep 17 00:00:00 2001 From: John Nunemaker Date: Wed, 3 Jan 2024 16:56:08 -0500 Subject: [PATCH 2/2] Update spec/flipper/dsl_spec.rb --- spec/flipper/dsl_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/flipper/dsl_spec.rb b/spec/flipper/dsl_spec.rb index 260136fd5..65beb31ac 100644 --- a/spec/flipper/dsl_spec.rb +++ b/spec/flipper/dsl_spec.rb @@ -171,6 +171,7 @@ end end end + describe '#features_for_actor' do actor = Flipper::Actor.new(5) context 'with no features' do