Skip to content
This repository has been archived by the owner on Nov 20, 2022. It is now read-only.

Commit

Permalink
Rewrite task logic to follow gradle conventions and move to 4 spaces
Browse files Browse the repository at this point in the history
  • Loading branch information
alexstaeding committed Apr 11, 2022
1 parent b96d3db commit 1919fc5
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 112 deletions.
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true
69 changes: 35 additions & 34 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
id("com.gradle.plugin-publish").version("0.14.0")
`java-gradle-plugin`
kotlin("jvm")
kotlin("plugin.serialization")
id("com.gradle.plugin-publish").version("0.14.0")
`java-gradle-plugin`
kotlin("jvm")
kotlin("plugin.serialization")
}

group = "org.sourcegrade"
Expand All @@ -13,48 +13,49 @@ version = "0.5.0-SNAPSHOT"
val kotlinxSerializationVersion: String by project

repositories {
mavenCentral()
mavenCentral()
}

dependencies {
implementation(gradleKotlinDsl())
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:$kotlinxSerializationVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:$kotlinxSerializationVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinxSerializationVersion")
implementation(gradleKotlinDsl())
implementation("org.jetbrains:annotations:23.0.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:$kotlinxSerializationVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:$kotlinxSerializationVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinxSerializationVersion")
}

tasks {
withType<KotlinCompile> {
kotlinOptions.jvmTarget = "11"
}
withType<JavaCompile> {
options.encoding = "UTF-8"
sourceCompatibility = "11"
targetCompatibility = "11"
}
withType<KotlinCompile> {
kotlinOptions.jvmTarget = "11"
}
withType<JavaCompile> {
options.encoding = "UTF-8"
sourceCompatibility = "11"
targetCompatibility = "11"
}
}

