Skip to content

Commit 5ccb1cb

Browse files
authored
Issue-36: Support sort asc or desc
Issue-36: Support sort asc or desc
2 parents b902c6c + 73a0377 commit 5ccb1cb

File tree

7 files changed

+164
-16
lines changed

7 files changed

+164
-16
lines changed

README.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ If you are the fiddling type, you can customize the plugin as follows:
2323

2424
```
2525
buildTimeTracker {
26-
barPosition = TRAILING or LEADING, default is TRAILING
26+
barPosition = BarPosition.TRAILING or BarPosition.LEADING, default is TRAILING
27+
// Deprecated: Will be removed in v5, use sortBy
2728
sort = false or true, default is false
28-
output = CONSOLE or CSV, default is CONSOLE
29+
sortBy = Sort.ASC, Sort.DESC, or Sort.NONE, default is NONE
30+
output = Output.CONSOLE or Output.CSV, default is CONSOLE
2931
maxWidth = 120, default is 80
3032
minTaskDuration = Duration.ofSeconds(1), don't show tasks that take less than a second to execute
3133
showBars = false or true, default is true
@@ -35,6 +37,8 @@ buildTimeTracker {
3537

3638
> If you are using Kotlin build script, set the configuration properties using `property.set()` method.
3739
40+
> `BarPosition`, `Sort`, and `Output` are enums, so, they need to be imported or fully-qualified.
41+
3842
:information_source: Due to a
3943
[Gradle limitation](https://docs.gradle.org/6.5.1/userguide/upgrading_version_5.html#apis_buildlistener_buildstarted_and_gradle_buildstarted_have_been_deprecated)
4044
and the ill-thought-out [Configuration Cache](https://github.com/gradle/gradle/issues/18520) design, the build duration

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pluginImplementationClass = com.asarkar.gradle.buildtimetracker.BuildTimeTracker
1111
pluginDeclarationName = buildTimeTrackerPlugin
1212

1313
projectGroup = com.asarkar.gradle
14-
projectVersion = 4.1.0
14+
projectVersion = 4.2.0
1515

1616
junitVersion = latest.release
1717
assertjVersion = latest.release

src/main/kotlin/com/asarkar/gradle/buildtimetracker/BuildTimeTrackerPlugin.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class BuildTimeTrackerPlugin @Inject constructor(private val registry: BuildEven
3030

3131
private fun copyParams(src: BuildTimeTrackerPluginExtension, dest: BuildTimeTrackerPluginParams) {
3232
dest.barPosition = src.barPosition.get()
33-
dest.sort = src.sort.get()
33+
dest.sortBy = if (src.sort.get()) Sort.DESC else src.sortBy.get()
3434
dest.output = src.output.get()
3535
dest.maxWidth = src.maxWidth.get()
3636
dest.minTaskDuration = src.minTaskDuration.get()

src/main/kotlin/com/asarkar/gradle/buildtimetracker/BuildTimeTrackerPluginHelper.kt

+10-2
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,19 @@ enum class Output {
1515
CONSOLE, CSV
1616
}
1717

18+
enum class Sort {
19+
ASC, DESC, NONE
20+
}
21+
1822
open class BuildTimeTrackerPluginExtension(private val project: Project) {
1923
val barPosition: Property<BarPosition> = project.objects.property(BarPosition::class.java)
2024
.convention(Constants.DEFAULT_BAR_POSITION)
25+
26+
@Deprecated("Will be removed in v5, use sortBy")
2127
val sort: Property<Boolean> = project.objects.property(Boolean::class.java)
22-
.convention(Constants.DEFAULT_SORT)
28+
.convention(false)
29+
val sortBy: Property<Sort> = project.objects.property(Sort::class.java)
30+
.convention(Constants.DEFAULT_SORT_BY)
2331
val output: Property<Output> = project.objects.property(Output::class.java)
2432
.convention(Constants.DEFAULT_OUTPUT)
2533
val maxWidth: Property<Int> = project.objects.property(Int::class.java)
@@ -38,7 +46,7 @@ open class BuildTimeTrackerPluginExtension(private val project: Project) {
3846

3947
open class BuildTimeTrackerPluginParams(var reportsDir: File) : java.io.Serializable {
4048
var barPosition = Constants.DEFAULT_BAR_POSITION
41-
var sort = Constants.DEFAULT_SORT
49+
var sortBy = Constants.DEFAULT_SORT_BY
4250
var output = Constants.DEFAULT_OUTPUT
4351
var maxWidth = Constants.DEFAULT_MAX_WIDTH
4452
var minTaskDuration: Duration = Duration.ofSeconds(Constants.DEFAULT_MIN_TASK_DURATION)

src/main/kotlin/com/asarkar/gradle/buildtimetracker/Constants.kt

+1-3
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@ package com.asarkar.gradle.buildtimetracker
22

33
object Constants {
44
const val PLUGIN_EXTENSION_NAME = "buildTimeTracker"
5-
const val EXTRA_EXTENSION_NAME = "extra"
6-
const val LOGGER_KEY = "logger"
75
val DEFAULT_BAR_POSITION = BarPosition.TRAILING
8-
const val DEFAULT_SORT = false
96
val DEFAULT_OUTPUT = Output.CONSOLE
7+
val DEFAULT_SORT_BY = Sort.NONE
108
const val DEFAULT_MAX_WIDTH = 80
119
const val DEFAULT_MIN_TASK_DURATION = 1L
1210
const val DEFAULT_SHOW_BARS = true

src/main/kotlin/com/asarkar/gradle/buildtimetracker/TimingRecorder.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,14 @@ abstract class TimingRecorder : BuildService<TimingRecorder.Params>, OperationCo
3737
val buildDuration = Duration.between(buildStarted, Instant.now()).seconds
3838
Printer.newInstance(params)
3939
.use { printer ->
40+
val durations = when (params.sortBy) {
41+
Sort.NONE -> taskDurations
42+
Sort.DESC -> taskDurations.sortedBy { -it.second }
43+
Sort.ASC -> taskDurations.sortedBy { it.second }
44+
}
4045
val input = PrinterInput(
4146
buildDuration,
42-
if (params.sort) taskDurations.sortedBy { -it.second } else taskDurations,
47+
durations,
4348
params.maxWidth,
4449
params.showBars,
4550
params.barPosition

src/test/kotlin/com/asarkar/gradle/buildtimetracker/BuildTimeTrackerPluginFunctionalTest.kt

+139-6
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class BuildTimeTrackerPluginFunctionalTest {
5050
import ${Thread::class.qualifiedName}
5151
import ${Output::class.qualifiedName}
5252
import ${Duration::class.qualifiedName}
53+
import ${Sort::class.qualifiedName}
5354
5455
plugins {
5556
id("${props.getProperty("pluginId")}")
@@ -82,7 +83,7 @@ class BuildTimeTrackerPluginFunctionalTest {
8283

8384
println(buildFile.readText())
8485

85-
val result = run()
86+
val result = run(taskName)
8687

8788
assertThat(result.task(taskName)?.outcome == SUCCESS)
8889
val lines = result.output
@@ -110,7 +111,7 @@ class BuildTimeTrackerPluginFunctionalTest {
110111

111112
println(buildFile.readText())
112113

113-
val result = run()
114+
val result = run(taskName)
114115

115116
assertThat(result.task(taskName)?.outcome == SUCCESS)
116117
val lines = result.output
@@ -140,7 +141,7 @@ class BuildTimeTrackerPluginFunctionalTest {
140141

141142
println(buildFile.readText())
142143

143-
val result = run()
144+
val result = run(taskName)
144145
val csvFile = testProjectDir.resolve(Constants.CSV_FILENAME)
145146
assertThat(result.task(taskName)?.outcome == SUCCESS)
146147
assertThat(Files.exists(csvFile)).isTrue
@@ -166,7 +167,7 @@ class BuildTimeTrackerPluginFunctionalTest {
166167

167168
println(buildFile.readText())
168169

169-
val result = run()
170+
val result = run(taskName)
170171
val csvFile = testProjectDir.resolve(Constants.CSV_FILENAME)
171172
assertThat(result.task(taskName)?.outcome == SUCCESS)
172173
assertThat(Files.exists(csvFile)).isTrue
@@ -175,10 +176,142 @@ class BuildTimeTrackerPluginFunctionalTest {
175176
assertThat(lines.first()).isEqualTo(":$taskName,0S,0%,")
176177
}
177178

178-
private fun run(): BuildResult {
179+
@Test
180+
fun testSort() {
181+
newBuildFile("build.gradle.kts")
182+
Files.newBufferedWriter(buildFile, APPEND).use {
183+
it.write(
184+
"""
185+
tasks.register("a") {
186+
doLast {
187+
Thread.sleep(1100)
188+
println("Hello, World!")
189+
}
190+
}
191+
tasks.register("b") {
192+
doLast {
193+
Thread.sleep(2100)
194+
println("Hi there!")
195+
}
196+
}
197+
${Constants.PLUGIN_EXTENSION_NAME} {
198+
minTaskDuration.set(Duration.ofMillis(100))
199+
sort.set(true)
200+
}
201+
""".trimIndent()
202+
)
203+
}
204+
205+
println(buildFile.readText())
206+
207+
val result = run("a", "b")
208+
209+
assertThat(result.task(taskName)?.outcome == SUCCESS)
210+
val lines = result.output
211+
.lines()
212+
.filter { it.isNotEmpty() }
213+
assertThat(lines).hasSizeGreaterThanOrEqualTo(4)
214+
assertThat(lines[0]).isEqualTo("> Task :a")
215+
assertThat(lines[1]).isEqualTo("Hello, World!")
216+
assertThat(lines[2]).isEqualTo("> Task :b")
217+
assertThat(lines[3]).isEqualTo("Hi there!")
218+
assertThat(lines[4]).isEqualTo("== Build time summary ==")
219+
assertThat(lines[5]).isEqualTo(":b | 2S | 67% | ${Printer.BLOCK_CHAR.toString().repeat(2)}")
220+
assertThat(lines[6]).isEqualTo(":a | 1S | 33% | ${Printer.BLOCK_CHAR}")
221+
}
222+
223+
@Test
224+
fun testSortByDesc() {
225+
newBuildFile("build.gradle.kts")
226+
Files.newBufferedWriter(buildFile, APPEND).use {
227+
it.write(
228+
"""
229+
tasks.register("a") {
230+
doLast {
231+
Thread.sleep(1100)
232+
println("Hello, World!")
233+
}
234+
}
235+
tasks.register("b") {
236+
doLast {
237+
Thread.sleep(2100)
238+
println("Hi there!")
239+
}
240+
}
241+
${Constants.PLUGIN_EXTENSION_NAME} {
242+
minTaskDuration.set(Duration.ofMillis(100))
243+
sortBy.set(Sort.DESC)
244+
}
245+
""".trimIndent()
246+
)
247+
}
248+
249+
println(buildFile.readText())
250+
251+
val result = run("a", "b")
252+
253+
assertThat(result.task(taskName)?.outcome == SUCCESS)
254+
val lines = result.output
255+
.lines()
256+
.filter { it.isNotEmpty() }
257+
assertThat(lines).hasSizeGreaterThanOrEqualTo(4)
258+
assertThat(lines[0]).isEqualTo("> Task :a")
259+
assertThat(lines[1]).isEqualTo("Hello, World!")
260+
assertThat(lines[2]).isEqualTo("> Task :b")
261+
assertThat(lines[3]).isEqualTo("Hi there!")
262+
assertThat(lines[4]).isEqualTo("== Build time summary ==")
263+
assertThat(lines[5]).isEqualTo(":b | 2S | 67% | ${Printer.BLOCK_CHAR.toString().repeat(2)}")
264+
assertThat(lines[6]).isEqualTo(":a | 1S | 33% | ${Printer.BLOCK_CHAR}")
265+
}
266+
267+
@Test
268+
fun testSortByAsc() {
269+
newBuildFile("build.gradle.kts")
270+
Files.newBufferedWriter(buildFile, APPEND).use {
271+
it.write(
272+
"""
273+
tasks.register("a") {
274+
doLast {
275+
Thread.sleep(1100)
276+
println("Hello, World!")
277+
}
278+
}
279+
tasks.register("b") {
280+
doLast {
281+
Thread.sleep(2100)
282+
println("Hi there!")
283+
}
284+
}
285+
${Constants.PLUGIN_EXTENSION_NAME} {
286+
minTaskDuration.set(Duration.ofMillis(100))
287+
sortBy.set(Sort.ASC)
288+
}
289+
""".trimIndent()
290+
)
291+
}
292+
293+
println(buildFile.readText())
294+
295+
val result = run("a", "b")
296+
297+
assertThat(result.task(taskName)?.outcome == SUCCESS)
298+
val lines = result.output
299+
.lines()
300+
.filter { it.isNotEmpty() }
301+
assertThat(lines).hasSizeGreaterThanOrEqualTo(4)
302+
assertThat(lines[0]).isEqualTo("> Task :a")
303+
assertThat(lines[1]).isEqualTo("Hello, World!")
304+
assertThat(lines[2]).isEqualTo("> Task :b")
305+
assertThat(lines[3]).isEqualTo("Hi there!")
306+
assertThat(lines[4]).isEqualTo("== Build time summary ==")
307+
assertThat(lines[5]).isEqualTo(":a | 1S | 33% | ${Printer.BLOCK_CHAR}")
308+
assertThat(lines[6]).isEqualTo(":b | 2S | 67% | ${Printer.BLOCK_CHAR.toString().repeat(2)}")
309+
}
310+
311+
private fun run(vararg tasks: String): BuildResult {
179312
return GradleRunner.create()
180313
.withProjectDir(testProjectDir.toFile())
181-
.withArguments(taskName, "--warning-mode=all", "--stacktrace")
314+
.withArguments(*tasks, "--warning-mode=all", "--stacktrace")
182315
.withPluginClasspath()
183316
.withDebug(false)
184317
.forwardOutput()

0 commit comments

Comments
 (0)