app/data/Roles.scala (66 lines of code) (raw):
package data
import java.nio.file.{Files, Paths}
import ansible.RoleParser
import models._
import scala.jdk.CollectionConverters._
object Roles {
private val rootDir = Paths.get("roles")
val list: Seq[RoleSummary] = Files
.list(rootDir)
.iterator
.asScala
.toSeq
.flatMap(RoleParser.createRoleSummary(_))
.sortBy(_.roleId.value)
val listIds: Seq[RoleId] = list.map(_.roleId)
def findById(id: RoleId) = list.find(_.roleId == id)
def transitiveDependencies(
allRoles: Seq[RoleSummary],
roleToAnalyse: RoleId
): Dependency = {
def dependencies(roleId: RoleId): Set[RoleId] = {
val summaries: Set[RoleSummary] =
allRoles.find(r => r.roleId == roleId).toSet
summaries.flatMap(_.dependsOn)
}
def go(roleId: RoleId): Dependency = {
val children = dependencies(roleId).map(go)
Dependency(roleId, children)
}
go(roleToAnalyse)
}
def customisedTransitiveDependency(
allRoles: Seq[RoleSummary],
customisedRoles: Iterable[CustomisedRole]
): Iterable[(CustomisedRole, Dependency)] = {
customisedRoles.map { role =>
role -> transitiveDependencies(allRoles, role.roleId)
}
}
def usedBy(
allRoles: Seq[RoleSummary],
roleToAnalyse: RoleSummary
): Seq[RoleId] = {
allRoles
.filter(_.dependsOn.contains(roleToAnalyse.roleId))
.distinct
.map((r: RoleSummary) => r.roleId)
.sortBy(_.value)
}
def usedByRecipes(
allRecipes: Seq[Recipe],
roleToAnalyse: RoleSummary
): Seq[RecipeId] = {
allRecipes
.filter(_.roles.map(_.roleId).contains(roleToAnalyse.roleId))
.map(_.id)
}
def usedByBaseImages(
allBaseImages: Seq[BaseImage],
roleToAnalyse: RoleSummary
): Seq[BaseImage] = {
allBaseImages.filter(
_.builtinRoles.map(_.roleId).contains(roleToAnalyse.roleId)
)
}
}