All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ai.starlake.schema.generator.Xls2YmlCmd.scala Maven / Gradle / Ivy

package ai.starlake.schema.generator

import ai.starlake.config.{DatasetArea, Settings}
import ai.starlake.job.Cmd
import ai.starlake.schema.generator.Xls2Yml.{writeDomainsAsYaml, writeIamPolicyTagsAsYaml}
import ai.starlake.schema.handlers.SchemaHandler
import ai.starlake.schema.model.IamPolicyTags
import ai.starlake.utils.JobResult
import better.files.File
import com.typesafe.scalalogging.StrictLogging
import scopt.OParser

import scala.util.Try

trait Xls2YmlCmd extends Cmd[Xls2YmlConfig] with StrictLogging {

  def command = "xls2yml"

  val parser: OParser[Unit, Xls2YmlConfig] = {
    val builder = OParser.builder[Xls2YmlConfig]
    OParser.sequence(
      builder.programName(s"starlake $command"),
      builder.head("starlake", command, "[options]"),
      builder.note(""),
      builder
        .opt[Seq[String]]("files")
        .action { (x, c) =>
          val allFiles = x.flatMap { f =>
            val file = File(f)
            file match {
              case _ if file.isDirectory =>
                file.collectChildren(_.name.endsWith(".xlsx")).toList
              case _ if file.exists => List(file)
              case _ => throw new IllegalArgumentException(s"File $file does not exist")
            }
          }

          c.copy(files = allFiles.map(_.pathAsString))
        }
        .required()
        .text("List of Excel files describing domains & schemas or jobs"),
      builder
        .opt[String]("iamPolicyTagsFile")
        .action((x, c) => c.copy(iamPolicyTagsFile = Some(x)))
        .optional()
        .text("If true generate IAM PolicyTags YML"),
      builder
        .opt[String]("outputDir")
        .action((x, c) => c.copy(outputPath = Some(x)))
        .optional()
        .text(
          """Path for saving the resulting YAML file(s). Starlake domains path is used by default.""".stripMargin
        ),
      builder
        .opt[String]("policyFile")
        .action((x, c) => c.copy(policyFile = Some(x)))
        .optional()
        .text(
          """Optional File for centralising ACL & RLS definition.""".stripMargin
        ),
      builder
        .opt[Boolean]("job")
        .action((x, c) => c.copy(job = x))
        .optional()
        .text("If true generate YML for a Job.")
    )
  }

  /** @param args
    *   args list passed from command line
    * @return
    *   Option of case class SchemaGenConfig.
    */
  def parse(args: Seq[String]): Option[Xls2YmlConfig] =
    OParser.parse(parser, args, Xls2YmlConfig(), setup)

  override def run(config: Xls2YmlConfig, schemaHandler: SchemaHandler)(implicit
    settings: Settings
  ): Try[JobResult] = {
    Try {
      if (config.job) {
        config.files.foreach(
          Xls2YmlAutoJob.generateSchema(_, config.policyFile, config.outputPath)
        )
      } else {
        config.files.foreach { file =>
          logger.info(s"Generating schemas for $file")
          writeDomainsAsYaml(file, config.outputPath)
        }
      }
      config.iamPolicyTagsFile.foreach { iamPolicyTagsPath =>
        val workbook = new XlsIamPolicyTagsReader(InputPath(iamPolicyTagsPath))
        val iamPolicyTags = IamPolicyTags(workbook.iamPolicyTags)
        writeIamPolicyTagsAsYaml(
          iamPolicyTags,
          config.outputPath.getOrElse(DatasetArea.metadata.toString),
          "iam-policy-tags"
        )(settings.storageHandler())
      }
    }.map(_ => JobResult.empty)
  }
}

object Xls2YmlCmd extends Xls2YmlCmd




© 2015 - 2025 Weber Informatics LLC | Privacy Policy