Skip to content

Commit

Permalink
Make package --python work
Browse files Browse the repository at this point in the history
  • Loading branch information
alexarchambault committed Nov 18, 2022
1 parent fb8e6e6 commit 62d708b
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package scala.cli.commands.package0
import ai.kien.python.Python
import caseapp.*
import coursier.launcher.*
import dependency.*
import packager.config.*
import packager.deb.DebianPackage
import packager.docker.DockerPackage
Expand Down Expand Up @@ -306,7 +307,7 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {

val outputPath = packageType match {
case PackageType.Bootstrap =>
bootstrap(build, destPath, value(mainClass), () => alreadyExistsCheck())
value(bootstrap(build, destPath, value(mainClass), () => alreadyExistsCheck(), logger))
destPath
case PackageType.LibraryJar =>
val content = Library.libraryJar(build)
Expand Down Expand Up @@ -397,7 +398,15 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {

case nativePackagerType: PackageType.NativePackagerType =>
val bootstrapPath = os.temp.dir(prefix = "scala-packager") / "app"
bootstrap(build, bootstrapPath, value(mainClass), () => alreadyExistsCheck())
value {
bootstrap(
build,
bootstrapPath,
value(mainClass),
() => alreadyExistsCheck(),
logger
)
}
val sharedSettings = SharedSettings(
sourceAppPath = bootstrapPath,
version = packageOptions.packageVersion,
Expand Down Expand Up @@ -633,7 +642,7 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {

val appPath = os.temp.dir(prefix = "scala-cli-docker") / "app"
build.options.platform.value match {
case Platform.JVM => bootstrap(build, appPath, mainClass, () => ())
case Platform.JVM => value(bootstrap(build, appPath, mainClass, () => (), logger))
case Platform.JS => buildJs(build, appPath, mainClass, logger)
case Platform.Native =>
val dest = value(buildNative(build, mainClass, logger))
Expand Down Expand Up @@ -675,8 +684,9 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {
build: Build.Successful,
destPath: os.Path,
mainClass: String,
alreadyExistsCheck: () => Unit
): Unit = {
alreadyExistsCheck: () => Unit,
logger: Logger
): Either[BuildException, Unit] = either {
val byteCodeZipEntries = os.walk(build.output)
.filter(os.isFile(_))
.map { path =>
Expand Down Expand Up @@ -714,12 +724,41 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {
.withOsKind(Properties.isWin)
.callsItself(Properties.isWin)
.withJavaOpts(build.options.javaOptions.javaOpts.toSeq.map(_.value.value))
val params = Parameters.Bootstrap(Seq(loaderContent), mainClass)
var params = Parameters.Bootstrap(Seq(loaderContent), mainClass)
.withDeterministic(true)
.withPreamble(preamble)

val params0 =
if (build.options.notForBloopOptions.doSetupPython.getOrElse(false)) {
val res = value {
Artifacts.fetch(
Positioned.none(Seq(dep"io.github.alexarchambault.python:interface:0.1.0")),
Nil,
None,
logger,
build.options.finalCache,
None,
Some(_)
)
}
val entries = res.artifacts.map {
case (a, f) =>
val path = os.Path(f)
if (build.options.notForBloopOptions.packageOptions.isStandalone)
ClassPathEntry.Resource(path.last, os.mtime(path), os.read.bytes(path))
else
ClassPathEntry.Url(a.url)
}
val pythonContent = Seq(
ClassLoaderContent(entries)
)
params.addExtraContent("python", pythonContent).withPython(true)
}
else
params

alreadyExistsCheck()
BootstrapGenerator.generate(params, destPath.toNIO)
BootstrapGenerator.generate(params0, destPath.toNIO)
ProcUtil.maybeUpdatePreamble(destPath)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -894,4 +894,36 @@ abstract class PackageTestDefinitions(val scalaVersionOpt: Option[String])
)
}
}

test("scalapy") {

def maybeScalapyPrefix =
if (actualScalaVersion.startsWith("2.13.")) ""
else "import me.shadaj.scalapy.py" + System.lineSeparator()

val inputs = TestInputs(
os.rel / "Hello.scala" ->
s"""$maybeScalapyPrefix
|object Hello {
| def main(args: Array[String]): Unit = {
| py.Dynamic.global.print("Hello from Python", flush = true)
| }
|}
|""".stripMargin
)

val dest =
if (Properties.isWin) "hello.bat"
else "hello"

inputs.fromRoot { root =>
os.proc(TestUtil.cli, "package", "--python", ".", "-o", dest, extraOptions)
.call(cwd = root, stdin = os.Inherit, stdout = os.Inherit)

val launcher = root / dest
val res = os.proc(launcher).call(cwd = root)
val output = res.out.trim()
expect(output == "Hello from Python")
}
}
}

0 comments on commit 62d708b

Please sign in to comment.