mongoid_feature_flags 0.1.33 → 0.1.34
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +8 -1
- data/lib/mongoid_feature_flags.rb +27 -1
- data/spec/lib/feature_flag_spec.rb +21 -0
- data/spec/models/person.rb +3 -0
- metadata +1 -1
data/README.md
CHANGED
@@ -28,6 +28,11 @@ If you would like to add features on persons, `include Mongoid::FeatureFlags`
|
|
28
28
|
|
29
29
|
include Mongoid::FeatureFlags
|
30
30
|
inherits_features_from :family
|
31
|
+
include_generated_features_from :other_features_method
|
32
|
+
|
33
|
+
def other_features_method
|
34
|
+
{:play_guitar_like_bo_diddley => true}
|
35
|
+
end
|
31
36
|
end
|
32
37
|
|
33
38
|
Then, you can do the following:
|
@@ -36,7 +41,9 @@ Then, you can do the following:
|
|
36
41
|
p.add_feature(:play_guitar_like_slash)
|
37
42
|
|
38
43
|
p.feature?(:play_guitar_like_slash) { *works* }
|
39
|
-
p.feature?(:
|
44
|
+
p.feature?(:play_guitar_like_bo_diddley) { *works* }
|
45
|
+
|
46
|
+
p.feature?(:play_guitar_like_nikki_sixx) { *does not work* }
|
40
47
|
|
41
48
|
## Security ##
|
42
49
|
|
@@ -7,6 +7,7 @@ module Mongoid
|
|
7
7
|
|
8
8
|
included do
|
9
9
|
@feature_flag_parents = []
|
10
|
+
@feature_flag_methods = []
|
10
11
|
|
11
12
|
begin
|
12
13
|
self.field :feature_flags, type: Hash
|
@@ -22,6 +23,11 @@ module Mongoid
|
|
22
23
|
@feature_flag_parents += relative
|
23
24
|
@feature_flag_parents.uniq!
|
24
25
|
end
|
26
|
+
|
27
|
+
def include_generated_features_from(*methods)
|
28
|
+
@feature_flag_methods += methods
|
29
|
+
@feature_flag_methods.uniq!
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
27
33
|
def add_feature(*flags)
|
@@ -39,9 +45,17 @@ module Mongoid
|
|
39
45
|
end
|
40
46
|
self.save
|
41
47
|
end
|
48
|
+
|
49
|
+
def clear_feature(*flags)
|
50
|
+
self.feature_flags ||= {}
|
51
|
+
flags.each do |flag|
|
52
|
+
self.feature_flags.delete(flag)
|
53
|
+
end
|
54
|
+
self.save
|
55
|
+
end
|
42
56
|
|
43
57
|
def features
|
44
|
-
(inherited_feature_flags || {}).merge(self.feature_flags || {})
|
58
|
+
(inherited_feature_flags || {}).merge(generated_feature_flags || {}).merge(self.feature_flags || {})
|
45
59
|
end
|
46
60
|
|
47
61
|
def feature?(*required_features, &block)
|
@@ -61,6 +75,18 @@ module Mongoid
|
|
61
75
|
def feature_flag_validate_flag(*flag)
|
62
76
|
raise(InvalidFlagName, "Flags must be a symbol") if !flag.any? { |f| f.is_a?(Symbol) }
|
63
77
|
end
|
78
|
+
|
79
|
+
def generated_feature_flags
|
80
|
+
if self.class.instance_variable_defined?("@feature_flag_methods")
|
81
|
+
self.class.instance_variable_get("@feature_flag_methods").inject({}) do |flag_hash, method_name|
|
82
|
+
if self.respond_to?(method_name) && self.send(method_name).present? && self.send(method_name)
|
83
|
+
flag_hash.merge(self.send(method_name) || {})
|
84
|
+
else
|
85
|
+
flag_hash
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
64
90
|
|
65
91
|
def inherited_feature_flags
|
66
92
|
if self.class.instance_variable_defined?("@feature_flag_parents")
|
@@ -31,6 +31,19 @@ describe Mongoid::FeatureFlags do
|
|
31
31
|
triggered.should be nil
|
32
32
|
end
|
33
33
|
|
34
|
+
it "#clear_feature" do
|
35
|
+
person.feature?(:can_see_cartoons).should eq(true)
|
36
|
+
person.clear_feature(:can_see_cartoons)
|
37
|
+
person.feature?(:can_see_cartoons).should be nil
|
38
|
+
|
39
|
+
triggered = nil
|
40
|
+
person.feature?(:can_see_cartoons) do
|
41
|
+
triggered = "yep"
|
42
|
+
end
|
43
|
+
|
44
|
+
triggered.should be nil
|
45
|
+
end
|
46
|
+
|
34
47
|
it "#unpermitted" do
|
35
48
|
triggered = nil
|
36
49
|
person.feature?(:can_see_cnn) do
|
@@ -57,6 +70,14 @@ describe Mongoid::FeatureFlags do
|
|
57
70
|
|
58
71
|
triggered.should eq("nope")
|
59
72
|
end
|
73
|
+
|
74
|
+
it "#generated_features" do
|
75
|
+
triggered = nil
|
76
|
+
person.not_feature?(:generated_feature) do
|
77
|
+
triggered = "yep"
|
78
|
+
end
|
79
|
+
triggered.should eq("yep")
|
80
|
+
end
|
60
81
|
end
|
61
82
|
|
62
83
|
context "#inherited" do
|
data/spec/models/person.rb
CHANGED