diff --git a/example/pythonlib/publishing/1-publish-module/README b/example/pythonlib/publishing/1-publish-module/README.md similarity index 100% rename from example/pythonlib/publishing/1-publish-module/README rename to example/pythonlib/publishing/1-publish-module/README.md diff --git a/pythonlib/src/mill/pythonlib/SetupTools.scala b/pythonlib/src/mill/pythonlib/SetupTools.scala index e944e3d9534a..c149bf75cae6 100644 --- a/pythonlib/src/mill/pythonlib/SetupTools.scala +++ b/pythonlib/src/mill/pythonlib/SetupTools.scala @@ -34,7 +34,7 @@ trait SetupTools extends PythonModule { } override def pythonToolDeps = Task { - super.pythonToolDeps() ++ Seq("setuptools", "build") + super.pythonToolDeps() ++ Seq("setuptools", "build", "twine") } /** @@ -76,7 +76,13 @@ trait SetupTools extends PythonModule { */ def pyproject: T[PathRef] = T{ val str = - s"""|[build-system] + s"""|[project] + |name="${publishMeta().name}" + |version="${publishVersion()}" + |description="${publishMeta().description}" + |readme="${publishReadme().path.last}" + | + |[build-system] |requires=["setuptools"] |build-backend="setuptools.build_meta" |""".stripMargin @@ -94,7 +100,11 @@ trait SetupTools extends PythonModule { * * @see [[pyproject]] */ - def buildFiles: T[Map[String, PathRef]] = Task { Map.empty[String, PathRef] } + def buildFiles: T[Map[String, PathRef]] = Task { + Map( + publishReadme().path.last -> publishReadme() + ) + } /** * The readme file to include in the published distribution. @@ -239,6 +249,30 @@ trait SetupTools extends PythonModule { PathRef(os.list(T.dest / "dist").head) } + def repositoryUrl: T[String] = Task { + "https://test.pypi.org/legacy/" + } + + def publish( + repositoryUrl: String = null, + username: String = null, + password: String = null + ): Command[Unit] = Task.Command { + runner().run( + ( + // format: off + "-m", "twine", + "upload", + "--non-interactive", + "--repository-url", Option(repositoryUrl).getOrElse(this.repositoryUrl()), + Option(username).toSeq.flatMap(u => Seq("--username", u)), + Option(password).toSeq.flatMap(p => Seq("--password", p)), + sdist().path, wheel().path + // format: on + ) + ) + } + } object SetupTools {