diff --git a/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/LibresStringGenerationTask.kt b/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/LibresStringGenerationTask.kt index 797ae7e..d04cfad 100644 --- a/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/LibresStringGenerationTask.kt +++ b/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/LibresStringGenerationTask.kt @@ -18,17 +18,21 @@ abstract class LibresStringGenerationTask : DefaultTask() { @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) - internal abstract var inputDirectory: FileCollection + internal abstract var inputDirectories: List @get:OutputDirectory internal abstract var outputDirectory: File @TaskAction fun apply() { - inputDirectory.files - .takeIf { files -> files.isNotEmpty() } - ?.let { files -> parseStringResources(files, settings.baseLocaleLanguageCode) } - ?.takeIf { resources -> resources.getValue(settings.baseLocaleLanguageCode).isNotEmpty() } + inputDirectories + .mapNotNull { fileCollection -> + fileCollection.files.takeIf { files -> files.isNotEmpty() } + } + .let { listFiles -> + parseStringResources(listFiles, settings.baseLocaleLanguageCode) + } + .takeIf { resources -> resources.getValue(settings.baseLocaleLanguageCode).isNotEmpty() } ?.let { resources -> buildResources(resources) } ?: buildEmptyResources() } diff --git a/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/ResourcesPlugin.kt b/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/ResourcesPlugin.kt index 6a2c5c8..eb28d2b 100644 --- a/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/ResourcesPlugin.kt +++ b/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/ResourcesPlugin.kt @@ -35,7 +35,7 @@ class ResourcesPlugin : Plugin { private var isKotlin = false private lateinit var pluginExtension: ResourcesPluginExtension - private lateinit var inputDirectory: File + private lateinit var inputDirectories: List private lateinit var mainSourceSet: PluginSourceSet private val allSourceSets = mutableListOf() private var outputPackageName: String? = null @@ -99,7 +99,7 @@ class ResourcesPlugin : Plugin { when { commonSourceSet != null -> { - inputDirectory = commonSourceSet.resources.sourceDirectories.first().resolveSibling("libres") + inputDirectories = commonSourceSet.resources.sourceDirectories.map { it.resolveSibling("libres") } mainSourceSet = commonSourceSet.createKotlinSourceSet(outputDirectory, KotlinPlatform.Common) allSourceSets += kotlinExtension.targets.takeKotlinSourceSet(outputDirectory) if (androidExtension != null) allSourceSets += androidExtension.findAndroidSourceSet(true, outputDirectory, kotlinExtension) @@ -107,7 +107,7 @@ class ResourcesPlugin : Plugin { } androidExtension != null -> { val androidMainSourceSet = androidExtension.sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME) - inputDirectory = androidMainSourceSet.resources.srcDirs.first().resolveSibling("libres") + inputDirectories = androidMainSourceSet.resources.srcDirs.map { it.resolveSibling("libres") } mainSourceSet = androidExtension.findAndroidSourceSet(false, outputDirectory, kotlinExtension) allSourceSets += mainSourceSet } @@ -115,15 +115,15 @@ class ResourcesPlugin : Plugin { val target = kotlinExtension.targets.firstOrNull { it.platform != null } ?: return val defaultSourceSet = target.compilations.firstOrNull { it.isMainCompilation }?.defaultSourceSet ?: return mainSourceSet = defaultSourceSet.createKotlinSourceSet(outputDirectory, target.platform!!) - inputDirectory = defaultSourceSet.resources.sourceDirectories.first().resolveSibling("libres") + inputDirectories = defaultSourceSet.resources.sourceDirectories.map { it.resolveSibling("libres") } allSourceSets += mainSourceSet } } } private fun Project.registerGeneratorsTasks() { - val stringsInputDirectory = File(inputDirectory, "strings") - val imagesInputDirectory = File(inputDirectory, "images") + val stringsInputDirectory = inputDirectories.map { File(it, "strings") } + val imagesInputDirectory = inputDirectories.map { File(it, "images") } val stringsOutputPackageName = listOfNotNull(outputPackageName, "strings").joinToString(".") val imagesOutputPackageName = listOfNotNull(outputPackageName, "images").joinToString(".") @@ -136,9 +136,11 @@ class ResourcesPlugin : Plugin { baseLocaleLanguageCode = pluginExtension.baseLocaleLanguageCode, camelCaseForApple = pluginExtension.camelCaseNamesForAppleFramework && allSourceSets.any { it.platform == KotlinPlatform.Apple } ) - task.inputDirectory = fileTree(stringsInputDirectory) { config -> - config.include { element -> - !element.isDirectory && element.file.extension.lowercase() in STRINGS_EXTENSIONS + task.inputDirectories = stringsInputDirectory.map { dir -> + fileTree(dir) { config -> + config.include { element -> + !element.isDirectory && element.file.extension.lowercase() in STRINGS_EXTENSIONS + } } } task.outputDirectory = mainSourceSet.sourcesDir.toOutputDirectory(stringsOutputPackageName) @@ -152,11 +154,24 @@ class ResourcesPlugin : Plugin { camelCaseForApple = pluginExtension.camelCaseNamesForAppleFramework, appleBundleName = project.appleBundleName ) - task.inputDirectory = fileTree(imagesInputDirectory) { config -> - config.include { element -> - !element.isDirectory && element.file.extension.lowercase() in IMAGES_EXTENSIONS + + imagesInputDirectory.map { dir -> + fileTree(dir) { config -> + config.include { element -> + !element.isDirectory && element.file.extension.lowercase() in IMAGES_EXTENSIONS + } } } + + task.inputDirectory = imagesInputDirectory.map { dir -> + fileTree(dir) { config -> + config.include { element -> + !element.isDirectory && element.file.extension.lowercase() in IMAGES_EXTENSIONS + } + }.filter { true } + }.reduce { fileCollectionLeft, fileCollectionRight -> + fileCollectionLeft + fileCollectionRight + } task.outputSourcesDirectories = allSourceSets.associateBy(PluginSourceSet::platform) { it.sourcesDir.toOutputDirectory(imagesOutputPackageName) } diff --git a/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/strings/StringsParsing.kt b/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/strings/StringsParsing.kt index 6e784c1..55a1fde 100644 --- a/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/strings/StringsParsing.kt +++ b/gradle-plugin/src/main/java/io/github/skeptick/libres/plugin/strings/StringsParsing.kt @@ -10,11 +10,29 @@ private typealias Resources = Map> private val xmlMapper = XmlMapper() -internal fun parseStringResources(inputFiles: Set, baseLocaleLanguageCode: LanguageCode): Resources { - val filesByLocale = inputFiles.groupBy { it.name.substringAfterLast("_").substringBefore(".") } - if (filesByLocale[baseLocaleLanguageCode].isNullOrEmpty()) throw BaseStringResourcesNotFoundException() - - val resources = filesByLocale.mapValues { (_, files) -> files.map(xmlMapper::readTree).flatMap(JsonNode::parseResources) } +internal fun parseStringResources( + listInputFiles: List>, + baseLocaleLanguageCode: LanguageCode +): Resources { + val resources = listInputFiles + .map { inputFiles -> + val filesByLocale = + inputFiles.groupBy { it.name.substringAfterLast("_").substringBefore(".") } + + if (filesByLocale[baseLocaleLanguageCode].isNullOrEmpty()) throw BaseStringResourcesNotFoundException() + + filesByLocale.mapValues { (_, files) -> files.map(xmlMapper::readTree).flatMap(JsonNode::parseResources) } + } + .fold(mutableMapOf>()) { mutableAccumulator, resource -> + for ((lang, list) in resource) { + mutableAccumulator.getOrPut(lang, ::mutableMapOf).putAll(list.associateBy { it.name }) + } + mutableAccumulator + } + .map { (lang, map) -> + lang to map.values.toList() + } + .toMap() resources.validateNames(baseLocaleLanguageCode) resources.validateDuplicatesAndArguments() return resources