|
| 1 | +package camundala.api |
| 2 | + |
| 3 | +import com.typesafe.config.ConfigFactory |
| 4 | +import scala.jdk.CollectionConverters.* |
| 5 | + |
| 6 | +final case class ApiProjectConfig( |
| 7 | + projectName: String, |
| 8 | + projectVersion: VersionConfig, |
| 9 | + subProjects: Seq[String], |
| 10 | + dependencies: Seq[DependencyConfig] |
| 11 | +): |
| 12 | + lazy val companyName: String = projectName.split("-").head |
| 13 | +end ApiProjectConfig |
| 14 | + |
| 15 | +object ApiProjectConfig: |
| 16 | + |
| 17 | + def init(projectName: String, newPackageFile: os.Path = os.pwd / defaultProjectConfigPath) = |
| 18 | + if !os.exists(newPackageFile) |
| 19 | + then |
| 20 | + println(s"Created initial $newPackageFile") |
| 21 | + os.makeDir.all(newPackageFile / os.up) |
| 22 | + os.write( |
| 23 | + newPackageFile, |
| 24 | + s""" |
| 25 | + |org = "${projectName.split("-").head}" |
| 26 | + |name = "$projectName" |
| 27 | + |version = "${DocProjectConfig.defaultVersion}" |
| 28 | + |dependencies: { |
| 29 | + | |
| 30 | + |} |
| 31 | + |""".stripMargin |
| 32 | + ) |
| 33 | + end if |
| 34 | + apply(newPackageFile) |
| 35 | + end init |
| 36 | + |
| 37 | + def apply(projectConfigPath: os.Path = os.pwd / defaultProjectConfigPath): ApiProjectConfig = |
| 38 | + val projectConfig = ConfigFactory.parseFile(projectConfigPath.toIO) |
| 39 | + val projectName = projectConfig.getString("projectName") |
| 40 | + val projectVersion = projectConfig.getString("projectVersion") |
| 41 | + val subProjects = projectConfig.getStringList("subProjects").asScala.toSeq |
| 42 | + val dependencies = projectConfig |
| 43 | + .getObject("dependencies") |
| 44 | + .unwrapped() |
| 45 | + .asScala |
| 46 | + .map: |
| 47 | + case k -> v => |
| 48 | + DependencyConfig.apply(k, v.toString) |
| 49 | + .toSeq |
| 50 | + |
| 51 | + ApiProjectConfig( |
| 52 | + projectName, |
| 53 | + VersionConfig(projectVersion), |
| 54 | + subProjects, |
| 55 | + dependencies |
| 56 | + ) |
| 57 | + end apply |
| 58 | + |
| 59 | + def apply(projectName: String, projectVersion: String): ApiProjectConfig = |
| 60 | + ApiProjectConfig( |
| 61 | + projectName = projectName, |
| 62 | + projectVersion = VersionConfig(projectVersion), |
| 63 | + subProjects = Seq.empty, |
| 64 | + dependencies = Seq.empty |
| 65 | + ) |
| 66 | +end ApiProjectConfig |
| 67 | + |
| 68 | +case class VersionConfig(major: Int, minor: Int, patch: Int, isSnapshot: Boolean = false): |
| 69 | + def isMajor(version: VersionConfig): Boolean = |
| 70 | + major != version.major |
| 71 | + |
| 72 | + def isMinor(version: VersionConfig): Boolean = |
| 73 | + major == version.major && minor != version.minor |
| 74 | + |
| 75 | + def isPatch(version: VersionConfig): Boolean = |
| 76 | + major == version.major && minor == version.minor && patch != version.patch |
| 77 | + |
| 78 | + lazy val minorVersion: String = s"$major.$minor" |
| 79 | + lazy val versionAsInt: Int = |
| 80 | + major * 100000 + minor * 1000 + patch |
| 81 | + |
| 82 | + override def toString: String = s"$minorVersion.$patch${if isSnapshot then "-SNAPSHOT" else ""}" |
| 83 | +end VersionConfig |
| 84 | + |
| 85 | +object VersionConfig: |
| 86 | + def apply(version: String): VersionConfig = |
| 87 | + version.split("\\.") match |
| 88 | + case Array(major, minor, patch) => |
| 89 | + if patch.endsWith("-SNAPSHOT") then |
| 90 | + VersionConfig(major.toInt, minor.toInt, patch.dropRight(9).toInt, isSnapshot = true) |
| 91 | + else |
| 92 | + VersionConfig(major.toInt, minor.toInt, patch.toInt) |
| 93 | +end VersionConfig |
| 94 | + |
| 95 | +final case class DependencyConfig( |
| 96 | + projectName: String, |
| 97 | + projectVersion: VersionConfig |
| 98 | +): |
| 99 | + lazy val minorVersion: String = projectVersion.minorVersion |
| 100 | + lazy val companyName: String = projectName.split("-").head |
| 101 | + lazy val fullName = s"$companyName:$projectName:$projectVersion" |
| 102 | + lazy val projectPackage = s"${projectName.split("-").mkString(".")}" |
| 103 | + |
| 104 | + def equalTo(packageConf: DocProjectConfig): Boolean = |
| 105 | + packageConf.companyName == companyName && packageConf.projectName == projectName && packageConf.minorVersion == projectVersion.minorVersion |
| 106 | +end DependencyConfig |
| 107 | + |
| 108 | +object DependencyConfig: |
| 109 | + def apply(projectName: String, version: String): DependencyConfig = |
| 110 | + DependencyConfig(projectName, VersionConfig(version)) |
| 111 | + // "org:name:version" => DependencyConfig - only works for the company-project |
| 112 | + def apply(dependency: String): DependencyConfig = |
| 113 | + val dArray = dependency.replace("\"", "").split(":") |
| 114 | + // DependencyConfig(dArray(0), dArray(1), dArray(2)) |
| 115 | + val lastVersion = VersionHelper.repoSearch(dArray(1), dArray(0)) |
| 116 | + DependencyConfig(dArray(1), VersionConfig(lastVersion)) |
| 117 | + |
| 118 | +end DependencyConfig |
0 commit comments