Change axises and delete action in API (#2792)
This commit is contained in:
@@ -64,6 +64,28 @@ object LocalCache {
|
||||
fun buildExists(target: String, buildNumber: String) =
|
||||
buildsInfo[target][buildNumber]?.let { true } ?: false
|
||||
|
||||
fun delete(target: String, builds: Iterable<String>, bintrayUser: String, bintrayPassword: String): Boolean {
|
||||
// Delete from bintray.
|
||||
val buildsDescription = getBuildsInfoFromBintray(target).lines()
|
||||
val initialBuildsNumber = buildsDescription.size
|
||||
buildsDescription.filter {
|
||||
val buildNumber = it.substringBefore(',')
|
||||
buildNumber !in builds
|
||||
}
|
||||
|
||||
if (buildsDescription.size < initialBuildsNumber) {
|
||||
// Upload new version of file.
|
||||
val uploadUrl = "$uploadBintrayUrl/$bintrayPackage/latest/$target/$buildsFileName?publish=1&override=1"
|
||||
sendUploadRequest(uploadUrl, buildsDescription.joinToString("\n"), bintrayUser, bintrayPassword)
|
||||
|
||||
// Reload values.
|
||||
clean(target)
|
||||
fill(target)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun getBuilds(target: String, buildNumber: String? = null) =
|
||||
buildsInfo[target]?.let { buildsList ->
|
||||
buildNumber?.let {
|
||||
@@ -125,12 +147,12 @@ data class BuildRegister(val buildId: String, val teamCityUser: String, val team
|
||||
val currentTime = Date()
|
||||
val timeZone = currentTime.getTimezoneOffset() / -60 // Convert to hours.
|
||||
// Get finish time as current time, because buid on TeamCity isn't finished.
|
||||
val finishTime = "${format(currentTime.getFullYear())}" +
|
||||
"${format(currentTime.getMonth() + 1)}" +
|
||||
"${format(currentTime.getDate())}" +
|
||||
"T${format(currentTime.getHours())}" +
|
||||
"${format(currentTime.getMinutes())}" +
|
||||
"${format(currentTime.getSeconds())}" +
|
||||
val finishTime = "${format(currentTime.getUTCFullYear())}" +
|
||||
"${format(currentTime.getUTCMonth() + 1)}" +
|
||||
"${format(currentTime.getUTCDate())}" +
|
||||
"T${format(currentTime.getUTCHours())}" +
|
||||
"${format(currentTime.getUTCMinutes())}" +
|
||||
"${format(currentTime.getUTCSeconds())}" +
|
||||
"${if (timeZone > 0) "+" else "-"}${format(timeZone)}${format(0)}"
|
||||
return BuildInfo(buildNumber, branch, startTime, finishTime)
|
||||
}
|
||||
@@ -217,6 +239,9 @@ fun router() {
|
||||
val uploadUrl = "$uploadBintrayUrl/$bintrayPackage/latest/${register.target}/${buildsFileName}?publish=1&override=1"
|
||||
sendUploadRequest(uploadUrl, buildsDescription, register.bintrayUser, register.bintrayPassword)
|
||||
|
||||
LocalCache.clean(register.target)
|
||||
LocalCache.fill(register.target)
|
||||
|
||||
// Send response.
|
||||
response.sendStatus(200)
|
||||
})
|
||||
@@ -242,6 +267,15 @@ fun router() {
|
||||
response.sendStatus(200)
|
||||
})
|
||||
|
||||
router.get("/delete/:target", { request, response ->
|
||||
val buildsToDelete: List<String> = request.query.builds.toString().split(",").map { it.trim() }
|
||||
val result = LocalCache.delete(request.params.target, buildsToDelete, request.query.user, request.query.key)
|
||||
if (result) {
|
||||
response.sendStatus(200)
|
||||
}
|
||||
response.sendStatus(404)
|
||||
})
|
||||
|
||||
// Main page.
|
||||
router.get("/", { request, response ->
|
||||
response.render("index")
|
||||
|
||||
@@ -94,6 +94,7 @@
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/chartist/0.11.0/chartist.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/chartist-plugin-legend/0.6.2/chartist-plugin-legend.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.devbridge-autocomplete/1.4.9/jquery.autocomplete.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chartist-plugin-axistitle@0.0.4/dist/chartist-plugin-axistitle.min.js"></script>
|
||||
<script src="lib/kotlin/kotlin.js"></script>
|
||||
<script src="js/main.js"></script>
|
||||
</body>
|
||||
|
||||
@@ -24,6 +24,7 @@ import org.w3c.dom.*
|
||||
// API for interop with JS library Chartist.
|
||||
external class ChartistPlugins {
|
||||
fun legend(data: dynamic): dynamic
|
||||
fun ctAxisTitle(data: dynamic): dynamic
|
||||
}
|
||||
|
||||
external object Chartist {
|
||||
@@ -73,7 +74,7 @@ fun getChartData(labels: List<String>, valuesList: Collection<List<*>>): dynamic
|
||||
return chartData
|
||||
}
|
||||
|
||||
fun getChartOptions(samples: Array<String>): dynamic {
|
||||
fun getChartOptions(samples: Array<String>, yTitle: String): dynamic {
|
||||
val chartOptions: dynamic = object{}
|
||||
chartOptions["fullWidth"] = true
|
||||
val paddingObject: dynamic = object{}
|
||||
@@ -83,11 +84,22 @@ fun getChartOptions(samples: Array<String>): dynamic {
|
||||
axisXObject["offset"] = 40
|
||||
chartOptions["axisX"] = axisXObject
|
||||
val axisYObject: dynamic = object{}
|
||||
axisYObject["offset"] = 70
|
||||
axisYObject["offset"] = 90
|
||||
chartOptions["axisY"] = axisYObject
|
||||
val legendObject: dynamic = object{}
|
||||
legendObject["legendNames"] = samples
|
||||
chartOptions["plugins"] = arrayOf(Chartist.plugins.legend(legendObject))
|
||||
val titleObject: dynamic = object{}
|
||||
val axisYTitle: dynamic = object{}
|
||||
axisYTitle["axisTitle"] = yTitle
|
||||
axisYTitle["axisClass"] = "ct-axis-title"
|
||||
val titleOffset: dynamic = {}
|
||||
titleOffset["x"] = 15
|
||||
titleOffset["y"] = 15
|
||||
axisYTitle["offset"] = titleOffset
|
||||
axisYTitle["textAnchor"] = "middle"
|
||||
axisYTitle["flipTitle"] = true
|
||||
titleObject["axisY"] = axisYTitle
|
||||
chartOptions["plugins"] = arrayOf(Chartist.plugins.legend(legendObject), Chartist.plugins.ctAxisTitle(titleObject))
|
||||
return chartOptions
|
||||
}
|
||||
|
||||
@@ -168,9 +180,7 @@ fun main(args: Array<String>) {
|
||||
val parsedParameter = it.split("=", limit = 2)
|
||||
if (parsedParameter.size == 2) {
|
||||
val (key, value) = parsedParameter
|
||||
if (parameters.containsKey(key)) {
|
||||
parameters[key] = value
|
||||
}
|
||||
parameters[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,23 +261,31 @@ fun main(args: Array<String>) {
|
||||
}
|
||||
separateValues(it.executionTime, executionTime) { value -> value.toDouble() }
|
||||
separateValues(it.compileTime, compileTime) { value -> value.toDouble() }
|
||||
separateValues(it.codeSize, codeSize) { value -> value.toDouble() }
|
||||
bundleSize.add(it.bundleSize?.toInt())
|
||||
separateValues(it.codeSize, codeSize) { value -> value.toDouble() / 1024.0 }
|
||||
bundleSize.add(it.bundleSize?.toInt()?. let { it / 1024 / 1024 })
|
||||
}
|
||||
|
||||
// Draw charts.
|
||||
val execChart = Chartist.Line("#exec_chart", getChartData(labels, executionTime.values),
|
||||
getChartOptions(executionTime.keys.toTypedArray()))
|
||||
getChartOptions(executionTime.keys.toTypedArray(), "Time, microseconds"))
|
||||
val compileChart = Chartist.Line("#compile_chart", getChartData(labels, compileTime.values),
|
||||
getChartOptions(compileTime.keys.toTypedArray()))
|
||||
getChartOptions(compileTime.keys.toTypedArray(), "Time, microseconds"))
|
||||
val codeSizeChart = Chartist.Line("#codesize_chart", getChartData(labels, codeSize.values),
|
||||
getChartOptions(codeSize.keys.toTypedArray()))
|
||||
getChartOptions(codeSize.keys.toTypedArray(), "Size, KB"))
|
||||
val bundleSizeChart = Chartist.Line("#bundlesize_chart", getChartData(labels, listOf(bundleSize)),
|
||||
getChartOptions(arrayOf("Bundle size")))
|
||||
getChartOptions(arrayOf("Bundle size"), "Size, MB"))
|
||||
|
||||
// Tooltips and higlights.
|
||||
customizeChart(execChart, "exec_chart", js("$(\"#exec_chart\")"), builds, parameters)
|
||||
customizeChart(compileChart, "compile_chart", js("$(\"#compile_chart\")"), builds, parameters)
|
||||
customizeChart(codeSizeChart, "codesize_chart", js("$(\"#codesize_chart\")"), builds, parameters)
|
||||
customizeChart(bundleSizeChart, "bundlesize_chart", js("$(\"#bundlesize_chart\")"), builds, parameters)
|
||||
|
||||
// Auto reload.
|
||||
parameters["refresh"]?.let {
|
||||
// Set event.
|
||||
window.setInterval({
|
||||
window.location.reload()
|
||||
}, it.toInt() * 1000)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user