Class: Rollout
- Inherits:
-
Object
show all
- Includes:
- Observable
- Defined in:
- lib/rollout.rb,
lib/rollout/feature.rb,
lib/rollout/logging.rb,
lib/rollout/version.rb more...
Defined Under Namespace
Modules: Logging
Classes: Feature
Constant Summary
collapse
- RAND_BASE =
(2**32 - 1) / 100.0
- VERSION =
'2.5.0'
Instance Attribute Summary collapse
Instance Method Summary
collapse
-
#activate(feature) ⇒ Object
-
#activate_group(feature, group) ⇒ Object
-
#activate_percentage(feature, percentage) ⇒ Object
-
#activate_user(feature, user) ⇒ Object
-
#activate_users(feature, users) ⇒ Object
-
#active?(feature, user = nil) ⇒ Boolean
-
#active_features(user = nil) ⇒ Object
-
#active_in_group?(group, user) ⇒ Boolean
-
#clear! ⇒ Object
-
#clear_feature_data(feature) ⇒ Object
-
#deactivate(feature) ⇒ Object
-
#deactivate_group(feature, group) ⇒ Object
-
#deactivate_percentage(feature) ⇒ Object
-
#deactivate_user(feature, user) ⇒ Object
-
#deactivate_users(feature, users) ⇒ Object
-
#define_group(group, &block) ⇒ Object
-
#delete(feature) ⇒ Object
-
#exists?(feature) ⇒ Boolean
-
#feature_states(user = nil) ⇒ Object
-
#features ⇒ Object
-
#get(feature) ⇒ Object
-
#groups ⇒ Object
-
#inactive?(feature, user = nil) ⇒ Boolean
-
#initialize(storage, opts = {}) ⇒ Rollout
constructor
A new instance of Rollout.
-
#multi_get(*features) ⇒ Object
-
#set(feature, desired_state) ⇒ Object
-
#set_feature_data(feature, data) ⇒ Object
-
#set_users(feature, users) ⇒ Object
-
#user_in_active_users?(feature, user = nil) ⇒ Boolean
-
#with_feature(feature) ⇒ Object
Constructor Details
permalink
#initialize(storage, opts = {}) ⇒ Rollout
Returns a new instance of Rollout.
[View source]
18
19
20
21
22
23
24
|
# File 'lib/rollout.rb', line 18
def initialize(storage, opts = {})
@storage = storage
@options = opts
@groups = { all: ->(_user) { true } }
extend(Logging) if opts[:logging]
end
|
Instance Attribute Details
Returns the value of attribute options.
16
17
18
|
# File 'lib/rollout.rb', line 16
def options
@options
end
|
Returns the value of attribute storage.
16
17
18
|
# File 'lib/rollout.rb', line 16
def storage
@storage
end
|
Instance Method Details
permalink
#activate(feature) ⇒ Object
[View source]
30
31
32
33
34
|
# File 'lib/rollout.rb', line 30
def activate(feature)
with_feature(feature) do |f|
f.percentage = 100
end
end
|
permalink
#activate_group(feature, group) ⇒ Object
[View source]
61
62
63
64
65
|
# File 'lib/rollout.rb', line 61
def activate_group(feature, group)
with_feature(feature) do |f|
f.add_group(group)
end
end
|
permalink
#activate_percentage(feature, percentage) ⇒ Object
[View source]
122
123
124
125
126
|
# File 'lib/rollout.rb', line 122
def activate_percentage(feature, percentage)
with_feature(feature) do |f|
f.percentage = percentage
end
end
|
permalink
#activate_user(feature, user) ⇒ Object
[View source]
73
74
75
76
77
|
# File 'lib/rollout.rb', line 73
def activate_user(feature, user)
with_feature(feature) do |f|
f.add_user(user)
end
end
|
permalink
#activate_users(feature, users) ⇒ Object
[View source]
85
86
87
88
89
|
# File 'lib/rollout.rb', line 85
def activate_users(feature, users)
with_feature(feature) do |f|
users.each { |user| f.add_user(user) }
end
end
|
permalink
#active?(feature, user = nil) ⇒ Boolean
[View source]
108
109
110
111
|
# File 'lib/rollout.rb', line 108
def active?(feature, user = nil)
feature = get(feature)
feature.active?(self, user)
end
|
permalink
#active_features(user = nil) ⇒ Object
[View source]
173
174
175
176
177
|
# File 'lib/rollout.rb', line 173
def active_features(user = nil)
multi_get(*features).select do |f|
f.active?(self, user)
end.map(&:name)
end
|
permalink
#active_in_group?(group, user) ⇒ Boolean
[View source]
134
135
136
137
|
# File 'lib/rollout.rb', line 134
def active_in_group?(group, user)
f = @groups[group.to_sym]
f&.call(user)
end
|
[View source]
179
180
181
182
183
184
185
186
|
# File 'lib/rollout.rb', line 179
def clear!
features.each do |feature|
with_feature(feature, &:clear)
@storage.del(key(feature))
end
@storage.del(features_key)
end
|
permalink
#clear_feature_data(feature) ⇒ Object
[View source]
150
151
152
153
154
|
# File 'lib/rollout.rb', line 150
def clear_feature_data(feature)
with_feature(feature) do |f|
f.data = {}
end
end
|
permalink
#deactivate(feature) ⇒ Object
[View source]
36
37
38
|
# File 'lib/rollout.rb', line 36
def deactivate(feature)
with_feature(feature, &:clear)
end
|
permalink
#deactivate_group(feature, group) ⇒ Object
[View source]
67
68
69
70
71
|
# File 'lib/rollout.rb', line 67
def deactivate_group(feature, group)
with_feature(feature) do |f|
f.remove_group(group)
end
end
|
permalink
#deactivate_percentage(feature) ⇒ Object
[View source]
128
129
130
131
132
|
# File 'lib/rollout.rb', line 128
def deactivate_percentage(feature)
with_feature(feature) do |f|
f.percentage = 0
end
end
|
permalink
#deactivate_user(feature, user) ⇒ Object
[View source]
79
80
81
82
83
|
# File 'lib/rollout.rb', line 79
def deactivate_user(feature, user)
with_feature(feature) do |f|
f.remove_user(user)
end
end
|
permalink
#deactivate_users(feature, users) ⇒ Object
[View source]
91
92
93
94
95
|
# File 'lib/rollout.rb', line 91
def deactivate_users(feature, users)
with_feature(feature) do |f|
users.each { |user| f.remove_user(user) }
end
end
|
permalink
#define_group(group, &block) ⇒ Object
[View source]
104
105
106
|
# File 'lib/rollout.rb', line 104
def define_group(group, &block)
@groups[group.to_sym] = block
end
|
permalink
#delete(feature) ⇒ Object
[View source]
40
41
42
43
44
45
46
47
48
49
|
# File 'lib/rollout.rb', line 40
def delete(feature)
features = (@storage.get(features_key) || '').split(',')
features.delete(feature.to_s)
@storage.set(features_key, features.join(','))
@storage.del(key(feature))
if respond_to?(:logging)
logging.delete(feature)
end
end
|
permalink
#exists?(feature) ⇒ Boolean
[View source]
188
189
190
191
192
193
194
195
196
|
# File 'lib/rollout.rb', line 188
def exists?(feature)
if @storage.respond_to?(:exists?)
@storage.exists?(key(feature))
else
@storage.exists(key(feature))
end
end
|
permalink
#feature_states(user = nil) ⇒ Object
[View source]
167
168
169
170
171
|
# File 'lib/rollout.rb', line 167
def feature_states(user = nil)
multi_get(*features).each_with_object({}) do |f, hash|
hash[f.name] = f.active?(self, user)
end
end
|
permalink
#features ⇒ Object
[View source]
163
164
165
|
# File 'lib/rollout.rb', line 163
def features
(@storage.get(features_key) || '').split(',').map(&:to_sym)
end
|
permalink
#get(feature) ⇒ Object
[View source]
139
140
141
142
|
# File 'lib/rollout.rb', line 139
def get(feature)
string = @storage.get(key(feature))
Feature.new(feature, string, @options)
end
|
[View source]
26
27
28
|
# File 'lib/rollout.rb', line 26
def groups
@groups.keys
end
|
permalink
#inactive?(feature, user = nil) ⇒ Boolean
[View source]
118
119
120
|
# File 'lib/rollout.rb', line 118
def inactive?(feature, user = nil)
!active?(feature, user)
end
|
permalink
#multi_get(*features) ⇒ Object
[View source]
156
157
158
159
160
161
|
# File 'lib/rollout.rb', line 156
def multi_get(*features)
return [] if features.empty?
feature_keys = features.map { |feature| key(feature) }
@storage.mget(*feature_keys).map.with_index { |string, index| Feature.new(features[index], string, @options) }
end
|
permalink
#set(feature, desired_state) ⇒ Object
[View source]
51
52
53
54
55
56
57
58
59
|
# File 'lib/rollout.rb', line 51
def set(feature, desired_state)
with_feature(feature) do |f|
if desired_state
f.percentage = 100
else
f.clear
end
end
end
|
permalink
#set_feature_data(feature, data) ⇒ Object
[View source]
144
145
146
147
148
|
# File 'lib/rollout.rb', line 144
def set_feature_data(feature, data)
with_feature(feature) do |f|
f.data.merge!(data) if data.is_a? Hash
end
end
|
permalink
#set_users(feature, users) ⇒ Object
[View source]
97
98
99
100
101
102
|
# File 'lib/rollout.rb', line 97
def set_users(feature, users)
with_feature(feature) do |f|
f.users = []
users.each { |user| f.add_user(user) }
end
end
|
permalink
#user_in_active_users?(feature, user = nil) ⇒ Boolean
[View source]
113
114
115
116
|
# File 'lib/rollout.rb', line 113
def user_in_active_users?(feature, user = nil)
feature = get(feature)
feature.user_in_active_users?(user)
end
|
permalink
#with_feature(feature) ⇒ Object
[View source]
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
# File 'lib/rollout.rb', line 198
def with_feature(feature)
f = get(feature)
if count_observers > 0
before = Marshal.load(Marshal.dump(f))
yield(f)
save(f)
changed
notify_observers(:update, before, f)
else
yield(f)
save(f)
end
end
|