lib/pain/model.rb
# frozen_string_literal: true
module Pain
class Model
MAX = {
bug_type: 7,
likelihood: 5,
impact: 5
}.freeze
INPUT_MESSAGE = {
bug_type: 'What kind of bug is this?',
likelihood: 'How likely is this bug to occur?',
impact: 'How much impact will this bug have?'
}.freeze
OPTIONS = {
bug_type: {
1 => 'Documentation: a documentation issue',
2 => 'Localization: missing translations',
3 => 'Visual Polish: Aesthetic issues',
4 => 'Balancing: allows poor usage strategy',
5 => 'Minor UX: Impairs UX in secondary scenarios',
6 => 'Major UX: Impairs UX in key scenarios',
7 => 'Crash: Causes crash or data loss'
},
likelihood: {
1 => 'Will affect almost no one',
2 => 'Will only affect a few users',
3 => 'Will affect average number of users',
4 => 'Will affect most users',
5 => 'Will affect all users'
},
impact: {
1 => 'Nuisance: not a big deal but noticeable.',
2 => 'A Pain: Users won\'t like this once they notice it.',
3 => 'Affects Buy-in. Will show up in review. Clearly noticeable.',
4 => 'A user would return the product. Should not deploy until fixed',
5 => 'Affects system build'
}
}.freeze
def choices_for(category)
OPTIONS[category]
end
def level_string(category, score)
OPTIONS.dig(category, score)
end
def max_for(category)
MAX[category]
end
def input_message(category)
INPUT_MESSAGE[category]
end
def max_pain
MAX.values.reduce(&:*)
end
def user_pain(type, likelihood, impact)
100 * (type * likelihood * impact) / max_pain
end
def normalize(value, variable)
value = value.to_i
max = MAX[variable]
return nil if max.nil? || value.nil?
return nil if value < 1
return max if value > max
value
end
end
end