From 543800b854e18245d741feea97224a5b037605ed Mon Sep 17 00:00:00 2001 From: xinruiy Date: Fri, 12 Nov 2021 21:01:16 -0800 Subject: [PATCH 1/7] Provide a way to attach a mount of library as module deps With this change, user can add fake jar files as module dpes. It will create the dummy jar file in module_root/libs/ directory and update the deps in build file. It allows us to create a project with huge amount of jar libs deps which is useful when we dubug freeze due to too many lib deps. User can name the module that needs the dummy jar libaries and how many jar libaries need to be created by using "dummyLocalJarLibsDependency": [{"moduleName": "module0", "count": "1"}] --- .../input/ModuleDependencyConfig.kt | 13 +++++-- .../ModuleBlueprintFactory.kt | 1 + ...onfigPojoToAndroidModuleConfigConverter.kt | 3 +- .../ConfigPojoToModuleConfigConverter.kt | 4 ++- .../generators/GradleUtils.kt | 4 +++ .../generators/ModuleBuildBazelGenerator.kt | 15 +++++++- .../generators/SourceModuleGenerator.kt | 35 ++++++++++++++++++- .../AndroidModuleBuildBazelGenerator.kt | 14 +++++++- .../androidstudiopoet/input/ConfigPOJO.kt | 6 ++++ .../androidstudiopoet/models/Dependencies.kt | 2 ++ .../ModuleBuildBazelGeneratorTest.kt | 22 ++++++++++++ .../ModuleBuildGradleGeneratorTest.kt | 15 ++++++++ .../AndroidModuleBuildBazelGeneratorTest.kt | 27 ++++++++++++++ .../AndroidModuleBuildGradleGeneratorTest.kt | 34 ++++++++++++++++++ 14 files changed, 188 insertions(+), 7 deletions(-) diff --git a/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt b/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt index d3f08a18..a2eb3bd2 100644 --- a/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt +++ b/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt @@ -17,6 +17,15 @@ limitations under the License. package com.google.androidstudiopoet.input sealed class DependencyConfig { - data class ModuleDependencyConfig(val moduleName: String, val method: String? = null) : DependencyConfig() - data class LibraryDependencyConfig(val library: String, val method: String? = null) : DependencyConfig() + data class ModuleDependencyConfig(val moduleName: String, val method: String? = null) : + DependencyConfig() + + data class LibraryDependencyConfig(val library: String, val method: String? = null) : + DependencyConfig() + + data class DummyLocalJarLibsDependencyConfig( + val moduleName: String, + val count: Int, + val method: String? = null, + ) : DependencyConfig() } \ No newline at end of file diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt index dd442e4e..978d3353 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt @@ -116,6 +116,7 @@ object ModuleBlueprintFactory { } } is DependencyConfig.LibraryDependencyConfig -> LibraryDependency(dependencyConfig.method.toDependencyMethod(), dependencyConfig.library) + is DependencyConfig.DummyLocalJarLibsDependencyConfig -> FileTreeDependency(dependencyConfig.method.toDependencyMethod(), "libs", "*.jar", dependencyConfig.count) } } ?: listOf() return moduleDependencies.toHashSet() diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverter.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverter.kt index ad2736a2..507c845b 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverter.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverter.kt @@ -46,7 +46,8 @@ class ConfigPojoToAndroidModuleConfigConverter { val resolvedDependencies = config.resolvedDependencies[moduleName]?.sortedBy { it.to } ?.map { dependency -> DependencyConfig.ModuleDependencyConfig(dependency.to, dependency.method) } ?: emptyList() - dependencies = config.libraries?.let { resolvedDependencies + it } ?: resolvedDependencies + val resolvedDummyLocalJarLibsDependency = config.resolvedDummyLocalJarLibsDependencies[moduleName]?.let { listOf(it) } ?: emptyList() + dependencies = (config.libraries?: emptyList()) + resolvedDependencies + resolvedDummyLocalJarLibsDependency this.buildTypes = buildTypes this.productFlavorConfigs = productFlavorConfigs diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToModuleConfigConverter.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToModuleConfigConverter.kt index c726ff36..dc9ec3de 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToModuleConfigConverter.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToModuleConfigConverter.kt @@ -43,7 +43,9 @@ class ConfigPojoToModuleConfigConverter { generateTests = config.generateTests moduleName = config.getModuleName(index) - dependencies = config.resolvedDependencies[moduleName]?.map { DependencyConfig.ModuleDependencyConfig(it.to, it.method) } ?: listOf() + + val resolvedDummyFileTreeDependency = config.resolvedDummyLocalJarLibsDependencies[moduleName]?.let { listOf(it) } ?: emptyList() + dependencies = (config.resolvedDependencies[moduleName]?.map { DependencyConfig.ModuleDependencyConfig(it.to, it.method) } ?: listOf()) + resolvedDummyFileTreeDependency } } } \ No newline at end of file diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/GradleUtils.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/GradleUtils.kt index 156a94ea..08de3cd2 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/GradleUtils.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/GradleUtils.kt @@ -21,6 +21,7 @@ import com.google.androidstudiopoet.gradle.Expression import com.google.androidstudiopoet.gradle.StringStatement import com.google.androidstudiopoet.models.Dependency import com.google.androidstudiopoet.models.LibraryDependency +import com.google.androidstudiopoet.models.FileTreeDependency import com.google.androidstudiopoet.models.ModuleDependency import com.google.androidstudiopoet.models.Repository @@ -28,6 +29,8 @@ fun ModuleDependency.toExpression() = Expression(this.method, "project(':${this. fun LibraryDependency.toExpression() = Expression(this.method, "\"${this.name}\"") +fun FileTreeDependency.toExpression() = Expression(this.method, "fileTree(dir: '${this.dir}', include: ['${this.include}'])") + fun String.toApplyPluginExpression() = Expression("apply plugin:", "'$this'") fun String.toClasspathExpression() = Expression("classpath", "\"$this\"") @@ -44,5 +47,6 @@ fun Repository.Remote.toExpression() = Closure("maven", listOf(Expression("url", fun Dependency.toExpression() = when (this) { is ModuleDependency -> this.toExpression() is LibraryDependency -> this.toExpression() + is FileTreeDependency -> this.toExpression() else -> null } diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGenerator.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGenerator.kt index 310a7618..c91f367c 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGenerator.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGenerator.kt @@ -16,6 +16,7 @@ limitations under the License. package com.google.androidstudiopoet.generators +import com.google.androidstudiopoet.models.FileTreeDependency import com.google.androidstudiopoet.models.ModuleBuildBazelBlueprint import com.google.androidstudiopoet.models.ModuleDependency import com.google.androidstudiopoet.writers.FileWriter @@ -25,9 +26,20 @@ class ModuleBuildBazelGenerator(private val fileWriter: FileWriter) { val deps: Set = blueprint.dependencies.map { when (it) { is ModuleDependency -> "\"//${it.name}\"" + is FileTreeDependency -> "\":imported\"" else -> "" } }.toSet() + var imported = blueprint.dependencies.firstOrNull() { + it is FileTreeDependency + }?.let { it -> + val dep = it as FileTreeDependency + """java_import( + name = "imported", + constraints = ["android"], + jars = glob(["${dep.dir}/${dep.include}}"]), +)""" + } ?: "" val depsString = """ deps = [ ${deps.joinToString(separator = ",\n ") { it }} @@ -38,7 +50,8 @@ class ModuleBuildBazelGenerator(private val fileWriter: FileWriter) { name = "$targetName", srcs = glob(["src/main/java/**/*.java"]), visibility = ["//visibility:public"],${if (deps.isNotEmpty()) depsString else ""} -)""" +) +$imported""" fileWriter.writeToFile(ruleDefinition, blueprint.path) } diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/SourceModuleGenerator.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/SourceModuleGenerator.kt index fba71958..7bd1e735 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/SourceModuleGenerator.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/SourceModuleGenerator.kt @@ -20,14 +20,20 @@ import com.google.androidstudiopoet.generators.project.GradlePropertiesGenerator import com.google.androidstudiopoet.generators.project.GradleSettingsGenerator import com.google.androidstudiopoet.generators.project.GradlewGenerator import com.google.androidstudiopoet.generators.project.ProjectBuildGradleGenerator +import com.google.androidstudiopoet.models.FileTreeDependency import com.google.androidstudiopoet.models.ModuleBlueprint import com.google.androidstudiopoet.models.ProjectBlueprint +import com.google.androidstudiopoet.utils.joinPath import com.google.androidstudiopoet.writers.FileWriter +import java.io.BufferedOutputStream import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import java.io.File +import java.io.FileOutputStream import java.util.* +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream import kotlin.system.measureTimeMillis class SourceModuleGenerator(private val moduleBuildGradleGenerator: ModuleBuildGradleGenerator, @@ -105,11 +111,38 @@ class SourceModuleGenerator(private val moduleBuildGradleGenerator: ModuleBuildG } packagesGenerator.writePackages(moduleBlueprint.packagesBlueprint) - } + moduleBlueprint.dependencies?.mapNotNull { denpendency -> + when (denpendency) { + is FileTreeDependency -> { + // generate the local jar file that can be accessed + for (count in 0 until denpendency.count) { + val index = denpendency.include.lastIndexOf(".") + val suffix = if (index == -1) "" else denpendency.include.substring(index) + val uuid = UUID.randomUUID() + val jarFileName = "$uuid$suffix" + writeLibFile("${ + moduleBlueprint.moduleRoot.joinPath(denpendency.dir).joinPath(jarFileName) + }") + } + } + } + } + } private fun writeLibsFolder(moduleRootFile: File) { // write libs val libRoot = moduleRootFile.toString() + "/libs/" File(libRoot).mkdir() } + + private fun writeLibFile(path: String, entryName: String="foo.java") { + val file = File(path) + if (!file.parentFile.exists()) { + file.parentFile.mkdirs() + } + ZipOutputStream(BufferedOutputStream(FileOutputStream(file))).use { out -> + val entry = ZipEntry(entryName) + out.putNextEntry(entry) + } + } } diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGenerator.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGenerator.kt index ffaa557d..b20bd2b0 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGenerator.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGenerator.kt @@ -25,6 +25,7 @@ class AndroidModuleBuildBazelGenerator(val fileWriter: FileWriter) { val deps: Set = bazelBlueprint.dependencies.map { when (it) { is ModuleDependency -> "\"//${it.name}\"" + is FileTreeDependency -> "\":imported\"" is GmavenBazelDependency -> "gmaven_artifact(\"${it.name}\")" else -> "" } @@ -33,6 +34,16 @@ class AndroidModuleBuildBazelGenerator(val fileWriter: FileWriter) { deps = [ ${deps.joinToString(separator = ",\n ") { it }} ],""" + var imported = bazelBlueprint.dependencies.firstOrNull() { + it is FileTreeDependency + }?.let { it -> + val dep = it as FileTreeDependency + """java_import( + name = "imported", + constraints = ["android"], + jars = glob(["${dep.dir}/${dep.include}}"]), +)""" + } ?: "" val multidexString = """ multidex = "native",""" @@ -47,7 +58,8 @@ $ruleClass( manifest = "src/main/AndroidManifest.xml", custom_package = "${bazelBlueprint.packageName}", visibility = ["//visibility:public"],${if (deps.isNotEmpty()) depsString else ""} -)""" +) +$imported""" fileWriter.writeToFile(ruleDefinition, bazelBlueprint.path) } diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/input/ConfigPOJO.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/input/ConfigPOJO.kt index 3309233b..10569f30 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/input/ConfigPOJO.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/input/ConfigPOJO.kt @@ -86,6 +86,8 @@ class ConfigPOJO { var libraries: List? = null + var dummyLocalJarLibsDependency: List? = null + var extraBuildFileLines: List? = null var extraAndroidBuildFileLines: List? = null @@ -135,6 +137,10 @@ class ConfigPOJO { allDependencies } + val resolvedDummyLocalJarLibsDependencies: Map by lazy { + val givenDependency = dummyLocalJarLibsDependency + givenDependency?.associateBy({it.moduleName}, {it}) ?: emptyMap() + } private val allModuleNames: List by lazy { val moduleNames = mutableListOf() (0 until androidModules).mapTo(moduleNames) {getAndroidModuleName(it)} diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/models/Dependencies.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/models/Dependencies.kt index c9a332e1..cdb0b2aa 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/models/Dependencies.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/models/Dependencies.kt @@ -23,6 +23,8 @@ class AndroidModuleDependency(name: String, methodToCall: MethodToCall, method: data class LibraryDependency(val method: String, val name: String) : Dependency +data class FileTreeDependency(val method: String, val dir: String, val include: String, val count: Int) : Dependency + data class GmavenBazelDependency(val name: String) : Dependency interface Dependency diff --git a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt index 7ec1471b..2ddc9ea4 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt @@ -46,6 +46,28 @@ class ModuleBuildBazelGeneratorTest { verify(fileWriter).writeToFile(expected, "BUILD.bazel") } + @Test + fun `generator applies dummy dependencies from the blueprint`() { + val blueprint = getModuleBuildBazelBlueprint(dependencies = setOf( + FileTreeDependency("implementation", "libs", "*.jar", 1) + )) + buildBazelGenerator.generate(blueprint) + val expected = """java_library( + name = "target_name", + srcs = glob(["src/main/java/**/*.java"]), + visibility = ["//visibility:public"], + deps = [ + ":imported" + ], +) +java_import( + name = "imported", + constraints = ["android"], + jars = glob(["libs/*.jar}"]), +)""" + verify(fileWriter).writeToFile(expected, "BUILD.bazel") + } + private fun getModuleBuildBazelBlueprint(dependencies: Set = setOf()): ModuleBuildBazelBlueprint { return mock().apply { whenever(this.targetName).thenReturn("target_name") diff --git a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildGradleGeneratorTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildGradleGeneratorTest.kt index 730e09f3..016bf5b6 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildGradleGeneratorTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildGradleGeneratorTest.kt @@ -17,6 +17,7 @@ limitations under the License. package com.google.androidstudiopoet.generators import com.google.androidstudiopoet.models.Dependency +import com.google.androidstudiopoet.models.FileTreeDependency import com.google.androidstudiopoet.models.ModuleBuildGradleBlueprint import com.google.androidstudiopoet.models.LibraryDependency import com.google.androidstudiopoet.models.ModuleDependency @@ -60,6 +61,20 @@ targetCompatibility = "1.8"""" verify(fileWriter).writeToFile(expected, "path") } + @Test + fun `generator applies dummy libraries from the blueprint`() { + val blueprint = getModuleBuildGradleBlueprint(dependencies = setOf( + FileTreeDependency("implementation", "libs", "*.jar", 1) + )) + buildGradleGenerator.generate(blueprint) + val expected = """dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +} +sourceCompatibility = "1.8" +targetCompatibility = "1.8"""" + verify(fileWriter).writeToFile(expected, "path") + } + @Test fun `generator applies dependencies from the blueprint`() { val blueprint = getModuleBuildGradleBlueprint(dependencies = setOf( diff --git a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGeneratorTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGeneratorTest.kt index aa5c98c5..4b94ac78 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGeneratorTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGeneratorTest.kt @@ -65,6 +65,33 @@ android_library( verify(fileWriter).writeToFile(expected, "BUILD.bazel") } + @Test + fun `generator applies dummy libraries from the blueprint`() { + val blueprint = getAndroidBuildBazelBlueprint(dependencies = setOf( + FileTreeDependency("implementation","libs", "*.jar", 1), + )) + androidModuleBuildBazelGenerator.generate(blueprint) + val expected = """load("@gmaven_rules//:defs.bzl", "gmaven_artifact") + +android_library( + name = "example", + srcs = glob(["src/main/java/**/*.java"]), + resource_files = glob(["src/main/res/**/*"]), + manifest = "src/main/AndroidManifest.xml", + custom_package = "com.example", + visibility = ["//visibility:public"], + deps = [ + ":imported" + ], +) +java_import( + name = "imported", + constraints = ["android"], + jars = glob(["libs/*.jar}"]), +)""" + verify(fileWriter).writeToFile(expected, "BUILD.bazel") + } + @Test fun `generator sets correct target name from the blueprint`() { val blueprint = getAndroidBuildBazelBlueprint(packageName = "com.foo", targetName = "foo") diff --git a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildGradleGeneratorTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildGradleGeneratorTest.kt index ce18718b..0f231666 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildGradleGeneratorTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildGradleGeneratorTest.kt @@ -178,6 +178,40 @@ class AndroidModuleBuildGradleGeneratorTest { verify(fileWriter).writeToFile(expected, "path") } + @Test + fun `generator applies dummy libraries from the blueprint`() { + val blueprint = getAndroidBuildGradleBlueprint(dependencies = setOf( + FileTreeDependency("implementation", "libs", "*.jar", 10), + )) + androidModuleBuildGradleGenerator.generate(blueprint) + val expected = """ + android { + compileSdkVersion 0 + defaultConfig { + minSdkVersion 0 + targetSdkVersion 0 + versionCode 1 + versionName "1.0" + multiDexEnabled true + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + compileOptions { + targetCompatibility 1.8 + sourceCompatibility 1.8 + } + } + dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + }""".trimIndent() + verify(fileWriter).writeToFile(expected, "path") + } + @Test fun `generator applies flavors and dimensions from the blueprint`() { val blueprint = getAndroidBuildGradleBlueprint( From 1f94746511517f90ff048a122ae7839caf3fb18f Mon Sep 17 00:00:00 2001 From: Liz Yu Date: Fri, 12 Nov 2021 21:30:31 -0800 Subject: [PATCH 2/7] Remove unexpected indent change --- .../input/ModuleDependencyConfig.kt | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt b/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt index a2eb3bd2..7b7b920a 100644 --- a/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt +++ b/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt @@ -17,15 +17,13 @@ limitations under the License. package com.google.androidstudiopoet.input sealed class DependencyConfig { - data class ModuleDependencyConfig(val moduleName: String, val method: String? = null) : - DependencyConfig() + data class ModuleDependencyConfig(val moduleName: String, val method: String? = null) : DependencyConfig() - data class LibraryDependencyConfig(val library: String, val method: String? = null) : - DependencyConfig() + data class LibraryDependencyConfig(val library: String, val method: String? = null) : DependencyConfig() - data class DummyLocalJarLibsDependencyConfig( - val moduleName: String, - val count: Int, - val method: String? = null, - ) : DependencyConfig() -} \ No newline at end of file + data class DummyLocalJarLibsDependencyConfig( + val moduleName: String, + val count: Int, + val method: String? = null, + ) : DependencyConfig() +} From 17dc835c4beef4b34ac648dee43103c3aaa657f4 Mon Sep 17 00:00:00 2001 From: Liz Yu Date: Fri, 12 Nov 2021 21:41:49 -0800 Subject: [PATCH 3/7] update format --- .../androidstudiopoet/input/ModuleDependencyConfig.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt b/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt index 7b7b920a..9b04813b 100644 --- a/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt +++ b/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt @@ -18,12 +18,6 @@ package com.google.androidstudiopoet.input sealed class DependencyConfig { data class ModuleDependencyConfig(val moduleName: String, val method: String? = null) : DependencyConfig() - data class LibraryDependencyConfig(val library: String, val method: String? = null) : DependencyConfig() - - data class DummyLocalJarLibsDependencyConfig( - val moduleName: String, - val count: Int, - val method: String? = null, - ) : DependencyConfig() + data class DummyLocalJarLibsDependencyConfig(val moduleName: String, val count: Int, val method: String? = null) : DependencyConfig() } From 5ae18e90ee1263d2cfd2dfa95f29c9eba1b90d2e Mon Sep 17 00:00:00 2001 From: xinruiy Date: Fri, 19 Nov 2021 12:12:59 -0800 Subject: [PATCH 4/7] fix test --- .../ConfigPojoToAndroidModuleConfigConverterTest.kt | 4 ++-- .../generators/ModuleBuildBazelGeneratorTest.kt | 5 +++-- .../AndroidModuleBuildBazelGeneratorTest.kt | 11 +++++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/aspoet/src/test/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverterTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverterTest.kt index c43bb717..eef021cd 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverterTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverterTest.kt @@ -106,7 +106,7 @@ class ConfigPojoToAndroidModuleConfigConverterTest { generateTests.assertEquals(GENERATE_TESTS) hasLaunchActivity.assertFalse() - dependencies!!.assertEquals(PURE_MODULE_DEPENDENCY_LIST + LIBRARY_LIST) + dependencies!!.sortedBy { it.toString() }.assertEquals((PURE_MODULE_DEPENDENCY_LIST + LIBRARY_LIST).sortedBy { it.toString() }) } } @@ -115,7 +115,7 @@ class ConfigPojoToAndroidModuleConfigConverterTest { val androidModuleConfig = converter.convert(configPOJO, 0, productFlavorConfigs, buildTypes) assertOn(androidModuleConfig) { hasLaunchActivity.assertTrue() - dependencies!!.assertEquals(listOf(DependencyConfig.ModuleDependencyConfig(ANDROID_MODULE_NAME_1, DEPENDENCY_METHOD)) + PURE_MODULE_DEPENDENCY_LIST + LIBRARY_LIST) + dependencies!!.sortedBy { it.toString() }.assertEquals((listOf(DependencyConfig.ModuleDependencyConfig(ANDROID_MODULE_NAME_1, DEPENDENCY_METHOD)) + PURE_MODULE_DEPENDENCY_LIST + LIBRARY_LIST).sortedBy { it.toString() }) resourcesConfig!!.assertEquals(ResourcesConfig(ACTIVITY_COUNT + 2, ACTIVITY_COUNT + 5, ACTIVITY_COUNT)) } } diff --git a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt index 2ddc9ea4..a76dd82b 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt @@ -42,12 +42,13 @@ class ModuleBuildBazelGeneratorTest { "//library1", "//library2" ], -)""" +) +""" verify(fileWriter).writeToFile(expected, "BUILD.bazel") } @Test - fun `generator applies dummy dependencies from the blueprint`() { + fun `generator applies local dependencies from the blueprint`() { val blueprint = getModuleBuildBazelBlueprint(dependencies = setOf( FileTreeDependency("implementation", "libs", "*.jar", 1) )) diff --git a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGeneratorTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGeneratorTest.kt index 4b94ac78..adac4ac4 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGeneratorTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGeneratorTest.kt @@ -33,7 +33,8 @@ android_binary( "//library1", gmaven_artifact("external:aar:1") ], -)""" +) +""" verify(fileWriter).writeToFile(expected, "BUILD.bazel") } @@ -61,12 +62,13 @@ android_library( gmaven_artifact("external:aar:1"), gmaven_artifact("external:aar:2") ], -)""" +) +""" verify(fileWriter).writeToFile(expected, "BUILD.bazel") } @Test - fun `generator applies dummy libraries from the blueprint`() { + fun `generator applies local libraries from the blueprint`() { val blueprint = getAndroidBuildBazelBlueprint(dependencies = setOf( FileTreeDependency("implementation","libs", "*.jar", 1), )) @@ -105,7 +107,8 @@ android_library( manifest = "src/main/AndroidManifest.xml", custom_package = "com.foo", visibility = ["//visibility:public"], -)""" +) +""" verify(fileWriter).writeToFile(expected, "BUILD.bazel") } From da963b7e4882bc55ddb51122b10d9b758157862d Mon Sep 17 00:00:00 2001 From: xinruiy Date: Fri, 19 Nov 2021 12:20:05 -0800 Subject: [PATCH 5/7] fix prefix --- .../androidstudiopoet/input/ModuleDependencyConfig.kt | 2 +- .../com/google/androidstudiopoet/ModuleBlueprintFactory.kt | 2 +- .../converters/ConfigPojoToAndroidModuleConfigConverter.kt | 6 +++--- .../converters/ConfigPojoToModuleConfigConverter.kt | 6 +++--- .../kotlin/com/google/androidstudiopoet/input/ConfigPOJO.kt | 6 +++--- .../generators/ModuleBuildGradleGeneratorTest.kt | 4 ++-- .../AndroidModuleBuildGradleGeneratorTest.kt | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt b/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt index 9b04813b..cd3a6365 100644 --- a/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt +++ b/aspoet-input/src/main/kotlin/com/google/androidstudiopoet/input/ModuleDependencyConfig.kt @@ -19,5 +19,5 @@ package com.google.androidstudiopoet.input sealed class DependencyConfig { data class ModuleDependencyConfig(val moduleName: String, val method: String? = null) : DependencyConfig() data class LibraryDependencyConfig(val library: String, val method: String? = null) : DependencyConfig() - data class DummyLocalJarLibsDependencyConfig(val moduleName: String, val count: Int, val method: String? = null) : DependencyConfig() + data class LocalJarLibsDependencyConfig(val moduleName: String, val count: Int, val method: String? = null) : DependencyConfig() } diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt index 978d3353..eb4d44d2 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt @@ -116,7 +116,7 @@ object ModuleBlueprintFactory { } } is DependencyConfig.LibraryDependencyConfig -> LibraryDependency(dependencyConfig.method.toDependencyMethod(), dependencyConfig.library) - is DependencyConfig.DummyLocalJarLibsDependencyConfig -> FileTreeDependency(dependencyConfig.method.toDependencyMethod(), "libs", "*.jar", dependencyConfig.count) + is DependencyConfig.LocalJarLibsDependencyConfig -> FileTreeDependency(dependencyConfig.method.toDependencyMethod(), "libs", "*.jar", dependencyConfig.count) } } ?: listOf() return moduleDependencies.toHashSet() diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverter.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverter.kt index 507c845b..9c505755 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverter.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverter.kt @@ -46,8 +46,8 @@ class ConfigPojoToAndroidModuleConfigConverter { val resolvedDependencies = config.resolvedDependencies[moduleName]?.sortedBy { it.to } ?.map { dependency -> DependencyConfig.ModuleDependencyConfig(dependency.to, dependency.method) } ?: emptyList() - val resolvedDummyLocalJarLibsDependency = config.resolvedDummyLocalJarLibsDependencies[moduleName]?.let { listOf(it) } ?: emptyList() - dependencies = (config.libraries?: emptyList()) + resolvedDependencies + resolvedDummyLocalJarLibsDependency + val resolvedLocalJarLibsDependency = config.resolvedLocalJarLibsDependencies[moduleName]?.let { listOf(it) } ?: emptyList() + dependencies = (config.libraries?: emptyList()) + resolvedDependencies + resolvedLocalJarLibsDependency this.buildTypes = buildTypes this.productFlavorConfigs = productFlavorConfigs @@ -58,4 +58,4 @@ class ConfigPojoToAndroidModuleConfigConverter { viewBinding = config.viewBinding } } -} \ No newline at end of file +} diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToModuleConfigConverter.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToModuleConfigConverter.kt index dc9ec3de..d5bb5ef8 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToModuleConfigConverter.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToModuleConfigConverter.kt @@ -44,8 +44,8 @@ class ConfigPojoToModuleConfigConverter { moduleName = config.getModuleName(index) - val resolvedDummyFileTreeDependency = config.resolvedDummyLocalJarLibsDependencies[moduleName]?.let { listOf(it) } ?: emptyList() - dependencies = (config.resolvedDependencies[moduleName]?.map { DependencyConfig.ModuleDependencyConfig(it.to, it.method) } ?: listOf()) + resolvedDummyFileTreeDependency + val resolvedFileTreeDependency = config.resolvedLocalJarLibsDependencies[moduleName]?.let { listOf(it) } ?: emptyList() + dependencies = (config.resolvedDependencies[moduleName]?.map { DependencyConfig.ModuleDependencyConfig(it.to, it.method) } ?: listOf()) + resolvedFileTreeDependency } } -} \ No newline at end of file +} diff --git a/aspoet/src/main/kotlin/com/google/androidstudiopoet/input/ConfigPOJO.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/input/ConfigPOJO.kt index 10569f30..b452a3c4 100644 --- a/aspoet/src/main/kotlin/com/google/androidstudiopoet/input/ConfigPOJO.kt +++ b/aspoet/src/main/kotlin/com/google/androidstudiopoet/input/ConfigPOJO.kt @@ -86,7 +86,7 @@ class ConfigPOJO { var libraries: List? = null - var dummyLocalJarLibsDependency: List? = null + var localJarLibsDependency: List? = null var extraBuildFileLines: List? = null @@ -137,8 +137,8 @@ class ConfigPOJO { allDependencies } - val resolvedDummyLocalJarLibsDependencies: Map by lazy { - val givenDependency = dummyLocalJarLibsDependency + val resolvedLocalJarLibsDependencies: Map by lazy { + val givenDependency = localJarLibsDependency givenDependency?.associateBy({it.moduleName}, {it}) ?: emptyMap() } private val allModuleNames: List by lazy { diff --git a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildGradleGeneratorTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildGradleGeneratorTest.kt index 016bf5b6..edac9921 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildGradleGeneratorTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildGradleGeneratorTest.kt @@ -62,7 +62,7 @@ targetCompatibility = "1.8"""" } @Test - fun `generator applies dummy libraries from the blueprint`() { + fun `generator applies local libraries from the blueprint`() { val blueprint = getModuleBuildGradleBlueprint(dependencies = setOf( FileTreeDependency("implementation", "libs", "*.jar", 1) )) @@ -120,4 +120,4 @@ line2""" whenever(this.path).thenReturn("path") } } -} \ No newline at end of file +} diff --git a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildGradleGeneratorTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildGradleGeneratorTest.kt index 0f231666..ac7bedba 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildGradleGeneratorTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildGradleGeneratorTest.kt @@ -179,7 +179,7 @@ class AndroidModuleBuildGradleGeneratorTest { } @Test - fun `generator applies dummy libraries from the blueprint`() { + fun `generator applies local libraries from the blueprint`() { val blueprint = getAndroidBuildGradleBlueprint(dependencies = setOf( FileTreeDependency("implementation", "libs", "*.jar", 10), )) @@ -359,4 +359,4 @@ class AndroidModuleBuildGradleGeneratorTest { whenever(blueprint.path).thenReturn("path") return blueprint } -} \ No newline at end of file +} From 6a6e8ae2e49df2f5f2942cbf4df8ed8b2a96b94c Mon Sep 17 00:00:00 2001 From: Liz Yu Date: Fri, 19 Nov 2021 12:45:10 -0800 Subject: [PATCH 6/7] Update README.md Add description for localJarLibsDependency --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 4b3c4e96..fb604bf5 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Create a real life complexity Android project that mimics your own and observe t * Configurable version of Gradle, Kotlin, the Android Gradle Plugin * Experimental Bazel support * [Compose](https://developer.android.com/jetpack/compose) and [DataBinding](https://developer.android.com/topic/libraries/data-binding) support +* Configurable number of local jar library dependencies ## Download & Run ### IntelliJ IDEA/Android Studio @@ -56,6 +57,10 @@ will crawl the folder recursively and execute each config in turn. * Specify `viewBinding` for View Binding. * Specify `composeConfig` for Compose. * It has a property `actionCount` to indicate the number of clickable actions. +* Sepcify `localJarLibsDependency` for local jar depencencies. + * It's a list of items that indicate creating local jar depencencies for specific module. For each item, + * It has a property `moduleName` to indicate which module the depencies are attached to. + * It has a properoty `count` to indicate how many depencies are attached the specified module. * If nothing above is specified, the UI layer code will be traditional XML-based layout. * Errors will be thrown when two of the above config is specified. From 86cd8cb5aedd32c31e107148af78194cace84b94 Mon Sep 17 00:00:00 2001 From: Liz Yu Date: Fri, 19 Nov 2021 12:47:29 -0800 Subject: [PATCH 7/7] Update README.md fix typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fb604bf5..d14e286f 100644 --- a/README.md +++ b/README.md @@ -59,8 +59,8 @@ will crawl the folder recursively and execute each config in turn. * It has a property `actionCount` to indicate the number of clickable actions. * Sepcify `localJarLibsDependency` for local jar depencencies. * It's a list of items that indicate creating local jar depencencies for specific module. For each item, - * It has a property `moduleName` to indicate which module the depencies are attached to. - * It has a properoty `count` to indicate how many depencies are attached the specified module. + * It has a property `moduleName` to indicate the module name that depencies are attached to. + * It has a properoty `count` to indicate the number of depencies are attached. * If nothing above is specified, the UI layer code will be traditional XML-based layout. * Errors will be thrown when two of the above config is specified.