-
Notifications
You must be signed in to change notification settings - Fork 24
/
feature.rb
85 lines (68 loc) · 2.71 KB
/
feature.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
require 'active_record'
# a stub
# possible TODO: remove and and refactor into an acts_as_feature mixin
module Arturo
class Feature < ::ActiveRecord::Base
include Arturo::SpecialHandling
Arturo::Feature::SYMBOL_REGEX = /^[a-zA-z][a-zA-Z0-9_]*$/
DEFAULT_ATTRIBUTES = { :deployment_percentage => 0 }
attr_readonly :symbol
validates_presence_of :symbol, :deployment_percentage
validates_uniqueness_of :symbol, :allow_blank => true
validates_numericality_of :deployment_percentage,
:only_integer => true,
:allow_blank => true,
:greater_than_or_equal_to => 0,
:less_than_or_equal_to => 100
# Looks up a feature by symbol. Also accepts a Feature as input.
# @param [Symbol, Arturo::Feature] feature_or_name a Feature or the Symbol of a Feature
# @return [Arturo::Feature, nil] the Feature if found, else nil
def self.to_feature(feature_or_symbol)
return feature_or_symbol if feature_or_symbol.kind_of?(self)
self.find(:first, :conditions => { :symbol => feature_or_symbol.to_s })
end
# Create a new Feature
def initialize(attributes = {})
super(DEFAULT_ATTRIBUTES.merge(attributes || {}))
end
# @param [Object] feature_recipient a User, Account,
# or other model with an #id method
# @return [true,false] whether or not this feature is enabled
# for feature_recipient
# @see Arturo::SpecialHandling#whitelisted?
# @see Arturo::SpecialHandling#blacklisted?
def enabled_for?(feature_recipient)
return false if feature_recipient.nil?
return false if blacklisted?(feature_recipient)
return true if whitelisted?(feature_recipient)
passes_threshold?(feature_recipient)
end
def name
return I18n.translate("arturo.feature.nameless") if symbol.blank?
I18n.translate("arturo.feature.#{symbol}", :default => symbol.to_s.titleize)
end
def to_s
"Feature #{name}"
end
def to_param
new_record? ? nil : "#{id}-#{symbol.to_s.parameterize}"
end
def inspect
"<Arturo::Feature #{name}, deployed to #{deployment_percentage}%>"
end
def symbol
sym = read_attribute(:symbol).to_s
sym.blank? ? nil : sym.to_sym
end
def symbol=(sym)
write_attribute(:symbol, sym.to_s)
end
protected
def passes_threshold?(feature_recipient)
threshold = self.deployment_percentage || 0
return false if threshold == 0
return true if threshold == 100
(((feature_recipient.id + 17) * 13) % 100) < threshold
end
end
end