Skip to content

Commit ea3766e

Browse files
committed
Add support to libs declaration in different files
1 parent 72c3d6a commit ea3766e

File tree

12 files changed

+111
-64
lines changed

12 files changed

+111
-64
lines changed

README.md

+18-11
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,45 @@ Warning on new versions available even when using Kotlin-DSL plugin.
44
![](example.png)
55

66
## How to use?
7-
- Add lint dependency
8-
```groovy
9-
dependencies {
10-
lintChecks "com.picpay.gradlelint:version-checker:VERSION"
11-
}
12-
```
13-
- Enable lint with `lintOptions`
7+
- Add lint dependency:
8+
> copy `version-checker.jar` to `HOME/.android/lint/`
9+
10+
- Enable/Disable lint with `lintOptions` (default: `enabled`)
1411
```groovy
1512
lintOptions {
1613
enable "VersionCheckerGradleLint"
1714
}
1815
```
1916

2017
## `buildSrc` module with kotlin-dsl plugin
21-
- `buildSrc/src/main/java/Dependencies.kt`
22-
```kotlin
23-
// file: Dependencies.kt
2418

19+
### Create `version` file
20+
```kotlin
2521
object Versions {
2622

2723
val kotlinVersion = "1.3.70"
2824

2925
val junit4Version = "4.12"
3026
}
31-
27+
```
28+
### Create lib files
29+
```kotlin
3230
object Libs {
3331

3432
val kotlin = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlinVersion}"
3533
}
34+
```
3635

36+
```kotlin
3737
object TestLibs {
3838

3939
val junit4 = "junit:junit:${Versions.junit4Version}"
4040
}
41+
```
42+
43+
```kotlin
44+
object OtherLibs {
45+
46+
val myLib = "mylib:mylib:${Versions.myLib}"
47+
}
4148
```
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,3 @@
1-
object Versions {
2-
// Libs
3-
const val appCompatVersion = "1.0.0"
4-
const val retrofitVersion = "2.6.4"
5-
6-
const val playServiceLocation = "16.0.0"
7-
8-
const val koinCoreVersion = "2.0.1"
9-
10-
const val mpchart = "v3.1.0-alpha"
11-
12-
// Test Libs
13-
const val junitTest = "4.12"
14-
}
15-
161
object Libs {
172

183
val koinCore = "org.koin:koin-core:${Versions.koinCoreVersion}"
@@ -22,9 +7,4 @@ object Libs {
227
"com.squareup.retrofit2:retrofit:${Versions.retrofitVersion}"
238
val playServiceLocation =
249
"com.google.android.gms:play-services-location:${Versions.playServiceLocation}"
25-
}
26-
27-
object TestLibs {
28-
29-
val junit = "junit:junit:${Versions.junitTest}"
30-
}
10+
}

buildSrc/src/main/java/TestLibs.kt

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
object TestLibs {
2+
3+
val junit = "junit:junit:${Versions.junitTest}"
4+
}

buildSrc/src/main/java/Versions.kt

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
object Versions {
2+
// Libs
3+
const val appCompatVersion = "1.0.0"
4+
const val retrofitVersion = "2.6.4"
5+
6+
const val playServiceLocation = "16.0.0"
7+
8+
const val koinCoreVersion = "2.0.1"
9+
10+
const val mpchart = "v3.1.0-alpha"
11+
12+
// Test Libs
13+
const val junitTest = "4.12"
14+
}

buildSrc/versionlint.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
#Thu May 14 13:30:17 BRT 2020
33
versionlint.cache.time.minutes=60
44
versionlint.prerelease.enable=true
5-
versionlint.dependencies.file=Dependencies
5+
versionlint.versions.file=Versions
66
versionlint.dependencies.suffix=Libs

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ android.enableJetifier=true
2121
kotlin.code.style=official
2222

2323
# Info to Maven Publish
24-
library.version=0.1.1
24+
library.version=0.1.2
2525
library.groupId=com.picpay.gradlelint
2626
library.artifactId=version-checker
2727
library.repository=version-checker-gradle-lint

lintversioncheck/build.gradle.kts

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ repositories {
1414

1515
dependencies {
1616
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72")
17-
api("com.android.tools.lint:lint-api:26.6.3")
18-
api("com.android.tools.lint:lint-checks:26.6.3")
17+
implementation("com.android.tools.lint:lint-api:26.6.3")
18+
implementation("com.android.tools.lint:lint-checks:26.6.3")
1919
testImplementation("junit:junit:4.13")
2020
}
2121

lintversioncheck/src/main/java/com/picpay/gradlelint/versioncheck/VersionCheckerGradleLint.kt

+34-27
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.picpay.gradlelint.versioncheck.api.Api
1111
import com.picpay.gradlelint.versioncheck.cache.RepositoryCache
1212
import com.picpay.gradlelint.versioncheck.extensions.containsVersionNumber
1313
import com.picpay.gradlelint.versioncheck.extensions.findBuildSrcFromProjectDir
14+
import com.picpay.gradlelint.versioncheck.extensions.findKotlinFilesWithSuffix
1415
import com.picpay.gradlelint.versioncheck.extensions.getVarNameInVersionDeclaration
1516
import com.picpay.gradlelint.versioncheck.extensions.getVarValueFromVersionsFileLines
1617
import com.picpay.gradlelint.versioncheck.extensions.isVersionNumber
@@ -30,7 +31,7 @@ class VersionCheckerGradleLint : Detector(), Detector.GradleScanner {
3031
private var repositoryHandler: MavenRemoteRepositoryHandler? = null
3132
private var buildSrcDir: File? = null
3233
private var versionsProperties: Properties? = null
33-
private var dependenciesFileLines = emptyList<String>()
34+
private var buildSrcKotlinFiles = mutableMapOf<String, File>()
3435

3536
override fun checkDslPropertyAssignment(
3637
context: GradleContext,
@@ -73,49 +74,48 @@ class VersionCheckerGradleLint : Detector(), Detector.GradleScanner {
7374
): Library? {
7475

7576
val properties = readVersionCheckerProperties(context.project.dir)
76-
val dependenciesFileName = properties.getProperty(LINT_DEPENDENCIES_PROPERTY)
77-
val versionsFile = properties.getProperty(LINT_VERSIONS_PROPERTY)
77+
val versionsFileName = properties.getProperty(LINT_VERSIONS_PROPERTY)
78+
val suffix = properties.getProperty(LINT_SUFFIX_PROPERTY)
7879

7980
val enableCheckForPreReleases: Boolean = properties
8081
.getProperty(LINT_ENABLE_CHECK_PRE_RELEASES)
8182
?.toBoolean() ?: false
8283

83-
if (versionsFile != dependenciesFileName) {
84-
//TODO: fazer a busca em arquivos diferentes
85-
}
86-
87-
val linesFromDependencyFile = getDependenciesFileLines(
88-
dependenciesFile = File(
89-
getBuildSrcDir(context.project.dir).absolutePath,
90-
"src${File.separator}" +
91-
"main${File.separator}" +
92-
"java${File.separator}" +
93-
"$dependenciesFileName.kt"
94-
)
84+
val librariesKotlinFiles = getMapOfKotlinFilesFromBuildSrc(
85+
buildSrcDir = getBuildSrcDir(context.project.dir),
86+
librariesFileSuffix = suffix,
87+
versionFileName = versionsFileName
9588
)
9689

90+
val nameToFindLibDeclaration = value.split(".").first()
91+
val libraryDeclarationFile: File = librariesKotlinFiles[nameToFindLibDeclaration] ?: return null
92+
val versionDeclarationFile: File = librariesKotlinFiles[versionsFileName] ?: return null
93+
9794
return extractLibraryFromFileLines(
9895
valueInGradle = value,
99-
fileLines = linesFromDependencyFile,
96+
libraryDeclarationFile = libraryDeclarationFile,
97+
versionDeclarationFile = versionDeclarationFile,
10098
enableCheckForPreReleases = enableCheckForPreReleases
10199
)
102100
}
103101

104102
private fun extractLibraryFromFileLines(
105103
valueInGradle: String,
106-
fileLines: List<String>,
104+
libraryDeclarationFile: File,
105+
versionDeclarationFile: File,
107106
enableCheckForPreReleases: Boolean
108107
): Library? {
109108

110109
var extractedLibrary: Library? = null
110+
val libraryDeclarationFileLines = libraryDeclarationFile.readLines()
111111

112-
fileLines.forEachIndexed { index, line ->
112+
libraryDeclarationFileLines.forEachIndexed { index, line ->
113113

114114
val dependencyVarName = valueInGradle.split(".")[1]
115115
if (line.tokenize().contains(dependencyVarName) && !line.containsVersionNumber()) {
116116

117117
val dependency = if (!line.contains("$")) {
118-
dependenciesFileLines[index + 1].removeComments()
118+
libraryDeclarationFileLines[index + 1].removeComments()
119119
} else {
120120
line.split("=")[1].removeComments()
121121
}
@@ -126,7 +126,9 @@ class VersionCheckerGradleLint : Detector(), Detector.GradleScanner {
126126
.trim()
127127

128128
val versionVarName = dependencyCleaned[1].getVarNameInVersionDeclaration()
129-
val versionNumber = fileLines.getVarValueFromVersionsFileLines(versionVarName)
129+
val versionNumber = versionDeclarationFile.readLines()
130+
.getVarValueFromVersionsFileLines(versionVarName)
131+
130132
val version = versionNumber.replace("\"", "")
131133

132134
if (version.isVersionNumber(enableCheckForPreReleases)) {
@@ -138,11 +140,17 @@ class VersionCheckerGradleLint : Detector(), Detector.GradleScanner {
138140
return extractedLibrary
139141
}
140142

141-
private fun getDependenciesFileLines(dependenciesFile: File): List<String> {
142-
if (dependenciesFileLines.isEmpty()) {
143-
dependenciesFileLines = dependenciesFile.readLines()
143+
private fun getMapOfKotlinFilesFromBuildSrc(
144+
buildSrcDir: File,
145+
librariesFileSuffix: String,
146+
versionFileName: String
147+
): Map<String, File> {
148+
if (buildSrcKotlinFiles.isEmpty()) {
149+
val whatToFind = listOf(librariesFileSuffix, versionFileName)
150+
buildSrcDir.findKotlinFilesWithSuffix(whatToFind)
151+
.also { fileMap -> buildSrcKotlinFiles.putAll(fileMap) }
144152
}
145-
return dependenciesFileLines
153+
return buildSrcKotlinFiles
146154
}
147155

148156
private fun readVersionCheckerProperties(projectDir: File): Properties {
@@ -153,8 +161,8 @@ class VersionCheckerGradleLint : Detector(), Detector.GradleScanner {
153161
)
154162
Properties().apply {
155163
if (!versionLintPropertiesFile.exists()) {
156-
put(LINT_DEPENDENCIES_PROPERTY, "Dependencies")
157164
put(LINT_SUFFIX_PROPERTY, "Libs")
165+
put(LINT_VERSIONS_PROPERTY, "Versions")
158166
put(LINT_ENABLE_CHECK_PRE_RELEASES, "false")
159167
put(LINT_CACHE_LIFETIME, "60")
160168
store(
@@ -198,7 +206,6 @@ class VersionCheckerGradleLint : Detector(), Detector.GradleScanner {
198206
companion object {
199207

200208
private const val LINT_PROPERTIES = "versionlint.properties"
201-
private const val LINT_DEPENDENCIES_PROPERTY = "versionlint.dependencies.file"
202209
private const val LINT_SUFFIX_PROPERTY = "versionlint.dependencies.suffix"
203210
private const val LINT_VERSIONS_PROPERTY = "versionlint.versions.file"
204211
private const val LINT_ENABLE_CHECK_PRE_RELEASES = "versionlint.prerelease.enable"
@@ -226,7 +233,7 @@ class VersionCheckerGradleLint : Detector(), Detector.GradleScanner {
226233
7,
227234
Severity.WARNING,
228235
IMPLEMENTATION
229-
).setEnabledByDefault(false)
236+
).setEnabledByDefault(true)
230237

231238
}
232239
}

lintversioncheck/src/main/java/com/picpay/gradlelint/versioncheck/extensions/FileExtensions.kt

+15-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ internal fun File.findBuildSrcFromProjectDir(buildSrcModuleName: String = BUILD_
1010
val currentDir = File(dir)
1111

1212
val containsBuildSrc = currentDir.listFiles()
13-
?.asList()
1413
?.any { it.name == buildSrcModuleName }
1514
?: false
1615

@@ -22,3 +21,18 @@ internal fun File.findBuildSrcFromProjectDir(buildSrcModuleName: String = BUILD_
2221
}
2322
return null
2423
}
24+
25+
internal fun File.findKotlinFilesWithSuffix(suffix: List<String>): Map<String, File> {
26+
val kotlinFilesMap = mutableMapOf<String, File>()
27+
return if (!this.isDirectory) emptyMap()
28+
else {
29+
listFiles()?.forEach { file ->
30+
if (file.isDirectory) {
31+
kotlinFilesMap.putAll(file.findKotlinFilesWithSuffix(suffix))
32+
} else if (file.isFile && suffix.any { file.name.endsWith("$it.kt") }) {
33+
kotlinFilesMap[file.nameWithoutExtension] = file
34+
}
35+
}
36+
kotlinFilesMap
37+
}
38+
}

lintversioncheck/src/test/java/com/picpay/gradlelint/versioncheck/extensions/FileExtensionsTest.kt

+21
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,25 @@ internal class FileExtensionsTest {
2020

2121
assertEquals(expected, resultFile!!.absolutePath)
2222
}
23+
24+
@Test
25+
fun `findKotlinFilesWithSuffix with parent dir as File Should get kotlin files`() {
26+
val parentDir = File("").absolutePath
27+
val projectDir = File(parentDir, "src/test/resources")
28+
29+
val pathVersionsFile = "${projectDir.absolutePath}/kotlin-files/version/Versions.kt"
30+
val pathLibFile = "${projectDir.absolutePath}/kotlin-files/lib/MyLibs.kt"
31+
32+
val fileMap = projectDir.findKotlinFilesWithSuffix(listOf("Libs", "Versions"))
33+
34+
assertEquals(
35+
"Check Versions File",
36+
pathVersionsFile,
37+
(fileMap["Versions"] ?: error("Versions not found")).absolutePath
38+
)
39+
assertEquals(
40+
"Check Lib File",
41+
pathLibFile, (fileMap["MyLibs"] ?: error("MyLibs not found")).absolutePath
42+
)
43+
}
2344
}

lintversioncheck/src/test/resources/kotlin-files/lib/MyLibs.kt

Whitespace-only changes.

lintversioncheck/src/test/resources/kotlin-files/version/Versions.kt

Whitespace-only changes.

0 commit comments

Comments
 (0)