diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 98ebf0b..74d10b9 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -23,4 +23,6 @@ jobs:
env:
tag: ${{ github.event.release.tag_name }}
- run: ./gradlew :plugin-core:publishGprPublicationToGitHubPackagesRepository
+ - run: ./gradlew :plugin-preset:publishGprPublicationToGitHubPackagesRepository
- run: ./gradlew :plugin-core:bintrayUpload
+ - run: ./gradlew :plugin-preset:bintrayUpload
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index d495221..467340d 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -11,6 +11,7 @@
+
diff --git a/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/LibrarianPlugin.kt b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/LibrarianPlugin.kt
index 6164139..770059c 100644
--- a/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/LibrarianPlugin.kt
+++ b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/LibrarianPlugin.kt
@@ -1,18 +1,17 @@
package net.meilcli.librarian.plugin
+import net.meilcli.librarian.plugin.extensions.createTask
+import net.meilcli.librarian.plugin.tasks.GenerateArtifactsTask
import net.meilcli.librarian.plugin.tasks.GenerateGroupsTask
import net.meilcli.librarian.plugin.tasks.GeneratePagesTask
-import net.meilcli.librarian.plugin.tasks.GenerateArtifactsTask
import net.meilcli.librarian.plugin.tasks.ShowConfigurationsTask
import org.gradle.api.Plugin
import org.gradle.api.Project
-import org.gradle.api.Task
open class LibrarianPlugin : Plugin {
companion object {
- private const val librarianGroup = "librarian"
private const val librarianExtension = "librarian"
}
@@ -35,10 +34,4 @@ open class LibrarianPlugin : Plugin {
this.extension = extension
}
}
-
- private inline fun Project.createTask(name: String): T {
- val task = tasks.create(name, T::class.java)
- task.group = librarianGroup
- return task
- }
}
\ No newline at end of file
diff --git a/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/entities/LibraryGroup.kt b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/entities/LibraryGroup.kt
index ed315a7..f1c0302 100644
--- a/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/entities/LibraryGroup.kt
+++ b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/entities/LibraryGroup.kt
@@ -23,4 +23,6 @@ data class LibraryGroup(
@SerialName("licenses")
val licenses: List?
-)
\ No newline at end of file
+) {
+ constructor(artifacts: List, name: String) : this(artifacts, name, null, null, null, null)
+}
\ No newline at end of file
diff --git a/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/extensions/ProjectExtensions.kt b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/extensions/ProjectExtensions.kt
new file mode 100644
index 0000000..7870423
--- /dev/null
+++ b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/extensions/ProjectExtensions.kt
@@ -0,0 +1,12 @@
+package net.meilcli.librarian.plugin.extensions
+
+import org.gradle.api.Project
+import org.gradle.api.Task
+
+const val librarianGroup = "librarian"
+
+inline fun Project.createTask(name: String): T {
+ val task = tasks.create(name, T::class.java)
+ task.group = librarianGroup
+ return task
+}
\ No newline at end of file
diff --git a/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/internal/GroupWriter.kt b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/internal/GroupWriter.kt
new file mode 100644
index 0000000..a9b8baf
--- /dev/null
+++ b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/internal/GroupWriter.kt
@@ -0,0 +1,29 @@
+package net.meilcli.librarian.plugin.internal
+
+import kotlinx.serialization.UnstableDefault
+import kotlinx.serialization.json.Json
+import net.meilcli.librarian.plugin.LibrarianExtension
+import net.meilcli.librarian.plugin.entities.LibraryGroup
+import org.gradle.api.Project
+import java.io.File
+
+object GroupWriter {
+
+ @UnstableDefault
+ fun write(project: Project, extension: LibrarianExtension, groups: Collection) {
+ val outputDirectory = File(project.rootProject.rootDir, "${extension.dataFolderName}/${extension.groupsFolderName}")
+ if (outputDirectory.exists().not()) {
+ outputDirectory.mkdirs()
+ }
+
+ val json = Json {
+ this.prettyPrint = true
+ }
+
+ for (group in groups) {
+ val outputFile = File(outputDirectory, "${group.name}.json")
+ val text = json.stringify(LibraryGroup.serializer(), group)
+ outputFile.writeText(text, Charsets.UTF_8)
+ }
+ }
+}
\ No newline at end of file
diff --git a/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/tasks/GenerateGroupsTask.kt b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/tasks/GenerateGroupsTask.kt
index 1ee7d0b..c19f259 100644
--- a/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/tasks/GenerateGroupsTask.kt
+++ b/plugin-core/src/main/kotlin/net/meilcli/librarian/plugin/tasks/GenerateGroupsTask.kt
@@ -1,15 +1,14 @@
package net.meilcli.librarian.plugin.tasks
import kotlinx.serialization.UnstableDefault
-import kotlinx.serialization.json.Json
import net.meilcli.librarian.plugin.LibrarianExtension
import net.meilcli.librarian.plugin.entities.LibraryGroup
import net.meilcli.librarian.plugin.entities.License
+import net.meilcli.librarian.plugin.internal.GroupWriter
import net.meilcli.librarian.plugin.internal.Placeholder
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
-import java.io.File
open class GenerateGroupsTask : DefaultTask() {
@@ -41,19 +40,6 @@ open class GenerateGroupsTask : DefaultTask() {
)
}
- val outputDirectory = File(project.rootProject.rootDir, "${extension.dataFolderName}/${extension.groupsFolderName}")
- if (outputDirectory.exists().not()) {
- outputDirectory.mkdirs()
- }
-
- val json = Json {
- this.prettyPrint = true
- }
-
- for (group in groups) {
- val outputFile = File(outputDirectory, "${group.name}.json")
- val text = json.stringify(LibraryGroup.serializer(), group)
- outputFile.writeText(text, Charsets.UTF_8)
- }
+ GroupWriter.write(project, extension, groups)
}
}
\ No newline at end of file
diff --git a/plugin-preset/.gitignore b/plugin-preset/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/plugin-preset/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/plugin-preset/build.gradle b/plugin-preset/build.gradle
new file mode 100644
index 0000000..f7a412c
--- /dev/null
+++ b/plugin-preset/build.gradle
@@ -0,0 +1,24 @@
+import net.meilcli.librarian.gradle.Dependencies
+
+apply plugin: 'java-gradle-plugin'
+apply plugin: 'kotlin'
+apply plugin: 'KotlinLibraryPlugin'
+apply plugin: 'maven-publish'
+apply plugin: 'com.jfrog.bintray'
+apply plugin: 'MavenPublishPlugin'
+
+dependencies {
+ implementation project(':plugin-core')
+ implementation Dependencies.Kotlin.Serialization.runtime
+}
+
+gradlePlugin {
+ plugins {
+ librarianPlugin {
+ id = "librarian-preset"
+ displayName = "Librarian Preset Plugin"
+ description = "Librarian is generate notice that library used in gradle module"
+ implementationClass = "net.meilcli.librarian.plugin.LibrarianPresetPlugin"
+ }
+ }
+}
\ No newline at end of file
diff --git a/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/LibrarianPresetPlugin.kt b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/LibrarianPresetPlugin.kt
new file mode 100644
index 0000000..6249e84
--- /dev/null
+++ b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/LibrarianPresetPlugin.kt
@@ -0,0 +1,17 @@
+package net.meilcli.librarian.plugin
+
+import net.meilcli.librarian.plugin.extensions.createTask
+import net.meilcli.librarian.plugin.tasks.GeneratePresetGroupsTask
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+
+class LibrarianPresetPlugin : Plugin {
+
+ override fun apply(project: Project) {
+ val extension = checkNotNull(project.extensions.findByType(LibrarianExtension::class.java)) { "must apply plugin librarian" }
+
+ project.createTask("librarianGeneratePresetGroups").apply {
+ this.extension = extension
+ }
+ }
+}
\ No newline at end of file
diff --git a/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/Kotlin.kt b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/Kotlin.kt
new file mode 100644
index 0000000..feb621e
--- /dev/null
+++ b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/Kotlin.kt
@@ -0,0 +1,82 @@
+@file:Suppress("SpellCheckingInspection")
+
+package net.meilcli.librarian.plugin.presets
+
+fun kotlin(){
+ PresetGroups += group(
+ "Kotlin",
+ "org.jetbrains.kotlin",
+ "kotlin-stdlib",
+ "kotlin-stdlib-jdk8",
+ "kotlin-stdlib-jdk7",
+ "kotlin-stdlib-jre7",
+ "kotlin-stdlib-jre8",
+ "kotlin-stdlib-js",
+ "kotlin-stdlib-common",
+ "kotlin-reflect",
+ "kotlin-test",
+ "kotlin-test-junit",
+ "kotlin-test-junit5",
+ "kotlin-test-common",
+ "kotlin-test-js",
+ "kotlin-android-extensions-runtime",
+ "kotlin-android-extensions",
+ "kotlin-gradle-plugin",
+ "kotlin-noarg",
+ "kotlin-allopen"
+ )
+ PresetGroups += group(
+ "kotlinx.serialization",
+ "org.jetbrains.kotlinx",
+ "kotlinx-serialization-runtime",
+ "kotlinx-serialization-runtime-common",
+ "kotlinx-serialization-runtime-js",
+ "kotlinx-serialization-runtime-native",
+ "kotlinx-serialization-runtime-iosx64",
+ "kotlinx-serialization-runtime-macosx64",
+ "kotlinx-serialization-runtime-iosarm64",
+ "kotlinx-serialization-runtime-tvosarm64",
+ "kotlinx-serialization-runtime-linuxx64",
+ "kotlinx-serialization-runtime-watchosx86",
+ "kotlinx-serialization-runtime-watchosarm64",
+ "kotlinx-serialization-runtime-tvosx64",
+ "kotlinx-serialization-runtime-mingwx64",
+ "kotlinx-serialization-runtime-iosarm32",
+ "kotlinx-serialization-runtime-watchosarm32",
+ "kotlinx-serialization-runtime-jsonparser",
+ "kotlinx-serialization-runtime-linuxarm32hfp",
+ "kotlinx-serialization-runtime-mingwx86",
+ "kotlinx-serialization-runtime-linuxarm64",
+ "kotlinx-serialization-runtime-wasm32",
+ "kotlinx-serialization-protobuf-common",
+ "kotlinx-serialization-protobuf",
+ "kotlinx-serialization-cbor"
+ )
+ PresetGroups += group(
+ "kotlinx.coroutines",
+ "org.jetbrains.kotlinx",
+ "kotlinx-coroutines-core",
+ "kotlinx-coroutines-android",
+ "kotlinx-coroutines-jdk8",
+ "kotlinx-coroutines-rx2",
+ "kotlinx-coroutines-reactor",
+ "kotlinx-coroutines-javafx",
+ "kotlinx-coroutines-reactive",
+ "kotlinx-coroutines-core-common",
+ "kotlinx-coroutines-core-native",
+ "kotlinx-coroutines-core-js",
+ "kotlinx-coroutines-core-iosx64",
+ "kotlinx-coroutines-core-iosarm64",
+ "kotlinx-coroutines-core-macosx64",
+ "kotlinx-coroutines-core-linuxx64",
+ "kotlinx-coroutines-core-iosarm32",
+ "kotlinx-coroutines-core-windowsx64",
+ "kotlinx-coroutines-core-mingwx64",
+ "kotlinx-coroutines-core-tvosarm64",
+ "kotlinx-coroutines-core-watchosx86",
+ "kotlinx-coroutines-core-watchosarm64",
+ "kotlinx-coroutines-core-tvosx64",
+ "kotlinx-coroutines-core-watchosarm32",
+ "kotlinx-coroutines-test"
+ )
+}
\ No newline at end of file
diff --git a/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/PresetGroups.kt b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/PresetGroups.kt
new file mode 100644
index 0000000..6c86a60
--- /dev/null
+++ b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/PresetGroups.kt
@@ -0,0 +1,19 @@
+package net.meilcli.librarian.plugin.presets
+
+import net.meilcli.librarian.plugin.entities.LibraryGroup
+
+object PresetGroups {
+
+ private val mutableGroups = mutableListOf()
+ val groups: List
+ get() = mutableGroups
+
+ operator fun plusAssign(group: LibraryGroup) {
+ mutableGroups += group
+ }
+
+ init {
+ kotlin()
+ square()
+ }
+}
\ No newline at end of file
diff --git a/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/Square.kt b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/Square.kt
new file mode 100644
index 0000000..c82911c
--- /dev/null
+++ b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/Square.kt
@@ -0,0 +1,95 @@
+@file:Suppress("SpellCheckingInspection")
+
+package net.meilcli.librarian.plugin.presets
+
+fun square() {
+ PresetGroups += group(
+ "Okio",
+ "com.squareup.okio",
+ "okio-parent",
+ "okio",
+ "okio-js",
+ "okio-metadata",
+ "okio-multiplatform",
+ "okio-iosx64",
+ "okio-macosx64",
+ "okio-iosarm64",
+ "okio-linuxx64"
+ )
+ PresetGroups += group(
+ "OkHttp",
+ "com.squareup.okhttp3",
+ "parent",
+ "okhttp",
+ "logging-interceptor",
+ "mockwebserver",
+ "okhttp-urlconnection",
+ "okhttp-testing-support",
+ "okhttp-tls",
+ "okhttp-sse",
+ "okhttp-dnsoverhttps",
+ "okcurl",
+ "okhttp-bom",
+ "okhttp-brotli"
+ )
+ PresetGroups += group(
+ "Retrofit",
+ "com.squareup.retrofit2",
+ "parent",
+ "retrofit",
+ "retrofit-mock",
+ "retrofit-converters",
+ "retrofit-adapters",
+ "converter-jackson",
+ "converter-scalars",
+ "converter-simplexml",
+ "converter-jaxb",
+ "converter-java8",
+ "converter-guava",
+ "converter-gson",
+ "converter-moshi",
+ "converter-wire",
+ "converter-protobuf",
+ "adapter-rxjava",
+ "adapter-rxjava2",
+ "adapter-scala",
+ "adapter-java8",
+ "adapter-guava"
+ )
+ PresetGroups += group(
+ "Picasso",
+ "com.squareup.picasso",
+ "picasso-parent",
+ "picasso",
+ "picasso-pollexor"
+ )
+ PresetGroups += group(
+ "Moshi",
+ "com.squareup.moshi",
+ "moshi-parent",
+ "moshi",
+ "moshi-kotlin",
+ "moshi-adapters",
+ "moshi-kotlin-codegen"
+ )
+ PresetGroups += group(
+ "LeakCanary",
+ "com.squareup.leakcanary",
+ "leakcanary-android",
+ "leakcanary-android-no-op",
+ "leakcanary-android-core",
+ "leakcanary-android-process",
+ "leakcanary-android-instrumentation",
+ "leakcanary-object-watcher",
+ "leakcanary-deobfuscation-gradle-plugin",
+ "leakcanary-object-watcher-android-support-fragments",
+ "leakcanary-object-watcher-android",
+ "leakcanary-object-watcher-android-androidx",
+ "shark-log",
+ "shark-graph",
+ "shark-android",
+ "shark",
+ "shark-cli",
+ "shark-hprof"
+ )
+}
diff --git a/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/group.kt b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/group.kt
new file mode 100644
index 0000000..0d392ef
--- /dev/null
+++ b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/presets/group.kt
@@ -0,0 +1,7 @@
+package net.meilcli.librarian.plugin.presets
+
+import net.meilcli.librarian.plugin.entities.LibraryGroup
+
+fun group(name: String, groupName: String, vararg artifactNames: String): LibraryGroup {
+ return LibraryGroup(artifactNames.map { "$groupName:$it" }, name)
+}
\ No newline at end of file
diff --git a/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/tasks/GeneratePresetGroupsTask.kt b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/tasks/GeneratePresetGroupsTask.kt
new file mode 100644
index 0000000..6b37562
--- /dev/null
+++ b/plugin-preset/src/main/kotlin/net/meilcli/librarian/plugin/tasks/GeneratePresetGroupsTask.kt
@@ -0,0 +1,63 @@
+package net.meilcli.librarian.plugin.tasks
+
+import kotlinx.serialization.UnstableDefault
+import net.meilcli.librarian.plugin.LibrarianExtension
+import net.meilcli.librarian.plugin.LibrarianPageExtension
+import net.meilcli.librarian.plugin.entities.Artifact
+import net.meilcli.librarian.plugin.entities.LibraryGroup
+import net.meilcli.librarian.plugin.internal.ArtifactLoader
+import net.meilcli.librarian.plugin.internal.GroupWriter
+import net.meilcli.librarian.plugin.presets.PresetGroups
+import org.gradle.api.DefaultTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.TaskAction
+
+open class GeneratePresetGroupsTask : DefaultTask() {
+
+ @Input
+ var extension: LibrarianExtension? = null
+
+ @UnstableDefault
+ @TaskAction
+ fun action() {
+ val extension = extension ?: return
+ if (extension.pages.isEmpty()) {
+ return
+ }
+
+ val artifactLoaderResult = ArtifactLoader().load(project, extension.depthType)
+
+ for (page in extension.pages) {
+ try {
+ loadDependency(artifactLoaderResult, page)
+ } catch (exception: Exception) {
+ project.logger.error("Failed Librarian, page: ${page.name}", exception)
+ }
+ }
+ }
+
+ @UnstableDefault
+ private fun loadDependency(artifactLoaderResult: ArtifactLoader.Result, page: LibrarianPageExtension) {
+ val extension = extension ?: return
+ val queue = mutableSetOf()
+
+ for (configuration in page.configurations) {
+ val artifactResult = artifactLoaderResult.entries.firstOrNull { it.configurationName == configuration }
+ if (artifactResult == null) {
+ project.logger.warn("Librarian cannot resolve unknown configuration: $configuration")
+ continue
+ }
+ queue.addAll(artifactResult.artifacts)
+ }
+
+ val foundPresetGroups = mutableSetOf()
+ for (artifact in queue) {
+ val foundPresetGroup = PresetGroups.groups.find { it.artifacts.contains(artifact.artifact) }
+ if (foundPresetGroup != null) {
+ foundPresetGroups += foundPresetGroup
+ }
+ }
+
+ GroupWriter.write(project, extension, foundPresetGroups)
+ }
+}
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index a7750fe..15caa0d 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +1,2 @@
-include ':app', ':plugin-core', ':sample-child', ':sample-child:sample-child-nested'
+include ':app', ':plugin-core', ':sample-child', ':sample-child:sample-child-nested', ':plugin-preset'
rootProject.name='Librarian'