1- require "rollout/version"
2- require "zlib"
3- require "set"
4- require "json"
1+ # frozen_string_literal: true
2+
3+ require 'rollout/version'
4+ require 'zlib'
5+ require 'set'
6+ require 'json'
57
68class Rollout
79 RAND_BASE = ( 2 **32 - 1 ) / 100.0
8-
10+
911 class Feature
1012 attr_accessor :groups , :users , :percentage , :data
1113 attr_reader :name , :options
@@ -15,7 +17,7 @@ def initialize(name, string = nil, opts = {})
1517 @name = name
1618
1719 if string
18- raw_percentage , raw_users , raw_groups , raw_data = string . split ( '|' , 4 )
20+ raw_percentage , raw_users , raw_groups , raw_data = string . split ( '|' , 4 )
1921 @percentage = raw_percentage . to_f
2022 @users = users_from_string ( raw_users )
2123 @groups = groups_from_string ( raw_groups )
@@ -26,7 +28,7 @@ def initialize(name, string = nil, opts = {})
2628 end
2729
2830 def serialize
29- "#{ @percentage } |#{ @users . to_a . join ( "," ) } |#{ @groups . to_a . join ( "," ) } |#{ serialize_data } "
31+ "#{ @percentage } |#{ @users . to_a . join ( ',' ) } |#{ @groups . to_a . join ( ',' ) } |#{ serialize_data } "
3032 end
3133
3234 def add_user ( user )
@@ -47,8 +49,8 @@ def remove_group(group)
4749 end
4850
4951 def clear
50- @groups = groups_from_string ( "" )
51- @users = users_from_string ( "" )
52+ @groups = groups_from_string ( '' )
53+ @users = users_from_string ( '' )
5254 @percentage = 0
5355 @data = { }
5456 end
@@ -58,7 +60,7 @@ def active?(rollout, user)
5860 id = user_id ( user )
5961 user_in_percentage? ( id ) ||
6062 user_in_active_users? ( id ) ||
61- user_in_active_group? ( user , rollout )
63+ user_in_active_group? ( user , rollout )
6264 else
6365 @percentage == 100
6466 end
@@ -77,65 +79,66 @@ def to_hash
7779 end
7880
7981 private
80- def user_id ( user )
81- if user . is_a? ( Integer ) || user . is_a? ( String )
82- user . to_s
83- else
84- user . send ( id_user_by ) . to_s
85- end
86- end
8782
88- def id_user_by
89- @options [ :id_user_by ] || :id
83+ def user_id ( user )
84+ if user . is_a? ( Integer ) || user . is_a? ( String )
85+ user . to_s
86+ else
87+ user . send ( id_user_by ) . to_s
9088 end
89+ end
9190
92- def user_in_percentage? ( user )
93- Zlib . crc32 ( user_id_for_percentage ( user ) ) < RAND_BASE * @percentage
94- end
91+ def id_user_by
92+ @options [ :id_user_by ] || :id
93+ end
9594
96- def user_id_for_percentage ( user )
97- if @options [ :randomize_percentage ]
98- user_id ( user ) . to_s + @name . to_s
99- else
100- user_id ( user )
101- end
95+ def user_in_percentage? ( user )
96+ Zlib . crc32 ( user_id_for_percentage ( user ) ) < RAND_BASE * @percentage
97+ end
98+
99+ def user_id_for_percentage ( user )
100+ if @options [ :randomize_percentage ]
101+ user_id ( user ) . to_s + @name . to_s
102+ else
103+ user_id ( user )
102104 end
105+ end
103106
104- def user_in_active_group? ( user , rollout )
105- @groups . any? do |g |
106- rollout . active_in_group? ( g , user )
107- end
107+ def user_in_active_group? ( user , rollout )
108+ @groups . any? do |g |
109+ rollout . active_in_group? ( g , user )
108110 end
111+ end
109112
110- def serialize_data
111- return "" unless @data . is_a? Hash
113+ def serialize_data
114+ return '' unless @data . is_a? Hash
112115
113- @data . to_json
114- end
116+ @data . to_json
117+ end
115118
116- def users_from_string ( raw_users )
117- users = ( raw_users || "" ) . split ( "," ) . map ( &:to_s )
118- if @options [ :use_sets ]
119- users . to_set
120- else
121- users
122- end
119+ def users_from_string ( raw_users )
120+ users = ( raw_users || '' ) . split ( ',' ) . map ( &:to_s )
121+ if @options [ :use_sets ]
122+ users . to_set
123+ else
124+ users
123125 end
126+ end
124127
125- def groups_from_string ( raw_groups )
126- groups = ( raw_groups || "" ) . split ( "," ) . map ( &:to_sym )
127- if @options [ :use_sets ]
128- groups . to_set
129- else
130- groups
131- end
128+ def groups_from_string ( raw_groups )
129+ groups = ( raw_groups || '' ) . split ( ',' ) . map ( &:to_sym )
130+ if @options [ :use_sets ]
131+ groups . to_set
132+ else
133+ groups
132134 end
135+ end
133136 end
134137
135138 def initialize ( storage , opts = { } )
136139 @storage = storage
137140 @options = opts
138- @groups = { all : lambda { | user | true } }
141+ @groups = { all : -> ( _user ) { true } }
139142 end
140143
141144 def activate ( feature )
@@ -145,15 +148,13 @@ def activate(feature)
145148 end
146149
147150 def deactivate ( feature )
148- with_feature ( feature ) do |f |
149- f . clear
150- end
151+ with_feature ( feature , &:clear )
151152 end
152153
153154 def delete ( feature )
154- features = ( @storage . get ( features_key ) || "" ) . split ( "," )
155+ features = ( @storage . get ( features_key ) || '' ) . split ( ',' )
155156 features . delete ( feature . to_s )
156- @storage . set ( features_key , features . join ( "," ) )
157+ @storage . set ( features_key , features . join ( ',' ) )
157158 @storage . del ( key ( feature ) )
158159 end
159160
@@ -193,20 +194,20 @@ def deactivate_user(feature, user)
193194
194195 def activate_users ( feature , users )
195196 with_feature ( feature ) do |f |
196- users . each { |user | f . add_user ( user ) }
197+ users . each { |user | f . add_user ( user ) }
197198 end
198199 end
199200
200201 def deactivate_users ( feature , users )
201202 with_feature ( feature ) do |f |
202- users . each { |user | f . remove_user ( user ) }
203+ users . each { |user | f . remove_user ( user ) }
203204 end
204205 end
205206
206207 def set_users ( feature , users )
207208 with_feature ( feature ) do |f |
208209 f . users = [ ]
209- users . each { |user | f . add_user ( user ) }
210+ users . each { |user | f . add_user ( user ) }
210211 end
211212 end
212213
@@ -242,7 +243,7 @@ def deactivate_percentage(feature)
242243
243244 def active_in_group? ( group , user )
244245 f = @groups [ group . to_sym ]
245- f && f . call ( user )
246+ f & .call ( user )
246247 end
247248
248249 def get ( feature )
@@ -263,12 +264,12 @@ def clear_feature_data(feature)
263264 end
264265
265266 def multi_get ( *features )
266- feature_keys = features . map { |feature | key ( feature ) }
267+ feature_keys = features . map { |feature | key ( feature ) }
267268 @storage . mget ( *feature_keys ) . map . with_index { |string , index | Feature . new ( features [ index ] , string , @options ) }
268269 end
269270
270271 def features
271- ( @storage . get ( features_key ) || "" ) . split ( "," ) . map ( &:to_sym )
272+ ( @storage . get ( features_key ) || '' ) . split ( ',' ) . map ( &:to_sym )
272273 end
273274
274275 def feature_states ( user = nil )
@@ -285,7 +286,7 @@ def active_features(user = nil)
285286
286287 def clear!
287288 features . each do |feature |
288- with_feature ( feature ) { | f | f . clear }
289+ with_feature ( feature , & : clear)
289290 @storage . del ( key ( feature ) )
290291 end
291292
@@ -303,7 +304,7 @@ def key(name)
303304 end
304305
305306 def features_key
306- " feature:__features__"
307+ ' feature:__features__'
307308 end
308309
309310 def with_feature ( feature )
@@ -314,6 +315,6 @@ def with_feature(feature)
314315
315316 def save ( feature )
316317 @storage . set ( key ( feature . name ) , feature . serialize )
317- @storage . set ( features_key , ( features | [ feature . name . to_sym ] ) . join ( "," ) )
318+ @storage . set ( features_key , ( features | [ feature . name . to_sym ] ) . join ( ',' ) )
318319 end
319320end
0 commit comments