From 743b9a97178273a8d79e7a261f294f785acb7b8b Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Sun, 9 Feb 2025 20:59:31 -0500 Subject: [PATCH 1/2] Splitting apart stats.js into individual files... --- .../internal/report/js/InvertJsReportUtils.kt | 16 +++++ .../report/js/InvertJsReportWriter.kt | 59 +++++++++++++------ .../report/json/InvertJsonReportWriter.kt | 1 - .../com/squareup/invert/models/Typealiases.kt | 1 + .../js/CollectedStatTotalsJsReportModel.kt | 1 - .../invert/models/js/JsReportFileKey.kt | 1 + .../invert/models/js/StatJsReportModel.kt | 15 +++++ .../invert/common/CollectedDataRepo.kt | 25 ++++++-- .../navigation/RemoteJsLoadingProgress.kt | 45 ++++++++------ .../src/jsMain/kotlin/ui/NavBarComposable.kt | 5 +- 10 files changed, 127 insertions(+), 42 deletions(-) create mode 100644 invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/StatJsReportModel.kt diff --git a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/js/InvertJsReportUtils.kt b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/js/InvertJsReportUtils.kt index c21d077..d1081d0 100644 --- a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/js/InvertJsReportUtils.kt +++ b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/js/InvertJsReportUtils.kt @@ -19,6 +19,7 @@ import com.squareup.invert.models.js.DependenciesJsReportModel import com.squareup.invert.models.js.DirectDependenciesJsReportModel import com.squareup.invert.models.js.OwnershipJsReportModel import com.squareup.invert.models.js.PluginsJsReportModel +import com.squareup.invert.models.js.StatJsReportModel import com.squareup.invert.models.js.StatTotalAndMetadata import com.squareup.invert.models.js.StatsJsReportModel @@ -113,6 +114,21 @@ object InvertJsReportUtils { return globalTotals } + fun buildStatJsReportModelList(statsJsReportModel: StatsJsReportModel): Set { + val map = mutableMapOf>() + statsJsReportModel.statsByModule.entries.forEach { (modulePath, statMap: Map) -> + statMap.entries.forEach { (statKey, stat) -> + map[statKey] = map.getOrDefault(statKey, emptyMap()) + (modulePath to stat) + } + } + return statsJsReportModel.statInfos.values.map { statMetadata -> + StatJsReportModel( + statInfo = statMetadata, + statsByModule = map[statMetadata.key] ?: emptyMap() + ) + }.toSet() + } + /** * Takes all [CollectedStatsForProject] collected by Invert, and creates the JS Report Model. */ diff --git a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/js/InvertJsReportWriter.kt b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/js/InvertJsReportWriter.kt index 37eccfe..1f757ff 100644 --- a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/js/InvertJsReportWriter.kt +++ b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/js/InvertJsReportWriter.kt @@ -16,9 +16,9 @@ import com.squareup.invert.models.js.JsReportFileKey import com.squareup.invert.models.js.MetadataJsReportModel import com.squareup.invert.models.js.OwnershipJsReportModel import com.squareup.invert.models.js.PluginsJsReportModel +import com.squareup.invert.models.js.StatJsReportModel import com.squareup.invert.models.js.StatsJsReportModel import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.SetSerializer import java.io.File @@ -43,6 +43,15 @@ class InvertJsReportWriter( val pluginsReport = InvertJsReportUtils.toCollectedPlugins(allPluginsData) val modulesList = allProjectsDependencyData.map { it.path } + val statsMapData: Set = InvertJsReportUtils.buildStatJsReportModelList(allProjectsStatsData) + statsMapData.forEach { + writeJsFileInDir( + fileKey = JsReportFileKey.STAT.key + "_" + it.statInfo.key, + serializer = StatJsReportModel.serializer(), + value = it + ) + } + val collectedDependencies = HomeJsReportModel( modules = modulesList.sorted(), artifacts = invertedDependencies.getAllArtifactIds().sorted(), @@ -50,61 +59,61 @@ class InvertJsReportWriter( ) writeJsFileInDir( - fileKey = JsReportFileKey.METADATA, + fileKey = JsReportFileKey.METADATA.key, serializer = MetadataJsReportModel.serializer(), value = reportMetadata ) writeJsFileInDir( - fileKey = JsReportFileKey.HISTORICAL_DATA, + fileKey = JsReportFileKey.HISTORICAL_DATA.key, serializer = SetSerializer(HistoricalData.serializer()), value = historicalData ) writeJsFileInDir( - fileKey = JsReportFileKey.OWNERS, + fileKey = JsReportFileKey.OWNERS.key, serializer = OwnershipJsReportModel.serializer(), value = collectedOwnershipInfo ) writeJsFileInDir( - fileKey = JsReportFileKey.STAT_TOTALS, + fileKey = JsReportFileKey.STAT_TOTALS.key, serializer = CollectedStatTotalsJsReportModel.serializer(), value = globalStatTotals ) writeJsFileInDir( - fileKey = JsReportFileKey.STATS, + fileKey = JsReportFileKey.STATS.key, serializer = StatsJsReportModel.serializer(), value = allProjectsStatsData ) writeJsFileInDir( - fileKey = JsReportFileKey.CONFIGURATIONS, + fileKey = JsReportFileKey.CONFIGURATIONS.key, serializer = ConfigurationsJsReportModel.serializer(), value = InvertJsReportUtils.toCollectedConfigurations(allProjectsConfigurationsData) ) writeJsFileInDir( - fileKey = JsReportFileKey.PLUGINS, + fileKey = JsReportFileKey.PLUGINS.key, serializer = PluginsJsReportModel.serializer(), value = pluginsReport ) writeJsFileInDir( - fileKey = JsReportFileKey.INVERTED_DEPENDENCIES, + fileKey = JsReportFileKey.INVERTED_DEPENDENCIES.key, serializer = DependenciesJsReportModel.serializer(), value = invertedDependencies ) writeJsFileInDir( - fileKey = JsReportFileKey.DIRECT_DEPENDENCIES, + fileKey = JsReportFileKey.DIRECT_DEPENDENCIES.key, serializer = DirectDependenciesJsReportModel.serializer(), value = directDependencies ) writeJsFileInDir( - fileKey = JsReportFileKey.HOME, + fileKey = JsReportFileKey.HOME.key, serializer = HomeJsReportModel.serializer(), value = collectedDependencies ) @@ -131,7 +140,23 @@ class InvertJsReportWriter( } fun writeJsFileInDir( - fileKey: JsReportFileKey, + fileKey: String, + serializer: KSerializer, + value: T, + ) = writeJsFile( + logger = logger, + fileKey = fileKey, + jsOutputFile = InvertFileUtils.outputFile( + directory = rootBuildHtmlReportDir, + filename = "$fileKey.js" + ), + serializer = serializer, + value = value + ) + + fun writeJsFileInDir( + fileKey: String, + jsFilename: String, serializer: KSerializer, value: T, ) = writeJsFile( @@ -139,7 +164,7 @@ class InvertJsReportWriter( fileKey = fileKey, jsOutputFile = InvertFileUtils.outputFile( directory = rootBuildHtmlReportDir, - filename = fileKey.jsFilename + filename = jsFilename ), serializer = serializer, value = value @@ -152,18 +177,18 @@ class InvertJsReportWriter( * This method of variable assignment is used by the invert web ui to get around Web CORS rules. */ private fun invertJsGlobalVariableAssignment( - fileKey: JsReportFileKey, + fileKey: String, value: String ): String { return buildString { - appendLine("window.invert_report.${fileKey.key}=") + appendLine("window.invert_report[\"${fileKey}\"]=") appendLine(value) } } fun writeJsFile( logger: InvertLogger, - fileKey: JsReportFileKey, + fileKey: String, jsOutputFile: File, serializer: KSerializer, value: T, @@ -180,7 +205,7 @@ class InvertJsReportWriter( ) ) ) - logger.lifecycle("Writing JavaScript ${fileKey.description} to file://$canonicalPath") + logger.lifecycle("Writing JavaScript $fileKey to file://$canonicalPath") } } } diff --git a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/json/InvertJsonReportWriter.kt b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/json/InvertJsonReportWriter.kt index 04ae9dd..a2d713a 100644 --- a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/json/InvertJsonReportWriter.kt +++ b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/json/InvertJsonReportWriter.kt @@ -16,7 +16,6 @@ import com.squareup.invert.models.js.MetadataJsReportModel import com.squareup.invert.models.js.StatTotalAndMetadata import com.squareup.invert.models.js.StatsJsReportModel import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.SetSerializer import java.io.File diff --git a/invert-models/src/commonMain/kotlin/com/squareup/invert/models/Typealiases.kt b/invert-models/src/commonMain/kotlin/com/squareup/invert/models/Typealiases.kt index aed62ea..0ce7cc9 100644 --- a/invert-models/src/commonMain/kotlin/com/squareup/invert/models/Typealiases.kt +++ b/invert-models/src/commonMain/kotlin/com/squareup/invert/models/Typealiases.kt @@ -4,6 +4,7 @@ typealias DependencyId = String typealias ConfigurationName = String typealias GradlePluginId = String typealias ModulePath = String +typealias FileKey = String typealias OwnerName = String typealias GitSha = String typealias GitBranch = String diff --git a/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/CollectedStatTotalsJsReportModel.kt b/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/CollectedStatTotalsJsReportModel.kt index fc829f8..1bf6bdd 100644 --- a/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/CollectedStatTotalsJsReportModel.kt +++ b/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/CollectedStatTotalsJsReportModel.kt @@ -1,6 +1,5 @@ package com.squareup.invert.models.js -import com.squareup.invert.models.ModulePath import com.squareup.invert.models.OwnerName import com.squareup.invert.models.StatKey import com.squareup.invert.models.StatMetadata diff --git a/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/JsReportFileKey.kt b/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/JsReportFileKey.kt index 2190004..c5c03f7 100644 --- a/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/JsReportFileKey.kt +++ b/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/JsReportFileKey.kt @@ -16,6 +16,7 @@ enum class JsReportFileKey( OWNERS("owners", "Owners"), METADATA("metadata", "Metadata"), CONFIGURATIONS("configurations", "Configurations"), + STAT("stat", "Stat"), STATS("stats", "Stats"), STAT_TOTALS("stat_totals", "Stat Totals"); diff --git a/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/StatJsReportModel.kt b/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/StatJsReportModel.kt new file mode 100644 index 0000000..2a4ab1d --- /dev/null +++ b/invert-models/src/commonMain/kotlin/com/squareup/invert/models/js/StatJsReportModel.kt @@ -0,0 +1,15 @@ +package com.squareup.invert.models.js + +import com.squareup.invert.models.ModulePath +import com.squareup.invert.models.Stat +import com.squareup.invert.models.StatMetadata +import kotlinx.serialization.Serializable + +/** + * Model for [JsReportFileKey.STATS] for Invert Web Report + */ +@Serializable +data class StatJsReportModel( + val statInfo: StatMetadata, + val statsByModule: Map, +) diff --git a/invert-report/src/jsMain/kotlin/com/squareup/invert/common/CollectedDataRepo.kt b/invert-report/src/jsMain/kotlin/com/squareup/invert/common/CollectedDataRepo.kt index 09248d6..88a91e9 100644 --- a/invert-report/src/jsMain/kotlin/com/squareup/invert/common/CollectedDataRepo.kt +++ b/invert-report/src/jsMain/kotlin/com/squareup/invert/common/CollectedDataRepo.kt @@ -1,5 +1,7 @@ package com.squareup.invert.common +import com.squareup.invert.models.FileKey +import com.squareup.invert.models.StatKey import com.squareup.invert.models.js.CollectedStatTotalsJsReportModel import com.squareup.invert.models.js.ConfigurationsJsReportModel import com.squareup.invert.models.js.DependenciesJsReportModel @@ -10,6 +12,7 @@ import com.squareup.invert.models.js.JsReportFileKey import com.squareup.invert.models.js.MetadataJsReportModel import com.squareup.invert.models.js.OwnershipJsReportModel import com.squareup.invert.models.js.PluginsJsReportModel +import com.squareup.invert.models.js.StatJsReportModel import com.squareup.invert.models.js.StatsJsReportModel import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow @@ -25,22 +28,30 @@ import kotlinx.coroutines.withContext */ class CollectedDataRepo( private val coroutineDispatcher: CoroutineDispatcher, - private val loadFileData: suspend (JsReportFileKey, CollectedDataRepo) -> Unit = { _, _ -> }, + private val loadFileData: suspend (FileKey, CollectedDataRepo) -> Unit = { _, _ -> }, ) { - private val hasLoadedFile = mutableMapOf() + private val hasLoadedFile = mutableMapOf() - private suspend fun loadJsOfType(fileKey: JsReportFileKey) = withContext(coroutineDispatcher) { + private suspend fun loadJsOfType(fileKey: FileKey) = withContext(coroutineDispatcher) { if (!hasLoadedFile.contains(fileKey)) { hasLoadedFile[fileKey] = true loadFileData(fileKey, this@CollectedDataRepo) } } + private suspend fun loadJsOfType(jsReportFileKey: JsReportFileKey) = withContext(coroutineDispatcher) { + loadJsOfType(jsReportFileKey.key) + } + private val _collectedPluginInfoReport: MutableStateFlow = MutableStateFlow(null) val collectedPluginInfoReport: Flow = _collectedPluginInfoReport - .onEach { loadJsOfType(JsReportFileKey.PLUGINS) } + .onEach { loadJsOfType(JsReportFileKey.PLUGINS.key) } + + private val _statData = MutableStateFlow>(mapOf()) + fun statData(statKey: StatKey): Flow?> = _statData + .onEach { loadJsOfType(JsReportFileKey.STAT.key + "_$statKey") } private val _statsData = MutableStateFlow(null) val statsData: Flow = _statsData @@ -127,6 +138,12 @@ class CollectedDataRepo( this._historicalData.value = historicalData } + fun statUpdated(statJsReportModel: StatJsReportModel) { + this._statData.value = this._statData.value.toMutableMap().apply { + put(statJsReportModel.statInfo.key, statJsReportModel) + } + } + fun homeUpdated(data: HomeJsReportModel) { this._home.value = data } diff --git a/invert-report/src/jsMain/kotlin/navigation/RemoteJsLoadingProgress.kt b/invert-report/src/jsMain/kotlin/navigation/RemoteJsLoadingProgress.kt index aaca5ca..6c51065 100644 --- a/invert-report/src/jsMain/kotlin/navigation/RemoteJsLoadingProgress.kt +++ b/invert-report/src/jsMain/kotlin/navigation/RemoteJsLoadingProgress.kt @@ -14,6 +14,7 @@ import com.squareup.invert.models.js.JsReportFileKey import com.squareup.invert.models.js.MetadataJsReportModel import com.squareup.invert.models.js.OwnershipJsReportModel import com.squareup.invert.models.js.PluginsJsReportModel +import com.squareup.invert.models.js.StatJsReportModel import com.squareup.invert.models.js.StatsJsReportModel import externalLoadJavaScriptFile import kotlinx.browser.window @@ -21,26 +22,26 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.serialization.builtins.ListSerializer object RemoteJsLoadingProgress { - val awaitingResults = MutableStateFlow>(listOf()) + val awaitingResults = MutableStateFlow>(listOf()) - fun getTimeoutForFileKey(jsReportFileKey: JsReportFileKey): Int { + fun getTimeoutForFileKey(jsReportFileKey: String): Int { return when (jsReportFileKey) { - JsReportFileKey.METADATA -> 10 + JsReportFileKey.METADATA.key -> 10 else -> 30 } * 1_000 } - fun loadJavaScriptFile(fileKey: JsReportFileKey, callback: (String) -> Unit) { + fun loadJavaScriptFile(fileKey: String, callback: (String) -> Unit) { if (!awaitingResults.value.contains(fileKey)) { awaitingResults.value = awaitingResults.value.toMutableList().apply { add(fileKey) } Log.d("Loading $fileKey") val loadingTimeout = window.setTimeout( { - window.alert("Timeout while fetching ${fileKey.description} data.") + window.alert("Timeout while fetching $fileKey data.") }, getTimeoutForFileKey(fileKey) ) - externalLoadJavaScriptFile(fileKey.key) { json -> + externalLoadJavaScriptFile(fileKey) { json -> Log.d("Finished Loading $fileKey") window.clearTimeout(loadingTimeout) callback(json) @@ -49,66 +50,76 @@ object RemoteJsLoadingProgress { } } - fun handleLoadedJsFile(collectedDataRepo: CollectedDataRepo, fileKey: JsReportFileKey, json: String) = + fun handleLoadedJsFile(collectedDataRepo: CollectedDataRepo, fileKey: String, json: String) = PerformanceAndTiming.computeMeasureDurationBlocking("Deserializing $fileKey") { when (fileKey) { - JsReportFileKey.INVERTED_DEPENDENCIES -> { + JsReportFileKey.INVERTED_DEPENDENCIES.key -> { collectedDataRepo.reportDataUpdated( InvertJson.decodeFromString(DependenciesJsReportModel.serializer(), json) ) } - JsReportFileKey.DIRECT_DEPENDENCIES -> { + JsReportFileKey.DIRECT_DEPENDENCIES.key -> { collectedDataRepo.directDependenciesDataUpdated( InvertJson.decodeFromString(DirectDependenciesJsReportModel.serializer(), json) ) } - JsReportFileKey.HOME -> { + JsReportFileKey.HOME.key -> { collectedDataRepo.homeUpdated( InvertJson.decodeFromString(HomeJsReportModel.serializer(), json) ) } - JsReportFileKey.PLUGINS -> { + JsReportFileKey.PLUGINS.key -> { collectedDataRepo.pluginsUpdated( InvertJson.decodeFromString(PluginsJsReportModel.serializer(), json) ) } - JsReportFileKey.OWNERS -> { + JsReportFileKey.OWNERS.key -> { collectedDataRepo.ownersUpdated( InvertJson.decodeFromString(OwnershipJsReportModel.serializer(), json) ) } - JsReportFileKey.METADATA -> { + JsReportFileKey.METADATA.key -> { collectedDataRepo.metadataUpdated( InvertJson.decodeFromString(MetadataJsReportModel.serializer(), json) ) } - JsReportFileKey.STATS -> { + JsReportFileKey.STATS.key -> { collectedDataRepo.statsUpdated( InvertJson.decodeFromString(StatsJsReportModel.serializer(), json) ) } - JsReportFileKey.CONFIGURATIONS -> { + JsReportFileKey.CONFIGURATIONS.key -> { collectedDataRepo.configurationsUpdated( InvertJson.decodeFromString(ConfigurationsJsReportModel.serializer(), json) ) } - JsReportFileKey.STAT_TOTALS -> { + JsReportFileKey.STAT_TOTALS.key -> { collectedDataRepo.statTotalsUpdated( InvertJson.decodeFromString(CollectedStatTotalsJsReportModel.serializer(), json) ) } - JsReportFileKey.HISTORICAL_DATA -> collectedDataRepo.historicalDataUpdated( + JsReportFileKey.HISTORICAL_DATA.key -> collectedDataRepo.historicalDataUpdated( InvertJson.decodeFromString(ListSerializer(HistoricalData.serializer()), json) ) + + else -> { + if (fileKey.startsWith("stat_")) { + collectedDataRepo.statUpdated( + InvertJson.decodeFromString(StatJsReportModel.serializer(), json) + ) + } else { + window.alert("UNHANDLED") + } + } } } } \ No newline at end of file diff --git a/invert-report/src/jsMain/kotlin/ui/NavBarComposable.kt b/invert-report/src/jsMain/kotlin/ui/NavBarComposable.kt index ee4f06d..d4e5efa 100644 --- a/invert-report/src/jsMain/kotlin/ui/NavBarComposable.kt +++ b/invert-report/src/jsMain/kotlin/ui/NavBarComposable.kt @@ -3,6 +3,7 @@ package ui import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import com.squareup.invert.models.FileKey import com.squareup.invert.models.js.JsReportFileKey import kotlinx.coroutines.flow.Flow import org.jetbrains.compose.web.dom.Div @@ -12,11 +13,11 @@ import org.jetbrains.compose.web.dom.Text @Composable -fun NavBarComposable(loadingProgressFlow: Flow>) { +fun NavBarComposable(loadingProgressFlow: Flow>) { val outstandingCalls by loadingProgressFlow.collectAsState(listOf()) if (outstandingCalls.isNotEmpty()) { H4 { - Span({ classes("pe-4") }) { Text("Loading... ${outstandingCalls.map { it.description }}") } + Span({ classes("pe-4") }) { Text("Loading... ${outstandingCalls.map { it }}") } Div({ classes("spinner-border text-light".split(" ")) attr("role", "status") From 8e22b6dcebf7e5b99707d575354214b23445a32c Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Sun, 9 Feb 2025 21:46:23 -0500 Subject: [PATCH 2/2] Dynamic loading of each stat. --- .../squareup/invert/common/ReportDataRepo.kt | 8 +++-- .../pages/InvertedDependenciesReportPage.kt | 6 ++-- .../common/pages/OwnerBreakdownReportPage.kt | 24 +++++++------ .../src/jsMain/kotlin/ui/NavBarComposable.kt | 34 ++++++++++++------- 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/invert-report/src/jsMain/kotlin/com/squareup/invert/common/ReportDataRepo.kt b/invert-report/src/jsMain/kotlin/com/squareup/invert/common/ReportDataRepo.kt index 2d2ec50..25d92f0 100644 --- a/invert-report/src/jsMain/kotlin/com/squareup/invert/common/ReportDataRepo.kt +++ b/invert-report/src/jsMain/kotlin/com/squareup/invert/common/ReportDataRepo.kt @@ -16,6 +16,7 @@ import com.squareup.invert.models.js.CollectedStatTotalsJsReportModel import com.squareup.invert.models.js.HistoricalData import com.squareup.invert.models.js.MetadataJsReportModel import com.squareup.invert.models.js.PluginsJsReportModel +import com.squareup.invert.models.js.StatJsReportModel import com.squareup.invert.models.js.StatsJsReportModel import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow @@ -45,10 +46,10 @@ class ReportDataRepo( val historicalData: Flow?> = collectedDataRepo.historicalData.mapLatest { it } - val statInfos: Flow?> = collectedDataRepo.statsData.mapLatest { it?.statInfos?.values } - val statTotals: Flow = collectedDataRepo.statTotals + val statInfos: Flow?> = statTotals.mapLatest { it?.statTotals?.values?.map { it.metadata } } + val collectedPluginInfoReport: Flow = collectedDataRepo.collectedPluginInfoReport val moduleToOwnerMap: Flow?> = collectedDataRepo.ownersInfo.mapLatest { @@ -101,6 +102,9 @@ class ReportDataRepo( it?.allConfigurationNames } + fun statForKey(statKey: StatKey): Flow = + collectedDataRepo.statData(statKey).mapLatest { it?.get(statKey) } + val pluginIdToAllModulesMap: Flow>?> = collectedDataRepo.collectedPluginInfoReport .mapLatest { diff --git a/invert-report/src/jsMain/kotlin/com/squareup/invert/common/pages/InvertedDependenciesReportPage.kt b/invert-report/src/jsMain/kotlin/com/squareup/invert/common/pages/InvertedDependenciesReportPage.kt index 1ee9799..8f9e679 100644 --- a/invert-report/src/jsMain/kotlin/com/squareup/invert/common/pages/InvertedDependenciesReportPage.kt +++ b/invert-report/src/jsMain/kotlin/com/squareup/invert/common/pages/InvertedDependenciesReportPage.kt @@ -92,13 +92,13 @@ object InvertedDependenciesReportPage : InvertReportPage = InvertedDependenciesNavRoute::class override val composableContent: @Composable (InvertedDependenciesNavRoute) -> Unit = { navRoute -> - InverteDependenciesComposable(navRoute) + InvertDependenciesComposable(navRoute) } } @Composable -fun InverteDependenciesComposable( +fun InvertDependenciesComposable( navRoute: InvertedDependenciesNavRoute, reportDataRepo: ReportDataRepo = DependencyGraph.reportDataRepo, navRouteRepo: NavRouteRepo = DependencyGraph.navRouteRepo, @@ -111,7 +111,6 @@ fun InverteDependenciesComposable( BootstrapLoadingMessageWithSpinner() return } - println("1") if (allConfigurationNames!!.isEmpty()) { H1 { Text("No analyzed configurations found.") } return @@ -123,7 +122,6 @@ fun InverteDependenciesComposable( if (navRoute.pluginGroupByFilter.isEmpty() || navRoute.configurations.isEmpty()) { BootstrapJumbotron( headerContent = { -// BootstrapIcon("exclamation-triangle", 48) Text(" Inverted Dependency Search") } ) { diff --git a/invert-report/src/jsMain/kotlin/com/squareup/invert/common/pages/OwnerBreakdownReportPage.kt b/invert-report/src/jsMain/kotlin/com/squareup/invert/common/pages/OwnerBreakdownReportPage.kt index dd5873c..e327b4a 100644 --- a/invert-report/src/jsMain/kotlin/com/squareup/invert/common/pages/OwnerBreakdownReportPage.kt +++ b/invert-report/src/jsMain/kotlin/com/squareup/invert/common/pages/OwnerBreakdownReportPage.kt @@ -20,6 +20,7 @@ import com.squareup.invert.models.Stat import com.squareup.invert.models.Stat.CodeReferencesStat.CodeReference import com.squareup.invert.models.StatDataType import com.squareup.invert.models.StatKey +import com.squareup.invert.models.StatMetadata import org.jetbrains.compose.web.attributes.ATarget import org.jetbrains.compose.web.attributes.target import org.jetbrains.compose.web.css.px @@ -35,6 +36,7 @@ import org.jetbrains.compose.web.dom.Text import org.jetbrains.compose.web.dom.Ul import ui.BootstrapColumn import ui.BootstrapLoadingMessageWithSpinner +import ui.BootstrapLoadingSpinner import ui.BootstrapRow import ui.BootstrapSelectDropdown import ui.BootstrapSelectOption @@ -100,17 +102,15 @@ object OwnerBreakdownReportPage : InvertReportPage { } private fun getCodeReferenceOwnerToModulePlusCodeReferencesList( - statKey: StatKey, + statMetadata: StatMetadata, moduleToOwnerMap: Map, - statsByModuleParam: Map> + moduleToStat: Map, ): Map>> { val toReturnOwnerNameToModuleAndCodeReferencesMap = mutableMapOf>>() - statsByModuleParam.entries.forEach { (modulePath: ModulePath, moduleStatsByKey: Map) -> + moduleToStat.entries.forEach { (modulePath: ModulePath, stat: Stat) -> val moduleOwner = moduleToOwnerMap[modulePath] ?: "" - val codeReferences = - (moduleStatsByKey.entries.firstOrNull { it.key == statKey }?.value as? Stat.CodeReferencesStat)?.value - + val codeReferences = (stat as? Stat.CodeReferencesStat)?.value codeReferences?.forEach { newCodeReference: CodeReference -> val owner = newCodeReference.owner ?: moduleOwner @@ -136,7 +136,6 @@ fun ByOwnerComposable( reportDataRepo: ReportDataRepo = DependencyGraph.reportDataRepo, navRouteRepo: NavRouteRepo = DependencyGraph.navRouteRepo ) { - val statsOrig by reportDataRepo.statsData.collectAsState(null) val statInfosOrig by reportDataRepo.statInfos.collectAsState(null) val moduleToOwnerMapOrig by reportDataRepo.moduleToOwnerMap.collectAsState(null) val allOwnerNames by reportDataRepo.allOwnerNames.collectAsState(null) @@ -146,7 +145,6 @@ fun ByOwnerComposable( allOwnerNames, moduleToOwnerMapOrig, statInfosOrig, - statsOrig ).any { it == null } ) { BootstrapLoadingMessageWithSpinner() @@ -277,12 +275,18 @@ fun ByOwnerComposable( BootstrapTabPane( codeReferenceStatTypesFilteredByNavParams .mapNotNull { statKey -> + val statInfoForKey by reportDataRepo.statForKey(statKey).collectAsState(null) + if (statInfoForKey == null) { + BootstrapLoadingSpinner() + return + } + val statMetadata = statInfosOrig!!.firstOrNull { it.key == statKey } val ownerToModulePathToCodeReferences: Map>> = getCodeReferenceOwnerToModulePlusCodeReferencesList( - statKey = statKey, + statMetadata = statMetadata!!, moduleToOwnerMap = moduleToOwnerMapOrig!!, - statsByModuleParam = statsOrig!!.statsByModule + moduleToStat = statInfoForKey!!.statsByModule ) val filteredByOwners = ownerToModulePathToCodeReferences.filter { if (!ownerParamValue.isNullOrBlank()) { diff --git a/invert-report/src/jsMain/kotlin/ui/NavBarComposable.kt b/invert-report/src/jsMain/kotlin/ui/NavBarComposable.kt index d4e5efa..1060961 100644 --- a/invert-report/src/jsMain/kotlin/ui/NavBarComposable.kt +++ b/invert-report/src/jsMain/kotlin/ui/NavBarComposable.kt @@ -14,20 +14,28 @@ import org.jetbrains.compose.web.dom.Text @Composable fun NavBarComposable(loadingProgressFlow: Flow>) { - val outstandingCalls by loadingProgressFlow.collectAsState(listOf()) - if (outstandingCalls.isNotEmpty()) { - H4 { - Span({ classes("pe-4") }) { Text("Loading... ${outstandingCalls.map { it }}") } - Div({ - classes("spinner-border text-light".split(" ")) - attr("role", "status") - }) { - Span({ - classes("visually-hidden") - }) { - Text("Loading...") - } + val outstandingCalls by loadingProgressFlow.collectAsState(listOf()) + if (outstandingCalls.isNotEmpty()) { + H4 { + Span({ classes("pe-4") }) { + Text( + "Loading... ${ + outstandingCalls.map { fileKey -> + JsReportFileKey.entries.firstOrNull { it.key == fileKey }?.description ?: fileKey } + }" + ) + } + Div({ + classes("spinner-border text-light".split(" ")) + attr("role", "status") + }) { + Span({ + classes("visually-hidden") + }) { + Text("Loading...") } + } } + } } \ No newline at end of file