gradlePlugin {
plugins {
create("submitter") {
id = "org.sourcegrade.submitter"
displayName = "Jagr Submitter"
description = "Gradle plugin for submitting source code for the Jagr AutoGrader"
implementationClass = "org.sourcegrade.submitter.SubmitterPlugin"
plugins {
create("submitter") {
id = "org.sourcegrade.submitter"
displayName = "Jagr Submitter"
description = "Gradle plugin for submitting source code for the Jagr AutoGrader"
implementationClass = "org.sourcegrade.submitter.SubmitterPlugin"
}
}
}
}

pluginBundle {
website = "https://www.sourcegrade.org"
vcsUrl = "https://github.com/SourceGrade/Submitter"
(plugins) {
"submitter" {
tags = listOf("jagr", "assignment", "submission", "grading")
website = "https://www.sourcegrade.org"
vcsUrl = "https://github.com/SourceGrade/Submitter"
(plugins) {
"submitter" {
tags = listOf("jagr", "assignment", "submission", "grading")
}
}
mavenCoordinates {
groupId = project.group.toString()
artifactId = "submitter"
}
}
mavenCoordinates {
groupId = project.group.toString()
artifactId = "submitter"
}
}
84 changes: 49 additions & 35 deletions src/main/kotlin/org/sourcegrade/submitter/PrepareSubmissionTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,52 +22,66 @@ package org.sourcegrade.submitter
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.testing.Test
import org.gradle.jvm.tasks.Jar
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.withType

internal fun Project.createPrepareSubmissionTask(configuration: SubmitConfigurationImpl) {
@Suppress("LeakingThis")
abstract class PrepareSubmissionTask : Jar() {

val mainResourcesFile = project.buildDir.resolve("resources/submit")
val submissionInfoFile = mainResourcesFile.resolve("submission-info.json")
@get:OutputDirectory
val mainResourcesFile = project.buildDir.resolve("resources/submit")

tasks.create<Jar>("prepareSubmission") {
if (configuration.requireTests) {
dependsOn(tasks.withType<Test>())
}
outputs.upToDateWhen { false }
group = "submit"
val sourceSets = project.extensions.getByName("sourceSets") as SourceSetContainer
from(*sourceSets.map { it.allSource }.toTypedArray())
with(configuration) {
archiveFileName.set("$assignmentId-$lastName-$firstName-submission.${archiveExtension ?: "jar"}")
@get:Internal
val submissionInfoFile = mainResourcesFile.resolve("submission-info.json")

init {
val submit = project.extensions.getByType<SubmitExtension>()
if (submit.requireTests) {
dependsOn(project.tasks.withType<Test>())
}
group = "submit"
val sourceSets = project.extensions.getByName("sourceSets") as SourceSetContainer
from(*sourceSets.map { it.allSource }.toTypedArray())
from(submissionInfoFile)
archiveFileName.set(
buildString {
append(submit.assignmentId, "-")
append(submit.lastName, "-")
append(submit.firstName, "-")
append("submission.", submit.archiveExtension ?: "jar")
}
)
}
doFirst {
val errors = StringBuilder().apply {
with(configuration) {
if (assignmentId == null) appendLine("assignmentId")
if (studentId == null) appendLine("studentId")
if (firstName == null) appendLine("firstName")
if (lastName == null) appendLine("lastName")

@TaskAction
fun runTask() {
val submit = project.extensions.getByType<SubmitExtension>()
val errors = buildString {
if (submit.assignmentId == null) appendLine("assignmentId")
if (submit.studentId == null) appendLine("studentId")
if (submit.firstName == null) appendLine("firstName")
if (submit.lastName == null) appendLine("lastName")
}
}
if (errors.isNotEmpty()) {
throw GradleException(
"""
if (errors.isNotEmpty()) {
throw GradleException(
"""
There were some errors preparing your submission. The following required properties were not set:
$errors
"""
)
}
val submissionInfo = configuration.toSubmissionInfo(sourceSets.map { it.toInfo() })
submissionInfoFile.apply {
parentFile.mkdirs()
writeText(Json.encodeToString(submissionInfo))
from(path)
}
)
}
val submissionInfo = submit.toSubmissionInfo(
project.extensions.getByType<SourceSetContainer>().map { it.toInfo() })
submissionInfoFile.apply {
parentFile.mkdirs()
writeText(Json.encodeToString(submissionInfo))
}
}
}
}
40 changes: 20 additions & 20 deletions src/main/kotlin/org/sourcegrade/submitter/SubmissionInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,36 +24,36 @@ import org.gradle.api.tasks.SourceSet

@Serializable
internal data class SubmissionInfo(
val assignmentId: String,
val studentId: String,
val firstName: String,
val lastName: String,
val sourceSets: List<SourceSetInfo>,
val assignmentId: String,
val studentId: String,
val firstName: String,
val lastName: String,
val sourceSets: List<SourceSetInfo>,
)

@Serializable
internal data class SourceSetInfo(
val name: String,
val files: List<String>,
val name: String,
val files: List<String>,
)

internal fun SubmitConfiguration.toSubmissionInfo(
sourceSets: List<SourceSetInfo>,
internal fun SubmitExtension.toSubmissionInfo(
sourceSets: List<SourceSetInfo>,
) = SubmissionInfo(
requireNotNull(assignmentId) { "assignmentId" },
requireNotNull(studentId) { "studentId" },
requireNotNull(firstName) { "firstName" },
requireNotNull(lastName) { "lastName" },
sourceSets,
requireNotNull(assignmentId) { "assignmentId" },
requireNotNull(studentId) { "studentId" },
requireNotNull(firstName) { "firstName" },
requireNotNull(lastName) { "lastName" },
sourceSets,
)

internal fun SourceSet.getFiles(): List<String> {
return allSource.files.map { file ->
allSource.srcDirs.asSequence()
.map(file::relativeTo)
.reduce { a, b -> if (a.path.length < b.path.length) a else b }
.path
}
return allSource.files.map { file ->
allSource.srcDirs.asSequence()
.map(file::relativeTo)
.reduce { a, b -> if (a.path.length < b.path.length) a else b }
.path
}
}

internal fun SourceSet.toInfo() = SourceSetInfo(name, getFiles())
35 changes: 15 additions & 20 deletions src/main/kotlin/org/sourcegrade/submitter/Submit.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,27 +20,22 @@
package org.sourcegrade.submitter

import kotlinx.serialization.Serializable
import org.gradle.api.Project

interface SubmitConfiguration {
var assignmentId: String?
var studentId: String?
var firstName: String?
var lastName: String?
var requireTests: Boolean
var archiveExtension: String?
interface SubmitExtension {
var assignmentId: String?
var studentId: String?
var firstName: String?
var lastName: String?
var requireTests: Boolean
var archiveExtension: String?
}

@Serializable
internal data class SubmitConfigurationImpl(
override var assignmentId: String? = null,
override var studentId: String? = null,
override var firstName: String? = null,
override var lastName: String? = null,
override var requireTests: Boolean = true,
override var archiveExtension: String? = null,
) : SubmitConfiguration

fun Project.submit(configure: SubmitConfiguration.() -> Unit) {
createPrepareSubmissionTask(SubmitConfigurationImpl().apply(configure))
}
internal data class SubmitExtensionImpl(
override var assignmentId: String? = null,
override var studentId: String? = null,
override var firstName: String? = null,
override var lastName: String? = null,
override var requireTests: Boolean = true,
override var archiveExtension: String? = null,
) : SubmitExtension
8 changes: 6 additions & 2 deletions src/main/kotlin/org/sourcegrade/submitter/SubmitterPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@ package org.sourcegrade.submitter

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.add
import org.gradle.kotlin.dsl.register

class SubmitterPlugin : Plugin<Project> {
override fun apply(target: Project) {
}
override fun apply(target: Project) {
target.extensions.add<SubmitExtension>("submit", SubmitExtensionImpl())
target.tasks.register<PrepareSubmissionTask>("prepareSubmission")
}
}

0 comments on commit 1919fc5

Please sign in to comment.