mongoid_feature_flags 0.1.33 → 0.1.34
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.
- 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