module FerrisBueller::WebHelpers
Constants
- JARO_WINKLER
Public Instance Methods
api()
click to toggle source
# File lib/ferris-bueller/web_helpers.rb, line 14 def api ; settings.api end
compare(name1, name2)
click to toggle source
# File lib/ferris-bueller/web_helpers.rb, line 69 def compare name1, name2 return nil if name1.nil? || name1.empty? return nil if name2.nil? || name2.empty? n1 = name1.gsub(/\W/, '').downcase n2 = name2.gsub(/\W/, '').downcase JARO_WINKLER.getDistance n1, n2 end
jira()
click to toggle source
# File lib/ferris-bueller/web_helpers.rb, line 8 def jira ; settings.jira end
log()
click to toggle source
# File lib/ferris-bueller/web_helpers.rb, line 12 def log ; settings.logger end
store()
click to toggle source
# File lib/ferris-bueller/web_helpers.rb, line 10 def store ; settings.store end
user_lookup(params, threshold=0.75)
click to toggle source
# File lib/ferris-bueller/web_helpers.rb, line 17 def user_lookup params, threshold=0.75 data = api.send 'users.info', user: params[:user_id] slack_user = { key: data[:user][:id], name: (data[:user][:real_name] || data[:user][:name]), nick: data[:user][:name], email: data[:user][:email] } log.info \ event: 'matching user', slack_user: slack_user jira_matches = store[:jira_users].values.map do |jira_user| distances = [ :name, :nick ].map do |k| compare slack_user[k], jira_user[k] end.compact mean_distance = 1.0 * distances.inject(:+) / distances.size if mean_distance > threshold or distances.max > 0.99 { user: jira_user, distance: mean_distance} end end.compact jira_match = jira_matches.sort_by { |m| m[:distance] }.last unless jira_match log.warn \ event: 'unmatched user', slack_user: slack_user return nil end log.info \ event: 'matched user', slack_user: slack_user, jira_match: jira_match return { slack: slack_user, jira: jira_match[:user] } rescue StandardError => e log.error \ error: 'could not lookup users', event: 'exception', exception: e.inspect, class: e.class, message: e.message.inspect, backtrace: e.backtrace return nil end