in ruler-common/src/main/java/com/spotify/ruler/common/report/JsonReporter.kt [46:111]
fun generateReport(
appInfo: AppInfo,
components: Map<DependencyComponent, List<AppFile>>,
features: Map<String, List<AppFile>>,
ownershipInfo: OwnershipInfo?,
targetDir: File,
omitFileBreakdown: Boolean,
): File {
val report = AppReport(
name = appInfo.applicationId,
version = appInfo.versionName,
variant = appInfo.variantName,
downloadSize = components.values.flatten().sumOf(AppFile::downloadSize),
installSize = components.values.flatten().sumOf(AppFile::installSize),
components = components.map { (component, files) ->
AppComponent(
name = component.name,
type = component.type,
downloadSize = files.sumOf(AppFile::downloadSize),
installSize = files.sumOf(AppFile::installSize),
owner = ownershipInfo?.getOwner(component.name, component.type),
files = if (omitFileBreakdown) {
null
} else {
files.map { file ->
AppFile(
name = file.name,
type = file.type,
downloadSize = file.downloadSize,
installSize = file.installSize,
owner = ownershipInfo?.getOwner(file.name, component.name, component.type),
resourceType = file.resourceType,
)
}.sortedWith(comparator.reversed())
}
)
}.sortedWith(comparator.reversed()),
dynamicFeatures = features.map { (feature, files) ->
DynamicFeature(
name = feature,
downloadSize = files.sumOf(AppFile::downloadSize),
installSize = files.sumOf(AppFile::installSize),
owner = ownershipInfo?.getOwner(feature),
files = if (omitFileBreakdown) {
null
} else {
files.map { file ->
AppFile(
name = file.name,
type = file.type,
downloadSize = file.downloadSize,
installSize = file.installSize,
owner = ownershipInfo?.getOwner(file.name, feature),
resourceType = file.resourceType,
)
}.sortedWith(comparator.reversed())
}
)
}.sortedWith(comparator.reversed()),
)
val format = Json { prettyPrint = false }
val reportFile = targetDir.resolve("report.json")
reportFile.writeText(format.encodeToString(report))
return reportFile
}