Skip to content

Commit

Permalink
add librarianGenerateBintrayGroups task
Browse files Browse the repository at this point in the history
  • Loading branch information
MeilCli committed May 24, 2020
1 parent 9cd78e3 commit d20aa72
Show file tree
Hide file tree
Showing 20 changed files with 502 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .idea/dictionaries/kimit.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ apply plugin: 'librarian-preset'
- generate artifacts
- `librarianGenerateGroups`
- generate groups
- `librarianGenerateBintrayGroups`
- generate groups using by Bintray package information
- `librarianGeneratePages`
- generate page, must execute after `librarianGenerateArtifacts`
- `librarianGeneratePipeline`
Expand All @@ -106,6 +108,7 @@ librarian {
depth = "firstLevel" // String, firstLevel or allLevel, default value is firstLevel
failOnGeneratePageWhenFoundPlaceholder = true // Boolean, default value is true
failOnOverrideUnMatchedLicense = true // Boolean, default value is true
useBintray = true // Boolean, default value is true
additionalModules = [] // Array of String
pages {
Expand Down Expand Up @@ -146,6 +149,7 @@ librarian {
|librarian.depth|search dependency depth, firstLevel find your directly dependency|
|librarian.failOnGeneratePageWhenFoundPlaceholder|fail on `librarianGeneratePages` when found placeholder|
|librarian.failOnOverrideUnMatchedLicense|fail on override un matched license by group|
|librarian.useBintray|if true, actually use Bintray api at `librarianGenerateBintrayGroups` task`|
|librarian.additionalModules|additional resolve modules, use when like android dynamic feature module|

### Generate Notice Page
Expand All @@ -154,6 +158,7 @@ librarian {
- `librarianShowConfigurations` task helps when configure your project
1. execute `librarianGenerateArtifacts` task
1. execute `librarianGeneratePresetGroups` task if using `librarian-preset`
1. execute `librarianGenerateBintrayGroups` task if using Bintray package information
1. execute `librarianGeneratePages` task
1. if output error or incomplete result, configure your project that put `groups` and execute `librarianGenerateGroups` task
- then execute `librarianGeneratePages` task
Expand Down
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ buildscript {
classpath Dependencies.TikXml.core
classpath Dependencies.TikXml.coreAnnotation
classpath Dependencies.SquareUp.okio
classpath Dependencies.SquareUp.okhttp
classpath Dependencies.SquareUp.retrofit
classpath Dependencies.JakeWharton.retrofitKotlinSerializationConverter
} else {
classpath Dependencies.Librarian.pluginCore
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,16 @@ object Dependencies {
val okio = Dependency("com.squareup.okio", "okio", "2.5.0")
val moshi = Dependency("com.squareup.moshi", "moshi", "1.9.2")
val moshiKapt = Dependency("com.squareup.moshi", "moshi-kotlin-codegen", "1.9.2")
val okhttp = Dependency("com.squareup.okhttp3", "okhttp", "4.5.0")
val retrofit = Dependency("com.squareup.retrofit2", "retrofit", "2.8.1")
}

object JakeWharton {

val retrofitKotlinSerializationConverter = Dependency(
"com.jakewharton.retrofit",
"retrofit2-kotlinx-serialization-converter",
"0.5.0"
)
}
}
4 changes: 4 additions & 0 deletions plugin-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ dependencies {
implementation Dependencies.TikXml.core
implementation Dependencies.TikXml.coreAnnotation
implementation Dependencies.SquareUp.okio
implementation Dependencies.SquareUp.okhttp
implementation Dependencies.SquareUp.retrofit
implementation Dependencies.JakeWharton.retrofitKotlinSerializationConverter

kapt Dependencies.TikXml.processor
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ open class LibrarianExtension @Inject constructor(

var failOnOverrideUnMatchedLicense = true

var useBintray = true

var additionalModules = mutableListOf<String>()

val pages = objectFactory.domainObjectContainer(LibrarianPageExtension::class.java)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ open class LibrarianPlugin : Plugin<Project> {
private const val librarianExtension = "librarian"
const val generateArtifactsTask = "librarianGenerateArtifacts"
const val generateGroupsTask = "librarianGenerateGroups"
const val generateBintrayGroupsTask = "librarianGenerateBintrayGroups"
const val generatePagesTask = "librarianGeneratePages"
}

Expand All @@ -28,11 +29,16 @@ open class LibrarianPlugin : Plugin<Project> {
this.extension = extension
}

generatePipelineDependTasks += project.createTask<GenerateGroupsTask>(generateGroupsTask).apply {
generatePipelineDependTasks += project.createTask<GenerateBintrayGroupsTask>(generateBintrayGroupsTask).apply {
this.extension = extension
mustRunAfter(generateArtifactsTask, "librarianGeneratePresetGroups")
}

generatePipelineDependTasks += project.createTask<GenerateGroupsTask>(generateGroupsTask).apply {
this.extension = extension
mustRunAfter(generateArtifactsTask, generateBintrayGroupsTask, "librarianGeneratePresetGroups")
}

generatePipelineDependTasks += project.createTask<GeneratePagesTask>(generatePagesTask).apply {
this.extension = extension
mustRunAfter(generateGroupsTask)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package net.meilcli.librarian.plugin.entities

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class BintrayLicense(
@SerialName("name")
val name: String,

@SerialName("longname")
val fullName: String,

@SerialName("url")
val url: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package net.meilcli.librarian.plugin.entities

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class BintrayPackage(
@SerialName("repo")
val repository: String,

@SerialName("owner")
val owner: String,

@SerialName("desc")
val description: String? = null,

@SerialName("licenses")
val licenses: List<String> = emptyList(),

@SerialName("github_repo")
val githubRepository: String? = null,

@SerialName("vcs_url")
val vcsUrl: String? = null,

@SerialName("website_url")
val websiteUrl: String? = null
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package net.meilcli.librarian.plugin.entities

data class BintrayRepository(val url: String, val repository: String, val owner: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package net.meilcli.librarian.plugin.entities

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class BintraySearchResult(
@SerialName("name")
val packageName: String,

@SerialName("owner")
val owner: String,

@SerialName("repo")
val repository: String
) {

fun urlEscapedPackageName() = packageName.replace(":", "&3A")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package net.meilcli.librarian.plugin.internal.artifacts

import net.meilcli.librarian.plugin.entities.Artifact
import net.meilcli.librarian.plugin.entities.LibraryGroup
import net.meilcli.librarian.plugin.internal.IFilter

class ArtifactsByLibraryGroupsFilter(
private val libraryGroups: List<LibraryGroup>
) : IFilter<Collection<Artifact>> {

override fun filter(source: Collection<Artifact>): Collection<Artifact> {
return source.filter { x -> libraryGroups.all { y -> y.artifacts.contains(x.artifact).not() } }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package net.meilcli.librarian.plugin.internal.bintray

import net.meilcli.librarian.plugin.entities.Artifact
import net.meilcli.librarian.plugin.entities.BintrayPackage
import net.meilcli.librarian.plugin.entities.BintrayRepository
import net.meilcli.librarian.plugin.internal.IParameterizedLoader
import org.gradle.api.Project
import org.slf4j.LoggerFactory

class ArtifactAndBintrayRepositoryToBintrayPackageLoader(
private val project: Project
) : IParameterizedLoader<Pair<Artifact, BintrayRepository>, BintrayPackage?> {

private val api = IBintrayApi.default
private val logger = LoggerFactory.getLogger(ArtifactAndBintrayRepositoryToBintrayPackageLoader::class.java)
private val resultCache = mutableMapOf<Pair<Artifact, BintrayRepository>, BintrayPackage?>()
private var notService = false

override fun load(parameter: Pair<Artifact, BintrayRepository>): BintrayPackage? {
if (notService) {
project.logger.quiet("not service hit")
return null
}
if (resultCache.containsKey(parameter)) {
project.logger.quiet("cache hit")
return resultCache[parameter]
}

try {
// search package name, because name convention is difference each repository
val searchResponse = api
.searchPackage(
group = parameter.first.group,
artifact = parameter.first.name,
owner = parameter.second.owner,
repository = parameter.second.repository
)
.execute()

if (500 <= searchResponse.code()) {
notService = true
return null
}
if (searchResponse.isSuccessful.not()) {
resultCache[parameter] = null
return null
}

val searchResults = searchResponse.body()
if (searchResults == null) {
resultCache[parameter] = null
return null
}
val searchResult = searchResults.find {
it.owner == parameter.second.owner && it.repository == parameter.second.repository
}
if (searchResult == null) {
resultCache[parameter] = null
return null
}

val packageResponse = api
.getPackage(
owner = parameter.second.owner,
repository = parameter.second.repository,
packageName = searchResult.packageName
)
.execute()

if (500 <= packageResponse.code()) {
notService = true
return null
}
if (packageResponse.isSuccessful.not()) {
resultCache[parameter] = null
return null
}

resultCache[parameter] = packageResponse.body()
return resultCache[parameter]
} catch (exception: Exception) {
logger.warn("Librarian unknown exception", exception)
project.logger.quiet("exception")
return null
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package net.meilcli.librarian.plugin.internal.bintray

import net.meilcli.librarian.plugin.entities.Artifact
import net.meilcli.librarian.plugin.entities.BintrayRepository
import net.meilcli.librarian.plugin.internal.ILoader
import net.meilcli.librarian.plugin.internal.IParameterizedLoader
import okhttp3.OkHttpClient
import okhttp3.Request
import org.slf4j.LoggerFactory

class ArtifactToBintrayRepositoryLoader(
bintrayRepositoriesLoader: ILoader<List<BintrayRepository>>
) : IParameterizedLoader<Artifact, BintrayRepository?> {

private val client = OkHttpClient()
private val logger = LoggerFactory.getLogger(ArtifactToBintrayRepositoryLoader::class.java)
private val bintrayRepositories = bintrayRepositoriesLoader.load()
private val notServiceRepositories = mutableListOf<BintrayRepository>()
private val resultCache = mutableMapOf<Artifact, BintrayRepository?>()

override fun load(parameter: Artifact): BintrayRepository? {
if (resultCache.containsKey(parameter)) {
return resultCache[parameter]
}
for (bintrayRepository in bintrayRepositories) {
if (notServiceRepositories.contains(bintrayRepository)) {
continue
}

val httpStatusCode = try {
head(bintrayRepository, parameter)
} catch (exception: Exception) {
logger.warn("Librarian: unknown exception when head bintray", exception)
400
}
if (500 <= httpStatusCode) {
notServiceRepositories += bintrayRepository
continue
}
if (300 <= httpStatusCode) {
continue
}
resultCache[parameter] = bintrayRepository
return bintrayRepository
}

return null
}

private fun head(bintrayRepository: BintrayRepository, artifact: Artifact): Int {
fun String.replaceDot(): String {
return replace('.', '/')
}

val request = Request.Builder()
.head()
.url("${bintrayRepository.url}/${artifact.group.replaceDot()}/${artifact.name}/${artifact.version}/${artifact.name}-${artifact.version}.pom")
.build()

client.newCall(request).execute().use {
return it.code
}
}
}
Loading

0 comments on commit d20aa72

Please sign in to comment.