Skip to content

Commit

Permalink
collect custom lint rules from project
Browse files Browse the repository at this point in the history
  • Loading branch information
mohammadkahelghi-grabtaxi committed May 9, 2024
1 parent d4df4ac commit 61fa22e
Show file tree
Hide file tree
Showing 14 changed files with 135 additions and 27 deletions.
32 changes: 32 additions & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,38 @@ load("@debug_maven//:defs.bzl", debug_maven_pinned_maven_install = "pinned_maven

debug_maven_pinned_maven_install()

maven_install(
name = "lint_maven",
artifacts = [
"com.google.auto.service:auto-service-annotations:1.1.1",
"com.slack.lint:slack-lint-checks:0.2.3",
],
excluded_artifacts = ["androidx.test.espresso:espresso-contrib"],
fail_if_repin_required = False,
fail_on_missing_checksum = False,
jetify = True,
jetify_include_list = [
"com.android.support:cardview-v7",
"com.android.support:support-annotations",
"com.android.support:support-compat",
"com.android.support:support-core-ui",
"com.android.support:support-core-utils",
],
override_targets = {
"com.google.auto.service:auto-service-annotations": "@maven//:com_google_auto_service_auto_service_annotations",
},
repositories = [
"https://repo.maven.apache.org/maven2/",
],
resolve_timeout = 1000,
maven_install_json = "//:lint_maven_install.json",
version_conflict_policy = "pinned",
)

load("@lint_maven//:defs.bzl", lint_maven_pinned_maven_install = "pinned_maven_install")

lint_maven_pinned_maven_install()

maven_install(
name = "maven",
artifacts = DAGGER_ARTIFACTS + GRAB_BAZEL_COMMON_ARTIFACTS + [
Expand Down
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ nexus = "1.1.0"
paging-runtime = "3.1.1"
picnic = "0.4.0"
sceneform-ux = "1.15.0"
slack-lint-checks = "0.2.3"
timber = "5.0.1"
auto-service = "1.1.1"
truth = "1.1.3"
Expand Down Expand Up @@ -90,6 +91,7 @@ mockito-kotlin = { module = "com.nhaarman:mockito-kotlin", version.ref = "mockit
nexus-gradle-publish-plugin = { module = "io.github.gradle-nexus:publish-plugin", version.ref = "nexus" }
picnic = { module = "com.jakewharton.picnic:picnic", version.ref = "picnic" }
sceneform-ux = { module = "com.google.ar.sceneform.ux:sceneform-ux", version.ref = "sceneform-ux" }
slack-lint-checks = { module = "com.slack.lint:slack-lint-checks", version.ref = "slack-lint-checks" }
timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" }
auto-service = { module = "com.google.auto.service:auto-service", version.ref = "auto-service" }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.grab.grazel.gradle.variant.Classpath.Runtime
import com.grab.grazel.gradle.variant.VariantType.AndroidBuild
import com.grab.grazel.gradle.variant.VariantType.AndroidTest
import com.grab.grazel.gradle.variant.VariantType.JvmBuild
import com.grab.grazel.gradle.variant.VariantType.Lint
import com.grab.grazel.gradle.variant.VariantType.Test
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
Expand Down Expand Up @@ -94,6 +95,7 @@ abstract class AndroidNonVariant<T>(
get() = backingVariant.name + when (variantType) {
AndroidTest -> AndroidTest.name
Test -> Test.name
Lint -> Lint.name
else -> ""
}

Expand Down Expand Up @@ -200,6 +202,7 @@ data class DefaultVariantData(
val name: String = when (variantType) {
AndroidBuild -> DEFAULT_VARIANT
AndroidTest -> ANDROID_TEST_VARIANT
Lint -> LINT_VARIANT
else -> TEST_VARIANT
},
)
Expand Down Expand Up @@ -241,6 +244,7 @@ class AndroidDefaultVariant(
AndroidBuild -> !configName.isTest()
AndroidTest -> configName.isAndroidTest()
Test -> configName.isUnitTest()
Lint -> configName.isLint()
JvmBuild -> error("Invalid variant type ${JvmBuild.name} for Android variant")
}
}.toSet()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.grab.grazel.gradle.hasKapt
import com.grab.grazel.gradle.variant.VariantType.AndroidBuild
import com.grab.grazel.gradle.variant.VariantType.AndroidTest
import com.grab.grazel.gradle.variant.VariantType.JvmBuild
import com.grab.grazel.gradle.variant.VariantType.Lint
import com.grab.grazel.gradle.variant.VariantType.Test
import com.grab.grazel.util.addTo
import org.gradle.api.artifacts.Configuration
Expand Down Expand Up @@ -78,6 +79,7 @@ interface ConfigurationParsingVariant<T> : Variant<T> {
AndroidBuild -> configName.startsWith("kapt${namePattern.capitalize()}")
AndroidTest -> configName.startsWith("kaptAndroidTest${basePattern.capitalize()}")
Test -> configName.startsWith("kaptTest${basePattern.capitalize()}")
VariantType.Lint -> false
JvmBuild -> error("Invalid variant type ${JvmBuild.name} for Android variant")
}
}.addTo(this)
Expand Down Expand Up @@ -106,6 +108,8 @@ interface ConfigurationParsingVariant<T> : Variant<T> {
Test -> configName == "test${basePattern}${onlyConfig}$dm".toLowerCase()
|| configName == "test${basePattern}Implementation$dm".toLowerCase()

Lint -> configName == "lintChecks".toLowerCase()

else -> error("$JvmBuild invalid for build type runtime configuration")
}
}.toSet()
Expand All @@ -118,5 +122,7 @@ interface ConfigurationParsingVariant<T> : Variant<T> {
|| startsWith("kaptTest")
|| contains("UnitTest")

fun String.isLint() = startsWith("lintChecks")

fun String.isTest() = isAndroidTest() || isUnitTest() || contains("Test")
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import com.grab.grazel.gradle.isAndroid
import com.grab.grazel.gradle.variant.VariantType.AndroidBuild
import com.grab.grazel.gradle.variant.VariantType.AndroidTest
import com.grab.grazel.gradle.variant.VariantType.JvmBuild
import com.grab.grazel.gradle.variant.VariantType.Lint
import com.grab.grazel.gradle.variant.VariantType.Test
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
Expand Down Expand Up @@ -66,18 +67,23 @@ enum class DefaultVariants(val variantName: String) {
},
AndroidTest("androidTest") {
override fun toString() = variantName
},
Lint("lint") {
override fun toString() = variantName
}
}

val DEFAULT_VARIANT = DefaultVariants.Default.toString()
val TEST_VARIANT = DefaultVariants.Test.toString()
val ANDROID_TEST_VARIANT = DefaultVariants.AndroidTest.toString()
val LINT_VARIANT = DefaultVariants.Lint.toString()

enum class VariantType {
AndroidBuild,
AndroidTest,
Test,
JvmBuild,
Lint,
}

fun BaseVariant.toVariantType(): VariantType = when (this) {
Expand Down Expand Up @@ -134,6 +140,7 @@ class JvmVariantData(
val variantType: VariantType,
val name: String = when (variantType) {
JvmBuild -> DEFAULT_VARIANT
Lint -> LINT_VARIANT
else -> TEST_VARIANT
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.grab.grazel.gradle.isJvm
import com.grab.grazel.gradle.variant.VariantType.AndroidBuild
import com.grab.grazel.gradle.variant.VariantType.AndroidTest
import com.grab.grazel.gradle.variant.VariantType.JvmBuild
import com.grab.grazel.gradle.variant.VariantType.Lint
import com.grab.grazel.gradle.variant.VariantType.Test
import org.gradle.api.Project
import java.util.concurrent.ConcurrentHashMap
Expand Down Expand Up @@ -66,6 +67,11 @@ constructor(
project = project,
variantType = AndroidTest,
ignoreKeywords = flavorsBuildTypes
),
AndroidDefaultVariant(
project = project,
variantType = VariantType.Lint,
ignoreKeywords = flavorsBuildTypes
)
)

Expand Down Expand Up @@ -139,6 +145,13 @@ constructor(
ignoreKeywords = flavorsBuildTypes
)
)
action(
AndroidDefaultVariant(
project = project,
variantType = Lint,
ignoreKeywords = flavorsBuildTypes
)
)

variantDataSource.migratableVariants(project) { variant ->
action(AndroidVariant(project, variant))
Expand All @@ -153,7 +166,7 @@ constructor(
.asSequence()
.flatMap { buildType ->
VariantType.values()
.filter { it != JvmBuild }
.filter { it != JvmBuild && it != Lint }
.map { variantType ->
AndroidBuildType(
project = project,
Expand All @@ -168,7 +181,7 @@ constructor(
VariantType
.values()
.asSequence()
.filter { it != JvmBuild }
.filter { it != JvmBuild && it != Lint }
.flatMap { variantType ->
flavors.map { flavor ->
AndroidFlavor(
Expand All @@ -183,6 +196,7 @@ constructor(
} else if (project.isJvm) {
action(JvmVariant(project = project, variantType = JvmBuild))
action(JvmVariant(project = project, variantType = Test))
action(JvmVariant(project = project, variantType = Lint))
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,18 @@ data class LintConfigData(
val baselinePath: String? = null,
val lintChecks: List<BazelDependency>? = null
) {

private fun lintChecksString(): String? {
if (lintChecks.isNullOrEmpty()) return null
return "[" + lintChecks.joinToString(",") {
if (it is BazelDependency.StringDependency) {
"\"//$it\""
} else {
"\"${it}\""
}
} + "]"
}

val merged: List<StarlarkMapEntry> = listOf(
StarlarkMapEntry(
name = "enabled",
Expand All @@ -47,14 +59,7 @@ data class LintConfigData(
quoteValues = true
),
StarlarkMapEntry(
name = "lint_checks",
value = if (lintChecks != null) {
"[${lintChecks.joinToString(",", transform = BazelDependency::quote)}]"
} else {
null
},
quoteKeys = true,
quoteValues = false
name = "lint_checks", value = lintChecksString(), quoteKeys = true, quoteValues = false
)
).filter { it.value != null }
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,26 @@ import org.gradle.api.Project
import org.gradle.api.artifacts.ProjectDependency
import org.gradle.kotlin.dsl.the

internal fun Project.customLintRulesTargets(): List<BazelDependency>? {
return configurations
.asSequence()
.filter { it.name.contains("lintChecks") }
private const val LINT_CHECKS_CONFIGURATION_NAME = "lintChecks"
private const val Lint_MAVEN_REPO = "lint_maven"

fun Project.customLintRulesTargets(): List<BazelDependency>? {
return configurations.asSequence().filter { it.name.contains(LINT_CHECKS_CONFIGURATION_NAME) }
.flatMap { lintChecksConfig ->
lintChecksConfig
.dependencies
.asSequence()
.filterIsInstance<ProjectDependency>()
.map { BazelDependency.ProjectDependency(it.dependencyProject) }
.map {
if (it is ProjectDependency) {
BazelDependency.ProjectDependency(it.dependencyProject)
} else {
BazelDependency.MavenDependency(
group = it.group!!,
name = it.name,
repo = Lint_MAVEN_REPO
)
}
}
}.let { it.toList().ifEmpty { null } }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ package com.grab.grazel.migrate.android

import com.android.build.gradle.AppExtension
import com.grab.grazel.GrazelPluginTest
import com.grab.grazel.bazel.starlark.Assignee
import com.grab.grazel.bazel.starlark.StatementsBuilder
import com.grab.grazel.bazel.starlark.asString
import com.grab.grazel.buildProject
import com.grab.grazel.gradle.ANDROID_APPLICATION_PLUGIN
import com.grab.grazel.gradle.variant.MatchedVariant
Expand All @@ -32,7 +29,6 @@ import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.the
import org.junit.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue

class AndroidLibraryDataKtTest : GrazelPluginTest() {
private lateinit var rootProject: Project
Expand All @@ -55,6 +51,7 @@ class AndroidLibraryDataKtTest : GrazelPluginTest() {
}
block(this)
}

doEvaluate()
}
return appProject
Expand Down
16 changes: 16 additions & 0 deletions sample-android-library/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ android_library(
"config": "//:lint.xml",
},
manifest = "src/main/AndroidManifest.xml",
resources = {
"src/main/res": {
},
},
visibility = [
"//visibility:public",
],
Expand All @@ -32,6 +36,10 @@ android_library(
"config": "//:lint.xml",
},
manifest = "src/main/AndroidManifest.xml",
resources = {
"src/main/res": {
},
},
visibility = [
"//visibility:public",
],
Expand All @@ -52,6 +60,10 @@ android_library(
"config": "//:lint.xml",
},
manifest = "src/main/AndroidManifest.xml",
resources = {
"src/main/res": {
},
},
visibility = [
"//visibility:public",
],
Expand All @@ -72,6 +84,10 @@ android_library(
"config": "//:lint.xml",
},
manifest = "src/main/AndroidManifest.xml",
resources = {
"src/main/res": {
},
},
visibility = [
"//visibility:public",
],
Expand Down
Loading

0 comments on commit 61fa22e

Please sign in to comment.