Add Readme generator
This commit is contained in:
parent
25784a6916
commit
b8635df01c
19
CHANGELOG.md
19
CHANGELOG.md
@ -6,6 +6,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
### Added
|
||||||
|
- Changelog plugin automatically applied to `project`
|
||||||
|
- Feature matrix and Readme generation task for a `project` plugin
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Remove node plugin and make node binaries available by default
|
||||||
|
- Use default webpack distribution path
|
||||||
|
- `ru.mipt.npm.base` -> `ru.mipt.npm.project`
|
||||||
|
- Move publishing out of general extension and apply it to project plugin instead.
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- Node plugin
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
### Security
|
||||||
|
## [0.6.0]
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Migrate to kotlin 1.4.0
|
- Migrate to kotlin 1.4.0
|
||||||
|
@ -6,7 +6,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "ru.mipt.npm"
|
group = "ru.mipt.npm"
|
||||||
version = "0.6.0"
|
version = "0.6.1"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
@ -29,13 +29,14 @@ dependencies {
|
|||||||
implementation("org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.14.4")
|
implementation("org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.14.4")
|
||||||
implementation("org.jetbrains.dokka:dokka-gradle-plugin:1.4.0")
|
implementation("org.jetbrains.dokka:dokka-gradle-plugin:1.4.0")
|
||||||
implementation("org.jetbrains.dokka:dokka-base:1.4.0")
|
implementation("org.jetbrains.dokka:dokka-base:1.4.0")
|
||||||
|
implementation("org.jetbrains.intellij.plugins:gradle-changelog-plugin:0.5.0")
|
||||||
}
|
}
|
||||||
|
|
||||||
gradlePlugin {
|
gradlePlugin {
|
||||||
plugins {
|
plugins {
|
||||||
create("kscience.base"){
|
create("kscience.project"){
|
||||||
id = "ru.mipt.npm.base"
|
id = "ru.mipt.npm.project"
|
||||||
description = "The basic plugin that does not do anything but loading classpath, versions and extensions"
|
description = "The root plugin for multimodule project infrastructure"
|
||||||
implementationClass = "ru.mipt.npm.gradle.KScienceBasePlugin"
|
implementationClass = "ru.mipt.npm.gradle.KScienceBasePlugin"
|
||||||
}
|
}
|
||||||
create("kscience.publish") {
|
create("kscience.publish") {
|
||||||
@ -67,12 +68,6 @@ gradlePlugin {
|
|||||||
description = "Additional native targets to be use alongside mpp"
|
description = "Additional native targets to be use alongside mpp"
|
||||||
implementationClass = "ru.mipt.npm.gradle.KScienceNativePlugin"
|
implementationClass = "ru.mipt.npm.gradle.KScienceNativePlugin"
|
||||||
}
|
}
|
||||||
|
|
||||||
create("kscience.node") {
|
|
||||||
id = "ru.mipt.npm.node"
|
|
||||||
description = "NodeJS target for kotlin-mpp and kotlin-js"
|
|
||||||
implementationClass = "ru.mipt.npm.gradle.KScienceNodePlugin"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
package ru.mipt.npm.gradle
|
|
||||||
|
|
||||||
import org.gradle.api.Plugin
|
|
||||||
import org.gradle.api.Project
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply extension and repositories
|
|
||||||
*/
|
|
||||||
open class KScienceBasePlugin : Plugin<Project> {
|
|
||||||
override fun apply(target: Project): Unit = target.run{
|
|
||||||
registerKScienceExtension()
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +1,7 @@
|
|||||||
package ru.mipt.npm.gradle
|
package ru.mipt.npm.gradle
|
||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.kotlin.dsl.*
|
import org.gradle.kotlin.dsl.findByType
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
|
||||||
@ -88,29 +88,6 @@ class KScienceExtension(val project: Project) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Activate publishing and configure it
|
|
||||||
*/
|
|
||||||
fun publish(block: Publishing.() -> Unit = {}) = Publishing().apply(block)
|
|
||||||
|
|
||||||
inner class Publishing {
|
|
||||||
init {
|
|
||||||
if (project.plugins.findPlugin(KSciencePublishPlugin::class) == null) {
|
|
||||||
project.plugins.apply(KSciencePublishPlugin::class)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var githubOrg: String? by project.extra
|
|
||||||
var githubProject: String? by project.extra
|
|
||||||
var spaceRepo: String? by project.extra
|
|
||||||
var spaceUser: String? by project.extra
|
|
||||||
var spaceToken: String? by project.extra
|
|
||||||
var bintrayOrg: String? by project.extra
|
|
||||||
var bintrayUser: String? by project.extra
|
|
||||||
var bintrayApiKey: String? by project.extra
|
|
||||||
var bintrayRepo: String? by project.extra
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun Project.registerKScienceExtension() {
|
internal fun Project.registerKScienceExtension() {
|
||||||
|
@ -19,14 +19,8 @@ open class KScienceJSPlugin : Plugin<Project> {
|
|||||||
configure<KotlinJsProjectExtension> {
|
configure<KotlinJsProjectExtension> {
|
||||||
explicitApiWarning()
|
explicitApiWarning()
|
||||||
js(IR) {
|
js(IR) {
|
||||||
browser {
|
browser()
|
||||||
webpackTask {
|
nodejs()
|
||||||
outputFileName = "main.bundle.js"
|
|
||||||
}
|
|
||||||
distribution {
|
|
||||||
directory = project.jsDistDirectory
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sourceSets["main"].apply {
|
sourceSets["main"].apply {
|
||||||
languageSettings.applySettings()
|
languageSettings.applySettings()
|
||||||
|
@ -26,14 +26,8 @@ open class KScienceMPPlugin : Plugin<Project> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
js(IR) {
|
js(IR) {
|
||||||
browser {
|
browser()
|
||||||
webpackTask {
|
nodejs()
|
||||||
outputFileName = "main.bundle.js"
|
|
||||||
}
|
|
||||||
distribution {
|
|
||||||
directory = project.jsDistDirectory
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets.invoke {
|
sourceSets.invoke {
|
||||||
@ -92,7 +86,7 @@ open class KScienceMPPlugin : Plugin<Project> {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
tasks.apply {
|
tasks.apply {
|
||||||
withType<Test>() {
|
withType<Test> {
|
||||||
useJUnitPlatform()
|
useJUnitPlatform()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
package ru.mipt.npm.gradle
|
|
||||||
|
|
||||||
import org.gradle.api.Plugin
|
|
||||||
import org.gradle.api.Project
|
|
||||||
import org.gradle.kotlin.dsl.configure
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
|
||||||
|
|
||||||
class KScienceNodePlugin : Plugin<Project> {
|
|
||||||
override fun apply(target: Project) = target.run{
|
|
||||||
pluginManager.withPlugin("org.jetbrains.kotlin.multiplatform") {
|
|
||||||
configure<KotlinMultiplatformExtension> {
|
|
||||||
js {
|
|
||||||
nodejs()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pluginManager.withPlugin("org.jetbrains.kotlin.js") {
|
|
||||||
configure<KotlinJsProjectExtension> {
|
|
||||||
js {
|
|
||||||
nodejs()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
133
src/main/kotlin/ru/mipt/npm/gradle/KScienceProjectPlugin.kt
Normal file
133
src/main/kotlin/ru/mipt/npm/gradle/KScienceProjectPlugin.kt
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
package ru.mipt.npm.gradle
|
||||||
|
|
||||||
|
import groovy.text.SimpleTemplateEngine
|
||||||
|
import org.gradle.api.Plugin
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.kotlin.dsl.apply
|
||||||
|
import org.gradle.kotlin.dsl.extra
|
||||||
|
import org.gradle.kotlin.dsl.findByType
|
||||||
|
import org.gradle.kotlin.dsl.provideDelegate
|
||||||
|
import org.jetbrains.changelog.ChangelogPlugin
|
||||||
|
import kotlin.collections.component1
|
||||||
|
import kotlin.collections.component2
|
||||||
|
|
||||||
|
class KSciencePublishingExtension(val project: Project) {
|
||||||
|
var githubOrg: String? by project.extra
|
||||||
|
var githubProject: String? by project.extra
|
||||||
|
var spaceRepo: String? by project.extra
|
||||||
|
var spaceUser: String? by project.extra
|
||||||
|
var spaceToken: String? by project.extra
|
||||||
|
var bintrayOrg: String? by project.extra
|
||||||
|
var bintrayUser: String? by project.extra
|
||||||
|
var bintrayApiKey: String? by project.extra
|
||||||
|
var bintrayRepo: String? by project.extra
|
||||||
|
}
|
||||||
|
|
||||||
|
class KScienceReadmeExtension(val project: Project) {
|
||||||
|
val properties = HashMap<String, String>()
|
||||||
|
var readmeStubPath: String = "docs/README-STUB.md"
|
||||||
|
val features = ArrayList<Feature>()
|
||||||
|
|
||||||
|
data class Feature(val id: String, val ref: String, val description: String, val name: String = id)
|
||||||
|
|
||||||
|
|
||||||
|
fun feature(id: String, ref: String, description: String, name: String = id) {
|
||||||
|
features.add(Feature(id, ref, description, name))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a markdown string listing features
|
||||||
|
*/
|
||||||
|
fun featuresString(itemPrefix: String = " - ", pathPrefix: String = "") = buildString {
|
||||||
|
features.forEach {
|
||||||
|
appendln("$itemPrefix[${it.id}]($pathPrefix${it.ref}) : ${it.description}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a readme string from the stub
|
||||||
|
*/
|
||||||
|
fun readmeString(): String? {
|
||||||
|
val readmeStubFile = project.file(readmeStubPath)
|
||||||
|
return if (readmeStubFile.exists()) {
|
||||||
|
buildString {
|
||||||
|
|
||||||
|
val readmeProperties: Map<String, Any?> = (properties + mapOf(
|
||||||
|
"name" to project.name,
|
||||||
|
"group" to project.group,
|
||||||
|
"version" to project.version,
|
||||||
|
"features" to featuresString()
|
||||||
|
)).withDefault { null }
|
||||||
|
SimpleTemplateEngine().createTemplate(readmeStubFile).make(properties).toString()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply extension and repositories
|
||||||
|
*/
|
||||||
|
open class KScienceProjectPlugin : Plugin<Project> {
|
||||||
|
override fun apply(target: Project): Unit = target.run {
|
||||||
|
apply<ChangelogPlugin>()
|
||||||
|
val rootReadmeExtension = KScienceReadmeExtension(this)
|
||||||
|
extensions.add("ksciencePublish", KSciencePublishingExtension(this))
|
||||||
|
extensions.add("kscienceReadme", rootReadmeExtension)
|
||||||
|
|
||||||
|
//Add readme generators to individual subprojects
|
||||||
|
subprojects {
|
||||||
|
val readmeExtension = KScienceReadmeExtension(this)
|
||||||
|
extensions.add("kscienceReadme", readmeExtension)
|
||||||
|
tasks.create("generateReadme") {
|
||||||
|
group = "documentation"
|
||||||
|
description = "Generate a README file if stub is present"
|
||||||
|
doLast {
|
||||||
|
val readmeString = readmeExtension.readmeString()
|
||||||
|
if (readmeString != null) {
|
||||||
|
val readmeFile = file("README.md")
|
||||||
|
readmeFile.writeText(readmeString)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.create("generateReadme") {
|
||||||
|
group = "documentation"
|
||||||
|
description = "Generate a README file and a feature matrix if stub is present"
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
val reader = groovy.json.JsonSlurper()
|
||||||
|
val projects = subprojects.associate {
|
||||||
|
it.name to it.extensions.findByType<KScienceReadmeExtension>()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val rootReadmeStub = project.file(rootReadmeExtension.readmeStubPath)
|
||||||
|
if (rootReadmeStub.exists()) {
|
||||||
|
|
||||||
|
val modulesString = buildString {
|
||||||
|
projects.entries.filter { !it.value?.features.isNullOrEmpty() }.forEach { (name, ext) ->
|
||||||
|
appendln("### [$name]($name)")
|
||||||
|
appendln(ext!!.featuresString(pathPrefix = "$name/"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val rootReadmeProperties: Map<String, Any> = mapOf(
|
||||||
|
"name" to project.name,
|
||||||
|
"group" to project.group,
|
||||||
|
"version" to project.version,
|
||||||
|
"modulesString" to modulesString
|
||||||
|
)
|
||||||
|
|
||||||
|
val readmeFile = project.file("README.md")
|
||||||
|
readmeFile.writeText(
|
||||||
|
SimpleTemplateEngine().createTemplate(rootReadmeStub).make(rootReadmeProperties).toString()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -11,9 +11,8 @@ import org.gradle.kotlin.dsl.withType
|
|||||||
|
|
||||||
open class KSciencePublishPlugin : Plugin<Project> {
|
open class KSciencePublishPlugin : Plugin<Project> {
|
||||||
|
|
||||||
override fun apply(project: Project): Unit = project.run{
|
override fun apply(project: Project): Unit = project.run {
|
||||||
plugins.apply("maven-publish")
|
plugins.apply("maven-publish")
|
||||||
registerKScienceExtension()
|
|
||||||
|
|
||||||
afterEvaluate {
|
afterEvaluate {
|
||||||
val githubOrg: String = project.findProperty("githubOrg") as? String ?: "mipt-npm"
|
val githubOrg: String = project.findProperty("githubOrg") as? String ?: "mipt-npm"
|
||||||
|
Loading…
Reference in New Issue
Block a user