diff --git a/README.md b/README.md index 4b3c4e9..d14e286 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 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. 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 d3f08a1..cd3a636 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,4 +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() -} \ No newline at end of file + 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 dd442e4..eb4d44d 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.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 ad2736a..9c50575 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 resolvedLocalJarLibsDependency = config.resolvedLocalJarLibsDependencies[moduleName]?.let { listOf(it) } ?: emptyList() + dependencies = (config.libraries?: emptyList()) + resolvedDependencies + resolvedLocalJarLibsDependency this.buildTypes = buildTypes this.productFlavorConfigs = productFlavorConfigs @@ -57,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 c726ff3..d5bb5ef 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 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/generators/GradleUtils.kt b/aspoet/src/main/kotlin/com/google/androidstudiopoet/generators/GradleUtils.kt index 156a94e..08de3cd 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 310a761..c91f367 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 fba7195..7bd1e73 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 ffaa557..b20bd2b 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 3309233..b452a3c 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 localJarLibsDependency: List? = null + var extraBuildFileLines: List? = null var extraAndroidBuildFileLines: List? = null @@ -135,6 +137,10 @@ class ConfigPOJO { allDependencies } + val resolvedLocalJarLibsDependencies: Map by lazy { + val givenDependency = localJarLibsDependency + 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 c9a332e..cdb0b2a 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/converters/ConfigPojoToAndroidModuleConfigConverterTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/converters/ConfigPojoToAndroidModuleConfigConverterTest.kt index c43bb71..eef021c 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 7ec1471..a76dd82 100644 --- a/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt +++ b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/ModuleBuildBazelGeneratorTest.kt @@ -42,6 +42,29 @@ class ModuleBuildBazelGeneratorTest { "//library1", "//library2" ], +) +""" + verify(fileWriter).writeToFile(expected, "BUILD.bazel") + } + + @Test + fun `generator applies local 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") } 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 730e09f..edac992 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 local 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( @@ -105,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/AndroidModuleBuildBazelGeneratorTest.kt b/aspoet/src/test/kotlin/com/google/androidstudiopoet/generators/android_modules/AndroidModuleBuildBazelGeneratorTest.kt index aa5c98c..adac4ac 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,6 +62,34 @@ android_library( gmaven_artifact("external:aar:1"), gmaven_artifact("external:aar:2") ], +) +""" + verify(fileWriter).writeToFile(expected, "BUILD.bazel") + } + + @Test + fun `generator applies local 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") } @@ -78,7 +107,8 @@ android_library( manifest = "src/main/AndroidManifest.xml", custom_package = "com.foo", visibility = ["//visibility:public"], -)""" +) +""" verify(fileWriter).writeToFile(expected, "BUILD.bazel") } 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 ce18718..ac7bedb 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 local 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( @@ -325,4 +359,4 @@ class AndroidModuleBuildGradleGeneratorTest { whenever(blueprint.path).thenReturn("path") return blueprint } -} \ No newline at end of file +}