@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
197 lines (124 loc) • 4.88 kB
text/coffeescript
extendDefaultOptions = (options)->
options = $.extend {}, defaultOptions, options
options.itemsMap.length = (1 for k of options.itemsMap).length
return options
parseValue = (value)->
if typeof value is 'string'
parseFloat value.replace /,/g, ''
else
value
convertValuesToPoints = (chartData)->
maxValue = Math.max.apply(null, chartData.map (plot)-> plot.y)
chartData.forEach (plot)->
realValue = plot.y
plot.y = (plot.y/maxValue) * 100
return chartData
sortTests = (tests, chartsOrderMap)->
output = {}
Object.keys(tests)
.map (name)->
tests[name].name = name
return tests[name]
.sort (a,b)->
aIndex = chartsOrderMap.indexOf(a.name)
aIndex = 100 if aIndex is -1
bIndex = chartsOrderMap.indexOf(b.name)
bIndex = 100 if bIndex is -1
return switch
when aIndex > bIndex then 1
when aIndex < bIndex then -1
else 0
.forEach (test)->
output[test.name] = test
delete test.name
return output
sortVersions = (versions)->
output = {}
Object.keys(versions)
.sort(sortByVersionString)
.forEach (versionNumber)->
output[versionNumber] = versions[versionNumber]
return output
sortByVersionString = (a,b)-> switch
when parseVersion(a,'major') > parseVersion(b,'major') then 1
when parseVersion(a,'major') < parseVersion(b,'major') then -1
else switch
when parseVersion(a,'minor') > parseVersion(b,'minor') then 1
when parseVersion(a,'minor') < parseVersion(b,'minor') then -1
else switch
when parseVersion(a,'patch') > parseVersion(b,'patch') then 1
when parseVersion(a,'patch') < parseVersion(b,'patch') then -1
when /\w/.test(a) or /\w/.test(b) then switch
when parseVersion(a,'patch-word') > parseVersion(b,'patch-word') then 1
when parseVersion(a,'patch-word') < parseVersion(b,'patch-word') then -1
else 0
else 0
parseVersion = (versionString, level)->
versionBreakdown = versionString.split('.')
switch level
when 'major' then parseFloat(versionBreakdown[0]) or 0
when 'minor' then parseFloat(versionBreakdown[1]) or 0
when 'patch' then parseFloat(versionBreakdown[2]) or 0
when 'patch-word' then versionBreakdown[2].split(/^\d+/)[1]
parseName = (libraryObject)->
return libraryObject.name.replace(libraryObject.name+' ', '')
sortChartData = (chartData, itemsMap)->
sorted = chartData.slice()
sorted.sort (a,b)->
if a.library is b.library then sortByVersionString(parseName(a), parseName(b))
else switch
when itemsMap[a.library].index > itemsMap[b.library].index then 1
when itemsMap[a.library].index < itemsMap[b.library].index then -1
else 0
sorted.forEach (point, index)-> point.x = index
return sorted
createDrilldown = (test)->
output = []
for browser,libraries of test.values
for library,versions of libraries
for version,value of versions
name = "#{library} #{version}"
existingItem = output.find (item)-> item.id is name
item = if existingItem then existingItem else {id:name, data:[]}
item.data.push [browser, parseValue(value)]
# item.data.push {x:browser, y:parseValue(value), name:browser}
unless existingItem
output.push(item)
return output
combineAllBrowserData = (testValues, currentBrowser)->
output = {}
for browser,libraries of testValues
for library,versions of libraries
continue unless testValues[currentBrowser][library]
output[library] ?= {}
for version,value of versions
continue unless testValues[currentBrowser][library][version]
output[library][version] ?= {value:0, count:0}
output[library][version].value += parseValue(value)
output[library][version].count += 1
for library,versions of output
for version,data of versions
output[library][version] = data.value / data.count
return output
createChartDataForTest = (testName, test, options, currentBrowser)->
chartData = []
testValues = if options.browserData is 'current' then test.values[currentBrowser] else combineAllBrowserData(test.values, currentBrowser)
lastIndex = 0
for library,versions of testValues
for version,value of sortVersions(versions)
continue if ignoreList.includes "#{library}@#{version}"
value = parseValue(value)
name = library+' '+version
if options.itemsMap[library]
lastIndex++
color = options.itemsMap[library].color
else
index = ++lastIndex
color = options.colors[index] or options.colors[index % options.colors.length]
options.itemsMap[library] = {index, color}
chartData.push {'x':null, 'y':value, 'drilldown':name, color, name, library}
chartData = sortChartData(chartData, options.itemsMap)
chartData = convertValuesToPoints(chartData) if options.valueType is 'points'
chartData.drilldown = if options.browserData is 'current' then undefined else createDrilldown(test)
chartData.nonSharedTest = test.nonSharedTest
return chartData