travis-web/assets/scripts/app/helpers/helpers.coffee
Piotr Sarnacki ec8d93f8cf Refactor Travis.Helpers to prepare it for ES6 modules
In order to make it easy to switch to ember-cli I'm starting changing a series
of refactorings that will prepare the codebase to the switch. Here I'm:

1. Assign all of the external objects and functions to variables in order to
   make it easy to change them to imports in the feature
2. Extract functions from Travis.Helpers into local functions and create the
   object at the end of file to prepare it for exporting
2015-01-14 12:55:17 +01:00

167 lines
5.5 KiB
CoffeeScript

require 'config/emoij'
config_keys_map = Travis.CONFIG_KEYS_MAP
config = Travis.config
githubCommitUrl = Travis.Urls.githubCommit
currentDate = Travis.currentDate
timeago = $.timeago
intersect = $.intersect
only = $.only
mapObject = $.map
colors = {
default: 'yellow'
passed: 'green'
failed: 'red'
errored: 'gray'
canceled: 'gray'
}
compact = (object) ->
result = {}
(result[key] = value unless Ember.isEmpty(value)) for key, value of object || {}
result
safe = (string) ->
new Ember.Handlebars.SafeString(string)
colorForState = (state) ->
colors[state] || colors['default']
formatCommit = (sha, branch) ->
formatSha(sha) + if branch then " (#{branch})" else ''
formatSha = (sha) ->
(sha || '').substr(0, 7)
formatConfig = (config) ->
config = only config, Object.keys(config_keys_map)
values = mapObject config, (value, key) ->
value = (if value && value.join then value.join(', ') else value) || ''
if key == 'rvm' && "#{value}".match(/^\d+$/)
value = "#{value}.0"
'%@: %@'.fmt config_keys_map[key], value
if values.length == 0 then '-' else values.join(', ')
formatMessage = (message, options) ->
message = message || ''
message = message.split(/\n/)[0] if options.short
message = @_emojize(@_escape(message))
if !!options.repo
message = @githubify(message, options.repo.get('owner'), options.repo.get('name'))
if !!options.pre
message = message.replace /\n/g, '<br/>'
message
pathFrom = (url) ->
(url || '').split('/').pop()
timeAgoInWords = (date) ->
timeago.distanceInWords date
durationFrom = (started, finished) ->
started = started and @_toUtc(new Date(@_normalizeDateString(started)))
finished = if finished then @_toUtc(new Date(@_normalizeDateString(finished))) else @_nowUtc()
if started && finished then Math.round((finished - started) / 1000) else 0
timeInWords = (duration) ->
days = Math.floor(duration / 86400)
hours = Math.floor(duration % 86400 / 3600)
minutes = Math.floor(duration % 3600 / 60)
seconds = duration % 60
if days > 0
'more than 24 hrs'
else
result = []
result.push hours + ' hr' if hours is 1
result.push hours + ' hrs' if hours > 1
result.push minutes + ' min' if minutes > 0
result.push seconds + ' sec' if seconds > 0
if result.length > 0 then result.join(' ') else '-'
githubify = (text, owner, repo) ->
self = this
text = text.replace @_githubReferenceRegexp, (reference, matchedOwner, matchedRepo, matchedNumber) ->
self._githubReferenceLink(reference, { owner: owner, repo: repo }, { owner: matchedOwner, repo: matchedRepo, number: matchedNumber } )
text = text.replace @_githubUserRegexp, (reference, username) ->
self._githubUserLink(reference, username)
text = text.replace @_githubCommitReferenceRegexp, (reference, matchedOwner, matchedRepo, matchedSHA) ->
self._githubCommitReferenceLink(reference, { owner: owner, repo: repo }, { owner: matchedOwner, repo: matchedRepo, sha: matchedSHA })
text
_githubReferenceRegexp = new RegExp("([\\w-]+)?\\/?([\\w-]+)?(?:#|gh-)(\\d+)", 'g')
_githubReferenceLink = (reference, current, matched) ->
owner = matched.owner || current.owner
repo = matched.repo || current.repo
"<a href=\"#{config.source_endpoint}/#{owner}/#{repo}/issues/#{matched.number}\">#{reference}</a>"
_githubUserRegexp = new RegExp("\\B@([\\w-]+)", 'g')
_githubUserLink = (reference, username) ->
"<a href=\"#{config.source_endpoint}/#{username}\">#{reference}</a>"
_githubCommitReferenceRegexp = new RegExp("([\\w-]+)?\\/([\\w-]+)?@([0-9A-Fa-f]+)", 'g')
_githubCommitReferenceLink = (reference, current, matched) ->
owner = matched.owner || current.owner
repo = matched.repo || current.repo
url = "#{githubCommitUrl("#{owner}/#{repo}", matched.sha)}"
"<a href=\"#{url}\">#{reference}</a>"
_normalizeDateString = (string) ->
if window.JHW
string = string.replace('T', ' ').replace(/-/g, '/')
string = string.replace('Z', '').replace(/\..*$/, '')
string
_nowUtc = ->
@_toUtc currentDate()
_toUtc = (date) ->
Date.UTC date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()
_emojize = (text) ->
emojis = text.match(/:\S+?:/g)
if emojis isnt null
emojis.uniq().each (emoji, ix) ->
strippedEmoji = emoji.substring(1, emoji.length - 1)
unless EmojiDictionary.indexOf(strippedEmoji) is -1
image = '<img class=\'emoji\' title=\'' + emoji + '\' alt=\'' + emoji + '\' src=\'' + '/images/emoji/' + strippedEmoji + '.png\'/>'
text = text.replace(new RegExp(emoji, 'g'), image)
text
_escape = (text) ->
text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace />/g, '&gt;'
configKeys = (config) ->
return [] unless config
intersect(Object.keys(config), Object.keys(config_keys_map))
Travis.Helpers =
configKeys: configKeys
_escape: _escape
_emojize: _emojize
_toUtc: _toUtc
_nowUtc: _nowUtc
_normalizeDateString: _normalizeDateString
_githubCommitReferenceLink: _githubCommitReferenceLink
_githubCommitReferenceRegexp: _githubCommitReferenceRegexp
_githubUserLink: _githubUserLink
_githubUserRegexp: _githubUserRegexp
_githubReferenceLink: _githubReferenceLink
_githubReferenceRegexp: _githubReferenceRegexp
githubify: githubify
timeInWords: timeInWords
durationFrom: durationFrom
timeAgoInWords: timeAgoInWords
pathFrom: pathFrom
formatMessage: formatMessage
formatConfig: formatConfig
formatSha: formatSha
formatCommit: formatCommit
colorForState: colorForState
safe: safe
compact: compact